Skip to content

Commit

Permalink
- Generate empty functions file so that compilation will succeed
Browse files Browse the repository at this point in the history
  (generation of function code failed for one test case)
- Replaced DAELow.Equation with SimEqSystem as a step to support array eqs


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@4650 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Rickard Lindberg committed Dec 9, 2009
1 parent 7282df0 commit e0d6dfb
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 71 deletions.
117 changes: 80 additions & 37 deletions Compiler/SimCode.mo
Expand Up @@ -267,13 +267,13 @@ uniontype SimCode
// GlobalVariables globalVars ;
list<Function> functions;
//?? FuncionDefinitions functionDefinitions;
list<DAELow.Equation> stateEquations;
list<DAELow.Equation> nonStateContEquations;
list<DAELow.Equation> nonStateDiscEquations;
list<DAELow.Equation> residualEquations;
list<DAELow.Equation> initialEquations;
list<DAELow.Equation> parameterEquations;
list<DAELow.Equation> removedEquations;
list<SimEqSystem> stateEquations;
list<SimEqSystem> nonStateContEquations;
list<SimEqSystem> nonStateDiscEquations;
list<SimEqSystem> residualEquations;
list<SimEqSystem> initialEquations;
list<SimEqSystem> parameterEquations;
list<SimEqSystem> removedEquations;
list<DAELow.ZeroCrossing> zeroCrossings;
list<list<DAE.ComponentRef>> zeroCrossingsNeedSave;
list<HelpVarInfo> helpVarInfo;
Expand All @@ -282,6 +282,16 @@ uniontype SimCode
end SIMCODE;
end SimCode;

uniontype SimEqSystem
record SES_RESIDUAL
DAE.Exp exp;
end SES_RESIDUAL;
record SES_SIMPLE_ASSIGN
DAE.ComponentRef componentRef;
DAE.Exp exp;
end SES_SIMPLE_ASSIGN;
end SimEqSystem;

uniontype SimWhenClause
record SIM_WHEN_CLAUSE
list<DAE.ComponentRef> conditionVars;
Expand Down Expand Up @@ -443,7 +453,8 @@ algorithm
SimCodegen.generateMakefile(makefilename, filenameprefix, libs, file_dir);
*/

libs = generateFunctionsC(p_1, dae, indexed_dlow_1, className, filenameprefix);
//libs = generateFunctionsC(p_1, dae, indexed_dlow_1, className, filenameprefix);
libs = {};
generateSimulationCodeC(dae, indexed_dlow_1, ass1, ass2, m, mT, comps, className, filename, funcfilename,file_dir);

// keep this for testing purposes (remove later when we can generate
Expand Down Expand Up @@ -1163,13 +1174,13 @@ algorithm
// new variables
SimCode simCode;
ModelInfo modelInfo;
list<DAELow.Equation> stateEquations;
list<DAELow.Equation> nonStateContEquations;
list<DAELow.Equation> nonStateDiscEquations;
list<DAELow.Equation> residualEquations;
list<DAELow.Equation> initialEquations;
list<DAELow.Equation> parameterEquations;
list<DAELow.Equation> removedEquations;
list<SimEqSystem> stateEquations;
list<SimEqSystem> nonStateContEquations;
list<SimEqSystem> nonStateDiscEquations;
list<SimEqSystem> residualEquations;
list<SimEqSystem> initialEquations;
list<SimEqSystem> parameterEquations;
list<SimEqSystem> removedEquations;
list<DAELow.ZeroCrossing> zeroCrossings;
list<list<DAE.ComponentRef>> zeroCrossingsNeedSave;
list<SimWhenClause> whenClauses;
Expand Down Expand Up @@ -1235,15 +1246,19 @@ end generateSimulationCodeC;

public function createRemovedEquations
input DAELow.DAELow dlow;
output list<DAELow.Equation> removedEquations;
output list<SimEqSystem> removedEquations;
algorithm
removedEquations :=
matchcontinue (dlow)
local
DAELow.EquationArray r;
list<DAELow.Equation> removedEquationsTmp;
case (DAELow.DAELOW(removedEqs=r))
equation
removedEquations = DAELow.equationList(r);
removedEquationsTmp = DAELow.equationList(r);

