Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit d783820

Browse files
committed
Adapt Cpp code to increased use of calculatedParameter, ticket:4027
This follows up 25249c8 "Fix initialization problems containing parameters having implicitly fixed=false" - move initialization details to the three sub-methods initializeMemory/FreeVariables/BoundVariables - in particular place initParameterEquations() in initializeBoundVariables - avoid duplicate initialization steps in FMUWrapper and FMU2Wrapper - force HARDCODED_START_VALUES for FMI export -- this is needed for FMI2, because calculatedParameters have no values in the XML file; it is also needed for FMI1 tests that re-import FMUs (e.g. Crane*)
1 parent 55548c1 commit d783820

File tree

5 files changed

+42
-26
lines changed

5 files changed

+42
-26
lines changed

Compiler/Template/CodegenCpp.tpl

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5871,32 +5871,13 @@ case SIMCODE(modelInfo = MODELINFO(__),makefileParams = MAKEFILE_PARAMS(__)) th
58715871
let initialequations = functionInitialEquations(initialEquations,"initEquation",simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation, false, true, false)
58725872
let boundparameterequations = functionInitialEquations(parameterEquations,"initParameterEquation",simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation, false, true, true)
58735873
<<
5874+
// convenience function for full initialization
58745875
void <%lastIdentOfPath(modelInfo.name)%>Initialize::initialize()
58755876
{
58765877
initializeMemory();
5877-
5878-
#if !defined(FMU_BUILD)
5879-
#if defined(__vxworks)
5880-
_reader = shared_ptr<IPropertyReader>(new XmlPropertyReader("/SYSTEM/bundles/com.boschrexroth.<%modelname%>/<%fileNamePrefix%>_init.xml"));
5881-
#else
5882-
_reader = shared_ptr<IPropertyReader>(new XmlPropertyReader("<%makefileParams.compileDir%>/<%fileNamePrefix%>_init.xml"));
5883-
#endif
5884-
_reader->readInitialValues(*this, getSimVars());
5885-
#endif
58865878
initializeFreeVariables();
5887-
/*Start complex expressions */
5888-
<%complexStartExpressions%>
5889-
/* End complex expression */
5890-
<%if(boolAnd(boolNot(Flags.isSet(Flags.HARDCODED_START_VALUES)), Flags.isSet(Flags.GEN_DEBUG_SYMBOLS))) then 'checkParameters();' else '//checkParameters();'%>
5891-
initParameterEquations();
58925879
initializeBoundVariables();
5893-
<%if(boolAnd(boolNot(Flags.isSet(Flags.HARDCODED_START_VALUES)), Flags.isSet(Flags.GEN_DEBUG_SYMBOLS))) then 'checkVariables();' else '//checkVariables();'%>
58945880
saveAll();
5895-
5896-
<%lastIdentOfPath(modelInfo.name)%>WriteOutput::initialize();
5897-
<%lastIdentOfPath(modelInfo.name)%>Jacobian::initialize();
5898-
<%lastIdentOfPath(modelInfo.name)%>Jacobian::initializeColoredJacobianA();
5899-
//delete reader;
59005881
}
59015882

59025883
void <%lastIdentOfPath(modelInfo.name)%>Initialize::initializeMemory()
@@ -5910,6 +5891,10 @@ case SIMCODE(modelInfo = MODELINFO(__),makefileParams = MAKEFILE_PARAMS(__)) th
59105891
initializeAlgloopSolverVariables();
59115892
//init alg loop vars
59125893
<%initAlgloopvars%>
5894+
5895+
<%lastIdentOfPath(modelInfo.name)%>WriteOutput::initialize();
5896+
<%lastIdentOfPath(modelInfo.name)%>Jacobian::initialize();
5897+
<%lastIdentOfPath(modelInfo.name)%>Jacobian::initializeColoredJacobianA();
59135898
}
59145899
<%if(boolAnd(boolNot(Flags.isSet(Flags.HARDCODED_START_VALUES)), Flags.isSet(Flags.GEN_DEBUG_SYMBOLS))) then
59155900
<<
@@ -5940,6 +5925,15 @@ case SIMCODE(modelInfo = MODELINFO(__),makefileParams = MAKEFILE_PARAMS(__)) th
59405925
%>
59415926
void <%lastIdentOfPath(modelInfo.name)%>Initialize::initializeFreeVariables()
59425927
{
5928+
#if !defined(FMU_BUILD)
5929+
#if defined(__vxworks)
5930+
_reader = shared_ptr<IPropertyReader>(new XmlPropertyReader("/SYSTEM/bundles/com.boschrexroth.<%modelname%>/<%fileNamePrefix%>_init.xml"));
5931+
#else
5932+
_reader = shared_ptr<IPropertyReader>(new XmlPropertyReader("<%makefileParams.compileDir%>/<%fileNamePrefix%>_init.xml"));
5933+
#endif
5934+
_reader->readInitialValues(*this, getSimVars());
5935+
#endif
5936+
59435937
_simTime = 0.0;
59445938
_state_var_reinitialized = false;
59455939

@@ -5968,13 +5962,21 @@ case SIMCODE(modelInfo = MODELINFO(__),makefileParams = MAKEFILE_PARAMS(__)) th
59685962
//init inputs
59695963
stepStarted(0.0);
59705964
#endif
5965+
5966+
/*Start complex expressions */
5967+
<%complexStartExpressions%>
5968+
/* End complex expression */
5969+
<%if(boolAnd(boolNot(Flags.isSet(Flags.HARDCODED_START_VALUES)), Flags.isSet(Flags.GEN_DEBUG_SYMBOLS))) then 'checkParameters();' else '//checkParameters();'%>
5970+
//delete reader;
59715971
}
59725972

