Skip to content

Commit

Permalink
- added debug outputs for dassl evaluation context
Browse files Browse the repository at this point in the history
 - added simulation runtime flag LOG_DASSL_STATS, which outputs current states vector


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@24108 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Willi Braun committed Jan 20, 2015
1 parent 7df0eb8 commit 6daf323
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 5 deletions.
89 changes: 85 additions & 4 deletions SimulationRuntime/c/simulation/solver/dassl.c
Expand Up @@ -123,14 +123,38 @@ dummy_precondition(int *neq, double *t, double *y, double *yprime, double *savr,
return 0;
}


static int continue_DASSL(int* idid, double* tolarence);


enum EVAL_CONTEXT
{
CONTEXT_UNKNOWN = 0,

CONTEXT_ODE,
CONTEXT_JACOBIAN,
CONTEXT_EVENTS,

CONTEXT_MAX
};

const char *context_string[CONTEXT_MAX] = {
"context UNKNOWN",
"context ODE evaluation",
"context Jacobian",
"context Event Search"
};

void setDasslContext(DASSL_DATA* dasslData, double* currentTime, int currentContext){
dasslData->currentContextOld = dasslData->currentContext;
dasslData->currentContext = currentContext;
infoStreamPrint(LOG_DASSL, 0, "+++ Set DASSL %s +++ at time %f", context_string[dasslData->currentContext], *currentTime);
}
void unsetDasslContext(DASSL_DATA* dasslData){
infoStreamPrint(LOG_DASSL, 0, "--- Unset DASSL %s ---", context_string[dasslData->currentContext]);
dasslData->currentContext = dasslData->currentContextOld;
}

/* function for calculating state values on residual form */
static int functionODE_residual(double *t, double *x, double *xprime, double *cj, double *delta, int *ires, double *rpar, int* ipar);

/* function for calculating zeroCrossings */
static int function_ZeroCrossingsDASSL(int *neqm, double *t, double *y, double *yp,
int *ng, double *gout, double *rpar, int* ipar);
Expand Down Expand Up @@ -175,6 +199,8 @@ int dassl_initial(DATA* data, SOLVER_INFO* solverInfo, DASSL_DATA *dasslData)
dasslData->newdelta = (double*) malloc(data->modelData.nStates*sizeof(double));
dasslData->stateDer = (double*) malloc(data->modelData.nStates*sizeof(double));

dasslData->currentContext = CONTEXT_UNKNOWN;

/* setup internal ring buffer for dassl */

/* RingBuffer */
Expand Down Expand Up @@ -438,6 +464,29 @@ int dassl_deinitial(DASSL_DATA *dasslData)
return 0;
}

/* \fn printCurrentStatesVector(int logLevel, double* y, DATA* data)
*
* \param [in] [logLevel]
* \param [in] [states]
* \param [ref] [Data]
*
* This function outputs states vector.
*
*/
int printCurrentStatesVector(int logLevel, double* states, DATA* data){
int i;
infoStreamPrint(logLevel, 1, "States: ");
for(i=0;i<data->modelData.nStates;++i)
{
infoStreamPrint(logLevel, 0, " %d. %s = %f ", i+1, data->modelData.realVarsData[i].info.name, states[i]);
}
messageClose(logLevel);

return 0;
}



/**********************************************************************************************
* DASSL with synchronous treating of when equation
* - without integrated ZeroCrossing method.
Expand Down Expand Up @@ -727,6 +776,7 @@ int functionODE_residual(double *t, double *y, double *yd, double* cj, double *d
int *ires, double *rpar, int *ipar)
{
DATA* data = (DATA*)(void*)((double**)rpar)[0];
DASSL_DATA* dasslData = (DASSL_DATA*)(void*)((double**)rpar)[1];
threadData_t *threadData = data->threadData;

double timeBackup;
Expand All @@ -735,6 +785,10 @@ int functionODE_residual(double *t, double *y, double *yd, double* cj, double *d
int success = 0;

TRACE_PUSH
if (dasslData->currentContext == CONTEXT_UNKNOWN){
setDasslContext(dasslData, t, CONTEXT_ODE);
printCurrentStatesVector(LOG_DASSL_STATES, y, data);
}

timeBackup = data->localData[0]->timeValue;
data->localData[0]->timeValue = *t;
Expand Down Expand Up @@ -773,6 +827,10 @@ int functionODE_residual(double *t, double *y, double *yd, double* cj, double *d

data->localData[0]->timeValue = timeBackup;

if (dasslData->currentContext == CONTEXT_ODE){
unsetDasslContext(dasslData);
}

TRACE_POP
return 0;
}
Expand All @@ -781,11 +839,15 @@ int function_ZeroCrossingsDASSL(int *neqm, double *t, double *y, double *yp,
int *ng, double *gout, double *rpar, int* ipar)
{
DATA* data = (DATA*)(void*)((double**)rpar)[0];
DASSL_DATA* dasslData = (DASSL_DATA*)(void*)((double**)rpar)[1];

double timeBackup;
int saveJumpState;

TRACE_PUSH
if (dasslData->currentContext == CONTEXT_UNKNOWN){
setDasslContext(dasslData, t, CONTEXT_EVENTS);
}

saveJumpState = data->threadData->currentErrorStage;
data->threadData->currentErrorStage = ERROR_EVENTSEARCH;
Expand All @@ -804,6 +866,10 @@ int function_ZeroCrossingsDASSL(int *neqm, double *t, double *y, double *yp,
data->threadData->currentErrorStage = saveJumpState;
data->localData[0]->timeValue = timeBackup;

if (dasslData->currentContext == CONTEXT_EVENTS){
unsetDasslContext(dasslData);
}

TRACE_POP
return 0;
}
Expand Down Expand Up @@ -929,17 +995,19 @@ static int JacobianSymbolicColored(double *t, double *y, double *yprime, double
double *rpar, int* ipar)
{
DATA* data = (DATA*)(void*)((double**)rpar)[0];
DASSL_DATA* dasslData = (DASSL_DATA*)(void*)((double**)rpar)[1];
double* backupStates;
double timeBackup;
int i;
int j;

TRACE_PUSH

setDasslContext(dasslData, t, CONTEXT_JACOBIAN);

backupStates = data->localData[0]->realVars;
timeBackup = data->localData[0]->timeValue;


data->localData[0]->timeValue = *t;
data->localData[0]->realVars = y;
/* read input vars */
Expand All @@ -958,6 +1026,8 @@ static int JacobianSymbolicColored(double *t, double *y, double *yprime, double
}
data->localData[0]->realVars = backupStates;
data->localData[0]->timeValue = timeBackup;

