Skip to content

Commit eea2f4e

Browse files
author
Willi Braun
committed
[newSimulationRuntime]
- fixed csv output - fixed lookup in ringbuffer - fixed solver(euler,rungekutta) git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@10536 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 7ecc74d commit eea2f4e

File tree

5 files changed

+64
-35
lines changed

5 files changed

+64
-35
lines changed

SimulationRuntime/c/math-support/initialization.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,6 +1197,7 @@ int copyStartValuestoInitValues(_X_DATA *data, int optiMethod)
11971197
storeStartValues(data);
11981198
storePreValues(data);
11991199
storeStartValuesParam(data);
1200+
overwriteOldSimulationData(data);
12001201

12011202
return retVal;
12021203
}

SimulationRuntime/c/math-support/ringbuffer.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,14 @@ void rotateRingBuffer(RINGBUFFER *rb, int n, void **lookup)
126126
ASSERT(rb->nElements > 0, "empty RingBuffer");
127127
ASSERT3(n < rb->nElements, "index [%d] out of range [%d:%d]", n, 0, rb->nElements-1);
128128
ASSERT3(0 <= n, "index [%d] out of range [%d:%d]", n, 0, rb->nElements-1);
129+
129130
rb->firstElement = (rb->firstElement+n)%rb->bufferSize;
130131

131132
if(lookup)
132133
{
133-
for(i=0; i<rb->nElements; ++i)
134-
lookup[i] = getRingData(rb, i);
134+
for(i=0; i<rb->nElements; ++i){
135+
lookup[i] = getRingData(rb, (rb->firstElement+i)%rb->bufferSize);
136+
}
135137
}
136138
}
137139

SimulationRuntime/c/simulation/results/simulation_result_csv.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void simulation_result_csv::emit(_X_DATA *data)
5757
const char* formatbool = "%i,";
5858
const char* formatstring = "\"%s\",";
5959
rt_tick(SIM_TIMER_OUTPUT);
60-
fprintf(fout, format, globalData->timeValue);
60+
fprintf(fout, format, data->localData[0]->time);
6161

6262
for (int i = 0; i < data->modelData.nVariablesReal; i++) if (!data->modelData.realData[i].filterOutput)
6363
fprintf(fout, format, (data->localData[0])->realVars[i]);

SimulationRuntime/c/simulation/simulation_runtime.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,12 @@ void overwriteOldSimulationData(_X_DATA *data)
385385
{
386386
long i;
387387

388-
for(i=1; i<ringBufferLength(data->simulationData); ++i)
389-
memcpy(getRingData(data->simulationData, 0), getRingData(data->simulationData, 1), sizeof(SIMULATION_DATA));
388+
for(i=1; i<ringBufferLength(data->simulationData); ++i){
389+
memcpy(data->localData[i]->realVars, data->localData[i-1]->realVars, sizeof(modelica_real)*data->modelData.nVariablesReal);
390+
memcpy(data->localData[i]->integerVars, data->localData[i-1]->integerVars, sizeof(modelica_integer)*data->modelData.nVariablesInteger);
391+
memcpy(data->localData[i]->booleanVars, data->localData[i-1]->booleanVars, sizeof(modelica_boolean)*data->modelData.nVariablesBoolean);
392+
memcpy(data->localData[i]->stringVars, data->localData[i-1]->stringVars, sizeof(modelica_string)*data->modelData.nVariablesString);
393+
}
390394
}
391395

