Skip to content

Commit

Permalink
- fix help text for -lv
Browse files Browse the repository at this point in the history
- fix dumps for LOG_DSS, LOG_DSS_JAC
- patch from #2058 for SimCodeDump.tpl


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@15094 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
lochel committed Feb 7, 2013
1 parent 75cd767 commit 909b3ba
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 125 deletions.
2 changes: 1 addition & 1 deletion Compiler/Template/SimCodeDump.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ template dumpInfo(Info info)
::=
match info
case info as INFO(__) then
'<info file="<%info.fileName%>" lineStart="<%info.lineNumberStart%>" lineEnd="<%info.lineNumberEnd%>" colStart="<%info.columnNumberStart%>" colEnd="<%info.columnNumberEnd%>"/>'
'<info file="<%escapeModelicaStringToXmlString(info.fileName)%>" lineStart="<%info.lineNumberStart%>" lineEnd="<%info.lineNumberEnd%>" colStart="<%info.columnNumberStart%>" colEnd="<%info.columnNumberEnd%>"/>'
end dumpInfo;

template printExpStrEscaped(Exp exp)
Expand Down
5 changes: 5 additions & 0 deletions SimulationRuntime/c/simulation/simulation_runtime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,13 @@ void setGlobalVerboseLevel(int argc, char**argv)
if(useStream[LOG_EVENTS_V])
useStream[LOG_EVENTS] = 1;

/* print LOG_NLS if LOG_NLS_JAC if active */
if(useStream[LOG_NLS_JAC])
useStream[LOG_NLS] = 1;

/* print LOG_DSS if LOG_DSS_JAC if active */
if(useStream[LOG_DSS_JAC])
useStream[LOG_DSS] = 1;

delete flags;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,7 @@ static int symbolic_initialization(DATA *data)
if(stateSelection(data,1) == 1)
{
/* report a warning about strange start values */
WARNING(LOG_STDOUT,"Cannot initialize unique the dynamic state selection. Use -lv LOG_DSS to see the switching state set.");
WARNING(LOG_STDOUT, "Cannot initialize unique the dynamic state selection. Use -lv LOG_DSS to see the switching state set.");
}
}

Expand Down
246 changes: 127 additions & 119 deletions SimulationRuntime/c/simulation/solver/stateset.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,67 +35,66 @@

#include <memory.h>


/* initialize jacobians for state selection */
void initializeStateSetJacobians(DATA *data)
{
long i=0;
modelica_integer n=0;
long i=0;
modelica_integer n=0;
/* go troug all state sets*/
for (i=0;i<data->modelData.nStateSets;i++)
for (i=0; i<data->modelData.nStateSets; i++)
{
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
if(set->initialAnalyticalJacobian(data))
{
THROW("Error, can not initialze Jacobians for dynamic state selection");
THROW("Error, can not initialze Jacobians for dynamic state selection");
}
initializeStateSetPivoting(data);
initializeStateSetPivoting(data);
}
}

/* initialize pivoting data for state selection */
void initializeStateSetPivoting(DATA *data)
{
long i=0;
modelica_integer n=0;
long i=0;
modelica_integer n=0;
/* go troug all state sets*/
for (i=0;i<data->modelData.nStateSets;i++)
for (i=0; i<data->modelData.nStateSets; i++)
{
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
unsigned int aid = set->A->id - data->modelData.integerVarsData[0].info.id;
modelica_integer *A = &(data->localData[0]->integerVars[aid]);
memset(A,0,set->nCandidates*set->nStates*sizeof(modelica_integer));
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
unsigned int aid = set->A->id - data->modelData.integerVarsData[0].info.id;
modelica_integer *A = &(data->localData[0]->integerVars[aid]);
memset(A, 0, set->nCandidates*set->nStates*sizeof(modelica_integer));
/* initialize row and col indizes */
for (n=0;n<set->nDummyStates;n++)
for (n=0; n<set->nDummyStates; n++)
{
set->rowPivot[n] = n;
set->rowPivot[n] = n;
}
for (n=0;n<set->nCandidates;n++)
for (n=0; n<set->nCandidates; n++)
{
set->colPivot[n] = set->nCandidates-n-1;
set->colPivot[n] = set->nCandidates-n-1;
}
for (n=0;n<set->nStates;n++)
for (n=0; n<set->nStates; n++)
{
/* set A[row,col] */
set_matrix_elt(A,n,n,set->nStates,1);
/* set A[row, col] */
set_matrix_elt(A, n, n, set->nStates, 1);
}
}
}