unsetDasslContext(dasslData);

TRACE_POP
return 0;
Expand All @@ -970,13 +1040,16 @@ static int JacobianSymbolic(double *t, double *y, double *yprime, double *deltaD
double *rpar, int* ipar)
{
DATA* data = (DATA*)(void*)((double**)rpar)[0];
DASSL_DATA* dasslData = (DASSL_DATA*)(void*)((double**)rpar)[1];
double* backupStates;
double timeBackup;
int i;
int j;

TRACE_PUSH

setDasslContext(dasslData, t, CONTEXT_JACOBIAN);

backupStates = data->localData[0]->realVars;
timeBackup = data->localData[0]->timeValue;

Expand All @@ -998,6 +1071,8 @@ static int JacobianSymbolic(double *t, double *y, double *yprime, double *deltaD
}
data->localData[0]->realVars = backupStates;
data->localData[0]->timeValue = timeBackup;

unsetDasslContext(dasslData);

TRACE_POP
return 0;
Expand Down Expand Up @@ -1071,8 +1146,10 @@ static int JacobianOwnNum(double *t, double *y, double *yprime, double *deltaD,
{
int i,j;
DATA* data = (DATA*)(void*)((double**)rpar)[0];
DASSL_DATA* dasslData = (DASSL_DATA*)(void*)((double**)rpar)[1];

TRACE_PUSH
setDasslContext(dasslData, t, CONTEXT_JACOBIAN);

if(jacA_num(data, t, y, yprime, deltaD, pd, cj, h, wt, rpar, ipar))
{
Expand All @@ -1087,6 +1164,7 @@ static int JacobianOwnNum(double *t, double *y, double *yprime, double *deltaD,
pd[j] -= (double) *cj;
j += data->modelData.nStates + 1;
}
unsetDasslContext(dasslData);

TRACE_POP
return 0;
Expand Down Expand Up @@ -1177,9 +1255,11 @@ static int JacobianOwnNumColored(double *t, double *y, double *yprime, double *d
double *rpar, int* ipar)
{
DATA* data = (DATA*)(void*)((double**)rpar)[0];
DASSL_DATA* dasslData = (DASSL_DATA*)(void*)((double**)rpar)[1];
int i,j;

TRACE_PUSH
setDasslContext(dasslData, t, CONTEXT_JACOBIAN);

if(jacA_numColored(data, t, y, yprime, deltaD, pd, cj, h, wt, rpar, ipar))
{
Expand All @@ -1195,6 +1275,7 @@ static int JacobianOwnNumColored(double *t, double *y, double *yprime, double *d
pd[j] -= (double) *cj;
j += data->modelData.nStates + 1;
}
unsetDasslContext(dasslData);

TRACE_POP
return 0;
Expand Down
5 changes: 4 additions & 1 deletion SimulationRuntime/c/simulation/solver/dassl.h
Expand Up @@ -61,6 +61,10 @@ typedef struct DASSL_DATA{
unsigned int* dasslStatistics;
unsigned int* dasslStatisticsTmp;

/* current context evaulation */
int currentContext;
int currentContextOld;

int* info;

int idid;
Expand Down Expand Up @@ -98,7 +102,6 @@ typedef struct DASSL_DATA{
int
dassl_step(DATA* simData, SOLVER_INFO* solverInfo);


/* initial main dassl Data */
int
dassl_initial(DATA* simData, SOLVER_INFO* solverInfo, DASSL_DATA *dasslData);
Expand Down
2 changes: 2 additions & 0 deletions SimulationRuntime/c/util/omc_error.c
Expand Up @@ -42,6 +42,7 @@ const char *LOG_STREAM_NAME[SIM_LOG_MAX] = {
"assert",

"LOG_DASSL",
"LOG_DASSL_STATES",
"LOG_DEBUG",
"LOG_DSS",
"LOG_DSS_JAC",
Expand Down Expand Up @@ -81,6 +82,7 @@ const char *LOG_STREAM_DESC[SIM_LOG_MAX] = {
"this stream is always active", /* LOG_ASSERT */

"additional information about dassl solver", /* LOG_DASSL */
"outputs the states at every dassl call", /* LOG_DASSL_STATES */
"additional debug information", /* LOG_DEBUG */
"outputs information about dynamic state selection", /* LOG_DSS */
"outputs jacobian of the dynamic state selection", /* LOG_DSS_JAC */
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/c/util/omc_error.h
Expand Up @@ -76,6 +76,7 @@ enum LOG_STREAM
LOG_ASSERT,

LOG_DASSL,
LOG_DASSL_STATES,
LOG_DEBUG,
LOG_DSS,
LOG_DSS_JAC,
Expand Down

0 comments on commit 6daf323

Please sign in to comment.