Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit ec459e7

Browse files
sjoelundOpenModelica-Hudson
authored andcommitted
Add more timers for solvers
- dassl, ida, euler, rungekutta (default) now have a timer for the solver itself to separate generated and solver code slightly. - Added timer for functionDAE Belonging to [master]: - #3007
1 parent 53c7613 commit ec459e7

File tree

5 files changed

+88
-19
lines changed

5 files changed

+88
-19
lines changed

Compiler/Template/CodegenC.tpl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4104,8 +4104,16 @@ template evaluateDAEResiduals(list<list<SimEqSystem>> resEquations, String model
41044104
int evalStages;
41054105
data->simulationInfo->callStatistics.functionEvalDAE++;
41064106
4107+
#if !defined(OMC_MINIMAL_RUNTIME)
4108+
<% if profileFunctions() then "" else "if (measure_time_flag) " %>rt_tick(SIM_TIMER_DAE);
4109+
#endif
4110+
41074111
<%eqCalls%>
41084112
4113+
#if !defined(OMC_MINIMAL_RUNTIME)
4114+
<% if profileFunctions() then "" else "if (measure_time_flag) " %>rt_accumulate(SIM_TIMER_DAE);
4115+
#endif
4116+
41094117
TRACE_POP
41104118
return 0;
41114119
}
@@ -4229,6 +4237,9 @@ template functionDAE(list<SimEqSystem> allEquationsPlusWhen, String modelNamePre
42294237
TRACE_PUSH
42304238
int equationIndexes[1] = {0};<%/*reinits may use equation indexes, even though it has no equation...*/%>
42314239
<%addRootsTempArray()%>
4240+
#if !defined(OMC_MINIMAL_RUNTIME)
4241+
<% if profileFunctions() then "" else "if (measure_time_flag) " %>rt_tick(SIM_TIMER_DAE);
4242+
#endif !defined(OMC_MINIMAL_RUNTIME)
42324243
42334244
data->simulationInfo->needToIterate = 0;
42344245
data->simulationInfo->discreteCall = 1;
@@ -4237,6 +4248,9 @@ template functionDAE(list<SimEqSystem> allEquationsPlusWhen, String modelNamePre
42374248
else fncalls %>
42384249
data->simulationInfo->discreteCall = 0;
42394250
4251+
#if !defined(OMC_MINIMAL_RUNTIME)
4252+
<% if profileFunctions() then "" else "if (measure_time_flag) " %>rt_accumulate(SIM_TIMER_DAE);
4253+
#endif !defined(OMC_MINIMAL_RUNTIME)
42404254
TRACE_POP
42414255
return 0;
42424256
}

SimulationRuntime/c/simulation/solver/dassl.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,8 @@ int dassl_step(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo)
486486

487487
MODEL_DATA *mData = (MODEL_DATA*) data->modelData;
488488

489+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
490+
489491
memcpy(stateDer, data->localData[1]->realVars + data->modelData->nStates, sizeof(double)*data->modelData->nStates);
490492

491493
dasslData->rpar[0] = (double*) (void*) data;
@@ -557,9 +559,11 @@ int dassl_step(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo)
557559
/* rhs final flag is FALSE during for dassl evaluation */
558560
RHSFinalFlag = 0;
559561

562+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
560563
/* read input vars */
561564
externalInputUpdate(data);
562565
data->callback->input_function(data, threadData);
566+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
563567

564568
DDASKR(dasslData->residualFunction, (int*) &dasslData->N,
565569
&solverInfo->currentTime, states, stateDer, &tout,
@@ -664,6 +668,7 @@ int dassl_step(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo)
664668
}
665669

666670
infoStreamPrint(LOG_DASSL, 0, "Finished DASSL step.");
671+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
667672

668673
TRACE_POP
669674
return retVal;
@@ -747,6 +752,7 @@ int functionODE_residual(double *t, double *y, double *yd, double* cj, double *d
747752
int saveJumpState;
748753
int success = 0;
749754

755+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
750756
if (measure_time_flag) rt_tick(SIM_TIMER_RESIDUALS);
751757

752758
if (data->simulationInfo->currentContext == CONTEXT_ALGEBRAIC)
@@ -799,6 +805,7 @@ int functionODE_residual(double *t, double *y, double *yd, double* cj, double *d
799805
}
800806

801807
if (measure_time_flag) rt_accumulate(SIM_TIMER_RESIDUALS);
808+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
802809

803810
TRACE_POP
804811
return 0;
@@ -815,6 +822,7 @@ int function_ZeroCrossingsDASSL(int *neqm, double *t, double *y, double *yp,
815822
double timeBackup;
816823
int saveJumpState;
817824

825+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
818826
if (measure_time_flag) rt_tick(SIM_TIMER_EVENT);
819827

820828
if (data->simulationInfo->currentContext == CONTEXT_ALGEBRAIC)
@@ -844,6 +852,7 @@ int function_ZeroCrossingsDASSL(int *neqm, double *t, double *y, double *yp,
844852
}
845853

846854
if (measure_time_flag) rt_accumulate(SIM_TIMER_EVENT);
855+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
847856

848857
TRACE_POP
849858
return 0;
@@ -1091,6 +1100,7 @@ static int callJacobian(double *t, double *y, double *yprime, double *deltaD, do
10911100
threadData_t *threadData = (threadData_t*)(void*)((double**)rpar)[2];
10921101

10931102
/* profiling */
1103+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
10941104
rt_tick(SIM_TIMER_JACOBIAN);
10951105

10961106
if(dasslData->jacobianFunction(t, y, yprime, deltaD, pd, cj, h, wt, rpar, ipar))
@@ -1100,9 +1110,6 @@ static int callJacobian(double *t, double *y, double *yprime, double *deltaD, do
11001110
return 1;
11011111
}
11021112

1103-
/* profiling */
1104-
rt_accumulate(SIM_TIMER_JACOBIAN);
1105-
11061113
/* debug */
11071114
if (ACTIVE_STREAM(LOG_JAC)){
11081115
_omc_matrix* dumpJac = _omc_createMatrix(dasslData->N, dasslData->N, pd);
@@ -1119,6 +1126,10 @@ static int callJacobian(double *t, double *y, double *yprime, double *deltaD, do
11191126
/* set context for the start values extrapolation of non-linear algebraic loops */
11201127
unsetContext(data);
11211128

1129+
/* profiling */
1130+
rt_accumulate(SIM_TIMER_JACOBIAN);
1131+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
1132+
11221133
TRACE_POP
11231134
return 0;
11241135
}

SimulationRuntime/c/simulation/solver/ida_solver.c

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ ida_solver_initial(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo
162162
idaData->residualFunction = residualFunctionIDA;
163163
idaData->N = (long int)data->modelData->nStates;
164164

165+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
165166

166167
/* change parameter for DAE mode */
167168
if (compiledInDAEMode)
@@ -660,6 +661,8 @@ ida_solver_initial(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo
660661
}
661662
messageClose(LOG_SOLVER);
662663

664+
if (measure_time_flag) rt_clear(SIM_TIMER_SOLVER); /* Initialization should not add this timer... */
665+
663666
free(tmp);
664667
TRACE_POP
665668
return 0;
@@ -719,8 +722,10 @@ ida_event_update(DATA* data, threadData_t *threadData)
719722
memcpy(idaData->statesDer, data->localData[0]->realVars + data->modelData->nStates, sizeof(double)*data->modelData->nStates);
720723

721724
/* update inner algebraic get new values from data */
725+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
722726
evaluateDAEResiduals_wrapperEventUpdate(data, threadData);
723727
getAlgebraicDAEVars(data, idaData->states + data->modelData->nStates);
728+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
724729

725730
infoStreamPrint(LOG_SOLVER, 0, "##IDA## do event update at %.15g", data->localData[0]->timeValue);
726731
flag = IDAReInit(idaData->ida_mem,
@@ -763,19 +768,23 @@ ida_event_update(DATA* data, threadData_t *threadData)
763768
IDAGetConsistentIC(idaData->ida_mem, idaData->y, idaData->yp);
764769

765770
/* update inner algebraic variables */
771+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
766772
evaluateDAEResiduals_wrapperEventUpdate(data, threadData);
767773

768774
memcpy(data->localData[0]->realVars, idaData->states, sizeof(double)*data->modelData->nStates);
769775
// and also algebraic vars
770776
setAlgebraicDAEVars(data, idaData->states + data->modelData->nStates);
771777
memcpy(data->localData[0]->realVars + data->modelData->nStates, idaData->statesDer, sizeof(double)*data->modelData->nStates);
778+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
772779

773780
/* reset initial step size again to default */
774781
IDASetInitStep(idaData->ida_mem, 0.0);
775782
}
776783
}
777784
else{
785+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
778786
data->callback->functionDAE(data, threadData);
787+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
779788
}
780789
}
781790

@@ -793,6 +802,8 @@ ida_solver_step(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo)
793802
int stepsMode;
794803
int restartAfterLSFail = 0;
795804

805+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
806+
796807
IDA_SOLVER *idaData = (IDA_SOLVER*) solverInfo->solverData;
797808

798809
SIMULATION_DATA *sData = data->localData[0];
@@ -895,6 +906,7 @@ ida_solver_step(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo)
895906
NV_Ith_S(idaData->y, i) = NV_Ith_S(idaData->y, i) + NV_Ith_S(idaData->yp, i) * solverInfo->currentStepSize;
896907
}
897908
sData->timeValue = solverInfo->currentTime + solverInfo->currentStepSize;
909+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
898910
data->callback->functionODE(data, threadData);
899911
solverInfo->currentTime = sData->timeValue;
900912

@@ -932,9 +944,11 @@ ida_solver_step(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo)
932944
{
933945
infoStreamPrint(LOG_SOLVER, 1, "##IDA## new step from %.15g to %.15g", solverInfo->currentTime, tout);
934946

947+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
935948
/* read input vars */
936949
externalInputUpdate(data);
937950
data->callback->input_function(data, threadData);
951+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
938952

939953
if (omc_flag[FLAG_IDA_SCALING])
940954
{
@@ -1123,6 +1137,7 @@ ida_solver_step(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo)
11231137
}
11241138

11251139
infoStreamPrint(LOG_SOLVER, 0, "##IDA## Finished Integrator step.");
1140+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
11261141

11271142
TRACE_POP
11281143
return retVal;
@@ -1191,13 +1206,17 @@ int residualFunctionIDA(double time, N_Vector yy, N_Vector yp, N_Vector res, voi
11911206
}
11921207

11931208
/* read input vars */
1209+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
11941210
externalInputUpdate(data);
11951211
data->callback->input_function(data, threadData);
1212+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
11961213

11971214
if (idaData->daeMode)
11981215
{
11991216
/* eval residual vars */
1217+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
12001218
data->simulationInfo->daeModeData->evaluateDAEResiduals(data, threadData, EVAL_DYNAMIC);
1219+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
12011220
/* get residual variables */
12021221
for(i=0; i < idaData->N; i++)
12031222
{
@@ -1208,7 +1227,9 @@ int residualFunctionIDA(double time, N_Vector yy, N_Vector yp, N_Vector res, voi
12081227
else
12091228
{
12101229
/* eval function ODE */
1230+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
12111231
data->callback->functionODE(data, threadData);
1232+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
12121233
for(i=0; i < idaData->N; i++)
12131234
{
12141235
NV_Ith_S(res, i) = data->localData[0]->realVars[data->modelData->nStates + i] - NV_Ith_S(yp, i);
@@ -1241,6 +1262,7 @@ int residualFunctionIDA(double time, N_Vector yy, N_Vector yp, N_Vector res, voi
12411262
unsetContext(data);
12421263
}
12431264
messageClose(LOG_SOLVER_V);
1265+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
12441266

12451267
TRACE_POP
12461268
return retVal;
@@ -1283,6 +1305,7 @@ int rootsFunctionIDA(double time, N_Vector yy, N_Vector yp, double *gout, void*
12831305
data->localData[0]->timeValue = time;
12841306

12851307
/* read input vars */
1308+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
12861309
externalInputUpdate(data);
12871310
data->callback->input_function(data, threadData);
12881311
/* eval needed equations*/
@@ -1295,6 +1318,7 @@ int rootsFunctionIDA(double time, N_Vector yy, N_Vector yp, double *gout, void*
12951318
}
12961319

12971320
data->callback->function_ZeroCrossings(data, threadData, gout);
1321+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
12981322

12991323
threadData->currentErrorStage = saveJumpState;
13001324

@@ -1308,6 +1332,7 @@ int rootsFunctionIDA(double time, N_Vector yy, N_Vector yp, double *gout, void*
13081332
unsetContext(data);
13091333
}
13101334
messageClose(LOG_SOLVER_V);
1335+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
13111336

13121337
TRACE_POP
13131338
return 0;
@@ -1493,6 +1518,7 @@ static int callDenseJacobian(long int Neq, double tt, double cj,
14931518
int retVal;
14941519

14951520
/* profiling */
1521+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
14961522
rt_tick(SIM_TIMER_JACOBIAN);
14971523

14981524
if (idaData->jacobianMethod == COLOREDNUMJAC || idaData->jacobianMethod == NUMJAC)
@@ -1508,9 +1534,6 @@ static int callDenseJacobian(long int Neq, double tt, double cj,
15081534
throwStreamPrint(threadData, "##IDA## Something goes wrong while obtain jacobian matrix!");
15091535
}
15101536

1511-
/* profiling */
1512-
rt_accumulate(SIM_TIMER_JACOBIAN);
1513-
15141537
/* debug */
15151538
if (ACTIVE_STREAM(LOG_JAC)){
15161539
_omc_matrix* dumpJac = _omc_createMatrix(idaData->N, idaData->N, Jac->data);
@@ -1528,6 +1551,10 @@ static int callDenseJacobian(long int Neq, double tt, double cj,
15281551
}
15291552
}
15301553

1554+
/* profiling */
1555+
rt_accumulate(SIM_TIMER_JACOBIAN);
1556+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
1557+
15311558
TRACE_POP
15321559
return retVal;
15331560
}
@@ -1775,6 +1802,7 @@ static int callSparseJacobian(double tt, double cj,
17751802
threadData_t* threadData = (threadData_t*)(((IDA_USERDATA*)((IDA_SOLVER*)user_data)->simData)->threadData);
17761803

17771804
/* profiling */
1805+
if (measure_time_flag) rt_accumulate(SIM_TIMER_SOLVER);
17781806
rt_tick(SIM_TIMER_JACOBIAN);
17791807

17801808
if (idaData->jacobianMethod == COLOREDSYMJAC || idaData->jacobianMethod == SYMJAC)
@@ -1786,9 +1814,6 @@ static int callSparseJacobian(double tt, double cj,
17861814
retVal = jacoColoredNumericalSparse(tt, yy, yp, rr, Jac, cj, user_data);
17871815
}
17881816

1789-
/* profiling */
1790-
rt_accumulate(SIM_TIMER_JACOBIAN);
1791-
17921817
/* debug */
17931818
if (ACTIVE_STREAM(LOG_JAC)){
17941819
infoStreamPrint(LOG_JAC, 0, "##IDA## Sparse Matrix A.");
@@ -1808,6 +1833,10 @@ static int callSparseJacobian(double tt, double cj,
18081833
SlsAddMat(Jac, idaData->tmpJac);
18091834
}
18101835

1836+
/* profiling */
1837+
rt_accumulate(SIM_TIMER_JACOBIAN);
1838+
if (measure_time_flag) rt_tick(SIM_TIMER_SOLVER);
1839+
18111840
TRACE_POP
18121841
return retVal;
18131842
}

0 commit comments

Comments
 (0)