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

[DAEmode] added when equation support #2245

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions Compiler/BackEnd/BackendDAE.mo
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,8 @@ end EquationAttributes;
public constant EquationAttributes EQ_ATTR_DEFAULT_DYNAMIC = EQUATION_ATTRIBUTES(false, DYNAMIC_EQUATION());
public constant EquationAttributes EQ_ATTR_DEFAULT_BINDING = EQUATION_ATTRIBUTES(false, BINDING_EQUATION());
public constant EquationAttributes EQ_ATTR_DEFAULT_INITIAL = EQUATION_ATTRIBUTES(false, INITIAL_EQUATION());
public constant EquationAttributes EQ_ATTR_DEFAULT_DISCRETE = EQUATION_ATTRIBUTES(false, DISCRETE_EQUATION());
public constant EquationAttributes EQ_ATTR_DEFAULT_AUX = EQUATION_ATTRIBUTES(false, AUX_EQUATION());
public constant EquationAttributes EQ_ATTR_DEFAULT_UNKNOWN = EQUATION_ATTRIBUTES(false, UNKNOWN_EQUATION_KIND());

public
Expand Down
2 changes: 2 additions & 0 deletions Compiler/BackEnd/BackendDump.mo
Original file line number Diff line number Diff line change
Expand Up @@ -2783,6 +2783,8 @@ algorithm
case BackendDAE.BINDING_EQUATION() then "binding";
case BackendDAE.DYNAMIC_EQUATION() then "dynamic";
case BackendDAE.INITIAL_EQUATION() then "initial";
case BackendDAE.AUX_EQUATION() then "auxiliary";
case BackendDAE.DISCRETE_EQUATION() then "discrete";
case BackendDAE.UNKNOWN_EQUATION_KIND() then "unknown";
case BackendDAE.CLOCKED_EQUATION(i)
equation
Expand Down
27 changes: 23 additions & 4 deletions Compiler/BackEnd/DAEMode.mo
Original file line number Diff line number Diff line change
Expand Up @@ -274,8 +274,9 @@ algorithm
guard(Util.boolAndList(list(CommonSubExpression.isCSECref(v.varName) for v in vars)) and not listEmpty(varIdxs))
equation
newResVars = list(BackendVariable.setVarKind(v, BackendDAE.DAE_AUX_VAR()) for v in vars);
new_eq = BackendEquation.setEquationAttributes(eq, BackendDAE.EQ_ATTR_DEFAULT_AUX);
traverserArgs.auxVars = listAppend(newResVars, traverserArgs.auxVars);
traverserArgs.auxEqns = listAppend({eq}, traverserArgs.auxEqns);
traverserArgs.auxEqns = listAppend({new_eq}, traverserArgs.auxEqns);
crlst = list(v.varName for v in vars);
traverserArgs.systemVars = BackendVariable.removeCrefs(crlst, traverserArgs.systemVars);
if debug then print("[DAEmode] Added solved aux vars. vars:\n" +
Expand All @@ -290,6 +291,7 @@ algorithm
equation
eq.exp = ExpressionSolve.solve(eq.exp, eq.scalar, Expression.crefExp(var.varName));
new_eq = BackendDAE.SOLVED_EQUATION(var.varName, eq.exp, eq.source, eq.attr);
new_eq = BackendEquation.setEquationAttributes(new_eq, BackendDAE.EQ_ATTR_DEFAULT_AUX);
traverserArgs.auxVars = listAppend({var}, traverserArgs.auxVars);
traverserArgs.auxEqns = listAppend({new_eq}, traverserArgs.auxEqns);
if debug then print("[DAEmode] Create solved equation. vars:\n" +
Expand All @@ -302,11 +304,24 @@ algorithm
guard (not listEmpty(varIdxs) and // not inside of EQNS_SYSTEM possible solveable
not Util.boolOrList(list(BackendVariable.isStateVar(v) for v in vars)))
equation
new_eq = BackendEquation.setEquationAttributes(eq, BackendDAE.EQ_ATTR_DEFAULT_AUX);
traverserArgs.auxVars = listAppend(vars, traverserArgs.auxVars);
traverserArgs.auxEqns = listAppend({eq}, traverserArgs.auxEqns);
traverserArgs.auxEqns = listAppend({new_eq}, traverserArgs.auxEqns);
if debug then print("[DAEmode] Create solved complex equation. vars:\n" +
BackendDump.varListString(vars, "") + "eq:\n" +
BackendDump.equationListString({eq}, "") + "\n"); end if;
BackendDump.equationListString({new_eq}, "") + "\n"); end if;
then
(traverserArgs);

case ({eq as BackendDAE.WHEN_EQUATION()}, {var})
guard (not listEmpty(varIdxs)) // not inside of EQNS_SYSTEM possible solveable
equation
new_eq = BackendEquation.setEquationAttributes(eq, BackendDAE.EQ_ATTR_DEFAULT_DISCRETE);
traverserArgs.auxVars = listAppend({var}, traverserArgs.auxVars);
traverserArgs.auxEqns = listAppend({new_eq}, traverserArgs.auxEqns);
if debug then print("[DAEmode] Create solved when equation. vars:\n" +
BackendDump.varListString({var}, "") + "eq:\n" +
BackendDump.equationListString({new_eq}, "") + "\n"); end if;
then
(traverserArgs);

Expand All @@ -321,6 +336,7 @@ algorithm
(newResEqns, newResVars, newnumResVars) = BackendEquation.convertResidualsIntoSolvedEquations(newResEqns,
"$DAEres", dummyVar, globalDAEData.numResVars);
globalDAEData.numResVars = newnumResVars;
newResEqns = list(BackendEquation.setEquationAttributes(e, BackendDAE.EQ_ATTR_DEFAULT_DYNAMIC) for e in newResEqns);
traverserArgs.resVars = listAppend(newResVars, traverserArgs.resVars);
traverserArgs.resEqns = listAppend(newResEqns, traverserArgs.resEqns);
globalDAEData = addVarsGlobalData(globalDAEData, vars);
Expand Down Expand Up @@ -354,6 +370,8 @@ algorithm
newCref = ComponentReference.crefPrefixAux(cref);
eq.left = Expression.crefExp(newCref);
aux_eq = eq;

aux_eq = BackendEquation.setEquationAttributes(aux_eq, BackendDAE.EQ_ATTR_DEFAULT_AUX);
traverserArgs.auxEqns = listAppend({aux_eq}, traverserArgs.auxEqns);

// prepare res equation aux = recordCref
Expand All @@ -366,6 +384,7 @@ algorithm
(newResEqns, newResVars, newnumResVars) = BackendEquation.convertResidualsIntoSolvedEquations(newResEqns,
"$DAEres", dummyVar, globalDAEData.numResVars);
globalDAEData.numResVars = newnumResVars;
newResEqns = list(BackendEquation.setEquationAttributes(e, BackendDAE.EQ_ATTR_DEFAULT_DYNAMIC) for e in newResEqns);
traverserArgs.resVars = listAppend(listReverse(newResVars), traverserArgs.resVars);
traverserArgs.resEqns = listAppend(listReverse(newResEqns), traverserArgs.resEqns);
globalDAEData = addVarsGlobalData(globalDAEData, vars);
Expand All @@ -380,7 +399,7 @@ algorithm
(traverserArgs);

case(_, _)
guard( listLength(inVars) == listLength(inEqns))
guard( listLength(inVars) == listLength(inEqns) and not listEmpty(varIdxs))
algorithm
vars := inVars;
for e in inEqns loop
Expand Down