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

Commit 67e62cb

Browse files
Willi BraunOpenModelica-Hudson
authored andcommitted
[DAEmode] added when equation support
Belonging to [master]: - #2245 - OpenModelica/OpenModelica-testsuite#864
1 parent 1cc3bf3 commit 67e62cb

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

Compiler/BackEnd/BackendDAE.mo

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,8 @@ end EquationAttributes;
313313
public constant EquationAttributes EQ_ATTR_DEFAULT_DYNAMIC = EQUATION_ATTRIBUTES(false, DYNAMIC_EQUATION());
314314
public constant EquationAttributes EQ_ATTR_DEFAULT_BINDING = EQUATION_ATTRIBUTES(false, BINDING_EQUATION());
315315
public constant EquationAttributes EQ_ATTR_DEFAULT_INITIAL = EQUATION_ATTRIBUTES(false, INITIAL_EQUATION());
316+
public constant EquationAttributes EQ_ATTR_DEFAULT_DISCRETE = EQUATION_ATTRIBUTES(false, DISCRETE_EQUATION());
317+
public constant EquationAttributes EQ_ATTR_DEFAULT_AUX = EQUATION_ATTRIBUTES(false, AUX_EQUATION());
316318
public constant EquationAttributes EQ_ATTR_DEFAULT_UNKNOWN = EQUATION_ATTRIBUTES(false, UNKNOWN_EQUATION_KIND());
317319

318320
public

Compiler/BackEnd/BackendDump.mo

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2783,6 +2783,8 @@ algorithm
27832783
case BackendDAE.BINDING_EQUATION() then "binding";
27842784
case BackendDAE.DYNAMIC_EQUATION() then "dynamic";
27852785
case BackendDAE.INITIAL_EQUATION() then "initial";
2786+
case BackendDAE.AUX_EQUATION() then "auxiliary";
2787+
case BackendDAE.DISCRETE_EQUATION() then "discrete";
27862788
case BackendDAE.UNKNOWN_EQUATION_KIND() then "unknown";
27872789
case BackendDAE.CLOCKED_EQUATION(i)
27882790
equation