/* free jacobians for state selection */
void freeStateSetData(DATA *data)
{
long i=0;
modelica_integer n=0;
long i=0;
modelica_integer n=0;
/* go troug all state sets*/
for (i=0;i<data->modelData.nStateSets;i++)
for (i=0; i<data->modelData.nStateSets; i++)
{
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
free(set->states);
free(set->statescandidates);
free(set->rowPivot);
free(set->colPivot);
free(set->J);
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
free(set->states);
free(set->statescandidates);
free(set->rowPivot);
free(set->colPivot);
free(set->J);
}
}

Expand All @@ -111,123 +110,127 @@ void freeStateSetData(DATA *data)
*/
void getAnalyticalJacobianSet(DATA* data, unsigned int index)
{
unsigned int i,j,k,l,ii;
unsigned int jacIndex = data->simulationInfo.stateSetData[index].jacobianIndex;
unsigned int nrows = data->simulationInfo.analyticJacobians[jacIndex].sizeRows;
unsigned int ncols = data->simulationInfo.analyticJacobians[jacIndex].sizeCols;
double* jac = data->simulationInfo.stateSetData[index].J;
unsigned int i, j, k, l, ii;
unsigned int jacIndex = data->simulationInfo.stateSetData[index].jacobianIndex;
unsigned int nrows = data->simulationInfo.analyticJacobians[jacIndex].sizeRows;
unsigned int ncols = data->simulationInfo.analyticJacobians[jacIndex].sizeCols;
double* jac = data->simulationInfo.stateSetData[index].J;

/* set all elements to zero */
memset(jac, 0, (nrows*ncols*sizeof(double)));
memset(jac, 0, (nrows*ncols*sizeof(double)));

for(i=0; i < data->simulationInfo.analyticJacobians[jacIndex].sparsePattern.maxColors; i++)
{
for(ii=0; ii < data->simulationInfo.analyticJacobians[jacIndex].sizeCols; ii++)
if(data->simulationInfo.analyticJacobians[jacIndex].sparsePattern.colorCols[ii]-1 == i)
data->simulationInfo.analyticJacobians[jacIndex].seedVars[ii] = 1;
data->simulationInfo.analyticJacobians[jacIndex].seedVars[ii] = 1;

if(ACTIVE_STREAM(LOG_DSSJAC)){
INFO(LOG_DSSJAC,"Caluculate one col:\n");
for(l=0; l < data->simulationInfo.analyticJacobians[jacIndex].sizeCols;l++)
INFO2(LOG_DSSJAC,"seed: data->simulationInfo.analyticJacobians[index].seedVars[%d]= %f",l,data->simulationInfo.analyticJacobians[jacIndex].seedVars[l]);
if(ACTIVE_STREAM(LOG_DSS_JAC))
{
INFO(LOG_DSS_JAC, "Caluculate one col:\n");
for(l=0; l < data->simulationInfo.analyticJacobians[jacIndex].sizeCols; l++)
INFO2(LOG_DSS_JAC, "seed: data->simulationInfo.analyticJacobians[index].seedVars[%d]= %f", l, data->simulationInfo.analyticJacobians[jacIndex].seedVars[l]);
}

((data->simulationInfo.stateSetData[index].analyticalJacobianColumn))(data);
((data->simulationInfo.stateSetData[index].analyticalJacobianColumn))(data);

for(j = 0; j < data->simulationInfo.analyticJacobians[jacIndex].sizeCols; j++)
for(j=0; j < data->simulationInfo.analyticJacobians[jacIndex].sizeCols; j++)
{
if(data->simulationInfo.analyticJacobians[jacIndex].seedVars[j] == 1)
{
if(j==0)
ii = 0;
ii = 0;
else
ii = data->simulationInfo.analyticJacobians[jacIndex].sparsePattern.leadindex[j-1];
INFO2(LOG_DSSJAC," take for %d -> %d\n",j,ii);
ii = data->simulationInfo.analyticJacobians[jacIndex].sparsePattern.leadindex[j-1];
INFO2(LOG_DSS_JAC, " take for %d -> %d\n", j, ii);
while(ii < data->simulationInfo.analyticJacobians[jacIndex].sparsePattern.leadindex[j])
{
l = data->simulationInfo.analyticJacobians[jacIndex].sparsePattern.index[ii];
k = j*data->simulationInfo.analyticJacobians[jacIndex].sizeRows + l;
jac[k] = data->simulationInfo.analyticJacobians[jacIndex].resultVars[l];
INFO7(LOG_DSSJAC,"write %d. in jac[%d]-[%d,%d]=%f from col[%d]=%f",ii,k,l,j,jac[k],l,data->simulationInfo.analyticJacobians[jacIndex].resultVars[l]);
ii++;
};
l = data->simulationInfo.analyticJacobians[jacIndex].sparsePattern.index[ii];
k = j*data->simulationInfo.analyticJacobians[jacIndex].sizeRows + l;
jac[k] = data->simulationInfo.analyticJacobians[jacIndex].resultVars[l];
INFO7(LOG_DSS_JAC, "write %d. in jac[%d]-[%d, %d]=%f from col[%d]=%f", ii, k, l, j, jac[k], l, data->simulationInfo.analyticJacobians[jacIndex].resultVars[l]);
ii++;
};
}
}
for(ii=0; ii < data->simulationInfo.analyticJacobians[jacIndex].sizeCols; ii++)
if(data->simulationInfo.analyticJacobians[jacIndex].sparsePattern.colorCols[ii]-1 == i) data->simulationInfo.analyticJacobians[jacIndex].seedVars[ii] = 0;
if(data->simulationInfo.analyticJacobians[jacIndex].sparsePattern.colorCols[ii]-1 == i) data->simulationInfo.analyticJacobians[jacIndex].seedVars[ii] = 0;

}
if(ACTIVE_STREAM(LOG_DSS))
{
INFO(LOG_DSS,"Print jac:");
for(i=0; i < data->simulationInfo.analyticJacobians[jacIndex].sizeRows;i++)
char buffer[4096];

DEBUG3(LOG_DSS, "jacobian %dx%d [id: %d]", data->simulationInfo.analyticJacobians[jacIndex].sizeRows, data->simulationInfo.analyticJacobians[jacIndex].sizeCols, jacIndex);
INDENT(LOG_DSS);
for(i=0; i<data->simulationInfo.analyticJacobians[jacIndex].sizeRows; i++)
{
for(j=0; j < data->simulationInfo.analyticJacobians[jacIndex].sizeCols;j++)
printf("% .5e ",jac[i*data->simulationInfo.analyticJacobians[jacIndex].sizeCols+j]);
printf("\n");
buffer[0] = 0;
for(j=0; j < data->simulationInfo.analyticJacobians[jacIndex].sizeCols; j++)
sprintf(buffer, "%s%.5e ", buffer, jac[i*data->simulationInfo.analyticJacobians[jacIndex].sizeCols+j]);
DEBUG(LOG_DSS, buffer);
}
RELEASE(LOG_DSS);
}
}

