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