@@ -101,7 +101,7 @@ algorithm
101101 list< BackendDAE . Var > dumpVars, dumpVars2;
102102
103103 case (_) equation
104- // inline all when equations, if active with body if inactive with var =pre(var )
104+ // inline all when equations, if active with body else with lhs =pre(lhs )
105105 dae = inlineWhenForInitialization(inDAE);
106106 // Debug.fcall2(Flags.DUMP_INITIAL_SYSTEM, BackendDump.dumpBackendDAE, dae, "inlineWhenForInitialization");
107107
@@ -123,8 +123,8 @@ algorithm
123123 eqns = BackendEquation . emptyEqns();
124124 reeqns = BackendEquation . emptyEqns();
125125
126- ((vars, fixvars, _)) = BackendVariable . traverseBackendDAEVars(avars, collectPreVars , (vars, fixvars, hs));
127- ((vars, fixvars, _)) = BackendVariable . traverseBackendDAEVars(knvars, collectInitialVars, (vars, fixvars, hs));
126+ ((vars, fixvars, eqns, _)) = BackendVariable . traverseBackendDAEVars(avars, introducePreVarsForAliasVariables , (vars, fixvars, eqns , hs));
127+ ((vars, fixvars, eqns, _)) = BackendVariable . traverseBackendDAEVars(knvars, collectInitialVars, (vars, fixvars, eqns , hs));
128128 ((eqns, reeqns)) = BackendEquation . traverseBackendDAEEqns(inieqns, collectInitialEqns, (eqns, reeqns));
129129
130130 // Debug.fcall2(Flags.DUMP_INITIAL_SYSTEM, BackendDump.dumpEquationArray, eqns, "initial equations");
@@ -157,10 +157,10 @@ algorithm
157157 initsyst = BackendDAE . EQSYSTEM (vars, eqns, NONE (), NONE (), BackendDAE . NO_MATCHING (), {});
158158 (initsyst, dumpVars) = preBalanceInitialSystem(initsyst);
159159
160- // split it in independend subsystems
161- (systs, shared ) = BackendDAEOptimize . partitionIndependentBlocksHelper(initsyst, shared , Error . getNumErrorMessages(), true );
162- initdae = BackendDAE . DAE (systs, shared );
163- // initdae = BackendDAE.DAE({initsyst}, shared);
160+ // split the initial system into independend subsystems
161+ // (systs, shared) = BackendDAEOptimize.partitionIndependentBlocksHelper(initsyst, shared, Error.getNumErrorMessages(), true);
162+ // initdae = BackendDAE.DAE(systs, shared);
163+ initdae = BackendDAE . DAE ({initsyst}, shared );
164164
165165 // analzye initial system
166166 (initdae, dumpVars2) = analyzeInitialSystem(initdae, dae, initVars);
@@ -1463,34 +1463,38 @@ algorithm
14631463 BackendDAE . EQSYSTEM (orderedVars= orderedVars, orderedEqs= orderedEqs, stateSets= stateSets) := isyst;
14641464 (vars, fixvars, eqns, reqns, hs) := iTpl;
14651465
1466- ((vars, fixvars, hs)) := BackendVariable . traverseBackendDAEVars(orderedVars, collectInitialVars, (vars, fixvars, hs));
1466+ ((vars, fixvars, eqns, hs)) := BackendVariable . traverseBackendDAEVars(orderedVars, collectInitialVars, (vars, fixvars, eqns , hs));
14671467 ((eqns, reqns)) := BackendEquation . traverseBackendDAEEqns(orderedEqs, collectInitialEqns, (eqns, reqns));
14681468 // ((fixvars, eqns)) := List.fold(stateSets, collectInitialStateSetVars, (fixvars, eqns));
14691469
14701470 oTpl := (vars, fixvars, eqns, reqns, hs);
14711471end collectInitialVarsEqnsSystem;
14721472
14731473protected function collectInitialVars "author: lochel
1474- This function collects all the vars for the initial system."
1475- input tuple< BackendDAE . Var , tuple< BackendDAE . Variables , BackendDAE . Variables , HashSet . HashSet >> inTpl;
1476- output tuple< BackendDAE . Var , tuple< BackendDAE . Variables , BackendDAE . Variables , HashSet . HashSet >> outTpl;
1474+ This function collects all the vars for the initial system.
1475+ TODO: return additional equations for pre-variables"
1476+ input tuple< BackendDAE . Var , tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , HashSet . HashSet >> inTpl;
1477+ output tuple< BackendDAE . Var , tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , HashSet . HashSet >> outTpl;
14771478algorithm
14781479 outTpl := matchcontinue(inTpl)
14791480 local
14801481 BackendDAE . Var var , preVar, derVar;
14811482 BackendDAE . Variables vars, fixvars;
1483+ BackendDAE . EquationArray eqns;
1484+ BackendDAE . Equation eqn;
14821485 DAE . ComponentRef cr, preCR, derCR;
14831486 Boolean isFixed, isInput, b, preUsed;
14841487 DAE . Type ty;
14851488 DAE . InstDims arryDim;
14861489 Option < DAE . Exp > startValue;
1490+ DAE . Exp startValue_;
14871491 DAE . Exp startExp, bindExp;
14881492 String errorMessage;
14891493 BackendDAE . VarKind varKind;
14901494 HashSet . HashSet hs;
14911495
14921496 // state
1493- case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . STATE (index= _), varType= ty), (vars, fixvars, hs))) equation
1497+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . STATE (index= _), varType= ty), (vars, fixvars, eqns, hs))) equation
14941498 isFixed = BackendVariable . varFixed(var );
14951499 startValue = BackendVariable . varStartValueOption(var );
14961500 preUsed = BaseHashSet . has(cr, hs);
@@ -1510,18 +1514,44 @@ algorithm
15101514 preVar = BackendVariable . setBindValue(preVar, NONE ());
15111515 preVar = BackendVariable . setVarFixed(preVar, true );
15121516 preVar = BackendVariable . setVarStartValueOption(preVar, SOME (DAE . CREF (cr, ty)));
1517+
1518+ eqn = BackendDAE . EQUATION (DAE . CREF (cr, ty), DAE . CREF (preCR, ty), DAE . emptyElementSource, false );
15131519
15141520 vars = BackendVariable . addVar(derVar, vars);
15151521 vars = Debug . bcallret2(not isFixed, BackendVariable . addVar, var , vars, vars);
15161522 fixvars = Debug . bcallret2(isFixed, BackendVariable . addVar, var , fixvars, fixvars);
1517- fixvars = Debug . bcallret2(preUsed, BackendVariable . addVar, preVar, fixvars, fixvars);
1518- then ((var , (vars, fixvars, hs)));
1523+ vars = Debug . bcallret2(preUsed, BackendVariable . addVar, preVar, vars, vars);
1524+ eqns = Debug . bcallret2(preUsed, BackendEquation . equationAdd, eqn, eqns, eqns);
1525+ then ((var , (vars, fixvars, eqns, hs)));
15191526
15201527 // discrete
1521- case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE ()), (vars, fixvars, hs))) equation
1528+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE (), varType= ty), (vars, fixvars, eqns, hs))) equation
1529+ true = BaseHashSet . has(cr, hs);
1530+ true = BackendVariable . varFixed(var );
1531+ startValue_ = BackendVariable . varStartValue(var );
1532+
1533+ var = BackendVariable . setVarFixed(var , false );
1534+
1535+ preCR = ComponentReference . crefPrefixPre(cr); // cr => $PRE.cr
1536+ preVar = BackendVariable . copyVarNewName(preCR, var );
1537+ preVar = BackendVariable . setVarDirection(preVar, DAE . BIDIR ());
1538+ preVar = BackendVariable . setBindExp(preVar, NONE ());
1539+ preVar = BackendVariable . setBindValue(preVar, NONE ());
1540+ preVar = BackendVariable . setVarFixed(preVar, false );
1541+ preVar = BackendVariable . setVarStartValueOption(preVar, SOME (startValue_));
1542+
1543+ eqn = BackendDAE . EQUATION (DAE . CREF (preCR, ty), startValue_, DAE . emptyElementSource, false );
1544+
1545+ vars = BackendVariable . addVar(var , vars);
1546+ vars = BackendVariable . addVar(preVar, vars);
1547+ eqns = BackendEquation . equationAdd(eqn, eqns);
1548+ then ((var , (vars, fixvars, eqns, hs)));
1549+
1550+ // discrete
1551+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE ()), (vars, fixvars, eqns, hs))) equation
1552+ preUsed = BaseHashSet . has(cr, hs);
15221553 isFixed = BackendVariable . varFixed(var );
15231554 startValue = BackendVariable . varStartValueOption(var );
1524- preUsed = BaseHashSet . has(cr, hs);
15251555
15261556 var = BackendVariable . setVarFixed(var , false );
15271557
@@ -1530,41 +1560,41 @@ algorithm
15301560 preVar = BackendVariable . setVarDirection(preVar, DAE . BIDIR ());
15311561 preVar = BackendVariable . setBindExp(preVar, NONE ());
15321562 preVar = BackendVariable . setBindValue(preVar, NONE ());
1533- preVar = BackendVariable . setVarFixed(preVar, isFixed );
1563+ preVar = BackendVariable . setVarFixed(preVar, false );
15341564 preVar = BackendVariable . setVarStartValueOption(preVar, startValue);
15351565
15361566 vars = BackendVariable . addVar(var , vars);
1537- vars = Debug . bcallret2(( not isFixed) and preUsed, BackendVariable . addVar, preVar, vars, vars);
1538- then ((var , (vars, fixvars, hs)));
1567+ vars = Debug . bcallret2(preUsed, BackendVariable . addVar, preVar, vars, vars);
1568+ then ((var , (vars, fixvars, eqns, hs)));
15391569
15401570 // parameter without binding
1541- case ((var as BackendDAE . VAR (varKind= BackendDAE . PARAM (), bindExp= NONE ()), (vars, fixvars, hs))) equation
1571+ case ((var as BackendDAE . VAR (varKind= BackendDAE . PARAM (), bindExp= NONE ()), (vars, fixvars, eqns, hs))) equation
15421572 true = BackendVariable . varFixed(var );
15431573 startExp = BackendVariable . varStartValueType(var );
15441574 var = BackendVariable . setBindExp(var , SOME (startExp));
15451575
15461576 var = BackendVariable . setVarKind(var , BackendDAE . VARIABLE ());
15471577 vars = BackendVariable . addVar(var , vars);
1548- then ((var , (vars, fixvars, hs)));
1578+ then ((var , (vars, fixvars, eqns, hs)));
15491579
15501580 // parameter with constant binding
1551- case ((var as BackendDAE . VAR (varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp)), (vars, fixvars, hs))) equation
1581+ case ((var as BackendDAE . VAR (varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp)), (vars, fixvars, eqns, hs))) equation
15521582 true = Expression . isConst(bindExp);
15531583 fixvars = BackendVariable . addVar(var , fixvars);
1554- then ((var , (vars, fixvars, hs)));
1584+ then ((var , (vars, fixvars, eqns, hs)));
15551585
15561586 // parameter
1557- case ((var as BackendDAE . VAR (varKind= BackendDAE . PARAM ()), (vars, fixvars, hs))) equation
1587+ case ((var as BackendDAE . VAR (varKind= BackendDAE . PARAM ()), (vars, fixvars, eqns, hs))) equation
15581588 var = BackendVariable . setVarKind(var , BackendDAE . VARIABLE ());
15591589 vars = BackendVariable . addVar(var , vars);
1560- then ((var , (vars, fixvars, hs)));
1590+ then ((var , (vars, fixvars, eqns, hs)));
15611591
15621592 // skip constant
1563- case ((var as BackendDAE . VAR (varKind= BackendDAE . CONST ()), (vars, fixvars, hs))) // equation
1593+ case ((var as BackendDAE . VAR (varKind= BackendDAE . CONST ()), (vars, fixvars, eqns, hs))) // equation
15641594 // fixvars = BackendVariable.addVar(var, fixvars);
1565- then ((var , (vars, fixvars, hs)));
1595+ then ((var , (vars, fixvars, eqns, hs)));
15661596
1567- case ((var as BackendDAE . VAR (varName= cr, bindExp= NONE ()), (vars, fixvars, hs))) equation
1597+ case ((var as BackendDAE . VAR (varName= cr, bindExp= NONE (), varType = ty ), (vars, fixvars, eqns , hs))) equation
15681598 isFixed = BackendVariable . varFixed(var );
15691599 isInput = BackendVariable . isVarOnTopLevelAndInput(var );
15701600 startValue = BackendVariable . varStartValueOption(var );
@@ -1576,15 +1606,15 @@ algorithm
15761606 preVar = BackendVariable . setVarDirection(preVar, DAE . BIDIR ());
15771607 preVar = BackendVariable . setBindExp(preVar, NONE ());
15781608 preVar = BackendVariable . setBindValue(preVar, NONE ());
1579- preVar = BackendVariable . setVarFixed(preVar, isFixed );
1580- preVar = BackendVariable . setVarStartValueOption(preVar, startValue );
1609+ preVar = BackendVariable . setVarFixed(preVar, true );
1610+ preVar = BackendVariable . setVarStartValueOption(preVar, SOME ( DAE . CREF (cr, ty)) );
15811611
15821612 vars = Debug . bcallret2(not b, BackendVariable . addVar, var , vars, vars);
15831613 fixvars = Debug . bcallret2(b, BackendVariable . addVar, var , fixvars, fixvars);
15841614 vars = Debug . bcallret2(preUsed, BackendVariable . addVar, preVar, vars, vars);
1585- then ((var , (vars, fixvars, hs)));
1615+ then ((var , (vars, fixvars, eqns, hs)));
15861616
1587- case ((var as BackendDAE . VAR (varName= cr, bindExp= SOME (bindExp)), (vars, fixvars, hs))) equation
1617+ case ((var as BackendDAE . VAR (varName= cr, bindExp= SOME (bindExp), varType = ty ), (vars, fixvars, eqns , hs))) equation
15881618 isInput = BackendVariable . isVarOnTopLevelAndInput(var );
15891619 isFixed = Expression . isConst(bindExp);
15901620 startValue = BackendVariable . varStartValueOption(var );
@@ -1596,13 +1626,13 @@ algorithm
15961626 preVar = BackendVariable . setVarDirection(preVar, DAE . BIDIR ());
15971627 preVar = BackendVariable . setBindExp(preVar, NONE ());
15981628 preVar = BackendVariable . setBindValue(preVar, NONE ());
1599- preVar = BackendVariable . setVarFixed(preVar, isFixed );
1600- preVar = BackendVariable . setVarStartValueOption(preVar, startValue );
1629+ preVar = BackendVariable . setVarFixed(preVar, true );
1630+ preVar = BackendVariable . setVarStartValueOption(preVar, SOME ( DAE . CREF (cr, ty)) );
16011631
16021632 vars = Debug . bcallret2(not b, BackendVariable . addVar, var , vars, vars);
16031633 fixvars = Debug . bcallret2(b, BackendVariable . addVar, var , fixvars, fixvars);
16041634 vars = Debug . bcallret2(preUsed, BackendVariable . addVar, preVar, vars, vars);
1605- then ((var , (vars, fixvars, hs)));
1635+ then ((var , (vars, fixvars, eqns, hs)));
16061636
16071637 case ((var , _)) equation
16081638 errorMessage = "./Compiler/BackEnd/Initialization.mo: function collectInitialVars failed for: " +& BackendDump . varString(var );
@@ -1615,52 +1645,82 @@ algorithm
16151645 end matchcontinue;
16161646end collectInitialVars;
16171647
1618- protected function collectPreVars "author: lochel
1619- This function collects all the pre-vars for the initial system."
1620- input tuple< BackendDAE . Var , tuple< BackendDAE . Variables , BackendDAE . Variables , HashSet . HashSet >> inTpl;
1621- output tuple< BackendDAE . Var , tuple< BackendDAE . Variables , BackendDAE . Variables , HashSet . HashSet >> outTpl;
1648+ protected function introducePreVarsForAliasVariables "author: lochel
1649+ This function introduces all the pre-vars for the initial system that belong to alias vars ."
1650+ input tuple< BackendDAE . Var , tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , HashSet . HashSet >> inTpl;
1651+ output tuple< BackendDAE . Var , tuple< BackendDAE . Variables , BackendDAE . Variables , BackendDAE . EquationArray , HashSet . HashSet >> outTpl;
16221652algorithm
1623- outTpl := match (inTpl)
1653+ outTpl := matchcontinue (inTpl)
16241654 local
16251655 BackendDAE . Var var ;
16261656 DAE . ComponentRef cr;
16271657 DAE . Type ty;
16281658 DAE . InstDims arryDim;
16291659 BackendDAE . Variables vars, fixvars;
1660+ BackendDAE . EquationArray eqns;
16301661 HashSet . HashSet hs;
16311662
1632- Boolean isFixed;
1633- Option < DAE . Exp > startValue;
1663+ Boolean preUsed, isFixed;
1664+ DAE . Exp startValue;
1665+ Option < DAE . Exp > startValueOpt;
16341666 DAE . ComponentRef preCR;
16351667 BackendDAE . Var preVar;
1668+ BackendDAE . Equation eqn;
16361669
16371670 // discrete-time
1638- case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE (), varType= ty, arryDim= arryDim), (vars, fixvars, hs))) equation
1671+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE (), varType= ty, arryDim= arryDim), (vars, fixvars, eqns, hs))) equation
1672+ preUsed = BaseHashSet . has(cr, hs);
16391673 isFixed = BackendVariable . varFixed(var );
1640- startValue = BackendVariable . varStartValueOption(var );
1674+ startValue = BackendVariable . varStartValue(var );
1675+
1676+ preCR = ComponentReference . crefPrefixPre(cr); // cr => $PRE.cr
1677+ preVar = BackendDAE . VAR (preCR, BackendDAE . DISCRETE (), DAE . BIDIR (), DAE . NON_PARALLEL (), ty, NONE (), NONE (), arryDim, DAE . emptyElementSource, NONE (), NONE (), DAE . NON_CONNECTOR ());
1678+ preVar = BackendVariable . setVarFixed(preVar, false );
1679+ preVar = BackendVariable . setVarStartValueOption(preVar, SOME (startValue));
1680+
1681+ // preCR = ComponentReference.crefPrefixPre(cr); // cr => $PRE.cr
1682+ // preVar = BackendVariable.copyVarNewName(preCR, var);
1683+ // preVar = BackendVariable.setVarDirection(preVar, DAE.BIDIR());
1684+ // preVar = BackendVariable.setBindExp(preVar, NONE());
1685+ // preVar = BackendVariable.setBindValue(preVar, NONE());
1686+ // preVar = BackendVariable.setVarFixed(preVar, true);
1687+ // preVar = BackendVariable.setVarStartValueOption(preVar, SOME(DAE.CREF(cr, ty)));
1688+
1689+ eqn = BackendDAE . EQUATION (DAE . CREF (preCR, ty), startValue, DAE . emptyElementSource, false );
1690+
1691+ vars = Debug . bcallret2(preUsed, BackendVariable . addVar, preVar, vars, vars);
1692+ eqns = Debug . bcallret2(preUsed and isFixed, BackendEquation . equationAdd, eqn, eqns, eqns);
1693+ then ((var , (vars, fixvars, eqns, hs)));
1694+
1695+ // discrete-time
1696+ case ((var as BackendDAE . VAR (varName= cr, varKind= BackendDAE . DISCRETE (), varType= ty, arryDim= arryDim), (vars, fixvars, eqns, hs))) equation
1697+ isFixed = BackendVariable . varFixed(var );
1698+ startValueOpt = BackendVariable . varStartValueOption(var );
16411699
16421700 preCR = ComponentReference . crefPrefixPre(cr); // cr => $PRE.cr
16431701 preVar = BackendDAE . VAR (preCR, BackendDAE . DISCRETE (), DAE . BIDIR (), DAE . NON_PARALLEL (), ty, NONE (), NONE (), arryDim, DAE . emptyElementSource, NONE (), NONE (), DAE . NON_CONNECTOR ());
16441702 preVar = BackendVariable . setVarFixed(preVar, isFixed);
1645- preVar = BackendVariable . setVarStartValueOption(preVar, startValue );
1703+ preVar = BackendVariable . setVarStartValueOption(preVar, startValueOpt );
16461704
16471705 vars = Debug . bcallret2(not isFixed, BackendVariable . addVar, preVar, vars, vars);
16481706 fixvars = Debug . bcallret2(isFixed, BackendVariable . addVar, preVar, fixvars, fixvars);
1649- then ((var , (vars, fixvars, hs)));
1707+ then ((var , (vars, fixvars, eqns, hs)));
16501708
16511709 // continuous-time
1652- case ((var as BackendDAE . VAR (varName= cr, varType= ty, arryDim= arryDim), (vars, fixvars, hs))) equation
1710+ case ((var as BackendDAE . VAR (varName= cr, varType= ty, arryDim= arryDim), (vars, fixvars, eqns, hs))) equation
1711+ preUsed = BaseHashSet . has(cr, hs);
1712+
16531713 preCR = ComponentReference . crefPrefixPre(cr); // cr => $PRE.cr
16541714 preVar = BackendDAE . VAR (preCR, BackendDAE . VARIABLE (), DAE . BIDIR (), DAE . NON_PARALLEL (), ty, NONE (), NONE (), arryDim, DAE . emptyElementSource, NONE (), NONE (), DAE . NON_CONNECTOR ());
16551715 preVar = BackendVariable . setVarFixed(preVar, true );
16561716 preVar = BackendVariable . setVarStartValueOption(preVar, SOME (DAE . CREF (cr, ty)));
16571717
1658- fixvars = BackendVariable . addVar( preVar, fixvars);
1659- then ((var , (vars, fixvars, hs)));
1718+ fixvars = Debug . bcallret2(preUsed, BackendVariable . addVar, preVar, fixvars , fixvars);
1719+ then ((var , (vars, fixvars, eqns, hs)));
16601720
16611721 else then inTpl;
1662- end match ;
1663- end collectPreVars ;
1722+ end matchcontinue ;
1723+ end introducePreVarsForAliasVariables ;
16641724
16651725protected function collectInitialBindings "author: lochel
16661726 This function collects all the vars for the initial system."
0 commit comments