Skip to content

Commit 214f0d6

Browse files
ptaeuberOpenModelica-Hudson
authored andcommitted
Do not create parameter equations for constant variables ...
depending on non-fixed parameters. Fix for PhotoVoltaics library (ticket:4450).
1 parent 299703b commit 214f0d6

File tree

4 files changed

+129
-114
lines changed

4 files changed

+129
-114
lines changed

Compiler/BackEnd/BackendDAEUtil.mo

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7289,7 +7289,7 @@ protected
72897289
algorithm
72907290
globalKnownVars := backendDAE.shared.globalKnownVars;
72917291
parameterEqns := BackendEquation.emptyEqnsSized(BackendVariable.varsSize(globalKnownVars));
7292-
parameterEqns := BackendVariable.traverseBackendDAEVars(globalKnownVars, createParameterEquations, parameterEqns);
7292+
parameterEqns := BackendVariable.traverseBackendDAEVars(globalKnownVars, createGlobalKnownVarsEquations, parameterEqns);
72937293

72947294
paramSystem := BackendDAEUtil.createEqSystem(globalKnownVars, parameterEqns);
72957295
(m, _) := BackendDAEUtil.incidenceMatrix(paramSystem, BackendDAE.NORMAL(), NONE());
@@ -7306,7 +7306,7 @@ algorithm
73067306
backendDAE := setDAEGlobalKnownVars(backendDAE, globalKnownVars_sorted);
73077307
end sortGlobalKnownVarsInDAE;
73087308

7309-
protected function createParameterEquations
7309+
protected function createGlobalKnownVarsEquations
73107310
input output BackendDAE.Var var;
73117311
input output BackendDAE.EquationArray parameterEqns;
73127312
protected
@@ -7321,7 +7321,7 @@ algorithm
73217321
end try;
73227322
eqn := BackendDAE.EQUATION(lhs, rhs, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_BINDING);
73237323
parameterEqns := BackendEquation.add(eqn, parameterEqns);
7324-
end createParameterEquations;
7324+
end createGlobalKnownVarsEquations;
73257325

73267326

