Skip to content

Commit

Permalink
Write equation indexes for NLS failures in the XML log
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@18398 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Dec 3, 2013
1 parent c158263 commit 6ea80e0
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 34 deletions.
53 changes: 27 additions & 26 deletions SimulationRuntime/c/simulation/solver/nonlinearSystem.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,44 +258,45 @@ int check_nonlinear_solutions(DATA *data, int printFailingSystems)
NONLINEAR_SYSTEM_DATA* nonlinsys = data->simulationInfo.nonlinearSystemData;
long i, j;

for(i=0; i<data->modelData.nNonLinearSystems; ++i)
for(i=0; i<data->modelData.nNonLinearSystems; ++i) {
if(nonlinsys[i].solved == 0)
{
if(printFailingSystems)
if (!printFailingSystems) return 1;
int index = nonlinsys[i].equationIndex;
int indexes[2] = {1,index};
warningStreamPrintWithEquationIndexes(LOG_NLS, 1, indexes, "nonlinear system fails: %s at t=%g", modelInfoXmlGetEquation(&data->modelData.modelDataXml, index).name, data->localData[0]->timeValue);
if(data->simulationInfo.initial)
{
warningStreamPrint(LOG_NLS, 1, "nonlinear system fails: %s at t=%g", modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).name, data->localData[0]->timeValue);
if(data->simulationInfo.initial)
{
warningStreamPrint(LOG_NLS, 1, "proper start-values for some of the following iteration variables might help");
for(j=0; j<modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).numVar; ++j)
warningStreamPrint(LOG_NLS, 1, "proper start-values for some of the following iteration variables might help");
for(j=0; j<modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).numVar; ++j) {
int done=0;
long k;
const MODEL_DATA *mData = &(data->modelData);
for(k=0; k<mData->nVariablesReal && !done; ++k)
{
int done=0;
long k;
const MODEL_DATA *mData = &(data->modelData);
for(k=0; k<mData->nVariablesReal && !done; ++k)
if(!strcmp(mData->realVarsData[k].info.name, modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).vars[j]->name))
{
if(!strcmp(mData->realVarsData[k].info.name, modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).vars[j]->name))
{
done = 1;
warningStreamPrint(LOG_NLS, 0, "[%ld] Real %s(start=%g, nominal=%g)", j+1,
mData->realVarsData[k].info.name,
mData->realVarsData[k].attribute.start,
mData->realVarsData[k].attribute.nominal);
}
done = 1;
warningStreamPrint(LOG_NLS, 0, "[%ld] Real %s(start=%g, nominal=%g)", j+1,
mData->realVarsData[k].info.name,
mData->realVarsData[k].attribute.start,
mData->realVarsData[k].attribute.nominal);
}
if(!done)
warningStreamPrint(LOG_NLS, 0, "[%ld] Real %s(start=?, nominal=?)", j+1, modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).vars[j]->name);
}
if (ACTIVE_WARNING_STREAM(LOG_NLS)) messageClose(LOG_NLS);
}
else {
for(j=0; j<modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).numVar; ++j)
warningStreamPrint(LOG_NLS, 0, "[%ld] Real %s", j+1, modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).vars[j]->name);
if (!done) {
warningStreamPrint(LOG_NLS, 0, "[%ld] Real %s(start=?, nominal=?)", j+1, modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).vars[j]->name);
}
}
if (ACTIVE_WARNING_STREAM(LOG_NLS)) messageClose(LOG_NLS);
} else {
for(j=0; j<modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).numVar; ++j) {
warningStreamPrint(LOG_NLS, 0, "[%ld] Real %s", j+1, modelInfoXmlGetEquation(&data->modelData.modelDataXml, (nonlinsys[i]).equationIndex).vars[j]->name);
}
}
if (ACTIVE_WARNING_STREAM(LOG_NLS)) messageClose(LOG_NLS);
return 1;
}
}