removedEquations = Util.listMap(removedEquationsTmp,
dlowEqToSimEqSystem);
then removedEquations;
end matchcontinue;
end createRemovedEquations;
Expand Down Expand Up @@ -1390,15 +1405,15 @@ public function createEquations
input Integer[:] ass1;
input Integer[:] ass2;
input list<list<Integer>> comps;
output list<DAELow.Equation> equations;
output list<SimEqSystem> equations;
algorithm
equations :=
matchcontinue (dae, dlow, ass1, ass2, comps)
local
list<Integer> comp;
list<list<Integer>> restComps;
list<DAELow.Equation> equations_2;
DAELow.Equation equation_;
SimEqSystem equation_;
case (dae, dlow, ass1, ass2, {})
then {};
case (dae, dlow, ass1, ass2, comp :: restComps)
Expand All @@ -1421,7 +1436,7 @@ public function createEquation
input Integer[:] ass1;
input Integer[:] ass2;
input list<Integer> comp;
output DAELow.Equation equation_;
output SimEqSystem equation_;
algorithm
equation_ :=
matchcontinue (dae, dlow, ass1, ass2, comp)
Expand Down Expand Up @@ -1457,7 +1472,7 @@ algorithm
exp_ = Exp.solve(e1, e2, varexp);
varname = Exp.printComponentRefStr(cr);
then
DAELow.SOLVED_EQUATION(cr, exp_);
SES_SIMPLE_ASSIGN(cr, exp_);
/* single equation: state */
case (dae, DAELow.DAELOW(orderedVars=vars, orderedEqs=eqns),
ass1, ass2, {eqNum})
Expand All @@ -1472,32 +1487,33 @@ algorithm
varexp = DAE.CREF(cr_1,DAE.ET_REAL());
exp_ = Exp.solve(e1, e2, varexp);
then
DAELow.SOLVED_EQUATION(cr_1, exp_);
SES_SIMPLE_ASSIGN(cr_1, exp_);
/* multiple equations that must be solved together (algebraic loop) */
case (dae, dlow, ass1, ass2, eqNum :: restEqNums)
equation
Error.addMessage(Error.INTERNAL_ERROR, {"createEquation failed: algebraic loops not implemented yet"});
then
DAELow.SOLVED_EQUATION(DAE.WILD, DAE.ICONST(1));
SES_SIMPLE_ASSIGN(DAE.WILD, DAE.ICONST(1));
case (_,_,_,_,_)
equation
Error.addMessage(Error.INTERNAL_ERROR, {"createEquation failed"});
then
DAELow.SOLVED_EQUATION(DAE.WILD, DAE.ICONST(2));
SES_SIMPLE_ASSIGN(DAE.WILD, DAE.ICONST(2));
end matchcontinue;
end createEquation;

protected function createResidualEquations
input DAELow.DAELow dlow;
input Integer[:] ass1;
input Integer[:] ass2;
output list<DAELow.Equation> residualEquations;
output list<SimEqSystem> residualEquations;
algorithm
residualEquations :=
matchcontinue (dlow, ass1, ass2)
local
list<DAELow.Var> vars_lst;
list<DAELow.Equation> eqns_lst, se_lst, ie_lst, ie2_lst;
list<DAELow.Equation> residualEquationsTmp;
DAELow.Variables vars, knvars;
DAELow.EquationArray eqns, se, ie;
DAELow.MultiDimEquation[:] ae;
Expand Down Expand Up @@ -1525,12 +1541,15 @@ algorithm
ie_lst = Util.listMap(ie_lst, DAELow.equationToResidualForm);
ie2_lst = Util.listMap(ie2_lst, DAELow.equationToResidualForm);

residualEquations = listAppend(eqns_lst, se_lst);
residualEquations = listAppend(residualEquations, ie_lst);
residualEquations = listAppend(residualEquations, ie2_lst);
residualEquationsTmp = listAppend(eqns_lst, se_lst);
residualEquationsTmp = listAppend(residualEquationsTmp, ie_lst);
residualEquationsTmp = listAppend(residualEquationsTmp, ie2_lst);

residualEquationsTmp = Util.listFilter(residualEquationsTmp,
failUnlessResidual);

