Skip to content

Commit

Permalink
Activate doLinearTearing by default, therefor
Browse files Browse the repository at this point in the history
 - expanded SimCode.SES_LINEAR for directional derivatives
   - adjust all codegen templates
 - generates by default directional derivatives for
   linear systems in calculateStrongComponentJacobians.
 - added capacity to runtime lapack solver to handle that jacobians.
 - Ajusted tests.
   - Follwiong 3 examples start to fail now:
     - Modelica.Electrical.Analog.Examples.DifferenceAmplifier.mos
     - Modelica.Electrical.Machines.Examples.AsynchronousInductionMachines.AIMC_YD.mos
     - Modelica.Mechanics.MultiBody.Examples.Elementary.LineForceWithTwoMasses.mos
     so they run for now with  nodoLinearTearing.
   - Also the 2 hpcom examples don't run with doLinearTearing.
   - Also for the Cpp runtime it's deactived for now and can be actived,
     when the cpp-runtime is prepared therefore.



git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@21558 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Willi Braun committed Jul 17, 2014
1 parent c1a9b43 commit 589e0a4
Show file tree
Hide file tree
Showing 19 changed files with 699 additions and 296 deletions.
38 changes: 21 additions & 17 deletions Compiler/BackEnd/BackendDAEOptimize.mo
Expand Up @@ -2621,18 +2621,18 @@ algorithm
end matchcontinue;
end generateImplicitInitialEquationsForParameters;

public function convertInitialResidualsIntoInitialEquations "author: lochel
This function converts initial residuals into initial equations of the following form:
public function convertResidualsIntoSolvedEquations "author: lochel
This function converts residuals into solved equations of the following form:
e.g.: 0 = a+b -> $res1 = a+b"
input list<BackendDAE.Equation> inResidualList;
output list<BackendDAE.Equation> outEquationList;
output list<BackendDAE.Var> outVariableList;
algorithm
(outEquationList, outVariableList) := convertInitialResidualsIntoInitialEquations2(inResidualList, 1, {}, {});
end convertInitialResidualsIntoInitialEquations;
(outEquationList, outVariableList) := convertResidualsIntoSolvedEquations2(inResidualList, 1, {}, {});
end convertResidualsIntoSolvedEquations;

protected function convertInitialResidualsIntoInitialEquations2 "author: lochel
This is a helper function of convertInitialResidualsIntoInitialEquations."
protected function convertResidualsIntoSolvedEquations2 "author: lochel
This is a helper function of convertResidualsIntoSolvedEquations."
input list<BackendDAE.Equation> inEquationList;
input Integer inIndex;
input list<BackendDAE.Equation> iEquationList;
Expand Down Expand Up @@ -2668,19 +2668,19 @@ algorithm

currVariable = BackendDAE.VAR(componentRef, BackendDAE.VARIABLE(), DAE.OUTPUT(), DAE.NON_PARALLEL(), DAE.T_REAL_DEFAULT, NONE(), NONE(), {}, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());

(equationList, variableList) = convertInitialResidualsIntoInitialEquations2(restEquationList, index+1,currEquation::iEquationList,currVariable::iVariableList);
(equationList, variableList) = convertResidualsIntoSolvedEquations2(restEquationList, index+1,currEquation::iEquationList,currVariable::iVariableList);
then (equationList, variableList);

case(currEquation::_, _,_,_) equation
errorMessage = "./Compiler/BackEnd/BackendDAEOptimize.mo: function convertInitialResidualsIntoInitialEquations2 failed: " +& BackendDump.equationString(currEquation);
errorMessage = "./Compiler/BackEnd/BackendDAEOptimize.mo: function convertResidualsIntoSolvedEquations2 failed: " +& BackendDump.equationString(currEquation);
Error.addMessage(Error.INTERNAL_ERROR, {errorMessage});
then fail();

else equation
Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/BackendDAEOptimize.mo: function convertInitialResidualsIntoInitialEquations2 failed"});
Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/BackendDAEOptimize.mo: function convertResidualsIntoSolvedEquations2 failed"});
then fail();
end matchcontinue;
end convertInitialResidualsIntoInitialEquations2;
end convertResidualsIntoSolvedEquations2;

