Skip to content

Commit fed7b0e

Browse files
arun3688lochel
andauthored
Fixed time handling for model exchange (#1383) (#1483)
Co-authored-by: Lennart Ochel <lennart.ochel@outlook.com>
1 parent 5dc46af commit fed7b0e

1 file changed

Lines changed: 63 additions & 28 deletions

File tree

src/OMSimulatorLib/SystemSC.cpp

Lines changed: 63 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -621,9 +621,6 @@ oms_status_enu_t oms::SystemSC::doStepEuler()
621621
logDebug("step_size: " + std::to_string(step_size) + " | " + std::to_string(time) + " -> " + std::to_string(event_time));
622622
for (size_t i = 0; i < fmus.size(); ++i)
623623
{
624-
fmistatus = fmi2_setTime(fmus[i]->getFMU(), event_time);
625-
if (fmi2OK != fmistatus) logError_FMUCall("fmi2_setTime", fmus[i]);
626-
627624
if (0 == nStates[i])
628625
continue;
629626

@@ -664,6 +661,21 @@ oms_status_enu_t oms::SystemSC::doStepEuler()
664661
time = event_time;
665662
step_size_adjustment = maximumStepSize;
666663

664+
// set time
665+
for (const auto& component : getComponents())
666+
{
667+
switch (component.second->getType())
668+
{
669+
case oms_component_fmu:
670+
if (fmi2OK != fmi2_setTime(dynamic_cast<ComponentFMUME*>(component.second)->getFMU(), time))
671+
logError_FMUCall("fmi2_setTime", dynamic_cast<ComponentFMUME*>(component.second));
672+
break;
673+
case oms_component_table:
674+
dynamic_cast<ComponentTable*>(component.second)->stepUntil(time);
675+
break;
676+
}
677+
}
678+
667679
for (size_t i = 0; i < fmus.size(); ++i)
668680
{
669681
fmistatus = fmi2_completedIntegratorStep(fmus[i]->getFMU(), fmi2True, &callEventUpdate[i], &terminateSimulation[i]);
@@ -699,6 +711,21 @@ oms_status_enu_t oms::SystemSC::doStepEuler()
699711
if (isTopLevelSystem())
700712
getModel().emit(time, false);
701713

714+
// set time
715+
for (const auto& component : getComponents())
716+
{
717+
switch (component.second->getType())
718+
{
719+
case oms_component_fmu:
720+
if (fmi2OK != fmi2_setTime(dynamic_cast<ComponentFMUME*>(component.second)->getFMU(), time))
721+
logError_FMUCall("fmi2_setTime", dynamic_cast<ComponentFMUME*>(component.second));
722+
break;
723+
case oms_component_table:
724+
dynamic_cast<ComponentTable*>(component.second)->stepUntil(time);
725+
break;
726+
}
727+
}
728+
702729
// Enter event mode and handle discrete state updates for each FMU
703730
for (size_t i = 0; i < fmus.size(); ++i)
704731
{
@@ -806,15 +833,27 @@ oms_status_enu_t oms::SystemSC::doStepCVODE()
806833
// set states
807834
status = fmus[i]->setContinuousStates(states[i]);
808835
if (oms_status_ok != status) return status;
809-
810-
// set time
811-
fmistatus = fmi2_setTime(fmus[i]->getFMU(), time);
812-
if (fmi2OK != fmistatus) logError_FMUCall("fmi2_setTime", fmus[i]);
813836
}
814837

815838
if (flag == CV_ROOT_RETURN || time == tnext)
816839
{
817-
//logInfo("event found!!! " + std::to_string(time));
840+
logDebug("event found!!! " + std::to_string(time));
841+
842+
// set time
843+
for (const auto& component : getComponents())
844+
{
845+
switch (component.second->getType())
846+
{
847+
case oms_component_fmu:
848+
if (fmi2OK != fmi2_setTime(dynamic_cast<ComponentFMUME*>(component.second)->getFMU(), time))
849+
logError_FMUCall("fmi2_setTime", dynamic_cast<ComponentFMUME*>(component.second));
850+
break;
851+
case oms_component_table:
852+
dynamic_cast<ComponentTable*>(component.second)->stepUntil(time);
853+
break;
854+
}
855+
}
856+
818857
for (size_t i = 0; i < fmus.size(); ++i)
819858
{
820859
fmistatus = fmi2_completedIntegratorStep(fmus[i]->getFMU(), fmi2True, &callEventUpdate[i], &terminateSimulation[i]);
@@ -889,6 +928,22 @@ oms_status_enu_t oms::SystemSC::doStepCVODE()
889928
if (flag == CV_SUCCESS)
890929
{
891930
logDebug("CVode completed successfully at t = " + std::to_string(time));
931+
932+
// set time
933+
for (const auto& component : getComponents())
934+
{
935+
switch (component.second->getType())
936+
{
937+
case oms_component_fmu:
938+
if (fmi2OK != fmi2_setTime(dynamic_cast<ComponentFMUME*>(component.second)->getFMU(), time))
939+
logError_FMUCall("fmi2_setTime", dynamic_cast<ComponentFMUME*>(component.second));
940+
break;
941+
case oms_component_table:
942+
dynamic_cast<ComponentTable*>(component.second)->stepUntil(time);
943+
break;
944+
}
945+
}
946+
892947
for (size_t i = 0; i < fmus.size(); ++i)
893948
{
894949
fmistatus = fmi2_completedIntegratorStep(fmus[i]->getFMU(), fmi2True, &callEventUpdate[i], &terminateSimulation[i]);
@@ -945,26 +1000,6 @@ oms_status_enu_t oms::SystemSC::updateInputs(DirectedGraph& graph)
9451000
oms_status_enu_t status;
9461001
int loopNum = 0;
9471002

948-
if (getModel().validState(oms_modelState_simulation))
949-
{
950-
// update time
951-
for (const auto& component : getComponents())
952-
{
953-
switch (component.second->getType())
954-
{
955-
case oms_component_fmu:
956-
if (fmi2OK != fmi2_setTime(dynamic_cast<ComponentFMUME*>(component.second)->getFMU(), time))
957-
logError_FMUCall("fmi2_setTime", dynamic_cast<ComponentFMUME*>(component.second));
958-
break;
959-
case oms_component_table:
960-
dynamic_cast<ComponentTable*>(component.second)->stepUntil(time);
961-
break;
962-
default:
963-
break;
964-
}
965-
}
966-
}
967-
9681003
// input := output
9691004
const std::vector< scc_t >& sortedConnections = graph.getSortedConnections();
9701005
updateAlgebraicLoops(sortedConnections, graph);

0 commit comments

Comments
 (0)