@@ -9087,14 +9087,16 @@ algorithm
90879087 env= env,
90889088 functionTree= functionTree))) equation
90899089 true = Flags . isSet(Flags . SOLVE_INITIAL_SYSTEM );
9090- // collect vars for initial system
9090+
9091+ // collect vars and eqns for initial system
90919092 vars = emptyVars();
90929093 fixvars = emptyVars();
9094+ eqns = listEquation({});
9095+ reeqns = listEquation({});
90939096 ((vars, fixvars)) = BackendVariable . traverseBackendDAEVars(knvars, collectInitialVars, (vars, fixvars));
9094-
9095- // collect eqns for initial system
9096- ((eqns, reeqns)) = BackendEquation . traverseBackendDAEEqns(inieqns, collectInitialEqns, (listEquation({}), listEquation({})));
9097+ ((eqns, reeqns)) = BackendEquation . traverseBackendDAEEqns(inieqns, collectInitialEqns, (eqns, reeqns));
90979098 ((vars, fixvars, eqns, reeqns)) = List . fold(systs, collectInitialVarsEqnsSystem, ((vars, fixvars, eqns, reeqns)));
9099+ ((eqns, reeqns)) = BackendVariable . traverseBackendDAEVars(vars, collectInitialBindings, (eqns, reeqns));
90989100
90999101 // collect pre(var) from alias
91009102 // ((_, vars, fixvars)) = traverseBackendDAEExpsEqns(eqns, collectAliasPreVars, (avars, vars, fixvars));
@@ -9180,7 +9182,7 @@ algorithm
91809182 isyst = transformBackendDAE(inInitDAE, SOME ((BackendDAE . NO_INDEX_REDUCTION (), BackendDAE . EXACT ())), NONE (), NONE ());
91819183
91829184 // simplify system
9183- (isyst,Util . SUCCESS ()) = pastoptimiseDAE(isyst, pastOptModules, matchingAlgorithm, daeHandler);
9185+ (isyst, Util . SUCCESS ()) = pastoptimiseDAE(isyst, pastOptModules, matchingAlgorithm, daeHandler);
91849186
91859187 Debug . fcall(Flags . DUMP_INITIAL_SYSTEM , print, " \n ######################### \n # solved initial system # \n ######################### \n\n " );
91869188 Debug . fcall(Flags . DUMP_INITIAL_SYSTEM , BackendDump . dump, isyst);
@@ -9208,8 +9210,8 @@ protected
92089210 BackendDAE . IncidenceMatrix m, mt;
92099211algorithm
92109212 (system , m, mt) := getIncidenceMatrix(inSystem, BackendDAE . NORMAL ());
9211- system := analyzeInitialSystem1(system , mt, 1 ); // fix discrete vars to get rid of unneeded pre-vars
9212- system := analyzeInitialSystem2(system , inDAE); // fix unbalanced initial system if it is definite
9213+ system := analyzeInitialSystem1(system , mt, 1 ); // fix discrete vars to get rid of unneeded pre-vars
9214+ system := analyzeInitialSystem2(system , inDAE); // fix unbalanced initial system if it is definite
92139215 (outSystem, _, _) := getIncidenceMatrix(system , BackendDAE . NORMAL ());
92149216end analyzeInitialSystem;
92159217
@@ -9561,25 +9563,23 @@ algorithm
95619563 end matchcontinue;
95629564end collectAliasPreVarsExp;
95639565
9564-
95659566protected function collectInitialVarsEqnsSystem "function collectInitialVarsEqnsSystem
9566- author Frenkel TUD 2012-10"
9567+ author: lochel, Frenkel TUD 2012-10
9568+ This function collects variables and equations for the initial system out of an given EqSystem."
95679569 input BackendDAE . EqSystem isyst;
95689570 input tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , BackendDAE . EquationArray > iTpl;
95699571 output tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , BackendDAE . EquationArray > oTpl;
9572+ protected
9573+ BackendDAE . Variables orderedVars, vars, fixvars;
9574+ BackendDAE . EquationArray orderedEqs, eqns, reqns;
95709575algorithm
9571- oTpl := match(isyst, iTpl)
9572- local
9573- BackendDAE . Variables vars, ivars, fixvars;
9574- BackendDAE . EquationArray eqns, ieqns, reqns;
9575- case (BackendDAE . EQSYSTEM (orderedVars= vars, orderedEqs= eqns), (ivars, fixvars, ieqns, reqns)) equation
9576- // collect vars for initial system
9577- ((ivars, fixvars)) = BackendVariable . traverseBackendDAEVars(vars, collectInitialVars, (ivars, fixvars));
9578-
9579- // collect eqns for initial system
9580- ((ieqns, reqns)) = BackendEquation . traverseBackendDAEEqns(eqns, collectInitialEqns, (ieqns, reqns));
9581- then ((ivars, fixvars, ieqns, reqns));
9582- end match;
9576+ BackendDAE . EQSYSTEM (orderedVars= orderedVars, orderedEqs= orderedEqs) := isyst;
9577+ (vars, fixvars, eqns, reqns) := iTpl;
9578+
9579+ ((vars, fixvars)) := BackendVariable . traverseBackendDAEVars(orderedVars, collectInitialVars, (vars, fixvars));
9580+ ((eqns, reqns)) := BackendEquation . traverseBackendDAEEqns(orderedEqs, collectInitialEqns, (eqns, reqns));
9581+
9582+ oTpl := (vars, fixvars, eqns, reqns);
95839583end collectInitialVarsEqnsSystem;
95849584
95859585protected function collectUnfixedStatesFromSystem
@@ -9618,7 +9618,7 @@ protected function collectInitialVars "protected function collectInitialVars
96189618 input tuple< BackendDAE . Var , tuple< BackendDAE . Variables , BackendDAE . Variables >> inTpl;
96199619 output tuple< BackendDAE . Var , tuple< BackendDAE . Variables , BackendDAE . Variables >> outTpl;
96209620algorithm
9621- outTpl := match (inTpl)
9621+ outTpl := matchcontinue (inTpl)
96229622 local
96239623 BackendDAE . Var var , preVar, derVar;
96249624 BackendDAE . Variables vars, fixvars;
@@ -9627,9 +9627,11 @@ algorithm
96279627 DAE . Type ty;
96289628 DAE . InstDims arryDim;
96299629 Option < DAE . Exp > startValue;
9630+ DAE . Exp startExp;
9631+ String errorMessage;
96309632
96319633 // state
9632- case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . STATE (), bindExp = NONE (), varType= ty, arryDim= arryDim), (vars, fixvars))) equation
9634+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . STATE (), varType= ty, arryDim= arryDim), (vars, fixvars))) equation
96339635 isFixed = BackendVariable . varFixed(var );
96349636 var = BackendVariable . setVarKind(var , BackendDAE . VARIABLE ());
96359637
@@ -9641,15 +9643,8 @@ algorithm
96419643 fixvars = Debug . bcallret2(isFixed, BackendVariable . addVar, var , fixvars, fixvars);
96429644 then ((var , (vars, fixvars)));
96439645
9644- // state with binding
9645- case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . STATE (), bindExp= NONE (), varType= ty, arryDim= arryDim), (vars, fixvars))) equation
9646- derCR = ComponentReference . crefPrefixDer(cr); // cr => $DER.cr
9647- derVar = BackendDAE . VAR (derCR, BackendDAE . VARIABLE (), DAE . BIDIR (), DAE . NON_PARALLEL (), ty, NONE (), NONE (), arryDim, DAE . emptyElementSource, NONE (), NONE (), DAE . NON_CONNECTOR ());
9648- vars = BackendVariable . addVar(derVar, vars);
9649- then ((var , (vars, fixvars)));
9650-
96519646 // discrete
9652- case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE (), bindExp = NONE (), varType= ty, arryDim= arryDim), (vars, fixvars))) equation
9647+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE (), varType= ty, arryDim= arryDim), (vars, fixvars))) equation
96539648 isFixed = BackendVariable . varFixed(var );
96549649 startValue = BackendVariable . varStartValueOption(var );
96559650
@@ -9665,41 +9660,119 @@ algorithm
96659660 fixvars = Debug . bcallret2(isFixed, BackendVariable . addVar, preVar, fixvars, fixvars);
96669661 then ((var , (vars, fixvars)));
96679662
9668- // discrete with binding
9669- case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE (), bindExp= SOME (_), varType= ty, arryDim= arryDim), (vars, fixvars))) equation
9670- isFixed = BackendVariable . varFixed(var );
9671- startValue = BackendVariable . varStartValueOption(var );
9672-
9673- preCR = ComponentReference . crefPrefixPre(cr); // cr => $PRE.cr
9674- preVar = BackendDAE . VAR (preCR, BackendDAE . DISCRETE (), DAE . BIDIR (), DAE . NON_PARALLEL (), ty, NONE (), NONE (), arryDim, DAE . emptyElementSource, NONE (), NONE (), DAE . NON_CONNECTOR ());
9675- preVar = BackendVariable . setVarFixed(preVar, isFixed);
9676- preVar = BackendVariable . setVarStartValueOption(preVar, startValue);
9663+ // parameter (without binding)
9664+ case ((var as BackendDAE . VAR (varKind= BackendDAE . PARAM (), bindExp= NONE ()), (vars, fixvars))) equation
9665+ true = BackendVariable . varFixed(var );
9666+ startExp = BackendVariable . varStartValueType(var );
9667+ var = BackendVariable . setBindExp(var , startExp);
96779668
9678- vars = Debug . bcallret2( not isFixed, BackendVariable . addVar, preVar, vars, vars );
9679- fixvars = Debug . bcallret2(isFixed, BackendVariable . addVar, preVar, fixvars, fixvars );
9669+ var = BackendVariable . setVarKind( var , BackendDAE . VARIABLE () );
9670+ vars = BackendVariable . addVar( var , vars );
96809671 then ((var , (vars, fixvars)));
96819672
96829673 // parameter
9683- case ((var as BackendDAE . VAR (varKind= BackendDAE . PARAM (), bindExp= NONE ()), (vars, fixvars))) equation
9684- isFixed = BackendVariable . varFixed(var );
9674+ case ((var as BackendDAE . VAR (varKind= BackendDAE . PARAM ()), (vars, fixvars))) equation
96859675 var = BackendVariable . setVarKind(var , BackendDAE . VARIABLE ());
9686-
9687- vars = Debug . bcallret2(not isFixed, BackendVariable . addVar, var , vars, vars);
9688- fixvars = Debug . bcallret2(isFixed, BackendVariable . addVar, var , fixvars, fixvars);
9676+ vars = BackendVariable . addVar(var , vars);
96899677 then ((var , (vars, fixvars)));
9690-
9678+
9679+ // constant
9680+ case ((var as BackendDAE . VAR (varKind= BackendDAE . CONST ()), (vars, fixvars))) // equation
9681+ // fixvars = BackendVariable.addVar(var, fixvars);
9682+ then ((var , (vars, fixvars)));
9683+
96919684 case ((var as BackendDAE . VAR (bindExp= NONE ()), (vars, fixvars))) equation
96929685 isFixed = BackendVariable . varFixed(var );
96939686
96949687 vars = Debug . bcallret2(not isFixed, BackendVariable . addVar, var , vars, vars);
96959688 fixvars = Debug . bcallret2(isFixed, BackendVariable . addVar, var , fixvars, fixvars);
96969689 then ((var , (vars, fixvars)));
96979690
9698- else
9699- then inTpl;
9700- end match;
9691+ case ((var as BackendDAE . VAR (bindExp= SOME (_)), (vars, fixvars))) equation
9692+ vars = BackendVariable . addVar(var , vars);
9693+ then ((var , (vars, fixvars)));
9694+
9695+ case ((var , _)) equation
9696+ errorMessage = "./Compiler/BackEnd/BackendDAEUtil.mo: function collectInitialVars failed for: " +& BackendDump . varString(var );
9697+ Error . addMessage(Error . INTERNAL_ERROR , {errorMessage});
9698+ then fail();
9699+
9700+ else equation
9701+ Error . addMessage(Error . INTERNAL_ERROR , {"./Compiler/BackEnd/BackendDAEUtil.mo: function collectInitialVars failed" });
9702+ then fail();
9703+ end matchcontinue;
97019704end collectInitialVars;
97029705
9706+ protected function collectInitialBindings "protected function collectInitialBindings
9707+ This function collects all the vars for the initial system."
9708+ input tuple< BackendDAE . Var , tuple< BackendDAE . EquationArray ,BackendDAE . EquationArray >> inTpl;
9709+ output tuple< BackendDAE . Var , tuple< BackendDAE . EquationArray ,BackendDAE . EquationArray >> outTpl;
9710+ algorithm
9711+ outTpl := match(inTpl)
9712+ local
9713+ BackendDAE . Var var , preVar, derVar;
9714+ BackendDAE . Variables vars, fixvars;
9715+ DAE . ComponentRef cr, preCR, derCR;
9716+ Boolean isFixed;
9717+ DAE . Type ty;
9718+ DAE . InstDims arryDim;
9719+ Option < DAE . Exp > startValue;
9720+ String errorMessage;
9721+ BackendDAE . EquationArray eqns, reeqns;
9722+ . DAE . Exp bindExp, crefExp;
9723+ . DAE . ElementSource source;
9724+ BackendDAE . Equation eqn;
9725+
9726+ // no binding
9727+ case ((var as BackendDAE . VAR (bindExp= NONE ()), (eqns, reeqns)))
9728+ then ((var , (eqns, reeqns)));
9729+
9730+ // discrete
9731+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE (), bindExp= SOME (bindExp), varType= ty, source= source), (eqns, reeqns))) equation
9732+ crefExp = DAE . CREF (cr, ty);
9733+ eqn = BackendDAE . EQUATION (crefExp, bindExp, source);
9734+ eqns = BackendEquation . equationAdd(eqn, eqns);
9735+ then ((var , (eqns, reeqns)));
9736+
9737+ // parameter
9738+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp), varType= ty, source= source), (eqns, reeqns))) equation
9739+ crefExp = DAE . CREF (cr, ty);
9740+ eqn = BackendDAE . EQUATION (crefExp, bindExp, source);
9741+ eqns = BackendEquation . equationAdd(eqn, eqns);
9742+ then ((var , (eqns, reeqns)));
9743+
9744+ // variable
9745+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . VARIABLE (), bindExp= SOME (bindExp), varType= ty, source= source), (eqns, reeqns))) equation
9746+ crefExp = DAE . CREF (cr, ty);
9747+ eqn = BackendDAE . EQUATION (crefExp, bindExp, source);
9748+ eqns = BackendEquation . equationAdd(eqn, eqns);
9749+ then ((var , (eqns, reeqns)));
9750+
9751+ // dummy-der
9752+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DUMMY_DER (), bindExp= SOME (bindExp), varType= ty, source= source), (eqns, reeqns))) equation
9753+ crefExp = DAE . CREF (cr, ty);
9754+ eqn = BackendDAE . EQUATION (crefExp, bindExp, source);
9755+ eqns = BackendEquation . equationAdd(eqn, eqns);
9756+ then ((var , (eqns, reeqns)));
9757+
9758+ // dummy-state
9759+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DUMMY_STATE (), bindExp= SOME (bindExp), varType= ty, source= source), (eqns, reeqns))) equation
9760+ crefExp = DAE . CREF (cr, ty);
9761+ eqn = BackendDAE . EQUATION (crefExp, bindExp, source);
9762+ eqns = BackendEquation . equationAdd(eqn, eqns);
9763+ then ((var , (eqns, reeqns)));
9764+
9765+ case ((var , _)) equation
9766+ errorMessage = "./Compiler/BackEnd/BackendDAEUtil.mo: function collectInitialBindings failed for: " +& BackendDump . varString(var );
9767+ Error . addMessage(Error . INTERNAL_ERROR , {errorMessage});
9768+ then fail();
9769+
9770+ else equation
9771+ Error . addMessage(Error . INTERNAL_ERROR , {"./Compiler/BackEnd/BackendDAEUtil.mo: function collectInitialBindings failed" });
9772+ then fail();
9773+ end match;
9774+ end collectInitialBindings;
9775+
97039776protected function generateInactiveWhenEquationForInitialization "function generateInactiveWhenEquationForInitialization
97049777 author: lochel
97059778 This function ... I guess the function name says it all!"
0 commit comments