Skip to content

Commit cb6c654

Browse files
committed
- Added functionality to dump zero crossings during runtime
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@23201 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 2fe6e08 commit cb6c654

File tree

6 files changed

+53
-11
lines changed

6 files changed

+53
-11
lines changed

SimulationRuntime/c/simulation/solver/events.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -263,24 +263,29 @@ void handleEvents(DATA* data, LIST* eventLst, double *eventTime, SOLVER_INFO* so
263263
data->simulationInfo.chatteringInfo.lastSteps[data->simulationInfo.chatteringInfo.currentIndex]=1;
264264
data->simulationInfo.chatteringInfo.lastTimes[data->simulationInfo.chatteringInfo.currentIndex]=time;
265265

266-
if (!data->simulationInfo.chatteringInfo.messageEmitted && data->simulationInfo.chatteringInfo.lastStepsNumStateEvents == data->simulationInfo.chatteringInfo.numEventLimit) {
266+
if (!data->simulationInfo.chatteringInfo.messageEmitted && data->simulationInfo.chatteringInfo.lastStepsNumStateEvents == data->simulationInfo.chatteringInfo.numEventLimit)
267+
{
267268
int numEventLimit = data->simulationInfo.chatteringInfo.numEventLimit;
268269
int currentIndex = data->simulationInfo.chatteringInfo.currentIndex;
269270
double t0 = data->simulationInfo.chatteringInfo.lastTimes[(currentIndex+1) % numEventLimit];
270-
if (time - t0 < data->simulationInfo.stepSize) {
271+
if (time - t0 < data->simulationInfo.stepSize)
272+
{
271273
long ix = *((long*) listNodeData(listFirstNode(eventLst)));
272274
int *eq_indexes;
273275
const char *exp_str = data->callback->zeroCrossingDescription(ix,&eq_indexes);
274276
infoStreamPrintWithEquationIndexes(LOG_STDOUT, 0, eq_indexes, "Chattering detected around time %.12g..%.12g (%d state events in a row with a total time delta less than the step size %.12g). This can be a performance bottleneck. Use -lv LOG_EVENTS for more information. The zero-crossing was: %s", t0, time, numEventLimit, data->simulationInfo.stepSize, exp_str);
275277
data->simulationInfo.chatteringInfo.messageEmitted = 1;
276-
if (omc_flag[FLAG_ABORT_SLOW]) {
278+
if (omc_flag[FLAG_ABORT_SLOW])
279+
{
277280
throwStreamPrintWithEquationIndexes(data->threadData, eq_indexes, "Aborting simulation due to chattering being detected and the simulation flags requesting we do not continue further.");
278281
}
279282
}
280283
}
281284

282285
listClear(eventLst);
283-
} else {
286+
}
287+
else
288+
{
284289
data->simulationInfo.chatteringInfo.lastSteps[data->simulationInfo.chatteringInfo.currentIndex]=0;
285290
/* Setting time does not matter */
286291
}
@@ -346,7 +351,8 @@ void findRoot(DATA* data, LIST *eventList, double *eventTime)
346351
assert(states_right);
347352
assert(states_left);
348353

349-
for(it=listFirstNode(eventList); it; it=listNextNode(it)) {
354+
for(it=listFirstNode(eventList); it; it=listNextNode(it))
355+
{
350356
infoStreamPrint(LOG_ZEROCROSSINGS, 0, "search for current event. Events in list: %ld", *((long*)listNodeData(it)));
351357
}
352358

@@ -360,7 +366,8 @@ void findRoot(DATA* data, LIST *eventList, double *eventTime)
360366
if(listLen(tmpEventList) == 0)
361367
{
362368
double value = fabs(data->simulationInfo.zeroCrossings[*((long*) listFirstData(eventList))]);
363-
for(it = listFirstNode(eventList); it; it = listNextNode(it)) {
369+
for(it = listFirstNode(eventList); it; it = listNextNode(it))
370+
{
364371
double fvalue = fabs(data->simulationInfo.zeroCrossings[*((long*) listNodeData(it))]);
365372
if(value > fvalue)
366373
{

SimulationRuntime/c/simulation/solver/initialization/initialization.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,6 +1139,9 @@ int initialization(DATA *data, const char* pInitMethod, const char* pOptiMethod,
11391139
initSample(data, data->simulationInfo.startTime, data->simulationInfo.stopTime);
11401140
data->callback->function_storeDelayed(data);
11411141
data->callback->function_updateRelations(data, 1);
1142+
1143+
printRelations(data, LOG_EVENTS);
1144+
printZeroCrossings(data, LOG_EVENTS);
11421145

11431146
/* valid system for the first time! */
11441147
TRACE_POP

SimulationRuntime/c/simulation/solver/model_help.c

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ void updateDiscreteSystem(DATA *data)
8585

8686
relationChanged = checkRelations(data);
8787
discreteChanged = data->callback->checkForDiscreteChanges(data);
88-
while(!initial() && (discreteChanged || data->simulationInfo.needToIterate || relationChanged))
88+
while(!data->simulationInfo.initial && (discreteChanged || data->simulationInfo.needToIterate || relationChanged))
8989
{
9090
if(data->simulationInfo.needToIterate)
9191
debugStreamPrint(LOG_EVENTS_V, 0, "reinit() call. Iteration needed!");
@@ -381,7 +381,38 @@ void printRelations(DATA *data, int stream)
381381

382382
infoStreamPrint(stream, 1, "status of relations at time=%.12g", data->localData[0]->timeValue);
383383
for(i=0; i<data->modelData.nRelations; i++)
384-
infoStreamPrint(stream, 0, "[%ld] %s = %c | pre(%s) = %c", i, data->callback->relationDescription(i), data->simulationInfo.relations[i] ? 'T' : 'F', data->callback->relationDescription(i), data->simulationInfo.relationsPre[i] ? 'T' : 'F');
384+
infoStreamPrint(stream, 0, "[%ld] %s = %c | pre(%s) = %c", i+1, data->callback->relationDescription(i), data->simulationInfo.relations[i] ? 'T' : 'F', data->callback->relationDescription(i), data->simulationInfo.relationsPre[i] ? 'T' : 'F');
385+
messageClose(stream);
386+
387+
TRACE_POP
388+
}
389+
390+
/*! \fn printZeroCrossings
391+
*
392+
* print all zero crossings
393+
*
394+
* \param [in] [data]
395+
* \param [in] [stream]
396+
*/
397+
void printZeroCrossings(DATA *data, int stream)
398+
{
399+
long i;
400+
401+
TRACE_PUSH
402+
403+
if (!ACTIVE_STREAM(stream))
404+
{
405+
TRACE_POP
406+
return;
407+
}
408+
409+
infoStreamPrint(stream, 1, "status of zero crossings at time=%.12g", data->localData[0]->timeValue);
410+
for(i=0; i<data->modelData.nZeroCrossings; i++)
411+
{
412+
int *eq_indexes;
413+
const char *exp_str = data->callback->zeroCrossingDescription(i,&eq_indexes);
414+
infoStreamPrintWithEquationIndexes(stream, 0, eq_indexes, "[%ld] %s = %g | pre(%s) = %g", i+1, exp_str, data->simulationInfo.zeroCrossings[i], exp_str, data->simulationInfo.zeroCrossingsPre[i]);
415+
}
385416
messageClose(stream);
386417

387418
TRACE_POP
@@ -949,7 +980,8 @@ void deInitializeDataStruc(DATA *data)
949980
TRACE_PUSH
950981

951982
/* prepair RingBuffer */
952-
for(i=0; i<SIZERINGBUFFER; i++){
983+
for(i=0; i<SIZERINGBUFFER; i++)
984+
{
953985
SIMULATION_DATA* tmpSimData = (SIMULATION_DATA*) data->localData[i];
954986
/* free buffer for all variable values */
955987
free(tmpSimData->realVars);

SimulationRuntime/c/simulation/solver/model_help.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ void copyStartValuestoInitValues(DATA *data);
9797

9898
void printAllVars(DATA *data, int ringSegment, int stream);
9999
void printRelations(DATA *data, int stream);
100+
void printZeroCrossings(DATA *data, int stream);
100101
void printParameters(DATA *data, int stream);
101102

102103
void overwriteOldSimulationData(DATA *data);

SimulationRuntime/c/simulation/solver/perform_simulation.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ int prefixedName_performSimulation(DATA* data, SOLVER_INFO* solverInfo)
207207
if(eventType > 0) /* event */
208208
{
209209
threadData->currentErrorStage = ERROR_EVENTSEARCH;
210-
infoStreamPrint(LOG_EVENTS, 1, "%s event at time %.12g", eventType == 1 ? "time" : "state", solverInfo->currentTime);
210+
infoStreamPrint(LOG_EVENTS, 1, "%s event at time=%.12g", eventType == 1 ? "time" : "state", solverInfo->currentTime);
211211
/* prevent emit if noEventEmit flag is used */
212212
if (!(omc_flag[FLAG_NOEVENTEMIT])) /* output left limit */
213213
sim_result.emit(&sim_result,data);

SimulationRuntime/c/util/omc_error.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,6 @@ void debugStreamPrintWithEquationIndexes(int stream, int indentNext, const int *
379379
messageFunction(LOG_TYPE_DEBUG, stream, indentNext, logBuffer, 0, indexes);
380380
}
381381
}
382-
383382
#endif
384383

385384
static inline jmp_buf* getBestJumpBuffer(threadData_t *threadData)

0 commit comments

Comments
 (0)