Skip to content

Commit d94b6f4

Browse files
committed
- fix initialization of pre variables
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@16880 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 166f1c1 commit d94b6f4

File tree

1 file changed

+111
-51
lines changed

1 file changed

+111
-51
lines changed

Compiler/BackEnd/Initialization.mo

Lines changed: 111 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
14711471
end collectInitialVarsEqnsSystem;
14721472

14731473
protected 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;
14771478
algorithm
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;
16161646
end 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;
16221652
algorithm
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

16651725
protected function collectInitialBindings "author: lochel
16661726
This function collects all the vars for the initial system."

0 commit comments

Comments
 (0)