58 template<
class Tvec,
template<
class>
class SPHKernel>
90 using Tscal = shambase::VecComponent<Tvec>;
96 using kill_t = std::variant<Sphere>;
98 std::vector<kill_t> kill_list;
100 inline void add_kill_sphere(
const Tvec ¢er, Tscal radius) {
101 kill_list.push_back(
Sphere{center, radius});
105 template<
class Tscal>
112 bool pure_diffusion_mode =
false;
114 Tscal C_1_fluid = 0.1;
116 Tscal cfl_density_threshold = shambase::get_epsilon<Tscal>();
118 bool ensure_s_j_positivity =
true;
120 bool smooth_s_positivity_limiter =
false;
123 bool dust_corrected_av =
false;
131 using Variant = std::variant<None, MonofluidTVA, MonofluidComplete>;
135 inline void set_none() { current_mode = None{}; }
136 inline void set_monofluid_tva(
138 bool pure_diffusion_mode =
false,
139 Tscal C_1_fluid = 0.1,
141 Tscal cfl_density_threshold = shambase::get_epsilon<Tscal>(),
142 bool ensure_s_j_positivity =
true,
143 bool smooth_s_positivity_limiter =
false,
144 bool dust_corrected_av =
false) {
145 current_mode = MonofluidTVA{
150 cfl_density_threshold,
151 ensure_s_j_positivity,
152 smooth_s_positivity_limiter,
157 inline bool is_none() {
return std::holds_alternative<None>(current_mode); }
158 inline bool is_monofluid_tva() {
return bool(std::get_if<MonofluidTVA>(¤t_mode)); }
159 inline bool is_monofluid_complete() {
160 return bool(std::get_if<MonofluidComplete>(¤t_mode));
167 inline void mode_to_json(nlohmann::json &j)
const {
168 if (
const None *cfg = std::get_if<None>(¤t_mode)) {
169 j = {{
"type",
"none"}};
170 }
else if (
const MonofluidTVA *cfg = std::get_if<MonofluidTVA>(¤t_mode)) {
172 = {{
"type",
"monofluid_tva"},
173 {
"ndust", cfg->ndust},
174 {
"pure_diffusion_mode", cfg->pure_diffusion_mode},
175 {
"C_1_fluid", cfg->C_1_fluid},
176 {
"C_drift", cfg->C_drift},
177 {
"cfl_density_threshold", cfg->cfl_density_threshold},
178 {
"ensure_s_j_positivity", cfg->ensure_s_j_positivity},
179 {
"smooth_s_positivity_limiter", cfg->smooth_s_positivity_limiter},
180 {
"dust_corrected_av", cfg->dust_corrected_av}};
183 j = {{
"type",
"monofluid_complete"}, {
"ndust", cfg->ndust}};
189 inline void mode_from_json(
const nlohmann::json &j) {
190 const std::string type = j.at(
"type").get<std::string>();
191 if (type ==
"none") {
193 }
else if (type ==
"monofluid_tva") {
195 j.at(
"ndust").get<
u32>(),
196 j.at(
"pure_diffusion_mode").get<
bool>(),
197 j.at(
"C_1_fluid").get<Tscal>(),
198 j.at(
"C_drift").get<Tscal>(),
199 j.at(
"cfl_density_threshold").get<Tscal>(),
200 j.at(
"ensure_s_j_positivity").get<
bool>(),
201 j.value(
"smooth_s_positivity_limiter",
false),
202 j.value(
"dust_corrected_av",
false));
203 }
else if (type ==
"monofluid_complete") {
204 set_monofluid_complete(j.at(
"ndust").get<
u32>());
210 inline bool has_s_j_field() {
211 return is_monofluid_tva();
214 inline bool should_use_dust_av() {
215 if (!is_monofluid_tva()) {
218 return get_monofluid_tva().dust_corrected_av;
221 inline bool has_epsilon_field() {
222 return bool(std::get_if<MonofluidComplete>(¤t_mode));
225 inline bool has_deltav_field() {
226 return bool(std::get_if<MonofluidComplete>(¤t_mode));
229 inline u32 get_dust_nvar() {
230 if (
None *cfg = std::get_if<None>(¤t_mode)) {
232 "Querying a dust nvar with no dust as config is ... discutable ...");
234 }
else if (
MonofluidTVA *cfg = std::get_if<MonofluidTVA>(¤t_mode)) {
236 }
else if (
MonofluidComplete *cfg = std::get_if<MonofluidComplete>(¤t_mode)) {
245 std::vector<Tscal> stopping_times;
249 static constexpr bool supersonic_correction =
false;
251 std::vector<Tscal> grains_sizes;
252 std::vector<Tscal> grains_densities;
255 std::variant<None, ConstantStoppingTimes, EpsteinDrag> dust_drag_mode =
None{};
257 bool ballabio_ts_limiter =
false;
259 inline void drag_mode_to_json(nlohmann::json &j)
const {
260 if (std::holds_alternative<None>(dust_drag_mode)) {
261 j = {{
"type",
"none"}};
264 = std::get_if<ConstantStoppingTimes>(&dust_drag_mode)) {
265 j = {{
"type",
"constant_stopping_times"}, {
"stopping_times", cfg->stopping_times}};
266 }
else if (
const EpsteinDrag *cfg = std::get_if<EpsteinDrag>(&dust_drag_mode)) {
268 = {{
"type",
"epstein_drag"},
269 {
"gamma", cfg->gamma},
270 {
"grains_sizes", cfg->grains_sizes},
271 {
"grains_densities", cfg->grains_densities}};
277 inline void drag_mode_from_json(
const nlohmann::json &j) {
278 if (j.at(
"type").get<std::string>() ==
"none") {
279 dust_drag_mode =
None{};
280 }
else if (j.at(
"type").get<std::string>() ==
"constant_stopping_times") {
283 }
else if (j.at(
"type").get<std::string>() ==
"epstein_drag") {
285 j.at(
"gamma").get<Tscal>(),
286 j.at(
"grains_sizes").get<std::vector<Tscal>>(),
287 j.at(
"grains_densities").get<std::vector<Tscal>>()};
295 inline void set_drag_epstein(
EpsteinDrag in) { dust_drag_mode = std::move(in); }
297 inline void check_config() {
298 bool is_not_none = !is_none();
303 "Dust config != None is experimental");
308 "Dust config != None is work in progress, use it at your own risk"));
311 if (std::holds_alternative<None>(dust_drag_mode)) {
313 "you must select a drag mode for the dust if the dust is on !");
316 = std::get_if<ConstantStoppingTimes>(&dust_drag_mode)) {
317 if (get_dust_nvar() != cfg->stopping_times.size()) {
319 "stopping_times size does not match the number of dust bins");
321 }
else if (
EpsteinDrag *cfg = std::get_if<EpsteinDrag>(&dust_drag_mode)) {
322 if (get_dust_nvar() != cfg->grains_densities.size()) {
324 "grains_densities size does not match the number of dust bins");
327 if (get_dust_nvar() != cfg->grains_sizes.size()) {
329 "grains_sizes size does not match the number of dust bins");
339 u32 max_neigh_count = 500;
342 using mode = std::variant<DensityBased, DensityBasedNeighLim>;
346 void set_density_based() { config = DensityBased{}; }
347 void set_density_based_neigh_lim(
u32 max_neigh_count) {
348 config = DensityBasedNeighLim{max_neigh_count};
351 bool is_density_based_neigh_lim()
const {
352 return std::holds_alternative<DensityBasedNeighLim>(config);
378 bool reference_mode =
false;
383 using mode = std::variant<SFMM, FMM, MM, Direct, None>;
385 mode config =
None{};
387 void set_none() { config = None{}; }
388 void set_direct(
bool reference_mode =
false) { config = Direct{reference_mode}; }
389 void set_mm(
u32 mm_order,
f64 opening_angle,
u32 reduction_level) {
392 .opening_angle = opening_angle,
393 .reduction_level = reduction_level};
395 void set_fmm(
u32 order,
f64 opening_angle,
u32 reduction_level) {
397 .order = order, .opening_angle = opening_angle, .reduction_level = reduction_level};
399 void set_sfmm(
u32 order,
f64 opening_angle,
bool leaf_lowering,
u32 reduction_level) {
402 .opening_angle = opening_angle,
403 .leaf_lowering = leaf_lowering,
404 .reduction_level = reduction_level};
407 bool is_none()
const {
return std::holds_alternative<None>(config); }
408 bool is_direct()
const {
return std::holds_alternative<Direct>(config); }
409 bool is_mm()
const {
return std::holds_alternative<MM>(config); }
410 bool is_fmm()
const {
return std::holds_alternative<FMM>(config); }
411 bool is_sfmm()
const {
return std::holds_alternative<SFMM>(config); }
413 bool is_sg_on()
const {
return !is_none(); }
414 bool is_sg_off()
const {
return is_none(); }
420 using mode_soft = std::variant<SofteningPlummer>;
423 void set_softening_plummer(
f64 epsilon) { softening_mode = SofteningPlummer{epsilon}; }
424 void set_softening_none() { set_softening_plummer(0.); }
426 bool is_softening_plummer()
const {
427 return std::holds_alternative<SofteningPlummer>(softening_mode);
433template<
class Tvec,
template<
class>
class SPHKernel>
437 using Tscal = shambase::VecComponent<Tvec>;
439 static constexpr u32 dim = shambase::VectorProperties<Tvec>::dimension;
452 bool track_particles_id =
false;
454 inline void set_particle_tracking(
bool state) { track_particles_id = state; }
463 std::optional<shamunits::UnitSystem<Tscal>>
unit_sys = {};
529 bool show_cfl_detail =
false;
545 mhd_config.set(Tmp{});
563 using DustConfig = DustConfig<Tscal>;
564 DustConfig dust_config = {};
574 SelfGravConfig self_grav_config = SelfGravConfig{};
592 bool show_neigh_stats =
false;
593 inline void set_show_neigh_stats(
bool enable) { show_neigh_stats = enable; }
614 inline void set_smoothing_length_density_based() {
615 smoothing_length_config.set_density_based();
617 inline void set_smoothing_length_density_based_neigh_lim(
u32 max_neigh_count) {
618 smoothing_length_config.set_density_based_neigh_lim(max_neigh_count);
621 bool enable_particle_reordering =
false;
622 inline void set_enable_particle_reordering(
bool enable) { enable_particle_reordering = enable; }
623 u64 particle_reordering_step_freq = 1000;
624 inline void set_particle_reordering_step_freq(
u64 freq) {
627 "particle_reordering_step_freq cannot be zero");
629 particle_reordering_step_freq = freq;
632 bool save_dt_to_fields =
false;
633 inline void set_save_dt_to_fields(
bool enable) { save_dt_to_fields = enable; }
634 inline bool should_save_dt_to_fields()
const {
return save_dt_to_fields; }
636 bool show_ghost_zone_graph =
false;
637 inline void set_show_ghost_zone_graph(
bool enable) { show_ghost_zone_graph = enable; }
656 return bool(std::get_if<T>(&
eos_config.config));
662 return bool(std::get_if<T>(&
eos_config.config));
668 return bool(std::get_if<T>(&
eos_config.config));
674 return bool(std::get_if<T>(&
eos_config.config));
680 return bool(std::get_if<T>(&
eos_config.config));
718 eos_config.set_locally_isothermalLP07(cs0, q, r0);
729 eos_config.set_locally_isothermalFA2014(h_over_r);
743 eos_config.set_locally_isothermalFA2014_extended(cs0, q, r0, n_sinks);
781 using Tmp =
typename AVConfig::None;
955 inline void set_debug_dump(
bool _do_debug_dump, std::string _debug_dump_filename) {
956 this->do_debug_dump = _do_debug_dump;
957 this->debug_dump_filename = _debug_dump_filename;
1027 inline void check_config() {
1028 dust_config.check_config();
1030 if (track_particles_id &&
false ) {
1032 "particle injection is not yet compatible with particle id tracking");
1035 if (track_particles_id) {
1039 if (!self_grav_config.is_none()) {
1041 "Self gravity is experimental, please enable experimental features to use it");
1045 void set_layout(shamrock::patch::PatchDataLayerLayout &pdl);
1046 void set_ghost_layout(shamrock::patch::PatchDataLayerLayout &ghost_layout);
1057 template<
class Tscal>
1060 {
"cfl_cour", p.cfl_cour},
1061 {
"cfl_force", p.cfl_force},
1062 {
"cfl_multiplier_stiffness", p.cfl_multiplier_stiffness},
1063 {
"eta_sink", p.eta_sink}};
1072 template<
class Tscal>
1074 j.at(
"cfl_cour").get_to<Tscal>(p.cfl_cour);
1075 j.at(
"cfl_force").get_to<Tscal>(p.cfl_force);
1076 j.at(
"cfl_multiplier_stiffness").get_to<Tscal>(p.cfl_multiplier_stiffness);
1078 if (j.contains(
"eta_sink")) {
1079 j.at(
"eta_sink").get_to<Tscal>(p.eta_sink);
1083 "SPHConfig",
"eta_sink not found when deserializing, defaulting to", p.eta_sink));
1088 template<
class Tvec>
1089 inline void to_json(nlohmann::json &j,
const ParticleKillingConfig<Tvec> &p) {
1090 j = nlohmann::json::array();
1091 for (
const auto &kill : p.kill_list) {
1092 if (std::holds_alternative<
typename ParticleKillingConfig<Tvec>::Sphere>(kill)) {
1093 const auto &sphere = std::get<typename ParticleKillingConfig<Tvec>::Sphere>(kill);
1095 {{
"type",
"sphere"}, {
"center", sphere.center}, {
"radius", sphere.radius}});
1101 template<
class Tvec>
1103 p.kill_list.clear();
1104 for (
const auto &item : j) {
1105 std::string type = item.at(
"type").get<std::string>();
1106 if (type ==
"sphere") {
1108 item.at(
"center").get_to(sphere.center);
1109 item.at(
"radius").get_to(sphere.radius);
1110 p.kill_list.push_back(sphere);
1119 = std::get_if<SmoothingLengthConfig::DensityBased>(&p.config)) {
1121 {
"type",
"density_based"},
1126 = std::get_if<SmoothingLengthConfig::DensityBasedNeighLim>(&p.config)) {
1129 {
"type",
"density_based_neigh_lim"},
1130 {
"max_neigh_count", conf->max_neigh_count},
1138 if (j.at(
"type").get<std::string>() ==
"density_based") {
1140 }
else if (j.at(
"type").get<std::string>() ==
"density_based_neigh_lim") {
1153 {
"order", conf->order},
1154 {
"opening_angle", conf->opening_angle},
1155 {
"reduction_level", conf->reduction_level},
1156 {
"leaf_lowering", conf->leaf_lowering},
1158 }
else if (
const SelfGravConfig::FMM *conf = std::get_if<SelfGravConfig::FMM>(&p.config)) {
1161 {
"order", conf->order},
1162 {
"opening_angle", conf->opening_angle},
1163 {
"reduction_level", conf->reduction_level},
1165 }
else if (
const SelfGravConfig::MM *conf = std::get_if<SelfGravConfig::MM>(&p.config)) {
1168 {
"order", conf->order},
1169 {
"opening_angle", conf->opening_angle},
1170 {
"reduction_level", conf->reduction_level},
1176 {
"reference_mode", conf->reference_mode},
1186 = std::get_if<SelfGravConfig::SofteningPlummer>(&p.softening_mode)) {
1187 j[
"softening_mode"] =
"plummer";
1188 j[
"softening_length"] = conf->epsilon;
1196 if (j.at(
"type").get<std::string>() ==
"sfmm") {
1198 .order = j.at(
"order").get<
u32>(),
1199 .opening_angle = j.at(
"opening_angle").get<
f64>(),
1200 .leaf_lowering = j.at(
"leaf_lowering").get<
bool>(),
1201 .reduction_level = j.at(
"reduction_level").get<
u32>()};
1202 }
else if (j.at(
"type").get<std::string>() ==
"fmm") {
1204 .order = j.at(
"order").get<
u32>(),
1205 .opening_angle = j.at(
"opening_angle").get<
f64>(),
1206 .reduction_level = j.at(
"reduction_level").get<
u32>()};
1207 }
else if (j.at(
"type").get<std::string>() ==
"mm") {
1209 .order = j.at(
"order").get<
u32>(),
1210 .opening_angle = j.at(
"opening_angle").get<
f64>(),
1211 .reduction_level = j.at(
"reduction_level").get<
u32>()};
1212 }
else if (j.at(
"type").get<std::string>() ==
"direct") {
1214 }
else if (j.at(
"type").get<std::string>() ==
"none") {
1218 "Invalid self gravity type: " + j.at(
"type").get<std::string>());
1221 if (j.contains(
"softening_mode")) {
1222 std::string softening_mode = j.at(
"softening_mode").get<std::string>();
1223 if (softening_mode ==
"plummer") {
1228 "Invalid softening mode: " + softening_mode);
1234 template<
class Tvec>
1235 inline void to_json(nlohmann::json &j,
const DustConfig<Tvec> &p) {
1238 p.mode_to_json(j[
"mode"]);
1239 p.drag_mode_to_json(j[
"drag_mode"]);
1240 j[
"ballabio_ts_limiter"] = p.ballabio_ts_limiter;
1243 template<
class Tvec>
1245 p.mode_from_json(j.at(
"mode"));
1246 p.drag_mode_from_json(j.at(
"drag_mode"));
1247 p.ballabio_ts_limiter = j.value(
"ballabio_ts_limiter",
false);
1256 template<
class Tvec,
template<
class>
class SPHKernel>
1259 using Tkernel =
typename T::Kernel;
1261 std::string kernel_id = shambase::get_type_name<Tkernel>();
1262 std::string type_id = shambase::get_type_name<Tvec>();
1266 {
"kernel_id", kernel_id},
1267 {
"type_id", type_id},
1269 {
"scheduler_config", p.scheduler_conf},
1271 {
"gpart_mass", p.gpart_mass},
1272 {
"cfl_config", p.cfl_config},
1273 {
"unit_sys", p.unit_sys},
1274 {
"show_cfl_detail", p.show_cfl_detail},
1276 {
"mhd_config", p.mhd_config},
1278 {
"dust_config", p.dust_config},
1280 {
"self_grav_config", p.self_grav_config},
1282 {
"tree_reduction_level", p.tree_reduction_level},
1283 {
"use_two_stage_search", p.use_two_stage_search},
1284 {
"show_neigh_stats", p.show_neigh_stats},
1286 {
"combined_dtdiv_divcurlv_compute", p.combined_dtdiv_divcurlv_compute},
1287 {
"htol_up_coarse_cycle", p.htol_up_coarse_cycle},
1288 {
"htol_up_fine_cycle", p.htol_up_fine_cycle},
1289 {
"epsilon_h", p.epsilon_h},
1290 {
"smoothing_length_config", p.smoothing_length_config},
1291 {
"h_iter_per_subcycles", p.h_iter_per_subcycles},
1292 {
"h_max_subcycles_count", p.h_max_subcycles_count},
1294 {
"enable_particle_reordering", p.enable_particle_reordering},
1295 {
"particle_reordering_step_freq", p.particle_reordering_step_freq},
1297 {
"save_dt_to_fields", p.save_dt_to_fields},
1298 {
"show_ghost_zone_graph", p.show_ghost_zone_graph},
1300 {
"eos_config", p.eos_config},
1302 {
"artif_viscosity", p.artif_viscosity},
1303 {
"boundary_config", p.boundary_config},
1304 {
"ext_force_config", p.ext_force_config},
1306 {
"do_debug_dump", p.do_debug_dump},
1307 {
"debug_dump_filename", p.debug_dump_filename},
1309 {
"particle_killing", p.particle_killing},
1319 template<
class Tvec,
template<
class>
class SPHKernel>
1322 using Tkernel =
typename T::Kernel;
1325 if (j.contains(
"kernel_id")) {
1327 std::string kernel_id = j.at(
"kernel_id").get<std::string>();
1329 if (kernel_id != shambase::get_type_name<Tkernel>()) {
1331 "Invalid type to deserialize, wanted " + shambase::get_type_name<Tvec>()
1332 +
" but got " + kernel_id);
1336 if (j.contains(
"type_id")) {
1338 std::string type_id = j.at(
"type_id").get<std::string>();
1340 if (type_id != shambase::get_type_name<Tvec>()) {
1342 "Invalid type to deserialize, wanted " + shambase::get_type_name<Tvec>()
1343 +
" but got " + type_id);
1347 bool has_used_defaults =
false;
1348 bool has_updated_config =
false;
1350 auto _get_to_if_contains = [&](
const std::string &key,
auto &value) {
1354 auto _get_to_if_contains_fallbacks = [&](
const std::string &key,
1356 std::initializer_list<const char *> fallbacks) {
1358 j, key, value, fallbacks, has_used_defaults, has_updated_config);
1361 _get_to_if_contains(
"scheduler_config", p.scheduler_conf);
1364 _get_to_if_contains(
"gpart_mass", p.gpart_mass);
1365 _get_to_if_contains(
"cfl_config", p.cfl_config);
1366 _get_to_if_contains(
"unit_sys", p.unit_sys);
1367 _get_to_if_contains(
"show_cfl_detail", p.show_cfl_detail);
1368 _get_to_if_contains(
"mhd_config", p.mhd_config);
1369 _get_to_if_contains(
"dust_config", p.dust_config);
1370 _get_to_if_contains(
"self_grav_config", p.self_grav_config);
1371 _get_to_if_contains(
"tree_reduction_level", p.tree_reduction_level);
1372 _get_to_if_contains(
"use_two_stage_search", p.use_two_stage_search);
1373 _get_to_if_contains(
"show_neigh_stats", p.show_neigh_stats);
1374 _get_to_if_contains(
"combined_dtdiv_divcurlv_compute", p.combined_dtdiv_divcurlv_compute);
1377 _get_to_if_contains_fallbacks(
1378 "htol_up_coarse_cycle", p.htol_up_coarse_cycle, {
"htol_up_tol"});
1379 _get_to_if_contains_fallbacks(
"htol_up_fine_cycle", p.htol_up_fine_cycle, {
"htol_up_iter"});
1381 _get_to_if_contains(
"epsilon_h", p.epsilon_h);
1382 _get_to_if_contains(
"smoothing_length_config", p.smoothing_length_config);
1383 _get_to_if_contains(
"h_iter_per_subcycles", p.h_iter_per_subcycles);
1384 _get_to_if_contains(
"h_max_subcycles_count", p.h_max_subcycles_count);
1385 _get_to_if_contains(
"enable_particle_reordering", p.enable_particle_reordering);
1386 _get_to_if_contains(
"particle_reordering_step_freq", p.particle_reordering_step_freq);
1387 _get_to_if_contains(
"save_dt_to_fields", p.save_dt_to_fields);
1388 _get_to_if_contains(
"show_ghost_zone_graph", p.show_ghost_zone_graph);
1389 _get_to_if_contains(
"eos_config", p.eos_config);
1390 _get_to_if_contains(
"artif_viscosity", p.artif_viscosity);
1391 _get_to_if_contains(
"boundary_config", p.boundary_config);
1392 _get_to_if_contains(
"ext_force_config", p.ext_force_config);
1393 _get_to_if_contains(
"do_debug_dump", p.do_debug_dump);
1394 _get_to_if_contains(
"debug_dump_filename", p.debug_dump_filename);
1395 _get_to_if_contains(
"particle_killing", p.particle_killing);
1397 if (has_used_defaults || has_updated_config) {
1400 "SPH::SolverConfig",
Header file describing a Node Instance.
double f64
Alias for double.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
A Compressed Leaf Bounding Volume Hierarchy (CLBVH) for neighborhood queries.
This header file contains utility functions related to exception handling in the code.
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.
T & get_check_ref(const std::unique_ptr< T > &ptr, SourceLocation loc=SourceLocation())
Takes a std::unique_ptr and returns a reference to the object it holds. It throws a std::runtime_erro...
ExcptTypes make_except_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Create an exception with a message and a location.
void throw_unimplemented(SourceLocation loc=SourceLocation{})
Throw a std::runtime_error saying that the function is unimplemented.
i32 world_rank()
Gives the rank of the current process in the MPI communicator.
namespace for the sph model
void to_json(nlohmann::json &j, const EOSConfig< Tvec > &p)
Serialize EOSConfig to json.
void get_to_if_contains(const nlohmann::json &j, const std::string &key, T &value, bool &has_used_defaults)
void experimental_feature_check(const std::string &message, SourceLocation loc=SourceLocation{})
Check if experimental features are enabled, if not throw with the given message.
std::string log_json_changes(const nlohmann::json &j_current, const nlohmann::json &j, bool has_used_defaults, bool has_updated_config)
Shown the changes between two JSON objects to log config changes.
bool are_experimental_features_allowed()
Allow the use of experimental features.
void get_to_if_contains_fallbacks(const nlohmann::json &j, const std::string &key, T &value, std::initializer_list< const char * > fallbacks, bool &has_used_defaults, bool &has_updated_config)
Contains traits and utilities for backend related types.
void raw_ln(Types... var2)
Prints a log message with multiple arguments followed by a newline.
void info_ln(std::string module_name, Types... var2)
Prints a log message with multiple arguments followed by a newline.
void warn_ln(std::string module_name, Types... var2)
Prints a log message with multiple arguments followed by a newline.
Locally isothermal equation of state configuration.
Configuration struct for the equation of state used in the hydrodynamic models.
shamphys::EOS_Config_Polytropic< Tscal > Polytropic
Polytropic equation of state configuration.
shamphys::EOS_Config_Isothermal< Tscal > Isothermal
Isothermal equation of state configuration.
shamphys::EOS_Config_Fermi< Tscal > Fermi
Fermi equation of state configuration.
shamphys::EOS_Config_Adiabatic< Tscal > Adiabatic
Adiabatic equation of state configuration.
The configuration for the CFL condition.
Tscal eta_sink
eta sink to control the sink integrator
Tscal cfl_cour
The CFL condition for the courant factor.
Tscal cfl_multiplier_stiffness
The CFL multiplier stiffness.
Tscal cfl_force
The CFL condition for the force.
std::variant< None, MonofluidTVA, MonofluidComplete > Variant
Variant type to store the EOS configuration.
The configuration for a sph solver.
bool ghost_has_soundspeed()
Whether the ghost cells have a sound speed (i.e. the eos is locally isothermal).
AVConfig artif_viscosity
Configuration for the Artificial Viscosity (AV).
void set_eos_isothermal(Tscal cs)
Set the EOS configuration to an isothermal equation of state.
Tscal gpart_mass
The mass of each gas particle.
u32 h_max_subcycles_count
Maximum number of subcycles before solver crash.
bool compute_luminosity
Whether to store luminosity.
void print_status()
Print the current status of the solver config.
void set_eos_adiabatic(Tscal gamma)
Set the EOS configuration to an adiabatic equation of state.
bool has_field_uint()
Whether the solver has a field for the particle's uint.
bool is_eos_isothermal()
Check if the EOS is an isothermal equation of state.
BCConfig boundary_config
Boundary condition configuration.
bool has_field_psi_on_ch()
Whether the solver has a field for psi_on_ch.
void set_cfl_mult_stiffness(Tscal cstiff)
Set the CFL multiplier for the stiffness.
bool use_two_stage_search
Use two stage neighbors search (see shamrock paper).
bool has_field_dtdivB()
Whether the solver has a field for dt divB.
bool has_axyz_in_ghost()
Whether the solver has a field for ax, ay, az in ghost cells.
void set_eos_locally_isothermalLP07(Tscal cs0, Tscal q, Tscal r0)
Set the EOS configuration to a locally isothermal equation of state from Lodato Price 2007.
CFLConfig< Tscal > cfl_config
The configuration for the CFL condition.
bool has_field_divB()
Whether the solver has a field for divB.
void set_artif_viscosity_VaryingMM97(typename AVConfig::VaryingMM97 v)
Set the artificial viscosity configuration to a varying value using the prescription of Monaghan & Gi...
bool combined_dtdiv_divcurlv_compute
Tscal epsilon_h
Convergence criteria for the smoothing length.
SPHKernel< Tscal > Kernel
The type of the kernel used for the SPH interactions.
bool has_field_curlB()
Whether the solver has a field for curlB.
void add_ext_force_point_mass(Tscal central_mass, Tscal Racc)
Add a point mass external force.
Tscal htol_up_coarse_cycle
bool do_debug_dump
Whether to dump debug information to file.
bool has_field_divv()
Whether the solver has a field for divv.
shambase::VecComponent< Tvec > Tscal
The type of the scalar used to represent the quantities.
Tscal get_cfl_mult_stiffness()
Get the CFL multiplier for the stiffness.
bool has_field_alphaAV()
Whether the solver has a field for alpha AV.
void set_debug_dump(bool _do_debug_dump, std::string _debug_dump_filename)
Set whether to dump debug information to file.
u32 h_iter_per_subcycles
Maximum number of iterations per subcycle.
shammodels::ExtForceConfig< Tvec > ExtForceConfig
External force configuration.
bool is_eos_adiabatic()
Check if the EOS is an adiabatic equation of state.
void set_artif_viscosity_VaryingCD10(typename AVConfig::VaryingCD10 v)
Set the artificial viscosity configuration to a varying value using the prescription of Cullen & Dehn...
void set_two_stage_search(bool enable)
Setter for the two stage search.
void set_boundary_free()
Set the boundary condition to free boundary.
bool has_field_curlv()
Whether the solver has a field for curlv.
bool has_field_dtdivv()
Whether the solver has a field for dt divv.
std::string debug_dump_filename
The filename to dump debug information in.
void add_ext_force_paczynski_wiita(Tscal central_mass, Tvec central_pos, Tscal Racc)
Add a post-newtonian Paczynski-Wiita potential.
bool is_eos_locally_isothermal()
Check if the EOS is a locally isothermal equation of state.
static constexpr Tscal Rkern
The radius of the sph kernel.
void set_eos_locally_isothermalFA2014_extended(Tscal cs0, Tscal q, Tscal r0, u32 n_sinks)
Set the EOS configuration to a locally isothermal equation of state from Farris 2014 extended to q !...
void set_eos_locally_isothermal()
Set the EOS configuration to a locally isothermal equation of state.
Tscal get_constant_G()
Retrieves the value of the constant G based on the unit system.
void set_eos_locally_isothermalFA2014(Tscal h_over_r)
Set the EOS configuration to a locally isothermal equation of state fromFarris 2014.
u32 u_morton
The type of the Morton code for the tree.
Tscal get_constant_mu_0()
Retrieves the value of the constant mu_0 based on the unit system.
void set_units(shamunits::UnitSystem< Tscal > new_sys)
Set the unit system of the simulation.
void set_artif_viscosity_None()
Set the artificial viscosity configuration to None.
bool is_eos_fermi()
Check if the EOS is a Fermi equation of state.
void set_IdealMHD(typename MHDConfig::IdealMHD_constrained_hyper_para v)
Enable the ideal MHD hydro solver.
void set_tree_reduction_level(u32 level)
Setter for the tree reduction level.
static constexpr u32 dim
The dimension of the problem.
void set_eos_polytropic(Tscal K, Tscal gamma)
Set the EOS configuration to an polytropic equation of state.
Tscal get_constant_c()
Retrieves the value of the constant c based on the unit system.
void set_artif_viscosity_Constant(typename AVConfig::Constant v)
Set the artificial viscosity configuration to a constant value.
bool is_eos_polytropic()
Check if the EOS is a polytropic equation of state.
AVConfig< Tvec > AVConfig
Configuration for the Artificial Viscosity (AV).
BCConfig< Tvec > BCConfig
Configuration of the boundary conditions.
void set_boundary_shearing_periodic(i32_3 shear_base, i32_3 shear_dir, Tscal speed)
Set the boundary condition to shearing periodic boundary.
Tscal htol_up_fine_cycle
Maximum factor of the smoothing length evolution per subcycles.
void set_boundary_periodic()
Set the boundary condition to periodic boundary.
u32 tree_reduction_level
Reduction level to be used in the tree build.
bool has_field_B_on_rho()
Whether the solver has a field for B_on_rho.
constexpr bool do_MHD_debug()
Whether to add debug fields to the pdl.
std::optional< shamunits::UnitSystem< Tscal > > unit_sys
The unit system of the simulation.
EOSConfig eos_config
EOS configuration.
shammodels::EOSConfig< Tvec > EOSConfig
Alias to EOSConfig type.
bool has_field_soundspeed()
Whether the solver has a field for sound speed.
void set_noMHD()
disable MHD in the SPH solver
ExtForceConfig ext_force_config
External force configuration.
void add_ext_force_shearing_box(Tscal Omega_0, Tscal eta, Tscal q)
Add a shearing box external force.
void set_artif_viscosity_ConstantDisc(typename AVConfig::ConstantDisc v)
Set the artificial viscosity configuration to a constant value in the disc plane.
void add_ext_force_lense_thirring(Tscal central_mass, Tscal Racc, Tscal a_spin, Tvec dir_spin)
Add a Lense-Thirring external force.
void set_eos_fermi(Tscal mu_e)
Set the EOS configuration to a Fermi equation of state.
constexpr T c()
get c in the current unit system units (m.s-1)
constexpr T G()
get the value of G in the current unit system units
constexpr T mu_0()
get the value of mu_0 in the current unit system units
Functions related to the MPI communicator.
#define ON_RANK_0(x)
Macro to execute code only on rank 0.