Compiler/BackEnd/DAEMode.mo

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,8 +277,9 @@ algorithm
277277
guard(Util.boolAndList(list(CommonSubExpression.isCSECref(v.varName) for v in vars)) and not listEmpty(varIdxs))
278278
equation
279279
newResVars = list(BackendVariable.setVarKind(v, BackendDAE.DAE_AUX_VAR()) for v in vars);
280+
new_eq = BackendEquation.setEquationAttributes(eq, BackendDAE.EQ_ATTR_DEFAULT_AUX);
280281
traverserArgs.auxVars = listAppend(newResVars, traverserArgs.auxVars);
281-
traverserArgs.auxEqns = listAppend({eq}, traverserArgs.auxEqns);
282+
traverserArgs.auxEqns = listAppend({new_eq}, traverserArgs.auxEqns);
282283
crlst = list(v.varName for v in vars);
283284
traverserArgs.systemVars = BackendVariable.removeCrefs(crlst, traverserArgs.systemVars);
284285
if debug then print("[DAEmode] Added solved aux vars. vars:\n" +
@@ -293,6 +294,7 @@ algorithm
293294
equation
294295
eq.exp = ExpressionSolve.solve(eq.exp, eq.scalar, Expression.crefExp(var.varName));
295296
new_eq = BackendDAE.SOLVED_EQUATION(var.varName, eq.exp, eq.source, eq.attr);
297+
new_eq = BackendEquation.setEquationAttributes(new_eq, BackendDAE.EQ_ATTR_DEFAULT_AUX);
296298
traverserArgs.auxVars = listAppend({var}, traverserArgs.auxVars);
297299
traverserArgs.auxEqns = listAppend({new_eq}, traverserArgs.auxEqns);
298300
if debug then print("[DAEmode] Create solved equation. vars:\n" +
@@ -305,11 +307,24 @@ algorithm
305307
guard (not listEmpty(varIdxs) and // not inside of EQNS_SYSTEM possible solveable
306308
not Util.boolOrList(list(BackendVariable.isStateVar(v) for v in vars)))
307309
equation
310+
new_eq = BackendEquation.setEquationAttributes(eq, BackendDAE.EQ_ATTR_DEFAULT_AUX);
308311
traverserArgs.auxVars = listAppend(vars, traverserArgs.auxVars);
309-
traverserArgs.auxEqns = listAppend({eq}, traverserArgs.auxEqns);
312+
traverserArgs.auxEqns = listAppend({new_eq}, traverserArgs.auxEqns);
310313
if debug then print("[DAEmode] Create solved complex equation. vars:\n" +
311314
BackendDump.varListString(vars, "") + "eq:\n" +
312-
BackendDump.equationListString({eq}, "") + "\n"); end if;
315+
BackendDump.equationListString({new_eq}, "") + "\n"); end if;
316+
then
317+
(traverserArgs);
318+
319+
case ({eq as BackendDAE.WHEN_EQUATION()}, {var})
320+
guard (not listEmpty(varIdxs)) // not inside of EQNS_SYSTEM possible solveable
321+
equation
322+
new_eq = BackendEquation.setEquationAttributes(eq, BackendDAE.EQ_ATTR_DEFAULT_DISCRETE);
323+
traverserArgs.auxVars = listAppend({var}, traverserArgs.auxVars);
324+
traverserArgs.auxEqns = listAppend({new_eq}, traverserArgs.auxEqns);
325+
if debug then print("[DAEmode] Create solved when equation. vars:\n" +
326+
BackendDump.varListString({var}, "") + "eq:\n" +
327+
BackendDump.equationListString({new_eq}, "") + "\n"); end if;
313328
then
314329
(traverserArgs);
315330

@@ -324,6 +339,7 @@ algorithm
324339
(newResEqns, newResVars, newnumResVars) = BackendEquation.convertResidualsIntoSolvedEquations(newResEqns,
325340
"$DAEres", dummyVar, globalDAEData.numResVars);
326341
globalDAEData.numResVars = newnumResVars;
342+
newResEqns = list(BackendEquation.setEquationAttributes(e, BackendDAE.EQ_ATTR_DEFAULT_DYNAMIC) for e in newResEqns);
327343
traverserArgs.resVars = listAppend(newResVars, traverserArgs.resVars);
328344
traverserArgs.resEqns = listAppend(newResEqns, traverserArgs.resEqns);
329345
globalDAEData = addVarsGlobalData(globalDAEData, vars);
@@ -357,6 +373,8 @@ algorithm
357373
newCref = ComponentReference.crefPrefixAux(cref);
358374
eq.left = Expression.crefExp(newCref);
359375
aux_eq = eq;
376+
377+
aux_eq = BackendEquation.setEquationAttributes(aux_eq, BackendDAE.EQ_ATTR_DEFAULT_AUX);
360378
traverserArgs.auxEqns = listAppend({aux_eq}, traverserArgs.auxEqns);
361379

362380
// prepare res equation aux = recordCref
@@ -369,6 +387,7 @@ algorithm
369387
(newResEqns, newResVars, newnumResVars) = BackendEquation.convertResidualsIntoSolvedEquations(newResEqns,
370388
"$DAEres", dummyVar, globalDAEData.numResVars);
371389
globalDAEData.numResVars = newnumResVars;
390+
newResEqns = list(BackendEquation.setEquationAttributes(e, BackendDAE.EQ_ATTR_DEFAULT_DYNAMIC) for e in newResEqns);
372391
traverserArgs.resVars = listAppend(listReverse(newResVars), traverserArgs.resVars);
373392
traverserArgs.resEqns = listAppend(listReverse(newResEqns), traverserArgs.resEqns);
374393
globalDAEData = addVarsGlobalData(globalDAEData, vars);
@@ -383,7 +402,7 @@ algorithm
383402
(traverserArgs);
384403

385404
case(_, _)
386-
guard( listLength(inVars) == listLength(inEqns))
405+
guard( listLength(inVars) == listLength(inEqns) and not listEmpty(varIdxs))
387406
algorithm
388407
vars := inVars;
389408
for e in inEqns loop

0 commit comments

Comments
 (0)