@@ -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 };
6363const 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
543565euler_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