From f5e99a880c27122aed189ec67f7de2749c288d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20David--Cl=C3=A9ris?= Date: Thu, 12 Feb 2026 13:58:07 +0100 Subject: [PATCH 1/4] [Ramses] add a string based slope limiter selection --- .../examples/tests_ci/sod_tube_godunov_amr.py | 2 +- .../shammodels/ramses/SolverConfig.hpp | 33 ++++++++++++++- src/shammodels/ramses/src/pyRamsesModel.cpp | 42 ++++++++++++++++--- 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py b/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py index f1bb6d62b4..f49a7fd13d 100644 --- a/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py +++ b/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py @@ -38,7 +38,7 @@ # cfg.set_slope_lim_vanleer_f() # cfg.set_slope_lim_vanleer_std() # cfg.set_slope_lim_vanleer_sym() -cfg.set_slope_lim_minmod() +cfg.set_slope_limiter("minmod") cfg.set_face_time_interpolation(True) mass_crit = 0.0000001 * 5 * 2 * 1.2 cfg.set_amr_mode_density_based(crit_mass=mass_crit) diff --git a/src/shammodels/ramses/include/shammodels/ramses/SolverConfig.hpp b/src/shammodels/ramses/include/shammodels/ramses/SolverConfig.hpp index 11411f3e74..fabee4da2b 100644 --- a/src/shammodels/ramses/include/shammodels/ramses/SolverConfig.hpp +++ b/src/shammodels/ramses/include/shammodels/ramses/SolverConfig.hpp @@ -179,8 +179,37 @@ struct shammodels::basegodunov::SolverConfig { inline void set_eos_gamma(Tscal gamma) { eos_gamma = gamma; } - RiemmanSolverMode riemman_config = HLL; - SlopeMode slope_config = VanLeer_sym; + RiemmanSolverMode riemman_config = HLL; + SlopeMode slope_config = VanLeer_sym; + + inline static const std::map slope_mode_string_map = { + {"none", None}, + {"vanleer_f", VanLeer_f}, + {"vanleer_std", VanLeer_std}, + {"vanleer_sym", VanLeer_sym}, + {"minmod", Minmod}, + }; + + inline static const std::vector get_valid_slope_modes() { + std::vector valid_slope_modes; + for (const auto &[key, value] : slope_mode_string_map) { + valid_slope_modes.push_back(key); + } + return valid_slope_modes; + } + + inline void set_slope_limiter(std::string slope_mode) { + auto it = slope_mode_string_map.find(slope_mode); + if (it != slope_mode_string_map.end()) { + slope_config = it->second; + } else { + throw shambase::make_except_with_loc(shambase::format( + "Unsupported slope mode: {} (expected one of: {})", + slope_mode, + get_valid_slope_modes())); + } + } + bool face_half_time_interpolation = true; inline bool should_compute_rho_mean() { return is_gravity_on() && is_boundary_periodic(); } diff --git a/src/shammodels/ramses/src/pyRamsesModel.cpp b/src/shammodels/ramses/src/pyRamsesModel.cpp index b569a21349..7dad0e8a58 100644 --- a/src/shammodels/ramses/src/pyRamsesModel.cpp +++ b/src/shammodels/ramses/src/pyRamsesModel.cpp @@ -72,30 +72,62 @@ namespace shammodels::basegodunov { [](TConfig &self) { self.riemman_config = Rusanov; }) + .def( + "set_slope_limiter", + &TConfig::set_slope_limiter, + py::arg("slope_mode"), + R"==( + Set the slope limiter mode. + )==") .def( "set_slope_lim_none", [](TConfig &self) { - self.slope_config = None; + ON_RANK_0( + logger::warn_ln( + "Ramses::SolverConfig", + ".set_slope_lim_none() is deprecated, use .set_slope_limiter(\"none\") " + "instead")); + self.set_slope_limiter("none"); }) .def( "set_slope_lim_vanleer_f", [](TConfig &self) { - self.slope_config = VanLeer_f; + ON_RANK_0( + logger::warn_ln( + "Ramses::SolverConfig", + ".set_slope_lim_vanleer_f() is deprecated, use " + ".set_slope_limiter(\"vanleer_f\") instead")); + self.set_slope_limiter("vanleer_f"); }) .def( "set_slope_lim_vanleer_std", [](TConfig &self) { - self.slope_config = VanLeer_std; + ON_RANK_0( + logger::warn_ln( + "Ramses::SolverConfig", + ".set_slope_lim_vanleer_std() is deprecated, use " + ".set_slope_limiter(\"vanleer_std\") instead")); + self.set_slope_limiter("vanleer_std"); }) .def( "set_slope_lim_vanleer_sym", [](TConfig &self) { - self.slope_config = VanLeer_sym; + ON_RANK_0( + logger::warn_ln( + "Ramses::SolverConfig", + ".set_slope_lim_vanleer_sym() is deprecated, use " + ".set_slope_limiter(\"vanleer_sym\") instead")); + self.set_slope_limiter("vanleer_sym"); }) .def( "set_slope_lim_minmod", [](TConfig &self) { - self.slope_config = Minmod; + ON_RANK_0( + logger::warn_ln( + "Ramses::SolverConfig", + ".set_slope_lim_minmod() is deprecated, use " + ".set_slope_limiter(\"minmod\") instead")); + self.set_slope_limiter("minmod"); }) .def( "set_face_time_interpolation", From 45e0c22a90454a2b39b759f35ebf393fc3afe322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David--Cl=C3=A9ris=20Timoth=C3=A9e?= Date: Mon, 16 Feb 2026 23:19:48 +0100 Subject: [PATCH 2/4] Apply suggestion from @nbrucy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: NoƩ Brucy --- doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py b/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py index f49a7fd13d..a2bd9c0fa3 100644 --- a/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py +++ b/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py @@ -37,7 +37,7 @@ # cfg.set_slope_lim_none() # cfg.set_slope_lim_vanleer_f() # cfg.set_slope_lim_vanleer_std() -# cfg.set_slope_lim_vanleer_sym() +# Set the slope limiter (among "none", "vanleer_f", "vanleer_std", "vanleer_sym", "minmod" cfg.set_slope_limiter("minmod") cfg.set_face_time_interpolation(True) mass_crit = 0.0000001 * 5 * 2 * 1.2 From 0d3f31a1a5ec441ed8deeeeffb60943909145032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20David--Cl=C3=A9ris?= Date: Mon, 16 Feb 2026 23:20:34 +0100 Subject: [PATCH 3/4] retry --- doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py b/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py index a2bd9c0fa3..b88a5fd9cb 100644 --- a/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py +++ b/doc/sphinx/examples/tests_ci/sod_tube_godunov_amr.py @@ -34,10 +34,7 @@ # cfg.set_riemann_solver_rusanov() cfg.set_riemann_solver_hll() -# cfg.set_slope_lim_none() -# cfg.set_slope_lim_vanleer_f() -# cfg.set_slope_lim_vanleer_std() -# Set the slope limiter (among "none", "vanleer_f", "vanleer_std", "vanleer_sym", "minmod" +# Set the slope limiter (among "none", "vanleer_f", "vanleer_std", "vanleer_sym", "minmod") cfg.set_slope_limiter("minmod") cfg.set_face_time_interpolation(True) mass_crit = 0.0000001 * 5 * 2 * 1.2 From 00290f821261833899cfdf5c13ad02193fa5196b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20David--Cl=C3=A9ris?= Date: Mon, 16 Feb 2026 23:54:49 +0100 Subject: [PATCH 4/4] using json directly ? --- .../shammodels/ramses/SolverConfig.hpp | 94 ++++++++++++------- src/shammodels/ramses/src/pyRamsesModel.cpp | 32 +++++-- 2 files changed, 86 insertions(+), 40 deletions(-) diff --git a/src/shammodels/ramses/include/shammodels/ramses/SolverConfig.hpp b/src/shammodels/ramses/include/shammodels/ramses/SolverConfig.hpp index fabee4da2b..c6efd8252f 100644 --- a/src/shammodels/ramses/include/shammodels/ramses/SolverConfig.hpp +++ b/src/shammodels/ramses/include/shammodels/ramses/SolverConfig.hpp @@ -35,14 +35,66 @@ namespace shammodels::basegodunov { enum RiemmanSolverMode { Rusanov = 0, HLL = 1, HLLC = 2 }; - enum SlopeMode { - None = 0, - VanLeer_f = 1, - VanLeer_std = 2, - VanLeer_sym = 3, - Minmod = 4, + struct SlopeLimConfig { + + enum SlopeMode { + None = 0, + VanLeer_f = 1, + VanLeer_std = 2, + VanLeer_sym = 3, + Minmod = 4, + }; + + inline static const std::map slope_mode_string_map = { + {"none", None}, + {"vanleer_f", VanLeer_f}, + {"vanleer_std", VanLeer_std}, + {"vanleer_sym", VanLeer_sym}, + {"minmod", Minmod}, + }; + + inline static const std::vector get_valid_slope_modes() { + std::vector valid_slope_modes; + for (const auto &[key, value] : slope_mode_string_map) { + valid_slope_modes.push_back(key); + } + return valid_slope_modes; + } + + SlopeMode mode; }; + inline void to_json(nlohmann::json &j, const SlopeLimConfig &p) { + + for (const auto &[key, value] : SlopeLimConfig::slope_mode_string_map) { + if (value == p.mode) { + j = nlohmann::json{ + {"slope_mode", key}, + }; + return; + } + } + + throw shambase::make_except_with_loc(shambase::format( + "Unsupported slope mode: {} (expected one of: {})", + p.mode, + SlopeLimConfig::get_valid_slope_modes())); + } + + inline void from_json(const nlohmann::json &j, SlopeLimConfig &p) { + std::string slope_mode = j.at("slope_mode").get(); + + try { + p.mode = SlopeLimConfig::slope_mode_string_map.at(slope_mode); + } catch (const std::out_of_range &e) { + throw shambase::make_except_with_loc(shambase::format( + "Unsupported slope mode: {} (expected one of: {})\n current json: {}", + slope_mode, + SlopeLimConfig::get_valid_slope_modes(), + j.dump(4))); + } + } + enum DustRiemannSolverMode { NoDust = 0, DHLL = 1, // Dust HLL . This is merely the HLL solver for dust. It's then a Rusanov like @@ -180,35 +232,9 @@ struct shammodels::basegodunov::SolverConfig { inline void set_eos_gamma(Tscal gamma) { eos_gamma = gamma; } RiemmanSolverMode riemman_config = HLL; - SlopeMode slope_config = VanLeer_sym; - - inline static const std::map slope_mode_string_map = { - {"none", None}, - {"vanleer_f", VanLeer_f}, - {"vanleer_std", VanLeer_std}, - {"vanleer_sym", VanLeer_sym}, - {"minmod", Minmod}, - }; - - inline static const std::vector get_valid_slope_modes() { - std::vector valid_slope_modes; - for (const auto &[key, value] : slope_mode_string_map) { - valid_slope_modes.push_back(key); - } - return valid_slope_modes; - } + SlopeLimConfig slope_config = SlopeLimConfig{SlopeLimConfig::VanLeer_sym}; - inline void set_slope_limiter(std::string slope_mode) { - auto it = slope_mode_string_map.find(slope_mode); - if (it != slope_mode_string_map.end()) { - slope_config = it->second; - } else { - throw shambase::make_except_with_loc(shambase::format( - "Unsupported slope mode: {} (expected one of: {})", - slope_mode, - get_valid_slope_modes())); - } - } + void set_slope_limiter(const nlohmann::json &j) { j.get_to(slope_config); } bool face_half_time_interpolation = true; diff --git a/src/shammodels/ramses/src/pyRamsesModel.cpp b/src/shammodels/ramses/src/pyRamsesModel.cpp index 7dad0e8a58..45c7bb7ff8 100644 --- a/src/shammodels/ramses/src/pyRamsesModel.cpp +++ b/src/shammodels/ramses/src/pyRamsesModel.cpp @@ -74,7 +74,12 @@ namespace shammodels::basegodunov { }) .def( "set_slope_limiter", - &TConfig::set_slope_limiter, + [](TConfig &self, std::string slope_mode) { + self.set_slope_limiter( + nlohmann::json{ + {"slope_mode", slope_mode}, + }); + }, py::arg("slope_mode"), R"==( Set the slope limiter mode. @@ -87,7 +92,10 @@ namespace shammodels::basegodunov { "Ramses::SolverConfig", ".set_slope_lim_none() is deprecated, use .set_slope_limiter(\"none\") " "instead")); - self.set_slope_limiter("none"); + self.set_slope_limiter( + nlohmann::json{ + {"slope_mode", "none"}, + }); }) .def( "set_slope_lim_vanleer_f", @@ -97,7 +105,10 @@ namespace shammodels::basegodunov { "Ramses::SolverConfig", ".set_slope_lim_vanleer_f() is deprecated, use " ".set_slope_limiter(\"vanleer_f\") instead")); - self.set_slope_limiter("vanleer_f"); + self.set_slope_limiter( + nlohmann::json{ + {"slope_mode", "vanleer_f"}, + }); }) .def( "set_slope_lim_vanleer_std", @@ -107,7 +118,10 @@ namespace shammodels::basegodunov { "Ramses::SolverConfig", ".set_slope_lim_vanleer_std() is deprecated, use " ".set_slope_limiter(\"vanleer_std\") instead")); - self.set_slope_limiter("vanleer_std"); + self.set_slope_limiter( + nlohmann::json{ + {"slope_mode", "vanleer_std"}, + }); }) .def( "set_slope_lim_vanleer_sym", @@ -117,7 +131,10 @@ namespace shammodels::basegodunov { "Ramses::SolverConfig", ".set_slope_lim_vanleer_sym() is deprecated, use " ".set_slope_limiter(\"vanleer_sym\") instead")); - self.set_slope_limiter("vanleer_sym"); + self.set_slope_limiter( + nlohmann::json{ + {"slope_mode", "vanleer_sym"}, + }); }) .def( "set_slope_lim_minmod", @@ -127,7 +144,10 @@ namespace shammodels::basegodunov { "Ramses::SolverConfig", ".set_slope_lim_minmod() is deprecated, use " ".set_slope_limiter(\"minmod\") instead")); - self.set_slope_limiter("minmod"); + self.set_slope_limiter( + nlohmann::json{ + {"slope_mode", "minmod"}, + }); }) .def( "set_face_time_interpolation",