residualEquations = Util.listFilter(residualEquations,
failUnlessResidual);
residualEquations = Util.listMap(residualEquationsTmp,
dlowEqToSimEqSystem);
then
residualEquations;
case (_,_,_)
Expand All @@ -1542,6 +1561,22 @@ algorithm
end matchcontinue;
end createResidualEquations;

public function dlowEqToSimEqSystem
input DAELow.Equation inEquation;
output SimEqSystem outEquation;
algorithm
outEquation:=
matchcontinue (inEquation)
local
DAE.ComponentRef cr;
DAE.Exp exp_;
case (DAELow.SOLVED_EQUATION(cr, exp_))
then SES_SIMPLE_ASSIGN(cr, exp_);
case (DAELow.RESIDUAL_EQUATION(exp_))
then SES_RESIDUAL(exp_);
end matchcontinue;
end dlowEqToSimEqSystem;

protected function failUnlessResidual
input DAELow.Equation eq;
algorithm
Expand All @@ -1553,28 +1588,32 @@ end failUnlessResidual;

protected function createInitialEquations
input DAELow.DAELow dlow;
output list<DAELow.Equation> initialEquations;
output list<SimEqSystem> initialEquations;
algorithm
initialEquations :=
matchcontinue (dlow)
local
list<DAELow.Equation> initialEquationsTmp;
list<DAELow.Equation> initialEquationsTmp2;
list<DAELow.Var> vars_lst;
list<DAELow.Var> knvars_lst;
list<DAELow.Equation> eqns_lst;
DAELow.Variables vars;
DAELow.Variables knvars;
case (DAELow.DAELOW(orderedVars=vars, knownVars=knvars))
equation
initialEquations = {};
initialEquationsTmp2 = {};
// vars
vars_lst = DAELow.varList(vars);
initialEquationsTmp = createInitialAssignmentsFromStart(vars_lst);
initialEquations = listAppend(initialEquations, initialEquationsTmp);
initialEquationsTmp2 = listAppend(initialEquationsTmp2, initialEquationsTmp);
// kvars
knvars_lst = DAELow.varList(knvars);
initialEquationsTmp = createInitialAssignmentsFromStart(knvars_lst);
initialEquations = listAppend(initialEquations, initialEquationsTmp);
initialEquationsTmp2 = listAppend(initialEquationsTmp2, initialEquationsTmp);

initialEquations = Util.listMap(initialEquationsTmp2,
dlowEqToSimEqSystem);
then
initialEquations;
case (_)
Expand All @@ -1588,11 +1627,12 @@ end createInitialEquations;

protected function createParameterEquations
input DAELow.DAELow dlow;
output list<DAELow.Equation> parameterEquations;
output list<SimEqSystem> parameterEquations;
algorithm
parameterEquations :=
matchcontinue (dlow)
local
list<DAELow.Equation> parameterEquationsTmp;
list<DAELow.Equation> tempEqs;
list<DAELow.Var> vars_lst;
list<DAELow.Var> knvars_lst;
Expand All @@ -1601,11 +1641,14 @@ algorithm
DAELow.Variables knvars;
case (DAELow.DAELOW(orderedVars=vars, knownVars=knvars))
equation
parameterEquations = {};
parameterEquationsTmp = {};
// kvars params
knvars_lst = DAELow.varList(knvars);
tempEqs = createInitialParamAssignments(knvars_lst);
parameterEquations = listAppend(parameterEquations, tempEqs);
parameterEquationsTmp = listAppend(parameterEquationsTmp, tempEqs);

parameterEquations = Util.listMap(parameterEquationsTmp,
dlowEqToSimEqSystem);
then
parameterEquations;
case (_)
Expand Down
36 changes: 19 additions & 17 deletions Compiler/susan_codegen/SimCode/SimCodeC.tpl
Expand Up @@ -24,6 +24,8 @@ translateModel(SimCode simCode) ::=
case SIMCODE(modelInfo = MODELINFO) then
# cppFileContent = cppFile(simCode)
# textFile(cppFileContent, '<modelInfo.name>.cpp')
# functionsFileContent = ""
# textFile(functionsFileContent, '<modelInfo.name>_functions.cpp')
//functionsFile(...)
//initFile(...)
//makefile(...)
Expand Down Expand Up @@ -476,8 +478,8 @@ void deInitializeDataStruc(DATA* data, DATA_FLAGS flags)
}
>>