392396
/** function restoreExtrapolationDataOld

SimulationRuntime/c/simulation/solver/solver_main.c

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -63,48 +63,48 @@ const double rungekutta_b[4] = { 1.0 / 6.0, 1.0 / 3.0, 1.0 / 3.0, 1.0 / 6.0 };
6363
const double rungekutta_c[4] = { 0.0, 0.5, 0.5, 1.0 };
6464

6565

66-
/*! \fn void printAllVars(_X_DATA *data)
66+
/*! \fn void printAllVars(_X_DATA *data, int )
6767
*
68-
* prints all values
68+
* prints all values as arguments it need data
69+
* and which part of the ring should printed.
6970
*
7071
* author: wbraun
7172
*/
72-
void printAllVars(_X_DATA *data)
73+
void printAllVars(_X_DATA *data, int ringSegment)
7374
{
7475
long i;
75-
SIMULATION_DATA *sData = (SIMULATION_DATA*)getRingData(data->simulationData, 0);
7676
MODEL_DATA *mData = &(data->modelData);
7777
INFO("all real variables");
7878
for(i=0; i<mData->nVariablesReal; ++i){
79-
INFO2("sData->realVars[%ld] = %g",i,sData->realVars[i]);
79+
INFO2("localData->realVars[%ld] = %g",i,data->localData[ringSegment]->realVars[i]);
8080
}
8181
INFO("all integer variables");
8282
for(i=0; i<mData->nVariablesInteger; ++i){
83-
INFO2("sData->integerVars[%ld] = %ld",i,sData->integerVars[i]);
83+
INFO2("localData->integerVars[%ld] = %ld",i,data->localData[ringSegment]->integerVars[i]);
8484
}
8585
INFO("all boolean variables");
8686
for(i=0; i<mData->nVariablesBoolean; ++i){
87-
INFO2("sData->booleanVars[%ld] = %s",i,sData->booleanVars[i]?"true":"false");
87+
INFO2("localData->booleanVars[%ld] = %s",i,data->localData[ringSegment]->booleanVars[i]?"true":"false");
8888
}
8989
INFO("all string variables");
9090
for(i=0; i<mData->nVariablesString; ++i){
91-
INFO2("sData->stringVars[%ld] = %s",i,sData->stringVars[i]);
91+
INFO2("localData->stringVars[%ld] = %s",i,data->localData[ringSegment]->stringVars[i]);
9292
}
9393
INFO("all real parameters");
9494
for(i=0; i<mData->nParametersReal; ++i){
95-
INFO2("sData->realParameter[%ld] = %g",i,mData->realParameter[i].attribute.initial);
95+
INFO2("mData->realParameter[%ld] = %g",i,mData->realParameter[i].attribute.initial);
9696
}
9797
INFO("all integer parameters");
9898
for(i=0; i<mData->nParametersInteger; ++i){
99-
INFO2("sData->integerParameter[%ld] = %ld",i,mData->integerParameter[i].attribute.initial);
99+
INFO2("mData->integerParameter[%ld] = %ld",i,mData->integerParameter[i].attribute.initial);
100100
}
101101
INFO("all boolean parameters");
102102
for(i=0; i<mData->nParametersBoolean; ++i){
103-
INFO2("sData->booleanParameter[%ld] = %s",i,mData->booleanParameter[i].attribute.initial?"true":"false");
103+
INFO2("mData->booleanParameter[%ld] = %s",i,mData->booleanParameter[i].attribute.initial?"true":"false");
104104
}
105105
INFO("all string parameters");
106106
for(i=0; i<mData->nParametersString; ++i){
107-
INFO2("sData->stringParameter[%ld] = %s",i,mData->stringParameter[i].attribute.initial);
107+
INFO2("mData->stringParameter[%ld] = %s",i,mData->stringParameter[i].attribute.initial);
108108
}
109109

110110
}
@@ -190,11 +190,15 @@ solver_main(_X_DATA* simData, double start, double stop, double step, long outpu
190190

191191
if (simInfo->numSteps > 0) { /* Use outputSteps if set, otherwise use step size. */
192192
simInfo->stepSize = (simInfo->stopTime - simInfo->startTime) / simInfo->numSteps;
193+
DEBUG_INFO1(LV_SOLVER,"Step size calculated = %g", simInfo->stepSize);
193194
} else {
194195
if (simInfo->stepSize == 0) { /* outputsteps not defined and zero step, use default 1e-3 */
195-
simInfo->stepSize = 1e-3;
196+
simInfo->stepSize = 2e-3;
197+
DEBUG_INFO1(LV_SOLVER,"Set step size on default value = %g", simInfo->stepSize);
196198
}
199+
DEBUG_INFO1(LV_SOLVER,"Step size is set = %g", simInfo->stepSize);
197200
}
201+
198202
/* initial solverInfo */
199203
solverInfo.currentTime = simInfo->startTime;
200204
solverInfo.currentStepSize = simInfo->stepSize;
@@ -218,7 +222,7 @@ solver_main(_X_DATA* simData, double start, double stop, double step, long outpu
218222
globalData->terminal = 0;
219223
globalData->oldTime = simInfo->startTime;
220224
globalData->timeValue = simInfo->startTime;
221-
sData->time = 0;
225+
sData->time = simInfo->startTime;
222226

223227

224228
switch (flag) {
@@ -282,8 +286,13 @@ solver_main(_X_DATA* simData, double start, double stop, double step, long outpu
282286
}
283287

284288
/* debug print */
285-
if (DEBUG_FLAG(LOG_SOLVER))
286-
printAllVars(simData);
289+
if (DEBUG_FLAG(LOG_SOLVER)){
290+
for (i=0; i<3;i++){
291+
INFO1("Print values for buffer segment = %d",i);
292+
printAllVars(simData,i);
293+
}
294+
}
295+
287296
/*if (initialization(init_initMethod ? init_initMethod->c_str() : NULL,
288297
init_optiMethod ? init_optiMethod->c_str() : NULL)) {
289298
THROW("Error in initialization. Storing results and exiting.");
@@ -331,6 +340,14 @@ solver_main(_X_DATA* simData, double start, double stop, double step, long outpu
331340
return 0;
332341
}
333342

343+
/* debug print */
344+
if (DEBUG_FLAG(LOG_SOLVER)){
345+
for (i=0; i<3;i++){
346+
INFO1("Print values for buffer segment = %d",i);
347+
printAllVars(simData,i);
348+
}
349+
}
350+
334351
DEBUG_INFO(LV_SOLVER, "Performed initial value calculation.");
335352
DEBUG_INFO2(LV_SOLVER, "Start numerical solver from %g to %g", sData->time, simInfo->stopTime);
336353

@@ -350,6 +367,10 @@ solver_main(_X_DATA* simData, double start, double stop, double step, long outpu
350367
* Start main simulation loop
351368
*/
352369
while (solverInfo.currentTime < simInfo->stopTime) {
370+
371+
/* rotate RingBuffer before step is calculated */
372+
rotateRingBuffer(simData->simulationData, 1, simData->localData);
373+
353374
if (measure_time_flag) {
354375
for (i = 0; i < globalData->nFunctions + globalData->nProfileBlocks; i++)
355376
rt_clear(i + SIM_TIMER_FIRST_FUNCTION);
@@ -488,20 +509,21 @@ solver_main(_X_DATA* simData, double start, double stop, double step, long outpu
488509

489510
DEBUG_INFO1(LV_SOLVER, "** Step to %g Done!", solverInfo.currentTime);
490511
/* debug print */
491-
if (DEBUG_FLAG(LOG_SOLVER))
492-
printAllVars(simData);
493-
/* rotated Ring buffer when Step is done */
494-
rotateRingBuffer(simData->simulationData, 1, NULL);
495-
512+
if (DEBUG_FLAG(LOG_SOLVER)){
513+
for (i=0; i<3;i++){
514+
INFO1("Print values for buffer segment = %d",i);
515+
printAllVars(simData,i);
516+
}
517+
}
496518
}
497519

498520

499521
/* Last step with terminal()=true */
500-
if (globalData->timeValue >= stop) {
501-
globalData->terminal = 1;
522+
if (solverInfo.currentTime >= stop) {
523+
simData->simulationInfo.terminal = 1;
502524
update_DAEsystem(simData);
503525
sim_result_emit(simData);
504-
globalData->terminal = 0;
526+
simData->simulationInfo.terminal = 0;
505527
}
506528
communicateStatus("Finished", 1);
507529

@@ -543,13 +565,13 @@ int
543565
euler_ex_step(_X_DATA* simData, SOLVER_INFO* solverInfo) {
544566
int i;
545567
SIMULATION_DATA *sData = (SIMULATION_DATA*)simData->localData[0];
546-
modelica_real* stateDer = sData->realVars + simData->modelData.nStates;
568+
SIMULATION_DATA *sDataOld = (SIMULATION_DATA*)simData->localData[1];
569+
modelica_real* stateDer = sDataOld->realVars + simData->modelData.nStates;
547570

548-
sData->time += solverInfo->currentStepSize;
549571
for (i = 0; i < simData->modelData.nStates; i++) {
550-
sData->realVars[i] += stateDer[i] * solverInfo->currentStepSize;
572+
sData->realVars[i] = sDataOld->realVars[i] + stateDer[i] * solverInfo->currentStepSize;
551573
}
552-
sData->time += solverInfo->currentStepSize;
574+
sData->time = sDataOld->time + solverInfo->currentStepSize;
553575
functionODE(simData);
554576
solverInfo->currentTime += solverInfo->currentStepSize;
555577
return 0;
@@ -579,7 +601,7 @@ rungekutta_step(_X_DATA* simData, SOLVER_INFO* solverInfo) {
579601
for (i = 0; i < simData->modelData.nStates; i++) {
580602
sData->realVars[i] = backupstates[i] + solverInfo->currentStepSize * rungekutta_c[j] * k[j - 1][i];
581603
}
582-
sData->time += sDataOld->time + rungekutta_c[j] * solverInfo->currentStepSize;
604+
sData->time = sDataOld->time + rungekutta_c[j] * solverInfo->currentStepSize;
583605
functionODE(simData);
584606
for (i = 0; i < simData->modelData.nStates; i++) {
585607
k[j][i] = stateDer[i];
@@ -593,7 +615,7 @@ rungekutta_step(_X_DATA* simData, SOLVER_INFO* solverInfo) {
593615
}
594616
sData->realVars[i] = backupstates[i] + solverInfo->currentStepSize * sum;
595617
}
596-
sData->time += sDataOld->time + solverInfo->currentStepSize;
618+
sData->time = sDataOld->time + solverInfo->currentStepSize;
597619
functionODE(simData);
598620
solverInfo->currentTime += solverInfo->currentStepSize;
599621
return 0;

0 commit comments

Comments
 (0)