Skip to content

Commit

Permalink
- add support for homotopy (experimental implementation)
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@16547 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
lochel committed Jul 4, 2013
1 parent 5594363 commit 2e4fc63
Show file tree
Hide file tree
Showing 15 changed files with 202 additions and 44 deletions.
6 changes: 3 additions & 3 deletions Compiler/BackEnd/BackendQSS.mo
Expand Up @@ -999,7 +999,7 @@ algorithm
list<list<SimCode.SimEqSystem>> algebraicEquations,odeEquations;
list<SimCode.SimEqSystem> allEquations,residualEquations,startValueEquations,parameterEquations,inlineEquations,removedEquations,algorithmAndEquationAsserts;
list<SimCode.StateSet> stateSets;
Boolean useSymbolicInitialization;
Boolean useSymbolicInitialization, useHomotopy;
list<SimCode.SimEqSystem> initialEquations;
list<DAE.Constraint> constraints;
list<DAE.ClassAttributes> classAttributes;
Expand All @@ -1016,15 +1016,15 @@ algorithm
list<SimCode.SimEqSystem> eqs;
BackendDAE.SampleLookup sampleLookup;
case (SimCode.SIMCODE(modelInfo,literals,recordDecls,externalFunctionIncludes,allEquations,odeEquations,
algebraicEquations,residualEquations,useSymbolicInitialization,initialEquations,startValueEquations,
algebraicEquations,residualEquations,useSymbolicInitialization,useHomotopy,initialEquations,startValueEquations,
parameterEquations,inlineEquations,removedEquations,algorithmAndEquationAsserts,stateSets,constraints,classAttributes,zeroCrossings,relations,
sampleLookup,whenClauses,discreteModelVars,extObjInfo,makefileParams,
delayedExps,jacobianMatrixes,simulationSettingsOpt,fileNamePrefix,crefToSimVarHT),_)
equation
{eqs} = odeEquations;
eqs = List.map1(eqs,replaceZC,zc_exps);
then SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes,
allEquations, {eqs}, algebraicEquations, residualEquations, useSymbolicInitialization,
allEquations, {eqs}, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy,
initialEquations, startValueEquations, parameterEquations, inlineEquations,
removedEquations, algorithmAndEquationAsserts, stateSets, constraints, classAttributes,
zeroCrossings, relations, sampleLookup,
Expand Down
4 changes: 3 additions & 1 deletion Compiler/BackEnd/HpcOmSimCode.mo
Expand Up @@ -81,13 +81,15 @@ algorithm
DAE.FunctionTree functionTree;
BackendDAE.SymbolicJacobians symJacs;
Absyn.Path class_;

// new variables
SimCode.ModelInfo modelInfo;
list<SimCode.SimEqSystem> allEquations;
list<list<SimCode.SimEqSystem>> odeEquations; // --> functionODE
list<list<SimCode.SimEqSystem>> algebraicEquations; // --> functionAlgebraics
list<SimCode.SimEqSystem> residuals; // --> initial_residual
Boolean useSymbolicInitialization; // true if a system to solve the initial problem symbolically is generated, otherwise false
Boolean useHomotopy; // true if homotopy(...) is used during initialization
list<SimCode.SimEqSystem> initialEquations; // --> initial_equations
list<SimCode.SimEqSystem> startValueEquations; // --> updateBoundStartValues
list<SimCode.SimEqSystem> parameterEquations; // --> updateBoundParameters
Expand Down Expand Up @@ -149,7 +151,7 @@ algorithm
cname = Absyn.pathStringNoQual(class_);

// generate initDAE before replacing pre(alias)!
initDAE = Initialization.solveInitialSystem(dlow);
(initDAE, useHomotopy) = Initialization.solveInitialSystem(dlow);
// replace pre(alias) in time-equations
dlow = BackendDAEOptimize.simplifyTimeIndepFuncCalls(dlow);

