Skip to content

Commit

Permalink
Use normal initialization system if no lambda0 system was generated
Browse files Browse the repository at this point in the history
  - Don't generate function for initialEquations_lambda0 if it's empty
  - C runtime will use normal initialization system with lambda=0 if
    no initialEquations_lambda0 was generated.
  • Loading branch information
AnHeuermann authored and AnHeuermann committed Jan 20, 2021
1 parent 45fc378 commit 116b440
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 30 deletions.
65 changes: 37 additions & 28 deletions OMCompiler/Compiler/Template/CodegenC.tpl
Expand Up @@ -1103,18 +1103,18 @@ template simulationFile(SimCode simCode, String guid, String isModelExchangeFMU)
#include "<%simCode.fileNamePrefix%>_13opt.h"
struct OpenModelicaGeneratedFunctionCallbacks <%symbolName(modelNamePrefixStr,"callback")%> = {
<% if isModelExchangeFMU then "NULL" else '(int (*)(DATA *, threadData_t *, void *)) <%symbolName(modelNamePrefixStr,"performSimulation")%>'%>,
<% if isModelExchangeFMU then "NULL" else '(int (*)(DATA *, threadData_t *, void *)) <%symbolName(modelNamePrefixStr,"performQSSSimulation")%>'%>,
<% if isModelExchangeFMU then "NULL" else '<%symbolName(modelNamePrefixStr,"updateContinuousSystem")%>'%>,
<%symbolName(modelNamePrefixStr,"callExternalObjectDestructors")%>,
<%if intEq(varInfo.numNonLinearSystems,0) then "NULL" else symbolName(modelNamePrefixStr,"initialNonLinearSystem")%>,
<%if intEq(varInfo.numLinearSystems,0) then "NULL" else symbolName(modelNamePrefixStr,"initialLinearSystem")%>,
<%if intEq(varInfo.numMixedSystems,0) then "NULL" else symbolName(modelNamePrefixStr,"initialMixedSystem")%>,
<% if isModelExchangeFMU then "NULL" else '(int (*)(DATA *, threadData_t *, void *)) <%symbolName(modelNamePrefixStr,"performSimulation")%>'%>, /* performSimulation */
<% if isModelExchangeFMU then "NULL" else '(int (*)(DATA *, threadData_t *, void *)) <%symbolName(modelNamePrefixStr,"performQSSSimulation")%>'%>, /* performQSSSimulation */
<% if isModelExchangeFMU then "NULL" else '<%symbolName(modelNamePrefixStr,"updateContinuousSystem")%>'%>, /* updateContinuousSystem */
<%symbolName(modelNamePrefixStr,"callExternalObjectDestructors")%>, /* callExternalObjectDestructors */
<%if intEq(varInfo.numNonLinearSystems,0) then "NULL" else symbolName(modelNamePrefixStr,"initialNonLinearSystem")%>, /* initialNonLinearSystem */
<%if intEq(varInfo.numLinearSystems,0) then "NULL" else symbolName(modelNamePrefixStr,"initialLinearSystem")%>, /* initialLinearSystem */
<%if intEq(varInfo.numMixedSystems,0) then "NULL" else symbolName(modelNamePrefixStr,"initialMixedSystem")%>, /* initialMixedSystem */
#if !defined(OMC_NO_STATESELECTION)
<%symbolName(modelNamePrefixStr,"initializeStateSets")%>,
#else
NULL,
#endif
#endif /* initializeStateSets */
<%symbolName(modelNamePrefixStr,"initializeDAEmodeData")%>,
<%symbolName(modelNamePrefixStr,"functionODE")%>,
<%symbolName(modelNamePrefixStr,"functionAlgebraics")%>,
Expand All @@ -1130,7 +1130,7 @@ template simulationFile(SimCode simCode, String guid, String isModelExchangeFMU)
<%symbolName(modelNamePrefixStr,"updateBoundVariableAttributes")%>,
<%symbolName(modelNamePrefixStr,"functionInitialEquations")%>,
<%if Config.adaptiveHomotopy() then (if Config.globalHomotopy() then '2' else '3') else (if Config.globalHomotopy() then '1' else '0')%>, /* useHomotopy - 0: local homotopy (equidistant lambda), 1: global homotopy (equidistant lambda), 2: new global homotopy approach (adaptive lambda), 3: new local homotopy approach (adaptive lambda)*/
<%symbolName(modelNamePrefixStr,"functionInitialEquations_lambda0")%>,
<%if intEq(listLength(initialEquations_lambda0), 0) then "NULL" else '<%symbolName(modelNamePrefixStr,"functionInitialEquations_lambda0")%>'%>,
<%symbolName(modelNamePrefixStr,"functionRemovedInitialEquations")%>,
<%symbolName(modelNamePrefixStr,"updateBoundParameters")%>,
<%symbolName(modelNamePrefixStr,"checkForAsserts")%>,
Expand Down Expand Up @@ -3203,28 +3203,37 @@ end functionInitialEquations;
template functionInitialEquations_lambda0(list<SimEqSystem> initalEquations_lambda0, String modelNamePrefix)
"Generates function in simulation file."
::=
let () = System.tmpTickReset(0)
let nrfuncs = listLength(initalEquations_lambda0)
let &eqfuncs = buffer ""
let fncalls =
let &eqfuncs += (initalEquations_lambda0 |> eq hasindex i0 => equation_impl(-1, eq, contextSimulationDiscrete,
modelNamePrefix, true) ;separator="\n")
(initalEquations_lambda0 |> eq hasindex i0 => equation_call(eq, modelNamePrefix) ;separator="\n")
<<
<%eqfuncs%>
match initalEquations_lambda0
case {} then
<<
int <%symbolName(modelNamePrefix,"functionInitialEquations_lambda0")%>(DATA *data, threadData_t *threadData)
{
TRACE_PUSH
/* No <%symbolName(modelNamePrefix,"functionInitialEquations_lambda0")%> function */
data->simulationInfo->discreteCall = 1;
<%fncalls %>
data->simulationInfo->discreteCall = 0;
>>
else
let () = System.tmpTickReset(0)
let nrfuncs = listLength(initalEquations_lambda0)
let &eqfuncs = buffer ""
let fncalls =
let &eqfuncs += (initalEquations_lambda0 |> eq hasindex i0 => equation_impl(-1, eq, contextSimulationDiscrete,
modelNamePrefix, true) ;separator="\n")
(initalEquations_lambda0 |> eq hasindex i0 => equation_call(eq, modelNamePrefix) ;separator="\n")
<<
<%eqfuncs%>
TRACE_POP
return 0;
}
>>
int <%symbolName(modelNamePrefix,"functionInitialEquations_lambda0")%>(DATA *data, threadData_t *threadData)
{
TRACE_PUSH
data->simulationInfo->discreteCall = 1;
<%fncalls %>
data->simulationInfo->discreteCall = 0;
TRACE_POP
return 0;
}
>>
end match
end functionInitialEquations_lambda0;
template functionRemovedInitialEquationsBody(SimEqSystem eq, Text &varDecls, Text &eqs, String modelNamePrefix)
Expand Down
Expand Up @@ -322,9 +322,21 @@ static int symbolic_initialization(DATA *data, threadData_t *threadData)
}

