diff --git a/OMCompiler/SimulationRuntime/c/optimization/optimizer_main.c b/OMCompiler/SimulationRuntime/c/optimization/optimizer_main.c index 49399ab8155..56ca930bb37 100644 --- a/OMCompiler/SimulationRuntime/c/optimization/optimizer_main.c +++ b/OMCompiler/SimulationRuntime/c/optimization/optimizer_main.c @@ -37,7 +37,7 @@ #include "simulation_data.h" #include "simulation/options.h" -static inline void optimizationWithIpopt(OptData*optData); +static inline int optimizationWithIpopt(OptData*optData); static inline void freeOptimizerData(OptData*optData); int runOptimizer(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo){ @@ -52,17 +52,19 @@ int runOptimizer(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo){ initial_guess_optimizer(optData, solverInfo); allocate_der_struct(&optData->s, &optData->dim ,data, optData); - optimizationWithIpopt(optData); + const int res = optimizationWithIpopt(optData); res2file(optData, solverInfo, optData->ipop.vopt); freeOptimizerData(optData); - return 0; + if(res == 0 /*Solve_Succeeded*/ || res == 1 /*Solved_To_Acceptable_Level*/) + return 0; + return -1; } /*! * run optimization with ipopt * author: Vitalij Ruge **/ -static inline void optimizationWithIpopt(OptData*optData){ +static inline int optimizationWithIpopt(OptData*optData){ IpoptProblem nlp = NULL; const int NV = optData->dim.NV; @@ -218,6 +220,7 @@ static inline void optimizationWithIpopt(OptData*optData){ if(res != 0 && !ACTIVE_STREAM(LOG_IPOPT)) warningStreamPrint(LOG_STDOUT, 0, "No optimal solution found!\nUse -lv=LOG_IPOPT for more information."); FreeIpoptProblem(nlp); + return res; } diff --git a/OMCompiler/SimulationRuntime/c/simulation/solver/perform_simulation.c.inc b/OMCompiler/SimulationRuntime/c/simulation/solver/perform_simulation.c.inc index 127e06129a7..b253504c06c 100644 --- a/OMCompiler/SimulationRuntime/c/simulation/solver/perform_simulation.c.inc +++ b/OMCompiler/SimulationRuntime/c/simulation/solver/perform_simulation.c.inc @@ -549,7 +549,13 @@ int prefixedName_performSimulation(DATA* data, threadData_t *threadData, SOLVER_ infoStreamPrint(LOG_SOLVER, 0, "finished solver step %g", solverInfo->currentTime); messageClose(LOG_SOLVER); - if (S_OPTIMIZATION == solverInfo->solverMethod) break; + if (S_OPTIMIZATION == solverInfo->solverMethod){ + if(retValIntegrator != 0){ + retValue = -1; + infoStreamPrint(LOG_STDOUT, 0, "model terminate | optimization failed."); + } + break; + } syncStep = simulationUpdate(data, threadData, solverInfo); retry = 0; /* reset retry */ diff --git a/testsuite/openmodelica/cruntime/optimization/basic/CC.mos b/testsuite/openmodelica/cruntime/optimization/basic/CC.mos index 8f816109a11..82afab9d22a 100644 --- a/testsuite/openmodelica/cruntime/optimization/basic/CC.mos +++ b/testsuite/openmodelica/cruntime/optimization/basic/CC.mos @@ -40,7 +40,7 @@ getErrorString(); // true // "" // true -// "CheckConstraintViolation_res.mat" +// "" // EXIT: Problem has inconsistent variable bounds or constraint sides. // // "Warning: Alias variables $con$con2 = x with invalid limits min 3.0 > max 0.0