void setAMatrix(modelica_integer* newEnable, modelica_integer nCandidates, modelica_integer nStates, VAR_INFO* Ainfo, VAR_INFO** states, VAR_INFO** statecandidates, DATA *data)
{
modelica_integer col;
modelica_integer row=0;
modelica_integer col;
modelica_integer row=0;
/* clear old values */
unsigned int aid = Ainfo->id - data->modelData.integerVarsData[0].info.id;
modelica_integer *A = &(data->localData[0]->integerVars[aid]);
memset(A,0,nCandidates*nStates*sizeof(modelica_integer));
unsigned int aid = Ainfo->id - data->modelData.integerVarsData[0].info.id;
modelica_integer *A = &(data->localData[0]->integerVars[aid]);
memset(A, 0, nCandidates*nStates*sizeof(modelica_integer));

for (col=0;col<nCandidates;col++)
for (col=0; col<nCandidates; col++)
{
if (newEnable[col]==2)
if(newEnable[col]==2)
{
unsigned int firstrealid = data->modelData.realVarsData[0].info.id;
unsigned int id = statecandidates[col]->id-firstrealid;
unsigned int sid = states[row]->id-firstrealid;
INFO1(LOG_DSS," select %s\n",statecandidates[col]->name);
/* set A[row,col] */
set_matrix_elt(A,row,col,nStates,1);
unsigned int firstrealid = data->modelData.realVarsData[0].info.id;
unsigned int id = statecandidates[col]->id-firstrealid;
unsigned int sid = states[row]->id-firstrealid;
INFO1(LOG_DSS, "select %s", statecandidates[col]->name);
/* set A[row, col] */
set_matrix_elt(A, row, col, nStates, 1);
/* reinit state */
data->localData[0]->realVars[sid] = data->localData[0]->realVars[id];
row++;
data->localData[0]->realVars[sid] = data->localData[0]->realVars[id];
row++;
}
}
}

