@@ -87,7 +87,7 @@ int oms::cvode_rhs(realtype t, N_Vector y, N_Vector ydot, void* user_data)
8787
8888int oms::cvode_roots (realtype t, N_Vector y, realtype *gout, void *user_data)
8989{
90- // logInfo ("cvode_roots at time " + std::to_string(t));
90+ logDebug (" cvode_roots at time " + std::to_string (t));
9191 SystemSC* system = (SystemSC*)user_data;
9292 oms_status_enu_t status;
9393 fmi2Status fmistatus;
@@ -590,15 +590,16 @@ oms_status_enu_t oms::SystemSC::doStepEuler()
590590 fmi2Real event_time = end_time;
591591 bool event_detected = false ;
592592
593+ fmi2Real tnext = end_time + 1.0 ;
594+ for (int i = 0 ; i < fmus.size (); ++i)
595+ if (fmus[i]->getEventInfo ()->nextEventTimeDefined && (tnext > fmus[i]->getEventInfo ()->nextEventTime ) && (time < fmus[i]->getEventInfo ()->nextEventTime ))
596+ tnext = fmus[i]->getEventInfo ()->nextEventTime ;
597+
593598 // Step 3: Main integration loop
594599 while (time < end_time)
595600 {
596- fmi2Real tnext = end_time+1.0 ;
597-
598- // find next time event
599- for (int i = 0 ; i < fmus.size (); ++i)
600- if (fmus[i]->getEventInfo ()->nextEventTimeDefined && (tnext > fmus[i]->getEventInfo ()->nextEventTime ))
601- tnext = fmus[i]->getEventInfo ()->nextEventTime ;
601+ if (tnext < event_time)
602+ event_time = tnext;
602603
603604 step_size_adjustment *= 0.5 ; // reduce the step size in each iteration
604605
@@ -671,9 +672,10 @@ oms_status_enu_t oms::SystemSC::doStepEuler()
671672 }
672673 else
673674 {
674- if (step_size_adjustment < event_time_tolerance)
675+ if (event_time == tnext || step_size_adjustment < event_time_tolerance)
675676 {
676677 logDebug (" event found!!! " + std::to_string (event_time));
678+
677679 // Event detected: Restore to last "safe" state and integrate directly to event time
678680 time = event_time;
679681 step_size_adjustment = maximumStepSize;
@@ -709,6 +711,13 @@ oms_status_enu_t oms::SystemSC::doStepEuler()
709711 if (oms_status_ok != status) return status;
710712 }
711713
714+ // find next time event
715+ tnext = end_time + 1.0 ;
716+ for (int i = 0 ; i < fmus.size (); ++i)
717+ if (fmus[i]->getEventInfo ()->nextEventTimeDefined && (tnext > fmus[i]->getEventInfo ()->nextEventTime ))
718+ tnext = fmus[i]->getEventInfo ()->nextEventTime ;
719+ logDebug (" tnext: " + std::to_string (tnext));
720+
712721 // emit the right limit of the event
713722 updateInputs (eventGraph);
714723 if (isTopLevelSystem ())
@@ -742,17 +751,16 @@ oms_status_enu_t oms::SystemSC::doStepCVODE()
742751
743752 const fmi2Real end_time = std::min (time + maximumStepSize, getModel ().getStopTime ());
744753
745- // logInfo("doStepCVODE: " + std::to_string(time) + " -> " + std::to_string(end_time));
754+ // find next time event
755+ fmi2Real tnext = end_time+1.0 ;
756+ for (int i = 0 ; i < fmus.size (); ++i)
757+ if (fmus[i]->getEventInfo ()->nextEventTimeDefined && (tnext > fmus[i]->getEventInfo ()->nextEventTime ))
758+ tnext = fmus[i]->getEventInfo ()->nextEventTime ;
759+ logDebug (" tnext: " + std::to_string (tnext));
760+
746761 while (time < end_time)
747762 {
748- fmi2Real tnext = end_time+1.0 ;
749-
750- // find next time event
751- for (int i = 0 ; i < fmus.size (); ++i)
752- if (fmus[i]->getEventInfo ()->nextEventTimeDefined && (tnext > fmus[i]->getEventInfo ()->nextEventTime ))
753- tnext = fmus[i]->getEventInfo ()->nextEventTime ;
754-
755- // logInfo("CVode: " + std::to_string(time) + " -> " + std::to_string(end_time));
763+ logDebug (" CVode: " + std::to_string (time) + " -> " + std::to_string (end_time));
756764 for (int j=0 , k=0 ; j < fmus.size (); ++j)
757765 for (size_t i=0 ; i < nStates[j]; ++i, ++k)
758766 NV_Ith_S (solverData.cvode .y , k) = states[j][i];
@@ -807,6 +815,13 @@ oms_status_enu_t oms::SystemSC::doStepCVODE()
807815 if (oms_status_ok != status) return status;
808816 }
809817
818+ // find next time event
819+ tnext = end_time+1.0 ;
820+ for (int i = 0 ; i < fmus.size (); ++i)
821+ if (fmus[i]->getEventInfo ()->nextEventTimeDefined && (tnext > fmus[i]->getEventInfo ()->nextEventTime ))
822+ tnext = fmus[i]->getEventInfo ()->nextEventTime ;
823+ logDebug (" tnext: " + std::to_string (tnext));
824+
810825 // emit the right limit of the event
811826 updateInputs (eventGraph);
812827 if (isTopLevelSystem ())
@@ -833,7 +848,7 @@ oms_status_enu_t oms::SystemSC::doStepCVODE()
833848
834849 if (flag == CV_SUCCESS)
835850 {
836- // logInfo ("CVode completed successfully at t = " + std::to_string(time));
851+ logDebug (" CVode completed successfully at t = " + std::to_string (time));
837852 for (int i = 0 ; i < fmus.size (); ++i)
838853 {
839854 fmistatus = fmi2_completedIntegratorStep (fmus[i]->getFMU (), fmi2True, &callEventUpdate[i], &terminateSimulation[i]);
0 commit comments