Skip to content

Commit

Permalink
- improve warnings for failing linear/mixed/nonlinear systems
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@16245 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
lochel committed Jun 7, 2013
1 parent c26945d commit a4c54f0
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 50 deletions.
18 changes: 6 additions & 12 deletions SimulationRuntime/c/simulation/simulation_runtime.cpp
Expand Up @@ -565,7 +565,7 @@ int startNonInteractiveSimulation(int argc, char**argv, DATA* data)

retVal = callSolver(data, result_file_cstr, init_initMethod, init_optiMethod, init_file, init_time, init_lambda_steps, outputVariablesAtEnd, cpuTime);

if(retVal == 0 && create_linearmodel)
if(0 == retVal && create_linearmodel)
{
rt_tick(SIM_TIMER_LINEARIZE);
retVal = linearize(data);
Expand All @@ -578,12 +578,10 @@ int startNonInteractiveSimulation(int argc, char**argv, DATA* data)
* was not activated while compiling, it was
* just used for measure simulation time for LOG_STATS.
*/
if(measureSimTime){
if(measureSimTime)
measure_time_flag = 0;
}


if(retVal == 0 && measure_time_flag)
if(0 == retVal && measure_time_flag)
{
const string modelInfo = string(data->modelData.modelFilePrefix) + "_prof.xml";
const string plotFile = string(data->modelData.modelFilePrefix) + "_prof.plt";
Expand Down Expand Up @@ -911,7 +909,6 @@ int _main_SimulationRuntime(int argc, char**argv, DATA *data)
signal(SIGUSR1, SimulationRuntime_printStatus);
#endif


if(interactiveSimulation)
{
cout << "startInteractiveSimulation: " << endl;
Expand All @@ -922,12 +919,9 @@ int _main_SimulationRuntime(int argc, char**argv, DATA *data)
retVal = startNonInteractiveSimulation(argc, argv, data);
}

/* free mixed system data */
freemixedSystem(data);
/* free linear system data */
freelinearSystem(data);
/* free nonlinear system data */
freeNonlinearSystem(data);
freemixedSystem(data); /* free mixed system data */
freelinearSystem(data); /* free linear system data */
freeNonlinearSystem(data); /* free nonlinear system data */

callExternalObjectDestructors(data);
deInitializeDataStruc(data);
Expand Down
Expand Up @@ -993,20 +993,11 @@ int initialization(DATA *data, const char* pInitMethod, const char* pOptiMethod,
* This is a workaround and should be removed as soon as possible.
*/
if(check_nonlinear_solutions(data, 1))
{
retVal = -2;
WARNING(LOG_NLS, "model terminate | non-linear system solver failed during initialization.");
}
else if(check_linear_solutions(data, 1))
{
retVal = -3;
WARNING(LOG_LS, "model terminate | linear system solver failed during initialization.");
}
else if(check_mixed_solutions(data, 1))
{
retVal = -4;
WARNING(LOG_NLS, "model terminate | mixed system solver failed during initialiazation.");
}
/* end workaround */

dumpInitialSolution(data);
Expand Down
17 changes: 14 additions & 3 deletions SimulationRuntime/c/simulation/solver/linearSystem.c
Expand Up @@ -37,6 +37,7 @@
#include "omc_error.h"
#include "linearSystem.h"
#include "linearSolverLapack.h"
#include "simulation_info_xml.h"
#include "blaswrap.h"
#include "f2c.h"

Expand Down Expand Up @@ -147,11 +148,21 @@ int solve_linear_system(DATA *data, int sysNumber)
int check_linear_solutions(DATA *data, int printFailingSystems)
{
LINEAR_SYSTEM_DATA* linsys = data->simulationInfo.linearSystemData;
int i;
int i, j, retVal=0;

for(i=0; i<data->modelData.nLinearSystems; ++i)
if(linsys[i].solved == 0)
return 1;
{
retVal = 1;
if(printFailingSystems)
{
WARNING2(LOG_LS, "linear system fails: %s at t=%g", modelInfoXmlGetEquation(&data->modelData.modelDataXml, linsys->equationIndex).name, data->localData[0]->timeValue);
INDENT(LOG_LS);
for(j=0; j<modelInfoXmlGetEquation(&data->modelData.modelDataXml, linsys->equationIndex).numVar; ++j)
WARNING2(LOG_LS, "[%ld] %s", j+1, modelInfoXmlGetEquation(&data->modelData.modelDataXml, linsys->equationIndex).vars[j]->name);
RELEASE(LOG_LS);
}
}

return 0;
return retVal;
}
17 changes: 14 additions & 3 deletions SimulationRuntime/c/simulation/solver/mixedSystem.c
Expand Up @@ -37,6 +37,7 @@
#include "omc_error.h"
#include "mixedSystem.h"
#include "mixedSearchSolver.h"
#include "simulation_info_xml.h"

/*! \fn int allocatemixedSystem(DATA *data)
*
Expand Down Expand Up @@ -141,11 +142,21 @@ int solve_mixed_system(DATA *data, int sysNumber)
int check_mixed_solutions(DATA *data, int printFailingSystems)
{
MIXED_SYSTEM_DATA* system = data->simulationInfo.mixedSystemData;
int i;
int i, j, retVal=0;

for(i=0; i<data->modelData.nMixedSystems; ++i)
if(system[i].solved == 0)
return 1;
{
retVal = 1;
if(printFailingSystems)
{
WARNING2(LOG_NLS, "mixed system fails: %s at t=%g", modelInfoXmlGetEquation(&data->modelData.modelDataXml, system->equationIndex).name, data->localData[0]->timeValue);
INDENT(LOG_NLS);
for(j=0; j<modelInfoXmlGetEquation(&data->modelData.modelDataXml, system->equationIndex).numVar; ++j)
WARNING2(LOG_NLS, "[%ld] %s", j+1, modelInfoXmlGetEquation(&data->modelData.modelDataXml, system->equationIndex).vars[j]->name);
RELEASE(LOG_NLS);
}
}

return 0;
return retVal;
}
23 changes: 17 additions & 6 deletions SimulationRuntime/c/simulation/solver/nonlinearSystem.c
Expand Up @@ -39,6 +39,7 @@
#include "kinsolSolver.h"
#include "nonlinearSolverHybrd.h"
#include "nonlinearSolverNewton.h"
#include "simulation_info_xml.h"
#include "blaswrap.h"
#include "f2c.h"

Expand Down Expand Up @@ -113,7 +114,7 @@ int allocateNonlinearSystem(DATA *data)

/*! \fn freeNonlinearSystem
*
* Thi function frees memory of nonlinear systems.
* This function frees memory of nonlinear systems.
*
* \param [ref] [data]
*/
Expand All @@ -122,7 +123,7 @@ int freeNonlinearSystem(DATA *data)
int i;
NONLINEAR_SYSTEM_DATA* nonlinsys = data->simulationInfo.nonlinearSystemData;

for(i=0;i<data->modelData.nNonLinearSystems;++i)
for(i=0; i<data->modelData.nNonLinearSystems; ++i)
{
free(nonlinsys[i].nlsx);
free(nonlinsys[i].nlsxExtrapolation);
Expand Down Expand Up @@ -162,7 +163,7 @@ int freeNonlinearSystem(DATA *data)
/*! \fn solve non-linear systems
*
* \param [in] [data]
* [sysNumber] index of corresponding non-linear System
* \param [in] [sysNumber] index of corresponding non-linear System
*
* \author wbraun
*/
Expand Down Expand Up @@ -225,13 +226,23 @@ int solve_nonlinear_system(DATA *data, int sysNumber)
int check_nonlinear_solutions(DATA *data, int printFailingSystems)
{
NONLINEAR_SYSTEM_DATA* nonlinsys = data->simulationInfo.nonlinearSystemData;
int i;
int i, j, retVal=0;

for(i=0; i<data->modelData.nNonLinearSystems; ++i)
if(nonlinsys[i].solved == 0)
return 1;
{
retVal = 1;
if(printFailingSystems)
{
WARNING2(LOG_NLS, "nonlinear system fails: %s at t=%g", modelInfoXmlGetEquation(&data->modelData.modelDataXml, nonlinsys->equationIndex).name, data->localData[0]->timeValue);
INDENT(LOG_NLS);
for(j=0; j<modelInfoXmlGetEquation(&data->modelData.modelDataXml, nonlinsys->equationIndex).numVar; ++j)
WARNING2(LOG_NLS, "[%ld] %s", j+1, modelInfoXmlGetEquation(&data->modelData.modelDataXml, nonlinsys->equationIndex).vars[j]->name);
RELEASE(LOG_NLS);
}
}

return 0;
return retVal;
}

/*! \fn extraPolate
Expand Down
23 changes: 6 additions & 17 deletions SimulationRuntime/c/simulation/solver/solver_main.c
Expand Up @@ -351,10 +351,6 @@ int initializeModel(DATA* data, const char* init_initMethod,
if(ACTIVE_STREAM(LOG_DEBUG))
printParameters(data, LOG_DEBUG);

/* initial delay again, due to maybe change
* parameters during Initialization */
initDelay(data, simInfo->startTime);

storePreValues(data);
storeOldValues(data);
function_storeDelayed(data);
Expand Down Expand Up @@ -491,36 +487,29 @@ int solver_main(DATA* data, const char* init_initMethod,
const char* init_optiMethod, const char* init_file, double init_time,
int lambda_steps, int flag, const char* outputVariablesAtEnd)
{
int i;
int i, retVal = 0;;
unsigned int ui;

int retVal = 0;

SOLVER_INFO solverInfo;
SIMULATION_INFO *simInfo = &(data->simulationInfo);


solverInfo.solverMethod = flag;

/* allocate SolverInfo memory */
retVal = initializeSolverData(data, &solverInfo);

/* initialize all parts of the model */
if (!retVal)
if (0 == retVal)
retVal = initializeModel(data, init_initMethod, init_optiMethod, init_file, init_time, lambda_steps);

/* starts the simulation main loop */
if (!retVal)
if (0 == retVal)
{
INFO(LOG_SOLVER, "Performed initialization.");
INFO2(LOG_SOLVER, "Start numerical solver from %g to %g", simInfo->startTime, simInfo->stopTime);
retVal = performSimulation(data, &solverInfo);

/* terminate the simulation */
finishSimulation(data, &solverInfo, outputVariablesAtEnd);
}
else
WARNING(LOG_STDOUT, "Initialization failed.");

/* terminate the simulation */
finishSimulation(data, &solverInfo, outputVariablesAtEnd);

/* free SolverInfo memory */
freeSolverData(data, &solverInfo);
Expand Down

0 comments on commit a4c54f0

Please sign in to comment.