Skip to content

Commit 6f184d5

Browse files
authored
Fix time events (#1361)
1 parent 6d7a397 commit 6f184d5

1 file changed

Lines changed: 33 additions & 18 deletions

File tree

src/OMSimulatorLib/SystemSC.cpp

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ int oms::cvode_rhs(realtype t, N_Vector y, N_Vector ydot, void* user_data)
8787

8888
int 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

Comments
 (0)