59735973
void <%lastIdentOfPath(modelInfo.name)%>Initialize::initializeBoundVariables()
59745974
{
59755975
//variable decls
59765976
<%varDecls%>
59775977

5978+
initParameterEquations();
5979+
59785980
//construct external objects once
59795981
if (!_constructedExternalObjects)
59805982
constructExternalObjects();
@@ -5993,14 +5995,16 @@ case SIMCODE(modelInfo = MODELINFO(__),makefileParams = MAKEFILE_PARAMS(__)) th
59935995
//init alg loop solvers
59945996
<%initAlgloopSolvers%>
59955997

5996-
for(int i=0;i<_dimZeroFunc;i++)
5998+
for(int i = 0; i < _dimZeroFunc; i++)
59975999
{
59986000
getCondition(i);
59996001
}
60006002

60016003
//initialAnalyticJacobian();
60026004

60036005
<%functionInitDelay(delayedExps,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>
6006+
6007+
<%if(boolAnd(boolNot(Flags.isSet(Flags.HARDCODED_START_VALUES)), Flags.isSet(Flags.GEN_DEBUG_SYMBOLS))) then 'checkVariables();' else '//checkVariables();'%>
60046008
}
60056009

60066010
void <%lastIdentOfPath(modelInfo.name)%>Initialize::initEquations()

Compiler/Template/CodegenFMUCpp.tpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ case SIMCODE(modelInfo=modelInfo as MODELINFO(__)) then
7575
let numBoolVars = numBoolvars(modelInfo)
7676
let numStringVars = numStringvars(modelInfo)
7777

78+
let flag = Flags.set(Flags.HARDCODED_START_VALUES, true)
7879
let cpp = CodegenCpp.translateModel(simCode)
7980
let()= textFile(fmuWriteOutputHeaderFile(simCode , &extraFuncs , &extraFuncsDecl, ""),'OMCpp<%fileNamePrefix%>WriteOutput.h')
8081
let()= textFile(fmuModelHeaderFile(simCode, extraFuncs, extraFuncsDecl, "",guid, FMUVersion), 'OMCpp<%fileNamePrefix%>FMU.h')

Compiler/Template/SimCodeTV.mo

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3339,6 +3339,12 @@ package Flags
33393339
constant ConfigFlag DAE_MODE;
33403340
constant ConfigFlag EQUATIONS_PER_FILE;
33413341

3342+
function set
3343+
input DebugFlag inFlag;
3344+
input Boolean inValue;
3345+
output Boolean outOldValue;
3346+
end set;
3347+
33423348
function isSet
33433349
input DebugFlag inFlag;
33443350
output Boolean outValue;

SimulationRuntime/cpp/Include/FMU/FMUWrapper.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,12 @@ class FMUWrapper : public IFMUInterface
151151
virtual fmiStatus initialize(fmiBoolean toleranceControlled, fmiReal relativeTolerance, fmiEventInfo& eventInfo)
152152
{
153153
//LOGGER_WRITE("Initialize",LC_OTHER,LL_DEBUG);
154-
// TODO: here is some code duplication to SimulationRuntime/cpp/Core/Solver/Initailization.cpp
155-
Logger::write("Initializing memory and variables",LC_MOD,LL_DEBUG);
156-
_model->initialize();
154+
Logger::write("Initializing memory and variables", LC_MOD, LL_DEBUG);
155+
_model->initializeMemory();
156+
_model->initializeFreeVariables();
157157
_model->initializeBoundVariables();
158+
_model->saveAll();
159+
158160
_model->setInitial(true);
159161

160162
bool restart=true;

SimulationRuntime/cpp/Include/FMU2/FMU2Wrapper.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ FMU2Wrapper::FMU2Wrapper(fmi2String instanceName, fmi2String GUID,
6464
_GUID = GUID;
6565
_logCategories = loggingOn? 0xFFFF: 0x0000;
6666
_model = createSystemFMU(&_global_settings);
67-
_model->initialize();
67+
_model->initializeMemory();
68+
_model->initializeFreeVariables();
6869
_string_buffer.resize(_model->getDimString());
6970
_clock_buffer = new bool[_model->getDimClock()];
7071
std::fill(_clock_buffer, _clock_buffer + _model->getDimClock(), false);
@@ -153,8 +154,10 @@ fmi2Status FMU2Wrapper::reset()
153154

154155
void FMU2Wrapper::updateModel()
155156
{
156-
if (_model->initial())
157+
if (_model->initial()) {
157158
_model->initializeBoundVariables();
159+
_model->saveAll();
160+
}
158161
_model->evaluateAll(); // derivatives and algebraic variables
159162
_need_update = false;
160163
}

0 commit comments

Comments
 (0)