protected function redirectOutputToBiDir "author: lochel
This is a helper function of generateInitialMatrices."
Expand Down Expand Up @@ -2737,7 +2737,7 @@ algorithm
initialEqs_lst = BackendEquation.traverseBackendDAEEqns(BackendEquation.listEquation(initialEqs_lst), BackendDAEUtil.traverseEquationToScalarResidualForm, {}); // ugly
//BackendDump.dumpBackendDAEEqnList(initialEqs_lst, "initial residuals 2", false);

(initialEquationList, initialVariableList) = convertInitialResidualsIntoInitialEquations(initialEqs_lst);
(initialEquationList, initialVariableList) = convertResidualsIntoSolvedEquations(initialEqs_lst);
initialEqs = BackendEquation.listEquation(initialEquationList);
initialVars = BackendVariable.listVar1(initialVariableList);
//BackendDump.dumpBackendDAEEqnList(initialEquationList, "initial equations", false);
Expand Down Expand Up @@ -2817,7 +2817,7 @@ algorithm
initialEqs_lst = BackendEquation.traverseBackendDAEEqns(BackendEquation.listEquation(initialEqs_lst), BackendDAEUtil.traverseEquationToScalarResidualForm, {}); // ugly
//BackendDump.dumpBackendDAEEqnList(initialEqs_lst, "initial residuals 2", false);

(initialEquationList, initialVariableList) = convertInitialResidualsIntoInitialEquations(initialEqs_lst);
(initialEquationList, initialVariableList) = convertResidualsIntoSolvedEquations(initialEqs_lst);
initialEqs = BackendEquation.listEquation(initialEquationList);
initialVars = BackendVariable.listVar1(initialVariableList);
//BackendDump.dumpBackendDAEEqnList(initialEquationList, "initial equations", false);
Expand Down Expand Up @@ -2888,7 +2888,7 @@ algorithm
initialEqs_lst = BackendEquation.traverseBackendDAEEqns(BackendEquation.listEquation(initialEqs_lst), BackendDAEUtil.traverseEquationToScalarResidualForm, {}); // ugly

//BackendDump.dumpBackendDAEEqnList(initialEqs_lst, "initial residuals", false);
(initialEquationList, initialVariableList) = convertInitialResidualsIntoInitialEquations(initialEqs_lst);
(initialEquationList, initialVariableList) = convertResidualsIntoSolvedEquations(initialEqs_lst);
initialEqs = BackendEquation.listEquation(initialEquationList);
initialVars = BackendVariable.listVar1(initialVariableList);
//BackendDump.dumpBackendDAEEqnList(initialEquationList, "initial equations", false);
Expand Down Expand Up @@ -3367,7 +3367,8 @@ algorithm
SOME({"inlineArrayEqn",
"constantLinearSystem",
"removeSimpleEquations",
"tearingSystem"}));
"tearingSystem",
"calculateStrongComponentJacobians"}));
_ = Flags.set(Flags.EXEC_STAT, b);
Debug.fcall(Flags.JAC_DUMP, BackendDump.bltdump, ("Symbolic Jacobian",backendDAE2));
then backendDAE2;
Expand Down Expand Up @@ -3842,7 +3843,6 @@ algorithm

case (dae)
equation
true = Flags.isSet(Flags.NLS_ANALYTIC_JACOBIAN);
dae = BackendDAEUtil.mapEqSystem(dae, calculateEqSystemJacobians);
then dae;
case (_) then dlow;
Expand Down Expand Up @@ -3931,6 +3931,7 @@ algorithm