Expand Down
47 changes: 28 additions & 19 deletions Compiler/BackEnd/Initialization.mo
Expand Up @@ -75,8 +75,9 @@ public function solveInitialSystem "function solveInitialSystem
This function generates a algebraic system of equations for the initialization and solves it."
input BackendDAE.BackendDAE inDAE;
output Option<BackendDAE.BackendDAE> outInitDAE;
output Boolean outUseHomotopy;
algorithm
outInitDAE := matchcontinue(inDAE)
(outInitDAE, outUseHomotopy) := matchcontinue(inDAE)
local
BackendDAE.BackendDAE dae;
BackendDAE.Variables initVars;
Expand All @@ -97,6 +98,7 @@ algorithm
list<tuple<BackendDAEUtil.pastoptimiseDAEModule, String, Boolean>> pastOptModules;
tuple<BackendDAEUtil.StructurallySingularSystemHandlerFunc, String, BackendDAEUtil.stateDeselectionFunc, String> daeHandler;
tuple<BackendDAEUtil.matchingAlgorithmFunc, String> matchingAlgorithm;
Boolean useHomotopy;
list<BackendDAE.Var> dumpVars, dumpVars2;

case(_) equation
Expand All @@ -106,7 +108,6 @@ algorithm

initVars = selectInitializationVariablesDAE(dae);
// Debug.fcall2(Flags.DUMP_INITIAL_SYSTEM, BackendDump.dumpVariables, initVars, "selected initialization variables");