if(0 == step)
data->callback->functionInitialEquations_lambda0(data, threadData);
{
if(data->callback->functionInitialEquations_lambda0 != NULL)
{
data->callback->functionInitialEquations_lambda0(data, threadData);
}
else
{
warningStreamPrint(LOG_INIT_HOMOTOPY, 0, "No initialEquation_lambda0 was generated. Using normal initla equation system with lambda=0 instead.");
data->callback->functionInitialEquations(data, threadData);
}
}
else
{
data->callback->functionInitialEquations(data, threadData);
}

infoStreamPrint(LOG_INIT_HOMOTOPY, 0, "homotopy parameter lambda = %g done\n---------------------------", lambda);

Expand Down Expand Up @@ -377,7 +389,15 @@ static int symbolic_initialization(DATA *data, threadData_t *threadData)
// Solve lambda0-DAE
data->simulationInfo->lambda = 0;
infoStreamPrint(LOG_INIT_HOMOTOPY, 0, "solve simplified lambda0-DAE");
data->callback->functionInitialEquations_lambda0(data, threadData);
if(data->callback->functionInitialEquations_lambda0 != NULL)
{
data->callback->functionInitialEquations_lambda0(data, threadData);
}
else
{
warningStreamPrint(LOG_INIT_HOMOTOPY, 0, "No initialEquation_lambda0 was generated. Using normal initla equation system with lambda=0 instead.");
data->callback->functionInitialEquations(data, threadData);
}
infoStreamPrint(LOG_INIT_HOMOTOPY, 0, "solving simplified lambda0-DAE done\n---------------------------");

// Run along the homotopy path and solve the actual system
Expand Down

0 comments on commit 116b440

Please sign in to comment.