Skip to content

Commit 2e1aa11

Browse files
committed
- Compiler/BackEnd/
- solve dependencies for parameters during initialization - fix for equations from bindings - Compiler/Template/ - print error message, if symbolic initialization is selected but not generated - SimulationRuntime/c - always dump error messages - testsuite/ - activate case for ticket #1964 git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@14225 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 2ffd4e0 commit 2e1aa11

File tree

4 files changed

+128
-56
lines changed

4 files changed

+128
-56
lines changed

Compiler/BackEnd/BackendDAEUtil.mo

Lines changed: 124 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
92099211
algorithm
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());
92149216
end analyzeInitialSystem;
92159217

@@ -9561,25 +9563,23 @@ algorithm
95619563
end matchcontinue;
95629564
end collectAliasPreVarsExp;
95639565

9564-
95659566
protected 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;
95709575
algorithm
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);
95839583
end collectInitialVarsEqnsSystem;
95849584

95859585
protected 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;
96209620
algorithm
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;
97019704
end 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+
97039776
protected function generateInactiveWhenEquationForInitialization "function generateInactiveWhenEquationForInitialization
97049777
author: lochel
97059778
This function ... I guess the function name says it all!"

Compiler/BackEnd/BackendDump.mo

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1617,8 +1617,7 @@ algorithm
16171617
outVarNo := inVarNo + 1;
16181618
end dumpVar;
16191619

1620-
protected function varString
1621-
"function: varString
1620+
public function varString "function varString
16221621
Helper function to dumpVars."
16231622
input BackendDAE.Var inVar;
16241623
output String outStr;

Compiler/Template/CodegenC.tpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -989,9 +989,9 @@ template functionInitialEquations(Boolean useSymbolicInitialization, list<SimEqS
989989
;separator="\n")
990990
let info = match useSymbolicInitialization
991991
case true then
992-
'INFO(LOG_INIT, "symbolic initialization is generated");'
992+
'INFO(LOG_INIT, "The symbolic initialization was generated.");'
993993
else
994-
'INFO(LOG_INIT, "symbolic initialization is not generated");'
994+
'ERROR0(LOG_INIT, "The symbolic initialization was not generated.");'
995995
let useSymbolicInitializationToInt = match useSymbolicInitialization
996996
case true then
997997
'1'

SimulationRuntime/c/util/omc_error.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ void Message(int type, int stream, char *msg, int subline)
130130
{
131131
int i;
132132

133-
if(!useStream[stream])
133+
if((type != LOG_TYPE_ERROR) && !useStream[stream])
134134
return;
135135

136136
printf("%-13s | ", (subline || (lastStream == stream && level[stream] > 0)) ? "|" : LOG_STREAM_DESC[stream]);

0 commit comments

Comments
 (0)