Skip to content

Commit

Permalink
[DAEmode] added when equation support
Browse files Browse the repository at this point in the history
  • Loading branch information
Willi Braun authored and OpenModelica-Hudson committed Mar 1, 2018
1 parent 1cc3bf3 commit 67e62cb
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 4 deletions.
2 changes: 2 additions & 0 deletions Compiler/BackEnd/BackendDAE.mo
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
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
Expand Up @@ -277,8 +277,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 @@ -293,6 +294,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 @@ -305,11 +307,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 @@ -324,6 +339,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 @@ -357,6 +373,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 @@ -369,6 +387,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 @@ -383,7 +402,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

0 comments on commit 67e62cb

Please sign in to comment.