Skip to content

Commit 1f77ff2

Browse files
committed
Fix start value dependent initial equations
Start values get now analyzed for their dependencies of primary/secondary parameters. Start value dependent initial equations that depend on primary parameters can now get overwritten or imported via result file.
1 parent 51fcae4 commit 1f77ff2

File tree

1 file changed

+70
-36
lines changed

1 file changed

+70
-36
lines changed

Compiler/BackEnd/Initialization.mo

Lines changed: 70 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,14 @@ algorithm
127127
reeqns := BackendEquation.emptyEqns();
128128

129129
((vars, fixvars, eqns, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.aliasVars, introducePreVarsForAliasVariables, (vars, fixvars, eqns, hs));
130-
((vars, fixvars, eqns, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.knownVars, collectInitialVars, (vars, fixvars, eqns, hs));
130+
((vars, fixvars, eqns, _, _)) := BackendVariable.traverseBackendDAEVars(dae.shared.knownVars, collectInitialVars, (vars, fixvars, eqns, hs, outAllPrimaryParameters));
131131
((eqns, reeqns)) := BackendEquation.traverseEquationArray(dae.shared.initialEqs, collectInitialEqns, (eqns, reeqns));
132132
//if Flags.isSet(Flags.DUMP_INITIAL_SYSTEM) then
133133
// BackendDump.dumpEquationArray(eqns, "initial equations");
134134
//end if;
135135
SimCodeFunctionUtil.execStat("collectInitialEqns (initialization)");
136136

137-
((vars, fixvars, eqns, reeqns, _, _)) := List.fold(dae.eqs, collectInitialVarsEqnsSystem, ((vars, fixvars, eqns, reeqns, hs, clkHS)));
137+
((vars, fixvars, eqns, reeqns, _, _, _)) := List.fold(dae.eqs, collectInitialVarsEqnsSystem, ((vars, fixvars, eqns, reeqns, hs, clkHS, outAllPrimaryParameters)));
138138
((eqns, reeqns)) := BackendVariable.traverseBackendDAEVars(vars, collectInitialBindings, (eqns, reeqns));
139139
SimCodeFunctionUtil.execStat("collectInitialBindings (initialization)");
140140

@@ -1953,35 +1953,62 @@ end introducePreVarsForAliasVariables;
19531953
protected function collectInitialVarsEqnsSystem "author: lochel
19541954
This function collects variables and equations for the initial system out of an given EqSystem."
19551955
input BackendDAE.EqSystem inEqSystem;
1956-
input tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, BackendDAE.EquationArray, HashSet.HashSet, HashSet.HashSet> inTpl;
1957-
output tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, BackendDAE.EquationArray, HashSet.HashSet, HashSet.HashSet> outTpl;
1956+
input tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, BackendDAE.EquationArray, HashSet.HashSet, HashSet.HashSet, list<BackendDAE.Var>> inTpl;
1957+
output tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, BackendDAE.EquationArray, HashSet.HashSet, HashSet.HashSet, list<BackendDAE.Var>> outTpl;
19581958
protected
19591959
BackendDAE.Variables vars, fixvars;
19601960
BackendDAE.EquationArray eqns, reqns;
19611961
HashSet.HashSet hs, clkHS;
1962+
list<BackendDAE.Var> allPrimaryParameters;
19621963
algorithm
1963-
(vars, fixvars, eqns, reqns, hs, clkHS) := inTpl;
1964+
(vars, fixvars, eqns, reqns, hs, clkHS, allPrimaryParameters) := inTpl;
19641965

19651966
outTpl := match inEqSystem
19661967
case BackendDAE.EQSYSTEM(partitionKind = BackendDAE.CLOCKED_PARTITION(_)) equation
19671968
((vars, eqns, clkHS)) = BackendVariable.traverseBackendDAEVars(inEqSystem.orderedVars, collectInitialClockedVarsEqns, (vars, eqns, clkHS));
1968-
then (vars, fixvars, eqns, reqns, hs, clkHS);
1969+
then (vars, fixvars, eqns, reqns, hs, clkHS, allPrimaryParameters);
19691970

19701971
else equation
1971-
((vars, fixvars, eqns, hs)) = BackendVariable.traverseBackendDAEVars(inEqSystem.orderedVars, collectInitialVars, (vars, fixvars, eqns, hs));
1972+
((vars, fixvars, eqns, hs, _)) = BackendVariable.traverseBackendDAEVars(inEqSystem.orderedVars, collectInitialVars, (vars, fixvars, eqns, hs, allPrimaryParameters));
19721973
((eqns, reqns)) = BackendEquation.traverseEquationArray(inEqSystem.orderedEqs, collectInitialEqns, (eqns, reqns));
19731974
//((fixvars, eqns)) = List.fold(inEqSystem.stateSets, collectInitialStateSetVars, (fixvars, eqns));
1974-
then (vars, fixvars, eqns, reqns, hs, clkHS);
1975+
then (vars, fixvars, eqns, reqns, hs, clkHS, allPrimaryParameters);
19751976
end match;
19761977
end collectInitialVarsEqnsSystem;
19771978

1979+
protected function isCrefPrimaryParameter
1980+
input DAE.ComponentRef inCref;
1981+
input list<BackendDAE.Var> inAllPrimaryParameters;
1982+
output Boolean isPrimary = false;
1983+
algorithm
1984+
for v in inAllPrimaryParameters loop
1985+
if ComponentReference.crefEqual(BackendVariable.varCref(v), inCref) then
1986+
isPrimary := true;
1987+
return;
1988+
end if;
1989+
end for;
1990+
end isCrefPrimaryParameter;
1991+
1992+
protected function areCrefsPrimaryParameters
1993+
input list<DAE.ComponentRef> inCrefs;
1994+
input list<BackendDAE.Var> inAllPrimaryParameters;
1995+
output Boolean isPrimary = true;
1996+
algorithm
1997+
for cref in inCrefs loop
1998+
if not isCrefPrimaryParameter(cref, inAllPrimaryParameters) then
1999+
isPrimary := false;
2000+
return;
2001+
end if;
2002+
end for;
2003+
end areCrefsPrimaryParameters;
2004+
19782005
protected function collectInitialVars "author: lochel
19792006
This function collects all the vars for the initial system.
19802007
TODO: return additional equations for pre-variables"
19812008
input BackendDAE.Var inVar;
1982-
input tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet> inTpl;
2009+
input tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet, list<BackendDAE.Var>> inTpl;
19832010
output BackendDAE.Var outVar;
1984-
output tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet> outTpl;
2011+
output tuple<BackendDAE.Variables, BackendDAE.Variables, BackendDAE.EquationArray, HashSet.HashSet, list<BackendDAE.Var>> outTpl;
19852012
algorithm
19862013
(outVar, outTpl) := matchcontinue (inVar, inTpl)
19872014
local
@@ -2000,18 +2027,25 @@ algorithm
20002027
HashSet.HashSet hs;
20012028
String s, str, sv;
20022029
SourceInfo info;
2030+
list<BackendDAE.Var> allPrimaryParameters;
2031+
list<DAE.ComponentRef> parameters;
20032032

20042033
// state
2005-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(), varType=ty), (vars, fixvars, eqns, hs)) equation
2034+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(), varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
20062035
isFixed = BackendVariable.varFixed(var);
20072036
_ = BackendVariable.varStartValueOption(var);
20082037
preUsed = BaseHashSet.has(cr, hs);
20092038

