From cdfcc84626b7452a1e8a150fe18ef7a0e7bca7f7 Mon Sep 17 00:00:00 2001 From: Niklas Worschech Date: Fri, 10 Apr 2015 09:03:32 +0000 Subject: [PATCH] added SimVars class to cpp runtime which stores all model variables removed [Model]PreVariables class in cpp template and moved functionality to SimVars class modified get/set methods,array class,eventhandling classes to new SimvVars class git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@25486 f25d12d1-65f4-0310-ae8a-bbce733d8d8e --- Compiler/Template/CodegenCpp.tpl | 591 +++++++++-------- Compiler/Template/CodegenCppHpcom.tpl | 4 - Compiler/Template/SimCodeTV.mo | 6 + Compiler/Util/Util.mo | 15 + .../cpp/Core/Modelica/ModelicaSystem.cpp | 4 +- .../cpp/Core/SimController/SimController.cpp | 65 +- .../cpp/Core/System/CMakeLists.txt | 7 +- .../cpp/Core/System/DiscreteEvents.cpp | 39 +- .../cpp/Core/System/EventHandling.cpp | 10 +- .../cpp/Core/System/FactoryExport.cpp | 5 +- .../cpp/Core/System/FactoryExport.h | 4 +- SimulationRuntime/cpp/Core/System/SimVars.cpp | 216 +++++++ .../System/SystemDefaultImplementation.cpp | 16 +- .../cpp/Include/Core/Math/Array.h | 611 +++++++++++++----- SimulationRuntime/cpp/Include/Core/Modelica.h | 1 + .../Include/Core/Modelica/ModelicaSystem.h | 2 +- .../Core/SimController/ISimController.h | 12 + .../Core/SimController/SimController.h | 7 +- .../cpp/Include/Core/System/DiscreteEvents.h | 4 +- .../cpp/Include/Core/System/EventHandling.h | 2 +- .../cpp/Include/Core/System/ISimVars.h | 53 ++ .../cpp/Include/Core/System/SimVars.h | 55 ++ .../Core/System/SystemDefaultImplementation.h | 12 +- .../Policies/SystemOMCFactory.h | 25 +- .../cpp/Include/Solver/Kinsol/Kinsol.h | 6 +- .../cpp/Solver/Kinsol/Kinsol.cpp | 10 +- 26 files changed, 1261 insertions(+), 521 deletions(-) create mode 100644 SimulationRuntime/cpp/Core/System/SimVars.cpp create mode 100644 SimulationRuntime/cpp/Include/Core/System/ISimVars.h create mode 100644 SimulationRuntime/cpp/Include/Core/System/SimVars.h diff --git a/Compiler/Template/CodegenCpp.tpl b/Compiler/Template/CodegenCpp.tpl index 2b37336ce5c..0a8732044b5 100644 --- a/Compiler/Template/CodegenCpp.tpl +++ b/Compiler/Template/CodegenCpp.tpl @@ -40,9 +40,7 @@ template translateModel(SimCode simCode) let()= textFile(simulationExtensionHeaderFile(simCode , &extraFuncs , &extraFuncsDecl, ""),'OMCpp<%fileNamePrefix%>Extension.h') let()= textFile(simulationExtensionCppFile(simCode , &extraFuncs , &extraFuncsDecl, "", preVarsCount),'OMCpp<%fileNamePrefix%>Extension.cpp') let()= textFile(simulationWriteOutputHeaderFile(simCode , &extraFuncs , &extraFuncsDecl, ""),'OMCpp<%fileNamePrefix%>WriteOutput.h') - let()= textFile(simulationPreVarsHeaderFile(simCode , &extraFuncs , &extraFuncsDecl, "", MemberVariablePreVariables(modelInfo,false), "", preVarsCount, false),'OMCpp<%fileNamePrefix%>PreVariables.h') let()= textFile(simulationWriteOutputCppFile(simCode , &extraFuncs , &extraFuncsDecl, "", stateDerVectorName, false),'OMCpp<%fileNamePrefix%>WriteOutput.cpp') - let()= textFile(simulationPreVarsCppFile(simCode , &extraFuncs , &extraFuncsDecl, "", stateDerVectorName, false),'OMCpp<%fileNamePrefix%>PreVariables.cpp') let()= textFile(simulationWriteOutputAlgVarsCppFile(simCode , &extraFuncs , &extraFuncsDecl, "", stateDerVectorName, false),'OMCpp<%fileNamePrefix%>WriteOutputAlgVars.cpp') let()= textFile(simulationWriteOutputParameterCppFile(simCode , &extraFuncs , &extraFuncsDecl, "", false),'OMCpp<%fileNamePrefix%>WriteOutputParameter.cpp') let()= textFile(simulationWriteOutputAliasVarsCppFile(simCode , &extraFuncs , &extraFuncsDecl, "", stateDerVectorName, false),'OMCpp<%fileNamePrefix%>WriteOutputAliasVars.cpp') @@ -102,7 +100,6 @@ let initeqs = generateEquationMemberFuncDecls(initialEquations,"initEquation") case modelInfo as MODELINFO(vars=SIMVARS(__)) then << #pragma once - #include "OMCpp<%fileNamePrefix%>PreVariables.h" #include "OMCpp<%fileNamePrefix%>.h" /***************************************************************************** @@ -114,7 +111,7 @@ let initeqs = generateEquationMemberFuncDecls(initialEquations,"initEquation") class <%lastIdentOfPath(modelInfo.name)%>Initialize : virtual public <%lastIdentOfPath(modelInfo.name)%> { public: - <%lastIdentOfPath(modelInfo.name)%>Initialize(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data); + <%lastIdentOfPath(modelInfo.name)%>Initialize(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars); virtual ~<%lastIdentOfPath(modelInfo.name)%>Initialize(); virtual bool initial(); virtual void setInitial(bool); @@ -168,7 +165,6 @@ match simCode case SIMCODE(modelInfo=MODELINFO(__)) then << #pragma once - #include "OMCpp<%fileNamePrefix%>PreVariables.h" #include "OMCpp<%fileNamePrefix%>.h" @@ -186,7 +182,7 @@ case SIMCODE(modelInfo=MODELINFO(__)) then ;separator="") %> public: - <%lastIdentOfPath(modelInfo.name)%>Jacobian(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data); + <%lastIdentOfPath(modelInfo.name)%>Jacobian(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars); virtual ~<%lastIdentOfPath(modelInfo.name)%>Jacobian(); protected: @@ -243,7 +239,6 @@ match simCode case SIMCODE(modelInfo=MODELINFO(__)) then << #pragma once - #include "OMCpp<%fileNamePrefix%>PreVariables.h" #include "OMCpp<%fileNamePrefix%>.h" /***************************************************************************** @@ -254,7 +249,7 @@ case SIMCODE(modelInfo=MODELINFO(__)) then class <%lastIdentOfPath(modelInfo.name)%>StateSelection: virtual public <%lastIdentOfPath(modelInfo.name)%> { public: - <%lastIdentOfPath(modelInfo.name)%>StateSelection(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data); + <%lastIdentOfPath(modelInfo.name)%>StateSelection(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars); virtual ~<%lastIdentOfPath(modelInfo.name)%>StateSelection(); int getDimStateSets() const; int getDimStates(unsigned int index) const; @@ -286,7 +281,6 @@ case SIMCODE(modelInfo=MODELINFO(__),simulationSettingsOpt = SOME(settings as SI let numparams = match settings.outputFormat case "csv" then "1" else n << #pragma once - #include "OMCpp<%fileNamePrefix%>PreVariables.h" #include "OMCpp<%fileNamePrefix%>.h" typedef HistoryImpl<<%outputtype%>,<%numProtectedAlgvars(modelInfo)%>+<%numProtectedAliasvars(modelInfo)%>+<%numStatevars(modelInfo)%>,<%numDerivativevars(modelInfo)%>,0,<%numparams%>> HistoryImplType; @@ -299,7 +293,7 @@ case SIMCODE(modelInfo=MODELINFO(__),simulationSettingsOpt = SOME(settings as SI class <%lastIdentOfPath(modelInfo.name)%>WriteOutput : virtual public <%lastIdentOfPath(modelInfo.name)%> { public: - <%lastIdentOfPath(modelInfo.name)%>WriteOutput(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data); + <%lastIdentOfPath(modelInfo.name)%>WriteOutput(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars); virtual ~<%lastIdentOfPath(modelInfo.name)%>WriteOutput(); @@ -377,8 +371,8 @@ template getPreVarsCount(SimCode simCode) match simCode case SIMCODE(modelInfo=MODELINFO(__)) then match modelInfo - case MODELINFO(vars=SIMVARS(__)) then - let allVarCount = intAdd(intAdd(listLength(vars.algVars), listLength(vars.discreteAlgVars)), intAdd(listLength(vars.intAlgVars), intAdd(listLength(vars.boolAlgVars), listLength(vars.stateVars)))) + case MODELINFO(varInfo=VARINFO(__)) then + let allVarCount = intAdd(intAdd(intAdd(varInfo.numAlgAliasVars,varInfo.numAlgVars),varInfo.numDiscreteReal ), intAdd(intAdd(varInfo.numIntAliasVars,varInfo.numIntAlgVars), intAdd(varInfo.numBoolAlgVars,intAdd(varInfo.numBoolAliasVars, intMul(2,varInfo.numStateVars))))) << <%allVarCount%> >> @@ -387,51 +381,7 @@ template getPreVarsCount(SimCode simCode) end getPreVarsCount; -template simulationPreVarsHeaderFile(SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, String memberVariableDefinitions, String additionalPublicMembers, String preVarsCount, Boolean useFlatArrayNotation) - "Generates code for header file for simulation target." -::= -match simCode -case SIMCODE(modelInfo=MODELINFO(__)) then - match modelInfo - case MODELINFO(vars=SIMVARS(__)) then - << - #pragma once - /***************************************************************************** - * - * Simulation code for pre- variables - * - *****************************************************************************/ - - class <%lastIdentOfPath(modelInfo.name)%>PreVariables : public virtual PreVariables - { - public: - <%additionalPublicMembers%> - <%lastIdentOfPath(modelInfo.name)%>PreVariables() ; - virtual ~<%lastIdentOfPath(modelInfo.name)%>PreVariables() ; - virtual void initPreVariables(); - virtual void savePreVariables(); - <% - let savePreVarFuncs = (List.partition(List.intRange(stringInt(preVarsCount)), 100) |> ls hasindex idx => 'virtual void savePreVariables_<%idx%>();';separator="\n") - << - <%savePreVarFuncs%> - >> - %> - <% - let initPreRealVarFuncs = (List.partition(listAppend(listAppend(vars.algVars, vars.discreteAlgVars), vars.stateVars), 100) |> ls hasindex idx => 'virtual void initPreRealVariables_<%idx%>();';separator="\n") - let initPreIntVarFuncs = (List.partition(vars.intAlgVars, 100) |> ls hasindex idx => 'virtual void initPreIntVariables_<%idx%>();';separator="\n") - let initPreBoolVarFuncs = (List.partition(vars.boolAlgVars, 100) |> ls hasindex idx => 'virtual void initPreBoolVariables_<%idx%>();';separator="\n") - << - <%initPreRealVarFuncs%> - <%initPreIntVarFuncs%> - <%initPreBoolVarFuncs%> - >> - %> - protected: - <%memberVariableDefinitions%> - }; - >> -end simulationPreVarsHeaderFile; template simulationExtensionHeaderFile(SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) "Generates code for header file for simulation target." @@ -452,7 +402,7 @@ case SIMCODE(modelInfo=MODELINFO(vars = vars as SIMVARS(__))) then VAR_ALIGN_PRE class <%lastIdentOfPath(modelInfo.name)%>Extension: public ISystemInitialization, public IMixedSystem,public IWriteOutput, public IStateSelection, public <%lastIdentOfPath(modelInfo.name)%>WriteOutput, public <%lastIdentOfPath(modelInfo.name)%>Initialize, public <%lastIdentOfPath(modelInfo.name)%>Jacobian,public <%lastIdentOfPath(modelInfo.name)%>StateSelection { public: - <%lastIdentOfPath(modelInfo.name)%>Extension(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data); + <%lastIdentOfPath(modelInfo.name)%>Extension(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars); virtual ~<%lastIdentOfPath(modelInfo.name)%>Extension(); ///Intialization methods from ISystemInitialization @@ -502,7 +452,7 @@ template simulationFactoryFile(SimCode simCode ,Text& extraFuncs,Text& extraFunc "Generates code for header file for simulation target." ::= match simCode -case SIMCODE(modelInfo=MODELINFO(__)) then +case SIMCODE(modelInfo=MODELINFO()) then << /* #include #include @@ -510,6 +460,7 @@ case SIMCODE(modelInfo=MODELINFO(__)) then #if defined(__TRICORE__) || defined(__vxworks) + extern "C" IMixedSystem* createModelicaSystem(IGlobalSettings* globalSettings, boost::shared_ptr algLoopSolverFactory, boost::shared_ptr simData) { return new <%lastIdentOfPath(modelInfo.name)%>Extension(globalSettings, algLoopSolverFactory, simData); @@ -517,30 +468,37 @@ case SIMCODE(modelInfo=MODELINFO(__)) then #elif defined (RUNTIME_STATIC_LINKING) + #include + #include #include #include "OMCpp<%dotPath(modelInfo.name)%>Extension.h" boost::shared_ptr createSimData() { - boost::shared_ptr sp( new SimData() ); - return sp; + boost::shared_ptr data( new SimData() ); + return data; + } + boost::shared_ptr createSimVars(size_t dim_real,size_t dim_int,size_t dim_bool) + { + boost::shared_ptr var( new SimVars(dim_real,dim_int,dim_bool) ); + return var; } - boost::shared_ptr createModelicaSystem(IGlobalSettings* globalSettings, boost::shared_ptr algLoopSolverFactory, boost::shared_ptr simData) { - boost::shared_ptr sp( new <%lastIdentOfPath(modelInfo.name)%>Extension(globalSettings, algLoopSolverFactory, simData) ); - return sp; + boost::shared_ptr system( new <%lastIdentOfPath(modelInfo.name)%>Extension(globalSettings, algLoopSolverFactory, simData) ); + return system; } #else - using boost::extensions::factory; - BOOST_EXTENSION_TYPE_MAP_FUNCTION - { - types.get,boost::shared_ptr > > >() - ["<%lastIdentOfPath(modelInfo.name)%>"].set<<%lastIdentOfPath(modelInfo.name)%>Extension>(); - } + using boost::extensions::factory; + BOOST_EXTENSION_TYPE_MAP_FUNCTION + { + types.get,boost::shared_ptr,boost::shared_ptr > > >() + ["<%lastIdentOfPath(modelInfo.name)%>"].set<<%lastIdentOfPath(modelInfo.name)%>Extension>(); + + } #endif >> end simulationFactoryFile; @@ -560,8 +518,8 @@ case SIMCODE(modelInfo = MODELINFO(__)) then #include <%algloopfilesInclude(listAppend(allEquations,initialEquations),simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace)%> - <%lastIdentOfPath(modelInfo.name)%>Initialize::<%lastIdentOfPath(modelInfo.name)%>Initialize(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data) - : <%lastIdentOfPath(modelInfo.name)%>(globalSettings, nonlinsolverfactory, sim_data) + <%lastIdentOfPath(modelInfo.name)%>Initialize::<%lastIdentOfPath(modelInfo.name)%>Initialize(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars) + : <%lastIdentOfPath(modelInfo.name)%>(globalSettings, nonlinsolverfactory, sim_data,sim_vars) { } @@ -705,8 +663,8 @@ case SIMCODE(modelInfo = MODELINFO(__)) then (mat |> (eqs,_,_) => algloopfilesInclude(eqs,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) ;separator="") ;separator="") %> - <%lastIdentOfPath(modelInfo.name)%>Jacobian::<%lastIdentOfPath(modelInfo.name)%>Jacobian(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data) - : <%lastIdentOfPath(modelInfo.name)%>(globalSettings, nonlinsolverfactory, sim_data) + <%lastIdentOfPath(modelInfo.name)%>Jacobian::<%lastIdentOfPath(modelInfo.name)%>Jacobian(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars) + : <%lastIdentOfPath(modelInfo.name)%>(globalSettings, nonlinsolverfactory, sim_data,sim_vars) , _AColorOfColumn(NULL) <%jacobiansVariableInit(jacobianMatrixes,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace)%> <%initialjacMats%> @@ -742,8 +700,8 @@ case SIMCODE(modelInfo = MODELINFO(__)) then /* #include #include #include "OMCpp<%fileNamePrefix%>StateSelection.h" */ - <%lastIdentOfPath(modelInfo.name)%>StateSelection::<%lastIdentOfPath(modelInfo.name)%>StateSelection(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data) - : <%lastIdentOfPath(modelInfo.name)%>(globalSettings, nonlinsolverfactory, sim_data) + <%lastIdentOfPath(modelInfo.name)%>StateSelection::<%lastIdentOfPath(modelInfo.name)%>StateSelection(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars) + : <%lastIdentOfPath(modelInfo.name)%>(globalSettings, nonlinsolverfactory, sim_data,sim_vars) { } @@ -767,8 +725,8 @@ case SIMCODE(modelInfo = MODELINFO(__)) then #include #include "OMCpp<%fileNamePrefix%>WriteOutput.h" */ - <%lastIdentOfPath(modelInfo.name)%>WriteOutput::<%lastIdentOfPath(modelInfo.name)%>WriteOutput(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data) - : <%lastIdentOfPath(modelInfo.name)%>(globalSettings, nonlinsolverfactory, sim_data) + <%lastIdentOfPath(modelInfo.name)%>WriteOutput::<%lastIdentOfPath(modelInfo.name)%>WriteOutput(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars) + : <%lastIdentOfPath(modelInfo.name)%>(globalSettings, nonlinsolverfactory, sim_data,sim_vars) { _historyImpl = new HistoryImplType(*globalSettings); } @@ -798,28 +756,6 @@ end simulationWriteOutputCppFile; <%outputIndices(modelInfo)%> _historyImpl->setOutputs(var_ouputs_idx); */ -template simulationPreVarsCppFile(SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation) - "Generates code for main cpp file for simulation target." -::= -match simCode -case SIMCODE(modelInfo = MODELINFO(__)) then - << - - <%lastIdentOfPath(modelInfo.name)%>PreVariables::<%lastIdentOfPath(modelInfo.name)%>PreVariables() - :PreVariables() - { - - } - - <%lastIdentOfPath(modelInfo.name)%>PreVariables::~<%lastIdentOfPath(modelInfo.name)%>PreVariables() - { - - } - - <%savePreVars(modelInfo,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace,stateDerVectorName,useFlatArrayNotation)%> - <%initPrevars(modelInfo,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace,stateDerVectorName,useFlatArrayNotation)%> - >> -end simulationPreVarsCppFile; template simulationWriteOutputAlgVarsCppFile(SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation) @@ -1033,13 +969,12 @@ case SIMCODE(modelInfo = MODELINFO(vars=SIMVARS(__))) then /* #include #include #include "OMCpp<%fileNamePrefix%>Extension.h" */ - <%classname%>Extension::<%classname%>Extension(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data) - : PreVariables(<%preVarsCount%>) - , <%classname%>(globalSettings, nonlinsolverfactory, sim_data) - , <%classname%>WriteOutput(globalSettings,nonlinsolverfactory, sim_data) - , <%classname%>Initialize(globalSettings, nonlinsolverfactory, sim_data) - , <%classname%>Jacobian(globalSettings, nonlinsolverfactory, sim_data) - , <%classname%>StateSelection(globalSettings, nonlinsolverfactory, sim_data) + <%classname%>Extension::<%classname%>Extension(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars) + : <%classname%>(globalSettings, nonlinsolverfactory, sim_data,sim_vars) + , <%classname%>WriteOutput(globalSettings,nonlinsolverfactory, sim_data,sim_vars) + , <%classname%>Initialize(globalSettings, nonlinsolverfactory, sim_data,sim_vars) + , <%classname%>Jacobian(globalSettings, nonlinsolverfactory, sim_data,sim_vars) + , <%classname%>StateSelection(globalSettings, nonlinsolverfactory, sim_data,sim_vars) { } @@ -1996,7 +1931,8 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula int main(int argc, const char* argv[]) #endif { - // merge provided options with defaults + + std::map opts; std::map::const_iterator it; opts["-s"] = "<%start%>"; @@ -2047,7 +1983,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula optv.push_back(it->first.c_str()); optv.push_back(it->second.c_str()); } - + <% match(getConfigString(PROFILING_LEVEL)) case("none") then '//no profiling used' @@ -2099,11 +2035,14 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula #endif //SimController to start simulation + std::pair, SimSettings> simulation = _factory->createSimulation(optv.size(), &optv[0]); + //create Modelica system boost::weak_ptr simData = simulation.first->LoadSimData("<%lastIdentOfPath(modelInfo.name)%>"); + boost::weak_ptr simVars = simulation.first->LoadSimVars("<%lastIdentOfPath(modelInfo.name)%>",<%numRealvars(modelInfo)%>,<%numIntvars(modelInfo)%>,<%numBoolvars(modelInfo)%>,<%getPreVarsCount(simCode)%>,<%numStatevars(modelInfo)%>,<%numStateVarIndex(modelInfo)%>); boost::weak_ptr system = simulation.first->LoadSystem("OMCpp<%fileNamePrefix%><%makefileParams.dllext%>","<%lastIdentOfPath(modelInfo.name)%>"); simulation.first->Start(simulation.second, "<%lastIdentOfPath(modelInfo.name)%>"); @@ -2369,7 +2308,6 @@ template calcHelperMainfile5(SimCode simCode ,Text& extraFuncs,Text& extraFuncsD #include "OMCpp<%fileNamePrefix%>Jacobian.cpp" #include "OMCpp<%fileNamePrefix%>StateSelection.h" #include "OMCpp<%fileNamePrefix%>StateSelection.cpp" - #include "OMCpp<%fileNamePrefix%>PreVariables.cpp" >> end calcHelperMainfile5; @@ -2714,7 +2652,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula << # Makefile generated by OpenModelica - + OMHOME=<%makefileParams.omhome%> # Simulations use -O3 by default SIM_OR_DYNLOAD_OPT_LEVEL= MODELICAUSERCFLAGS= @@ -2759,7 +2697,6 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula JACOBIANFILE=OMCpp<%fileNamePrefix%>Jacobian.cpp STATESELECTIONFILE=OMCpp<%fileNamePrefix%>StateSelection.cpp WRITEOUTPUTFILE=OMCpp<%fileNamePrefix%>WriteOutput.cpp - PREVARSFILE=OMCpp<%fileNamePrefix%>PreVariables.cpp SYSTEMFILE=OMCpp<%fileNamePrefix%><% if acceptMetaModelicaGrammar() then ".conv"%>.cpp MAINFILE = OMCpp<%fileNamePrefix%>Main.cpp MAINOBJ=<%fileNamePrefix%>$(EXEEXT) @@ -3168,7 +3105,6 @@ case SIMCODE(modelInfo = MODELINFO(__)) then << #include #include - #include "OMCpp<%fileNamePrefix%>PreVariables.h" #include "OMCpp<%fileNamePrefix%>.h" #include "OMCpp<%fileNamePrefix%>Functions.h" #include @@ -3177,21 +3113,20 @@ case SIMCODE(modelInfo = MODELINFO(__)) then #include #endif + /* Constructor */ - <%className%>::<%className%>(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data) - : SystemDefaultImplementation(globalSettings) - , <%className%>PreVariables() + <%className%>::<%className%>(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars) + : SystemDefaultImplementation(globalSettings,sim_data,sim_vars) , _algLoopSolverFactory(nonlinsolverfactory) - , _sim_data(sim_data) + <%MemberVariableInitialize(modelInfo,useFlatArrayNotation)%> <%simulationInitFile(simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, false)%> { <%generateSimulationCppConstructorContent(simCode, context, extraFuncs, extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%> } - <%className%>::<%className%>(<%className%> &instance) : SystemDefaultImplementation(instance.getGlobalSettings()) - , <%className%>PreVariables() + <%className%>::<%className%>(<%className%> &instance) : SystemDefaultImplementation(instance.getGlobalSettings(),instance._sim_data,instance._sim_vars) , _algLoopSolverFactory(instance.getAlgLoopSolverFactory()) - , _sim_data(instance.getSimData()) + <%MemberVariableInitialize(modelInfo,useFlatArrayNotation)%> <%simulationInitFile(simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, false)%> { <%generateSimulationCppConstructorContent(simCode, context, extraFuncs, extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%> @@ -3336,8 +3271,6 @@ match simCode //Todo: reindex all arrays removed // arrayReindex(modelInfo,useFlatArrayNotation) _functions = new Functions(_simTime,__z,__zDot,_initial,_terminate); - //initialize Algloop variables with NULL - initializeAlgloopSolverVariables(); >> end generateSimulationCppConstructorContent; @@ -5083,7 +5016,11 @@ case SIMCODE(modelInfo = MODELINFO(__)) then << void <%lastIdentOfPath(modelInfo.name)%>Initialize::initialize() { + + + initializeMemory(); + initializeFreeVariables(); initializeBoundVariables(); saveAll(); @@ -5091,11 +5028,13 @@ case SIMCODE(modelInfo = MODELINFO(__)) then void <%lastIdentOfPath(modelInfo.name)%>Initialize::initializeMemory() { - _discrete_events = _event_handling->initialize(this); + _discrete_events = _event_handling->initialize(this,_sim_vars); //create and initialize Algloopsolvers <%generateAlgloopsolvers( listAppend(allEquations,initialEquations),simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace)%> + //initialize Algloop variables + initializeAlgloopSolverVariables(); //init alg loop vars <%initAlgloopvars%> } @@ -6075,7 +6014,7 @@ let conditionvariables = conditionvariable(zeroCrossings,simCode , &extraFuncs match modelInfo case MODELINFO(vars=SIMVARS(__)) then - +/* changed: handled in SimVars class let getrealvars = (List.partition(listAppend(vars.algVars, listAppend(vars.discreteAlgVars, listAppend(vars.aliasVars, vars.paramVars))), 100) |> ls hasindex idx => << @@ -6093,6 +6032,7 @@ match modelInfo void getBoolean_<%idx%>(bool* z); >> ;separator="\n") + */ let getstringvars = (List.partition(listAppend(listAppend(vars.stringAlgVars, vars.stringParamVars), vars.stringAliasVars), 100) |> ls hasindex idx => << void getString_<%idx%>(string* z); @@ -6113,13 +6053,13 @@ match modelInfo #define MEASURETIME_MODELFUNCTIONS >>%> - VAR_ALIGN_PRE class <%lastIdentOfPath(modelInfo.name)%>: public IContinuous, public IEvent, public IStepEvent, public ITime, public ISystemProperties <%if Flags.isSet(Flags.WRITE_TO_BUFFER) then ', public IReduceDAE'%>, public SystemDefaultImplementation, public <%lastIdentOfPath(modelInfo.name)%>PreVariables + VAR_ALIGN_PRE class <%lastIdentOfPath(modelInfo.name)%>: public IContinuous, public IEvent, public IStepEvent, public ITime, public ISystemProperties <%if Flags.isSet(Flags.WRITE_TO_BUFFER) then ', public IReduceDAE'%>, public SystemDefaultImplementation { <%friendclasses%> public: <%additionalPublicMembers%> - <%lastIdentOfPath(modelInfo.name)%>(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactor, boost::shared_ptr); + <%lastIdentOfPath(modelInfo.name)%>(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactor, boost::shared_ptr sim_data, boost::shared_ptr sim_vars); <%lastIdentOfPath(modelInfo.name)%>(<%lastIdentOfPath(modelInfo.name)%> &instance); virtual ~<%lastIdentOfPath(modelInfo.name)%>(); @@ -6139,9 +6079,6 @@ match modelInfo <%initDeleteAlgloopSolverVars%> <% /*match context case FMI_CONTEXT(__) then*/ << - <%getrealvars%> - <%getintvars%> - <%getboolvars%> <%getstringvars%> >> %> @@ -6160,14 +6097,14 @@ match modelInfo boost::shared_ptr _discrete_events; <%memberVariableDefinitions%> + <%MemberVariablePreVariables(modelInfo,useFlatArrayNotation)%> <%conditionvariables%> Functions* _functions; boost::shared_ptr _algLoopSolverFactory; ///< Factory that provides an appropriate solver <%algloopsolver%> <%jacalgloopsolver%> - boost::shared_ptr _sim_data; - + <% if boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")) then << #ifdef MEASURETIME_PROFILEBLOCKS @@ -6262,7 +6199,7 @@ case SIMCODE(modelInfo = MODELINFO(__)) then <%match eq case SES_LINEAR(__) then let size = listLength(vars) << - typedef StatArrayDim2,<%size%>,true> AMATRIX; + typedef StatArrayDim2,<%size%>,true,false> AMATRIX; >> %> @@ -6704,26 +6641,42 @@ case MODELINFO(vars=SIMVARS(__)) then MemberVariableDefine2(var, "parameters", useFlatArrayNotation) ;separator="\n"%> /*parameter int vars*/ - <%vars.intParamVars |> var => - MemberVariableDefine("int", var, "intVariables.parameters", useFlatArrayNotation) + <%vars.intParamVars |> var => + MemberVariableDefine2( var, "intVariables.parameters", useFlatArrayNotation) ;separator="\n"%> /*parameter bool vars*/ <%vars.boolParamVars |> var => - MemberVariableDefine("bool",var, "boolVariables.parameters", useFlatArrayNotation) + MemberVariableDefine2(var, "boolVariables.parameters", useFlatArrayNotation) ;separator="\n"%> /*string parameter variables*/ <%vars.stringParamVars |> var => - MemberVariableDefine("string",var, "stringVariables.parameters", useFlatArrayNotation) + MemberVariableDefine2(var, "stringVariables.parameters", useFlatArrayNotation) ;separator="\n"%> /*string alias variables*/ <%vars.stringAliasVars |> var => - MemberVariableDefine("string",var, "stringVariables.AliasVars", useFlatArrayNotation) - ;separator="\n"%> - /*external variables*/ + MemberVariableDefine2(var, "stringVariables.AliasVars", useFlatArrayNotation) + ;separator="\n"%> + /*external variables*/ <%vars.extObjVars |> var => - MemberVariableDefine("void*",var, "extObjVars", useFlatArrayNotation) + MemberVariableDefine2(var, "extObjVars", useFlatArrayNotation) + ;separator="\n"%> + /*alias real vars*/ + <%vars.aliasVars |> var => + MemberVariableDefine2(var, "aliasVars", useFlatArrayNotation) + ;separator="\n"%> + /*alias int vars*/ + <%vars.intAliasVars |> var => + MemberVariableDefine2( var, "intVariables.AliasVars", useFlatArrayNotation) + ;separator="\n"%> + /*alias bool vars*/ + <%vars.boolAliasVars |> var => + MemberVariableDefine2(var, "boolVariables.AliasVars", useFlatArrayNotation) + ;separator="\n"%> + /*string algvars*/ + <%vars.stringAlgVars |> var => + MemberVariableDefine2(var, "stringVariables.AliasVars", useFlatArrayNotation) ;separator="\n"%> - >> + >> end MemberVariable; template MemberVariablePreVariables(ModelInfo modelInfo, Boolean useFlatArrayNotation) @@ -6733,33 +6686,23 @@ match modelInfo case MODELINFO(vars=SIMVARS(__)) then << //Variables saved for pre, edge and change operator + /*real algvars*/ <%vars.algVars |> var => - MemberVariableDefine2(var, "algebraics", useFlatArrayNotation) + MemberVariableDefine(var, "algebraics", useFlatArrayNotation) ;separator="\n"%> + /*discrete algvars*/ <%vars.discreteAlgVars |> var => - MemberVariableDefine2(var, "algebraics", useFlatArrayNotation) + MemberVariableDefine(var, "algebraics", useFlatArrayNotation) ;separator="\n"%> + /*bool algvars*/ <%vars.boolAlgVars |> var => - MemberVariableDefine("bool",var, "boolVariables.algebraics", useFlatArrayNotation) - ;separator="\n"%> - <%vars.stringAlgVars |> var => - MemberVariableDefine("string",var, "stringVariables.algebraics", useFlatArrayNotation) + MemberVariableDefine(var, "boolVariables.algebraics", useFlatArrayNotation) ;separator="\n"%> + /*int algvars*/ <%vars.intAlgVars |> var => - MemberVariableDefine("int", var, "intVariables.algebraics", useFlatArrayNotation) + MemberVariableDefine(var, "intVariables.algebraics", useFlatArrayNotation) ;separator="\n"%> - /*alias real vars*/ - <%vars.aliasVars |> var => - MemberVariableDefine2(var, "aliasVars", useFlatArrayNotation) - ;separator="\n"%> - /*alias int vars*/ - <%vars.intAliasVars |> var => - MemberVariableDefine("int", var, "intVariables.AliasVars", useFlatArrayNotation) - ;separator="\n"%> - /*alias bool vars*/ - <%vars.boolAliasVars |> var => - MemberVariableDefine("bool ",var, "boolVariables.AliasVars", useFlatArrayNotation) - ;separator="\n"%> + /*mixed array variables*/ <%vars.mixedArrayVars |> arrVar => MemberVariableDefine2(arrVar, "mixed", useFlatArrayNotation) @@ -6767,6 +6710,87 @@ case MODELINFO(vars=SIMVARS(__)) then >> end MemberVariablePreVariables; + +template MemberVariableInitialize(ModelInfo modelInfo, Boolean useFlatArrayNotation) + "Define membervariable in simulation file." +::= +match modelInfo +case MODELINFO(varInfo=VARINFO(numStateVars=numStateVars, numAlgVars= numAlgVars, numDiscreteReal=numDiscreteReal, numOptimizeConstraints=numOptimizeConstraints, numOptimizeFinalConstraints=numOptimizeFinalConstraints), vars=SIMVARS(__)) then + let& real_var_init_buffer = buffer "0" /*BUFD*/ + let& int_var_init_buffer = buffer "0" /*BUFD*/ + let& bool_var_init_buffer = buffer "0" /*BUFD*/ + << + /*real algvars*/ + <%vars.algVars |> var hasindex idx => + MemberVariableInitialize2(var, useFlatArrayNotation,"Real",real_var_init_buffer) + ;separator="\n"%> + /*discrete algvars*/ + <%vars.discreteAlgVars |> var hasindex idx => + MemberVariableInitialize2(var, useFlatArrayNotation,"Real",real_var_init_buffer) + + ;separator="\n"%> + /*int algvars*/ + <%vars.intAlgVars |> var hasindex idx => + MemberVariableInitialize2(var, useFlatArrayNotation,"Int",int_var_init_buffer) + + ;separator="\n"%> + /*bool algvars*/ + <%vars.boolAlgVars |> var hasindex idx => + MemberVariableInitialize2(var, useFlatArrayNotation,"Bool",bool_var_init_buffer) + + ;separator="\n"%> + >> +end MemberVariableInitialize; +template MemberVariableInitialize2(SimVar simVar, Boolean useFlatArrayNotation, String type,Text& indices) +::= + +match simVar + case SIMVAR(numArrayElement={},arrayCref=NONE(),name=CREF_IDENT(subscriptLst=_::_)) then '' + + case SIMVAR(numArrayElement={},arrayCref=NONE()) then + let index = sumStringDelimit2Int(indices,",") + let var_init = ',<%cref(name,useFlatArrayNotation)%>(_sim_vars->init<%type%>Var(<%index%>))' + let &indices += ',1' + var_init + case v as SIMVAR(name=CREF_IDENT(__),arrayCref=SOME(_),numArrayElement=num) + case v as SIMVAR(name=CREF_QUAL(__),arrayCref=SOME(_),numArrayElement=num) then + let &dims = buffer "" /*BUFD*/ + let arrayName = arraycref2(name,dims) + let typeString = variableType(type_) + let array_num_elem = arrayNumElements(name, v.numArrayElement) + match dims + case "0" then + let index = sumStringDelimit2Int(indices,",") + let var_init = ',<%arrayName%>(_sim_vars->init<%type%>Var(<%index%>))' + let &indices += ',1' + var_init + else + let index = sumStringDelimit2Int(indices,",") + let size = sumStringDelimit2Int(array_num_elem,",") + let var_init = ',<%arrayName%>(_sim_vars->init<%type%>ArrayVar((<%size%>),<%index%>))' + let &indices += ',<%size%>' + var_init + /*special case for variables that marked as array but are not arrays */ + case SIMVAR(numArrayElement=_::_) then + + let& dims = buffer "" /*BUFD*/ + let varName = arraycref2(name,dims) + let varType = variableType(type_) + match dims + case "0" then + let index = sumStringDelimit2Int(indices,",") + let var_init =',<%varName%>(_sim_vars->init<%type%>Var(<%index%>))' + let &indices += ',1' + var_init + else '' + end match + + +end MemberVariableInitialize2; + + + + template MemberVariableAlgloop(ModelInfo modelInfo, Boolean useFlatArrayNotation) "Define membervariable in simulation file." ::= @@ -6977,7 +7001,7 @@ case MODELINFO(vars=SIMVARS(__)) then >> end InitAlgloopParams; - +/* template MemberVariableDefine(String type,SimVar simVar, String arrayName, Boolean useFlatArrayNotation) ::= match simVar @@ -6988,7 +7012,7 @@ match simVar >> case v as SIMVAR(name=CREF_IDENT(__),arrayCref=SOME(_),numArrayElement=num) case v as SIMVAR(name=CREF_QUAL(__),arrayCref=SOME(_),numArrayElement=num) then - let &dims = buffer "" /*BUFD*/ + let &dims = buffer "" let arrayName = arraycref2(name,dims) let arraysize = arrayextentDims(name,v.numArrayElement) let test = v.numArrayElement |> index => '<%index%>'; separator="," @@ -7005,14 +7029,14 @@ match simVar >> case SIMVAR(numArrayElement=_::_) then let test = numArrayElement |> index => '<%index%>'; separator="," - let& dims = buffer "" /*BUFD*/ + let& dims = buffer "" let varName = arraycref2(name,dims) let varType = variableType(type_) match dims case "0" then '<%varType%> <%varName%>;' else '' end MemberVariableDefine; - +*/ template MemberVariableDefineReference(String type,SimVar simVar, String arrayName,String pre, Boolean useFlatArrayNotation) ::= match simVar @@ -7039,6 +7063,50 @@ match simVar end MemberVariableDefineReference; +template MemberVariableDefine(SimVar simVar, String arrayName, Boolean useFlatArrayNotation) +::= + +match simVar + case SIMVAR(numArrayElement={},arrayCref=NONE(),name=CREF_IDENT(subscriptLst=_::_)) then '' + + case SIMVAR(numArrayElement={},arrayCref=NONE()) then + << + <%variableType(type_)%>& <%cref(name,useFlatArrayNotation)%>; + >> + case v as SIMVAR(name=CREF_IDENT(__),arrayCref=SOME(_),numArrayElement=num) + case v as SIMVAR(name=CREF_QUAL(__),arrayCref=SOME(_),numArrayElement=num) then + let &dims = buffer "" /*BUFD*/ + let arrayName = arraycref2(name,dims) + let typeString = variableType(type_) + let array_dimensions = arrayextentDims(name, v.numArrayElement) + match dims + case "0" then + << + <%typeString%>& <%arrayName%>; + >> + case "2" then + << + StatArrayDim<%dims%><<%typeString%>, <%array_dimensions%>,false,true> <%arrayName%>; + >> + else + << + StatArrayDim<%dims%><<%typeString%>, <%array_dimensions%>,true> <%arrayName%>; + >> + /*special case for variables that marked as array but are not arrays */ + case SIMVAR(numArrayElement=_::_) then + let& dims = buffer "" /*BUFD*/ + let varName = arraycref2(name,dims) + let varType = variableType(type_) + match dims + case "0" then '<%varType%>& <%varName%>;' + else '' + end match + + +end MemberVariableDefine; + + + template MemberVariableDefine2(SimVar simVar, String arrayName, Boolean useFlatArrayNotation) ::= @@ -7353,6 +7421,21 @@ case CREF_IDENT(subscriptLst={}) then end arrayextentDims; +template arrayNumElements(ComponentRef cr, list array) +::= + match cr +case CREF_IDENT(subscriptLst={}) then + '<%ident%>_NO_SUBS'+ "/*hier1*/" + //subscriptsToCStr(subscriptLst) + case CREF_IDENT(subscriptLst=dims) then + // '_<%ident%>_INVALID_<%listLength(dims)%>_<%listLength(array)%>' + '<%List.lastN(array,listLength(dims));separator=","%>' + //subscriptsToCStr(subscriptLst) + case CREF_QUAL(componentRef=c) then + arrayNumElements(c,array) + else "CREF_NOT_IDENT_OR_QUAL" +end arrayNumElements; + template crefToCStrForArray(ComponentRef cr, Text& dims) ::= match cr @@ -7708,6 +7791,44 @@ case MODELINFO(varInfo=VARINFO(__)) then >> end numAlgvars; +template numRealvars(ModelInfo modelInfo) +::= +match modelInfo +case MODELINFO(varInfo=VARINFO(__)) then +<< +<%intAdd(intMul(2,varInfo.numStateVars),intAdd(varInfo.numAlgVars,intAdd(varInfo.numAlgAliasVars,varInfo.numDiscreteReal)))%> +>> +end numRealvars; + +//return the start index of the state var vector in the simvars memory +template numStateVarIndex(ModelInfo modelInfo) +::= +match modelInfo +case MODELINFO(varInfo=VARINFO(__)) then +<< +<%intAdd(varInfo.numAlgVars,intAdd(varInfo.numAlgAliasVars,varInfo.numDiscreteReal))%> +>> +end numStateVarIndex; + + +template numIntvars(ModelInfo modelInfo) +::= +match modelInfo +case MODELINFO(varInfo=VARINFO(__)) then +<< +<%intAdd(varInfo.numIntAlgVars,varInfo.numIntAliasVars)%> +>> +end numIntvars; + +template numBoolvars(ModelInfo modelInfo) +::= +match modelInfo +case MODELINFO(varInfo=VARINFO(__)) then +<< +<%intAdd(varInfo.numBoolAlgVars,varInfo.numBoolAliasVars)%> +>> +end numBoolvars; + template numProtectedAlgvars(ModelInfo modelInfo) ::= match modelInfo @@ -7844,14 +7965,14 @@ case MODELINFO(vars=SIMVARS(__)) then >> end numProtectedIntAlgvars; -template numBoolAlgvar(ModelInfo modelInfo) +template numBoolAlgvars(ModelInfo modelInfo) ::= match modelInfo case MODELINFO(varInfo=VARINFO(__)) then << <%varInfo.numBoolAlgVars%> >> -end numBoolAlgvar; +end numBoolAlgvars; template numProtectedBoolAlgvars(ModelInfo modelInfo) @@ -8140,117 +8261,22 @@ match simCode case SIMCODE(modelInfo = MODELINFO(vars = vars as SIMVARS(__))) then let className = lastIdentOfPath(modelInfo.name) - let n_vars = intAdd( intAdd(listLength(vars.algVars), listLength(vars.discreteAlgVars)), intAdd( listLength(vars.intAlgVars) , intAdd(listLength(vars.boolAlgVars ), listLength(vars.stateVars )))) - let &funcCalls = buffer "" /*BUFD*/ - let saveAllVarFuncs = (List.partition(listAppend(vars.algVars, listAppend(vars.discreteAlgVars, listAppend(vars.stateVars, listAppend(vars.intAlgVars,vars.boolAlgVars )))), 100) |> part hasindex i0 => - saveAllVars1(part, i0, 100, &funcCalls ,className,simCode,extraFuncs,extraFuncsDecl,extraFuncsNamespace,stateDerVectorName,useFlatArrayNotation);separator="\n") - /*<< - <%saveAllVarFuncs%> - - void <%className%>::saveAll() - { - double allVars[<%n_vars%>]; - - <%funcCalls%> - - - } - >> - */ << void <%className%>::saveAll() { - savePreVariables(); + _sim_vars->savePreVariables(); } >> end saveAll; -template savePreVars(ModelInfo modelInfo, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace,Text stateDerVectorName,Boolean useFlatArrayNotation) - -::= -match simCode -case SIMCODE(modelInfo = MODELINFO(vars = vars as SIMVARS(__))) - then - let className = lastIdentOfPath(modelInfo.name) - let n_vars = intAdd( intAdd(listLength(vars.algVars), listLength(vars.discreteAlgVars)), intAdd( listLength(vars.intAlgVars) , intAdd(listLength(vars.boolAlgVars ), listLength(vars.stateVars )))) - let &funcCalls = buffer "" /*BUFD*/ - let saveAllVarFuncs = (List.partition(listAppend(vars.algVars, listAppend(vars.discreteAlgVars, listAppend(vars.stateVars, listAppend(vars.intAlgVars,vars.boolAlgVars )))), 100) |> part hasindex i0 => - saveAllVars1(part, i0, 100, &funcCalls ,className,simCode,extraFuncs,extraFuncsDecl,extraFuncsNamespace,stateDerVectorName,useFlatArrayNotation);separator="\n") - << - <%saveAllVarFuncs%> - - void <%className%>PreVariables::savePreVariables() - { - <%funcCalls%> - } - >> - -end savePreVars; -template saveAllVars1(list partVars, Integer partIdx, Integer multiplicator, Text &funcCalls,Text className, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace,Text stateDerVectorName, Boolean useFlatArrayNotation) -::= - let &funcCalls += 'savePreVariables_<%partIdx%>();' - let &varDecls = buffer "" /*BUFD*/ - << - void <%className%>PreVariables::savePreVariables_<%partIdx%>() - { - <%(partVars |> SIMVAR(__) hasindex i0 fromindex (intMul(partIdx, multiplicator)) => - '_pre_vars[<%i0%>] = <%cref1(name,simCode ,&extraFuncs ,&extraFuncsDecl, extraFuncsNamespace, contextOther, varDecls, stateDerVectorName, useFlatArrayNotation)%>;' - ;separator="\n") - %> - } - >> -end saveAllVars1; - -template initPrevars(ModelInfo modelInfo, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace,Text stateDerVectorName, Boolean useFlatArrayNotation) -::= -match simCode -case SIMCODE(modelInfo = MODELINFO(varInfo=VARINFO(numAlgVars= numAlgVars, numDiscreteReal=numDiscreteReal, numIntAlgVars = numIntAlgVars, numBoolAlgVars = numBoolAlgVars,numStateVars=numStateVars), vars = vars as SIMVARS(__))) - then - let &funcCalls = buffer "" /*BUFD*/ - let className = lastIdentOfPath(modelInfo.name) - let realVarsCount = intAdd(intAdd(numAlgVars,numDiscreteReal),numStateVars) - let realIntVarsCount = intAdd(intAdd(intAdd(numAlgVars,numDiscreteReal),numStateVars),numIntAlgVars) - let initRealPreVarsFuncs = (List.partition(listAppend(listAppend(vars.algVars, vars.discreteAlgVars), vars.stateVars), 100) |> part hasindex i0 => - initPreVars1(part, i0, 100,0, "_pre_real_vars_idx","Real" ,&funcCalls ,className,simCode ,extraFuncs,extraFuncsDecl,extraFuncsNamespace,stateDerVectorName, useFlatArrayNotation);separator="\n") - let initIntPreVarsFuncs = (List.partition(vars.intAlgVars, 100) |> part hasindex i0 => - initPreVars1(part,i0, 100, stringInt(realVarsCount),"_pre_int_vars_idx","Int" ,&funcCalls ,className,simCode ,extraFuncs,extraFuncsDecl,extraFuncsNamespace,stateDerVectorName, useFlatArrayNotation);separator="\n") - let initBoolPreVarsFuncs = (List.partition(vars.boolAlgVars, 100) |> part hasindex i0 => - initPreVars1(part, i0, 100,stringInt(realIntVarsCount), "_pre_bool_vars_idx","Bool" ,&funcCalls ,className,simCode ,extraFuncs,extraFuncsDecl,extraFuncsNamespace,stateDerVectorName, useFlatArrayNotation);separator="\n") - << - <%initRealPreVarsFuncs%> - <%initIntPreVarsFuncs%> - <%initBoolPreVarsFuncs%> - - void <%className%>PreVariables::initPreVariables() - { - <%funcCalls%> - } - >> -end initPrevars; - -template initPreVars1(list partVars, Integer partIdx, Integer multiplicator,Integer startIdx, Text varsLst,Text pretype,Text &funcCalls,Text className, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace,Text stateDerVectorName, Boolean useFlatArrayNotation) -::= - let &funcCalls += 'initPre<%pretype%>Variables_<%partIdx%>();<%\n%>' - let &varDecls = buffer "" - << - void <%className%>PreVariables::initPre<%pretype%>Variables_<%partIdx%>() - { - - <%(partVars |> SIMVAR(__) hasindex i0 fromindex (intAdd(startIdx,intMul(partIdx, multiplicator))) => - '<%\t%><%varsLst%>[&<%cref1(name, simCode,extraFuncs,extraFuncsDecl,extraFuncsNamespace,contextOther,varDecls,stateDerVectorName,useFlatArrayNotation)%>]=<%i0%>;' - ;separator="\n")%>; - - } - >> -end initPreVars1; /* << void <%className%>::initPreVars_<%partIdx%>(unordered_map& vars1, unordered_map& vars2) @@ -14632,7 +14658,7 @@ template giveVariables(ModelInfo modelInfo, Context context,Boolean useFlatArray let &intFuncCalls = buffer "" let &boolFuncCalls = buffer "" let &stringFuncCalls = buffer "" - + /* changed: handled in SimVars class let stateVarCount = listLength(vars.stateVars) let getrealvariable = getVariablesWithSplit(lastIdentOfPath(name)+ "::getReal","double* z","z",listAppend(vars.algVars, listAppend(vars.discreteAlgVars, listAppend(vars.paramVars, vars.aliasVars))), listLength(listAppend(vars.stateVars, vars.derivativeVars)), simCode, &extraFuncs, &extraFuncsDecl, &realFuncCalls, extraFuncsNamespace, context, stateDerVectorName, useFlatArrayNotation) let setrealvariable = setVariablesWithSplit(lastIdentOfPath(name)+ "::setReal","const double* z","z",listAppend(vars.algVars, listAppend(vars.discreteAlgVars, listAppend(vars.paramVars, vars.aliasVars))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, &setRealFuncCalls, listLength(listAppend(vars.stateVars, vars.derivativeVars)), context,stateDerVectorName, useFlatArrayNotation) @@ -14647,59 +14673,58 @@ template giveVariables(ModelInfo modelInfo, Context context,Boolean useFlatArray let getboolvariable = getVariablesWithSplit(lastIdentOfPath(name)+ "::getBoolean","bool* z","z",listAppend(listAppend( vars.boolAlgVars, vars.boolParamVars ), vars.boolAliasVars ), 0, simCode , &extraFuncs , &extraFuncsDecl, &boolFuncCalls, extraFuncsNamespace, context, stateDerVectorName, useFlatArrayNotation) let getstringvariable = getVariablesWithSplit(lastIdentOfPath(name)+ "::getString","string* z","z",listAppend(listAppend( vars.stringAlgVars, vars.stringParamVars ), vars.stringAliasVars), 0, simCode ,&extraFuncs, &extraFuncsDecl, &stringFuncCalls, extraFuncsNamespace, context, stateDerVectorName, useFlatArrayNotation) - - let &varDeclsInt = buffer "" /*BUFD*/ + */ + let &varDeclsInt = buffer "" + /* changed: handled in SimVars class let setIntVariables = (listAppend( listAppend( vars.intAlgVars, vars.intParamVars ), vars.intAliasVars ) |> var hasindex i0 fromindex 0 => setVariablesDefault(var, i0, 0,simCode,varDeclsInt, extraFuncs,extraFuncsDecl,extraFuncsNamespace,context, stateDerVectorName,useFlatArrayNotation) ;separator="\n") - let &varDeclsBool = buffer "" /*BUFD*/ + let &varDeclsBool = buffer "" let setBoolVariables = (listAppend( listAppend( vars.boolAlgVars, vars.boolParamVars ), vars.boolAliasVars ) |> var hasindex i0 fromindex 0 => setVariablesDefault(var, i0,0,simCode,varDeclsBool, extraFuncs,extraFuncsDecl,extraFuncsNamespace,context, stateDerVectorName,useFlatArrayNotation) ;separator="\n") - - let &varDeclsString = buffer "" /*BUFD*/ + */ + let &varDeclsString = buffer "" let setStringVariables = (listAppend(listAppend( vars.stringAlgVars, vars.stringParamVars ), vars.stringAliasVars) |> var hasindex i0 fromindex 0 => setVariablesDefault(var, i0, 0,simCode,varDeclsString, extraFuncs,extraFuncsDecl,extraFuncsNamespace,context, stateDerVectorName,useFlatArrayNotation) ;separator="\n") << - <%getrealvariable%> + void <%lastIdentOfPath(name)%>::getReal(double* z) { - - <%getStateVariables%> - <%getStateDerVariables%> - <%realFuncCalls%> + const double* real_vars = _sim_vars->getRealVarsVector(); + memcpy(z,real_vars,<%numRealvars(modelInfo)%>); } - <%setrealvariable%> + void <%lastIdentOfPath(name)%>::setReal(const double* z) { - <%setStateVariables%> - <%setStateDerVariables%> - <%setRealFuncCalls%> + _sim_vars->setRealVarsVector(z); } - <%getintvariable%> + void <%lastIdentOfPath(name)%>::getInteger(int* z) { - <%intFuncCalls%> + const int* int_vars = _sim_vars->getIntVarsVector(); + memcpy(z,int_vars,<%numIntvars(modelInfo)%>); } - <%getboolvariable%> + void <%lastIdentOfPath(name)%>::getBoolean(bool* z) { - <%boolFuncCalls%> + const bool* bool_vars = _sim_vars->getBoolVarsVector(); + memcpy(z,bool_vars,<%numBoolvars(modelInfo)%>); } - <%getstringvariable%> + void <%lastIdentOfPath(name)%>::getString(string* z) { @@ -14708,12 +14733,12 @@ template giveVariables(ModelInfo modelInfo, Context context,Boolean useFlatArray void <%lastIdentOfPath(name)%>::setInteger(const int* z) { - <%setIntVariables%> + _sim_vars->setIntVarsVector(z); } void <%lastIdentOfPath(name)%>::setBoolean(const bool* z) { - <%setBoolVariables%> + _sim_vars->setBoolVarsVector(z); } void <%lastIdentOfPath(name)%>::setString(const string* z) diff --git a/Compiler/Template/CodegenCppHpcom.tpl b/Compiler/Template/CodegenCppHpcom.tpl index 9991bce080d..da5d8ff6cb6 100644 --- a/Compiler/Template/CodegenCppHpcom.tpl +++ b/Compiler/Template/CodegenCppHpcom.tpl @@ -49,9 +49,7 @@ template translateModel(SimCode simCode) let() = textFile(simulationExtensionHeaderFile(simCode, &extraFuncs, &extraFuncsDecl, ""), 'OMCpp<%fileNamePrefix%>Extension.h') let() = textFile(simulationExtensionCppFile(simCode, &extraFuncs, &extraFuncsDecl, "", preVarsCount), 'OMCpp<%fileNamePrefix%>Extension.cpp') let() = textFile(simulationWriteOutputHeaderFile(simCode, &extraFuncs, &extraFuncsDecl, ""), 'OMCpp<%fileNamePrefix%>WriteOutput.h') - let() = textFile(simulationPreVarsHeaderFile(simCode, &extraFuncs, &extraFuncsDecl, "", MemberVariablePreVariables(modelInfo, hpcOmMemory, stringBool(useMemoryOptimization), false), generateAdditionalPublicMemberDeclaration(simCode, &extraFuncs, &extraFuncsDecl, ""), preVarsCount, false), 'OMCpp<%fileNamePrefix%>PreVariables.h') let() = textFile(simulationWriteOutputCppFile(simCode, &extraFuncs, &extraFuncsDecl, "", stateDerVectorName, stringBool(useMemoryOptimization)), 'OMCpp<%fileNamePrefix%>WriteOutput.cpp') - let() = textFile(simulationPreVarsCppFile(simCode, &extraFuncs, &extraFuncsDecl, "", stateDerVectorName, stringBool(useMemoryOptimization)), 'OMCpp<%fileNamePrefix%>PreVariables.cpp') let() = textFile(simulationWriteOutputAlgVarsCppFile(simCode, &extraFuncs, &extraFuncsDecl, "", stateDerVectorName, stringBool(useMemoryOptimization)), 'OMCpp<%fileNamePrefix%>WriteOutputAlgVars.cpp') let() = textFile(simulationWriteOutputParameterCppFile(simCode, &extraFuncs, &extraFuncsDecl, "", stringBool(useMemoryOptimization)), 'OMCpp<%fileNamePrefix%>WriteOutputParameter.cpp') let() = textFile(simulationWriteOutputAliasVarsCppFile(simCode, &extraFuncs, &extraFuncsDecl, "", stateDerVectorName, stringBool(useMemoryOptimization)), 'OMCpp<%fileNamePrefix%>WriteOutputAliasVars.cpp') @@ -407,7 +405,6 @@ template simulationCppFile(SimCode simCode, Context context, Text& extraFuncs, T << #include #include - #include "OMCpp<%fileNamePrefix%>PreVariables.h" #include "OMCpp<%fileNamePrefix%>.h" #include "OMCpp<%fileNamePrefix%>Functions.h" #include @@ -419,7 +416,6 @@ template simulationCppFile(SimCode simCode, Context context, Text& extraFuncs, T /* Constructor */ <%className%>::<%className%>(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data) : SystemDefaultImplementation(globalSettings) - , <%className%>PreVariables() , _algLoopSolverFactory(nonlinsolverfactory) , _sim_data(sim_data) <%hpcomMemberVariableDefinition%> diff --git a/Compiler/Template/SimCodeTV.mo b/Compiler/Template/SimCodeTV.mo index a037e23daea..f41c645d9b5 100644 --- a/Compiler/Template/SimCodeTV.mo +++ b/Compiler/Template/SimCodeTV.mo @@ -2597,6 +2597,12 @@ package Util input list lst; output Integer i; end intProduct; + + function sumStringDelimit2Int + input String lst; + input String delim; + output Integer i; + end sumStringDelimit2Int; function testsuiteFriendly input String in; diff --git a/Compiler/Util/Util.mo b/Compiler/Util/Util.mo index e721c93f685..9b3e78844ce 100644 --- a/Compiler/Util/Util.mo +++ b/Compiler/Util/Util.mo @@ -483,6 +483,21 @@ algorithm str := stringDelimitList(lst1, delim); end stringDelimitListNonEmptyElts; +public function sumStringDelimit2Int +" splits the input string at the delimiter string in list of strings and converts to integer list which is then summarized + " + input String inString; + input String delim; + output Integer i; +protected + list lst; + list lst2; + algorithm + lst:=stringSplitAtChar(inString,delim); + lst2:=List.map(lst, stringInt); + i:=List.fold(lst2,intAdd,0); +end sumStringDelimit2Int; + public function stringReplaceChar "Takes a string and two chars and replaces the first char with the second char: Example: string_replace_char(\"hej.b.c\",\".\",\"_\") => \"hej_b_c\" 2007-11-26 BZ: Now it is possible to replace chars with emptychar, and diff --git a/SimulationRuntime/cpp/Core/Modelica/ModelicaSystem.cpp b/SimulationRuntime/cpp/Core/Modelica/ModelicaSystem.cpp index 7d3cedf1352..c1458dac16f 100644 --- a/SimulationRuntime/cpp/Core/Modelica/ModelicaSystem.cpp +++ b/SimulationRuntime/cpp/Core/Modelica/ModelicaSystem.cpp @@ -7,8 +7,8 @@ #include #include -Modelica::Modelica(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr) - : SystemDefaultImplementation(globalSettings) +Modelica::Modelica(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr sim_data, boost::shared_ptr sim_vars) + : SystemDefaultImplementation(globalSettings,sim_data,sim_vars) { _dimBoolean = 0; _dimInteger = 0; diff --git a/SimulationRuntime/cpp/Core/SimController/SimController.cpp b/SimulationRuntime/cpp/Core/SimController/SimController.cpp index 4267e4bc479..6b02d2aa365 100644 --- a/SimulationRuntime/cpp/Core/SimController/SimController.cpp +++ b/SimulationRuntime/cpp/Core/SimController/SimController.cpp @@ -17,7 +17,10 @@ SimController::SimController(PATH library_path, PATH modelicasystem_path) SimController::~SimController() { - _systems.clear(); + + // _systems.clear(); + // _sim_vars.clear(); + } /* #if defined(__TRICORE__) || defined(__vxworks) @@ -55,11 +58,12 @@ boost::weak_ptr SimController::LoadSystem(string modelLib,string m } //destroy system _systems.erase(iter); - LoadSimData(modelKey); + } boost::shared_ptr simData = getSimData(modelKey).lock(); + boost::shared_ptr simVars = getSimVars(modelKey).lock(); //create system - boost::shared_ptr system = createSystem(modelLib, modelKey, _config->getGlobalSettings(), _algloopsolverfactory,simData); + boost::shared_ptr system = createSystem(modelLib, modelKey, _config->getGlobalSettings(), _algloopsolverfactory,simData,simVars); _systems[modelKey] = system; return system; } @@ -80,10 +84,11 @@ boost::weak_ptr SimController::LoadModelicaSystem(PATH modelica_pa } //destroy system _systems.erase(iter); - LoadSimData(modelKey); + } boost::shared_ptr simData = getSimData(modelKey).lock(); - boost::shared_ptr system = createModelicaSystem(modelica_path, modelKey, _config->getGlobalSettings(), _algloopsolverfactory,simData); + boost::shared_ptr simVars = getSimVars(modelKey).lock(); + boost::shared_ptr system = createModelicaSystem(modelica_path, modelKey, _config->getGlobalSettings(), _algloopsolverfactory,simData,simVars); _systems[modelKey] = system; return system; } @@ -105,13 +110,28 @@ boost::weak_ptr SimController::LoadSimData(string modelKey) boost::shared_ptr sim_data = createSimData(); _sim_data[modelKey] = sim_data; return sim_data; +} +boost::weak_ptr SimController::LoadSimVars(string modelKey,size_t dim_real,size_t dim_int,size_t dim_bool,size_t dim_pre_vars,size_t dim_z,size_t z_i) +{ + //if the simdata is already loaded + std::map > ::iterator iter = _sim_vars.find(modelKey); + if(iter!=_sim_vars.end()) + { + //destroy system + _sim_vars.erase(iter); + } + //create system + boost::shared_ptr sim_vars = createSimVars(dim_real,dim_int,dim_bool,dim_pre_vars,dim_z,z_i); + _sim_vars[modelKey] = sim_vars; + return sim_vars; } + boost::weak_ptr SimController::getSimData(string modelname) { @@ -128,6 +148,24 @@ boost::weak_ptr SimController::getSimData(string modelname) } } +boost::weak_ptr SimController::getSimVars(string modelname) +{ + + + std::map >::iterator iter = _sim_vars.find(modelname); + if(iter!=_sim_vars.end()) + { + return iter->second; + } + else + { + string error = string("Simulation data was not found for model: ") + modelname; + throw ModelicaSimulationError(SIMMANAGER,error); + } +} + + + boost::weak_ptr SimController::getSystem(string modelname) { @@ -166,7 +204,7 @@ void SimController::StartVxWorks(SimSettings simsettings,string modelKey) global_settings->setLogType(simsettings.logType); global_settings->setOutputPointType(simsettings.outputPointType); - _simMgr = boost::shared_ptr(new SimManager(mixedsystem, _config.get())); + boost::shared_ptr simMgr = boost::shared_ptr(new SimManager(mixedsystem, _config.get())); ISolverSettings* solver_settings = _config->getSolverSettings(); solver_settings->setLowerLimit(simsettings.lower_limit); @@ -175,7 +213,7 @@ void SimController::StartVxWorks(SimSettings simsettings,string modelKey) solver_settings->setRTol(simsettings.tolerance); solver_settings->setATol(simsettings.tolerance); - _simMgr->initialize(); + simMgr->initialize(); } catch( ModelicaSimulationError& ex) { @@ -188,7 +226,7 @@ void SimController::StartVxWorks(SimSettings simsettings,string modelKey) // Added for real-time simulation using VxWorks and Bodas void SimController::calcOneStep() { - _simMgr->runSingleStep(); + //_simMgr->runSingleStep(); } @@ -214,7 +252,7 @@ void SimController::Start(SimSettings simsettings, string modelKey) global_settings->setAlarmTime(simsettings.timeOut); global_settings->setOutputPointType(simsettings.outputPointType); - _simMgr = boost::shared_ptr(new SimManager(mixedsystem, _config.get())); + boost::shared_ptr simMgr = boost::shared_ptr(new SimManager(mixedsystem, _config.get())); ISolverSettings* solver_settings = _config->getSolverSettings(); solver_settings->setLowerLimit(simsettings.lower_limit); @@ -222,9 +260,9 @@ void SimController::Start(SimSettings simsettings, string modelKey) solver_settings->setUpperLimit(simsettings.upper_limit); solver_settings->setRTol(simsettings.tolerance); solver_settings->setATol(simsettings.tolerance); - _simMgr->initialize(); + simMgr->initialize(); - _simMgr->runSimulation(); + simMgr->runSimulation(); boost::shared_ptr writeoutput_system = boost::dynamic_pointer_cast(mixedsystem); @@ -264,6 +302,7 @@ void SimController::Start(SimSettings simsettings, string modelKey) void SimController::Stop() { - if(_simMgr) - _simMgr->stopSimulation(); + /* if(_simMgr) + _simMgr->stopSimulation(); + */ } diff --git a/SimulationRuntime/cpp/Core/System/CMakeLists.txt b/SimulationRuntime/cpp/Core/System/CMakeLists.txt index 32313e4483d..e4e463d6989 100644 --- a/SimulationRuntime/cpp/Core/System/CMakeLists.txt +++ b/SimulationRuntime/cpp/Core/System/CMakeLists.txt @@ -12,7 +12,7 @@ set(BASE_LIB "" CACHE INTERNAL "" ) # add the system default implementation library # add a static library with the system default implementation for generating c++ fmu targets -add_library(${SystemName}_FMU STATIC AlgLoopDefaultImplementation.cpp AlgLoopSolverFactory.cpp EventHandling.cpp DiscreteEvents.cpp ContinuousEvents.cpp SystemDefaultImplementation.cpp) +add_library(${SystemName}_FMU STATIC AlgLoopDefaultImplementation.cpp AlgLoopSolverFactory.cpp EventHandling.cpp DiscreteEvents.cpp ContinuousEvents.cpp SystemDefaultImplementation.cpp SimVars.cpp) set_target_properties(${SystemName}_FMU PROPERTIES COMPILE_DEFINITIONS "DRUNTIME_STATIC_LINKING") include_directories(${SUNDIALS_INCLUDE_DIR}/cvodes ${SUNDIALS_INCLUDE_DIR}/nvector ${SUNDIALS_INCLUDE_DIR}/sundials ${SUNDIALS_INCLUDE_DIR}/kinsol ${SUNDIALS_INCLUDE_DIR}) if (UNIX) @@ -21,7 +21,7 @@ endif(UNIX) install (TARGETS ${SystemName}_FMU DESTINATION lib/omc/${LIBINSTALLEXT}) IF(RUNTIME_STATIC_LINKING) - add_library(${SystemName}_static STATIC AlgLoopDefaultImplementation.cpp AlgLoopSolverFactory.cpp EventHandling.cpp DiscreteEvents.cpp ContinuousEvents.cpp SystemDefaultImplementation.cpp FactoryExport.cpp) + add_library(${SystemName}_static STATIC AlgLoopDefaultImplementation.cpp AlgLoopSolverFactory.cpp EventHandling.cpp DiscreteEvents.cpp ContinuousEvents.cpp SystemDefaultImplementation.cpp SimVars.cpp FactoryExport.cpp) set_target_properties(${SystemName}_static PROPERTIES COMPILE_DEFINITIONS "DRUNTIME_STATIC_LINKING") include_directories(${SUNDIALS_INCLUDE_DIR}/cvodes ${SUNDIALS_INCLUDE_DIR}/nvector ${SUNDIALS_INCLUDE_DIR}/sundials ${SUNDIALS_INCLUDE_DIR}/kinsol ${SUNDIALS_INCLUDE_DIR}) if (UNIX) @@ -29,7 +29,7 @@ IF(RUNTIME_STATIC_LINKING) endif(UNIX) install (TARGETS ${SystemName}_static DESTINATION lib/omc/${LIBINSTALLEXT}) ELSE(RUNTIME_STATIC_LINKING) - add_library(${SystemName} SHARED AlgLoopDefaultImplementation.cpp AlgLoopSolverFactory.cpp EventHandling.cpp DiscreteEvents.cpp ContinuousEvents.cpp SystemDefaultImplementation.cpp FactoryExport.cpp) + add_library(${SystemName} SHARED AlgLoopDefaultImplementation.cpp AlgLoopSolverFactory.cpp EventHandling.cpp DiscreteEvents.cpp ContinuousEvents.cpp SystemDefaultImplementation.cpp SimVars.cpp FactoryExport.cpp) target_link_libraries (${SystemName} ${Boost_LIBRARIES} ${LAPACK_LIBRARIES} ${OMCFactoryName} ) install (TARGETS ${SystemName} DESTINATION lib/omc/${LIBINSTALLEXT}) @@ -59,6 +59,7 @@ install (FILES ${CMAKE_SOURCE_DIR}/Include/Core/System/IStepEvent.h ${CMAKE_SOURCE_DIR}/Include/Core/System/IWriteOutput.h ${CMAKE_SOURCE_DIR}/Include/Core/System/IStateSelection.h + ${CMAKE_SOURCE_DIR}/Include/Core/System/ISimVars.h DESTINATION include/omc/cpp/Core/System) diff --git a/SimulationRuntime/cpp/Core/System/DiscreteEvents.cpp b/SimulationRuntime/cpp/Core/System/DiscreteEvents.cpp index 48ad00dba7e..eb86c29b7c3 100644 --- a/SimulationRuntime/cpp/Core/System/DiscreteEvents.cpp +++ b/SimulationRuntime/cpp/Core/System/DiscreteEvents.cpp @@ -5,8 +5,8 @@ #include -DiscreteEvents::DiscreteEvents(PreVariables* preVars) -: _preVars(preVars) +DiscreteEvents::DiscreteEvents(boost::shared_ptr sim_vars) +: _sim_vars(sim_vars) { } @@ -22,7 +22,7 @@ Inits the event variables void DiscreteEvents::initialize() { - _preVars->initPreVariables(); + _sim_vars->initPreVariables(); //_preVars->_pre_vars.resize((boost::extents[_preVars->_pre_real_vars_idx.size()+_preVars->_pre_int_vars_idx.size()+_preVars->_pre_bool_vars_idx.size()])); } @@ -39,8 +39,7 @@ Saves a variable in _preVars->_pre_vars vector void DiscreteEvents::save(double& var) { - unsigned int i = _preVars->_pre_real_vars_idx[&var]; - _preVars->_pre_vars[i]=var; + _sim_vars->setPreVar(var); } /** @@ -49,8 +48,7 @@ Saves a variable in _preVars->_pre_vars vector void DiscreteEvents::save(int& var) { - unsigned int i = _preVars->_pre_int_vars_idx[&var]; - _preVars->_pre_vars[i]=var; + _sim_vars->setPreVar(var); } /** @@ -59,8 +57,7 @@ Saves a variable in _preVars->_pre_vars vector void DiscreteEvents::save(bool& var) { - unsigned int i = _preVars->_pre_bool_vars_idx[&var]; - _preVars->_pre_vars[i]=var; + _sim_vars->setPreVar(var); } /** @@ -68,8 +65,8 @@ Implementation of the Modelica pre operator */ double DiscreteEvents::pre(double& var) { - unsigned int i = _preVars->_pre_real_vars_idx[&var]; - return _preVars->_pre_vars[i]; + double& pre_var = _sim_vars->getPreVar(var); + return pre_var; } @@ -78,8 +75,8 @@ Implementation of the Modelica pre operator */ double DiscreteEvents::pre(int& var) { - unsigned int i = _preVars->_pre_int_vars_idx[&var]; - return _preVars->_pre_vars[i]; + double& pre_var = _sim_vars->getPreVar(var); + return pre_var; } @@ -88,8 +85,8 @@ Implementation of the Modelica pre operator */ double DiscreteEvents::pre(bool& var) { - unsigned int i = _preVars->_pre_bool_vars_idx[&var]; - return _preVars->_pre_vars[i]; + double& pre_var = _sim_vars->getPreVar(var); + return pre_var; } /** @@ -149,21 +146,21 @@ bool DiscreteEvents::change(bool& var) bool DiscreteEvents::changeDiscreteVar(double& var) { - unsigned int i = _preVars->_pre_real_vars_idx[&var]; - return var != _preVars->_pre_vars[i]; + double& pre_var = _sim_vars->getPreVar(var); + return var != pre_var; } bool DiscreteEvents::changeDiscreteVar(int& var) { - unsigned int i = _preVars->_pre_int_vars_idx[&var]; - return var != _preVars->_pre_vars[i]; + double& pre_var = _sim_vars->getPreVar(var); + return var != pre_var; } bool DiscreteEvents::changeDiscreteVar(bool& var) { - unsigned int i = _preVars->_pre_bool_vars_idx[&var]; - return var != _preVars->_pre_vars[i]; + double& pre_var = _sim_vars->getPreVar(var); + return var != pre_var; } diff --git a/SimulationRuntime/cpp/Core/System/EventHandling.cpp b/SimulationRuntime/cpp/Core/System/EventHandling.cpp index 22229b4add1..1c431dec5ac 100644 --- a/SimulationRuntime/cpp/Core/System/EventHandling.cpp +++ b/SimulationRuntime/cpp/Core/System/EventHandling.cpp @@ -23,14 +23,10 @@ EventHandling::~EventHandling(void) /** Inits the event variables */ -boost::shared_ptr EventHandling::initialize(IEvent* event_system) +boost::shared_ptr EventHandling::initialize(IEvent* event_system,boost::shared_ptr sim_vars) { - //initialize prevars - //event_system->initPreVariables(preVars->_pre_real_vars_idx,preVars->_pre_int_vars_idx,preVars->_pre_bool_vars_idx); - //preVars->_pre_vars.resize((boost::extents[preVars->_pre_real_vars_idx.size()+preVars->_pre_int_vars_idx.size()+preVars->_pre_bool_vars_idx.size()])); - //initialize discrete event handling - PreVariables* preVars = dynamic_cast(event_system); - boost::shared_ptr discreteEvents = boost::shared_ptr(new DiscreteEvents(preVars)); + + boost::shared_ptr discreteEvents = boost::shared_ptr(new DiscreteEvents(sim_vars)); discreteEvents->initialize(); //initialize continuous event handling _continuousEvents->initialize(event_system); diff --git a/SimulationRuntime/cpp/Core/System/FactoryExport.cpp b/SimulationRuntime/cpp/Core/System/FactoryExport.cpp index fe95d996788..34a521343de 100644 --- a/SimulationRuntime/cpp/Core/System/FactoryExport.cpp +++ b/SimulationRuntime/cpp/Core/System/FactoryExport.cpp @@ -27,9 +27,10 @@ extern "C" void BOOST_EXTENSION_EXPORT_DECL extension_export_system(boost::exten #include #include +#include "FactoryExport.h" #include #include - +#include /*OMC factory*/ using boost::extensions::factory; @@ -37,6 +38,8 @@ BOOST_EXTENSION_TYPE_MAP_FUNCTION { types.get > >() ["AlgLoopSolverFactory"].set(); + types.get > >() + ["SimVars"].set(); } #else diff --git a/SimulationRuntime/cpp/Core/System/FactoryExport.h b/SimulationRuntime/cpp/Core/System/FactoryExport.h index 7f96f9364c5..ad2b432ed4b 100644 --- a/SimulationRuntime/cpp/Core/System/FactoryExport.h +++ b/SimulationRuntime/cpp/Core/System/FactoryExport.h @@ -5,13 +5,13 @@ #define BOOST_EXTENSION_SYSTEM_DECL #define BOOST_EXTENSION_EVENTHANDLING_DECL #define BOOST_EXTENSION_ALGLOOPDEFAULTIMPL_DECL - +#define BOOST_EXTENSION_SIMVARS_DECL #elif defined(OMC_BUILD) || defined(SIMSTER_BUILD) #define BOOST_EXTENSION_SYSTEM_DECL BOOST_EXTENSION_EXPORT_DECL #define BOOST_EXTENSION_EVENTHANDLING_DECL BOOST_EXTENSION_EXPORT_DECL #define BOOST_EXTENSION_ALGLOOPDEFAULTIMPL_DECL BOOST_EXTENSION_EXPORT_DECL - +#define BOOST_EXTENSION_SIMVARS_DECL BOOST_EXTENSION_EXPORT_DECL #else error "operating system not supported" #endif diff --git a/SimulationRuntime/cpp/Core/System/SimVars.cpp b/SimulationRuntime/cpp/Core/System/SimVars.cpp new file mode 100644 index 00000000000..bbcf7f38f47 --- /dev/null +++ b/SimulationRuntime/cpp/Core/System/SimVars.cpp @@ -0,0 +1,216 @@ +#include +#include +#include "FactoryExport.h" +#include + + + + + SimVars::SimVars(size_t dim_real,size_t dim_int,size_t dim_bool,size_t dim_pre_vars,size_t dim_state_vars,size_t state_index) + :_dim_real(dim_real) + ,_dim_int(dim_int) + ,_dim_bool(dim_bool) + ,_dim_pre_vars(dim_pre_vars) + ,_dim_z(dim_state_vars) + ,_z_i(state_index) + /*,_bool_vars(NULL) + ,_int_vars(NULL) + ,_real_vars(NULL) + ,_pre_vars(NULL)*/ + { + if(_dim_real+_dim_int+_dim_bool > _dim_pre_vars ) + throw std::runtime_error("Wrong pre variable size"); + //allocate memory for all model variables + if(dim_bool>0) + _bool_vars= boost::shared_array(new bool[dim_bool]); + if(dim_int>0) + _int_vars =boost::shared_array( new int[dim_int]); + if(dim_real>0) + _real_vars = boost::shared_array(new double[dim_real]); + if(dim_pre_vars>0) + _pre_vars = boost::shared_array(new double[dim_pre_vars]); + //initialize all model variables + if(dim_bool>0) + std::fill(_bool_vars.get(), _bool_vars.get()+dim_bool, false); + if(dim_int>0) + std::fill(_int_vars.get(), _int_vars.get()+dim_int, 0); + if(dim_real>0) + std::fill(_real_vars.get(), _real_vars.get()+dim_real, 0.0); + } + SimVars::~SimVars() + { + /*if(_bool_vars.get()) + delete [] _bool_vars.get(); + if(_int_vars.get()) + delete[] _int_vars.get(); + if(_real_vars.get()) + delete [] _real_vars.get(); + if(_pre_vars) + delete []_pre_vars;*/ + } + double& SimVars::initRealVar(size_t i) + { + if(i<_dim_real) + return _real_vars[i]; + else + throw std::runtime_error("Wrong variable index"); + } + int& SimVars::initIntVar(size_t i) + { + if(i<_dim_int) + return _int_vars[i]; + else + throw std::runtime_error("Wrong variable index"); + } + bool& SimVars::initBoolVar(unsigned int i) + { + if(i<_dim_bool) + return _bool_vars[i]; + else + throw std::runtime_error("Wrong variable index"); + } + double* SimVars::getStateVector() + { + if(_z_i+_dim_z-1<_dim_real) + return &_real_vars[_z_i]; + else + throw std::runtime_error("Wrong state vars start index"); + } + double* SimVars::getDerStateVector() + { + if(_z_i+_dim_z-1<_dim_real) + return &_real_vars[_z_i+_dim_z]; + else + throw std::runtime_error("Wrong state vars start index"); + } + const double* SimVars::getRealVarsVector() const + { + return _real_vars.get(); + } + const int* SimVars::getIntVarsVector() const + { + return _int_vars.get(); + } + const bool* SimVars::getBoolVarsVector() const + { + return _bool_vars.get(); + } + void SimVars::setRealVarsVector(const double* vars) + { + std::copy(vars , vars +_dim_real, _real_vars.get() ); + } + void SimVars::setIntVarsVector(const int* vars) + { + std::copy(vars , vars +_dim_int, _int_vars.get() ); + } + void SimVars::setBoolVarsVector(const bool* vars) + { + + std::copy(vars , vars +_dim_real, _bool_vars.get() ); + } + + double* SimVars::initRealArrayVar(size_t size,size_t start_index) + { + size_t length = start_index+(size-1); + if(length<=_dim_real) + { + double* data = &_real_vars[start_index]; + return data; + } + else + throw std::runtime_error("Wrong array size"); + } + int* SimVars::initIntArrayVar(size_t size,size_t start_index) + { + size_t length = start_index+(size-1); + if(length<=_dim_int) + { + int* data = &_int_vars[start_index]; + return data; + } + else + throw std::runtime_error("Wrong array size"); + } + + bool* SimVars::initBoolArrayVar(size_t size,size_t start_index) + { + size_t length = start_index+(size-1); + if(length<=_dim_bool) + { + bool* data = &_bool_vars[start_index]; + return data; + } + else + throw std::runtime_error("Wrong array size"); + } + + + /* + Copies all real,int,bool variables to the pre-variables list + */ + void SimVars::savePreVariables() + { + std::copy(_real_vars.get(), _real_vars.get()+_dim_real,_pre_vars.get() ); + std::copy(_int_vars.get(), _int_vars.get()+_dim_int,_pre_vars.get() +_dim_real ); + std::copy(_bool_vars.get(), _bool_vars.get()+_dim_bool,_pre_vars.get()+_dim_real + _dim_int); + + + } + /* + Maps a model variable adress to an index in the simvars memory + */ + void SimVars::initPreVariables() + { + size_t index =0; + for(size_t i=0;i<_dim_real;i++) + { + const double& var(_real_vars.get()[i]); + _pre_real_vars_idx[&var]= index; + index++; + } + for(size_t i=0;i<_dim_int; i++) + { + const int& var(_int_vars.get()[i]); + _pre_int_vars_idx[&var]= index; + index++; + } + for(size_t i=0;i<_dim_bool;i++) + { + const bool& var(_bool_vars.get()[i]); + _pre_bool_vars_idx[&var]= index; + index++; + } + + } + double& SimVars::getPreVar(double& var) + { + unsigned int i = _pre_real_vars_idx[&var]; + return _pre_vars[i]; + } + double& SimVars::getPreVar(int& var) + { + unsigned int i = _pre_int_vars_idx[&var]; + return _pre_vars[i]; + } + double& SimVars::getPreVar(bool& var) + { + unsigned int i = _pre_bool_vars_idx[&var]; + return _pre_vars[i]; + } + + void SimVars::setPreVar(double& var) + { + unsigned int i = _pre_real_vars_idx[&var]; + _pre_vars[i]=var; + } + + void SimVars::setPreVar(int& var) + { + unsigned int i = _pre_int_vars_idx[&var]; + _pre_vars[i]=var; + } + void SimVars::setPreVar(bool& var) + { + unsigned int i = _pre_bool_vars_idx[&var]; + _pre_vars[i]=var; + } \ No newline at end of file diff --git a/SimulationRuntime/cpp/Core/System/SystemDefaultImplementation.cpp b/SimulationRuntime/cpp/Core/System/SystemDefaultImplementation.cpp index 3ec59f6a198..70fa7289b02 100644 --- a/SimulationRuntime/cpp/Core/System/SystemDefaultImplementation.cpp +++ b/SimulationRuntime/cpp/Core/System/SystemDefaultImplementation.cpp @@ -2,7 +2,6 @@ #include #include "FactoryExport.h" #include -#include #include #include @@ -25,10 +24,12 @@ bool greaterTime( pair t1, double t2) return t1.second > t2; } -SystemDefaultImplementation::SystemDefaultImplementation(IGlobalSettings *globalSettings) +SystemDefaultImplementation::SystemDefaultImplementation(IGlobalSettings *globalSettings,boost::shared_ptr sim_data, boost::shared_ptr sim_vars) : _simTime (0.0) - /*, __z (NULL) - , __zDot (NULL)*/ + ,_sim_data(sim_data) + , _sim_vars(sim_vars) + , __z (sim_vars->getStateVector()) + , __zDot (sim_vars->getDerStateVector()) , _conditions (NULL) , _time_conditions (NULL) , _dimContinuousStates (0) @@ -67,8 +68,11 @@ std::runtime_error("No such start value"); */ SystemDefaultImplementation::~SystemDefaultImplementation() { + /* + changed: is handled in SimVars class if(__z) delete [] __z; if(__zDot) delete [] __zDot; + */ if(_conditions) delete [] _conditions ; if(_time_conditions) delete [] _time_conditions ; if(_time_event_counter) delete [] _time_event_counter; @@ -120,6 +124,9 @@ int SystemDefaultImplementation::getDimRHS() const void SystemDefaultImplementation::initialize() { _callType = IContinuous::CONTINUOUS; + + /* + changed: is handled in SimVars class if((_dimContinuousStates) > 0) { // Initialize "extended state vector" @@ -132,6 +139,7 @@ void SystemDefaultImplementation::initialize() memset(__z,0,(_dimContinuousStates)*sizeof(double)); memset(__zDot,0,(_dimContinuousStates)*sizeof(double)); } + */ if(_dimZeroFunc > 0) { if(_conditions) delete [] _conditions ; diff --git a/SimulationRuntime/cpp/Include/Core/Math/Array.h b/SimulationRuntime/cpp/Include/Core/Math/Array.h index c04f59a5c22..e05f304ddaf 100644 --- a/SimulationRuntime/cpp/Include/Core/Math/Array.h +++ b/SimulationRuntime/cpp/Include/Core/Math/Array.h @@ -5,6 +5,22 @@ template class DynArrayDim1; template class DynArrayDim2; template class DynArrayDim3; +/* +Operator class to assign simvar memory to a reference array +*/ +template +struct AssignArrayVar +{ + T* operator()(T& val) + { + return &val; + } +}; + + +/* +Base class for all dynamic and static arrays +*/ templateclass BaseArray { public: @@ -12,8 +28,9 @@ templateclass BaseArray :_static(is_static) {} - //interface methods for all arrays - + /* + Interface methods for all arrays + */ virtual T& operator()(const vector& idx) = 0; virtual void assign(const T* data) = 0; virtual void assign(const BaseArray& otherArray) = 0; @@ -29,6 +46,7 @@ templateclass BaseArray { throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"Wrong virtual Array getCStrData call"); } + virtual T& operator()(size_t i) { throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"Wrong virtual Array operator call"); @@ -72,46 +90,80 @@ templateclass BaseArray protected: bool _static; }; - -templateclass StatArrayDim1 : public BaseArray +/* +One dimensional static array, implements BaseArray interface methods +@ T type of the array +@size dimension of array +@isRef if true the array data points to the simvar memory +*/ +templateclass StatArrayDim1 : public BaseArray { public: - StatArrayDim1(const T* data) + /* + Constuctor for one dimensional array + if reference array it uses data from simvars memory + else it copies data in array memory + */ + StatArrayDim1(T* data) :BaseArray(true) { - //std::copy(data,data+size,_array_data.begin()); - memcpy( _array_data.begin(), data, size * sizeof( T ) ); + if(isRef) + { + std::transform(data,data +size,_ref_array_data.c_array(),AssignArrayVar()); + _ref_init =true; + } + else + { + memcpy( _array_data.begin(), data, size * sizeof( T ) ); + _ref_init = false; + } } + /* + Constuctor for one dimensional array + copies data from otherarray in array memory + */ StatArrayDim1(const StatArrayDim1& otherarray) :BaseArray(true) + ,_ref_init(false) { + checkArray("assign data to reference array is not supported"); _array_data = otherarray._array_data; } + /* + Constuctor for one dimensional array + copies data from dynamic array in array memory + */ StatArrayDim1(const DynArrayDim1& otherarray) :BaseArray(true) + ,_ref_init(false) { + checkArray("assign data to reference array is not supported"); const T* data_otherarray = otherarray.getData(); - //std::copy(data_otherarray,data_otherarray+size,_array_data.begin()); - memcpy( _array_data.begin(), data_otherarray, size * sizeof( T ) ); + memcpy( _array_data.begin(), data_otherarray, size * sizeof( T ) ); } - + + + /* + Constuctor for one dimensional array + empty array + */ StatArrayDim1() :BaseArray(true) + ,_ref_init(false) { } ~StatArrayDim1() {} - //void assign(StatArrayDim1 otherArray) - //{ - // _array_data = otherArray._array_data; - //} - - - StatArrayDim1& operator=(BaseArray& rhs) + /* + Assignment operator to assign arry of type base array to static array + \@rhs any array of type BaseArray + */ + StatArrayDim1& operator=(BaseArray& rhs) { + checkArray("assign data to reference array is not supported"); if (this != &rhs) { @@ -127,7 +179,6 @@ templateclass StatArrayDim1 : public BaseArray DynArrayDim1& a = dynamic_cast& >(rhs); const T* data = rhs.getData(); memcpy( _array_data.begin(), data, size * sizeof( T ) ); - } } catch(std::bad_exception & be) @@ -139,56 +190,95 @@ templateclass StatArrayDim1 : public BaseArray } return *this; } + /* + Assignment operator to assign static array + \@rhs array of type StatArrayDim1 + */ StatArrayDim1& operator=(const StatArrayDim1& rhs) { + checkArray("assign data to reference array is not supported"); if (this != &rhs) { _array_data= rhs._array_data; } return *this; } - + /* + Resize array method + \@dims vector with new dimension sizes + static array could not be resized + */ virtual void resize(const std::vector& dims) { + checkArray("resize reference array is not supported"); if (dims != getDims()) std::runtime_error("Cannot resize static array!"); } - - virtual void assign(const T* data) + /* + Assigns data to array + \@data new array data + */ + virtual void assign(const T* data) { - //std::copy(data,data+size,_array_data.begin()); + checkArray("assign data to reference array is not supported"); memcpy( _array_data.begin(), data, size * sizeof( T ) ); } - + /* + Assigns array data to array + \@otherArray any array of type BaseArray + */ virtual void assign(const BaseArray& otherArray) { - //std::vector v; - //v = otherArray.getDims(); + checkArray("assign data to reference array is not supported"); const T* data_otherarray = otherArray.getData(); - //std::copy(data_otherarray,data_otherarray+size,_array_data.begin()); - memcpy( _array_data.begin(), data_otherarray, size * sizeof( T ) ); - /*for(size_t i = 1; i <= min(v[0],size); i++) - { - _array_data[i-1] = otherArray(i); - }*/ + + memcpy( _array_data.begin(), data_otherarray, size * sizeof( T ) ); + } + + /* + Index operator to access array element + \@idx vector of indeces + */ virtual T& operator()(const vector& idx) { - return _array_data[idx[0]-1]; + if(isRef) + return *(_ref_array_data[idx[0]-1]); + else + return _array_data[idx[0]-1]; }; - + /* + Index operator to access array element + \@index index + */ inline virtual T& operator()(size_t index) { + if(isRef) + { + T& var( *(_ref_array_data[index - 1])); + return var; + } + else return _array_data[index - 1]; } - inline virtual const T& operator()(size_t index) const + + /* + Index operator to read array element + \@index index + */ + inline virtual const T& operator()(unsigned int index) const { - return _array_data[index - 1]; + if(isRef) + return *(_ref_array_data[index - 1]); + else + return _array_data[index - 1]; } - + /* + Return sizes of dimensions + */ virtual std::vector getDims() const { std::vector v; @@ -196,28 +286,43 @@ templateclass StatArrayDim1 : public BaseArray return v; } + virtual size_t getDim(size_t dim) const { return size; } - /* - access to data + + /* + Access to c-array data */ virtual T* getData() { + checkArray("access data for reference array is not supported"); return _array_data.c_array(); } /* - access to data (read-only) + Access to data (read-only) */ virtual const T* getData() const { + checkArray("assign data to reference array is not supported"); return _array_data.data(); } + + + /* + Returns number of elements + */ + virtual size_t getNumElems() const { return size; } + + /* + Returns number of dimensions + */ + virtual size_t getNumDims() const { return 1; @@ -238,12 +343,27 @@ templateclass StatArrayDim1 : public BaseArray } private: + /* + Checks if array is a reference array and throws exception + some array array operations are not possible for reference arrays + */ + void checkArray(string error_msg) const + { + if(isRef) + { + throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,error_msg); + } + } + //static array data boost::array _array_data; + //reference array data, only used if isRef = true + boost::array _ref_array_data; + bool _ref_init; }; -/*Specialization for string 1-dim arrays*/ - - +/* +Specialization for string 1-dim arrays, implements BaseArray interface methods +*/ templateclass StatArrayDim1 : public BaseArray { @@ -285,10 +405,7 @@ templateclass StatArrayDim1 : public BaseArray otherArray) - //{ - // _array_data = otherArray._array_data; - //} + virtual void resize(const std::vector& dims) { @@ -388,6 +505,7 @@ templateclass StatArrayDim1 : public BaseArrayclass StatArrayDim1 : public BaseArrayclass StatArrayDim1 : public BaseArray +/* +Two dimensional static array, implements BaseArray interface methods +@ T type of the array +@size1 size of dimension one +@size2 size of dimension two +@fortran use of column wise order (fortran style) or row wise order for array data +@isRef if true the array data points to the simvar memory +*/ +template class StatArrayDim2 : public BaseArray { public: - StatArrayDim2(const T* data) //const T (&data) const T (&data)[size1*size2] + + + /* + Constuctor for two dimensional array + if reference array it uses data from simvars memory + else it copies data in array memory + */ + StatArrayDim2(T* data) :BaseArray(true) { - //std::copy(data,data+size1*size2,_array_data.begin()); - memcpy( _array_data.begin(), data, size1*size2 * sizeof( T ) ); - + if(isRef) + { + std::transform(data,data +size1*size2,_ref_array_data.c_array(),AssignArrayVar()); + _ref_init =true; + } + else + { + memcpy( _array_data.begin(), data, size1*size2 * sizeof( T ) ); + _ref_init = false; + } } - + /* + Constuctor for two dimensional array + empty array + */ StatArrayDim2() :BaseArray(true) + ,_ref_init(false) { } - - StatArrayDim2(const StatArrayDim2& otherarray) + /* + Constuctor for two dimensional array + copies data from otherarray in array memory + */ + StatArrayDim2(const StatArrayDim2& otherarray) :BaseArray(true) + ,_ref_init(false) { + checkArray("assign data to reference array is not supported"); _array_data = otherarray._array_data; } - StatArrayDim2& operator=(const StatArrayDim2& rhs) + /* + Assignment operator to assign static array to static array + \@rhs array of type StatArrayDim2 + */ + StatArrayDim2& operator=(const StatArrayDim2& rhs) { + checkArray("assign data to reference array is not supported"); if (this != &rhs) { _array_data = rhs._array_data; } return *this; } - - StatArrayDim2& operator=(BaseArray& rhs) + /* + Assignment operator to assign array of type base array to static array + \@rhs any array of type BaseArray + */ + StatArrayDim2& operator=(BaseArray& rhs) { + checkArray("assign data to reference array is not supported"); if (this != &rhs) { - try - { - StatArrayDim2& a = dynamic_cast& >(rhs); - _array_data = a._array_data; - } - catch(std::bad_exception & be) - { - throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"Wrong array type assign"); - } + try + { + StatArrayDim2& a = dynamic_cast& >(rhs); + _array_data = a._array_data; + } + catch(std::bad_exception & be) + { + throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"Wrong array type assign"); + } + } return *this; } ~StatArrayDim2(){} - + /* + Appends one dimensional array in column i + \@rhs array of type StatArrayDim1 + \@i column number + */ void append(size_t i,const StatArrayDim1& rhs) { + checkArray("assign data to reference array is not supported"); const T* data = rhs.getData(); - // std::copy(data,data+size2,data0+(size1)); memcpy( _array_data.begin()+(i-1)*size2, data, size2 * sizeof( T ) ); } - + /* + Resize array method + \@dims vector with new dimension sizes + static array could not be resized + */ virtual void resize(const std::vector& dims) { + checkArray("resize reference array is not supported"); if (dims != getDims()) std::runtime_error("Cannot resize static array!"); } - + /* + Assigns array data to array + \@otherArray any array of type BaseArray + */ virtual void assign(const BaseArray& otherArray) { - + + checkArray("assign data to reference array is not supported"); std::vector v; v = otherArray.getDims(); const T* data_otherarray = otherArray.getData(); - //std::copy(data_otherarray,data_otherarray+size1*size2,_array_data.begin()); memcpy( _array_data.begin(), data_otherarray, size1*size2 * sizeof( T ) ); } - - virtual void assign(const T* data)//)const T (&data) [size1*size2] + /* + Assigns array data to array + \@data array data + */ + virtual void assign(const T* data) { - //std::copy(data,data+size1*size2,_array_data.begin()); + checkArray("assign data to reference array is not supported"); memcpy( _array_data.begin(), data, size1*size2 * sizeof( T ) ); } - virtual T& operator()(const vector& idx) + + /* + Index operator to access array element + \@idx vector of indices + */ + virtual T& operator()(const vector& idx) { - return _array_data[size2*(idx[0] - 1) + idx[1] - 1]; //row wise order + if(isRef) + return *(_ref_array_data[size2*(idx[0] - 1) + idx[1] - 1]); //row wise order + else + return _array_data[size2*(idx[0] - 1) + idx[1] - 1]; //row wise order }; - + /* + Index operator to access array element + \@i index 1 + \@j index 2 + */ inline virtual T& operator()(size_t i, size_t j) { - if (fortran) - return _array_data[size1*(j - 1) + i - 1]; //column wise order - else - return _array_data[size2*(i - 1) + j - 1]; //row wise order + + if(fortran) + { + if(isRef) + return *(_ref_array_data[size1*(j - 1) + i - 1]); //column wise order + else + return _array_data[size1*(j - 1) + i - 1]; //column wise order + } + else + { + if(isRef) + return *(_ref_array_data[size2*(i - 1) + j - 1]); //row wise order + else + return _array_data[size2*(i - 1) + j - 1]; //row wise order + } } + + /* + Index operator to read array element + \@index index + */ inline virtual const T& operator()(size_t i, size_t j) const { if (fortran) @@ -547,7 +749,9 @@ class StatArrayDim2 : public BaseArray return _array_data[size2*(i - 1) + j - 1]; //row wise order } - + /* + Return sizes of dimensions + */ virtual std::vector getDims() const { std::vector v; @@ -555,7 +759,9 @@ class StatArrayDim2 : public BaseArray v.push_back(size2); return v; } - + /* + Returns number of elements + */ virtual size_t getDim(size_t dim) const { switch (dim) { @@ -573,44 +779,62 @@ class StatArrayDim2 : public BaseArray return size1 * size2; } - virtual size_t getNumDims() const + /* + Return sizes of dimensions + */ + virtual size_t getNumDims() const { return 2; } /* - access to data + Access to data */ virtual T* getData() { + checkArray("access data for reference array is not supported"); return _array_data. c_array(); } /* - access to data (read-only) + Access to data (read-only) */ virtual const T* getData() const { + checkArray("access data for reference array is not supported"); return _array_data.data(); } - + virtual void setDims(const std::vector& v) { } void setDims(size_t i,size_t j) { } private: - //boost::array< boost::array, size1> _array_data; - boost::array _array_data; - - //T _array_data[size2*size1]; + /* + Checks if array is a reference array and throws exception + some array array operations are not possible for reference arrays + */ + void checkArray(string error_msg) const + { + if(isRef) + { + throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,error_msg); + } + } + + //static array data + boost::array _array_data; + //reference array data, only used if isRef = true + boost::array _ref_array_data; + bool _ref_init; }; -/*Specialization for string 2-dim arrays*/ - - +/* +Specialization for string 2-dim arrays, implements BaseArray interface methods +*/ template class StatArrayDim2 : public BaseArray { public: - StatArrayDim2(const string data[]) //const T (&data) const T (&data)[size1*size2] + StatArrayDim2(const string data[]) :BaseArray(true) { @@ -770,14 +994,14 @@ class StatArrayDim2 : public BaseArray return 2; } /* - access to data + Access to data */ virtual string* getData() { return _array_data. c_array(); } /* - access to data (read-only) + Access to data (read-only) */ virtual const string* getData() const { @@ -789,18 +1013,15 @@ class StatArrayDim2 : public BaseArray return _c_array_data.c_array(); } - + virtual void setDims(const std::vector& v) { } void setDims(size_t i,size_t j) { } private: - //boost::array< boost::array, size1> _array_data; + boost::array _array_data; boost::array _c_array_data; - //T _array_data[size2*size1]; -}; - - +}; @@ -811,60 +1032,100 @@ class StatArrayDim2 : public BaseArray -template class StatArrayDim3 : public BaseArray +/* +Three dimensional static array, implements BaseArray interface methods +@ T type of the array +@size1 size of dimension one +@size2 size of dimension two +@size3 size of dimension two +@isRef if true the array data points to the simvar memory +*/ +template class StatArrayDim3 : public BaseArray { - //friend class ArrayDim3; + public: - StatArrayDim3(const T data[]) + + /* + Constuctor for one dimensional array + if reference array it uses data from simvars memory + else it copies data in array memory + */ + StatArrayDim3(T* data) :BaseArray(true) { - //std::copy(data,data+size1*size2*size3,_array_data.begin()); - memcpy( _array_data.begin(), data, size1*size2*size3 * sizeof( T ) ); + if(isRef) + { + std::transform(data,data +size1*size2*size3,_ref_array_data.c_array(),AssignArrayVar()); + _ref_init =true; + } + else + { + memcpy( _array_data.begin(), data, size1*size2*size3 * sizeof( T ) ); + _ref_init = false; + } } + /* + Constuctor for two dimensional array + empty array + */ StatArrayDim3() :BaseArray(true) + ,_ref_init(false) { } ~StatArrayDim3() {} - /*void assign(StatArrayDim3 otherArray) - { - _array_data = otherArray._array_data; - } + /* + Assigns array data to array + \@otherArray any array of type BaseArray */ virtual void assign(const BaseArray& otherArray) { + checkArray("assign data to reference array is not supported"); std::vector v; v = otherArray.getDims(); - const T* data_otherarray = otherArray.getData(); - //std::copy(data_otherarray,data_otherarray+size1*size2*size3,_array_data.begin()); - memcpy( _array_data.begin(), data_otherarray, size1*size2*size3 * sizeof( T ) ); + const T* data_otherarray = otherArray.getData(); + memcpy( _array_data.begin(), data_otherarray, size1*size2*size3 * sizeof( T ) ); } + /* + Assigns array data to array + \@data array data + */ + virtual void assign(const T* data) + { + checkArray("assign data to reference array is not supported"); + memcpy( _array_data.begin(), data, size1*size2*size3 * sizeof( T ) ); + } + /* + Appends two dimensional array in column i + \@rhs array of type StatArrayDim2 + \@i column number + */ void append(size_t i,const StatArrayDim2& rhs) { - + checkArray("assign data to reference array is not supported"); const T* data = rhs.getData(); - // std::copy(data,data+size2,data0+(size1)); memcpy( _array_data.begin()+(i-1)*size2*size3, data, size2 *size3*sizeof( T ) ); - - } - virtual void assign(const T* data) - { - //std::copy(data,data+size1*size2*size3,_array_data.begin()); - memcpy( _array_data.begin(), data, size1*size2*size3 * sizeof( T ) ); - } - + + /* + Resize array method + \@dims vector with new dimension sizes + static array could not be resized + */ virtual void resize(const std::vector& dims) { + checkArray("resize reference array is not supported"); if (dims != getDims()) std::runtime_error("Cannot resize static array!"); } - + /* + Return sizes of dimensions + */ virtual std::vector getDims() const { std::vector v; @@ -874,6 +1135,10 @@ template cl return v; } + /* + Assignment operator to assign static array + \@rhs array of type StatArrayDim3 + */ virtual size_t getDim(size_t dim) const { switch (dim) { @@ -888,86 +1153,106 @@ template cl } } + StatArrayDim3& operator=(const StatArrayDim3& rhs) { + checkArray("assign data to reference array is not supported"); if (this != &rhs) { _array_data = rhs._array_data; } return *this; } + + /* + Index operator to access array element + \@idx vector of indices + */ virtual T& operator()(const vector& idx) { //row-major order - return _array_data[(idx[2] - 1) + size3*((idx[1]-1)+size2*(idx[0]-1))]; + if(isRef) + return *(_ref_array_data[(idx[2] - 1) + size3*((idx[1]-1)+size2*(idx[0]-1))]); + else + return _array_data[(idx[2] - 1) + size3*((idx[1]-1)+size2*(idx[0]-1))]; //column-major order //return _array_data[(idx[2] - 1)*size2*size1 + (idx[1] - 1)*size1 + (idx[0] - 1)]; }; + + /* + Index operator to access array element + \@i index 1 + \@j index 2 + \@k index 3 + */ inline virtual T& operator()(size_t i, size_t j, size_t k) { //row-major order - return _array_data[(k - 1) + size3*((j-1)+size2*(i-1))]; + if(isRef) + return *(_ref_array_data[(k - 1) + size3*((j-1)+size2*(i-1))]); + else + return _array_data[(k - 1) + size3*((j-1)+size2*(i-1))]; //column-major order //return _array_data[(k - 1)*size2*size1 + (j - 1)*size1 + (i - 1)]; } - + /* + Returns number of elements + */ virtual size_t getNumElems() const { return size1 * size2 * size3; } - virtual size_t getNumDims() const + /* + Return sizes of dimensions + */ + virtual size_t getNumDims() const { return 3; } virtual void setDims(const std::vector& v) { } void setDims(size_t i,size_t j,size_t k) { } - /* - access to data + /* + Access to data */ virtual T* getData() { + checkArray("access data for reference array is not supported"); return _array_data.c_array(); } /* - access to data (read-only) + Access to data (read-only) */ virtual const T* getData() const { + checkArray("access data for reference array is not supported"); return _array_data.data(); } + private: - boost::array _array_data; - // boost::array< boost::array< boost::array ,size2>,size1> _array_data; -}; - - - -/* - -template -class StatArrayDim4 : public BaseArray -{ - //friend class ArrayDim4; -public: - StatArrayDim4(const T* data) - { - for(int i = 0; i < size1; i++) + /* + Checks if array is a reference array and throws exception + some array array operations are not possible for reference arrays + */ + void checkArray(string error_msg) const { - for(int j = 0; j < size2; j++) + if(isRef) { - for(int k = 0; k < size3; k++) - { - for(int l = 0; l < size4; l++) - { - _array_data[i][j][k][l] = data[i * size2 * size3 * size4 + j * size3 * size4 + k * size4 + l];//TODO - } - } + throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,error_msg); } } - } + //static array data + boost::array _array_data; + //reference array data, only used if isRef = true + boost::array _ref_array_data; + bool _ref_init; + + }; +/* + template + class StatArrayDim4 : public BaseArray StatArrayDim4() { } @@ -1053,9 +1338,8 @@ class StatArrayDim4 : public BaseArray } private: boost::array< boost::array< boost::array,size3>,size2>,size1> _array_data; -}; - +}; template @@ -1342,6 +1626,7 @@ templateclass DynArrayDim1 : public BaseArray { return _multi_array.data(); } + virtual size_t getNumElems() const { return _multi_array.num_elements(); @@ -1525,6 +1810,7 @@ templateclass DynArrayDim2 : public BaseArray { return _multi_array.data(); } + private: boost::multi_array _multi_array; }; @@ -1668,6 +1954,7 @@ template class DynArrayDim3 : public BaseArray { return _multi_array.data(); } + private: boost::multi_array _multi_array; }; diff --git a/SimulationRuntime/cpp/Include/Core/Modelica.h b/SimulationRuntime/cpp/Include/Core/Modelica.h index cbf9695299b..6f000480923 100644 --- a/SimulationRuntime/cpp/Include/Core/Modelica.h +++ b/SimulationRuntime/cpp/Include/Core/Modelica.h @@ -192,6 +192,7 @@ typedef boost::function&,unordered_map< #include #include #include +#include #include #include #include diff --git a/SimulationRuntime/cpp/Include/Core/Modelica/ModelicaSystem.h b/SimulationRuntime/cpp/Include/Core/Modelica/ModelicaSystem.h index 5244c0e24a2..32eacfbb3ef 100644 --- a/SimulationRuntime/cpp/Include/Core/Modelica/ModelicaSystem.h +++ b/SimulationRuntime/cpp/Include/Core/Modelica/ModelicaSystem.h @@ -10,7 +10,7 @@ class Modelica : public IMixedSystem, public IContinuous, public IEvent, public ISystemProperties, public SystemDefaultImplementation { public: - Modelica(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr); + Modelica(IGlobalSettings* globalSettings, boost::shared_ptr nonlinsolverfactory, boost::shared_ptr, boost::shared_ptr); ~Modelica(); //Releases the Modelica System diff --git a/SimulationRuntime/cpp/Include/Core/SimController/ISimController.h b/SimulationRuntime/cpp/Include/Core/SimController/ISimController.h index 9ef2eedcbd8..e7585e78e29 100644 --- a/SimulationRuntime/cpp/Include/Core/SimController/ISimController.h +++ b/SimulationRuntime/cpp/Include/Core/SimController/ISimController.h @@ -49,6 +49,17 @@ class ISimController virtual boost::weak_ptr LoadModelicaSystem(PATH modelica_path,string modelKey) = 0; virtual boost::weak_ptr LoadSimData(string modelKey) = 0; /* + Creates SimVars object, stores all model variable in continuous block of memory + @modelKey model name + @dim_real number of all real variables (real algebraic vars,discrete algebraic vars, state vars, der state vars) + @dim_int number of all integer variables integer algebraic vars + @dim_bool number of all bool variables (boolean algebraic vars) + @dim_pre_vars number of all pre variables (real algebraic vars,discrete algebraic vars, boolean algebraic vars, integer algebraic vars, state vars, der state vars) + @dim_z number of all state variables + @z_i start index of state vector in real_vars list + */ + virtual boost::weak_ptr LoadSimVars(string modelKey,size_t dim_real,size_t dim_int,size_t dim_bool,size_t dim_pre_vars,size_t dim_z,size_t z_i) = 0; + /* Starts the simulation modelKey: Modelica model name modelica_path: path to Modelica system dll @@ -57,6 +68,7 @@ class ISimController virtual void StartVxWorks(SimSettings simsettings,string modelKey) = 0; virtual boost::weak_ptr getSimData(string modelname) = 0; + virtual boost::weak_ptr getSimVars(string modelname) = 0; virtual boost::weak_ptr getSystem(string modelname) = 0; virtual void calcOneStep() = 0; diff --git a/SimulationRuntime/cpp/Include/Core/SimController/SimController.h b/SimulationRuntime/cpp/Include/Core/SimController/SimController.h index 69f8bb9dec9..0da6f19eb56 100644 --- a/SimulationRuntime/cpp/Include/Core/SimController/SimController.h +++ b/SimulationRuntime/cpp/Include/Core/SimController/SimController.h @@ -25,12 +25,13 @@ class SimController : public ISimController, virtual boost::weak_ptr LoadSystem(string modelLib,string modelKey); virtual boost::weak_ptr LoadModelicaSystem(PATH modelica_path,string modelKey); virtual boost::weak_ptr LoadSimData(string modelKey); - + virtual boost::weak_ptr LoadSimVars(string modelKey,size_t dim_real,size_t dim_int,size_t dim_bool,size_t dim_pre_vars,size_t dim_z,size_t z_i); /// Stops the simulation virtual void Stop(); virtual void Start(SimSettings simsettings, string modelKey); virtual void StartVxWorks(SimSettings simsettings,string modelKey); virtual boost::weak_ptr getSimData(string modelname); + virtual boost::weak_ptr getSimVars(string modelname); virtual boost::weak_ptr getSystem(string modelname); virtual void calcOneStep(); @@ -40,8 +41,10 @@ class SimController : public ISimController, boost::shared_ptr _config; std::map > _systems; std::map > _sim_data; + std::map > _sim_vars; boost::shared_ptr _algloopsolverfactory; // for real-time usage (VxWorks and BODAS) - boost::shared_ptr _simMgr; + //removed, has to be released after simulation run, see SimController.Start + // boost::shared_ptr _simMgr; }; diff --git a/SimulationRuntime/cpp/Include/Core/System/DiscreteEvents.h b/SimulationRuntime/cpp/Include/Core/System/DiscreteEvents.h index 80d0c0f1f9a..b77e5c1913a 100644 --- a/SimulationRuntime/cpp/Include/Core/System/DiscreteEvents.h +++ b/SimulationRuntime/cpp/Include/Core/System/DiscreteEvents.h @@ -8,7 +8,7 @@ class BOOST_EXTENSION_EVENTHANDLING_DECL DiscreteEvents #endif { public: - DiscreteEvents(PreVariables* preVars); + DiscreteEvents(boost::shared_ptr sim_vars); virtual ~DiscreteEvents( ); //Inits the event variables void initialize(); @@ -41,5 +41,5 @@ class BOOST_EXTENSION_EVENTHANDLING_DECL DiscreteEvents getCondition_type getCondition; private: - PreVariables* _preVars; + boost::shared_ptr _sim_vars; }; diff --git a/SimulationRuntime/cpp/Include/Core/System/EventHandling.h b/SimulationRuntime/cpp/Include/Core/System/EventHandling.h index 9e06372bc03..c7a54e80eb4 100644 --- a/SimulationRuntime/cpp/Include/Core/System/EventHandling.h +++ b/SimulationRuntime/cpp/Include/Core/System/EventHandling.h @@ -20,7 +20,7 @@ class BOOST_EXTENSION_EVENTHANDLING_DECL EventHandling EventHandling(); virtual ~EventHandling(void); //Inits the event variables - boost::shared_ptr initialize(IEvent* system); + boost::shared_ptr initialize(IEvent* system,boost::shared_ptr sim_vars); //saves a variable in _pre_vars vector diff --git a/SimulationRuntime/cpp/Include/Core/System/ISimVars.h b/SimulationRuntime/cpp/Include/Core/System/ISimVars.h new file mode 100644 index 00000000000..ce619d7efd2 --- /dev/null +++ b/SimulationRuntime/cpp/Include/Core/System/ISimVars.h @@ -0,0 +1,53 @@ +#pragma once + +/* +Class for SimVars, stores all model variable in continuous block of memory +*/ +class ISimVars +{ +public: + + virtual ~ISimVars() {}; + + /*Methods for access model variables*/ + //returns state vector of size dim_z*/ + virtual double* getStateVector()= 0; + //returns der state vector of size dim_z*/ + virtual double* getDerStateVector()= 0; + //returns real vars vector of size dim_real + virtual const double* getRealVarsVector() const= 0; + //returns int vars vector of size dim_int + virtual const int* getIntVarsVector() const= 0; + //returns bool vars vector of size dim_bool + virtual const bool* getBoolVarsVector() const= 0; + //set real vars vector of size dim_real + virtual void setRealVarsVector(const double* vars) = 0; + //set int vars vector of size dim_int + virtual void setIntVarsVector(const int* vars) = 0; + //set bool vars vector of size dim_bool + virtual void setBoolVarsVector(const bool* vars) = 0; + + + /*Methods for initialize model array variables in simvars memory*/ + virtual double* initRealArrayVar(size_t size,size_t start_index)= 0; + virtual int* initIntArrayVar(size_t size,size_t start_index)= 0; + virtual bool* initBoolArrayVar(size_t size,size_t start_index)= 0; + /*Methods for initialize scalar model variables in simvars memory*/ + virtual double& initRealVar(size_t i) = 0; + virtual int& initIntVar(size_t i)= 0; + virtual bool& initBoolVar(unsigned int i)= 0; + + /*Methods for pre- variables*/ + + //copies all real vars,int vars, bool vars in pre- vars vector + virtual void savePreVariables() = 0; + //initilizes pre- vars vector + virtual void initPreVariables()= 0; + //access methods for pre-variable + virtual double& getPreVar(double& var)=0; + virtual double& getPreVar(int& var)=0; + virtual double& getPreVar(bool& var)=0; + virtual void setPreVar(double& var)=0; + virtual void setPreVar(int& var)=0; + virtual void setPreVar(bool& var)=0; +}; \ No newline at end of file diff --git a/SimulationRuntime/cpp/Include/Core/System/SimVars.h b/SimulationRuntime/cpp/Include/Core/System/SimVars.h new file mode 100644 index 00000000000..308029722fd --- /dev/null +++ b/SimulationRuntime/cpp/Include/Core/System/SimVars.h @@ -0,0 +1,55 @@ +#pragma once +class BOOST_EXTENSION_SIMVARS_DECL SimVars : public ISimVars +{ +public: + /* + Constructor for SimVars, stores all model variable in continuous block of memory + @dim_real number of all real variables (real algebraic vars,discrete algebraic vars, state vars, der state vars) + @dim_int number of all integer variables integer algebraic vars + @dim_bool number of all bool variables (boolean algebraic vars) + @dim_pre_vars number of all pre variables (real algebraic vars,discrete algebraic vars, boolean algebraic vars, integer algebraic vars, state vars, der state vars) + @dim_state_vars number of all state variables + @state_index start index of state vector in real_vars list + */ + SimVars(size_t dim_real,size_t dim_int,size_t dim_bool,size_t dim_pre_vars,size_t dim_state_vars,size_t state_index); + virtual ~SimVars(); + virtual double& initRealVar(size_t i); + virtual int& initIntVar(size_t i); + virtual bool& initBoolVar(unsigned int i); + virtual double* getStateVector(); + virtual double* getDerStateVector(); + virtual const double* getRealVarsVector() const; + virtual const int* getIntVarsVector() const; + virtual const bool* getBoolVarsVector() const; + virtual void setRealVarsVector(const double* vars); + virtual void setIntVarsVector(const int* vars); + virtual void setBoolVarsVector(const bool* vars); + + virtual double* initRealArrayVar(size_t size,size_t start_index); + virtual int* initIntArrayVar(size_t size,size_t start_index); + virtual bool* initBoolArrayVar(size_t size,size_t start_index); + virtual void savePreVariables(); + virtual void initPreVariables(); + virtual double& getPreVar(double& var); + virtual double& getPreVar(int& var); + virtual double& getPreVar(bool& var); + virtual void setPreVar(double& var); + virtual void setPreVar(int& var); + virtual void setPreVar(bool& var); +private: + size_t _dim_real; //number of all real variables (real algebraic vars,discrete algebraic vars, state vars, der state vars) + size_t _dim_int; // number of all integer variables (integer algebraic vars) + size_t _dim_bool; // number of all bool variables (boolean algebraic vars) + size_t _dim_pre_vars; //number of all pre variables (real algebraic vars,discrete algebraic vars, boolean algebraic vars, integer algebraic vars, state vars, der state vars) + size_t _dim_z; // number of all state variables + size_t _z_i; //start index of state vector in real_vars list + boost::shared_array _real_vars; //array for all model real variables of size dim_real + boost::shared_array _int_vars; //array for all model int variables of size dim_int + boost::shared_array _bool_vars; //array for all model bool variables of size dim_bool + //Stores all variables indices (maps a model variable address to an index in the simvars memory) + unordered_map _pre_real_vars_idx; + unordered_map _pre_int_vars_idx; + unordered_map _pre_bool_vars_idx; + //Stores all variables occurred before an event + boost::shared_array _pre_vars; +}; \ No newline at end of file diff --git a/SimulationRuntime/cpp/Include/Core/System/SystemDefaultImplementation.h b/SimulationRuntime/cpp/Include/Core/System/SystemDefaultImplementation.h index aeba96aca8e..53ad9fe4a85 100644 --- a/SimulationRuntime/cpp/Include/Core/System/SystemDefaultImplementation.h +++ b/SimulationRuntime/cpp/Include/Core/System/SystemDefaultImplementation.h @@ -46,13 +46,13 @@ class InitVars }; #ifdef RUNTIME_STATIC_LINKING -class SystemDefaultImplementation: public virtual PreVariables +class SystemDefaultImplementation #else -class BOOST_EXTENSION_SYSTEM_DECL SystemDefaultImplementation: public virtual PreVariables +class BOOST_EXTENSION_SYSTEM_DECL SystemDefaultImplementation #endif { public: - SystemDefaultImplementation(IGlobalSettings* globalSettings); + SystemDefaultImplementation(IGlobalSettings* globalSettings,boost::shared_ptr sim_data, boost::shared_ptr sim_vars); virtual ~SystemDefaultImplementation(); /// Provide number (dimension) of boolean variables @@ -169,13 +169,17 @@ class BOOST_EXTENSION_SYSTEM_DECL SystemDefaultImplementation: public virtual Pr InitVars _int_start_values; InitVars _bool_start_values; InitVars _string_start_values; - + double + *__z, ///< "Extended state vector", containing all states and algebraic variables of all types + *__zDot; ///< "Extended vector of derivatives", containing all right hand sides of differential and algebraic equations typedef boost::circular_buffer buffer_type; map _delay_buffer; buffer_type _time_buffer; double _delay_max; double _start_time; + boost::shared_ptr _sim_data; + boost::shared_ptr _sim_vars; IGlobalSettings* _global_settings; //this should be a reference, but this is not working if the libraries are linked statically }; diff --git a/SimulationRuntime/cpp/Include/SimCoreFactory/Policies/SystemOMCFactory.h b/SimulationRuntime/cpp/Include/SimCoreFactory/Policies/SystemOMCFactory.h index 1a60b809bf5..0266819d673 100644 --- a/SimulationRuntime/cpp/Include/SimCoreFactory/Policies/SystemOMCFactory.h +++ b/SimulationRuntime/cpp/Include/SimCoreFactory/Policies/SystemOMCFactory.h @@ -58,7 +58,22 @@ struct SystemOMCFactory : public ObjectFactory return simData; } - boost::shared_ptr createSystem(string modelLib,string modelKey,IGlobalSettings* globalSettings,boost::shared_ptr algloopsolverfactory,boost::shared_ptr simData) + + boost::shared_ptr createSimVars(size_t dim_real,size_t dim_int,size_t dim_bool,size_t dim_pre_vars,size_t dim_z,size_t z_i) + { + std::map >::iterator simvars_iter; + std::map >& simvars_factory(_system_type_map->get()); + simvars_iter = simvars_factory.find("SimVars"); + if (simvars_iter == simvars_factory.end()) + { + throw ModelicaSimulationError(MODEL_FACTORY,"No simvars found"); + } + boost::shared_ptr simVars(simvars_iter->second.create(dim_real,dim_int,dim_bool,dim_pre_vars,dim_z,z_i)); + return simVars; + + } + + boost::shared_ptr createSystem(string modelLib,string modelKey,IGlobalSettings* globalSettings,boost::shared_ptr algloopsolverfactory,boost::shared_ptr simData,boost::shared_ptr simVars) { PATH modelica_path = ObjectFactory::_modelicasystem_path; PATH modelica_name(modelLib); @@ -71,19 +86,19 @@ struct SystemOMCFactory : public ObjectFactory throw ModelicaSimulationError(MODEL_FACTORY,tmp.str()); } - std::map, boost::shared_ptr > >::iterator system_iter; - std::map, boost::shared_ptr > >& factories(_system_type_map->get()); + std::map, boost::shared_ptr, boost::shared_ptr > >::iterator system_iter; + std::map, boost::shared_ptr, boost::shared_ptr > >& factories(_system_type_map->get()); system_iter = factories.find(modelKey); if (system_iter == factories.end()) { throw ModelicaSimulationError(MODEL_FACTORY,"No system found"); } - boost::shared_ptr system(system_iter->second.create(globalSettings,algloopsolverfactory,simData)); + boost::shared_ptr system(system_iter->second.create(globalSettings,algloopsolverfactory,simData,simVars)); return system; } - boost::shared_ptr createModelicaSystem(PATH modelica_path, string modelKey, IGlobalSettings* globalSettings, boost::shared_ptr algloopsolverfactory,boost::shared_ptr simData) + boost::shared_ptr createModelicaSystem(PATH modelica_path, string modelKey, IGlobalSettings* globalSettings, boost::shared_ptr algloopsolverfactory,boost::shared_ptr simData,boost::shared_ptr simVars) { throw ModelicaSimulationError(MODEL_FACTORY,"Modelica is not supported"); } diff --git a/SimulationRuntime/cpp/Include/Solver/Kinsol/Kinsol.h b/SimulationRuntime/cpp/Include/Solver/Kinsol/Kinsol.h index feb30597521..8fbb2092913 100644 --- a/SimulationRuntime/cpp/Include/Solver/Kinsol/Kinsol.h +++ b/SimulationRuntime/cpp/Include/Solver/Kinsol/Kinsol.h @@ -14,7 +14,7 @@ #include #include //#include - + int kin_fCallback(N_Vector y, N_Vector fval, void *user_data); class Kinsol : public IAlgLoopSolver { public: @@ -30,7 +30,7 @@ class Kinsol : public IAlgLoopSolver /// Returns the status of iteration virtual ITERATIONSTATUS getIterationStatus(); virtual void stepCompleted(double time); - + int kin_f(N_Vector y, N_Vector fval, void *user_data); private: /// Encapsulation of determination of residuals to given unknowns void calcFunction(const double* y, double* residual); @@ -38,7 +38,7 @@ class Kinsol : public IAlgLoopSolver void calcJacobian(double* f, double* y); int check_flag(void *flagvalue, char *funcname, int opt); - static int kin_fCallback(N_Vector y, N_Vector fval, void *user_data); + void solveNLS(); bool isfinite(double* u, int dim); void check4EventRetry(double* y); diff --git a/SimulationRuntime/cpp/Solver/Kinsol/Kinsol.cpp b/SimulationRuntime/cpp/Solver/Kinsol/Kinsol.cpp index 2b57ad5c4cc..9c314167250 100644 --- a/SimulationRuntime/cpp/Solver/Kinsol/Kinsol.cpp +++ b/SimulationRuntime/cpp/Solver/Kinsol/Kinsol.cpp @@ -9,6 +9,14 @@ extern "C" void dgesv_(long int *n, long int *nrhs, double *J, long int *ldj, lo #include #endif + +int kin_fCallback(N_Vector y,N_Vector fval, void *user_data) +{ + Kinsol* myKinsol = (Kinsol*)(user_data); + return myKinsol->kin_f(y,fval,user_data); +} + + Kinsol::Kinsol(IAlgLoop* algLoop, INonLinSolverSettings* settings) : _algLoop (algLoop) , _kinsolSettings ((INonLinSolverSettings*)settings) @@ -340,7 +348,7 @@ void Kinsol::calcFunction(const double *y, double *residual) } } -int Kinsol::kin_fCallback(N_Vector y,N_Vector fval, void *user_data) +int Kinsol::kin_f(N_Vector y,N_Vector fval, void *user_data) { ((Kinsol*) user_data)->calcFunction(NV_DATA_S(y),NV_DATA_S(fval));