From 198fdb706bb8d02f552d0c9d4ee1192b303b33a0 Mon Sep 17 00:00:00 2001 From: Marc Berliner <34451391+MarcBerliner@users.noreply.github.com> Date: Mon, 6 Jan 2025 12:32:08 -0500 Subject: [PATCH] Add `dt_min` option for `IDAKLUSolver` (#4736) * add `dt_min` option for `IDAKLUSolver` * Update CHANGELOG.md --- CHANGELOG.md | 1 + src/pybamm/solvers/c_solvers/idaklu/IDAKLUSolverOpenMP.inl | 3 +++ src/pybamm/solvers/c_solvers/idaklu/Options.cpp | 1 + src/pybamm/solvers/c_solvers/idaklu/Options.hpp | 1 + src/pybamm/solvers/idaklu_solver.py | 4 ++++ tests/unit/test_solvers/test_idaklu_solver.py | 1 + 6 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fcfb700eb..693a49ee7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Features +- Added a `dt_min` option to the (`IDAKLUSolver`). ([#4736](https://github.com/pybamm-team/PyBaMM/pull/4736)) - Enabled using SEI models with particle size distributions. ([#4693](https://github.com/pybamm-team/PyBaMM/pull/4693)) - Added symbolic mesh which allows for using InputParameters for geometric parameters ([#4665](https://github.com/pybamm-team/PyBaMM/pull/4665)) - Enhanced the `search` method to accept multiple search terms in the form of a string or a list. ([#4650](https://github.com/pybamm-team/PyBaMM/pull/4650)) diff --git a/src/pybamm/solvers/c_solvers/idaklu/IDAKLUSolverOpenMP.inl b/src/pybamm/solvers/c_solvers/idaklu/IDAKLUSolverOpenMP.inl index d128ae1809..fc6719235a 100644 --- a/src/pybamm/solvers/c_solvers/idaklu/IDAKLUSolverOpenMP.inl +++ b/src/pybamm/solvers/c_solvers/idaklu/IDAKLUSolverOpenMP.inl @@ -192,6 +192,9 @@ void IDAKLUSolverOpenMP::SetSolverOptions() { // Initial step size CheckErrors(IDASetInitStep(ida_mem, solver_opts.dt_init)); + // Minimum absolute step size + CheckErrors(IDASetMinStep(ida_mem, solver_opts.dt_min)); + // Maximum absolute step size CheckErrors(IDASetMaxStep(ida_mem, solver_opts.dt_max)); diff --git a/src/pybamm/solvers/c_solvers/idaklu/Options.cpp b/src/pybamm/solvers/c_solvers/idaklu/Options.cpp index 8eb605fe77..c4a1b173bd 100644 --- a/src/pybamm/solvers/c_solvers/idaklu/Options.cpp +++ b/src/pybamm/solvers/c_solvers/idaklu/Options.cpp @@ -142,6 +142,7 @@ SolverOptions::SolverOptions(py::dict &py_opts) max_order_bdf(py_opts["max_order_bdf"].cast()), max_num_steps(py_opts["max_num_steps"].cast()), dt_init(RCONST(py_opts["dt_init"].cast())), + dt_min(RCONST(py_opts["dt_min"].cast())), dt_max(RCONST(py_opts["dt_max"].cast())), max_error_test_failures(py_opts["max_error_test_failures"].cast()), max_nonlinear_iterations(py_opts["max_nonlinear_iterations"].cast()), diff --git a/src/pybamm/solvers/c_solvers/idaklu/Options.hpp b/src/pybamm/solvers/c_solvers/idaklu/Options.hpp index 7418c68ec3..c02164cc80 100644 --- a/src/pybamm/solvers/c_solvers/idaklu/Options.hpp +++ b/src/pybamm/solvers/c_solvers/idaklu/Options.hpp @@ -31,6 +31,7 @@ struct SolverOptions { int max_order_bdf; int max_num_steps; double dt_init; + double dt_min; double dt_max; int max_error_test_failures; int max_nonlinear_iterations; diff --git a/src/pybamm/solvers/idaklu_solver.py b/src/pybamm/solvers/idaklu_solver.py index 730572d082..e5b84003a6 100644 --- a/src/pybamm/solvers/idaklu_solver.py +++ b/src/pybamm/solvers/idaklu_solver.py @@ -119,6 +119,9 @@ class IDAKLUSolver(pybamm.BaseSolver): "max_num_steps": 100000, # Initial step size. The solver default is used if this is left at 0.0 "dt_init": 0.0, + # Minimum absolute step size. The solver default is used if this is + # left at 0.0 + "dt_min": 0.0, # Maximum absolute step size. The solver default is used if this is # left at 0.0 "dt_max": 0.0, @@ -200,6 +203,7 @@ def __init__( "max_order_bdf": 5, "max_num_steps": 100000, "dt_init": 0.0, + "dt_min": 0.0, "dt_max": 0.0, "max_error_test_failures": 10, "max_nonlinear_iterations": 40, diff --git a/tests/unit/test_solvers/test_idaklu_solver.py b/tests/unit/test_solvers/test_idaklu_solver.py index 10dc0ab610..0e21085d1f 100644 --- a/tests/unit/test_solvers/test_idaklu_solver.py +++ b/tests/unit/test_solvers/test_idaklu_solver.py @@ -794,6 +794,7 @@ def test_solver_options(self): "max_order_bdf": 4, "max_num_steps": 490, "dt_init": 0.01, + "dt_min": 1e-6, "dt_max": 1000.9, "max_error_test_failures": 11, "max_nonlinear_iterations": 5,