73277327
/*************************************************

Compiler/BackEnd/CommonSubExpression.mo

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,8 +536,9 @@ algorithm
536536
var := listGet(delVars, 1);
537537
end if;
538538

539-
// Save the rhs (call) as bind expression
539+
// Save the rhs (call) as bind expression and set fixed=true
540540
var := BackendVariable.setBindExp(var, SOME(call));
541+
var := BackendVariable.setVarFixed(var, true);
541542

542543
// If it is a tuple or a record (or record within tuple)
543544
if intGt(listLength(varList), 1) or Expression.isTuple(cse) then

Compiler/BackEnd/Initialization.mo

Lines changed: 123 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -781,17 +781,17 @@ protected function selectInitializationVariablesDAE "author: lochel
781781
output list<BackendDAE.Var> outAllPrimaryParameters = {};
782782
output BackendDAE.Variables outGlobalKnownVars = dae.shared.globalKnownVars;
783783
protected
784-
BackendDAE.Variables allParameters, otherVariables;
785-
BackendDAE.EquationArray allParameterEqns;
786-
BackendDAE.EqSystem paramSystem;
784+
BackendDAE.Variables otherVariables, globalKnownVars=dae.shared.globalKnownVars;
785+
BackendDAE.EquationArray globalKnownVarsEqns;
786+
BackendDAE.EqSystem globalKnownVarsSystem;
787787
BackendDAE.IncidenceMatrix m, mT;
788788
array<Integer> ass1 "eqn := ass1[var]";
789789
array<Integer> ass2 "var := ass2[eqn]";
790790
list<list<Integer>> comps;
791791
list<Integer> flatComps;
792-
Integer nParam;
792+
Integer nGlobalKnownVars;
793793
array<Integer> secondary;
794-
BackendDAE.Var p;
794+
BackendDAE.Var v;
795795
DAE.Exp bindExp;
796796
HashSet.HashSet hs;
797797
list<DAE.ComponentRef> crefs;
@@ -800,25 +800,20 @@ algorithm
800800
outInitVars := BackendVariable.traverseBackendDAEVars(dae.shared.globalKnownVars, selectInitializationVariables2, outInitVars);
801801
outInitVars := BackendVariable.traverseBackendDAEVars(dae.shared.aliasVars, selectInitializationVariables2, outInitVars);
802802

803-
// select all parameters
804-
allParameters := BackendVariable.emptyVarsSized(BackendVariable.varsSize(dae.shared.globalKnownVars) + BackendVariable.varsSize(dae.shared.externalObjects));
805-
allParameterEqns := BackendEquation.emptyEqnsSized(BackendVariable.varsSize(dae.shared.globalKnownVars) + BackendVariable.varsSize(dae.shared.externalObjects));
806-
otherVariables := BackendVariable.emptyVarsSized(BackendVariable.varsSize(dae.shared.globalKnownVars) + BackendVariable.varsSize(dae.shared.externalObjects));
807-
(allParameters, allParameterEqns, otherVariables) := BackendVariable.traverseBackendDAEVars(dae.shared.globalKnownVars, selectParameter2, (allParameters, allParameterEqns, otherVariables));
808-
(allParameters, allParameterEqns, otherVariables) := BackendVariable.traverseBackendDAEVars(dae.shared.externalObjects, selectParameter2, (allParameters, allParameterEqns, otherVariables));
809-
nParam := BackendVariable.varsSize(allParameters);
803+
globalKnownVars := BackendVariable.traverseBackendDAEVars(dae.shared.externalObjects, addExtObjToGlobalKnownVars, globalKnownVars);
804+
nGlobalKnownVars := BackendVariable.varsSize(globalKnownVars);
805+
otherVariables := BackendVariable.emptyVarsSized(nGlobalKnownVars);
806+
globalKnownVarsEqns := BackendEquation.emptyEqnsSized(nGlobalKnownVars);
807+
globalKnownVarsEqns := BackendVariable.traverseBackendDAEVars(globalKnownVars, createGlobalKnownVarsEquations, globalKnownVarsEqns);
810808

811-
if nParam > 0 then
812-
//BackendDump.dumpVariables(allParameters, "all parameters");
813-
//BackendDump.dumpEquationArray(allParameterEqns, "all parameter equations");
814-
815-
paramSystem := BackendDAEUtil.createEqSystem(allParameters, allParameterEqns);
816-
(m, mT) := BackendDAEUtil.incidenceMatrix(paramSystem, BackendDAE.NORMAL(), NONE());
809+
if nGlobalKnownVars > 0 then
810+
globalKnownVarsSystem := BackendDAEUtil.createEqSystem(globalKnownVars, globalKnownVarsEqns);
811+
(m, mT) := BackendDAEUtil.incidenceMatrix(globalKnownVarsSystem, BackendDAE.NORMAL(), NONE());
817812
//BackendDump.dumpIncidenceMatrix(m);
818813
//BackendDump.dumpIncidenceMatrixT(mT);
819814

820815
// match the system
821-
// ass1 and ass2 should be {1, 2, ..., nParam}
816+
// ass1 and ass2 should be {1, 2, ..., nGlobalKnownVars}
822817
(ass1, ass2) := Matching.PerfectMatching(m);
823818
//BackendDump.dumpMatchingVars(ass1);
824819
//BackendDump.dumpMatchingEqns(ass2);
@@ -829,33 +824,68 @@ algorithm
829824
//BackendDump.dumpComponentsOLD(comps);
830825

831826
// flattern list and look for cyclic dependencies
832-
flatComps := list(flattenParamComp(comp, allParameters) for comp in comps);
827+
flatComps := list(flattenParamComp(comp, globalKnownVars) for comp in comps);
833828
//BackendDump.dumpIncidenceRow(flatComps);
834829

835830
// select secondary parameters
836-
secondary := arrayCreate(nParam, 0);
837-
secondary := selectSecondaryParameters(flatComps, allParameters, mT, secondary);
838-
//BackendDump.dumpMatchingVars(secondary);
831+
secondary := arrayCreate(nGlobalKnownVars, 0);
832+
secondary := selectSecondaryParameters(flatComps, globalKnownVars, mT, secondary);
839833

840-
// get primary and secondary parameters
841-
hs := HashSet.emptyHashSetSized(2*nParam+1);
834+
// get primary and secondary parameters and variables
835+
hs := HashSet.emptyHashSetSized(2*nGlobalKnownVars+1);
842836
for i in flatComps loop
843-
p := BackendVariable.getVarAt(allParameters, i);
844-
bindExp := BackendVariable.varBindExpStartValueNoFail(p);
837+
v := BackendVariable.getVarAt(globalKnownVars, i);
838+
bindExp := BackendVariable.varBindExpStartValueNoFail(v);
845839
crefs := Expression.getAllCrefs(bindExp);
846-
if 1 == secondary[i] or not BaseHashSet.hasAll(crefs, hs) then
847-
otherVariables := BackendVariable.addVar(p, otherVariables);
848-
p := BackendVariable.setVarFixed(p, false);
849-
outInitVars := BackendVariable.addVar(p, outInitVars);
850-
outGlobalKnownVars := BackendVariable.addVar(p, outGlobalKnownVars);
851-
else
852-
outAllPrimaryParameters := p::outAllPrimaryParameters;
853-
if BackendVariable.isExtObj(p) then
854-
p := BackendVariable.setVarFixed(p, true);
855-
outGlobalKnownVars := BackendVariable.addVar(p, outGlobalKnownVars);
856-
end if;
857-
hs := BaseHashSet.add(BackendVariable.varCref(p), hs);
858-
end if;
840+
841+
_ := match(v)
842+
// primary parameter
843+
case (BackendDAE.VAR(varKind=BackendDAE.PARAM())) guard 0 == secondary[i] and BaseHashSet.hasAll(crefs, hs)
844+
equation
845+
outAllPrimaryParameters = v::outAllPrimaryParameters;
846+
hs = BaseHashSet.add(BackendVariable.varCref(v), hs);
847+
then ();
848+
849+
// primary external object
850+
case (BackendDAE.VAR(varKind=BackendDAE.EXTOBJ(), bindExp=SOME(bindExp))) guard 0 == secondary[i] and BaseHashSet.hasAll(crefs, hs)
851+
equation
852+
outAllPrimaryParameters = v::outAllPrimaryParameters;
853+
v = BackendVariable.setVarFixed(v, true);
854+
outGlobalKnownVars = BackendVariable.addVar(v, outGlobalKnownVars);
855+
hs = BaseHashSet.add(BackendVariable.varCref(v), hs);
856+
then ();
857+
858+
// secondary parameter
859+
case (BackendDAE.VAR(varKind=BackendDAE.PARAM()))
860+
equation
861+
otherVariables = BackendVariable.addVar(v, otherVariables);
862+
v = BackendVariable.setVarFixed(v, false);
863+
outInitVars = BackendVariable.addVar(v, outInitVars);
864+
outGlobalKnownVars = BackendVariable.addVar(v, outGlobalKnownVars);
865+
then ();
866+
867+
// primary variable
868+
case (_) guard BackendVariable.isVarAlg(v) and 0 == secondary[i] and BaseHashSet.hasAll(crefs, hs)
869+
equation
870+
otherVariables = BackendVariable.addVar(v, otherVariables);
871+
v = BackendVariable.setVarFixed(v, true);
872+
outGlobalKnownVars = BackendVariable.addVar(v, outGlobalKnownVars);
873+
hs = BaseHashSet.add(BackendVariable.varCref(v), hs);
874+
then ();
875+
876+
// secondary variable
877+
case (_) guard BackendVariable.isVarAlg(v)
878+
equation
879+
otherVariables = BackendVariable.addVar(v, otherVariables);
880+
v = BackendVariable.setVarFixed(v, false);
881+
outGlobalKnownVars = BackendVariable.addVar(v, outGlobalKnownVars);
882+
then ();
883+
884+
else
885+
equation
886+
otherVariables = BackendVariable.addVar(v, otherVariables);
887+
then ();
888+
end match;
859889
end for;
860890

861891
GC.free(secondary);
@@ -867,6 +897,57 @@ algorithm
867897
end if;
868898
end selectInitializationVariablesDAE;
869899

900+
function addExtObjToGlobalKnownVars "
901+
Sets fixed=true for external objects with binding and adds them to globalKnownVars
902+
author: ptaeuber"
903+
input output BackendDAE.Var extObj;
904+
input output BackendDAE.Variables globalKnownVars;
905+
algorithm
906+
globalKnownVars := match(extObj)
907+
local
908+
BackendDAE.Var var;
909+
// external object with binding
910+
case (BackendDAE.VAR(varKind=BackendDAE.EXTOBJ(), bindExp=SOME(_))) equation
911+
var = BackendVariable.setVarFixed(extObj, true);
912+
globalKnownVars = BackendVariable.addVar(var, globalKnownVars);
913+
then (globalKnownVars);
914+
end match;
915+
end addExtObjToGlobalKnownVars;
916+
917+
protected function createGlobalKnownVarsEquations
918+
"Creates BackendDAE.EQUATION()s from the globalKnownVars
919+
author: ptaeuber"
920+
input output BackendDAE.Var var;
921+
input output BackendDAE.EquationArray parameterEqns;
922+
protected
923+
DAE.Exp lhs, rhs, startValue;
924+
BackendDAE.Equation eqn;
925+
BackendDAE.Var v;
926+
String s, str;
927+
SourceInfo info;
928+
algorithm
929+
lhs := BackendVariable.varExp(var);
930+
931+
if BackendVariable.isParam(var) and not BackendVariable.varHasBindExp(var) and BackendVariable.varFixed(var) then
932+
s := ExpressionDump.printExpStr(lhs);
933+
startValue := BackendVariable.varStartValue(var);
934+
str := ExpressionDump.printExpStr(startValue);
935+
v := BackendVariable.setVarKind(var, BackendDAE.VARIABLE());
936+
v := BackendVariable.setBindExp(v, SOME(startValue));
937+
v := BackendVariable.setVarFixed(v, true);
938+
info := ElementSource.getElementSourceFileInfo(BackendVariable.getVarSource(v));
939+
Error.addSourceMessage(Error.UNBOUND_PARAMETER_WITH_START_VALUE_WARNING, {s, str}, info);
940+
end if;
941+
942+
try
943+
rhs := BackendVariable.varBindExpStartValue(var);
944+
else
945+
rhs := DAE.RCONST(0.0);
946+
end try;
947+
eqn := BackendDAE.EQUATION(lhs, rhs, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_BINDING);
948+
parameterEqns := BackendEquation.add(eqn, parameterEqns);
949+
end createGlobalKnownVarsEquations;
950+
870951
protected function markIndex
871952
input Integer inIndex;
872953
input array<Integer> inArray;
@@ -895,9 +976,8 @@ algorithm
895976
// fixed=false
896977
case i::rest equation
897978
param = BackendVariable.getVarAt(inParameters, i);
898-
secondaryParams = if (not BackendVariable.varFixed(param)) or 1 == inSecondaryParams[i]
899-
then List.fold(inM[i], markIndex, inSecondaryParams)
900-
else inSecondaryParams;
979+
secondaryParams = if (if BackendVariable.isVarAlg(param) then false else not BackendVariable.varFixed(param)) or 1 == inSecondaryParams[i]
980+
then List.fold(inM[i], markIndex, inSecondaryParams) else inSecondaryParams;
901981
secondaryParams = selectSecondaryParameters(rest, inParameters, inM, secondaryParams);
902982
then secondaryParams;
903983

@@ -944,72 +1024,6 @@ algorithm
9441024
outVars := BackendVariable.traverseBackendDAEVars(inEqSystem.orderedVars, selectInitializationVariables2, inVars);
9451025
end selectInitializationVariables1;
9461026

947-
protected function selectParameter2 "author: lochel"
948-
input BackendDAE.Var inVar;
949-
input tuple<BackendDAE.Variables, BackendDAE.EquationArray, BackendDAE.Variables> inTpl;
950-
output BackendDAE.Var outVar = inVar;
951-
output tuple<BackendDAE.Variables, BackendDAE.EquationArray, BackendDAE.Variables> outTpl;
952-
algorithm
953-
outTpl := match (inVar, inTpl)
954-
local
955-
BackendDAE.Var var;
956-
BackendDAE.Variables vars, otherVars;
957-
BackendDAE.EquationArray eqns;
958-
DAE.Exp bindExp, crefExp, startValue;
959-
BackendDAE.Equation eqn;
960-
DAE.ComponentRef cref;
961-
String s, str;
962-
SourceInfo info;
963-
964-
// parameter without binding
965-
case (BackendDAE.VAR(varKind=BackendDAE.PARAM(), bindExp=NONE()), (vars, eqns, otherVars)) equation
966-
vars = BackendVariable.addVar(inVar, vars);
967-
968-
cref = BackendVariable.varCref(inVar);
969-
crefExp = Expression.crefExp(cref);
970-
startValue = BackendVariable.varStartValue(inVar);
971-
eqn = BackendDAE.EQUATION(crefExp, startValue, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
972-
eqns = BackendEquation.add(eqn, eqns);
973-
974-
if BackendVariable.varFixed(inVar) then
975-
s = ComponentReference.printComponentRefStr(cref);
976-
str = ExpressionDump.printExpStr(startValue);
977-
var = BackendVariable.setVarKind(inVar, BackendDAE.VARIABLE());
978-
var = BackendVariable.setBindExp(var, SOME(startValue));
979-
var = BackendVariable.setVarFixed(var, true);
980-
info = ElementSource.getElementSourceFileInfo(BackendVariable.getVarSource(var));
981-
Error.addSourceMessage(Error.UNBOUND_PARAMETER_WITH_START_VALUE_WARNING, {s, str}, info);
982-
end if;
983-
then ((vars, eqns, otherVars));
984-
985-
// parameter with binding
986-
case (BackendDAE.VAR(varKind=BackendDAE.PARAM(), bindExp=SOME(bindExp)), (vars, eqns, otherVars)) equation
987-
vars = BackendVariable.addVar(inVar, vars);
988-
989-
cref = BackendVariable.varCref(inVar);
990-
crefExp = Expression.crefExp(cref);
991-
eqn = BackendDAE.EQUATION(crefExp, bindExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
992-
eqns = BackendEquation.add(eqn, eqns);
993-
then ((vars, eqns, otherVars));
994-
995-
// external object with binding
996-
case (BackendDAE.VAR(varKind=BackendDAE.EXTOBJ(), bindExp=SOME(bindExp)), (vars, eqns, otherVars)) equation
997-
var = BackendVariable.setVarFixed(inVar, true);
998-
vars = BackendVariable.addVar(var, vars);
999-
1000-
cref = BackendVariable.varCref(inVar);
1001-
crefExp = Expression.crefExp(cref);
1002-
eqn = BackendDAE.EQUATION(crefExp, bindExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
1003-
eqns = BackendEquation.add(eqn, eqns);
1004-
then ((vars, eqns, otherVars));
1005-
1006-
else equation
1007-
(vars, eqns, otherVars) = inTpl;
1008-
otherVars = BackendVariable.addVar(inVar, otherVars);
1009-
then ((vars, eqns, otherVars));
1010-
end match;
1011-
end selectParameter2;
1012-
10131027
protected function selectInitializationVariables2 "author: lochel"
10141028
input BackendDAE.Var inVar;
10151029
input BackendDAE.Variables inVars;

Compiler/SimCode/SimCodeUtil.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6708,7 +6708,7 @@ algorithm
67086708

67096709
// Create SimCode Equation for special globalKnownVars
67106710
if (BackendVariable.isParam(globalKnownVar) and BackendVariable.varFixed(globalKnownVar) and (BackendVariable.isFinalOrProtectedVar(globalKnownVar) or BackendVariable.varHasNonConstantBindExpOrStartValue(globalKnownVar)))
6711-
or (BackendVariable.isVarAlg(globalKnownVar) and not BackendVariable.isInput(globalKnownVar))
6711+
or (BackendVariable.isVarAlg(globalKnownVar) and not BackendVariable.isInput(globalKnownVar)) and BackendVariable.varFixed(globalKnownVar)
67126712
or (BackendVariable.isExtObj(globalKnownVar) and BackendVariable.varHasBindExp(globalKnownVar) and BackendVariable.varFixed(globalKnownVar))
67136713
then
67146714

0 commit comments

Comments
 (0)