hs = collectPreVariables(dae);
BackendDAE.DAE(systs, shared as BackendDAE.SHARED(knownVars=knvars,
aliasVars=avars,
Expand All @@ -132,8 +133,8 @@ algorithm
((vars, fixvars, eqns, reeqns, _)) = List.fold(systs, collectInitialVarsEqnsSystem, ((vars, fixvars, eqns, reeqns, hs)));
((eqns, reeqns)) = BackendVariable.traverseBackendDAEVars(vars, collectInitialBindings, (eqns, reeqns));

// replace initial(), sample(...) and delay(...)
_ = BackendDAEUtil.traverseBackendDAEExpsEqnsWithUpdate(eqns, simplifyInitialFunctions, false);
// replace initial(), sample(...), delay(...) and homotopy(...)
useHomotopy = BackendDAEUtil.traverseBackendDAEExpsEqnsWithUpdate(eqns, simplifyInitialFunctions, false);

evars = BackendVariable.emptyVars();
eavars = BackendVariable.emptyVars();
Expand Down Expand Up @@ -194,9 +195,9 @@ algorithm

b = Flags.isSet(Flags.DUMP_EQNINORDER) and Flags.isSet(Flags.DUMP_INITIAL_SYSTEM);
Debug.bcall2(b, BackendDump.dumpEqnsSolved, initdae, "initial system: eqns in order");
then SOME(initdae);
then (SOME(initdae), useHomotopy);

else then NONE();
else then (NONE(), false);
end matchcontinue;
end solveInitialSystem;

Expand Down Expand Up @@ -1091,7 +1092,7 @@ algorithm
(outVars, outEqs, oB, outDumpVars) := matchcontinue(n, mt, inVars, inEqs, iB, inDumpVars)
local
list<Integer> row;
Boolean b;
Boolean b, useHomotopy;
BackendDAE.Variables vars;
BackendDAE.EquationArray eqs;
list<BackendDAE.Var> rvarlst;
Expand All @@ -1109,7 +1110,7 @@ algorithm
case(_, _, _, _, _, _) equation
row = mt[n];
true = List.isEmpty(row);

var = BackendVariable.getVarAt(inVars, n);
cref = BackendVariable.varCref(var);
true = ComponentReference.isPreCref(cref);
Expand Down Expand Up @@ -1149,28 +1150,36 @@ end preBalanceInitialSystem1;
protected function simplifyInitialFunctions "function simplifyInitialFunctions
author: Frenkel TUD 2012-12
simplify initial() with true and sample with false"
input tuple<DAE.Exp, Boolean> inTpl;
output tuple<DAE.Exp, Boolean> outTpl;
input tuple<DAE.Exp, Boolean /* homotopy used? */> inTpl;
output tuple<DAE.Exp, Boolean /* homotopy used? */> outTpl;
protected
DAE.Exp exp;
Boolean b;
Boolean useHomotopy;
algorithm
(exp, b) := inTpl;
outTpl := Expression.traverseExp(exp, simplifyInitialFunctionsExp, b);
(exp, useHomotopy) := inTpl;
outTpl := Expression.traverseExp(exp, simplifyInitialFunctionsExp, useHomotopy);
end simplifyInitialFunctions;

protected function simplifyInitialFunctionsExp "function simplifyInitialFunctionsExp
author: Frenkel TUD 2012-12
helper for simplifyInitialFunctions"
input tuple<DAE.Exp, Boolean> inExp;
output tuple<DAE.Exp, Boolean> outExp;
input tuple<DAE.Exp, Boolean /* homotopy used? */> inExp;
output tuple<DAE.Exp, Boolean /* homotopy used? */> outExp;
algorithm
outExp := matchcontinue(inExp)
local
DAE.Exp e1;
case ((DAE.CALL(path = Absyn.IDENT(name="initial")), _)) then ((DAE.BCONST(true), true));
case ((DAE.CALL(path = Absyn.IDENT(name="sample")), _)) then ((DAE.BCONST(false), true));
case ((DAE.CALL(path = Absyn.IDENT(name="delay"), expLst = _::e1::_ ),_)) then ((e1, true));
DAE.Exp e1, e2, e3, actual, simplified;
Boolean useHomotopy;
case ((DAE.CALL(path = Absyn.IDENT(name="initial")), useHomotopy)) then ((DAE.BCONST(true), useHomotopy));
case ((DAE.CALL(path = Absyn.IDENT(name="sample")), useHomotopy)) then ((DAE.BCONST(false), useHomotopy));
case ((DAE.CALL(path = Absyn.IDENT(name="delay"), expLst = _::e1::_ ), useHomotopy)) then ((e1, useHomotopy));
case ((DAE.CALL(path = Absyn.IDENT(name="homotopy"), expLst = actual::simplified::_ ), _)) equation
e1 = Expression.makeBuiltinCall("homotopyParameter", {}, DAE.T_REAL_DEFAULT);
e2 = DAE.BINARY(e1, DAE.MUL(DAE.T_REAL_DEFAULT), actual);
e3 = DAE.BINARY(DAE.RCONST(1.0), DAE.SUB(DAE.T_REAL_DEFAULT), e1);
e1 = DAE.BINARY(e3, DAE.MUL(DAE.T_REAL_DEFAULT), simplified);
e3 = DAE.BINARY(e2, DAE.ADD(DAE.T_REAL_DEFAULT), e1);
then ((e3, true));
else then inExp;
end matchcontinue;
end simplifyInitialFunctionsExp;
Expand Down
2 changes: 1 addition & 1 deletion Compiler/BackEnd/ResidualCmp.mo
Expand Up @@ -188,7 +188,7 @@ algorithm
makefileParams = SimCode.MAKEFILE_PARAMS("","","","","","","","","",includeDirs,libs,"");
delayexp = SimCode.DELAYED_EXPRESSIONS({},0);
hashTable = SimCodeUtil.emptyHashTable();
rescmp = SimCode.SIMCODE(modelInfo,{},recordDecls,externalFunctionIncludes,{},{},{},allEquations,false,allInitEquations,{},{},{},{},{},{},{},{},{},{},BackendDAE.SAMPLE_LOOKUP(0,{}),{},{},extObjInfo,makefileParams,delayexp,{},NONE(),filenamePrefix,hashTable);
rescmp = SimCode.SIMCODE(modelInfo,{},recordDecls,externalFunctionIncludes,{},{},{},allEquations,false,false,allInitEquations,{},{},{},{},{},{},{},{},{},{},BackendDAE.SAMPLE_LOOKUP(0,{}),{},{},extObjInfo,makefileParams,delayexp,{},NONE(),filenamePrefix,hashTable);
then
rescmp;
else
Expand Down
1 change: 1 addition & 0 deletions Compiler/BackEnd/SimCode.mo
Expand Up @@ -85,6 +85,7 @@ uniontype SimCode
list<list<SimEqSystem>> algebraicEquations;
list<SimEqSystem> residualEquations;
Boolean useSymbolicInitialization; // true if a system to solve the initial problem symbolically is generated, otherwise false
Boolean useHomotopy; // true if homotopy(...) is used during initialization
list<SimEqSystem> initialEquations;
list<SimEqSystem> startValueEquations;
list<SimEqSystem> parameterEquations;
Expand Down
22 changes: 12 additions & 10 deletions Compiler/BackEnd/SimCodeUtil.mo
Expand Up @@ -1467,6 +1467,7 @@ algorithm
list<list<SimCode.SimEqSystem>> algebraicEquations; // --> functionAlgebraics
list<SimCode.SimEqSystem> residuals; // --> initial_residual
Boolean useSymbolicInitialization; // true if a system to solve the initial problem symbolically is generated, otherwise false
Boolean useHomotopy; // true if homotopy(...) is used during initialization
list<SimCode.SimEqSystem> initialEquations; // --> initial_equations
list<SimCode.SimEqSystem> startValueEquations; // --> updateBoundStartValues
list<SimCode.SimEqSystem> parameterEquations; // --> updateBoundParameters
Expand Down Expand Up @@ -1510,7 +1511,7 @@ algorithm
cname = Absyn.pathStringNoQual(class_);

// generate initDAE before replacing pre(alias)!
initDAE = Initialization.solveInitialSystem(dlow);
(initDAE, useHomotopy) = Initialization.solveInitialSystem(dlow);

// replace pre(alias) in time-equations
dlow = BackendDAEOptimize.simplifyTimeIndepFuncCalls(dlow);
Expand Down Expand Up @@ -1642,6 +1643,7 @@ algorithm
algebraicEquations,
residuals,
useSymbolicInitialization,
useHomotopy,
initialEquations,
startValueEquations,
parameterEquations,
Expand Down Expand Up @@ -11676,7 +11678,7 @@ algorithm
list<list<SimCode.SimEqSystem>> odeEquations, algebraicEquations;
list<SimCode.SimEqSystem> allEquations, residualEquations, startValueEquations, parameterEquations, inlineEquations, removedEquations, algorithmAndEquationAsserts;
list<SimCode.StateSet> stateSets;
Boolean useSymbolicInitialization;
Boolean useSymbolicInitialization, useHomotopy;
list<SimCode.SimEqSystem> initialEquations;
list<DAE.Constraint> constraints;
list<DAE.ClassAttributes> classAttributes;
Expand Down Expand Up @@ -11704,7 +11706,7 @@ algorithm
true = Config.acceptMetaModelicaGrammar();
then inSimCode;

case SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, initialEquations, startValueEquations,
case SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations,
parameterEquations, inlineEquations, removedEquations, algorithmAndEquationAsserts, stateSets, constraints, classAttributes, zeroCrossings, relations, sampleLookup, whenClauses,
discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, crefToSimVarHT)
equation
Expand All @@ -11721,7 +11723,7 @@ algorithm
files = List.sort(files, greaterFileInfo);
modelInfo = SimCode.MODELINFO(name, directory, varInfo, vars, functions, labels);
then
SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, initialEquations, startValueEquations,
SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations,
parameterEquations, inlineEquations, removedEquations, algorithmAndEquationAsserts, stateSets, constraints, classAttributes, zeroCrossings, relations, sampleLookup, whenClauses,
discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, crefToSimVarHT);

