Skip to content

Commit ce4a65a

Browse files
author
Jens Frenkel
committed
- fix for last commit, move fixed pre to known variables to avoid equal equations var = pre(var), do not replace variables with pre
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@14582 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent c1f2824 commit ce4a65a

File tree

2 files changed

+44
-34
lines changed

2 files changed

+44
-34
lines changed

Compiler/BackEnd/Initialization.mo

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,7 +1066,8 @@ protected function fixUnderDeterminedInitialSystem "function fixUnderDeterminedI
10661066
output BackendDAE.Shared oShared;
10671067
algorithm
10681068
(outSucceed, outVars, outEqns, oShared) := matchcontinue(inDAE, inVars, inEqns, inInitVars, iShared)
1069-
local
1069+
local
1070+
BackendDAE.Variables vars;
10701071
BackendDAE.EquationArray eqns;
10711072
Integer nVars, nInitVars, nEqns;
10721073
list<BackendDAE.Var> initVarList;
@@ -1090,27 +1091,27 @@ algorithm
10901091
nEqns = BackendDAEUtil.equationSize(inEqns);
10911092
syst = BackendDAE.EQSYSTEM(inVars, inEqns, NONE(), NONE(), BackendDAE.NO_MATCHING(),{});
10921093
(syst,m,mt,_,_) = BackendDAEUtil.getIncidenceMatrixScalar(syst,BackendDAE.SOLVABLE());
1093-
// BackendDump.printEqSystem(syst);
1094+
BackendDump.printEqSystem(syst);
10941095
vec1 = arrayCreate(nVars,-1);
10951096
vec2 = arrayCreate(nEqns,-1);
10961097
Matching.matchingExternalsetIncidenceMatrix(nVars,nEqns,m);
10971098
BackendDAEEXT.matching(nVars,nEqns,5,-1,0.0,1);
10981099
BackendDAEEXT.getAssignment(vec2,vec1);
10991100
// try to find for unmatched variables without startvalue an equation by unassign a variable with start value
1100-
//unassigned1 = Matching.getUnassigned(nEqns, vec2, {});
1101-
// print("Unassigned Eqns " +& stringDelimitList(List.map(unassigned1,intString),", ") +& "\n");
1101+
unassigned1 = Matching.getUnassigned(nEqns, vec2, {});
1102+
print("Unassigned Eqns " +& stringDelimitList(List.map(unassigned1,intString),", ") +& "\n");
11021103
unassigned = Matching.getUnassigned(nVars, vec1, {});
1103-
// print("Unassigned Vars " +& stringDelimitList(List.map(unassigned,intString),", ") +& "\n");
1104+
print("Unassigned Vars " +& stringDelimitList(List.map(unassigned,intString),", ") +& "\n");
11041105
Debug.bcall(intGt(listLength(unassigned),nVars-nEqns),print,"Error could not match all equations\n");
11051106
unassigned = Util.if_(intGt(listLength(unassigned),nVars-nEqns),{},unassigned);
11061107
//unassigned = List.firstN(listReverse(unassigned),nVars-nEqns);
11071108
unassigned = replaceFixedCandidates(unassigned,nVars,nEqns,m,mt,vec1,vec2,inVars,inInitVars,1,arrayCreate(nEqns,-1),{});
11081109
// add for all free variables an equation
11091110
Debug.fcall(Flags.PEDANTIC, Error.addCompilerWarning, "Assuming fixed start value for the following " +& intString(nVars-nEqns) +& " variables:");
11101111
initVarList = List.map1r(unassigned,BackendVariable.getVarAt,inVars);
1111-
(eqns,shared) = addStartValueEquations(initVarList, inEqns, iShared);
1112+
(vars,eqns,shared) = addStartValueEquations(initVarList, inVars, inEqns, iShared);
11121113
then
1113-
(true, inVars, eqns, shared);
1114+
(true, vars, eqns, shared);
11141115

11151116
// fix all free variables
11161117
case(_, _, eqns, _, _) equation
@@ -1121,8 +1122,8 @@ algorithm
11211122