2010-
crefExp = Expression.crefExp(cr);
2011-
//startExp = Expression.makePureBuiltinCall("$_start", {crefExp}, ty);
2012-
startExp = BackendVariable.varStartValue(var);
2013-
eqn = BackendDAE.EQUATION(crefExp, startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
20142039
if isFixed then
2040+
crefExp = Expression.crefExp(cr);
2041+
2042+
startExp = BackendVariable.varStartValue(var);
2043+
parameters = Expression.getAllCrefs(startExp);
2044+
2045+
if areCrefsPrimaryParameters(parameters, allPrimaryParameters) then
2046+
startExp = Expression.makePureBuiltinCall("$_start", {crefExp}, ty);
2047+
end if;
2048+
eqn = BackendDAE.EQUATION(crefExp, startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
20152049
eqns = BackendEquation.addEquation(eqn, eqns);
20162050
end if;
20172051

@@ -2037,10 +2071,10 @@ algorithm
20372071
vars = BackendVariable.addVar(var, vars);
20382072
vars = if preUsed then BackendVariable.addVar(preVar, vars) else vars;
20392073
eqns = if preUsed then BackendEquation.addEquation(eqn, eqns) else eqns;
2040-
then (var, (vars, fixvars, eqns, hs));
2074+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
20412075

20422076
// discrete (preUsed=true)
2043-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE(), varType=ty), (vars, fixvars, eqns, hs)) equation
2077+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE(), varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
20442078
true = BaseHashSet.has(cr, hs);
20452079
true = BackendVariable.varFixed(var);
20462080
startValue_ = BackendVariable.varStartValue(var);
@@ -2060,10 +2094,10 @@ algorithm
20602094
vars = BackendVariable.addVar(var, vars);
20612095
vars = BackendVariable.addVar(preVar, vars);
20622096
eqns = BackendEquation.addEquation(eqn, eqns);
2063-
then (var, (vars, fixvars, eqns, hs));
2097+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
20642098

