void printErrorEqSyst(equationSystemError err, EQUATION_INFO eq, double time) { int indexes[2] = {1,eq.id}; switch(err) { case ERROR_AT_TIME: warningStreamPrintWithEquationIndexes(LOG_NLS, 0, indexes, "Error solving nonlinear system %d at time %g", eq.id, time); break; case NO_PROGRESS_START_POINT: warningStreamPrintWithEquationIndexes(LOG_NLS, 0, indexes, "Solving nonlinear system %d: iteration not making progress, trying with different starting points (+%g)", eq.id, time); break; case NO_PROGRESS_FACTOR: warningStreamPrintWithEquationIndexes(LOG_NLS, 0, indexes, "Solving nonlinear system %d: iteration not making progress, trying to decrease factor to %g", eq.id, time); break; case IMPROPER_INPUT: warningStreamPrintWithEquationIndexes(LOG_NLS, 0, indexes, "improper input parameters to nonlinear eq. syst: %d at time %g", eq.id, time); break; default: warningStreamPrintWithEquationIndexes(LOG_NLS, 0, indexes, "Unknown equation system error: %d %d %g", err, eq.id, time); break; } }
/*! \fn check_nonlinear_solution * * This function checks if a non-linear system * is solved. Returns a warning and 1 in case it's not * solved otherwise 0. * * \param [in] [data] * \param [in] [printFailingSystems] * \param [in] [sysNumber] index of corresponding non-linear System * \param [out] [returnValue] Returns 1 if fail otherwise 0. * * \author wbraun */ int check_nonlinear_solution(DATA *data, int printFailingSystems, int sysNumber) { NONLINEAR_SYSTEM_DATA* nonlinsys = data->simulationInfo->nonlinearSystemData; long j; int i = sysNumber; if(nonlinsys[i].solved == 0) { int index = nonlinsys[i].equationIndex, indexes[2] = {1,index}; if (!printFailingSystems) return 1; warningStreamPrintWithEquationIndexes(LOG_NLS, 1, indexes, "nonlinear system %d fails: at t=%g", index, data->localData[0]->timeValue); if(data->simulationInfo->initial) { warningStreamPrint(LOG_NLS, 0, "proper start-values for some of the following iteration variables might help"); } for(j=0; j<modelInfoGetEquation(&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) { if (!strcmp(mData->realVarsData[k].info.name, modelInfoGetEquation(&data->modelData->modelDataXml, (nonlinsys[i]).equationIndex).vars[j])) { 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, modelInfoGetEquation(&data->modelData->modelDataXml, (nonlinsys[i]).equationIndex).vars[j]); } } messageCloseWarning(LOG_NLS); return 1; } if(nonlinsys[i].solved == 2) { nonlinsys[i].solved = 1; return 2; } return 0; }