case (BackendDAE.TORNSYSTEM(tearingvars=iterationvarsInts, residualequations=residualequations, otherEqnVarTpl=otherEqnVarTpl, linear=b), _, _, _)
equation
true = (Flags.isSet(Flags.NLS_ANALYTIC_JACOBIAN) and not b) or b;
// get iteration vars
iterationvars = List.map1r(iterationvarsInts, BackendVariable.getVarAt, inVars);
iterationvars = List.map(iterationvars, BackendVariable.transformXToXd);
Expand All @@ -3943,19 +3944,21 @@ algorithm
// create residual equations
reqns = BackendEquation.traverseBackendDAEEqns(eqns, BackendDAEUtil.traverseEquationToScalarResidualForm, {});
reqns = listReverse(reqns);
(reqns, resVarsLst) = convertInitialResidualsIntoInitialEquations(reqns);
(reqns, resVarsLst) = convertResidualsIntoSolvedEquations(reqns);
resVars = BackendVariable.listVar1(resVarsLst);
eqns = BackendEquation.listEquation(reqns);

// get other eqns
otherEqnsInts = List.map(otherEqnVarTpl, Util.tuple21);
otherEqnsLst = BackendEquation.getEqns(otherEqnsInts, inEqns);
otherEqnsLst = BackendEquation.replaceDerOpInEquationList(otherEqnsLst);
oeqns = BackendEquation.listEquation(otherEqnsLst);

// get other vars
otherVarsIntsLst = List.map(otherEqnVarTpl, Util.tuple22);
otherVarsInts = List.unionList(otherVarsIntsLst);
ovarsLst = List.map1r(otherVarsInts, BackendVariable.getVarAt, inVars);
ovarsLst = List.map(ovarsLst, BackendVariable.transformXToXd);
ovars = BackendVariable.listVar1(ovarsLst);

//generate jacobian name
Expand All @@ -3972,6 +3975,7 @@ algorithm

case (BackendDAE.EQUATIONSYSTEM(eqns=residualequations, vars=iterationvarsInts), _, _, _)
equation
true = Flags.isSet(Flags.NLS_ANALYTIC_JACOBIAN);
// get iteration vars
iterationvars = List.map1r(iterationvarsInts, BackendVariable.getVarAt, inVars);
iterationvars = List.map(iterationvars, BackendVariable.transformXToXd);
Expand All @@ -3985,7 +3989,7 @@ algorithm
// create residual equations
reqns = BackendEquation.traverseBackendDAEEqns(eqns, BackendDAEUtil.traverseEquationToScalarResidualForm, {});
reqns = listReverse(reqns);
(reqns, resVarsLst) = convertInitialResidualsIntoInitialEquations(reqns);
(reqns, resVarsLst) = convertResidualsIntoSolvedEquations(reqns);
resVars = BackendVariable.listVar1(resVarsLst);
eqns = BackendEquation.listEquation(reqns);

