Skip to content

Commit

Permalink
Declare auxiliary DAE variables in C++ simulation code
Browse files Browse the repository at this point in the history
They are used for common subexpressions for instance.
  • Loading branch information
rfranke committed Apr 21, 2023
1 parent bffb081 commit 67fe43c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 15 deletions.
25 changes: 15 additions & 10 deletions OMCompiler/Compiler/Template/CodegenCppOld.tpl
Expand Up @@ -405,15 +405,12 @@ case SIMCODE(modelInfo=MODELINFO(vars = vars as SIMVARS(__))) then
<%lastIdentOfPath(modelInfo.name)%>Mixed(<%lastIdentOfPath(modelInfo.name)%>Mixed &instance);
virtual ~ <%lastIdentOfPath(modelInfo.name)%>Mixed();



/// Provide Jacobian
virtual const matrix_t& getJacobian() ;
virtual const matrix_t& getJacobian(unsigned int index) ;
virtual sparsematrix_t& getSparseJacobian();
virtual sparsematrix_t& getSparseJacobian(unsigned int index);


virtual const matrix_t& getStateSetJacobian(unsigned int index);
virtual sparsematrix_t& getStateSetSparseJacobian(unsigned int index);
/// Called to handle all events occured at same time
Expand Down Expand Up @@ -6804,7 +6801,7 @@ case SIMCODE(modelInfo=MODELINFO(__), extObjInfo=EXTOBJINFO(__)) then
>>
end generateAlgloopHeaderInlcudeString;

template generateClassDeclarationCode(SimCode simCode,Context context,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace,
template generateClassDeclarationCode(SimCode simCode, Context context, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace,
String additionalPublicMembers, String additionalProtectedMembers, String memberVariableDefinitions,
Boolean useFlatArrayNotation)
"Generates class declarations."
Expand All @@ -6816,13 +6813,13 @@ let friendclasses = generatefriendAlgloops(listAppend(listAppend(allEquations, i
let algloopsolvers = generateAlgloopsolverVariables(modelInfo,simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)

let algloopsystems = generateAlgloopsSystemVariables(listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace )
let jacalgloopsystems = (jacobianMatrices |> JAC_MATRIX(columns=mat) hasindex index0 =>
(mat |> JAC_COLUMN(columnEqns=eqs) => generateAlgloopsSystemVariables(eqs,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) ;separator="\n")
let jacalgloopsystems = (jacobianMatrices |> JAC_MATRIX(columns=mat) hasindex index0 =>
(mat |> JAC_COLUMN(columnEqns=eqs) => generateAlgloopsSystemVariables(eqs, simCode, &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) ;separator="\n")
;separator="")

let memberfuncs = generateEquationMemberFuncDecls(allEquations,"evaluate")
let clockedfuncs = generateClockedFuncDecls(getSubPartitions(clockedPartitions), "evaluate")
let conditionvariables = conditionvariable(zeroCrossings,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace)
let conditionvariables = conditionvariable(zeroCrossings, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)

match modelInfo
case MODELINFO(vars=SIMVARS(__)) then
Expand All @@ -6831,8 +6828,14 @@ match modelInfo
void getString_<%idx%>(string* z);
>>
;separator="\n")


let auxiliaryVarDecls = match simCode
case SIMCODE(daeModeData=SOME(DAEMODEDATA(auxiliaryVars=auxiliaryVars))) then
(auxiliaryVars |> var =>
(match var
case SIMVAR(__) then
'<%expTypeShort(type_)%> <%cref(name, false)%>;'
end match)
;separator="\n")

<<
<%if boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")) then
Expand Down Expand Up @@ -6902,6 +6905,8 @@ match modelInfo
int* _stateActivator;

<%memberVariableDefinitions%>
/*auxiliary DAE variables*/
<%auxiliaryVarDecls%>
<%conditionvariables%>
Functions* _functions;

Expand Down Expand Up @@ -6929,7 +6934,7 @@ match modelInfo
<%additionalProtectedMembers%>
/*Additional member functions*/
<%extraFuncsDecl%>
};
};
>>
/*! Equations Array. pointers to all the equation functions listed above stored in this
array. It is used to randomly access and evaluate a single equation by index.
Expand Down
10 changes: 5 additions & 5 deletions testsuite/openmodelica/cppruntime/testDAE.mos
@@ -1,5 +1,5 @@
// name: testDAE
// keywords: DAE mode
// keywords: DAE mode, auxiliary variables (cse)
// status: correct
// teardown_command: rm -f *DAETest*

Expand All @@ -11,9 +11,9 @@ model DAETest
Real x2;
Real x3;
equation
der(x1) = x3;
der(x1) = x3 + sin(time);
x2 * (1 - x2) = 0;
x1*x2 + x3*(1 - x2) = time;
x1*x2 + x3*(1 - x2) = sin(time);
annotation(experiment(StopTime = 1), __OpenModelica_commandLineOptions = \"--daeMode\");
end DAETest;
");
Expand All @@ -34,7 +34,7 @@ val(x3, 1);
// simulationOptions = "startTime = 0.0, stopTime = 1.0, numberOfIntervals = 500, tolerance = 1e-06, method = 'dassl', fileNamePrefix = 'DAETest', options = '', outputFormat = 'mat', variableFilter = '.*', cflags = '', simflags = ''",
// messages = ""
// end SimulationResult;
// -0.5000000000000006
// -0.08060461191868702
// 0.0
// 1.0
// 0.8414709848078965
// endResult

0 comments on commit 67fe43c

Please sign in to comment.