Skip to content

Commit

Permalink
- fix algorithms for initialization
Browse files Browse the repository at this point in the history
- disable some FMI/ModelExchange tests, as long as they are built on a buggy implementation of algorithms in the initialization


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@13763 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
lochel committed Nov 2, 2012
1 parent 8e4e92a commit 310bc20
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 75 deletions.
31 changes: 17 additions & 14 deletions Compiler/BackEnd/BackendDAEOptimize.mo
Expand Up @@ -6576,26 +6576,30 @@ algorithm

Integer numberOfInitialEquations, numberOfInitialAlgorithms;
list<BackendDAE.Equation> initialEqs_lst, initialEqs_lst1, initialEqs_lst2, initialEqs_lst3;
case(BackendDAE.DAE(eqs=eqs, shared=BackendDAE.SHARED(initialEqs=initialEqs))) equation

case (BackendDAE.DAE(eqs=eqs, shared=BackendDAE.SHARED(initialEqs=initialEqs))) equation
// [initial equations]
// initial_equation
initialEqs_lst1 = BackendEquation.traverseBackendDAEEqns(initialEqs, BackendDAEUtil.traverseequationToScalarResidualForm, {});
initialEqs_lst1 = listReverse(initialEqs_lst1);

initialEqs_lst = BackendEquation.traverseBackendDAEEqns(initialEqs, BackendDAEUtil.traverseEquationToScalarResidualForm, {});
initialEqs_lst = listReverse(initialEqs_lst);
initialEqs_lst1 = List.select(initialEqs_lst, BackendEquation.isNotAlgorithm);

// [orderedVars] with start-values and fixed=true
// v - start(v); fixed(v) = true
initialEqs_lst2 = generateFixedStartValueResiduals(List.flatten(List.mapMap(eqs, BackendVariable.daeVars, BackendDAEUtil.varList)));
initialEqs_lst = listAppend(initialEqs_lst1, initialEqs_lst2);
numberOfInitialEquations = listLength(initialEqs_lst);


// [initial algorithms]
// is still missing but algorithms from initial equations are generate in parameter eqns.
initialEqs_lst3 = {};
// remove algorithms, I have no clue what the reason is but is was done before also
initialEqs_lst3 = List.select(initialEqs_lst, BackendEquation.isAlgorithm);
//initialEqs_lst3 = {};

// append and count
initialEqs_lst = listAppend(initialEqs_lst1, initialEqs_lst2);
numberOfInitialEquations = BackendDAEUtil.equationSize(BackendDAEUtil.listEquation(initialEqs_lst));
initialEqs_lst = listAppend(initialEqs_lst, initialEqs_lst3);
numberOfInitialAlgorithms = listLength(initialEqs_lst3);
then(initialEqs_lst, numberOfInitialEquations, numberOfInitialAlgorithms);
numberOfInitialAlgorithms = BackendDAEUtil.equationSize(BackendDAEUtil.listEquation(initialEqs_lst3));
then (initialEqs_lst, numberOfInitialEquations, numberOfInitialAlgorithms);

else equation
Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/BackendDAEOptimize.mo: function collectInitialResiduals failed"});
then fail();
Expand All @@ -6621,7 +6625,6 @@ algorithm
case({}) then {};

case(var::vars) equation
//SOME(startExp) = BackendVariable.varStartValueOption(var);
true = BackendVariable.varFixed(var);
false = BackendVariable.isStateVar(var);
false = BackendVariable.isParam(var);
Expand Down
18 changes: 9 additions & 9 deletions Compiler/BackEnd/BackendDAEUtil.mo
Expand Up @@ -6486,7 +6486,7 @@ algorithm
end matchcontinue;
end traverseequationToResidualForm;

public function traverseequationToScalarResidualForm "function: traverseequationToScalarResidualForm
public function traverseEquationToScalarResidualForm "function traverseEquationToScalarResidualForm
author: Frenkel TUD 2010-11
helper for calculateJacobian"
input tuple<BackendDAE.Equation, list<BackendDAE.Equation>> inTpl;
Expand All @@ -6496,15 +6496,15 @@ algorithm
local
list<BackendDAE.Equation> eqns,reqn;
BackendDAE.Equation eqn;
case ((eqn,eqns))
equation
reqn = BackendEquation.equationToScalarResidualForm(eqn);
eqns = listAppend(reqn,eqns);
then
((eqn,eqns));
case _ then inTpl;
case ((eqn,eqns)) equation
reqn = BackendEquation.equationToScalarResidualForm(eqn);
eqns = listAppend(reqn,eqns);
then ((eqn,eqns));