functionDaeOutput(list<Equation> nonStateContEquations,
list<Equation> removedEquations) ::=
functionDaeOutput(list<SimEqSystem> nonStateContEquations,
list<SimEqSystem> removedEquations) ::=
# varDecls = ""
# body = (nonStateContEquations of eq: '<equation_(eq, varDecls)>' "\n")
# body2 = (removedEquations of eq: '<equation_(eq, varDecls)>' "\n")
Expand All @@ -499,8 +501,8 @@ int functionDAE_output()
}
>>

functionDaeOutput2(list<Equation> nonStateDiscEquations,
list<Equation> removedEquations) ::=
functionDaeOutput2(list<SimEqSystem> nonStateDiscEquations,
list<SimEqSystem> removedEquations) ::=
# varDecls = ""
# body = (nonStateDiscEquations of eq: '<equation_(eq, varDecls)>' "\n")
# body2 = (removedEquations of eq: '<equation_(eq, varDecls)>' "\n")
Expand Down Expand Up @@ -641,9 +643,9 @@ int handleZeroCrossing(long index)
}
>>

functionUpdateDependents(list<Equation> stateEquations,
list<Equation> nonStateContEquations,
list<Equation> nonStateDiscEquations,
functionUpdateDependents(list<SimEqSystem> stateEquations,
list<SimEqSystem> nonStateContEquations,
list<SimEqSystem> nonStateDiscEquations,
list<HelpVarInfo> helpVarInfo) ::=
# varDecls = ""
# eq1 = (stateEquations of eq: '<equation_(eq, varDecls)>' "\n")
Expand Down Expand Up @@ -731,7 +733,7 @@ int function_when(int i)
}
>>

functionOde(list<Equation> stateEquations) ::=
functionOde(list<SimEqSystem> stateEquations) ::=
# varDecls = ""
# body = (stateEquations of eq: '<equation_(eq, varDecls)>' "\n")
<<
Expand All @@ -750,27 +752,27 @@ int functionODE()
}
>>

functionInitial(list<Equation> initialEquations) ::=
functionInitial(list<SimEqSystem> initialEquations) ::=
# varDecls = ""
# body = (initialEquations of eq as DAELow.SOLVED_EQUATION: '<equation_(eq, varDecls)>' "\n")
# body = (initialEquations of eq as SES_SIMPLE_ASSIGN: '<equation_(eq, varDecls)>' "\n")
<<
int initial_function()
{
<varDecls>
<body>
<initialEquations of eq as DAELow.SOLVED_EQUATION:
<initialEquations of eq as SES_SIMPLE_ASSIGN:
'if (sim_verbose) { printf("Setting variable start value: %s(start=%f)\n", "<cref(componentRef)>", <cref(componentRef)>); }' "\n">
return 0;
}
>>

functionInitialResidual(list<Equation> residualEquations) ::=
functionInitialResidual(list<SimEqSystem> residualEquations) ::=
# varDecls = ""
# body = (
residualEquations of eq as DAELow.RESIDUAL_EQUATION:
residualEquations of eq as SES_RESIDUAL:
if exp is DAE.SCONST then
'localData-\>initialResiduals[i++] = 0;'
else
Expand All @@ -796,9 +798,9 @@ int initial_residual()
}
>>

functionBoundParameters(list<Equation> parameterEquations) ::=
functionBoundParameters(list<SimEqSystem> parameterEquations) ::=
# varDecls = ""
# body = (parameterEquations of eq as DAELow.SOLVED_EQUATION: '<equation_(eq, varDecls)>' "\n")
# body = (parameterEquations of eq as SES_SIMPLE_ASSIGN: '<equation_(eq, varDecls)>' "\n")
<<
int bound_parameters()
{
Expand Down Expand Up @@ -930,8 +932,8 @@ char* <name>[1] = {""};
>>

// Residual equations are not handled here
equation_(Equation eq, Text varDecls) ::=
case SOLVED_EQUATION then
equation_(SimEqSystem eq, Text varDecls) ::=
case SES_SIMPLE_ASSIGN then
# preExp = ""
# expPart = daeExp(exp, preExp, varDecls)
<<
Expand Down

0 comments on commit e0d6dfb

Please sign in to comment.