int comparePivot(modelica_integer *oldPivot, modelica_integer *newPivot, modelica_integer nCandidates, modelica_integer nDummyStates, modelica_integer nStates, VAR_INFO* A, VAR_INFO** states, VAR_INFO** statecandidates, DATA *data)
{
modelica_integer i;
int ret = 0;
modelica_integer* oldEnable = (modelica_integer*) calloc(nCandidates,sizeof(modelica_integer));
modelica_integer* newEnable = (modelica_integer*) calloc(nCandidates,sizeof(modelica_integer));
modelica_integer i;
int ret = 0;
modelica_integer* oldEnable = (modelica_integer*) calloc(nCandidates, sizeof(modelica_integer));
modelica_integer* newEnable = (modelica_integer*) calloc(nCandidates, sizeof(modelica_integer));

for (i=0; i<nCandidates; i++)
{
modelica_integer entry = (i < nDummyStates) ? 1: 2;
newEnable[ newPivot[i] ] = entry;
oldEnable[ oldPivot[i] ] = entry;
modelica_integer entry = (i < nDummyStates) ? 1: 2;
newEnable[ newPivot[i] ] = entry;
oldEnable[ oldPivot[i] ] = entry;
}

for (i=0; i<nCandidates; i++)
{
if (newEnable[i] != oldEnable[i])
if(newEnable[i] != oldEnable[i])
{
INFO1(LOG_DSS,"Select new States at time %f:",data->localData[0]->timeValue);
ret = -1;
break;
INFO1(LOG_DSS, "select new states at time %f", data->localData[0]->timeValue);
INDENT(LOG_DSS);
setAMatrix(newEnable, nCandidates, nStates, A, states, statecandidates, data);
RELEASE(LOG_DSS);
ret = -1;
break;
}
}

if (ret)
{
setAMatrix(newEnable,nCandidates,nStates,A,states,statecandidates,data);
}

free(oldEnable);
free(newEnable);
free(oldEnable);
free(newEnable);

return ret;
return ret;
}