11221123
Debug.fcall(Flags.PEDANTIC, Error.addCompilerWarning, "Assuming fixed start value for the following " +& intString(nVars-nEqns) +& " variables:");
11231124
initVarList = BackendVariable.varList(inInitVars);
1124-
(eqns,shared) = addStartValueEquations(initVarList, eqns, iShared);
1125-
then (true, inVars, eqns, shared);
1125+
(vars,eqns,shared) = addStartValueEquations(initVarList, inVars, eqns, iShared);
1126+
then (true, vars, eqns, shared);
11261127

11271128
// fix a subset of unfixed variables
11281129
case(_, _, eqns, _, _) equation
@@ -1440,16 +1441,19 @@ end collectIndependentVars;
14401441

14411442
protected function addStartValueEquations "function addStartValueEquations
14421443
author lochel"
1443-
input list<BackendDAE.Var> inVars;
1444+
input list<BackendDAE.Var> inVarLst;
1445+
input BackendDAE.Variables iVars;
14441446
input BackendDAE.EquationArray inEqns;
14451447
input BackendDAE.Shared iShared;
1448+
output BackendDAE.Variables oVars;
14461449
output BackendDAE.EquationArray outEqns;
14471450
output BackendDAE.Shared oShared;
14481451
algorithm
1449-
(outEqns,oShared) := matchcontinue(inVars, inEqns,iShared)
1452+
(oVars,outEqns,oShared) := matchcontinue(inVarLst,iVars,inEqns,iShared)
14501453
local
1454+
BackendDAE.Variables vars;
14511455
BackendDAE.Var var,preVar;
1452-
list<BackendDAE.Var> vars;
1456+
list<BackendDAE.Var> varlst;
14531457
BackendDAE.Equation eqn;
14541458
BackendDAE.EquationArray eqns;
14551459
DAE.Exp e, e1, crefExp, startExp;
@@ -1460,9 +1464,9 @@ algorithm
14601464
BackendDAE.Shared shared;
14611465
Option<DAE.Exp> optexp;
14621466

1463-
case ({}, _, _) then (inEqns,iShared);
1467+
case ({}, _, _, _) then (iVars,inEqns,iShared);
14641468

1465-
case (var::vars, _,_)
1469+
case (var::varlst, _, _, _)
14661470
equation
14671471
preCref = BackendVariable.varCref(var);
14681472
true = ComponentReference.isPreCref(preCref);
@@ -1481,36 +1485,39 @@ algorithm
14811485
Debug.fcall(Flags.PEDANTIC, Error.addCompilerWarning, " [discrete] " +& crStr);
14821486

14831487
eqns = BackendEquation.equationAdd(eqn, inEqns);
1484-
(eqns,shared) = addStartValueEquations(vars, eqns, iShared);
1488+
(vars,eqns,shared) = addStartValueEquations(varlst, iVars, eqns, iShared);
14851489
then
1486-
(eqns,shared);
1490+
(vars,eqns,shared);
14871491

1488-
case ((var as BackendDAE.VAR(varName=cref, varType=tp, arryDim=arryDim))::vars, _,_)
1492+
case ((var as BackendDAE.VAR(varName=cref, varType=tp, arryDim=arryDim))::varlst, _, _, _)
14891493
equation
14901494
true = BackendVariable.isVarDiscrete(var);
14911495
crefExp = DAE.CREF(cref, tp);
14921496

1493-
optexp = BackendVariable.varStartValueOption(var);
1497+
//optexp = BackendVariable.varStartValueOption(var);
14941498
preCref = ComponentReference.crefPrefixPre(cref); // cr => $PRE.cr
1495-
preVar = BackendDAE.VAR(preCref, BackendDAE.DISCRETE(), DAE.BIDIR(), DAE.NON_PARALLEL(), tp, NONE(), NONE(), arryDim, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());
1496-
preVar = BackendVariable.setVarFixed(preVar, true);
1497-
preVar = BackendVariable.setVarStartValueOption(preVar, optexp);
1499+
//preVar = BackendDAE.VAR(preCref, BackendDAE.DISCRETE(), DAE.BIDIR(), DAE.NON_PARALLEL(), tp, NONE(), NONE(), arryDim, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());
1500+
//preVar = BackendVariable.setVarFixed(preVar, true);
1501+
//preVar = BackendVariable.setVarStartValueOption(preVar, optexp);
14981502