case _
then inTpl;
end matchcontinue;
end traverseequationToScalarResidualForm;
end traverseEquationToScalarResidualForm;

protected function calculateJacobianRows "function: calculateJacobianRows
author: PA
Expand Down
13 changes: 10 additions & 3 deletions Compiler/BackEnd/BackendEquation.mo
Expand Up @@ -2208,14 +2208,21 @@ algorithm
end match;
end isArrayEquation;

public function isNotAlgorithm
public function isAlgorithm
input BackendDAE.Equation inEqn;
output Boolean b;
algorithm
b := match(inEqn)
case BackendDAE.ALGORITHM(source=_) then false;
else then true;
case BackendDAE.ALGORITHM(source=_) then true;
else then false;
end match;
end isAlgorithm;

public function isNotAlgorithm
input BackendDAE.Equation inEqn;
output Boolean b;
algorithm
b := not isAlgorithm(inEqn);
end isNotAlgorithm;

end BackendEquation;
2 changes: 1 addition & 1 deletion Compiler/BackEnd/SimCode.mo
Expand Up @@ -181,7 +181,7 @@ uniontype VarInfo
Integer numInVars;
Integer numInitialEquations;
Integer numInitialAlgorithms;
Integer numInitialResiduals;
Integer numInitialResiduals; // numInitialEquations+numInitialAlgorithms
Integer numExternalObjects;
Integer numStringAlgVars;
Integer numStringParamVars;
Expand Down
77 changes: 31 additions & 46 deletions Compiler/BackEnd/SimCodeUtil.mo
Expand Up @@ -1804,7 +1804,7 @@ algorithm
matchcontinue (inBackendDAE,inClassName,filenamePrefix,inString11,functions,externalFunctionIncludes,includeDirs,libs,simSettingsOpt,recordDecls,literals,args)
local
String cname, fileDir;
Integer n_h,maxDelayedExpIndex, uniqueEqIndex, numberofNonLinearSys, numberofEqns, numberOfInitialEquations;
Integer n_h,maxDelayedExpIndex, uniqueEqIndex, numberofNonLinearSys, numberofEqns, numberOfInitialEquations, numberOfInitialAlgorithms;
list<SimCode.HelpVarInfo> helpVarInfo;
BackendDAE.BackendDAE dlow,dlow2;
DAE.FunctionTree functionTree;
Expand Down Expand Up @@ -1860,7 +1860,6 @@ algorithm
// check if the Sytems has states
dlow = BackendDAEUtil.addDummyStateIfNeeded(dlow);


