Skip to content

Commit d57ab65

Browse files
Fix errors in setting simulation time in the Euler solver for SC systems
- Some errors made in commit 4c3fe79. - All discrete inputs should be updated before going back to continous time mode in any FMU. refs #1326
1 parent 7c8c6c5 commit d57ab65

1 file changed

Lines changed: 23 additions & 10 deletions

File tree

src/OMSimulatorLib/SystemSC.cpp

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -615,10 +615,10 @@ oms_status_enu_t oms::SystemSC::doStepEuler(double stopTime)
615615

616616
// TODO: Check callEventUpdate values!
617617

618-
// a. Evaluate derivatives for each FMU
618+
// a. Evaluate states at time 'event_time' for each FMU
619619
// set time
620620
for (const auto& component : getComponents())
621-
component.second->setTime(time);
621+
component.second->setTime(event_time);
622622

623623
const fmi2Real step_size = event_time - time; // Substep size, do one step from current time to the event
624624
logDebug("step_size: " + std::to_string(step_size) + " | " + std::to_string(time) + " -> " + std::to_string(event_time));
@@ -666,17 +666,22 @@ oms_status_enu_t oms::SystemSC::doStepEuler(double stopTime)
666666
time = event_time;
667667
step_size_adjustment = maximumStepSize;
668668

669+
// FMUs are already at time 'event_time'
670+
// for (const auto& component : getComponents())
671+
// component.second->setTime(time);
672+
673+
// emit the left limit of the event (if it hasn't already been emitted)
674+
// We already did an input update earlier
675+
// updateInputs(simulationGraph); //pass the continuousTimeMode dependency graph which involves only connections of type Real
676+
if (isTopLevelSystem())
677+
getModel().emit(time, false);
678+
669679
for (size_t i = 0; i < fmus.size(); ++i)
670680
{
671681
fmistatus = fmi2_completedIntegratorStep(fmus[i]->getFMU(), fmi2True, &callEventUpdate[i], &terminateSimulation[i]);
672682
if (fmi2OK != fmistatus) return logError_FMUCall("fmi2_completedIntegratorStep", fmus[i]);
673683
}
674684

675-
// emit the left limit of the event (if it hasn't already been emitted)
676-
updateInputs(simulationGraph); //pass the continuousTimeMode dependency graph which involves only connections of type Real
677-
if (isTopLevelSystem())
678-
getModel().emit(time, false);
679-
680685
logDebug("integrate normally to the end time if no events are ahead");
681686
}
682687
else
@@ -697,6 +702,10 @@ oms_status_enu_t oms::SystemSC::doStepEuler(double stopTime)
697702
step_size_adjustment = maximumStepSize;
698703
event_time = end_time;
699704

705+
// FMUs are already at time 'event_time'
706+
// for (const auto& component : getComponents())
707+
// component.second->setTime(time);
708+
700709
// emit the left limit of the event (if it hasn't already been emitted)
701710
if (isTopLevelSystem())
702711
getModel().emit(time, false);
@@ -711,9 +720,6 @@ oms_status_enu_t oms::SystemSC::doStepEuler(double stopTime)
711720
if (fmi2OK != fmistatus) logError_FMUCall("fmi2_enterEventMode", fmus[i]);
712721

713722
fmus[i]->doEventIteration();
714-
715-
fmistatus = fmi2_enterContinuousTimeMode(fmus[i]->getFMU());
716-
if (fmi2OK != fmistatus) logError_FMUCall("fmi2_enterContinuousTimeMode", fmus[i]);
717723
}
718724

719725
updateInputs(eventGraph);
@@ -722,6 +728,13 @@ oms_status_enu_t oms::SystemSC::doStepEuler(double stopTime)
722728
if (isTopLevelSystem())
723729
getModel().emit(time, true);
724730

731+
// Go back to continuous time mode
732+
for (size_t i = 0; i < fmus.size(); ++i)
733+
{
734+
fmistatus = fmi2_enterContinuousTimeMode(fmus[i]->getFMU());
735+
if (fmi2OK != fmistatus) logError_FMUCall("fmi2_enterContinuousTimeMode", fmus[i]);
736+
}
737+
725738
for (size_t i = 0; i < fmus.size(); ++i)
726739
{
727740
if (nStates[i] > 0)

0 commit comments

Comments
 (0)