/*! \fn stateSelection
Expand All @@ -241,43 +244,48 @@ int comparePivot(modelica_integer *oldPivot, modelica_integer *newPivot, modelic
*/
int stateSelection(DATA *data, char reportError)
{
long i=0;
long j=0;
int globalres=0;
long i=0;
long j=0;
int globalres=0;

/* go troug all state sets*/
for (i=0;i<data->modelData.nStateSets;i++)
for (i=0; i<data->modelData.nStateSets; i++)
{
int res=0;
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
modelica_integer* oldColPivot = (modelica_integer*) malloc(set->nCandidates * sizeof(modelica_integer));
int res=0;
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
modelica_integer* oldColPivot = (modelica_integer*) malloc(set->nCandidates * sizeof(modelica_integer));
/* generate jacobian, stored in set->J */
getAnalyticalJacobianSet(data,i);
getAnalyticalJacobianSet(data, i);
/* call pivoting function to select the states */
memcpy(oldColPivot,set->colPivot,set->nCandidates*sizeof(modelica_integer));
if ((pivot(set->J,set->nDummyStates,set->nCandidates,set->rowPivot,set->colPivot) != 0) && reportError)
memcpy(oldColPivot, set->colPivot, set->nCandidates*sizeof(modelica_integer));
if((pivot(set->J, set->nDummyStates, set->nCandidates, set->rowPivot, set->colPivot) != 0) && reportError)
{
/* error, report the matrix and the time */
for(i=0; i < data->simulationInfo.analyticJacobians[set->jacobianIndex].sizeRows;i++)
char buffer[4096];

WARNING3(LOG_DSS, "jacobian %dx%d [id: %d]", data->simulationInfo.analyticJacobians[set->jacobianIndex].sizeRows, data->simulationInfo.analyticJacobians[set->jacobianIndex].sizeCols, set->jacobianIndex);
INDENT(LOG_DSS);
for(i=0; i < data->simulationInfo.analyticJacobians[set->jacobianIndex].sizeRows; i++)
{
for(j=0; j < data->simulationInfo.analyticJacobians[set->jacobianIndex].sizeCols;j++)
printf("% .5e ",set->J[i*data->simulationInfo.analyticJacobians[set->jacobianIndex].sizeCols+j]);
printf("\n");
buffer[0] = 0;
for(j=0; j < data->simulationInfo.analyticJacobians[set->jacobianIndex].sizeCols; j++)
sprintf(buffer, "%s%.5e ", buffer, set->J[i*data->simulationInfo.analyticJacobians[set->jacobianIndex].sizeCols+j]);
WARNING(LOG_DSS, buffer);
}
for (i=0;i<set->nCandidates;i++)
{
printf("%s\n",set->statescandidates[i]->name);
}
THROW1("Error, singular Jacobian for dynamic state selection at time %f\nUse -lv LOG_DSSJAC to get the Jacobian\n",data->localData[0]->timeValue);

for (i=0; i<set->nCandidates; i++)
WARNING1(LOG_DSS, "%s", set->statescandidates[i]->name);
RELEASE(LOG_DSS);

THROW1("Error, singular Jacobian for dynamic state selection at time %f\nUse -lv LOG_DSS_JAC to get the Jacobian", data->localData[0]->timeValue);
}
/* if we have a new set throw event for reinitialization
and set the A matrix for set.x=A*(states) */
res = comparePivot(oldColPivot,set->colPivot,set->nCandidates,set->nDummyStates,set->nStates,set->A,set->states,set->statescandidates,data);
if (res)
{
INFO(LOG_DSS,"Select new States:");
globalres = 1;
}
free(oldColPivot);
res = comparePivot(oldColPivot, set->colPivot, set->nCandidates, set->nDummyStates, set->nStates, set->A, set->states, set->statescandidates, data);
if(res)
globalres = 1;

free(oldColPivot);
}
return globalres;
return globalres;
}

0 comments on commit 909b3ba

Please sign in to comment.