58 template<
class Tvec,
template<
class>
class SPHKernel>
98 using Tscal = shambase::VecComponent<Tvec>;
104 using kill_t = std::variant<Sphere>;
106 std::vector<kill_t> kill_list;
108 inline void add_kill_sphere(
const Tvec ¢er, Tscal radius) {
109 kill_list.push_back(
Sphere{center, radius});
113 template<
class Tscal>
120 bool pure_diffusion_mode =
false;
128 using Variant = std::variant<None, MonofluidTVI, MonofluidComplete>;
132 inline void set_none() { current_mode = None{}; }
133 inline void set_monofluid_tvi(
u32 nvar,
bool pure_diffusion_mode =
false) {
134 current_mode = MonofluidTVI{nvar, pure_diffusion_mode};
138 inline bool is_none() {
return std::holds_alternative<None>(current_mode); }
139 inline bool is_monofluid_tvi() {
return bool(std::get_if<MonofluidTVI>(¤t_mode)); }
140 inline bool is_monofluid_complete() {
141 return bool(std::get_if<MonofluidComplete>(¤t_mode));
144 inline void mode_to_json(nlohmann::json &j)
const {
145 if (
const None *cfg = std::get_if<None>(¤t_mode)) {
146 j = {{
"type",
"none"}};
147 }
else if (
const MonofluidTVI *cfg = std::get_if<MonofluidTVI>(¤t_mode)) {
149 = {{
"type",
"monofluid_tvi"},
150 {
"ndust", cfg->ndust},
151 {
"pure_diffusion_mode", cfg->pure_diffusion_mode}};
154 j = {{
"type",
"monofluid_complete"}, {
"ndust", cfg->ndust}};
160 inline void mode_from_json(
const nlohmann::json &j) {
161 const std::string type = j.at(
"type").get<std::string>();
162 if (type ==
"none") {
164 }
else if (type ==
"monofluid_tvi") {
166 j.at(
"ndust").get<
u32>(), j.at(
"pure_diffusion_mode").get<
bool>());
167 }
else if (type ==
"monofluid_complete") {
168 set_monofluid_complete(j.at(
"ndust").get<
u32>());
174 inline bool has_s_j_field() {
175 return is_monofluid_tvi();
178 inline bool has_epsilon_field() {
179 return bool(std::get_if<MonofluidComplete>(¤t_mode));
182 inline bool has_deltav_field() {
183 return bool(std::get_if<MonofluidComplete>(¤t_mode));
186 inline u32 get_dust_nvar() {
187 if (
None *cfg = std::get_if<None>(¤t_mode)) {
189 "Querying a dust nvar with no dust as config is ... discutable ...");
191 }
else if (
MonofluidTVI *cfg = std::get_if<MonofluidTVI>(¤t_mode)) {
193 }
else if (
MonofluidComplete *cfg = std::get_if<MonofluidComplete>(¤t_mode)) {
202 std::vector<Tscal> stopping_times;
206 static constexpr bool supersonic_correction =
false;
208 std::vector<Tscal> grains_sizes;
209 std::vector<Tscal> grains_densities;
212 std::variant<None, ConstantStoppingTimes, EpsteinDrag> dust_drag_mode =
None{};
214 inline void drag_mode_to_json(nlohmann::json &j)
const {
215 if (std::holds_alternative<None>(dust_drag_mode)) {
216 j = {{
"type",
"none"}};
219 = std::get_if<ConstantStoppingTimes>(&dust_drag_mode)) {
220 j = {{
"type",
"constant_stopping_times"}, {
"stopping_times", cfg->stopping_times}};
221 }
else if (
const EpsteinDrag *cfg = std::get_if<EpsteinDrag>(&dust_drag_mode)) {
223 = {{
"type",
"epstein_drag"},
224 {
"gamma", cfg->gamma},
225 {
"grains_sizes", cfg->grains_sizes},
226 {
"grains_densities", cfg->grains_densities}};
232 inline void drag_mode_from_json(
const nlohmann::json &j) {
233 if (j.at(
"type").get<std::string>() ==
"none") {
234 dust_drag_mode =
None{};
235 }
else if (j.at(
"type").get<std::string>() ==
"constant_stopping_times") {
238 }
else if (j.at(
"type").get<std::string>() ==
"epstein_drag") {
240 j.at(
"gamma").get<Tscal>(),
241 j.at(
"grains_sizes").get<std::vector<Tscal>>(),
242 j.at(
"grains_densities").get<std::vector<Tscal>>()};
250 inline void set_drag_epstein(
EpsteinDrag in) { dust_drag_mode = std::move(in); }
252 inline void check_config() {
253 bool is_not_none = !is_none();
258 "Dust config != None is experimental");
263 "Dust config != None is work in progress, use it at your own risk"));
266 if (std::holds_alternative<None>(dust_drag_mode)) {
268 "you must select a drag mode for the dust if the dust is on !");
271 = std::get_if<ConstantStoppingTimes>(&dust_drag_mode)) {
272 if (get_dust_nvar() != cfg->stopping_times.size()) {
274 "stopping_times size does not match the number of dust bins");
276 }
else if (
EpsteinDrag *cfg = std::get_if<EpsteinDrag>(&dust_drag_mode)) {
277 if (get_dust_nvar() != cfg->grains_densities.size()) {
279 "grains_densities size does not match the number of dust bins");
282 if (get_dust_nvar() != cfg->grains_sizes.size()) {
284 "grains_sizes size does not match the number of dust bins");
294 u32 max_neigh_count = 500;
297 using mode = std::variant<DensityBased, DensityBasedNeighLim>;
301 void set_density_based() { config = DensityBased{}; }
302 void set_density_based_neigh_lim(
u32 max_neigh_count) {
303 config = DensityBasedNeighLim{max_neigh_count};
306 bool is_density_based_neigh_lim()
const {
307 return std::holds_alternative<DensityBasedNeighLim>(config);
333 bool reference_mode =
false;
338 using mode = std::variant<SFMM, FMM, MM, Direct, None>;
340 mode config =
None{};
342 void set_none() { config = None{}; }
343 void set_direct(
bool reference_mode =
false) { config = Direct{reference_mode}; }
344 void set_mm(
u32 mm_order,
f64 opening_angle,
u32 reduction_level) {
347 .opening_angle = opening_angle,
348 .reduction_level = reduction_level};
350 void set_fmm(
u32 order,
f64 opening_angle,
u32 reduction_level) {
352 .order = order, .opening_angle = opening_angle, .reduction_level = reduction_level};
354 void set_sfmm(
u32 order,
f64 opening_angle,
bool leaf_lowering,
u32 reduction_level) {
357 .opening_angle = opening_angle,
358 .leaf_lowering = leaf_lowering,
359 .reduction_level = reduction_level};
362 bool is_none()
const {
return std::holds_alternative<None>(config); }
363 bool is_direct()
const {
return std::holds_alternative<Direct>(config); }
364 bool is_mm()
const {
return std::holds_alternative<MM>(config); }
365 bool is_fmm()
const {
return std::holds_alternative<FMM>(config); }
366 bool is_sfmm()
const {
return std::holds_alternative<SFMM>(config); }
368 bool is_sg_on()
const {
return !is_none(); }
369 bool is_sg_off()
const {
return is_none(); }
375 using mode_soft = std::variant<SofteningPlummer>;
378 void set_softening_plummer(
f64 epsilon) { softening_mode = SofteningPlummer{epsilon}; }
379 void set_softening_none() { set_softening_plummer(0.); }
381 bool is_softening_plummer()
const {
382 return std::holds_alternative<SofteningPlummer>(softening_mode);
392 using Tscal = shambase::VecComponent<Tvec>;
400template<
class Tvec,
template<
class>
class SPHKernel>
404 using Tscal = shambase::VecComponent<Tvec>;
406 static constexpr u32 dim = shambase::VectorProperties<Tvec>::dimension;
420 bool track_particles_id =
false;
422 inline void set_particle_tracking(
bool state) { track_particles_id = state; }
431 std::optional<shamunits::UnitSystem<Tscal>>
unit_sys = {};
519 bool show_cfl_detail =
false;
535 mhd_config.set(Tmp{});
553 using DustConfig = DustConfig<Tscal>;
554 DustConfig dust_config = {};
564 SelfGravConfig self_grav_config = SelfGravConfig{};
582 bool show_neigh_stats =
false;
583 inline void set_show_neigh_stats(
bool enable) { show_neigh_stats = enable; }
604 inline void set_smoothing_length_density_based() {
605 smoothing_length_config.set_density_based();
607 inline void set_smoothing_length_density_based_neigh_lim(
u32 max_neigh_count) {
608 smoothing_length_config.set_density_based_neigh_lim(max_neigh_count);
611 bool enable_particle_reordering =
false;
612 inline void set_enable_particle_reordering(
bool enable) { enable_particle_reordering = enable; }
613 u64 particle_reordering_step_freq = 1000;
614 inline void set_particle_reordering_step_freq(
u64 freq) {
617 "particle_reordering_step_freq cannot be zero");
619 particle_reordering_step_freq = freq;
622 bool save_dt_to_fields =
false;
623 inline void set_save_dt_to_fields(
bool enable) { save_dt_to_fields = enable; }
624 inline bool should_save_dt_to_fields()
const {
return save_dt_to_fields; }
626 bool show_ghost_zone_graph =
false;
627 inline void set_show_ghost_zone_graph(
bool enable) { show_ghost_zone_graph = enable; }
646 return bool(std::get_if<T>(&
eos_config.config));
652 return bool(std::get_if<T>(&
eos_config.config));
658 return bool(std::get_if<T>(&
eos_config.config));
664 return bool(std::get_if<T>(&
eos_config.config));
670 return bool(std::get_if<T>(&
eos_config.config));
708 eos_config.set_locally_isothermalLP07(cs0, q, r0);
719 eos_config.set_locally_isothermalFA2014(h_over_r);
733 eos_config.set_locally_isothermalFA2014_extended(cs0, q, r0, n_sinks);
771 using Tmp =
typename AVConfig::None;
945 inline void set_debug_dump(
bool _do_debug_dump, std::string _debug_dump_filename) {
946 this->do_debug_dump = _do_debug_dump;
947 this->debug_dump_filename = _debug_dump_filename;
1017 inline void check_config() {
1018 dust_config.check_config();
1020 if (track_particles_id &&
false ) {
1022 "particle injection is not yet compatible with particle id tracking");
1025 if (track_particles_id) {
1029 if (!self_grav_config.is_none()) {
1031 "Self gravity is experimental, please enable experimental features to use it");
1035 void set_layout(shamrock::patch::PatchDataLayerLayout &pdl);
1036 void set_ghost_layout(shamrock::patch::PatchDataLayerLayout &ghost_layout);
1047 template<
class Tscal>
1050 {
"cfl_cour", p.cfl_cour},
1051 {
"cfl_force", p.cfl_force},
1052 {
"cfl_multiplier_stiffness", p.cfl_multiplier_stiffness},
1053 {
"eta_sink", p.eta_sink}};
1062 template<
class Tscal>
1064 j.at(
"cfl_cour").get_to<Tscal>(p.cfl_cour);
1065 j.at(
"cfl_force").get_to<Tscal>(p.cfl_force);
1066 j.at(
"cfl_multiplier_stiffness").get_to<Tscal>(p.cfl_multiplier_stiffness);
1068 if (j.contains(
"eta_sink")) {
1069 j.at(
"eta_sink").get_to<Tscal>(p.eta_sink);
1073 "SPHConfig",
"eta_sink not found when deserializing, defaulting to", p.eta_sink));
1083 template<
class Tvec>
1086 {
"time", p.time}, {
"dt_sph", p.dt_sph}, {
"cfl_multiplier", p.cfl_multiplier}};
1095 template<
class Tvec>
1098 j.at(
"time").get_to<Tscal>(p.time);
1099 j.at(
"dt_sph").get_to<Tscal>(p.dt_sph);
1100 j.at(
"cfl_multiplier").get_to<Tscal>(p.cfl_multiplier);
1104 template<
class Tvec>
1105 inline void to_json(nlohmann::json &j,
const ParticleKillingConfig<Tvec> &p) {
1106 j = nlohmann::json::array();
1107 for (
const auto &kill : p.kill_list) {
1108 if (std::holds_alternative<
typename ParticleKillingConfig<Tvec>::Sphere>(kill)) {
1109 const auto &sphere = std::get<typename ParticleKillingConfig<Tvec>::Sphere>(kill);
1111 {{
"type",
"sphere"}, {
"center", sphere.center}, {
"radius", sphere.radius}});
1117 template<
class Tvec>
1119 p.kill_list.clear();
1120 for (
const auto &item : j) {
1121 std::string type = item.at(
"type").get<std::string>();
1122 if (type ==
"sphere") {
1124 item.at(
"center").get_to(sphere.center);
1125 item.at(
"radius").get_to(sphere.radius);
1126 p.kill_list.push_back(sphere);
1135 = std::get_if<SmoothingLengthConfig::DensityBased>(&p.config)) {
1137 {
"type",
"density_based"},
1142 = std::get_if<SmoothingLengthConfig::DensityBasedNeighLim>(&p.config)) {
1145 {
"type",
"density_based_neigh_lim"},
1146 {
"max_neigh_count", conf->max_neigh_count},
1154 if (j.at(
"type").get<std::string>() ==
"density_based") {
1156 }
else if (j.at(
"type").get<std::string>() ==
"density_based_neigh_lim") {
1169 {
"order", conf->order},
1170 {
"opening_angle", conf->opening_angle},
1171 {
"reduction_level", conf->reduction_level},
1172 {
"leaf_lowering", conf->leaf_lowering},
1174 }
else if (
const SelfGravConfig::FMM *conf = std::get_if<SelfGravConfig::FMM>(&p.config)) {
1177 {
"order", conf->order},
1178 {
"opening_angle", conf->opening_angle},
1179 {
"reduction_level", conf->reduction_level},
1181 }
else if (
const SelfGravConfig::MM *conf = std::get_if<SelfGravConfig::MM>(&p.config)) {
1184 {
"order", conf->order},
1185 {
"opening_angle", conf->opening_angle},
1186 {
"reduction_level", conf->reduction_level},
1192 {
"reference_mode", conf->reference_mode},
1202 = std::get_if<SelfGravConfig::SofteningPlummer>(&p.softening_mode)) {
1203 j[
"softening_mode"] =
"plummer";
1204 j[
"softening_length"] = conf->epsilon;
1212 if (j.at(
"type").get<std::string>() ==
"sfmm") {
1214 .order = j.at(
"order").get<
u32>(),
1215 .opening_angle = j.at(
"opening_angle").get<
f64>(),
1216 .leaf_lowering = j.at(
"leaf_lowering").get<
bool>(),
1217 .reduction_level = j.at(
"reduction_level").get<
u32>()};
1218 }
else if (j.at(
"type").get<std::string>() ==
"fmm") {
1220 .order = j.at(
"order").get<
u32>(),
1221 .opening_angle = j.at(
"opening_angle").get<
f64>(),
1222 .reduction_level = j.at(
"reduction_level").get<
u32>()};
1223 }
else if (j.at(
"type").get<std::string>() ==
"mm") {
1225 .order = j.at(
"order").get<
u32>(),
1226 .opening_angle = j.at(
"opening_angle").get<
f64>(),
1227 .reduction_level = j.at(
"reduction_level").get<
u32>()};
1228 }
else if (j.at(
"type").get<std::string>() ==
"direct") {
1230 }
else if (j.at(
"type").get<std::string>() ==
"none") {
1234 "Invalid self gravity type: " + j.at(
"type").get<std::string>());
1237 if (j.contains(
"softening_mode")) {
1238 std::string softening_mode = j.at(
"softening_mode").get<std::string>();
1239 if (softening_mode ==
"plummer") {
1244 "Invalid softening mode: " + softening_mode);
1250 template<
class Tvec>
1251 inline void to_json(nlohmann::json &j,
const DustConfig<Tvec> &p) {
1254 p.mode_to_json(j[
"mode"]);
1255 p.drag_mode_to_json(j[
"drag_mode"]);
1258 template<
class Tvec>
1260 p.mode_from_json(j.at(
"mode"));
1261 p.drag_mode_from_json(j.at(
"drag_mode"));
1270 template<
class Tvec,
template<
class>
class SPHKernel>
1273 using Tkernel =
typename T::Kernel;
1275 std::string kernel_id = shambase::get_type_name<Tkernel>();
1276 std::string type_id = shambase::get_type_name<Tvec>();
1280 {
"kernel_id", kernel_id},
1281 {
"type_id", type_id},
1283 {
"scheduler_config", p.scheduler_conf},
1285 {
"gpart_mass", p.gpart_mass},
1286 {
"cfl_config", p.cfl_config},
1287 {
"unit_sys", p.unit_sys},
1288 {
"time_state", p.time_state},
1289 {
"show_cfl_detail", p.show_cfl_detail},
1291 {
"mhd_config", p.mhd_config},
1293 {
"dust_config", p.dust_config},
1295 {
"self_grav_config", p.self_grav_config},
1297 {
"tree_reduction_level", p.tree_reduction_level},
1298 {
"use_two_stage_search", p.use_two_stage_search},
1299 {
"show_neigh_stats", p.show_neigh_stats},
1301 {
"combined_dtdiv_divcurlv_compute", p.combined_dtdiv_divcurlv_compute},
1302 {
"htol_up_coarse_cycle", p.htol_up_coarse_cycle},
1303 {
"htol_up_fine_cycle", p.htol_up_fine_cycle},
1304 {
"epsilon_h", p.epsilon_h},
1305 {
"smoothing_length_config", p.smoothing_length_config},
1306 {
"h_iter_per_subcycles", p.h_iter_per_subcycles},
1307 {
"h_max_subcycles_count", p.h_max_subcycles_count},
1309 {
"enable_particle_reordering", p.enable_particle_reordering},
1310 {
"particle_reordering_step_freq", p.particle_reordering_step_freq},
1312 {
"save_dt_to_fields", p.save_dt_to_fields},
1313 {
"show_ghost_zone_graph", p.show_ghost_zone_graph},
1315 {
"eos_config", p.eos_config},
1317 {
"artif_viscosity", p.artif_viscosity},
1318 {
"boundary_config", p.boundary_config},
1319 {
"ext_force_config", p.ext_force_config},
1321 {
"do_debug_dump", p.do_debug_dump},
1322 {
"debug_dump_filename", p.debug_dump_filename},
1324 {
"particle_killing", p.particle_killing},
1334 template<
class Tvec,
template<
class>
class SPHKernel>
1337 using Tkernel =
typename T::Kernel;
1340 if (j.contains(
"kernel_id")) {
1342 std::string kernel_id = j.at(
"kernel_id").get<std::string>();
1344 if (kernel_id != shambase::get_type_name<Tkernel>()) {
1346 "Invalid type to deserialize, wanted " + shambase::get_type_name<Tvec>()
1347 +
" but got " + kernel_id);
1351 if (j.contains(
"type_id")) {
1353 std::string type_id = j.at(
"type_id").get<std::string>();
1355 if (type_id != shambase::get_type_name<Tvec>()) {
1357 "Invalid type to deserialize, wanted " + shambase::get_type_name<Tvec>()
1358 +
" but got " + type_id);
1362 bool has_used_defaults =
false;
1363 bool has_updated_config =
false;
1365 auto _get_to_if_contains = [&](
const std::string &key,
auto &value) {
1369 auto _get_to_if_contains_fallbacks = [&](
const std::string &key,
1371 std::initializer_list<const char *> fallbacks) {
1373 j, key, value, fallbacks, has_used_defaults, has_updated_config);
1376 _get_to_if_contains(
"scheduler_config", p.scheduler_conf);
1379 _get_to_if_contains(
"gpart_mass", p.gpart_mass);
1380 _get_to_if_contains(
"cfl_config", p.cfl_config);
1381 _get_to_if_contains(
"unit_sys", p.unit_sys);
1382 _get_to_if_contains(
"time_state", p.time_state);
1383 _get_to_if_contains(
"show_cfl_detail", p.show_cfl_detail);
1384 _get_to_if_contains(
"mhd_config", p.mhd_config);
1385 _get_to_if_contains(
"dust_config", p.dust_config);
1386 _get_to_if_contains(
"self_grav_config", p.self_grav_config);
1387 _get_to_if_contains(
"tree_reduction_level", p.tree_reduction_level);
1388 _get_to_if_contains(
"use_two_stage_search", p.use_two_stage_search);
1389 _get_to_if_contains(
"show_neigh_stats", p.show_neigh_stats);
1390 _get_to_if_contains(
"combined_dtdiv_divcurlv_compute", p.combined_dtdiv_divcurlv_compute);
1393 _get_to_if_contains_fallbacks(
1394 "htol_up_coarse_cycle", p.htol_up_coarse_cycle, {
"htol_up_tol"});
1395 _get_to_if_contains_fallbacks(
"htol_up_fine_cycle", p.htol_up_fine_cycle, {
"htol_up_iter"});
1397 _get_to_if_contains(
"epsilon_h", p.epsilon_h);
1398 _get_to_if_contains(
"smoothing_length_config", p.smoothing_length_config);
1399 _get_to_if_contains(
"h_iter_per_subcycles", p.h_iter_per_subcycles);
1400 _get_to_if_contains(
"h_max_subcycles_count", p.h_max_subcycles_count);
1401 _get_to_if_contains(
"enable_particle_reordering", p.enable_particle_reordering);
1402 _get_to_if_contains(
"particle_reordering_step_freq", p.particle_reordering_step_freq);
1403 _get_to_if_contains(
"save_dt_to_fields", p.save_dt_to_fields);
1404 _get_to_if_contains(
"show_ghost_zone_graph", p.show_ghost_zone_graph);
1405 _get_to_if_contains(
"eos_config", p.eos_config);
1406 _get_to_if_contains(
"artif_viscosity", p.artif_viscosity);
1407 _get_to_if_contains(
"boundary_config", p.boundary_config);
1408 _get_to_if_contains(
"ext_force_config", p.ext_force_config);
1409 _get_to_if_contains(
"do_debug_dump", p.do_debug_dump);
1410 _get_to_if_contains(
"debug_dump_filename", p.debug_dump_filename);
1411 _get_to_if_contains(
"particle_killing", p.particle_killing);
1413 if (has_used_defaults || has_updated_config) {
1416 "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.
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, MonofluidTVI, 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).
Tscal get_cfl_multipler()
Get the CFL multiplier for the time step.
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_time(Tscal t)
Set the current time.
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.
Tscal get_time()
Get the current time.
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
SolverStatusVar< Tvec > SolverStatusVar
Alias to SolverStatusVar type.
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.
SolverStatusVar time_state
The time sate of the simulation.
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.
Tscal get_dt_sph()
Get the time step for the next iteration.
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
void set_next_dt(Tscal dt)
Set the time step for the next iteration.
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_cfl_multipler(Tscal lambda)
Set the CFL multiplier for the time step.
void set_eos_fermi(Tscal mu_e)
Set the EOS configuration to a Fermi equation of state.
Tscal dt_sph
Current time step.
Tscal cfl_multiplier
Current cfl multiplier.
shambase::VecComponent< Tvec > Tscal
The type of the scalar used to represent the quantities.
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.