Skip to content

Commit

Permalink
FMI2 Cpp: upgrade initialization
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@25383 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
rfranke committed Apr 3, 2015
1 parent f2e146e commit 18dd141
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 54 deletions.
7 changes: 5 additions & 2 deletions SimulationRuntime/cpp/Include/FMU2/FMU2Interface.cpp
Expand Up @@ -135,7 +135,7 @@ extern "C"
FMU2Wrapper *w = reinterpret_cast<FMU2Wrapper*>(c);
LOG_CALL(w, "fmi2EnterInitializationMode");
try {
return w->initialize();
return w->enterInitializationMode();
}
CATCH_EXCEPTION(w);
}
Expand All @@ -144,7 +144,10 @@ extern "C"
{
FMU2Wrapper *w = reinterpret_cast<FMU2Wrapper*>(c);
LOG_CALL(w, "fmi2ExitInitializationMode");
return fmi2OK;
try {
return w->exitInitializationMode();
}
CATCH_EXCEPTION(w);
}

fmi2Status fmi2Terminate(fmi2Component c)
Expand Down
99 changes: 48 additions & 51 deletions SimulationRuntime/cpp/Include/FMU2/FMU2Wrapper.cpp
Expand Up @@ -132,6 +132,40 @@ fmi2Status FMU2Wrapper::setupExperiment(fmi2Boolean toleranceDefined,
return setTime(startTime);
}

fmi2Status FMU2Wrapper::enterInitializationMode()
{
_model->setInitial(true);
_need_update = true;
return fmi2OK;
}

fmi2Status FMU2Wrapper::exitInitializationMode()
{
if (_need_update)
updateModel();
_model->saveAll();
_model->setInitial(false);
return fmi2OK;
}

fmi2Status FMU2Wrapper::terminate()
{
return fmi2OK;
}

fmi2Status FMU2Wrapper::reset()
{
return fmi2OK;
}

void FMU2Wrapper::updateModel()
{
if (_model->initial())
_model->initEquations(); // initial equations and calculated parameters
_model->evaluateAll(); // derivatives and algebraic variables
_need_update = false;
}

fmi2Status FMU2Wrapper::setTime(fmi2Real time)
{
_model->setTime(time);
Expand All @@ -154,21 +188,12 @@ fmi2Status FMU2Wrapper::getContinuousStates(fmi2Real states[], size_t nx)

fmi2Status FMU2Wrapper::getDerivatives(fmi2Real derivatives[], size_t nx)
{
updateModel();
if (_need_update)
updateModel();
_model->getRHS(derivatives);
return fmi2OK;
}


void FMU2Wrapper::updateModel()
{
if (!_need_update)
return;

_model->evaluateAll(); // This will calculate the values for derivate variables, algebraic variables
_need_update = false;
}

fmi2Status FMU2Wrapper::completedIntegratorStep(fmi2Boolean noSetFMUStatePriorToCurrentPoint,
fmi2Boolean *enterEventMode,
fmi2Boolean *terminateSimulation)
Expand Down Expand Up @@ -220,31 +245,10 @@ fmi2Status FMU2Wrapper::setString(const fmi2ValueReference vr[], size_t nvr,
return fmi2OK;
}

fmi2Status FMU2Wrapper::initialize()
{
_model->setInitial(true);
_model->initEquations(); // initialize dependent variables

bool restart = true;
int iter = 0;
while (restart && !(iter++ > 10)) {
_model->evaluateAll(IContinuous::ALL);
restart = _model->checkForDiscreteEvents();
}

_model->saveAll();
int dim = _model->getDimZeroFunc();
for (int i = 0; i < dim; i++)
_model->getCondition(i);

_model->setInitial(false);
_need_update = false;
return fmi2OK;
}

fmi2Status FMU2Wrapper::getEventIndicators(fmi2Real eventIndicators[], size_t ni)
{
updateModel();
if (_need_update)
updateModel();
bool conditions[NUMBER_OF_EVENT_INDICATORS];
_model->getConditions(conditions);
_model->getZeroFunc(eventIndicators);
Expand All @@ -257,23 +261,26 @@ fmi2Status FMU2Wrapper::getEventIndicators(fmi2Real eventIndicators[], size_t ni
fmi2Status FMU2Wrapper::getReal(const fmi2ValueReference vr[], size_t nvr,
fmi2Real value[])
{
updateModel();
if (_need_update)
updateModel();
_model->getReal(vr, nvr, value);
return fmi2OK;
}

fmi2Status FMU2Wrapper::getInteger(const fmi2ValueReference vr[], size_t nvr,
fmi2Integer value[])
{
updateModel();
if (_need_update)
updateModel();
_model->getInteger(vr, nvr, value);
return fmi2OK;
}

fmi2Status FMU2Wrapper::getBoolean(const fmi2ValueReference vr[], size_t nvr,
fmi2Boolean value[])
{
updateModel();
if (_need_update)
updateModel();
_model->getBoolean(vr, nvr, value);
return fmi2OK;
}
Expand All @@ -287,7 +294,8 @@ fmi2Status FMU2Wrapper::getString(const fmi2ValueReference vr[], size_t nvr,
nvr, _string_buffer.size());
return fmi2Error;
}
updateModel();
if (_need_update)
updateModel();
_model->getString(vr, nvr, &_string_buffer[0]);
for (size_t i = 0; i < nvr; i++)
value[i] = _string_buffer[i].c_str(); // convert to fmi2String
Expand All @@ -297,7 +305,8 @@ fmi2Status FMU2Wrapper::getString(const fmi2ValueReference vr[], size_t nvr,

fmi2Status FMU2Wrapper::newDiscreteStates(fmi2EventInfo *eventInfo)
{
updateModel();
if (_need_update)
updateModel();
// Check if an Zero Crossings happend
double f[NUMBER_OF_EVENT_INDICATORS];
bool events[NUMBER_OF_EVENT_INDICATORS];
Expand All @@ -318,20 +327,8 @@ fmi2Status FMU2Wrapper::newDiscreteStates(fmi2EventInfo *eventInfo)

fmi2Status FMU2Wrapper::getNominalsOfContinuousStates(fmi2Real x_nominal[], size_t nx)
{
updateModel();
for (int i = 0; i < nx; i++)
x_nominal[i] = 1.0; // TODO
return fmi2OK;
}

fmi2Status FMU2Wrapper::terminate()
{
return fmi2OK;
}

fmi2Status FMU2Wrapper::reset()
{
// Note: initialize() leeks memory and does not appear needed here
//_model->initialize();
return fmi2OK;
}
3 changes: 2 additions & 1 deletion SimulationRuntime/cpp/Include/FMU2/FMU2Wrapper.h
Expand Up @@ -87,7 +87,8 @@ class FMU2Wrapper
fmi2Real startTime,
fmi2Boolean stopTimeDefined,
fmi2Real stopTime);
virtual fmi2Status initialize ();
virtual fmi2Status enterInitializationMode();
virtual fmi2Status exitInitializationMode();
virtual fmi2Status terminate ();
virtual fmi2Status reset ();

Expand Down

0 comments on commit 18dd141

Please sign in to comment.