20652099
// discrete
2066-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE()), (vars, fixvars, eqns, hs)) equation
2100+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE()), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
20672101
preUsed = BaseHashSet.has(cr, hs);
20682102
startValue = BackendVariable.varStartValueOption(var);
20692103

@@ -2079,10 +2113,10 @@ algorithm
20792113

20802114
vars = BackendVariable.addVar(var, vars);
20812115
vars = if preUsed then BackendVariable.addVar(preVar, vars) else vars;
2082-
then (var, (vars, fixvars, eqns, hs));
2116+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
20832117

20842118
// parameter without binding and fixed=true
2085-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=NONE()), (vars, fixvars, eqns, hs)) equation
2119+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=NONE()), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
20862120
true = BackendVariable.varFixed(var);
20872121
startExp = BackendVariable.varStartValueType(var);
20882122

@@ -2101,10 +2135,10 @@ algorithm
21012135
Error.addSourceMessage(Error.UNBOUND_PARAMETER_WITH_START_VALUE_WARNING, {s, str}, info);
21022136

21032137
//vars = BackendVariable.addVar(var, vars);
2104-
then (var, (vars, fixvars, eqns, hs));
2138+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
21052139

21062140
// parameter with binding and fixed=false
2107-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp), varType=ty), (vars, fixvars, eqns, hs)) equation
2141+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp), varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
21082142
true = intGt(Flags.getConfigEnum(Flags.LANGUAGE_STANDARD), 31);
21092143
false = BackendVariable.varFixed(var);
21102144
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
@@ -2119,12 +2153,12 @@ algorithm
21192153
eqns = BackendEquation.addEquation(eqn, eqns);
21202154

21212155
vars = BackendVariable.addVar(var, vars);
2122-
then (var, (vars, fixvars, eqns, hs));
2156+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
21232157

21242158
// *** MODELICA 3.1 COMPATIBLE ***
21252159
// parameter with binding and fixed=false and no start value
21262160
// use the binding as start value
2127-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs)) equation
2161+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
21282162
true = intLe(Flags.getConfigEnum(Flags.LANGUAGE_STANDARD), 31);
21292163
false = BackendVariable.varFixed(var);
21302164
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
@@ -2138,12 +2172,12 @@ algorithm
21382172
Error.addSourceMessage(Error.UNFIXED_PARAMETER_WITH_BINDING_31, {s, s, str}, info);
21392173

