diff --git a/OMCompiler/Compiler/Template/CodegenCppOld.tpl b/OMCompiler/Compiler/Template/CodegenCppOld.tpl index b651c56c648..7c27d996d25 100644 --- a/OMCompiler/Compiler/Template/CodegenCppOld.tpl +++ b/OMCompiler/Compiler/Template/CodegenCppOld.tpl @@ -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 @@ -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." @@ -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 @@ -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 @@ -6902,6 +6905,8 @@ match modelInfo int* _stateActivator; <%memberVariableDefinitions%> + /*auxiliary DAE variables*/ + <%auxiliaryVarDecls%> <%conditionvariables%> Functions* _functions; @@ -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. diff --git a/testsuite/openmodelica/cppruntime/testDAE.mos b/testsuite/openmodelica/cppruntime/testDAE.mos index d4645d0cefd..d29a135d851 100644 --- a/testsuite/openmodelica/cppruntime/testDAE.mos +++ b/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* @@ -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; "); @@ -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