Expand Down
14 changes: 7 additions & 7 deletions Compiler/BackEnd/HpcOmScheduler.mo
Expand Up @@ -2257,7 +2257,7 @@ protected function createTDSupdateModelInfo"updated information in the SimCode.M
protected
Integer numZeroCrossings,numTimeEvents,numRelations,numMathEventFunctions,numStateVars,numAlgVars,numDiscreteReal,numIntAlgVars,numBoolAlgVars,numAlgAliasVars,numIntAliasVars,
numBoolAliasVars,numParams,numIntParams,numBoolParams,numOutVars,numInVars,numInitialEquations,numInitialAlgorithms,numInitialResiduals,numExternalObjects,numStringAlgVars,
numStringParamVars,numStringAliasVars,numEquations,numLinearSystems,numNonLinearSystems,numMixedSystems,numStateSets,numOptimizeConstraints;
numStringParamVars,numStringAliasVars,numEquations,numLinearSystems,numNonLinearSystems,numMixedSystems,numStateSets,numJacobians,numOptimizeConstraints;
Integer threadIdx,taskIdx,compIdx,simVarIdx,simEqSysIdx,lsIdx,nlsIdx,mIdx;
SimCode.ModelInfo modelInfo;
Absyn.Path name;
Expand All @@ -2276,7 +2276,7 @@ algorithm
SimCode.SIMVARS(stateVars=stateVars, algVars = algVars) := vars;
SimCode.VARINFO(numZeroCrossings,numTimeEvents,numRelations,numMathEventFunctions,numStateVars,numAlgVars,numDiscreteReal,numIntAlgVars,numBoolAlgVars,numAlgAliasVars,numIntAliasVars,
numBoolAliasVars,numParams,numIntParams,numBoolParams,numOutVars,numInVars,numInitialEquations,numInitialAlgorithms,numInitialResiduals,numExternalObjects,numStringAlgVars,numStringParamVars,
numStringAliasVars,numEquations,numLinearSystems,numNonLinearSystems,numMixedSystems,numStateSets,numOptimizeConstraints) := varInfo;
numStringAliasVars,numEquations,numLinearSystems,numNonLinearSystems,numMixedSystems,numStateSets,numJacobians,numOptimizeConstraints) := varInfo;
// get new values
numStateVars := listLength(stateVars);
numAlgVars := listLength(algVars);
Expand All @@ -2286,7 +2286,7 @@ algorithm
//update objects
varInfo := SimCode.VARINFO(numZeroCrossings,numTimeEvents,numRelations,numMathEventFunctions,numStateVars,numAlgVars,numDiscreteReal,numIntAlgVars,numBoolAlgVars,numAlgAliasVars,numIntAliasVars,
numBoolAliasVars,numParams,numIntParams,numBoolParams,numOutVars,numInVars,numInitialEquations,numInitialAlgorithms,numInitialResiduals,numExternalObjects,numStringAlgVars,numStringParamVars,
numStringAliasVars,numEquations,numLinearSystems,numNonLinearSystems,numMixedSystems,numStateSets,numOptimizeConstraints);
numStringAliasVars,numEquations,numLinearSystems,numNonLinearSystems,numMixedSystems,numStateSets,numJacobians,numOptimizeConstraints);
modelInfo := SimCode.MODELINFO(name,description,directory,varInfo,vars,functions,labels);
simCodeOut := SimCodeUtil.replaceModelInfo(modelInfo,simCodeIn);
end createTDSupdateModelInfo;
Expand Down Expand Up @@ -2671,10 +2671,10 @@ algorithm
list<DAE.ElementSource> sources;
list<tuple<Integer, Integer, SimCode.SimEqSystem>> simJac;
Option<SimCode.JacobianMatrix> jac;
case(SimCode.SES_LINEAR(index=idx,partOfMixed=pom,vars=simVars,beqs=expLst,sources=sources,simJac=simJac),_)
case(SimCode.SES_LINEAR(index=idx,partOfMixed=pom,vars=simVars,beqs=expLst,sources=sources,simJac=simJac,residual=simEqSysLst,jacobianMatrix=jac),_)
equation
(lsIdx,nlsIdx,mIdx) = idcsIn;
simEqSys = SimCode.SES_LINEAR(idx,pom,simVars,expLst,sources,simJac,lsIdx);
simEqSys = SimCode.SES_LINEAR(idx,pom,simVars,expLst,simJac,simEqSysLst,jac,sources,lsIdx);
then (simEqSys,(lsIdx+1,nlsIdx,mIdx));
case(SimCode.SES_NONLINEAR(index=idx,eqs=simEqSysLst,crefs=crefs,jacobianMatrix=jac,linearTearing=lt),_)
equation
Expand Down Expand Up @@ -2763,13 +2763,13 @@ algorithm
(stmts,changed) = BackendVarTransform.replaceStatementLst(stmts,replIn,NONE(),{},false);
simEqSys = SimCode.SES_ALGORITHM(idx,stmts);
then (simEqSys,changed);
case(SimCode.SES_LINEAR(index=idx,partOfMixed=pom,vars=simVars,beqs=expLst,sources=sources,simJac=simJac,indexLinearSystem=idxLS),_)
case(SimCode.SES_LINEAR(index=idx,partOfMixed=pom,vars=simVars,beqs=expLst,sources=sources,simJac=simJac,residual=simEqSysLst,jacobianMatrix=jac,indexLinearSystem=idxLS),_)
equation
(simVars,bLst) = List.map1_2(simVars,replaceCrefInSimVar,replIn);
(expLst,changed) = BackendVarTransform.replaceExpList(expLst,replIn,NONE(),{},false);
changed = List.fold(bLst,boolOr,changed);
simJac = List.map1(simJac,replaceInSimJac,replIn);
simEqSys = SimCode.SES_LINEAR(idx,pom,simVars,expLst,sources,simJac,idxLS);
simEqSys = SimCode.SES_LINEAR(idx,pom,simVars,expLst,simJac,simEqSysLst,jac,sources,idxLS);
then (simEqSys,changed);
case(SimCode.SES_NONLINEAR(index=idx,eqs=simEqSysLst,crefs=crefs,indexNonLinearSystem=idxNLS,jacobianMatrix=jac,linearTearing=lt),_)
equation
Expand Down
8 changes: 3 additions & 5 deletions Compiler/BackEnd/Initialization.mo
Expand Up @@ -710,8 +710,7 @@ algorithm
BackendDAE.StrongComponents rest;
list<BackendDAE.Var> varlst;
list<Integer> vlst;
Boolean linear, b;
String str;
Boolean b;