1499-
e = Expression.crefExp(cref);
1500-
startExp = Expression.crefExp(preCref);
1503+
// e = Expression.crefExp(cref);
1504+
//startExp = Expression.crefExp(preCref);
15011505

1502-
eqn = BackendEquation.generateEquation(crefExp, startExp, tp, DAE.emptyElementSource, false);
1506+
//eqn = BackendEquation.generateEquation(crefExp, startExp, tp, DAE.emptyElementSource, false);
15031507

15041508
crStr = ComponentReference.crefStr(cref);
15051509
Debug.fcall(Flags.PEDANTIC, Error.addCompilerWarning, " [discrete] " +& crStr);
15061510

1511+
({preVar},_) = BackendVariable.getVar(preCref,iVars);
1512+
preVar = BackendVariable.setVarFixed(preVar, true);
1513+
vars = BackendVariable.deleteVar(preCref,iVars);
15071514
shared = BackendVariable.addKnVarDAE(preVar,iShared);
1508-
eqns = BackendEquation.equationAdd(eqn, inEqns);
1509-
(eqns,shared) = addStartValueEquations(vars, eqns,shared);
1515+
//eqns = BackendEquation.equationAdd(eqn, inEqns);
1516+
(vars,eqns,shared) = addStartValueEquations(varlst,vars,inEqns,shared);
15101517
then
1511-
(eqns,shared);
1518+
(vars,eqns,shared);
15121519

1513-
case (var::vars, _,_)
1520+
case (var::varlst, _, _, _)
15141521
equation
15151522
cref = BackendVariable.varCref(var);
15161523
tp = BackendVariable.varType(var);
@@ -1527,9 +1534,9 @@ algorithm
15271534
Debug.fcall(Flags.PEDANTIC, Error.addCompilerWarning, " [continuous] " +& crStr);
15281535

15291536
eqns = BackendEquation.equationAdd(eqn, inEqns);
1530-
(eqns,shared) = addStartValueEquations(vars, eqns,iShared);
1537+
(vars,eqns,shared) = addStartValueEquations(varlst,iVars,eqns,iShared);
15311538
then
1532-
(eqns,shared);
1539+
(vars,eqns,shared);
15331540

15341541
else equation
15351542
Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/Initialization.mo: function addStartValueEquations failed"});

Compiler/BackEnd/RemoveSimpleEquations.mo

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -368,18 +368,21 @@ algorithm
368368
HashSet.HashSet unreplacable;
369369
DAE.Exp e;
370370
DAE.ComponentRef cr;
371+
list<DAE.Exp> explst;
372+
list<DAE.ComponentRef> crlst;
371373
case((e as DAE.CREF(componentRef = cr), unreplacable))
372374
equation
373375
unreplacable = traverseCrefUnreplacable(cr,NONE(),unreplacable);
374376
then
375377
((e, unreplacable));
376-
/* This is a test for the initial system
377-
case((DAE.CALL(path=Absyn.IDENT(name = "pre"),expLst={e as DAE.CREF(componentRef=cr)}), unreplacable))
378+
case((e as DAE.CALL(path=Absyn.IDENT(name = "pre"),expLst=explst), unreplacable))
378379
equation
379-
unreplacable = BaseHashSet.add(cr,unreplacable);
380+
crlst = List.flatten(List.map(explst,Expression.extractCrefsFromExp));
381+
crlst = List.map(crlst,ComponentReference.crefStripLastSubs);
382+
unreplacable = List.fold(crlst,BaseHashSet.add,unreplacable);
380383
then
381384
((e, unreplacable));
382-
*/ case _ then inExp;
385+
case _ then inExp;
383386
end matchcontinue;
384387
end traverserExpUnreplacable;
385388

0 commit comments

Comments
 (0)