@@ -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