Skip to content

Commit

Permalink
Allow Dynamic Tearing for initialization
Browse files Browse the repository at this point in the history
--dynamicTearingForInitialization=true activates
Dynamic Tearing also for initialization systems.
  • Loading branch information
ptaeuber committed Aug 8, 2016
1 parent 5fed8c1 commit bcf29cc
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 10 deletions.
16 changes: 10 additions & 6 deletions Compiler/BackEnd/Tearing.mo
Expand Up @@ -1725,12 +1725,13 @@ protected
BackendDAE.AdjacencyMatrixEnhanced me;
BackendDAE.AdjacencyMatrixTEnhanced meT;
BackendDAE.BackendDAEType DAEtype;
String DAEtypeStr;
BackendDAE.TearingSet strictTearingSet;
BackendDAE.StateSets stateSets;
Option<BackendDAE.TearingSet> casualTearingSet;
list<BackendDAE.Equation> eqn_lst;
list<BackendDAE.Var> var_lst;
Boolean linear,simulation,b,noDynamicStateSelection,dynamicTearing;
Boolean linear,b,noDynamicStateSelection,dynamicTearing;
String s,modelName;
constant Boolean debug = false;
algorithm
Expand All @@ -1739,13 +1740,16 @@ algorithm
BackendDAE.EQSYSTEM(stateSets = stateSets) := isyst;
noDynamicStateSelection := listEmpty(stateSets);
BackendDAE.SHARED(backendDAEType=DAEtype, info=BackendDAE.EXTRA_INFO(fileNamePrefix=modelName)) := ishared;
simulation := stringEq(BackendDump.printBackendDAEType2String(DAEtype), "simulation");
DAEtypeStr := BackendDump.printBackendDAEType2String(DAEtype);

// check if dynamic tearing is enabled for linear/nonlinear system
dynamicTearing := match (Config.dynamicTearing(),linear,noDynamicStateSelection,simulation)
case ("true",_,true,true) then true;
case ("linear",true,true,true) then true;
case ("nonlinear",false,true,true) then true;
dynamicTearing := match (Config.dynamicTearing(),linear,noDynamicStateSelection,DAEtypeStr,Flags.getConfigBool(Flags.DYNAMIC_TEARING_FOR_INITIALIZATION))
case ("true",_,true,"simulation",_) then true;
case ("true",_,true,"initialization",true) then true;
case ("linear",true,true,"simulation",_) then true;
case ("linear",true,true,"initialization",true) then true;
case ("nonlinear",false,true,"simulation",_) then true;
case ("nonlinear",false,true,"initialization",true) then true;
else false;
end match;

Expand Down
9 changes: 6 additions & 3 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -2371,16 +2371,19 @@ end functionSetupLinearSystemsTemp;
template functionInitialNonLinearSystems(list<SimEqSystem> initialEquations, list<SimEqSystem> initialEquations_lambda0, list<SimEqSystem> parameterEquations, list<SimEqSystem> allEquations, list<JacobianMatrix> jacobianMatrixes, String modelNamePrefix)
"Generates functions in simulation file."
::=
let &tempeqns = buffer ""
let &tempeqns += (allEquations |> eq => match eq case eq as SES_NONLINEAR(alternativeTearing = SOME(__)) then 'int <%symbolName(modelNamePrefix,"eqFunction")%>_<%equationIndex(eq)%>(DATA*, threadData_t*);' ; separator = "\n")
let &tempeqns1 = buffer ""
let &tempeqns1 += (initialEquations |> eq => match eq case eq as SES_NONLINEAR(alternativeTearing = SOME(__)) then 'int <%symbolName(modelNamePrefix,"eqFunction")%>_<%equationIndex(eq)%>(DATA*, threadData_t*);' ; separator = "\n")
let &tempeqns2 = buffer ""
let &tempeqns2 += (allEquations |> eq => match eq case eq as SES_NONLINEAR(alternativeTearing = SOME(__)) then 'int <%symbolName(modelNamePrefix,"eqFunction")%>_<%equationIndex(eq)%>(DATA*, threadData_t*);' ; separator = "\n")
let initbody = functionInitialNonLinearSystemsTemp(initialEquations, modelNamePrefix)
let initbody_lambda0 = functionInitialNonLinearSystemsTemp(initialEquations_lambda0, modelNamePrefix)
let parambody = functionInitialNonLinearSystemsTemp(parameterEquations,modelNamePrefix)
let equationbody = functionInitialNonLinearSystemsTemp(allEquations,modelNamePrefix)
let jacobianbody = (jacobianMatrixes |> ({(jacobianEquations,_,_)}, _, _, _, _, _, _) => functionInitialNonLinearSystemsTemp(jacobianEquations, modelNamePrefix) ;separator="\n\n")
<<
/* function initialize non-linear systems */
<%tempeqns%>
<%tempeqns1%>
<%tempeqns2%>

void <%symbolName(modelNamePrefix,"initialNonLinearSystem")%>(int nNonLinearSystems, NONLINEAR_SYSTEM_DATA* nonLinearSystemData)
{
Expand Down
6 changes: 5 additions & 1 deletion Compiler/Util/Flags.mo
Expand Up @@ -1323,6 +1323,9 @@ constant ConfigFlag IGNORE_SIMULATION_FLAGS_ANNOTATION = CONFIG_FLAG(103, "ignor
constant ConfigFlag EVAL_CONST_ARGS_ONLY = CONFIG_FLAG(104, "evalConstArgsOnly",
NONE(), EXTERNAL(), BOOL_FLAG(true), NONE(),
Util.gettext("Only evaluate parameter function-bindings if the arguments could be evaluated to constants."));
constant ConfigFlag DYNAMIC_TEARING_FOR_INITIALIZATION = CONFIG_FLAG(105, "dynamicTearingForInitialization",
NONE(), EXTERNAL(), BOOL_FLAG(false), NONE(),
Util.gettext("Enable Dynamic Tearing also for the initialization system."));

protected
// This is a list of all configuration flags. A flag can not be used unless it's
Expand Down Expand Up @@ -1432,7 +1435,8 @@ constant list<ConfigFlag> allConfigFlags = {
ALARM,
TOTAL_TEARING,
IGNORE_SIMULATION_FLAGS_ANNOTATION,
EVAL_CONST_ARGS_ONLY
EVAL_CONST_ARGS_ONLY,
DYNAMIC_TEARING_FOR_INITIALIZATION
};

public function new
Expand Down

0 comments on commit bcf29cc

Please sign in to comment.