Skip to content

Commit 9cd11c8

Browse files
committed
- Fixed fmiEventUpdate.
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@25006 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 14abf44 commit 9cd11c8

File tree

2 files changed

+42
-77
lines changed

2 files changed

+42
-77
lines changed

SimulationRuntime/fmi/export/fmi1/fmu1_model_interface.c

Lines changed: 25 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,6 @@ fmiStatus fmiInitialize(fmiComponent c, fmiBoolean toleranceControlled, fmiReal
595595
if (comp->loggingOn) comp->functions.logger(c, comp->instanceName, fmiOK, "log",
596596
"fmiInitialize: toleranceControlled=%d relativeTolerance=%g",
597597
toleranceControlled, relativeTolerance);
598-
*eventInfo = comp->eventInfo;
599598

600599
/* set zero-crossing tolerance */
601600
setZCtol(relativeTolerance);
@@ -643,19 +642,19 @@ fmiStatus fmiInitialize(fmiComponent c, fmiBoolean toleranceControlled, fmiReal
643642
/* due to an event overwrite old values */
644643
overwriteOldSimulationData(comp->fmuData);
645644

646-
comp->eventInfo.iterationConverged = fmiTrue;
647-
comp->eventInfo.stateValueReferencesChanged = fmiFalse;
648-
comp->eventInfo.stateValuesChanged = fmiTrue;
649-
comp->eventInfo.terminateSimulation = fmiFalse;
645+
eventInfo->iterationConverged = fmiTrue;
646+
eventInfo->stateValueReferencesChanged = fmiFalse;
647+
eventInfo->stateValuesChanged = fmiTrue;
648+
eventInfo->terminateSimulation = fmiFalse;
650649

651650
/* Get next event time (sample calls)*/
652651
nextSampleEvent = getNextSampleTimeFMU(comp->fmuData);
653652
if (nextSampleEvent == -1){
654-
comp->eventInfo.upcomingTimeEvent = fmiFalse;
653+
eventInfo->upcomingTimeEvent = fmiFalse;
655654
}else{
656-
comp->eventInfo.upcomingTimeEvent = fmiTrue;
657-
comp->eventInfo.nextEventTime = nextSampleEvent;
658-
fmiEventUpdate(comp, fmiFalse, &(comp->eventInfo));
655+
eventInfo->upcomingTimeEvent = fmiTrue;
656+
eventInfo->nextEventTime = nextSampleEvent;
657+
fmiEventUpdate(comp, fmiFalse, eventInfo);
659658
}
660659

661660
return fmiOK;
@@ -692,50 +691,33 @@ fmiStatus fmiEventUpdate(fmiComponent c, fmiBoolean intermediateResults, fmiEven
692691
eventInfo->stateValuesChanged = fmiTrue;
693692
}
694693

695-
if(eventInfo->nextEventTime <= comp->fmuData->localData[0]->timeValue)
696-
comp->fmuData->simulationInfo.sampleActivated = 1;
694+
storePreValues(comp->fmuData);
697695

698-
/* sample event */
699-
if(comp->fmuData->simulationInfo.sampleActivated)
696+
/* activate sample event */
697+
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
700698
{
701-
storePreValues(comp->fmuData);
702-
703-
/* activate sample event */
704-
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
699+
if(comp->fmuData->simulationInfo.nextSampleTimes[i] <= comp->fmuData->localData[0]->timeValue)
705700
{
706-
if(comp->fmuData->simulationInfo.nextSampleTimes[i] <= comp->fmuData->localData[0]->timeValue)
707-
{
708-
comp->fmuData->simulationInfo.samples[i] = 1;
709-
infoStreamPrint(LOG_EVENTS, 0, "[%ld] sample(%g, %g)", comp->fmuData->modelData.samplesInfo[i].index, comp->fmuData->modelData.samplesInfo[i].start, comp->fmuData->modelData.samplesInfo[i].interval);
710-
}
701+
comp->fmuData->simulationInfo.samples[i] = 1;
702+
infoStreamPrint(LOG_EVENTS, 0, "[%ld] sample(%g, %g)", comp->fmuData->modelData.samplesInfo[i].index, comp->fmuData->modelData.samplesInfo[i].start, comp->fmuData->modelData.samplesInfo[i].interval);
711703
}
704+
}
712705

713-
comp->fmuData->callback->functionDAE(comp->fmuData);
706+
comp->fmuData->callback->functionDAE(comp->fmuData);
714707

715-
/* deactivate sample events */
716-
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
708+
/* deactivate sample events */
709+
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
710+
{
711+
if(comp->fmuData->simulationInfo.samples[i])
717712
{
718-
if(comp->fmuData->simulationInfo.samples[i])
719-
{
720-
comp->fmuData->simulationInfo.samples[i] = 0;
721-
comp->fmuData->simulationInfo.nextSampleTimes[i] += comp->fmuData->modelData.samplesInfo[i].interval;
722-
}
713+
comp->fmuData->simulationInfo.samples[i] = 0;
714+
comp->fmuData->simulationInfo.nextSampleTimes[i] += comp->fmuData->modelData.samplesInfo[i].interval;
723715
}
724-
725-
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
726-
if((i == 0) || (comp->fmuData->simulationInfo.nextSampleTimes[i] < comp->fmuData->simulationInfo.nextSampleEvent))
727-
comp->fmuData->simulationInfo.nextSampleEvent = comp->fmuData->simulationInfo.nextSampleTimes[i];
728-
729-
comp->fmuData->simulationInfo.sampleActivated = 0;
730716
}
731-
else
732-
{
733-
comp->fmuData->callback->function_updateRelations(comp->fmuData, 1);
734-
updateRelationsPre(comp->fmuData);
735-
storeRelations(comp->fmuData);
736717

737-
comp->fmuData->callback->functionDAE(comp->fmuData);
738-
}
718+
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
719+
if((i == 0) || (comp->fmuData->simulationInfo.nextSampleTimes[i] < comp->fmuData->simulationInfo.nextSampleEvent))
720+
comp->fmuData->simulationInfo.nextSampleEvent = comp->fmuData->simulationInfo.nextSampleTimes[i];
739721

740722
if(comp->fmuData->callback->checkForDiscreteChanges(comp->fmuData) || comp->fmuData->simulationInfo.needToIterate || checkRelations(comp->fmuData) || eventInfo->stateValuesChanged)
741723
{

SimulationRuntime/fmi/export/fmi2/fmu2_model_interface.c

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -145,50 +145,33 @@ fmi2Status fmi2EventUpdate(fmi2Component c, fmi2EventInfo* eventInfo)
145145
eventInfo->valuesOfContinuousStatesChanged = fmi2True;
146146
}
147147

148-
if(eventInfo->nextEventTime <= comp->fmuData->localData[0]->timeValue)
149-
comp->fmuData->simulationInfo.sampleActivated = 1;
148+
storePreValues(comp->fmuData);
150149

151-
/* sample event */
152-
if(comp->fmuData->simulationInfo.sampleActivated)
150+
/* activate sample event */
151+
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
153152
{
154-
storePreValues(comp->fmuData);
155-
156-
/* activate sample event */
157-
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
153+
if(comp->fmuData->simulationInfo.nextSampleTimes[i] <= comp->fmuData->localData[0]->timeValue)
158154
{
159-
if(comp->fmuData->simulationInfo.nextSampleTimes[i] <= comp->fmuData->localData[0]->timeValue)
160-
{
161-
comp->fmuData->simulationInfo.samples[i] = 1;
162-
infoStreamPrint(LOG_EVENTS, 0, "[%ld] sample(%g, %g)", comp->fmuData->modelData.samplesInfo[i].index, comp->fmuData->modelData.samplesInfo[i].start, comp->fmuData->modelData.samplesInfo[i].interval);
163-
}
155+
comp->fmuData->simulationInfo.samples[i] = 1;
156+
infoStreamPrint(LOG_EVENTS, 0, "[%ld] sample(%g, %g)", comp->fmuData->modelData.samplesInfo[i].index, comp->fmuData->modelData.samplesInfo[i].start, comp->fmuData->modelData.samplesInfo[i].interval);
164157
}
158+
}
165159

166-
comp->fmuData->callback->functionDAE(comp->fmuData);
160+
comp->fmuData->callback->functionDAE(comp->fmuData);
167161

168-
/* deactivate sample events */
169-
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
162+
/* deactivate sample events */
163+
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
164+
{
165+
if(comp->fmuData->simulationInfo.samples[i])
170166
{
171-
if(comp->fmuData->simulationInfo.samples[i])
172-
{
173-
comp->fmuData->simulationInfo.samples[i] = 0;
174-
comp->fmuData->simulationInfo.nextSampleTimes[i] += comp->fmuData->modelData.samplesInfo[i].interval;
175-
}
167+
comp->fmuData->simulationInfo.samples[i] = 0;
168+
comp->fmuData->simulationInfo.nextSampleTimes[i] += comp->fmuData->modelData.samplesInfo[i].interval;
176169
}
177-
178-
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
179-
if((i == 0) || (comp->fmuData->simulationInfo.nextSampleTimes[i] < comp->fmuData->simulationInfo.nextSampleEvent))
180-
comp->fmuData->simulationInfo.nextSampleEvent = comp->fmuData->simulationInfo.nextSampleTimes[i];
181-
182-
comp->fmuData->simulationInfo.sampleActivated = 0;
183170
}
184-
else
185-
{
186-
comp->fmuData->callback->function_updateRelations(comp->fmuData, 1);
187-
updateRelationsPre(comp->fmuData);
188-
storeRelations(comp->fmuData);
189171

190-
comp->fmuData->callback->functionDAE(comp->fmuData);
191-
}
172+
for(i=0; i<comp->fmuData->modelData.nSamples; ++i)
173+
if((i == 0) || (comp->fmuData->simulationInfo.nextSampleTimes[i] < comp->fmuData->simulationInfo.nextSampleEvent))
174+
comp->fmuData->simulationInfo.nextSampleEvent = comp->fmuData->simulationInfo.nextSampleTimes[i];
192175

193176
if(comp->fmuData->callback->checkForDiscreteChanges(comp->fmuData) || comp->fmuData->simulationInfo.needToIterate || checkRelations(comp->fmuData) || eventInfo->valuesOfContinuousStatesChanged)
194177
{

0 commit comments

Comments
 (0)