(helpVarInfo, dlow2, sampleEqns) = generateHelpVarInfo(dlow);
BackendDAE.DAE(systs, shared as BackendDAE.SHARED(removedEqs=removedEqs,
constraints = constrsarr,
Expand All @@ -1879,11 +1878,11 @@ algorithm
n_h = listLength(helpVarInfo);

// initialization stuff
(residuals, initialEquations, numberOfInitialEquations, uniqueEqIndex,tempvars,initialSystemSolved) = createInitialResiduals(dlow2,uniqueEqIndex,{},helpVarInfo);
(residuals, initialEquations, numberOfInitialEquations, numberOfInitialAlgorithms, uniqueEqIndex, tempvars, initialSystemSolved) = createInitialResiduals(dlow2, uniqueEqIndex, {}, helpVarInfo);
(jacG, uniqueEqIndex) = createInitialMatrices(dlow2, uniqueEqIndex);

// Add model info
modelInfo = createModelInfo(class_, dlow2, functions, {}, n_h, numberOfInitialEquations, 0, fileDir,ifcpp);
modelInfo = createModelInfo(class_, dlow2, functions, {}, n_h, numberOfInitialEquations, numberOfInitialAlgorithms, fileDir,ifcpp);

// equation generation for euler, dassl2, rungekutta
(uniqueEqIndex,odeEquations,algebraicEquations,allEquations,tempvars) = createEquationsForSystems(systs,shared,helpVarInfo,uniqueEqIndex,{},{},{},tempvars);
Expand Down Expand Up @@ -6283,7 +6282,7 @@ algorithm
end matchcontinue;
end createInitialMatrices;

protected function createInitialResiduals "function: createInitialResiduals
protected function createInitialResiduals "function createInitialResiduals
author: lochel
This function generates all initial_residuals."
input BackendDAE.BackendDAE inDAE;
Expand All @@ -6293,11 +6292,12 @@ protected function createInitialResiduals "function: createInitialResiduals
output list<SimCode.SimEqSystem> outResiduals;
output list<SimCode.SimEqSystem> outInitialEqns;
output Integer outNumberOfInitialEquations;
output Integer outNumberOfInitialAlgorithms;
output Integer ouniqueEqIndex;
output list<SimCode.SimVar> otempvars;
output Boolean initialSystemSolved;
algorithm
(outResiduals, outInitialEqns, outNumberOfInitialEquations, ouniqueEqIndex, otempvars, initialSystemSolved) := matchcontinue(inDAE,iuniqueEqIndex,itempvars,helpVarInfo)
(outResiduals, outInitialEqns, outNumberOfInitialEquations, outNumberOfInitialAlgorithms, ouniqueEqIndex, otempvars, initialSystemSolved) := matchcontinue(inDAE, iuniqueEqIndex, itempvars, helpVarInfo)
local
BackendDAE.EqSystems eqs;
BackendDAE.EquationArray initialEqs,removedEqs;
Expand All @@ -6306,52 +6306,37 @@ algorithm

list<BackendDAE.Equation> initialEqs_lst;
Integer numberOfInitialEquations, numberOfInitialAlgorithms;

list<SimCode.SimEqSystem> residual_equations,residual_equations1,allEquations,removedEquations,knvarseqns,aliasEquations;
BackendDAE.EqSystems systs;
BackendDAE.Shared shared;
BackendDAE.Variables knvars,aliasVars;

// try to solve the inital system symbolical.
case(_,_,_,_)
equation
true = Flags.isSet(Flags.SOLVE_INITIAL_SYSTEM);
// generate initalsystem
(_,BackendDAE.DAE(systs,shared as BackendDAE.SHARED(knownVars=knvars,aliasVars=aliasVars,removedEqs=removedEqs))) = BackendDAEUtil.solveInitialSystem(inDAE);
// generate equations from the solved systems
(uniqueEqIndex,_,_,allEquations,tempvars) = createEquationsForSystems(systs,shared,helpVarInfo,iuniqueEqIndex,{},{},{},itempvars);
// generate equations from the removed equations
((uniqueEqIndex,removedEquations)) = BackendEquation.traverseBackendDAEEqns(removedEqs,traversedlowEqToSimEqSystem,(uniqueEqIndex,{}));
allEquations = listAppend(allEquations,removedEquations);
// generate equations from the knvown unfixed variables
((uniqueEqIndex,knvarseqns)) = BackendVariable.traverseBackendDAEVars(knvars,traverseKnVarsToSimEqSystem,(uniqueEqIndex,{}));
allEquations = listAppend(allEquations,knvarseqns);
// generate equations from the alias variables
((uniqueEqIndex,aliasEquations)) = BackendVariable.traverseBackendDAEVars(aliasVars,traverseAliasVarsToSimEqSystem,(uniqueEqIndex,{}));
allEquations = listAppend(allEquations,aliasEquations);
then
({},allEquations,0,uniqueEqIndex,tempvars,true);
case(BackendDAE.DAE(eqs=eqs, shared=BackendDAE.SHARED(initialEqs=initialEqs)),_,_,_)
equation
// initial_equation
numberOfInitialEquations = BackendDAEUtil.equationSize(initialEqs);
initialEqs_lst = BackendDAEUtil.equationList(initialEqs);
// remove algorithms, I have no clue what the reason is but is was done before also
// do not remove the inital algorithms if the system is solved symbolically
initialEqs_lst = Debug.bcallret2(not Flags.isSet(Flags.SOLVE_INITIAL_SYSTEM),List.select,initialEqs_lst,BackendEquation.isNotAlgorithm,initialEqs_lst);
numberOfInitialEquations = Debug.bcallret1(not Flags.isSet(Flags.SOLVE_INITIAL_SYSTEM),BackendEquation.equationLstSize,initialEqs_lst,numberOfInitialEquations);
(residual_equations,uniqueEqIndex,tempvars) = createNonlinearResidualEquations(initialEqs_lst, iuniqueEqIndex, itempvars);

// [orderedVars] with start-values and fixed=true
// v - start(v); fixed(v) = true
initialEqs_lst = BackendDAEOptimize.generateFixedStartValueResiduals(List.flatten(List.mapMap(eqs, BackendVariable.daeVars, BackendDAEUtil.varList)));
numberOfInitialEquations = listLength(initialEqs_lst) + numberOfInitialEquations;

(residual_equations1, uniqueEqIndex) = List.mapFold(initialEqs_lst, dlowEqToSimEqSystem, uniqueEqIndex);
residual_equations = listAppend(residual_equations,residual_equations1);
then
(residual_equations,{},numberOfInitialEquations,uniqueEqIndex,tempvars,Flags.isSet(Flags.SOLVE_INITIAL_SYSTEM));

case(_, _, _, _) equation
true = Flags.isSet(Flags.SOLVE_INITIAL_SYSTEM);
// generate initalsystem
(_,BackendDAE.DAE(systs,shared as BackendDAE.SHARED(knownVars=knvars,aliasVars=aliasVars,removedEqs=removedEqs))) = BackendDAEUtil.solveInitialSystem(inDAE);
// generate equations from the solved systems
(uniqueEqIndex,_,_,allEquations,tempvars) = createEquationsForSystems(systs,shared,helpVarInfo,iuniqueEqIndex,{},{},{},itempvars);
// generate equations from the removed equations
((uniqueEqIndex,removedEquations)) = BackendEquation.traverseBackendDAEEqns(removedEqs,traversedlowEqToSimEqSystem,(uniqueEqIndex,{}));
allEquations = listAppend(allEquations,removedEquations);
// generate equations from the knvown unfixed variables
((uniqueEqIndex,knvarseqns)) = BackendVariable.traverseBackendDAEVars(knvars,traverseKnVarsToSimEqSystem,(uniqueEqIndex,{}));
allEquations = listAppend(allEquations,knvarseqns);
// generate equations from the alias variables
((uniqueEqIndex,aliasEquations)) = BackendVariable.traverseBackendDAEVars(aliasVars,traverseAliasVarsToSimEqSystem,(uniqueEqIndex,{}));
allEquations = listAppend(allEquations,aliasEquations);
then ({}, allEquations, 0, 0, uniqueEqIndex, tempvars, true);

case(_, _, _, _) equation
(initialEqs_lst, numberOfInitialEquations, numberOfInitialAlgorithms) = BackendDAEOptimize.collectInitialResiduals(inDAE);
(residual_equations, uniqueEqIndex, tempvars) = createNonlinearResidualEquations(initialEqs_lst, iuniqueEqIndex, itempvars);
then (residual_equations, {}, numberOfInitialEquations, numberOfInitialAlgorithms, uniqueEqIndex, tempvars, Flags.isSet(Flags.SOLVE_INITIAL_SYSTEM));

else equation
Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/SimCode.mo: createInitialResiduals failed"});
Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/SimCodeUtil.mo: createInitialResiduals failed"});
then fail();
end matchcontinue;
end createInitialResiduals;
Expand Down
4 changes: 2 additions & 2 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -271,7 +271,7 @@ template populateModelInfo(ModelInfo modelInfo, String fileNamePrefix, String gu
data->modelData.nRelations = <%varInfo.numRelations%>;
data->modelData.nInitEquations = <%varInfo.numInitialEquations%>;
data->modelData.nInitAlgorithms = <%varInfo.numInitialAlgorithms%>;
data->modelData.nInitResiduals = <%varInfo.numInitialResiduals%>;
data->modelData.nInitResiduals = <%varInfo.numInitialResiduals%>; /* data->modelData.nInitEquations + data->modelData.nInitAlgorithms */
data->modelData.nExtObjs = <%varInfo.numExternalObjects%>;
data->modelData.nFunctions = <%listLength(functions)%>;
data->modelData.nEquations = <%varInfo.numEquations%>;
Expand Down Expand Up @@ -2540,7 +2540,7 @@ case SIMCODE(modelInfo = MODELINFO(functions = functions, varInfo = vi as VARINF

numberOfInputVariables = "<%vi.numInVars%>" cmt_numberOfInputVariables = "NI: number of inputvar on topmodel, OMC"
numberOfOutputVariables = "<%vi.numOutVars%>" cmt_numberOfOutputVariables = "NO: number of outputvar on topmodel, OMC"

numberOfResidualsForInitialization = "<%vi.numInitialResiduals%>" cmt_numberOfResidualsForInitialization = "NR: number of residuals for initialialization function, OMC"
numberOfExternalObjects = "<%vi.numExternalObjects%>" cmt_numberOfExternalObjects = "NEXT: number of external objects, OMC"
numberOfFunctions = "<%listLength(functions)%>" cmt_numberOfFunctions = "NFUNC: number of functions used by the simulation, OMC"
Expand Down

0 comments on commit 310bc20

Please sign in to comment.