Expand Down Expand Up @@ -11981,7 +11983,7 @@ algorithm
list<list<SimCode.SimEqSystem>> odeEquations;
list<list<SimCode.SimEqSystem>> algebraicEquations;
list<SimCode.SimEqSystem> residualEquations;
Boolean useSymbolicInitialization;
Boolean useSymbolicInitialization, useHomotopy;
list<SimCode.SimEqSystem> initialEquations;
list<SimCode.SimEqSystem> startValueEquations;
list<SimCode.SimEqSystem> parameterEquations;
Expand All @@ -12007,7 +12009,7 @@ algorithm

case (SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes,
allEquations, odeEquations, algebraicEquations, residualEquations,
useSymbolicInitialization, initialEquations, startValueEquations,
useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations,
parameterEquations, inlineEquations, removedEquations, algorithmAndEquationAsserts, stateSets,
constraints, classAttributes, zeroCrossings, relations, sampleLookup,
whenClauses, discreteModelVars, extObjInfo, makefileParams,
Expand All @@ -12032,7 +12034,7 @@ algorithm
/* TODO:jacobianMatrixes */
then (SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes,
allEquations, odeEquations, algebraicEquations, residualEquations,
useSymbolicInitialization, initialEquations, startValueEquations,
useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations,
parameterEquations, inlineEquations, removedEquations, algorithmAndEquationAsserts, stateSets,
constraints, classAttributes, zeroCrossings, relations, sampleLookup,
whenClauses, discreteModelVars, extObjInfo, makefileParams,
Expand Down Expand Up @@ -12183,7 +12185,7 @@ algorithm
list<list<SimCode.SimEqSystem>> odeEquations;
list<list<SimCode.SimEqSystem>> algebraicEquations;
list<SimCode.SimEqSystem> residualEquations;
Boolean useSymbolicInitialization;
Boolean useSymbolicInitialization, useHomotopy;
list<SimCode.SimEqSystem> initialEquations;
list<SimCode.SimEqSystem> startValueEquations;
list<SimCode.SimEqSystem> parameterEquations;
Expand All @@ -12208,14 +12210,14 @@ algorithm

case (SimCode.SIMCODE(modelInfo, _, recordDecls, externalFunctionIncludes,
allEquations, odeEquations, algebraicEquations, residualEquations,
useSymbolicInitialization, initialEquations, startValueEquations,
useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations,
parameterEquations, inlineEquations, removedEquations, algorithmAndEquationAsserts, stateSets,
constraints, classAttributes, zeroCrossings, relations, sampleLookup,
whenClauses, discreteModelVars, extObjInfo, makefileParams,
delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, crefToSimVarHT), _)
then SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes,
allEquations, odeEquations, algebraicEquations, residualEquations,
useSymbolicInitialization, initialEquations, startValueEquations,
useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations,
parameterEquations, inlineEquations, removedEquations, algorithmAndEquationAsserts, stateSets,
constraints, classAttributes, zeroCrossings, relations, sampleLookup,
whenClauses, discreteModelVars, extObjInfo, makefileParams,
Expand Down
7 changes: 3 additions & 4 deletions Compiler/FrontEnd/ModelicaBuiltin.mo
Expand Up @@ -289,10 +289,9 @@ function homotopy
input Real actual;
input Real simplified;
output Real outValue;
algorithm
outValue := actual;
annotation(__OpenModelica_EarlyInline=true,version="Modelica 3.2",Documentation(info="<html>
Full implementation not available in OpenModelica (trivial solution: simplified expression ignored).
external "builtin"
annotation(version="Modelica 3.2",Documentation(info="<html>
See <a href=\"modelica://ModelicaReference.Operators.'homotopy()'\">homotopy()</a> (experimental implementation)
</html>"));
end homotopy;

Expand Down
8 changes: 6 additions & 2 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -190,7 +190,7 @@ template simulationFile(SimCode simCode, String guid)
<%functionUpdateBoundStartValues(startValueEquations)%>
<%functionInitialResidual(residualEquations)%>
<%functionInitialEquations(useSymbolicInitialization, initialEquations)%>
<%functionInitialEquations(useSymbolicInitialization, useHomotopy, initialEquations)%>
<%functionInlineEquations(inlineEquations)%>
Expand Down Expand Up @@ -1311,7 +1311,7 @@ template functionInitialResidual(list<SimEqSystem> residualEquations)
>>
end functionInitialResidual;

template functionInitialEquations(Boolean useSymbolicInitialization, list<SimEqSystem> initalEquations)
template functionInitialEquations(Boolean useSymbolicInitialization, Boolean useHomotopy, list<SimEqSystem> initalEquations)
"Generates function in simulation file."
::=
let () = System.tmpTickReset(0)
Expand All @@ -1323,11 +1323,15 @@ template functionInitialEquations(Boolean useSymbolicInitialization, list<SimEqS
restore_memory_state(mem_state);
>>
;separator="\n")

let useSymbolicInitializationToInt = if useSymbolicInitialization then '1' else '0'
let useHomotopyToInt = if useHomotopy then '1' else '0'
let errorMsg = if not useSymbolicInitialization then 'ERROR0(LOG_INIT, "The symbolic initialization was not generated.");'

<<
<%&tmp%>
const int useSymbolicInitialization = <%useSymbolicInitializationToInt%>; /* <%useSymbolicInitialization%> */
const int useHomotopy = <%useHomotopyToInt%>; /* <%useHomotopy%> */
int functionInitialEquations(DATA *data)
{
state mem_state;
Expand Down

0 comments on commit 2e4fc63

Please sign in to comment.