case ({}, _) then false;

Expand Down Expand Up @@ -751,13 +750,12 @@ algorithm
_ = warnAboutIterationVariablesWithDefaultZeroStartAttribute2(rest, inVars);
then true;

case (BackendDAE.TORNSYSTEM(tearingvars=vlst, linear=linear)::rest, _) equation
case (BackendDAE.TORNSYSTEM(tearingvars=vlst, linear=false)::rest, _) equation
varlst = List.map1r(vlst, BackendVariable.getVarAt, inVars);
varlst = filterVarsWithoutStartValue(varlst);
false = List.isEmpty(varlst);

str = Util.if_(linear, "linear", "nonlinear");
Debug.fcall(Flags.INITIALIZATION, Error.addCompilerWarning, "Iteration variables with default zero start attribute in torn " +& str +& " equation system:\n" +& warnAboutVars2(varlst));
Debug.fcall(Flags.INITIALIZATION, Error.addCompilerWarning, "Iteration variables with default zero start attribute in torn nonlinear equation system:\n" +& warnAboutVars2(varlst));
_ = warnAboutIterationVariablesWithDefaultZeroStartAttribute2(rest, inVars);
then true;

Expand Down
28 changes: 18 additions & 10 deletions Compiler/BackEnd/SimCode.mo
Expand Up @@ -67,7 +67,8 @@ type JacobianMatrix = tuple<list<JacobianColumn>, // col
String, // matrix name
tuple<list<tuple<DAE.ComponentRef,list<DAE.ComponentRef>>>,tuple<list<SimVar>,list<SimVar>>>, // sparse pattern
list<list<DAE.ComponentRef>>, // colored cols
Integer>; // max color used
Integer, // max color used
Integer>; // jacobian index


public constant list<DAE.Exp> listExpLength1 = {DAE.ICONST(0)} "For CodegenC.tpl";
Expand Down Expand Up @@ -217,6 +218,7 @@ uniontype VarInfo "Number of variables of various types in a Modelica model."
Integer numNonLinearSystems;
Integer numMixedSystems;
Integer numStateSets;
Integer numJacobians;
Integer numOptimizeConstraints;
end VARINFO;
end VarInfo;
Expand Down Expand Up @@ -451,15 +453,21 @@ uniontype SimEqSystem
list<DAE.Statement> statements;
end SES_ALGORITHM;

record SES_LINEAR
Integer index;
Boolean partOfMixed;
list<SimVar> vars;
list<DAE.Exp> beqs;
list<DAE.ElementSource> sources;
list<tuple<Integer, Integer, SimEqSystem>> simJac;
Integer indexLinearSystem;
end SES_LINEAR;
record SES_LINEAR
Integer index;
Boolean partOfMixed;

list<SimVar> vars;
list<DAE.Exp> beqs;
list<tuple<Integer, Integer, SimEqSystem>> simJac;
/* solver linear tearing system */
list<SimEqSystem> residual;
Option<JacobianMatrix> jacobianMatrix;


list<DAE.ElementSource> sources;
Integer indexLinearSystem;
end SES_LINEAR;

record SES_NONLINEAR
Integer index;
Expand Down

0 comments on commit 589e0a4

Please sign in to comment.