Skip to content

Commit c66d712

Browse files
authored
Allow to set CVODE parameters for ME FMUs (#1277)
1 parent f7c50c9 commit c66d712

3 files changed

Lines changed: 52 additions & 8 deletions

File tree

src/OMSimulatorLib/Flags.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ void oms::Flags::setDefaults()
6565
{
6666
addParametersToCSV = false;
6767
algLoopSolver = oms_alg_solver_kinsol;
68+
cvodeMaxErrTestFails = 100;
69+
cvodeMaxNLSFails = 100;
70+
cvodeMaxNLSIterations = 5;
71+
cvodeMaxSteps = 1000;
6872
defaultModeIsCS = false;
6973
deleteTempFiles = true;
7074
directionalDerivatives = true;
@@ -203,6 +207,30 @@ oms_status_enu_t oms::Flags::ClearAllOptions(const std::string& value)
203207
return oms_status_ok;
204208
}
205209

210+
oms_status_enu_t oms::Flags::CVODEMaxErrTestFails(const std::string& value)
211+
{
212+
GetInstance().cvodeMaxErrTestFails = atoi(value.c_str());
213+
return oms_status_ok;
214+
}
215+
216+
oms_status_enu_t oms::Flags::CVODEMaxNLSFailures(const std::string& value)
217+
{
218+
GetInstance().cvodeMaxNLSFails = atoi(value.c_str());
219+
return oms_status_ok;
220+
}
221+
222+
oms_status_enu_t oms::Flags::CVODEMaxNLSIterations(const std::string& value)
223+
{
224+
GetInstance().cvodeMaxNLSIterations = atoi(value.c_str());
225+
return oms_status_ok;
226+
}
227+
228+
oms_status_enu_t oms::Flags::CVODEMaxSteps(const std::string& value)
229+
{
230+
GetInstance().cvodeMaxSteps = atoi(value.c_str());
231+
return oms_status_ok;
232+
}
233+
206234
oms_status_enu_t oms::Flags::DeleteTempFiles(const std::string& value)
207235
{
208236
GetInstance().deleteTempFiles = (value == "true");

src/OMSimulatorLib/Flags.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ namespace oms
5656
static oms_status_enu_t SetCommandLineOption(const std::string& cmd);
5757

5858
static bool AddParametersToCSV() {return GetInstance().addParametersToCSV;}
59+
static int CVODEMaxErrTestFails() {return GetInstance().cvodeMaxErrTestFails;}
60+
static int CVODEMaxNLSFailures() {return GetInstance().cvodeMaxNLSFails;}
61+
static int CVODEMaxNLSIterations() {return GetInstance().cvodeMaxNLSIterations;}
62+
static int CVODEMaxSteps() {return GetInstance().cvodeMaxSteps;}
5963
static bool DefaultModeIsCS() {return GetInstance().defaultModeIsCS;}
6064
static bool DeleteTempFiles() {return GetInstance().deleteTempFiles;}
6165
static bool DirectionalDerivatives() {return GetInstance().directionalDerivatives;}
@@ -89,6 +93,10 @@ namespace oms
8993

9094
private:
9195
bool addParametersToCSV;
96+
int cvodeMaxErrTestFails;
97+
int cvodeMaxNLSFails;
98+
int cvodeMaxNLSIterations;
99+
int cvodeMaxSteps;
92100
bool defaultModeIsCS;
93101
bool deleteTempFiles;
94102
bool directionalDerivatives;
@@ -148,6 +156,10 @@ namespace oms
148156
{"--addParametersToCSV", "", "Export parameters to .csv file (true, [false])", re_default, Flags::AddParametersToCSV, false},
149157
{"--algLoopSolver", "", "Specifies the alg. loop solver method (fixedpoint, [kinsol]) used for algebraic loops spanning over multiple components.", re_default, Flags::AlgLoopSolver, false},
150158
{"--clearAllOptions", "", "Reset all flags to default values", re_void, Flags::ClearAllOptions, false},
159+
{"--CVODEMaxErrTestFails", "", "Maximum number of error test failures for CVODE", re_number, Flags::CVODEMaxErrTestFails, false},
160+
{"--CVODEMaxNLSFailures", "", "Maximum number of nonlinear convergence failures for CVODE", re_number, Flags::CVODEMaxNLSFailures, false},
161+
{"--CVODEMaxNLSIterations", "", "Maximum number of nonlinear solver iterations for CVODE", re_number, Flags::CVODEMaxNLSIterations, false},
162+
{"--CVODEMaxSteps", "", "Maximum number of steps for CVODE", re_number, Flags::CVODEMaxSteps, false},
151163
{"--deleteTempFiles", "", "Deletes temp files as soon as they are no longer needed ([true], false)", re_bool, Flags::DeleteTempFiles, false},
152164
{"--directionalDerivatives", "", "Specifies whether directional derivatives should be used to calculate the Jacobian for alg. loops or if a numerical approximation should be used instead ([true], false)", re_bool, Flags::DirectionalDerivatives, false},
153165
{"--dumpAlgLoops", "", "Dump information for alg loops (true, [false])", re_bool, Flags::DumpAlgLoops, false},
@@ -186,6 +198,10 @@ namespace oms
186198
static oms_status_enu_t AddParametersToCSV(const std::string& value);
187199
static oms_status_enu_t AlgLoopSolver(const std::string& value);
188200
static oms_status_enu_t ClearAllOptions(const std::string& value);
201+
static oms_status_enu_t CVODEMaxErrTestFails(const std::string& value);
202+
static oms_status_enu_t CVODEMaxNLSFailures(const std::string& value);
203+
static oms_status_enu_t CVODEMaxNLSIterations(const std::string& value);
204+
static oms_status_enu_t CVODEMaxSteps(const std::string& value);
189205
static oms_status_enu_t DeleteTempFiles(const std::string& value);
190206
static oms_status_enu_t DirectionalDerivatives(const std::string& value);
191207
static oms_status_enu_t DumpAlgLoops(const std::string& value);

src/OMSimulatorLib/SystemSC.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -348,21 +348,21 @@ oms_status_enu_t oms::SystemSC::initialize()
348348
if (flag < 0) logError("SUNDIALS_ERROR: CVodeSetMaxStep() failed with flag = " + std::to_string(flag));
349349

350350
// further settings from cpp runtime
351-
flag = CVodeSetInitStep(solverData.cvode.mem, initialStepSize); // INITIAL STEPSIZE
351+
flag = CVodeSetInitStep(solverData.cvode.mem, initialStepSize); // INITIAL STEPSIZE
352352
if (flag < 0) logError("SUNDIALS_ERROR: CVodeSetInitStep() failed with flag = " + std::to_string(flag));
353-
flag = CVodeSetMaxOrd(solverData.cvode.mem, 5); // MAXIMUM ORDER
353+
flag = CVodeSetMaxOrd(solverData.cvode.mem, 5); // MAXIMUM ORDER
354354
if (flag < 0) logError("SUNDIALS_ERROR: CVodeSetMaxOrd() failed with flag = " + std::to_string(flag));
355-
flag = CVodeSetMaxConvFails(solverData.cvode.mem, 100); // MAXIMUM NUMBER OF NONLINEAR CONVERGENCE FAILURES
355+
flag = CVodeSetMaxConvFails(solverData.cvode.mem, Flags::CVODEMaxNLSFailures()); // MAXIMUM NUMBER OF NONLINEAR CONVERGENCE FAILURES
356356
if (flag < 0) logError("SUNDIALS_ERROR: CVodeSetMaxConvFails() failed with flag = " + std::to_string(flag));
357-
flag = CVodeSetStabLimDet(solverData.cvode.mem, true); // STABILITY DETECTION
357+
flag = CVodeSetStabLimDet(solverData.cvode.mem, true); // STABILITY DETECTION
358358
if (flag < 0) logError("SUNDIALS_ERROR: CVodeSetStabLimDet() failed with flag = " + std::to_string(flag));
359-
flag = CVodeSetMinStep(solverData.cvode.mem, minimumStepSize); // MINIMUM STEPSIZE
359+
flag = CVodeSetMinStep(solverData.cvode.mem, minimumStepSize); // MINIMUM STEPSIZE
360360
if (flag < 0) logError("SUNDIALS_ERROR: CVodeSetMinStep() failed with flag = " + std::to_string(flag));
361-
flag = CVodeSetMaxNonlinIters(solverData.cvode.mem, 5); // MAXIMUM NUMBER OF ITERATIONS
361+
flag = CVodeSetMaxNonlinIters(solverData.cvode.mem, Flags::CVODEMaxNLSIterations()); // MAXIMUM NUMBER OF ITERATIONS
362362
if (flag < 0) logError("SUNDIALS_ERROR: CVodeSetMaxNonlinIters() failed with flag = " + std::to_string(flag));
363-
flag = CVodeSetMaxErrTestFails(solverData.cvode.mem, 100); // MAXIMUM NUMBER OF ERROR TEST FAILURES
363+
flag = CVodeSetMaxErrTestFails(solverData.cvode.mem, Flags::CVODEMaxErrTestFails()); // MAXIMUM NUMBER OF ERROR TEST FAILURES
364364
if (flag < 0) logError("SUNDIALS_ERROR: CVodeSetMaxErrTestFails() failed with flag = " + std::to_string(flag));
365-
flag = CVodeSetMaxNumSteps(solverData.cvode.mem, 1000); // MAXIMUM NUMBER OF STEPS
365+
flag = CVodeSetMaxNumSteps(solverData.cvode.mem, Flags::CVODEMaxSteps()); // MAXIMUM NUMBER OF STEPS
366366
if (flag < 0) logError("SUNDIALS_ERROR: CVodeSetMaxNumSteps() failed with flag = " + std::to_string(flag));
367367
}
368368

0 commit comments

Comments
 (0)