return 0;
}
Expand Down
19 changes: 16 additions & 3 deletions SimulationRuntime/c/util/omc_error.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,11 +222,13 @@ void messageXML(int type, int stream, int indentNext, char *msg, int subline, co
printf("<message stream=\"%s\" type=\"%s\" text=\"", LOG_STREAM_NAME[stream], LOG_TYPE_DESC[type]);
printEscapedXML(msg);
if (indexes) {
printf("\">");
printf("\">\n");
for (i=1; i<=*indexes; i++) {
printf("<used index=\"%d\" />", indexes[i]);
printf("<used index=\"%d\" />\n", indexes[i]);
}
if (!indentNext) {
fputs("</message>\n",stdout);
}
printf("</message>\n");
} else {
fputs(indentNext ? "\">\n" : "\" />\n", stdout);
}
Expand Down Expand Up @@ -281,6 +283,17 @@ void infoStreamPrint(int stream, int indentNext, const char *format, ...)
}
}

void warningStreamPrintWithEquationIndexes(int stream, int indentNext, const int *indexes, const char *format, ...)
{
if (ACTIVE_WARNING_STREAM(stream)) {
char logBuffer[SIZE_LOG_BUFFER];
va_list args;
va_start(args, format);
vsnprintf(logBuffer, SIZE_LOG_BUFFER, format, args);
messageFunction(LOG_TYPE_WARNING, stream, indentNext, logBuffer, 0, indexes);
}
}

void warningStreamPrint(int stream, int indentNext, const char *format, ...)
{
if (ACTIVE_WARNING_STREAM(stream)) {
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/c/util/omc_error.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ extern void (*messageClose)(int stream);
extern void infoStreamPrint(int stream, int indentNext, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
extern void infoStreamPrintWithEquationIndexes(int stream, int indentNext, const int *indexes, const char *format, ...) __attribute__ ((format (printf, 4, 5)));
extern void warningStreamPrint(int stream, int indentNext, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
extern void warningStreamPrintWithEquationIndexes(int stream, int indentNext, const int *indexes, const char *format, ...) __attribute__ ((format (printf, 4, 5)));
extern void errorStreamPrint(int stream, int indentNext, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
extern void assertStreamPrint(int cond, const char *format, ...) __attribute__ ((format (printf, 2, 3)));
extern void throwStreamPrint(const char *format, ...) __attribute__ ((format (printf, 1, 2), noreturn));
Expand Down
11 changes: 6 additions & 5 deletions SimulationRuntime/c/util/varinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,23 @@

void printErrorEqSyst(equationSystemError err, EQUATION_INFO eq, double time)
{
int indexes[2] = {1,eq.id};
switch(err)
{
case ERROR_AT_TIME:
warningStreamPrint(LOG_NLS, 0, "Error solving nonlinear system %s at time %g", eq.name, time);
warningStreamPrintWithEquationIndexes(LOG_NLS, 0, indexes, "Error solving nonlinear system %s at time %g", eq.name, time);
break;
case NO_PROGRESS_START_POINT:
warningStreamPrint(LOG_NLS, 0, "Solving nonlinear system %s: iteration not making progress, trying with different starting points (+%g)", eq.name, time);
warningStreamPrintWithEquationIndexes(LOG_NLS, 0, indexes, "Solving nonlinear system %s: iteration not making progress, trying with different starting points (+%g)", eq.name, time);
break;
case NO_PROGRESS_FACTOR:
warningStreamPrint(LOG_NLS, 0, "Solving nonlinear system %s: iteration not making progress, trying to decrease factor to %g", eq.name, time);
warningStreamPrintWithEquationIndexes(LOG_NLS, 0, indexes, "Solving nonlinear system %s: iteration not making progress, trying to decrease factor to %g", eq.name, time);
break;
case IMPROPER_INPUT:
warningStreamPrint(LOG_NLS, 0, "improper input parameters to nonlinear eq. syst: %s at time %g", eq.name, time);
warningStreamPrintWithEquationIndexes(LOG_NLS, 0, indexes, "improper input parameters to nonlinear eq. syst: %s at time %g", eq.name, time);
break;
default:
warningStreamPrint(LOG_NLS, 0, "Unknown equation system error: %d %s %g", err, eq.name, time);
warningStreamPrintWithEquationIndexes(LOG_NLS, 0, indexes, "Unknown equation system error: %d %s %g", err, eq.name, time);
break;
}
}
Expand Down

0 comments on commit 6ea80e0

Please sign in to comment.