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..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,11 +34,8 @@ # 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() -# cfg.set_slope_lim_vanleer_sym() -cfg.set_slope_lim_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 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..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 @@ -179,8 +231,11 @@ 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; + SlopeLimConfig slope_config = SlopeLimConfig{SlopeLimConfig::VanLeer_sym}; + + void set_slope_limiter(const nlohmann::json &j) { j.get_to(slope_config); } + 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..45c7bb7ff8 100644 --- a/src/shammodels/ramses/src/pyRamsesModel.cpp +++ b/src/shammodels/ramses/src/pyRamsesModel.cpp @@ -72,30 +72,82 @@ namespace shammodels::basegodunov { [](TConfig &self) { self.riemman_config = Rusanov; }) + .def( + "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. + )==") .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( + nlohmann::json{ + {"slope_mode", "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( + nlohmann::json{ + {"slope_mode", "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( + nlohmann::json{ + {"slope_mode", "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( + nlohmann::json{ + {"slope_mode", "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( + nlohmann::json{ + {"slope_mode", "minmod"}, + }); }) .def( "set_face_time_interpolation",