21402174
vars = BackendVariable.addVar(var, vars);
2141-
then (var, (vars, fixvars, eqns, hs));
2175+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
21422176

21432177
// *** MODELICA 3.1 COMPATIBLE ***
21442178
// parameter with binding and fixed=false and a start value
21452179
// ignore the binding and use the start value
2146-
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs)) equation
2180+
case (var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
21472181
true = intLe(Flags.getConfigEnum(Flags.LANGUAGE_STANDARD), 31);
21482182
false = BackendVariable.varFixed(var);
21492183
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
@@ -2157,20 +2191,20 @@ algorithm
21572191
Error.addSourceMessage(Error.UNFIXED_PARAMETER_WITH_BINDING_AND_START_VALUE_31, {s, sv, s, str}, info);
21582192

21592193
vars = BackendVariable.addVar(var, vars);
2160-
then (var, (vars, fixvars, eqns, hs));
2194+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
21612195

21622196
// parameter with constant binding
21632197
// skip these parameters (#3050)
2164-
case (var as BackendDAE.VAR(varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs)) equation
2198+
case (var as BackendDAE.VAR(varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
21652199
true = Expression.isConst(bindExp);
21662200
//fixvars = BackendVariable.addVar(var, fixvars);
2167-
then (var, (vars, fixvars, eqns, hs));
2201+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
21682202

21692203
// parameter
2170-
case (var as BackendDAE.VAR(varKind=BackendDAE.PARAM()), (vars, fixvars, eqns, hs)) equation
2204+
case (var as BackendDAE.VAR(varKind=BackendDAE.PARAM()), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
21712205
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
21722206
vars = BackendVariable.addVar(var, vars);
2173-
then (var, (vars, fixvars, eqns, hs));
2207+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
21742208

21752209
// skip constant
21762210
case (var as BackendDAE.VAR(varKind=BackendDAE.CONST()), _) // equation
@@ -2179,7 +2213,7 @@ algorithm
21792213

21802214
// VARIABLE (fixed=true)
21812215
// DUMMY_STATE
2182-
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs)) equation
2216+
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
21832217
true = BackendVariable.varFixed(var);
21842218
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
21852219
startValue_ = BackendVariable.varStartValue(var);
@@ -2203,11 +2237,11 @@ algorithm
22032237
eqns = BackendEquation.addEquation(eqn, eqns);
22042238

22052239
// Error.addCompilerNotification("VARIABLE (fixed=true): " + BackendDump.varString(var));
2206-
then (var, (vars, fixvars, eqns, hs));
2240+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
22072241

22082242
// VARIABLE (fixed=false)
22092243
// DUMMY_STATE
2210-
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs)) equation
2244+
case (var as BackendDAE.VAR(varName=cr, varType=ty), (vars, fixvars, eqns, hs, allPrimaryParameters)) equation
22112245
false = BackendVariable.varFixed(var);
22122246
isInput = BackendVariable.isVarOnTopLevelAndInput(var);
22132247
preUsed = BaseHashSet.has(cr, hs);
@@ -2228,7 +2262,7 @@ algorithm
22282262
eqns = if preUsed then BackendEquation.addEquation(eqn, eqns) else eqns;
22292263

22302264
// Error.addCompilerNotification("VARIABLE (fixed=false); " + BackendDump.varString(var));
2231-
then (var, (vars, fixvars, eqns, hs));
2265+
then (var, (vars, fixvars, eqns, hs, allPrimaryParameters));
22322266

22332267
else equation
22342268
Error.addInternalError("function collectInitialVars failed for: " + BackendDump.varString(inVar), sourceInfo());

0 commit comments

Comments
 (0)