Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 46dca42

Browse files
Willi BraunOpenModelica-Hudson
authored andcommitted
[BE] Fixing differentiation of synchronous states
Belonging to [master]: - #2269 - OpenModelica/OpenModelica-testsuite#874
1 parent 407a017 commit 46dca42

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

Compiler/BackEnd/Differentiate.mo

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,10 +1336,17 @@ algorithm
13361336

13371337
String s1, s2, serr, matrixName, name;
13381338

1339-
case (e as DAE.CALL(path=Absyn.IDENT(name = "previous")), _, _, _, _) equation
1340-
tp = Expression.typeof(e);
1341-
zero = Expression.makeZeroExpression(Expression.arrayDimension(tp));
1342-
then (zero, inFunctionTree);
1339+
/* with previous are the actaully states marked in synchronous */
1340+
case (e as DAE.CALL(path=Absyn.IDENT(name = "previous"), expLst = {DAE.CREF(componentRef=cr, ty=tp)}),
1341+
_, BackendDAE.DIFFINPUTDATA(independenentVars=SOME(timevars),matrixName=SOME(matrixName)),
1342+
BackendDAE.GENERIC_GRADIENT(), _) equation
1343+
1344+
cr = ComponentReference.makeCrefQual(DAE.previousNamePrefix, tp, {}, cr);
1345+
(_::_, _) = BackendVariable.getVar(cr, timevars);
1346+
cr = createSeedCrefName(cr, matrixName);
1347+
1348+
res = DAE.CREF(cr, tp);
1349+
then (res, inFunctionTree);
13431350

13441351
case (DAE.CALL(path = path as Absyn.IDENT(name = "der"),expLst = {e},attr=attr), _, _, BackendDAE.DIFFERENTIATION_TIME(), _)
13451352
then

Compiler/BackEnd/SymbolicJacobian.mo

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,6 +1654,7 @@ continuous states: der(x) > dependent and x > independent
16541654
clocked states: previous(x) > independent and x > dependent
16551655
"
16561656
input list<BackendDAE.Var> independentVars;
1657+
input Boolean createpDerStates = true;
16571658
output list<BackendDAE.Var> outVars = {};
16581659
output list<DAE.ComponentRef> outCrefs = {};
16591660
protected
@@ -1664,9 +1665,12 @@ algorithm
16641665
var := BackendVariable.createClockedState(v);
16651666
outVars := var::outVars;
16661667
outCrefs := var.varName::outCrefs;
1667-
else
1668+
elseif createpDerStates then
16681669
outVars := BackendVariable.createpDerVar(v)::outVars;
16691670
outCrefs := v.varName::outCrefs;
1671+
else
1672+
outVars := v::outVars;
1673+
outCrefs := v.varName::outCrefs;
16701674
end if;
16711675
end for;
16721676
outVars := listReverse(outVars);
@@ -2000,7 +2004,7 @@ algorithm
20002004

20012005
BackendDAE.Shared shared;
20022006
BackendDAE.Variables globalKnownVars, globalKnownVars1;
2003-
list<BackendDAE.Var> diffedVars "resVars", seedlst;
2007+
list<BackendDAE.Var> diffedVars "resVars", seedlst, indepVars;
20042008

20052009
DAE.FunctionTree funcs;
20062010

@@ -2013,9 +2017,20 @@ algorithm
20132017

20142018
comref_vars = List.map(inDiffVars, BackendVariable.varCref);
20152019
seedlst = List.map1(comref_vars, createSeedVars, inName);
2020+
indepVars = createInDepVars(inDiffVars, false);
2021+
2022+
if Flags.isSet(Flags.JAC_DUMP) then
2023+
print("Crete symbolic Jacobianis from:\n");
2024+
print(BackendDump.varListString(indepVars, "Independent Variables"));
2025+
print(BackendDump.varListString(diffedVars, "Dependent Variables"));
2026+
print("Basic equation system:\n");
2027+
print(BackendDump.equationListString(BackendEquation.equationSystemsEqnsLst(reducedDAE.eqs), "differentiated equations"));
2028+
print(BackendDump.varListString(BackendVariable.equationSystemsVarsLst(reducedDAE.eqs), "related variables"));
2029+
print(BackendDump.varListString(BackendVariable.varList(reducedDAE.shared.globalKnownVars), "known variables"));
2030+
end if;
20162031

2017-
// Differentiate the ODE system w.r.t states for jacobian
2018-
(backendDAE as BackendDAE.DAE(shared=_), funcs) = generateSymbolicJacobian(reducedDAE, inDiffVars, inDifferentiatedVars, BackendVariable.listVar1(seedlst), inStateVars, inInputVars, inParameterVars, inName);
2032+
// Differentiate the eqns system in reducedDAE w.r.t. independents
2033+
(backendDAE as BackendDAE.DAE(shared=_), funcs) = generateSymbolicJacobian(reducedDAE, indepVars, inDifferentiatedVars, BackendVariable.listVar1(seedlst), inStateVars, inInputVars, inParameterVars, inName);
20192034
if Flags.isSet(Flags.JAC_DUMP2) then
20202035
print("analytical Jacobians -> generated equations for Jacobian " + inName + " time: " + realString(clock()) + "\n");
20212036
end if;

0 commit comments

Comments
 (0)