From 5b5fc0a6cff35f1c8d11929888eba21efc0b6dab Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Tue, 17 Mar 2026 13:28:51 +0900 Subject: [PATCH 01/54] add NIMHD terms --- .../sph/include/shammodels/sph/math/mhd.hpp | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index a45f62a4ae..31bc2e11de 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -32,6 +32,50 @@ namespace shamrock::sph::mhd { enum MHDType { Ideal = 0, NonIdeal = 1 }; + template + inline Tvec MagCurrentJ(Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a) { + + Tvec J = m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha); + + return J; + } + + template + inline Tvec WursterD(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD) { + + Tvec D = etaO * J + etaH * sycl::cross(J, B) + etaAD * sycl::cross(sycl::cross(J, B), B); + + return D; + } + + template + inline Tscal u_NI_heating(Tvec D, Tvec J, Tscal rho) { + + return -sycl::dot(D, J) * sham::inv_sat_zero(rho); + } + + template + inline Tvec B_NI_terms( + Tvec D_a, + Tvec D_b, + Tscal m_b, + Tscal rho_a_sq, + Tscal rho_b_sq, + Tvec B_a, + Tvec B_b, + Tscal omega_a, + Tscal omega_b, + Tvec nabla_Wab_ha, + Tvec nabla_Wab_hb) { + + Tscal sub_fact_a = rho_a_sq * omega_a; + Tscal sub_fact_b = rho_b_sq * omega_b; + + Tvec acc_a = sham::inv_sat_zero(sub_fact_a) * (sycl::cross(D_a, nabla_Wab_ha)); + Tvec acc_b = sham::inv_sat_zero(sub_fact_b) * (sycl::cross(D_b, nabla_Wab_hb)); + return -m_b * (acc_a + acc_b); // mb? + } + // mag tension form the Tricco 2023 formula template inline Tvec B_dot_grad_W( From 5f4c2eafb6a2a207cab6057f086fd35dd25ad463 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Wed, 18 Mar 2026 17:59:56 +0900 Subject: [PATCH 02/54] enable NIMHD --- .../shammodels/sph/config/MHDConfig.hpp | 43 +- .../sph/include/shammodels/sph/math/mhd.hpp | 39 ++ .../shammodels/sph/modules/UpdateDerivs.hpp | 9 + .../sph/src/modules/UpdateDerivs.cpp | 366 +++++++++++++++++- 4 files changed, 431 insertions(+), 26 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp index 33daf37ee0..df8d01677b 100644 --- a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp @@ -44,6 +44,9 @@ struct shammodels::sph::MHDConfig { struct NonIdealMHD { Tscal sigma_mhd = 0.1; Tscal alpha_u = 1.; + Tscal etaO = 1.; + Tscal etaH = 1.; + Tscal etaAD = 1.; }; // how to set a new state of a variant as a dummy: @@ -52,55 +55,55 @@ struct shammodels::sph::MHDConfig { //-> question your life choices using Variant = std::variant; - Variant config = None{}; + Variant configMHD = None{}; - void set(Variant v) { config = v; } + void set(Variant v) { configMHD = v; } inline bool has_B_field() { - bool is_B = bool(std::get_if(&config)) - || bool(std::get_if(&config)); + bool is_B = bool(std::get_if(&configMHD)) + || bool(std::get_if(&configMHD)); return is_B; } inline bool has_psi_field() { - bool is_psi = bool(std::get_if(&config)) - || bool(std::get_if(&config)); + bool is_psi = bool(std::get_if(&configMHD)) + || bool(std::get_if(&configMHD)); return is_psi; } inline bool has_divB_field() { - bool is_divB = bool(std::get_if(&config)); + bool is_divB = bool(std::get_if(&configMHD)); return is_divB; } inline bool has_curlB_field() { - bool is_curlB = bool(std::get_if(&config)); + bool is_curlB = bool(std::get_if(&configMHD)); return is_curlB; } inline bool has_dtdivB_field() { - bool is_dtdivB = bool(std::get_if(&config)); + bool is_dtdivB = bool(std::get_if(&configMHD)); return is_dtdivB; } inline void print_status() { - logger::raw_ln("--- MHD config"); + logger::raw_ln("--- MHD configMHD"); - if (None *v = std::get_if(&config)) { + if (None *v = std::get_if(&configMHD)) { logger::raw_ln(" Config MHD Type : None (No MHD)"); } else if ( IdealMHD_constrained_hyper_para *v - = std::get_if(&config)) { + = std::get_if(&configMHD)) { logger::raw_ln(" Config MHD : Ideal MHD, constrained hyperbolic/parabolic treatment"); logger::raw_ln(" sigma_mhd =", v->sigma_mhd); - } else if (NonIdealMHD *v = std::get_if(&config)) { + } else if (NonIdealMHD *v = std::get_if(&configMHD)) { logger::raw_ln(" Config MHD Type : Non Ideal MHD"); logger::raw_ln(" sigma_mhd =", v->sigma_mhd); } else { shambase::throw_unimplemented(); } - logger::raw_ln("--- MHD config (deduced)"); + logger::raw_ln("--- MHD configMHD (deduced)"); logger::raw_ln("-------------"); } @@ -122,18 +125,18 @@ namespace shammodels::sph { using IMHD = typename T::IdealMHD_constrained_hyper_para; using NonIdealMHD = typename T::NonIdealMHD; - // Write the config type into the JSON object - if (const None *v = std::get_if(&p.config)) { + // Write the configMHD type into the JSON object + if (const None *v = std::get_if(&p.configMHD)) { j = { {"mhd_type", "none"}, }; - } else if (const IMHD *v = std::get_if(&p.config)) { + } else if (const IMHD *v = std::get_if(&p.configMHD)) { j = { {"mhd_type", "ideal_mhd_constrained_hyper_para"}, {"sigma_mhd", v->sigma_mhd}, {"alpha_u", v->alpha_u}, }; - } else if (const NonIdealMHD *v = std::get_if(&p.config)) { + } else if (const NonIdealMHD *v = std::get_if(&p.configMHD)) { // Write the shear base, direction, and speed into the JSON object j = { {"mhd_type", "non_ideal_mhd"}, @@ -162,7 +165,7 @@ namespace shammodels::sph { shambase::throw_with_loc("no field mhd_type is found in this json"); } - // Read the config type from the JSON object + // Read the configMHD type from the JSON object std::string mhd_type; j.at("mhd_type").get_to(mhd_type); @@ -170,7 +173,7 @@ namespace shammodels::sph { using IMHD = typename T::IdealMHD_constrained_hyper_para; using NonIdealMHD = typename T::NonIdealMHD; - // Set the BCConfig based on the config type + // Set the BCConfig based on the configMHD type if (mhd_type == "none") { p.set(None{}); } else if (mhd_type == "ideal_mhd_constrained_hyper_para") { diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 31bc2e11de..83a8bab224 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -277,6 +277,10 @@ namespace shamrock::sph::mhd { Tscal mu_0, Tscal sigma_mhd, + Tscal etaO, + Tscal etaH, + Tscal etaAD, + Tvec &dv_dt, Tscal &du_dt, Tvec &dB_on_rho_dt, @@ -445,6 +449,41 @@ namespace shamrock::sph::mhd { // for conservative checks drho_dt += (1. / omega_a) * pmass * sycl::dot(v_ab, r_ab_unit * dWab_a); + + // Non-ideal MHD terms + if constexpr (MHD_mode == NonIdeal) { + + Tvec J_a = MagCurrentJ( + pmass, B_a, B_b, r_ab_unit * dWab_a, sub_fact_a); + Tvec J_b = MagCurrentJ( + pmass, B_b, B_a, r_ab_unit * dWab_b, sub_fact_b); + + Tscal etaO_a = 0.0, etaH_a = 0.0, etaAD_a = 0.0; + Tscal etaO_b = 0.0, etaH_b = 0.0, etaAD_b = 0.0; + + Tvec D_a = WursterD(B_a, J_a, etaO_a, etaH_a, etaAD_a); + Tvec D_b = WursterD(B_b, J_b, etaO_b, etaH_b, etaAD_b); + + Tvec B_NI = B_NI_terms( + D_a, + D_b, + pmass, + rho_a_sq, + rho_b * rho_b, + B_a, + B_b, + omega_a, + omega_b, + r_ab_unit * dWab_a, + r_ab_unit * dWab_b); + + dB_on_rho_dt += B_NI; + + Tscal u_NI = u_NI_heating(D_a, J_a, rho_a) * 0.5 + + u_NI_heating(D_b, J_b, rho_b) * 0.5; + + du_dt += u_NI; + } } } // namespace shamrock::sph::mhd diff --git a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp index 3075248eb5..db273827cf 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp @@ -19,6 +19,7 @@ #include "shambackends/typeAliasVec.hpp" #include "shambackends/vec.hpp" #include "shammodels/sph/SolverConfig.hpp" +#include "shammodels/sph/math/mhd.hpp" #include "shammodels/sph/modules/SolverStorage.hpp" #include "shamrock/scheduler/ShamrockCtx.hpp" @@ -66,7 +67,15 @@ namespace shammodels::sph::modules { using IdealMHD = typename Cfg_MHD::IdealMHD_constrained_hyper_para; using NonIdealMHD = typename Cfg_MHD::NonIdealMHD; + // void update_derivs_MHD(Cfg_MHD cfg); + // One templated implementation, specialised per MHDType at the call sites below. + template + void update_derivs_MHD_impl( + Tscal sigma_mhd, Tscal alpha_u, Tscal etaO, Tscal etaH, Tscal etaAD); + + // Thin wrappers that unpack the variant and forward to the template above. void update_derivs_MHD(IdealMHD cfg); + void update_derivs_MHD(NonIdealMHD cfg); }; } // namespace shammodels::sph::modules diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 809c5f7e2b..45c5af4443 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -49,11 +49,11 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs() { update_derivs_cd10(*v); } else if (ConstantDisc *v = std::get_if(&cfg_av.config)) { update_derivs_disc_visco(*v); - } else if (IdealMHD *v = std::get_if(&cfg_mhd.config)) { + } else if (IdealMHD *v = std::get_if(&cfg_mhd.configMHD)) { update_derivs_MHD(*v); - } else if (NonIdealMHD *v = std::get_if(&cfg_mhd.config)) { - shambase::throw_unimplemented(); - } else if (NoneMHD *v = std::get_if(&cfg_mhd.config)) { + } else if (NonIdealMHD *v = std::get_if(&cfg_mhd.configMHD)) { + update_derivs_MHD(*v); + } else if (NoneMHD *v = std::get_if(&cfg_mhd.configMHD)) { shambase::throw_unimplemented(); } else if (None *v = std::get_if(&cfg_av.config)) { shambase::throw_unimplemented(); @@ -720,8 +720,29 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_disc }); } +// ── thin variant-unpacking wrappers ────────────────────────────────────────── + template class SPHKernel> void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(IdealMHD cfg) { + update_derivs_MHD_impl( + cfg.sigma_mhd, + cfg.alpha_u, + /*etaO=*/Tscal(0), + /*etaH=*/Tscal(0), + /*etaAD=*/Tscal(0)); +} + +template class SPHKernel> +void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(NonIdealMHD cfg) { + update_derivs_MHD_impl( + cfg.sigma_mhd, cfg.alpha_u, cfg.etaO, cfg.etaH, cfg.etaAD); +} + +template class SPHKernel> +template +void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_impl( + Tscal sigma_mhd, Tscal alpha_u, Tscal etaO, Tscal etaH, Tscal etaAD) { + StackEntry stack_loc{}; using namespace shamrock; @@ -751,6 +772,340 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD( const u32 ipsi_cons = (do_MHD_debug) ? pdl.get_field_idx("psi_cons") : -1; const u32 iu_mhd = (do_MHD_debug) ? pdl.get_field_idx("u_mhd") : -1; + Tscal const mu_0 = solver_config.get_constant_mu_0(); + + shamrock::patch::PatchDataLayerLayout &ghost_layout + = shambase::get_check_ref(storage.ghost_layout.get()); + u32 ihpart_interf = ghost_layout.get_field_idx("hpart"); + u32 iuint_interf = ghost_layout.get_field_idx("uint"); + u32 ivxyz_interf = ghost_layout.get_field_idx("vxyz"); + u32 iomega_interf = ghost_layout.get_field_idx("omega"); + u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); + u32 ipsi_on_ch_interf = ghost_layout.get_field_idx("psi/ch"); + + auto &merged_xyzh = storage.merged_xyzh.get(); + shamrock::solvergraph::Field &omega = shambase::get_check_ref(storage.omega); + shambase::DistributedData &mpdats = storage.merged_patchdata_ghost.get(); + + scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { + PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); + + sham::DeviceBuffer &buf_xyz + = merged_xyzh.get(cur_p.id_patch).template get_field_buf_ref(0); + sham::DeviceBuffer &buf_axyz = pdat.get_field_buf_ref(iaxyz); + sham::DeviceBuffer &buf_duint = pdat.get_field_buf_ref(iduint); + sham::DeviceBuffer &buf_vxyz = mpdat.get_field_buf_ref(ivxyz_interf); + sham::DeviceBuffer &buf_hpart = mpdat.get_field_buf_ref(ihpart_interf); + sham::DeviceBuffer &buf_omega = mpdat.get_field_buf_ref(iomega_interf); + sham::DeviceBuffer &buf_uint = mpdat.get_field_buf_ref(iuint_interf); + sham::DeviceBuffer &buf_pressure + = shambase::get_check_ref(storage.pressure).get_field(cur_p.id_patch).get_buf(); + sham::DeviceBuffer &buf_cs + = shambase::get_check_ref(storage.soundspeed).get_field(cur_p.id_patch).get_buf(); + + sham::DeviceBuffer &buf_dB_on_rho = pdat.get_field_buf_ref(idB_on_rho); + sham::DeviceBuffer &buf_dpsi_on_ch = pdat.get_field_buf_ref(idpsi_on_ch); + sham::DeviceBuffer &buf_drho_dt = pdat.get_field_buf_ref(idrho_dt); + + sham::DeviceBuffer &buf_B_on_rho = mpdat.get_field_buf_ref(iB_on_rho_interf); + sham::DeviceBuffer &buf_psi_on_ch + = mpdat.get_field_buf_ref(ipsi_on_ch_interf); + + tree::ObjectCache &pcache + = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); + + sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().get_queue(); + sham::EventList depends_list; + + auto xyz = buf_xyz.get_read_access(depends_list); + auto axyz = buf_axyz.get_write_access(depends_list); + auto du = buf_duint.get_write_access(depends_list); + auto vxyz = buf_vxyz.get_read_access(depends_list); + auto hpart = buf_hpart.get_read_access(depends_list); + auto omega = buf_omega.get_read_access(depends_list); + auto u = buf_uint.get_read_access(depends_list); + auto pressure = buf_pressure.get_read_access(depends_list); + auto cs = buf_cs.get_read_access(depends_list); + auto B_on_rho = buf_B_on_rho.get_read_access(depends_list); + auto psi_on_ch = buf_psi_on_ch.get_read_access(depends_list); + auto dB_on_rho = buf_dB_on_rho.get_write_access(depends_list); + auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list); + auto drho_dt = buf_drho_dt.get_write_access(depends_list); + + Tvec *mag_pressure + = (do_MHD_debug) + ? pdat.get_field_buf_ref(imag_pressure).get_write_access(depends_list) + : nullptr; + Tvec *mag_tension + = (do_MHD_debug) + ? pdat.get_field_buf_ref(imag_tension).get_write_access(depends_list) + : nullptr; + Tvec *gas_pressure + = (do_MHD_debug) + ? pdat.get_field_buf_ref(igas_pressure).get_write_access(depends_list) + : nullptr; + Tvec *tensile_corr + = (do_MHD_debug) + ? pdat.get_field_buf_ref(itensile_corr).get_write_access(depends_list) + : nullptr; + Tscal *psi_propag + = (do_MHD_debug) + ? pdat.get_field_buf_ref(ipsi_propag).get_write_access(depends_list) + : nullptr; + Tscal *psi_diff + = (do_MHD_debug) + ? pdat.get_field_buf_ref(ipsi_diff).get_write_access(depends_list) + : nullptr; + Tscal *psi_cons + = (do_MHD_debug) + ? pdat.get_field_buf_ref(ipsi_cons).get_write_access(depends_list) + : nullptr; + Tscal *u_mhd = (do_MHD_debug) + ? pdat.get_field_buf_ref(iu_mhd).get_write_access(depends_list) + : nullptr; + + auto ploop_ptrs = pcache.get_read_access(depends_list); + + auto e = q.submit(depends_list, [&](sycl::handler &cgh) { + const Tscal pmass = solver_config.gpart_mass; + const Tscal _sigma = sigma_mhd; + const Tscal _alpha_u = alpha_u; + const Tscal _etaO = etaO; + const Tscal _etaH = etaH; + const Tscal _etaAD = etaAD; + + shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); + shamlog_debug_sycl_ln("deriv kernel", "sigma_mhd :", _sigma); + shamlog_debug_sycl_ln("deriv kernel", "alpha_u :", _alpha_u); + shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); + + tree::ObjectCacheIterator particle_looper(ploop_ptrs); + constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern; + + shambase::parallel_for(cgh, pdat.get_obj_cnt(), "compute MHD", [=](u64 gid) { + u32 id_a = (u32) gid; + + using namespace shamrock::sph; + + Tscal h_a = hpart[id_a]; + Tvec xyz_a = xyz[id_a]; + Tvec vxyz_a = vxyz[id_a]; + Tscal P_a = pressure[id_a]; + Tscal cs_a = cs[id_a]; + Tscal omega_a = omega[id_a]; + Tscal u_a = u[id_a]; + + Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); + Tscal rho_a_sq = rho_a * rho_a; + Tscal rho_a_inv = 1. / rho_a; + + Tvec B_a = B_on_rho[id_a] * rho_a; + Tscal v_alfven_a = sycl::sqrt(sycl::dot(B_a, B_a) / (mu_0 * rho_a)); + Tscal v_shock_a = sycl::sqrt(cs_a * cs_a + v_alfven_a * v_alfven_a); + Tscal psi_a = psi_on_ch[id_a] * v_shock_a; + + Tscal omega_a_rho_a_inv = 1. / (omega_a * rho_a); + + Tvec force_pressure{0, 0, 0}; + Tscal tmpdU_pressure = 0; + Tvec magnetic_eq{0, 0, 0}; + Tscal psi_eq = 0; + Tscal drho_eq = 0; + + Tvec mag_pressure_term{0, 0, 0}; + Tvec mag_tension_term{0, 0, 0}; + Tvec gas_pressure_term{0, 0, 0}; + Tvec tensile_corr_term{0, 0, 0}; + Tscal psi_propag_term = 0; + Tscal psi_diff_term = 0; + Tscal psi_cons_term = 0; + Tscal u_mhd_term = 0; + + particle_looper.for_each_object(id_a, [&](u32 id_b) { + Tvec dr = xyz_a - xyz[id_b]; + Tscal rab2 = sycl::dot(dr, dr); + Tscal h_b = hpart[id_b]; + + if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) { + return; + } + + Tvec vxyz_b = vxyz[id_b]; + Tscal u_b = u[id_b]; + Tscal P_b = pressure[id_b]; + Tscal omega_b = omega[id_b]; + Tscal cs_b = cs[id_b]; + Tscal rab = sycl::sqrt(rab2); + + Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); + Tvec B_b = B_on_rho[id_b] * rho_b; + Tscal v_alfven_b = sycl::sqrt(sycl::dot(B_b, B_b) / (mu_0 * rho_b)); + Tscal v_shock_b = sycl::sqrt(cs_b * cs_b + v_alfven_b * v_alfven_b); + Tscal psi_b = psi_on_ch[id_b] * v_shock_b; + + Tscal Fab_a = Kernel::dW_3d(rab, h_a); + Tscal Fab_b = Kernel::dW_3d(rab, h_b); + + shamrock::sph::mhd::add_to_derivs_spmhd( + pmass, + dr, + rab, + rho_a, + rho_a_sq, + omega_a_rho_a_inv, + rho_a_inv, + rho_b, + omega_a, + omega_b, + Fab_a, + Fab_b, + vxyz_a, + vxyz_b, + u_a, + u_b, + P_a, + P_b, + cs_a, + cs_b, + h_a, + h_b, + _alpha_u, + B_a, + B_b, + psi_a, + psi_b, + mu_0, + _sigma, + _etaO, + _etaH, + _etaAD, + force_pressure, + tmpdU_pressure, + magnetic_eq, + psi_eq, + drho_eq, + mag_pressure_term, + mag_tension_term, + gas_pressure_term, + tensile_corr_term, + psi_propag_term, + psi_diff_term, + psi_cons_term, + u_mhd_term); + }); + + axyz[id_a] = force_pressure; + du[id_a] = tmpdU_pressure; + dB_on_rho[id_a] = magnetic_eq; + dpsi_on_ch[id_a] = psi_eq - psi_a / h_a; + drho_dt[id_a] = drho_eq; + + if (do_MHD_debug) { + mag_pressure[id_a] = mag_pressure_term; + mag_tension[id_a] = mag_tension_term; + gas_pressure[id_a] = gas_pressure_term; + tensile_corr[id_a] = tensile_corr_term; + psi_propag[id_a] = psi_propag_term; + psi_diff[id_a] = psi_diff_term; + psi_cons[id_a] = -psi_a / h_a; + u_mhd[id_a] = u_mhd_term; + } + }); + }); + + buf_xyz.complete_event_state(e); + buf_axyz.complete_event_state(e); + buf_duint.complete_event_state(e); + buf_vxyz.complete_event_state(e); + buf_hpart.complete_event_state(e); + buf_omega.complete_event_state(e); + buf_uint.complete_event_state(e); + buf_pressure.complete_event_state(e); + buf_cs.complete_event_state(e); + buf_B_on_rho.complete_event_state(e); + buf_psi_on_ch.complete_event_state(e); + buf_dB_on_rho.complete_event_state(e); + buf_dpsi_on_ch.complete_event_state(e); + buf_drho_dt.complete_event_state(e); + + if (do_MHD_debug) { + pdat.get_field_buf_ref(imag_pressure).complete_event_state(e); + pdat.get_field_buf_ref(imag_tension).complete_event_state(e); + pdat.get_field_buf_ref(igas_pressure).complete_event_state(e); + pdat.get_field_buf_ref(itensile_corr).complete_event_state(e); + pdat.get_field_buf_ref(ipsi_propag).complete_event_state(e); + pdat.get_field_buf_ref(ipsi_diff).complete_event_state(e); + pdat.get_field_buf_ref(ipsi_cons).complete_event_state(e); + pdat.get_field_buf_ref(iu_mhd).complete_event_state(e); + } + + sham::EventList resulting_events; + resulting_events.add_event(e); + pcache.complete_event_state(resulting_events); + }); +} + +/** +template class SPHKernel> +void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(Cfg_MHD cfg) { + StackEntry stack_loc{}; + + using namespace shamrock; + using namespace shamrock::patch; + + + Tscal sigma_mhd = 0.0; + Tscal alpha_u = 0.0; + Tscal etaO = 0.0, etaH = 0.0, etaAD = 0.0; + + using namespace shamrock::sph::mhd; + using None = typename Cfg_MHD::None; + using IdealMHD = typename Cfg_MHD::IdealMHD_constrained_hyper_para; + using NonIdealMHD = typename Cfg_MHD::NonIdealMHD; + + MHDType mhd_mode = MHDType::Ideal; // Default + + if (auto* v = std::get_if(&cfg.configMHD)) { + mhd_mode = MHDType::Ideal; + } else if (auto* v = std::get_if(&cfg.configMHD)) { + sigma_mhd = v->sigma_mhd; + alpha_u = v->alpha_u; + mhd_mode = MHDType::Ideal; + } else if (auto* v = std::get_if(&cfg.configMHD)) { + sigma_mhd = v->sigma_mhd; + alpha_u = v->alpha_u; + etaO = v->etaO; + etaH = v->etaH; + etaAD = v->etaAD; + mhd_mode = MHDType::NonIdeal; + } else { + shambase::throw_unimplemented(); + } + + PatchDataLayerLayout &pdl = scheduler().pdl_old(); + + const u32 ixyz = pdl.get_field_idx("xyz"); + const u32 ivxyz = pdl.get_field_idx("vxyz"); + const u32 iaxyz = pdl.get_field_idx("axyz"); + const u32 iuint = pdl.get_field_idx("uint"); + const u32 iduint = pdl.get_field_idx("duint"); + const u32 ihpart = pdl.get_field_idx("hpart"); + const u32 iB_on_rho = pdl.get_field_idx("B/rho"); + const u32 idB_on_rho = pdl.get_field_idx("dB/rho"); + const u32 ipsi_on_ch = pdl.get_field_idx("psi/ch"); + const u32 idpsi_on_ch = pdl.get_field_idx("dpsi/ch"); + const u32 idrho_dt = pdl.get_field_idx("drho/dt"); + + bool do_MHD_debug = solver_config.do_MHD_debug(); + const u32 imag_pressure = (do_MHD_debug) ? pdl.get_field_idx("mag_pressure") : -1; + const u32 imag_tension = (do_MHD_debug) ? pdl.get_field_idx("mag_tension") : -1; + const u32 igas_pressure = (do_MHD_debug) ? pdl.get_field_idx("gas_pressure") : -1; + const u32 itensile_corr = (do_MHD_debug) ? pdl.get_field_idx("tensile_corr") : -1; + const u32 ipsi_propag = (do_MHD_debug) ? pdl.get_field_idx("psi_propag") : -1; + const u32 ipsi_diff = (do_MHD_debug) ? pdl.get_field_idx("psi_diff") : -1; + const u32 ipsi_cons = (do_MHD_debug) ? pdl.get_field_idx("psi_cons") : -1; + const u32 iu_mhd = (do_MHD_debug) ? pdl.get_field_idx("u_mhd") : -1; + // Tscal mu_0 = 1.; Tscal const mu_0 = solver_config.get_constant_mu_0(); @@ -860,8 +1215,6 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD( auto e = q.submit(depends_list, [&](sycl::handler &cgh) { const Tscal pmass = solver_config.gpart_mass; - const Tscal sigma_mhd = cfg.sigma_mhd; - const Tscal alpha_u = cfg.alpha_u; shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); shamlog_debug_sycl_ln("deriv kernel", "sigma_mhd :", sigma_mhd); @@ -1050,6 +1403,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD( pcache.complete_event_state(resulting_events); }); } +*/ using namespace shammath; template class shammodels::sph::modules::UpdateDerivs; From a7ede8d0d57dc7b0f5ad5cfe55a51e13c0775914 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 26 Mar 2026 18:06:18 +0900 Subject: [PATCH 03/54] typos + correct dimentionality --- .../include/shammodels/sph/SolverConfig.hpp | 3 +++ .../shammodels/sph/config/MHDConfig.hpp | 5 +++++ .../sph/include/shammodels/sph/math/mhd.hpp | 21 +++++++++---------- src/shammodels/sph/src/Solver.cpp | 20 ++++++++++++++++++ .../sph/src/modules/UpdateDerivs.cpp | 3 +++ src/shammodels/sph/src/pySPHModel.cpp | 11 ++++++++++ 6 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp index c6454f00a4..c2fd8b7909 100644 --- a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp @@ -844,6 +844,9 @@ struct shammodels::sph::SolverConfig { return artif_viscosity.has_field_soundspeed() || is_eos_locally_isothermal(); } + /// @brief Whether the solver is set for non ideal MHD + inline bool do_NIMHD() { return mhd_config.do_NIMHD(); } + /// @brief Whether the solver has a field for B_on_rho inline bool has_field_B_on_rho() { return mhd_config.has_B_field() && (dim == 3); } diff --git a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp index df8d01677b..09e219cf00 100644 --- a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp @@ -59,6 +59,11 @@ struct shammodels::sph::MHDConfig { void set(Variant v) { configMHD = v; } + inline bool do_NIMHD() { + bool is_NIMHD = bool(std::get_if(&configMHD)); + return is_NIMHD; + } + inline bool has_B_field() { bool is_B = bool(std::get_if(&configMHD)) || bool(std::get_if(&configMHD)); diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 83a8bab224..cab1612882 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -33,9 +33,10 @@ namespace shamrock::sph::mhd { enum MHDType { Ideal = 0, NonIdeal = 1 }; template - inline Tvec MagCurrentJ(Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a) { + inline Tvec MagCurrentJ( + Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0) { - Tvec J = m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha); + Tvec J = m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha) / mu_0; return J; } @@ -73,7 +74,7 @@ namespace shamrock::sph::mhd { Tvec acc_a = sham::inv_sat_zero(sub_fact_a) * (sycl::cross(D_a, nabla_Wab_ha)); Tvec acc_b = sham::inv_sat_zero(sub_fact_b) * (sycl::cross(D_b, nabla_Wab_hb)); - return -m_b * (acc_a + acc_b); // mb? + return -m_b * (acc_a + acc_b); } // mag tension form the Tricco 2023 formula @@ -203,7 +204,7 @@ namespace shamrock::sph::mhd { Tvec psisubterm_a = ((psi_a) *sham::inv_sat_zero(sub_fact_a)) * nabla_Wab_ha; Tvec psisubterm_b = ((psi_b) *sham::inv_sat_zero(sub_fact_b)) * nabla_Wab_hb; - Tvec psiterm = -m_b * (psisubterm_a + psisubterm_a); + Tvec psiterm = -m_b * (psisubterm_a + psisubterm_b); return psiterm; } @@ -452,17 +453,15 @@ namespace shamrock::sph::mhd { // Non-ideal MHD terms if constexpr (MHD_mode == NonIdeal) { + // logger::raw_ln("############# NON IDEAL MHD #############"); Tvec J_a = MagCurrentJ( - pmass, B_a, B_b, r_ab_unit * dWab_a, sub_fact_a); + pmass, B_a, B_b, r_ab_unit * dWab_a, sub_fact_a, mu_0); Tvec J_b = MagCurrentJ( - pmass, B_b, B_a, r_ab_unit * dWab_b, sub_fact_b); - - Tscal etaO_a = 0.0, etaH_a = 0.0, etaAD_a = 0.0; - Tscal etaO_b = 0.0, etaH_b = 0.0, etaAD_b = 0.0; + pmass, B_b, B_a, r_ab_unit * dWab_b, sub_fact_b, mu_0); - Tvec D_a = WursterD(B_a, J_a, etaO_a, etaH_a, etaAD_a); - Tvec D_b = WursterD(B_b, J_b, etaO_b, etaH_b, etaAD_b); + Tvec D_a = WursterD(B_a, J_a, etaO, etaH, etaAD); + Tvec D_b = WursterD(B_b, J_b, etaO, etaH, etaAD); Tvec B_NI = B_NI_terms( D_a, diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index d783cef926..470da61dc3 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1623,6 +1623,8 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() bool has_epsilon_field = solver_config.dust_config.has_epsilon_field(); bool has_deltav_field = solver_config.dust_config.has_deltav_field(); + bool do_NIMHD = solver_config.do_NIMHD(); + PatchDataLayerLayout &pdl = scheduler().pdl_old(); const u32 ixyz = pdl.get_field_idx("xyz"); @@ -2508,6 +2510,24 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() vclean_buf.complete_event_state(e); }; + if (do_NIMHD) { + + auto e = q.submit(depends_list, [&](sycl::handler &cgh) { + auto *nimhd = std::get_if::NonIdealMHD>( + &solver_config.mhd_config.configMHD); + Tscal etaAD = nimhd ? nimhd->etaAD : Tscal(0); + + cgh.parallel_for( + sycl::range<1>{pdat.get_obj_cnt()}, [=](sycl::item<1> item) { + Tscal h_a = hpart[item]; + + Tscal dt_AD = h_a * h_a / etaAD; + + cfl_dt[item] = sycl::min(cfl_dt[item], dt_AD); + }); + }); + }; + buf_hpart.complete_event_state(e); buf_axyz.complete_event_state(e); vsig_buf.complete_event_state(e); diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 45c5af4443..561ff9ecdd 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -877,6 +877,9 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); shamlog_debug_sycl_ln("deriv kernel", "sigma_mhd :", _sigma); shamlog_debug_sycl_ln("deriv kernel", "alpha_u :", _alpha_u); + shamlog_debug_sycl_ln("deriv kernel", "etaO :", _etaO); + shamlog_debug_sycl_ln("deriv kernel", "etaH :", _etaH); + shamlog_debug_sycl_ln("deriv kernel", "etaAD :", _etaAD); shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); tree::ObjectCacheIterator particle_looper(ploop_ptrs); diff --git a/src/shammodels/sph/src/pySPHModel.cpp b/src/shammodels/sph/src/pySPHModel.cpp index 74da727ebb..135186f9fc 100644 --- a/src/shammodels/sph/src/pySPHModel.cpp +++ b/src/shammodels/sph/src/pySPHModel.cpp @@ -193,6 +193,17 @@ void add_instance(py::module &m, std::string name_config, std::string name_model py::kw_only(), py::arg("sigma_mhd"), py::arg("sigma_u")) + .def( + "set_NonIdealMHD", + [](TConfig &self, Tscal sigma_mhd, Tscal sigma_u, Tscal etaO, Tscal etaH, Tscal etaAD) { + self.set_NonIdealMHD({sigma_mhd, sigma_u, etaO, etaH, etaAD}); + }, + py::kw_only(), + py::arg("sigma_mhd"), + py::arg("sigma_u"), + py::arg("etaO"), + py::arg("etaH"), + py::arg("etaAD")) .def( "set_self_gravity_none", [](TConfig &self) { From 547a81dcc799aed9873dea2507f8477ff2c044ed Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 26 Mar 2026 20:00:24 +0900 Subject: [PATCH 04/54] B -> Bhat --- .../sph/include/shammodels/sph/math/mhd.hpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index cab1612882..13b015dd0a 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -44,7 +44,9 @@ namespace shamrock::sph::mhd { template inline Tvec WursterD(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD) { - Tvec D = etaO * J + etaH * sycl::cross(J, B) + etaAD * sycl::cross(sycl::cross(J, B), B); + Tvec Bhat = B / sycl::length(B); + Tvec D = etaO * J + etaH * sycl::cross(J, Bhat) + + etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); return D; } @@ -413,8 +415,9 @@ namespace shamrock::sph::mhd { Tvec dB_on_rho_dissipation_term = 0.5 * pmass * (rho_diss_term_a + rho_diss_term_b) * (B_a - B_b) * vsig_B; - dB_on_rho_dt - += v_ab * dB_on_rho_induction_term(pmass, rho_a_sq, B_a, omega_a, r_ab_unit * dWab_b); + dB_on_rho_dt += v_ab + * dB_on_rho_induction_term( + pmass, rho_a_sq, B_a, omega_a, r_ab_unit * dWab_b); // @@ dWab_a ? dB_on_rho_dt += dB_on_rho_psi_term( pmass, @@ -458,7 +461,7 @@ namespace shamrock::sph::mhd { Tvec J_a = MagCurrentJ( pmass, B_a, B_b, r_ab_unit * dWab_a, sub_fact_a, mu_0); Tvec J_b = MagCurrentJ( - pmass, B_b, B_a, r_ab_unit * dWab_b, sub_fact_b, mu_0); + pmass, B_a, B_b, r_ab_unit * dWab_b, sub_fact_b, mu_0); Tvec D_a = WursterD(B_a, J_a, etaO, etaH, etaAD); Tvec D_b = WursterD(B_b, J_b, etaO, etaH, etaAD); From 32aec9b408564a92db655136cc47357a8b06a8fc Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Mon, 4 May 2026 09:53:11 +0200 Subject: [PATCH 05/54] correct summation for J --- .../sph/include/shammodels/sph/math/mhd.hpp | 20 +-- .../shammodels/sph/modules/SolverStorage.hpp | 2 + .../shammodels/sph/modules/UpdateDerivs.hpp | 3 + src/shammodels/sph/src/Solver.cpp | 5 + src/shammodels/sph/src/SolverConfig.cpp | 2 + .../sph/src/modules/UpdateDerivs.cpp | 143 ++++++++++++++++++ 6 files changed, 166 insertions(+), 9 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 13b015dd0a..5e20f3b4fb 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -24,6 +24,7 @@ #include "shammodels/sph/SolverConfig.hpp" #include "shammodels/sph/math/forces.hpp" #include "shammodels/sph/math/q_ab.hpp" +#include "shammodels/sph/modules/SolverStorage.hpp" #include "shamphys/mhd.hpp" #include "shamunits/Constants.hpp" #include @@ -33,12 +34,10 @@ namespace shamrock::sph::mhd { enum MHDType { Ideal = 0, NonIdeal = 1 }; template - inline Tvec MagCurrentJ( - Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0) { + inline void MagCurrentJ_sum( + Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0, Tvec J_a) { - Tvec J = m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha) / mu_0; - - return J; + J_a += m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha) / mu_0; } template @@ -274,6 +273,9 @@ namespace shamrock::sph::mhd { Tvec B_a, Tvec B_b, + Tvec J_a, + Tvec J_b, + Tscal psi_a, Tscal psi_b, @@ -458,10 +460,10 @@ namespace shamrock::sph::mhd { if constexpr (MHD_mode == NonIdeal) { // logger::raw_ln("############# NON IDEAL MHD #############"); - Tvec J_a = MagCurrentJ( - pmass, B_a, B_b, r_ab_unit * dWab_a, sub_fact_a, mu_0); - Tvec J_b = MagCurrentJ( - pmass, B_a, B_b, r_ab_unit * dWab_b, sub_fact_b, mu_0); + // Tvec J_a = MagCurrentJ( + // pmass, B_a, B_b, r_ab_unit * dWab_a, sub_fact_a, mu_0); + // Tvec J_b = MagCurrentJ( + // pmass, B_a, B_b, r_ab_unit * dWab_b, sub_fact_b, mu_0); Tvec D_a = WursterD(B_a, J_a, etaO, etaH, etaAD); Tvec D_b = WursterD(B_b, J_b, etaO, etaH, etaAD); diff --git a/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp b/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp index a5f60717c4..71e16a0cb7 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp @@ -104,6 +104,8 @@ namespace shammodels::sph { Component> old_dB_on_rho; Component> old_dpsi_on_ch; + Component> MagCurrentJ; + Component> old_dtepsilon; Component> old_dtdeltav; diff --git a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp index db273827cf..696ca99a0d 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp @@ -76,6 +76,9 @@ namespace shammodels::sph::modules { // Thin wrappers that unpack the variant and forward to the template above. void update_derivs_MHD(IdealMHD cfg); void update_derivs_MHD(NonIdealMHD cfg); + + template + void compute_J(Tscal mu_0); }; } // namespace shammodels::sph::modules diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 470da61dc3..1aee86cba8 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1278,6 +1278,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { const u32 iB_on_rho = (has_B_field) ? pdl.get_field_idx("B/rho") : 0; const u32 idB_on_rho = (has_B_field) ? pdl.get_field_idx("dB/rho") : 0; + const u32 iJ = (has_B_field) ? pdl.get_field_idx("J") : 0; const u32 ipsi_on_ch = (has_psi_field) ? pdl.get_field_idx("psi/ch") : 0; const u32 idpsi_on_ch = (has_psi_field) ? pdl.get_field_idx("dpsi/ch") : 0; const u32 icurlB = (has_curlB_field) ? pdl.get_field_idx("curlB") : 0; @@ -1301,6 +1302,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { u32 iuint_interf = ghost_layout.get_field_idx("uint"); u32 ivxyz_interf = ghost_layout.get_field_idx("vxyz"); u32 iomega_interf = ghost_layout.get_field_idx("omega"); + u32 iJ_interf = ghost_layout.get_field_idx("J"); const u32 iaxyz_interf = (solver_config.has_axyz_in_ghost()) ? ghost_layout.get_field_idx("axyz") : 0; @@ -1366,6 +1368,8 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { if (has_B_field) { sender_patch.get_field(iB_on_rho).append_subset_to( buf_idx, cnt, pdat.get_field(iB_interf)); + sender_patch.get_field(iJ).append_subset_to( + buf_idx, cnt, pdat.get_field(iJ_interf)); } if (has_psi_field) { @@ -1443,6 +1447,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { if (has_B_field) { pdat_new.get_field(iB_interf).insert(pdat.get_field(iB_on_rho)); + pdat_new.get_field(iJ_interf).insert(pdat.get_field(iJ)); } if (has_psi_field) { diff --git a/src/shammodels/sph/src/SolverConfig.cpp b/src/shammodels/sph/src/SolverConfig.cpp index 4259af596e..793d09a614 100644 --- a/src/shammodels/sph/src/SolverConfig.cpp +++ b/src/shammodels/sph/src/SolverConfig.cpp @@ -66,6 +66,7 @@ namespace shammodels::sph { pdl.add_field("B/rho", 1); pdl.add_field("dB/rho", 1); pdl.add_field("drho/dt", 1); + pdl.add_field("J", 1); } if (has_field_psi_on_ch()) { @@ -132,6 +133,7 @@ namespace shammodels::sph { if (has_field_B_on_rho()) { ghost_layout.add_field("B/rho", 1); + ghost_layout.add_field("J", 1); // @@@ only for ni mhd } if (has_field_psi_on_ch()) { diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 561ff9ecdd..5f66d3e0f5 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -30,6 +30,7 @@ #include "shammodels/sph/modules/UpdateDerivs.hpp" #include "shamphys/mhd.hpp" #include "shamrock/patch/PatchDataFieldSpan.hpp" +#include "shamrock/scheduler/SchedulerUtility.hpp" #include "shamrock/solvergraph/FieldRefs.hpp" #include "shamrock/solvergraph/IFieldSpan.hpp" #include "shamrock/solvergraph/Indexes.hpp" @@ -722,6 +723,124 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_disc // ── thin variant-unpacking wrappers ────────────────────────────────────────── +template class SPHKernel> +template +void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu_0) { + + // skip for ideal MHD + if constexpr (MHD_mode == shamrock::sph::mhd::MHDType::Ideal) { + return; + } + + StackEntry stack_loc{}; + + using namespace shamrock; + using namespace shamrock::patch; + + shamrock::SchedulerUtility utility(scheduler()); + logger::raw_ln("############ intializing J ############"); + // storage.MagCurrentJ.set(utility.make_compute_field("MagCurrentJ", 1)); + + shamrock::patch::PatchDataLayerLayout &ghost_layout + = shambase::get_check_ref(storage.ghost_layout.get()); + u32 ihpart_interf = ghost_layout.get_field_idx("hpart"); + u32 iomega_interf = ghost_layout.get_field_idx("omega"); + u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); + u32 iJ_interf = ghost_layout.get_field_idx("J"); + + auto &merged_xyzh = storage.merged_xyzh.get(); + shambase::DistributedData &mpdats = storage.merged_patchdata_ghost.get(); + + scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { + PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); + + sham::DeviceBuffer &buf_xyz + = merged_xyzh.get(cur_p.id_patch).template get_field_buf_ref(0); + sham::DeviceBuffer &buf_hpart = mpdat.get_field_buf_ref(ihpart_interf); + sham::DeviceBuffer &buf_omega = mpdat.get_field_buf_ref(iomega_interf); + sham::DeviceBuffer &buf_B_on_rho = mpdat.get_field_buf_ref(iB_on_rho_interf); + + logger::raw_ln("############ get the buffer J ############"); + // sham::DeviceBuffer &buf_J = + // storage.MagCurrentJ.get().get_buf_check(cur_p.id_patch); + sham::DeviceBuffer &buf_J = mpdat.get_field_buf_ref(iJ_interf); + + tree::ObjectCache &pcache + = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); + + sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().get_queue(); + sham::EventList depends_list; + + auto xyz = buf_xyz.get_read_access(depends_list); + auto hpart = buf_hpart.get_read_access(depends_list); + auto omega = buf_omega.get_read_access(depends_list); + auto B_on_rho = buf_B_on_rho.get_read_access(depends_list); + auto J_out = buf_J.get_write_access(depends_list); + auto ploop_ptrs = pcache.get_read_access(depends_list); + + auto e = q.submit(depends_list, [&](sycl::handler &cgh) { + const Tscal pmass = solver_config.gpart_mass; + const Tscal _mu_0 = mu_0; + + tree::ObjectCacheIterator particle_looper(ploop_ptrs); + constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern; + + shambase::parallel_for(cgh, mpdat.get_obj_cnt(), "compute J", [=](u64 gid) { + u32 id_a = (u32) gid; + + using namespace shamrock::sph; + + Tscal h_a = hpart[id_a]; + Tvec xyz_a = xyz[id_a]; + + Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); + Tscal rho_a_sq = rho_a * rho_a; + Tscal omega_a = omega[id_a]; + Tscal sub_fact_a = rho_a_sq * omega_a; + + Tvec B_a = B_on_rho[id_a] * rho_a; + + // Accumulate J_a = sum_b m_b / (rho_a^2 omega_a) + // * (B_a - B_b) x nabla_W(r_ab, h_a) / mu_0 + Tvec J_a{0, 0, 0}; + + particle_looper.for_each_object(id_a, [&](u32 id_b) { + Tvec dr = xyz_a - xyz[id_b]; + Tscal rab2 = sycl::dot(dr, dr); + Tscal h_b = hpart[id_b]; + + if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) { + return; + } + + Tscal rab = sycl::sqrt(rab2); + Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); + Tvec B_b = B_on_rho[id_b] * rho_b; + + Tscal Fab_a = Kernel::dW_3d(rab, h_a); + Tvec r_ab_unit = dr * sham::inv_sat_positive(rab); + Tvec nabla_Wab_ha = r_ab_unit * Fab_a; + + shamrock::sph::mhd::MagCurrentJ_sum( + pmass, B_a, B_b, nabla_Wab_ha, sub_fact_a, _mu_0, J_a); + }); + + J_out[id_a] = J_a; + }); + }); + + buf_xyz.complete_event_state(e); + buf_hpart.complete_event_state(e); + buf_omega.complete_event_state(e); + buf_B_on_rho.complete_event_state(e); + buf_J.complete_event_state(e); + + sham::EventList resulting_events; + resulting_events.add_event(e); + pcache.complete_event_state(resulting_events); + }); +} + template class SPHKernel> void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(IdealMHD cfg) { update_derivs_MHD_impl( @@ -783,10 +902,17 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); u32 ipsi_on_ch_interf = ghost_layout.get_field_idx("psi/ch"); + logger::raw_ln("@@@@@@@@@@@ before getting J @@@@@@@@@@@"); + u32 iJ_interf = ghost_layout.get_field_idx("J"); + auto &merged_xyzh = storage.merged_xyzh.get(); shamrock::solvergraph::Field &omega = shambase::get_check_ref(storage.omega); shambase::DistributedData &mpdats = storage.merged_patchdata_ghost.get(); + // Pre-compute J for all particles + logger::raw_ln("@@@@@@@@@@@ before compute J @@@@@@@@@@@"); + compute_J(mu_0); + scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); @@ -811,6 +937,13 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ sham::DeviceBuffer &buf_psi_on_ch = mpdat.get_field_buf_ref(ipsi_on_ch_interf); + // logger::raw_ln("############ first get J in update derivs############"); + // sham::DeviceBuffer &buf_J = + // storage.MagCurrentJ.get().get_buf_check(cur_p.id_patch); // @@@ needs to be communicated + // in ghosts !!) + + sham::DeviceBuffer &buf_J = mpdat.get_field_buf_ref(iJ_interf); + tree::ObjectCache &pcache = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); @@ -831,6 +964,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ auto dB_on_rho = buf_dB_on_rho.get_write_access(depends_list); auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list); auto drho_dt = buf_drho_dt.get_write_access(depends_list); + auto J_field = buf_J.get_read_access(depends_list); Tvec *mag_pressure = (do_MHD_debug) @@ -898,6 +1032,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal omega_a = omega[id_a]; Tscal u_a = u[id_a]; + Tvec J_a = J_field[id_a]; + Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); Tscal rho_a_sq = rho_a * rho_a; Tscal rho_a_inv = 1. / rho_a; @@ -940,6 +1076,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal cs_b = cs[id_b]; Tscal rab = sycl::sqrt(rab2); + Tvec J_b = J_field[id_b]; + Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); Tvec B_b = B_on_rho[id_b] * rho_b; Tscal v_alfven_b = sycl::sqrt(sycl::dot(B_b, B_b) / (mu_0 * rho_b)); @@ -975,6 +1113,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ _alpha_u, B_a, B_b, + J_a, + J_b, psi_a, psi_b, mu_0, @@ -1030,6 +1170,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ buf_dB_on_rho.complete_event_state(e); buf_dpsi_on_ch.complete_event_state(e); buf_drho_dt.complete_event_state(e); + buf_J.complete_event_state(e); if (do_MHD_debug) { pdat.get_field_buf_ref(imag_pressure).complete_event_state(e); @@ -1046,6 +1187,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ resulting_events.add_event(e); pcache.complete_event_state(resulting_events); }); + + // storage.MagCurrentJ.reset(); } /** From 70586aafc76d592230f6a2c6f83652335fc82b68 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 4 Jun 2026 10:47:02 +0200 Subject: [PATCH 06/54] fix potential division by 0 --- src/shammodels/sph/include/shammodels/sph/math/mhd.hpp | 4 ++-- src/shammodels/sph/src/Solver.cpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 5e20f3b4fb..aeaf7b971d 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -43,7 +43,7 @@ namespace shamrock::sph::mhd { template inline Tvec WursterD(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD) { - Tvec Bhat = B / sycl::length(B); + Tvec Bhat = B / sham::inv_sat_zero(sycl::length(B)); Tvec D = etaO * J + etaH * sycl::cross(J, Bhat) + etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); @@ -419,7 +419,7 @@ namespace shamrock::sph::mhd { dB_on_rho_dt += v_ab * dB_on_rho_induction_term( - pmass, rho_a_sq, B_a, omega_a, r_ab_unit * dWab_b); // @@ dWab_a ? + pmass, rho_a_sq, B_a, omega_a, r_ab_unit * dWab_a); // @@@ dWab_b ? dB_on_rho_dt += dB_on_rho_psi_term( pmass, diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 9e5cb16dfe..21b326e34a 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -2592,7 +2592,8 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() sycl::range<1>{pdat.get_obj_cnt()}, [=](sycl::item<1> item) { Tscal h_a = hpart[item]; - Tscal dt_AD = h_a * h_a / etaAD; + Tscal dt_AD = (etaAD > 0) ? (h_a * h_a / etaAD) + : shambase::get_infty(); cfl_dt[item] = sycl::min(cfl_dt[item], dt_AD); }); From 23b20f0ccfc5d018f9d4033dc1158ffdd458dc05 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 4 Jun 2026 10:54:18 +0200 Subject: [PATCH 07/54] fix pre-commit --- src/shammodels/sph/src/modules/UpdateDerivs.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 0d2b892008..ab89791dc8 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -738,8 +738,6 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_disc }); } -// ── thin variant-unpacking wrappers ────────────────────────────────────────── - template class SPHKernel> template void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu_0) { From 6636ce81ef00ca67d884eba55713a6cf39cdc4d6 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 4 Jun 2026 11:51:35 +0200 Subject: [PATCH 08/54] correctly communicate J in ghosts --- .../sph/include/shammodels/sph/math/mhd.hpp | 6 +----- src/shammodels/sph/src/Solver.cpp | 21 ++++++++++++++----- .../sph/src/modules/UpdateDerivs.cpp | 15 ++++++------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index aeaf7b971d..fd8f973c30 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -35,7 +35,7 @@ namespace shamrock::sph::mhd { template inline void MagCurrentJ_sum( - Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0, Tvec J_a) { + Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0, Tvec &J_a) { J_a += m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha) / mu_0; } @@ -63,8 +63,6 @@ namespace shamrock::sph::mhd { Tscal m_b, Tscal rho_a_sq, Tscal rho_b_sq, - Tvec B_a, - Tvec B_b, Tscal omega_a, Tscal omega_b, Tvec nabla_Wab_ha, @@ -474,8 +472,6 @@ namespace shamrock::sph::mhd { pmass, rho_a_sq, rho_b * rho_b, - B_a, - B_b, omega_a, omega_b, r_ab_unit * dWab_a, diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 21b326e34a..26bdadfdfc 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1303,6 +1303,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { bool has_B_field = solver_config.has_field_B_on_rho(); bool has_psi_field = solver_config.has_field_psi_on_ch(); + bool do_NIMHD = solver_config.do_NIMHD(); bool has_curlB_field = solver_config.has_field_curlB(); bool has_epsilon_field = solver_config.dust_config.has_epsilon_field(); bool has_deltav_field = solver_config.dust_config.has_deltav_field(); @@ -1413,8 +1414,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { if (has_B_field) { sender_patch.get_field(iB_on_rho).append_subset_to( buf_idx, cnt, pdat.get_field(iB_interf)); - sender_patch.get_field(iJ).append_subset_to( - buf_idx, cnt, pdat.get_field(iJ_interf)); } if (has_psi_field) { @@ -1422,6 +1421,11 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { .append_subset_to(buf_idx, cnt, pdat.get_field(ipsi_interf)); } + if (do_NIMHD) { + sender_patch.get_field(iJ).append_subset_to( + buf_idx, cnt, pdat.get_field(iJ_interf)); + } + if (has_curlB_field) { sender_patch.get_field(icurlB).append_subset_to( buf_idx, cnt, pdat.get_field(icurlB_interf)); @@ -1497,7 +1501,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { if (has_B_field) { pdat_new.get_field(iB_interf).insert(pdat.get_field(iB_on_rho)); - pdat_new.get_field(iJ_interf).insert(pdat.get_field(iJ)); } if (has_psi_field) { @@ -1505,6 +1508,10 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { .insert(pdat.get_field(ipsi_on_ch)); } + if (do_NIMHD) { + pdat_new.get_field(iJ_interf).insert(pdat.get_field(iJ)); + } + if (has_curlB_field) { pdat_new.get_field(icurlB_interf).insert(pdat.get_field(icurlB)); } @@ -2564,7 +2571,11 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() sham::DeviceBuffer &vclean_buf = shambase::get_check_ref(vclean_dt).get_buf_check(cur_p.id_patch); auto vclean = vclean_buf.get_read_access(depends_list); - auto e = q.submit(depends_list, [&](sycl::handler &cgh) { + + // first, finish the outer kernel and write in cfl_dt + // then, compute psi_dt and write in cfl_dt + depends_list.add_event(e); + auto e = q.submit(depends_list, [&](sycl::handler &cgh) { Tscal C_cour = solver_config.cfl_config.cfl_cour * solver_config.time_state.cfl_multiplier; @@ -2582,7 +2593,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() }; if (do_NIMHD) { - + depends_list.add_event(e); auto e = q.submit(depends_list, [&](sycl::handler &cgh) { auto *nimhd = std::get_if::NonIdealMHD>( &solver_config.mhd_config.configMHD); diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index ab89791dc8..a1be415a7b 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -753,19 +753,19 @@ void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu using namespace shamrock::patch; shamrock::SchedulerUtility utility(scheduler()); - logger::raw_ln("############ intializing J ############"); - // storage.MagCurrentJ.set(utility.make_compute_field("MagCurrentJ", 1)); shamrock::patch::PatchDataLayerLayout &ghost_layout = shambase::get_check_ref(storage.ghost_layout.get()); u32 ihpart_interf = ghost_layout.get_field_idx("hpart"); u32 iomega_interf = ghost_layout.get_field_idx("omega"); u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); - u32 iJ_interf = ghost_layout.get_field_idx("J"); auto &merged_xyzh = storage.merged_xyzh.get(); shambase::DistributedData &mpdats = storage.merged_patchdata_ghost.get(); + shamrock::patch::PatchDataLayerLayout &pdl = scheduler().pdl_old(); + u32 iJ = pdl.get_field_idx("J"); + scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); @@ -775,11 +775,10 @@ void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu sham::DeviceBuffer &buf_omega = mpdat.get_field_buf_ref(iomega_interf); sham::DeviceBuffer &buf_B_on_rho = mpdat.get_field_buf_ref(iB_on_rho_interf); - logger::raw_ln("############ get the buffer J ############"); - // sham::DeviceBuffer &buf_J = - // storage.MagCurrentJ.get().get_buf_check(cur_p.id_patch); - sham::DeviceBuffer &buf_J = mpdat.get_field_buf_ref(iJ_interf); + logger::raw_ln("############ get the local buffer J ############"); + sham::DeviceBuffer &buf_J = pdat.get_field_buf_ref(iJ); + // get local cache tree::ObjectCache &pcache = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); @@ -794,6 +793,8 @@ void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu auto ploop_ptrs = pcache.get_read_access(depends_list); auto e = q.submit(depends_list, [&](sycl::handler &cgh) { + // iterate on local particles + const Tscal pmass = solver_config.gpart_mass; const Tscal _mu_0 = mu_0; From 071924a15959c5b369bb5ad30da2bfc2cf282d6a Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 4 Jun 2026 12:15:45 +0200 Subject: [PATCH 09/54] fix ghost com fields --- src/shammodels/sph/src/Solver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 26bdadfdfc..98249bcd1c 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1322,7 +1322,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { const u32 iB_on_rho = (has_B_field) ? pdl.get_field_idx("B/rho") : 0; const u32 idB_on_rho = (has_B_field) ? pdl.get_field_idx("dB/rho") : 0; - const u32 iJ = (has_B_field) ? pdl.get_field_idx("J") : 0; + const u32 iJ = (do_NIMHD) ? pdl.get_field_idx("J") : 0; const u32 ipsi_on_ch = (has_psi_field) ? pdl.get_field_idx("psi/ch") : 0; const u32 idpsi_on_ch = (has_psi_field) ? pdl.get_field_idx("dpsi/ch") : 0; const u32 icurlB = (has_curlB_field) ? pdl.get_field_idx("curlB") : 0; @@ -1347,7 +1347,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { u32 iuint_interf = ghost_layout.get_field_idx("uint"); u32 ivxyz_interf = ghost_layout.get_field_idx("vxyz"); u32 iomega_interf = ghost_layout.get_field_idx("omega"); - u32 iJ_interf = ghost_layout.get_field_idx("J"); const u32 iaxyz_interf = (solver_config.has_axyz_in_ghost()) ? ghost_layout.get_field_idx("axyz") : 0; @@ -1358,6 +1357,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { const u32 iB_interf = (has_B_field) ? ghost_layout.get_field_idx("B/rho") : 0; const u32 ipsi_interf = (has_psi_field) ? ghost_layout.get_field_idx("psi/ch") : 0; const u32 icurlB_interf = (has_curlB_field) ? ghost_layout.get_field_idx("curlB") : 0; + const u32 iJ_interf = (do_NIMHD) ? ghost_layout.get_field_idx("J") : 0; const u32 iepsilon_interf = (has_epsilon_field) ? ghost_layout.get_field_idx("epsilon") : 0; From 8b64f74a5ea4b9e739dedc9c385d6a7588322361 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 4 Jun 2026 14:30:59 +0200 Subject: [PATCH 10/54] clean up rogue J's --- src/shammodels/sph/src/SolverConfig.cpp | 10 ++++-- .../sph/src/modules/UpdateDerivs.cpp | 31 ++++++++++--------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/shammodels/sph/src/SolverConfig.cpp b/src/shammodels/sph/src/SolverConfig.cpp index bdf60344ef..b7d45d98be 100644 --- a/src/shammodels/sph/src/SolverConfig.cpp +++ b/src/shammodels/sph/src/SolverConfig.cpp @@ -66,7 +66,6 @@ namespace shammodels::sph { pdl.add_field("B/rho", 1); pdl.add_field("dB/rho", 1); pdl.add_field("drho/dt", 1); - pdl.add_field("J", 1); } if (has_field_psi_on_ch()) { @@ -81,6 +80,10 @@ namespace shammodels::sph { pdl.add_field("curlB", 1); } + if (do_NIMHD()) { + pdl.add_field("J", 1); + } + if (dust_config.has_epsilon_field()) { u32 ndust = dust_config.get_dust_nvar(); pdl.add_field("epsilon", ndust); @@ -139,13 +142,16 @@ namespace shammodels::sph { if (has_field_B_on_rho()) { ghost_layout.add_field("B/rho", 1); - ghost_layout.add_field("J", 1); // @@@ only for ni mhd } if (has_field_psi_on_ch()) { ghost_layout.add_field("psi/ch", 1); } + if (do_NIMHD()) { + ghost_layout.add_field("J", 1); // @@@ only for ni mhd + } + if (has_field_curlB()) { ghost_layout.add_field("curlB", 1); } diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index a1be415a7b..1a768e805b 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -775,7 +775,6 @@ void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu sham::DeviceBuffer &buf_omega = mpdat.get_field_buf_ref(iomega_interf); sham::DeviceBuffer &buf_B_on_rho = mpdat.get_field_buf_ref(iB_on_rho_interf); - logger::raw_ln("############ get the local buffer J ############"); sham::DeviceBuffer &buf_J = pdat.get_field_buf_ref(iJ); // get local cache @@ -918,16 +917,19 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); u32 ipsi_on_ch_interf = ghost_layout.get_field_idx("psi/ch"); - logger::raw_ln("@@@@@@@@@@@ before getting J @@@@@@@@@@@"); - u32 iJ_interf = ghost_layout.get_field_idx("J"); + bool do_NIMHD = solver_config.do_NIMHD(); + + u32 iJ = (do_NIMHD) ? pdl.get_field_idx("J") : -1; + u32 iJ_interf = (do_NIMHD) ? ghost_layout.get_field_idx("J") : -1; auto &merged_xyzh = storage.merged_xyzh.get(); shamrock::solvergraph::Field &omega = shambase::get_check_ref(storage.omega); shambase::DistributedData &mpdats = storage.merged_patchdata_ghost.get(); // Pre-compute J for all particles - logger::raw_ln("@@@@@@@@@@@ before compute J @@@@@@@@@@@"); - compute_J(mu_0); + if (do_NIMHD) { + compute_J(mu_0); + } scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); @@ -953,12 +955,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ sham::DeviceBuffer &buf_psi_on_ch = mpdat.get_field_buf_ref(ipsi_on_ch_interf); - // logger::raw_ln("############ first get J in update derivs############"); - // sham::DeviceBuffer &buf_J = - // storage.MagCurrentJ.get().get_buf_check(cur_p.id_patch); // @@@ needs to be communicated - // in ghosts !!) - - sham::DeviceBuffer &buf_J = mpdat.get_field_buf_ref(iJ_interf); + // sham::DeviceBuffer &buf_J = (do_NIMHD) ? mpdat.get_field_buf_ref(iJ_interf): + // nullptr; tree::ObjectCache &pcache = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); @@ -980,7 +978,9 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ auto dB_on_rho = buf_dB_on_rho.get_write_access(depends_list); auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list); auto drho_dt = buf_drho_dt.get_write_access(depends_list); - auto J_field = buf_J.get_read_access(depends_list); + + Tvec *J_field = (do_NIMHD) ? pdat.get_field_buf_ref(iJ).get_write_access(depends_list) + : nullptr; Tvec *mag_pressure = (do_MHD_debug) @@ -1048,7 +1048,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal omega_a = omega[id_a]; Tscal u_a = u[id_a]; - Tvec J_a = J_field[id_a]; + Tvec J_a = (do_NIMHD) ? J_field[id_a] : Tvec({0, 0, 0}); Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); Tscal rho_a_sq = rho_a * rho_a; @@ -1092,7 +1092,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal cs_b = cs[id_b]; Tscal rab = sycl::sqrt(rab2); - Tvec J_b = J_field[id_b]; + Tvec J_b = (do_NIMHD) ? J_field[id_b] : Tvec({0, 0, 0}); Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); Tvec B_b = B_on_rho[id_b] * rho_b; @@ -1186,7 +1186,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ buf_dB_on_rho.complete_event_state(e); buf_dpsi_on_ch.complete_event_state(e); buf_drho_dt.complete_event_state(e); - buf_J.complete_event_state(e); + + // if(do_NIMHD){buf_J.complete_event_state(e);} if (do_MHD_debug) { pdat.get_field_buf_ref(imag_pressure).complete_event_state(e); From 06c57c9a8c3812822bde9e05a22db8ea341a55c9 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Sun, 7 Jun 2026 12:11:10 +0200 Subject: [PATCH 11/54] remove logs --- src/shammodels/sph/src/modules/UpdateDerivs.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 1a768e805b..373a547694 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -743,6 +743,7 @@ template void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu_0) { // skip for ideal MHD + logger::raw_ln("@@@@@@@@@@@@@@@@@@ stat computing j @@@@@@@@@@@@@@@@@@"); if constexpr (MHD_mode == shamrock::sph::mhd::MHDType::Ideal) { return; } @@ -854,6 +855,8 @@ void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu resulting_events.add_event(e); pcache.complete_event_state(resulting_events); }); + + logger::raw_ln("@@@@@@@@@@@@@@@@@@finished @@@@@@@@@@@@@@@@@@"); } template class SPHKernel> @@ -1025,19 +1028,25 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ const Tscal _etaAD = etaAD; shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); + logger::raw_ln("44444444 problem loading args ?"); shamlog_debug_sycl_ln("deriv kernel", "sigma_mhd :", _sigma); + logger::raw_ln("NOPE"); shamlog_debug_sycl_ln("deriv kernel", "alpha_u :", _alpha_u); shamlog_debug_sycl_ln("deriv kernel", "etaO :", _etaO); shamlog_debug_sycl_ln("deriv kernel", "etaH :", _etaH); shamlog_debug_sycl_ln("deriv kernel", "etaAD :", _etaAD); + logger::raw_ln("NOPE"); shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); + logger::raw_ln("bah alors ?"); tree::ObjectCacheIterator particle_looper(ploop_ptrs); + logger::raw_ln("bah alors ?"); constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern; - + logger::raw_ln("bah alors ?"); shambase::parallel_for(cgh, pdat.get_obj_cnt(), "compute MHD", [=](u64 gid) { u32 id_a = (u32) gid; + logger::raw_ln("bah alors ????????????????"); using namespace shamrock::sph; Tscal h_a = hpart[id_a]; @@ -1048,6 +1057,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal omega_a = omega[id_a]; Tscal u_a = u[id_a]; + logger::raw_ln("AAAAAAAAAA"); Tvec J_a = (do_NIMHD) ? J_field[id_a] : Tvec({0, 0, 0}); Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); @@ -1092,6 +1102,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal cs_b = cs[id_b]; Tscal rab = sycl::sqrt(rab2); + logger::raw_ln("BBBBBBBBBBBBB"); Tvec J_b = (do_NIMHD) ? J_field[id_b] : Tvec({0, 0, 0}); Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); @@ -1103,6 +1114,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal Fab_a = Kernel::dW_3d(rab, h_a); Tscal Fab_b = Kernel::dW_3d(rab, h_b); + logger::raw_ln("before add_to_derivs_spmhd"); shamrock::sph::mhd::add_to_derivs_spmhd( pmass, dr, From 347fa18b9db67f20cdd58de7ec27b211f328fce8 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Mon, 15 Jun 2026 17:07:56 +0200 Subject: [PATCH 12/54] test1 --- .../sph/include/shammodels/sph/Solver.hpp | 2 ++ .../shammodels/sph/modules/UpdateDerivs.hpp | 4 ++-- src/shammodels/sph/src/Solver.cpp | 18 ++++++++++++++++ .../sph/src/modules/UpdateDerivs.cpp | 21 ++++++++++--------- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/Solver.hpp b/src/shammodels/sph/include/shammodels/sph/Solver.hpp index 83509cbcd1..62cd97190a 100644 --- a/src/shammodels/sph/include/shammodels/sph/Solver.hpp +++ b/src/shammodels/sph/include/shammodels/sph/Solver.hpp @@ -195,6 +195,8 @@ namespace shammodels::sph { void prepare_corrector(); /// @brief Updates time derivatives and applies external forces void update_derivs(); + + void compute_J(); /** * @brief * diff --git a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp index f5a039d423..0cd1bc5371 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp @@ -43,6 +43,8 @@ namespace shammodels::sph::modules { : context(context), solver_config(solver_config), storage(storage) {} void update_derivs(); + //template + void compute_J(Tscal mu_0); private: inline PatchScheduler &scheduler() { return shambase::get_check_ref(context.sched); } @@ -81,8 +83,6 @@ namespace shammodels::sph::modules { void update_derivs_MHD(IdealMHD cfg); void update_derivs_MHD(NonIdealMHD cfg); - template - void compute_J(Tscal mu_0); }; } // namespace shammodels::sph::modules diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 21b326e34a..95e6eaa305 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1621,6 +1621,15 @@ void shammodels::sph::Solver::update_derivs() { ext_forces.add_ext_forces(); } +template class Kern> +void shammodels::sph::Solver::compute_J() { + + modules::UpdateDerivs derivs(context, solver_config, storage); + Tscal const mu_0 = solver_config.get_constant_mu_0(); + derivs.compute_J(mu_0); + +} + template class Kern> bool shammodels::sph::Solver::apply_corrector(Tscal dt, u64 Npart_all) { return false; @@ -1684,6 +1693,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() bool do_NIMHD = solver_config.do_NIMHD(); + PatchDataLayerLayout &pdl = scheduler().pdl_old(); const u32 ixyz = pdl.get_field_idx("xyz"); @@ -1958,6 +1968,14 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() "a dt that is too large"); } + communicate_merge_ghosts_fields(); + + modules::UpdateDerivs derivs(context, solver_config, storage); + Tscal const mu_0 = solver_config.get_constant_mu_0(); + derivs.compute_J(mu_0); + + reset_merge_ghosts_fields(); + // communicate fields communicate_merge_ghosts_fields(); diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index ab89791dc8..921766c9a3 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -739,13 +739,12 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_disc } template class SPHKernel> -template void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu_0) { // skip for ideal MHD - if constexpr (MHD_mode == shamrock::sph::mhd::MHDType::Ideal) { - return; - } + //if constexpr (MHD_mode == shamrock::sph::mhd::MHDType::Ideal) { + // return; + //} StackEntry stack_loc{}; @@ -761,7 +760,9 @@ void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu u32 ihpart_interf = ghost_layout.get_field_idx("hpart"); u32 iomega_interf = ghost_layout.get_field_idx("omega"); u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); - u32 iJ_interf = ghost_layout.get_field_idx("J"); + + PatchDataLayerLayout &pdl = scheduler().pdl_old(); + u32 iJ = pdl.get_field_idx("J"); auto &merged_xyzh = storage.merged_xyzh.get(); shambase::DistributedData &mpdats = storage.merged_patchdata_ghost.get(); @@ -778,7 +779,7 @@ void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu logger::raw_ln("############ get the buffer J ############"); // sham::DeviceBuffer &buf_J = // storage.MagCurrentJ.get().get_buf_check(cur_p.id_patch); - sham::DeviceBuffer &buf_J = mpdat.get_field_buf_ref(iJ_interf); + sham::DeviceBuffer &buf_J = pdat.get_field_buf_ref(iJ); tree::ObjectCache &pcache = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); @@ -790,7 +791,7 @@ void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu auto hpart = buf_hpart.get_read_access(depends_list); auto omega = buf_omega.get_read_access(depends_list); auto B_on_rho = buf_B_on_rho.get_read_access(depends_list); - auto J_out = buf_J.get_write_access(depends_list); + auto J_out = buf_J.get_write_access(depends_list); auto ploop_ptrs = pcache.get_read_access(depends_list); auto e = q.submit(depends_list, [&](sycl::handler &cgh) { @@ -800,7 +801,7 @@ void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu tree::ObjectCacheIterator particle_looper(ploop_ptrs); constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern; - shambase::parallel_for(cgh, mpdat.get_obj_cnt(), "compute J", [=](u64 gid) { + shambase::parallel_for(cgh, pdat.get_obj_cnt(), "compute J", [=](u64 gid) { u32 id_a = (u32) gid; using namespace shamrock::sph; @@ -854,7 +855,7 @@ void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu resulting_events.add_event(e); pcache.complete_event_state(resulting_events); }); -} +} template class SPHKernel> void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(IdealMHD cfg) { @@ -926,7 +927,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ // Pre-compute J for all particles logger::raw_ln("@@@@@@@@@@@ before compute J @@@@@@@@@@@"); - compute_J(mu_0); + //compute_J(mu_0); scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); From 36ae82e4cf3918e0eec7f61bafd6201547f77073 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Mon, 15 Jun 2026 18:41:23 +0200 Subject: [PATCH 13/54] move computeJ to solvergraph --- src/shammodels/sph/CMakeLists.txt | 1 + .../sph/include/shammodels/sph/Solver.hpp | 1 - .../shammodels/sph/modules/ComputeJ.hpp | 80 ++++++++++++ .../shammodels/sph/modules/SolverStorage.hpp | 2 +- .../shammodels/sph/modules/UpdateDerivs.hpp | 3 - src/shammodels/sph/src/Solver.cpp | 76 +++++++++-- src/shammodels/sph/src/modules/ComputeJ.cpp | 113 ++++++++++++++++ .../sph/src/modules/UpdateDerivs.cpp | 121 +----------------- 8 files changed, 260 insertions(+), 137 deletions(-) create mode 100644 src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp create mode 100644 src/shammodels/sph/src/modules/ComputeJ.cpp diff --git a/src/shammodels/sph/CMakeLists.txt b/src/shammodels/sph/CMakeLists.txt index 5e7100a79e..9088b7f8b9 100644 --- a/src/shammodels/sph/CMakeLists.txt +++ b/src/shammodels/sph/CMakeLists.txt @@ -34,6 +34,7 @@ set(Sources src/modules/UpdateDerivs.cpp src/modules/ComputeLoadBalanceValue.cpp src/modules/ComputeOmega.cpp + src/modules/ComputeJ.cpp src/modules/ComputeLuminosity.cpp src/modules/NeighbourCache.cpp src/modules/ParticleReordering.cpp diff --git a/src/shammodels/sph/include/shammodels/sph/Solver.hpp b/src/shammodels/sph/include/shammodels/sph/Solver.hpp index 62cd97190a..a4e027ebbb 100644 --- a/src/shammodels/sph/include/shammodels/sph/Solver.hpp +++ b/src/shammodels/sph/include/shammodels/sph/Solver.hpp @@ -196,7 +196,6 @@ namespace shammodels::sph { /// @brief Updates time derivatives and applies external forces void update_derivs(); - void compute_J(); /** * @brief * diff --git a/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp b/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp new file mode 100644 index 0000000000..2274a1e8be --- /dev/null +++ b/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp @@ -0,0 +1,80 @@ +// -------------------------------------------------------// +// +// SHAMROCK code for hydrodynamics +// Copyright (c) 2021-2026 Timothée David--Cléris +// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1 +// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information +// +// -------------------------------------------------------// + +#pragma once + +/** + * @file ComputeJ.hpp + * @author Timothée David--Cléris (tim.shamrock@proton.me) + * @brief + * + */ + +#include "shambackends/typeAliasVec.hpp" +#include "shambackends/vec.hpp" +#include "shammodels/sph/SolverConfig.hpp" +#include "shammodels/sph/modules/SolverStorage.hpp" +#include "shamrock/scheduler/ShamrockCtx.hpp" + +namespace shammodels::sph::modules { + + template class SPHKernel> + class NodeComputeJ : public shamrock::solvergraph::INode { + + using Tscal = shambase::VecComponent; + + static constexpr Tscal kernel_radius = SPHKernel::Rkern; + Tscal part_mass; + Tscal mu_0; + + public: + NodeComputeJ(Tscal part_mass, Tscal mu_0) : part_mass(part_mass), mu_0(mu_0) {} + + struct Edges { + const shamrock::solvergraph::Indexes &part_counts; + const shammodels::sph::solvergraph::NeighCache &neigh_cache; + const shamrock::solvergraph::IFieldSpan &xyz; + const shamrock::solvergraph::IFieldSpan &hpart; + const shamrock::solvergraph::IFieldSpan ω + const shamrock::solvergraph::IFieldSpan &B_on_rho; + shamrock::solvergraph::IFieldSpan &J; + }; + + inline void set_edges( + std::shared_ptr> part_counts, + std::shared_ptr neigh_cache, + std::shared_ptr> xyz, + std::shared_ptr> hpart, + std::shared_ptr> omega, + std::shared_ptr> B_on_rho, + std::shared_ptr> J) { + __internal_set_ro_edges({part_counts, neigh_cache, xyz, hpart, omega, B_on_rho}); + __internal_set_rw_edges({J}); + } + + inline Edges get_edges() { + return Edges{ + get_ro_edge>(0), + get_ro_edge(1), + get_ro_edge>(2), + get_ro_edge>(3), + get_ro_edge>(4), + get_ro_edge>(5), + get_rw_edge>(0), + }; + } + + void _impl_evaluate_internal(); + + inline virtual std::string _impl_get_label() const { return "ComputeJ"; }; + + virtual std::string _impl_get_tex() const; + }; + +} // namespace shammodels::sph::modules diff --git a/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp b/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp index 8557ee1433..bd5e0ad4d0 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp @@ -105,7 +105,7 @@ namespace shammodels::sph { Component> old_dB_on_rho; Component> old_dpsi_on_ch; - Component> MagCurrentJ; + std::shared_ptr> MagCurrentJ; Component> old_dtepsilon; Component> old_dtdeltav; diff --git a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp index 0cd1bc5371..a810490b22 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp @@ -43,8 +43,6 @@ namespace shammodels::sph::modules { : context(context), solver_config(solver_config), storage(storage) {} void update_derivs(); - //template - void compute_J(Tscal mu_0); private: inline PatchScheduler &scheduler() { return shambase::get_check_ref(context.sched); } @@ -82,7 +80,6 @@ namespace shammodels::sph::modules { // Thin wrappers that unpack the variant and forward to the template above. void update_derivs_MHD(IdealMHD cfg); void update_derivs_MHD(NonIdealMHD cfg); - }; } // namespace shammodels::sph::modules diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 95e6eaa305..a100bde774 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -45,6 +45,7 @@ #include "shammodels/sph/math/q_ab.hpp" #include "shammodels/sph/modules/BuildTrees.hpp" #include "shammodels/sph/modules/ComputeEos.hpp" +#include "shammodels/sph/modules/ComputeJ.hpp" #include "shammodels/sph/modules/ComputeLoadBalanceValue.hpp" #include "shammodels/sph/modules/ComputeLuminosity.hpp" #include "shammodels/sph/modules/ComputeNeighStats.hpp" @@ -573,6 +574,9 @@ void shammodels::sph::Solver::init_solver_graph() { storage.omega = std::make_shared>(1, "omega", "\\Omega"); + storage.MagCurrentJ + = std::make_shared>(1, "MagCurrentJ", "\\mathbf{J}"); + if (solver_config.has_field_alphaAV()) { storage.alpha_av_updated = std::make_shared>( 1, "alpha_av_updated", "\\alpha_{\\rm AV}"); @@ -968,6 +972,7 @@ void shammodels::sph::Solver::sph_prestep(Tscal time_val, Tscal dt) PatchDataLayerLayout &pdl = scheduler().pdl_old(); const u32 ihpart = pdl.get_field_idx("hpart"); + const u32 iB_on_rho = pdl.get_field_idx("B/rho"); ComputeField _epsilon_h, _h_old; @@ -1181,6 +1186,15 @@ void shammodels::sph::Solver::sph_prestep(Tscal time_val, Tscal dt) }); hnew_edge->set_refs(hnew_refs); + std::shared_ptr> B_on_rho_edge + = std::make_shared>("", ""); + shamrock::solvergraph::DDPatchDataFieldRef B_on_rho_refs = {}; + scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { + auto &field = pdat.get_field(iB_on_rho); + B_on_rho_refs.add_obj(p.id_patch, std::ref(field)); + }); + B_on_rho_edge->set_refs(B_on_rho_refs); + modules::NodeComputeOmega compute_omega{solver_config.gpart_mass}; compute_omega.set_edges( storage.part_counts, @@ -1190,6 +1204,18 @@ void shammodels::sph::Solver::sph_prestep(Tscal time_val, Tscal dt) storage.omega); compute_omega.evaluate(); + Tscal const mu_0 = solver_config.get_constant_mu_0(); + modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0}; + computeJ.set_edges( + storage.part_counts, + storage.neigh_cache, + storage.positions_with_ghosts, + hnew_edge, + storage.omega, + B_on_rho_edge, + storage.MagCurrentJ); + computeJ.evaluate(); + if (solver_config.smoothing_length_config.is_density_based_neigh_lim()) { // if the h limiter is triggered, omega does not hold it's sense of dh/dr anymore // so we set it to 1, this effectively is equivalent of disabling the energy correction @@ -1621,15 +1647,6 @@ void shammodels::sph::Solver::update_derivs() { ext_forces.add_ext_forces(); } -template class Kern> -void shammodels::sph::Solver::compute_J() { - - modules::UpdateDerivs derivs(context, solver_config, storage); - Tscal const mu_0 = solver_config.get_constant_mu_0(); - derivs.compute_J(mu_0); - -} - template class Kern> bool shammodels::sph::Solver::apply_corrector(Tscal dt, u64 Npart_all) { return false; @@ -1693,7 +1710,6 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() bool do_NIMHD = solver_config.do_NIMHD(); - PatchDataLayerLayout &pdl = scheduler().pdl_old(); const u32 ixyz = pdl.get_field_idx("xyz"); @@ -1968,11 +1984,47 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() "a dt that is too large"); } + // communicate_merge_ghosts_fields(); + // modules::UpdateDerivs derivs(context, solver_config, storage); + // Tscal const mu_0 = solver_config.get_constant_mu_0(); + // derivs.compute_J(mu_0); + // reset_merge_ghosts_fields(); + communicate_merge_ghosts_fields(); - modules::UpdateDerivs derivs(context, solver_config, storage); + // Compute J using NodeComputeJ (needs up-to-date B/rho with ghosts) Tscal const mu_0 = solver_config.get_constant_mu_0(); - derivs.compute_J(mu_0); + modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0}; + + // Need to create B_on_rho_edge with ghost data + std::shared_ptr> B_on_rho_edge + = std::make_shared>("", ""); + shamrock::solvergraph::DDPatchDataFieldRef B_on_rho_refs = {}; + scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { + auto &field = pdat.get_field(iB_on_rho); + B_on_rho_refs.add_obj(p.id_patch, std::ref(field)); + }); + B_on_rho_edge->set_refs(B_on_rho_refs); + + // Need hnew_edge with current hpart values + std::shared_ptr> hnew_edge + = std::make_shared>("", ""); + shamrock::solvergraph::DDPatchDataFieldRef hnew_refs = {}; + scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { + auto &field = pdat.get_field(ihpart); + hnew_refs.add_obj(p.id_patch, std::ref(field)); + }); + hnew_edge->set_refs(hnew_refs); + + computeJ.set_edges( + storage.part_counts, + storage.neigh_cache, + storage.positions_with_ghosts, + hnew_edge, + storage.omega, + B_on_rho_edge, + storage.MagCurrentJ); + computeJ.evaluate(); reset_merge_ghosts_fields(); diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp new file mode 100644 index 0000000000..ae8f15e55f --- /dev/null +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -0,0 +1,113 @@ +// -------------------------------------------------------// +// +// SHAMROCK code for hydrodynamics +// Copyright (c) 2021-2026 Timothée David--Cléris +// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1 +// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information +// +// -------------------------------------------------------// + +/** + * @file ComputeJ.cpp + * @author Timothée David--Cléris (tim.shamrock@proton.me) + * @author Yona Lapeyre (yona.lapeyre@ens-lyon.fr) + * @brief + * + */ + +#include "shambase/stacktrace.hpp" +#include "shambackends/kernel_call_distrib.hpp" +#include "shammodels/sph/SPHUtilities.hpp" +#include "shammodels/sph/math/mhd.hpp" +#include "shammodels/sph/modules/ComputeJ.hpp" +#include "shamrock/scheduler/SchedulerUtility.hpp" +#include "shamrock/solvergraph/IFieldSpan.hpp" + +template class SPHKernel> +void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_internal() { + + __shamrock_stack_entry(); + + auto edges = get_edges(); + + auto dev_sched = shamsys::instance::get_compute_scheduler_ptr(); + + edges.J.ensure_sizes(edges.part_counts.indexes); + + sham::distributed_data_kernel_call( + dev_sched, + sham::DDMultiRef{ + edges.xyz.get_spans(), + edges.hpart.get_spans(), + edges.neigh_cache.neigh_cache, + edges.omega.get_spans(), + edges.B_on_rho.get_spans()}, + sham::DDMultiRef{edges.J.get_spans()}, + edges.part_counts.indexes, + [part_mass = this->part_mass, mu_0 = this->mu_0, Rkern = kernel_radius]( + u32 id_a, + const Tvec *r, + const Tscal *hpart, + const auto ploop_ptrs, + const Tscal *omega, + const Tvec *B_on_rho, + Tvec *J) { + shamrock::tree::ObjectCacheIterator particle_looper(ploop_ptrs); + + using namespace shamrock::sph; + using namespace shamrock::sph::mhd; + Tvec xyz_a = r[id_a]; // could be recovered from lambda + + Tscal h_a = hpart[id_a]; + Tscal dint = h_a * h_a * Rkern * Rkern; + + Tscal rho_a = rho_h(part_mass, h_a, SPHKernel::hfactd); + Tscal rho_a_sq = rho_a * rho_a; + + Tvec B_a = B_on_rho[id_a] * rho_a; + Tscal omega_a = omega[id_a]; + Tscal sub_fact_a = rho_a_sq * omega_a; + + Tscal part_omega_sum = 0; + Tvec J_sum{0, 0, 0}; + + constexpr Tscal Rker2 = SPHKernel::Rkern * SPHKernel::Rkern; + + particle_looper.for_each_object(id_a, [&](u32 id_b) { + Tvec dr = xyz_a - r[id_b]; + Tscal rab2 = sycl::dot(dr, dr); + Tscal h_b = hpart[id_b]; + + if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) { + return; + } + + Tscal rab = sycl::sqrt(rab2); + Tscal rho_b = rho_h(part_mass, h_b, SPHKernel::hfactd); + Tvec B_b = B_on_rho[id_b] * rho_b; + + Tscal Fab_a = SPHKernel::dW_3d(rab, h_a); + Tvec r_ab_unit = dr * sham::inv_sat_positive(rab); + Tvec nabla_Wab_ha = r_ab_unit * Fab_a; + + shamrock::sph::mhd::MagCurrentJ_sum( + part_mass, B_a, B_b, nabla_Wab_ha, sub_fact_a, mu_0, J_sum); + }); + + J[id_a] = J_sum; + }); +} + +template class SPHKernel> +std::string shammodels::sph::modules::NodeComputeJ::_impl_get_tex() const { + return "TODO"; +} + +using namespace shammath; +template class shammodels::sph::modules::NodeComputeJ; +template class shammodels::sph::modules::NodeComputeJ; +template class shammodels::sph::modules::NodeComputeJ; + +template class shammodels::sph::modules::NodeComputeJ; +template class shammodels::sph::modules::NodeComputeJ; +template class shammodels::sph::modules::NodeComputeJ; diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 921766c9a3..1772f1b6c9 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -738,125 +738,6 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_disc }); } -template class SPHKernel> -void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu_0) { - - // skip for ideal MHD - //if constexpr (MHD_mode == shamrock::sph::mhd::MHDType::Ideal) { - // return; - //} - - StackEntry stack_loc{}; - - using namespace shamrock; - using namespace shamrock::patch; - - shamrock::SchedulerUtility utility(scheduler()); - logger::raw_ln("############ intializing J ############"); - // storage.MagCurrentJ.set(utility.make_compute_field("MagCurrentJ", 1)); - - shamrock::patch::PatchDataLayerLayout &ghost_layout - = shambase::get_check_ref(storage.ghost_layout.get()); - u32 ihpart_interf = ghost_layout.get_field_idx("hpart"); - u32 iomega_interf = ghost_layout.get_field_idx("omega"); - u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); - - PatchDataLayerLayout &pdl = scheduler().pdl_old(); - u32 iJ = pdl.get_field_idx("J"); - - auto &merged_xyzh = storage.merged_xyzh.get(); - shambase::DistributedData &mpdats = storage.merged_patchdata_ghost.get(); - - scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { - PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); - - sham::DeviceBuffer &buf_xyz - = merged_xyzh.get(cur_p.id_patch).template get_field_buf_ref(0); - sham::DeviceBuffer &buf_hpart = mpdat.get_field_buf_ref(ihpart_interf); - sham::DeviceBuffer &buf_omega = mpdat.get_field_buf_ref(iomega_interf); - sham::DeviceBuffer &buf_B_on_rho = mpdat.get_field_buf_ref(iB_on_rho_interf); - - logger::raw_ln("############ get the buffer J ############"); - // sham::DeviceBuffer &buf_J = - // storage.MagCurrentJ.get().get_buf_check(cur_p.id_patch); - sham::DeviceBuffer &buf_J = pdat.get_field_buf_ref(iJ); - - tree::ObjectCache &pcache - = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); - - sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().get_queue(); - sham::EventList depends_list; - - auto xyz = buf_xyz.get_read_access(depends_list); - auto hpart = buf_hpart.get_read_access(depends_list); - auto omega = buf_omega.get_read_access(depends_list); - auto B_on_rho = buf_B_on_rho.get_read_access(depends_list); - auto J_out = buf_J.get_write_access(depends_list); - auto ploop_ptrs = pcache.get_read_access(depends_list); - - auto e = q.submit(depends_list, [&](sycl::handler &cgh) { - const Tscal pmass = solver_config.gpart_mass; - const Tscal _mu_0 = mu_0; - - tree::ObjectCacheIterator particle_looper(ploop_ptrs); - constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern; - - shambase::parallel_for(cgh, pdat.get_obj_cnt(), "compute J", [=](u64 gid) { - u32 id_a = (u32) gid; - - using namespace shamrock::sph; - - Tscal h_a = hpart[id_a]; - Tvec xyz_a = xyz[id_a]; - - Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); - Tscal rho_a_sq = rho_a * rho_a; - Tscal omega_a = omega[id_a]; - Tscal sub_fact_a = rho_a_sq * omega_a; - - Tvec B_a = B_on_rho[id_a] * rho_a; - - // Accumulate J_a = sum_b m_b / (rho_a^2 omega_a) - // * (B_a - B_b) x nabla_W(r_ab, h_a) / mu_0 - Tvec J_a{0, 0, 0}; - - particle_looper.for_each_object(id_a, [&](u32 id_b) { - Tvec dr = xyz_a - xyz[id_b]; - Tscal rab2 = sycl::dot(dr, dr); - Tscal h_b = hpart[id_b]; - - if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) { - return; - } - - Tscal rab = sycl::sqrt(rab2); - Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); - Tvec B_b = B_on_rho[id_b] * rho_b; - - Tscal Fab_a = Kernel::dW_3d(rab, h_a); - Tvec r_ab_unit = dr * sham::inv_sat_positive(rab); - Tvec nabla_Wab_ha = r_ab_unit * Fab_a; - - shamrock::sph::mhd::MagCurrentJ_sum( - pmass, B_a, B_b, nabla_Wab_ha, sub_fact_a, _mu_0, J_a); - }); - - J_out[id_a] = J_a; - }); - }); - - buf_xyz.complete_event_state(e); - buf_hpart.complete_event_state(e); - buf_omega.complete_event_state(e); - buf_B_on_rho.complete_event_state(e); - buf_J.complete_event_state(e); - - sham::EventList resulting_events; - resulting_events.add_event(e); - pcache.complete_event_state(resulting_events); - }); -} - template class SPHKernel> void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(IdealMHD cfg) { update_derivs_MHD_impl( @@ -927,7 +808,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ // Pre-compute J for all particles logger::raw_ln("@@@@@@@@@@@ before compute J @@@@@@@@@@@"); - //compute_J(mu_0); + // compute_J(mu_0); scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); From 452bbcff05c74bb99565dd6a7a69e7cfd982f46e Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Mon, 15 Jun 2026 19:19:18 +0200 Subject: [PATCH 14/54] correct ghost communication --- src/shammodels/sph/src/Solver.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index a100bde774..53c11fac92 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1439,8 +1439,11 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { if (has_B_field) { sender_patch.get_field(iB_on_rho).append_subset_to( buf_idx, cnt, pdat.get_field(iB_interf)); - sender_patch.get_field(iJ).append_subset_to( - buf_idx, cnt, pdat.get_field(iJ_interf)); + // sender_patch.get_field(iJ).append_subset_to( + // buf_idx, cnt, pdat.get_field(iJ_interf)); + shambase::get_check_ref(storage.MagCurrentJ) + .get(sender) + .append_subset_to(buf_idx, cnt, pdat.get_field(iJ_interf)); } if (has_psi_field) { @@ -1523,7 +1526,9 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { if (has_B_field) { pdat_new.get_field(iB_interf).insert(pdat.get_field(iB_on_rho)); - pdat_new.get_field(iJ_interf).insert(pdat.get_field(iJ)); + // pdat_new.get_field(iJ_interf).insert(pdat.get_field(iJ)); + pdat_new.get_field(iJ_interf).insert( + shambase::get_check_ref(storage.MagCurrentJ).get(p.id_patch)); } if (has_psi_field) { From b23163898a08a90aa6fff3dcc211abc99da284d8 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Mon, 15 Jun 2026 22:19:02 +0200 Subject: [PATCH 15/54] why is everything a nan --- src/shammodels/sph/include/shammodels/sph/math/mhd.hpp | 8 ++++---- src/shammodels/sph/src/modules/ComputeJ.cpp | 9 +++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index aeaf7b971d..06e5b2c91d 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -34,16 +34,16 @@ namespace shamrock::sph::mhd { enum MHDType { Ideal = 0, NonIdeal = 1 }; template - inline void MagCurrentJ_sum( - Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0, Tvec J_a) { + inline Tvec MagCurrentJ_sum( + Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0) { - J_a += m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha) / mu_0; + return m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha) / mu_0; } template inline Tvec WursterD(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD) { - Tvec Bhat = B / sham::inv_sat_zero(sycl::length(B)); + Tvec Bhat = B * sham::inv_sat_zero(sycl::length(B)); Tvec D = etaO * J + etaH * sycl::cross(J, Bhat) + etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index ae8f15e55f..eb09827991 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -90,11 +90,16 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int Tvec r_ab_unit = dr * sham::inv_sat_positive(rab); Tvec nabla_Wab_ha = r_ab_unit * Fab_a; - shamrock::sph::mhd::MagCurrentJ_sum( - part_mass, B_a, B_b, nabla_Wab_ha, sub_fact_a, mu_0, J_sum); + logger::raw_ln("@@@@@@ mu_0", mu_0); + logger::raw_ln("@@@@@@ Ba", B_a); + logger::raw_ln("@@@@@@ Bb", B_b); + logger::raw_ln("@@@@@@ nabla_Wab_ha", nabla_Wab_ha); + J_sum += shamrock::sph::mhd::MagCurrentJ_sum( + part_mass, B_a, B_b, nabla_Wab_ha, sub_fact_a, mu_0); }); J[id_a] = J_sum; + logger::raw_ln("@@@@@@@@@@@@@@@@@@@ J a", J_sum); }); } From 2aec96beaed78fd28a78818826db285fd60ed899 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Wed, 17 Jun 2026 01:31:40 +0200 Subject: [PATCH 16/54] mismatch in obj_cnt in communicate_merge_ghost_fields --- .../sph/include/shammodels/sph/Solver.hpp | 3 + .../sph/include/shammodels/sph/math/mhd.hpp | 7 + .../shammodels/sph/modules/SolverStorage.hpp | 2 + src/shammodels/sph/src/Solver.cpp | 226 ++++++++++++------ src/shammodels/sph/src/modules/ComputeJ.cpp | 15 +- 5 files changed, 170 insertions(+), 83 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/Solver.hpp b/src/shammodels/sph/include/shammodels/sph/Solver.hpp index a4e027ebbb..b1a14145f8 100644 --- a/src/shammodels/sph/include/shammodels/sph/Solver.hpp +++ b/src/shammodels/sph/include/shammodels/sph/Solver.hpp @@ -177,6 +177,9 @@ namespace shammodels::sph { /// @brief Updates artificial viscosity coefficients for shock capturing void update_artificial_viscosity(Tscal dt); + /// @brief Updates artificial viscosity coefficients for shock capturing + void update_J(); + /// @brief Initializes data layout for ghost particle fields void init_ghost_layout(); diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 06e5b2c91d..6929565c85 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -43,7 +43,10 @@ namespace shamrock::sph::mhd { template inline Tvec WursterD(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD) { + Tvec Bhat = B * sham::inv_sat_zero(sycl::length(B)); + //logger::raw_ln("#### Bhat", Bhat); + //logger::raw_ln("#### J", J); Tvec D = etaO * J + etaH * sycl::cross(J, Bhat) + etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); @@ -73,6 +76,10 @@ namespace shamrock::sph::mhd { Tscal sub_fact_a = rho_a_sq * omega_a; Tscal sub_fact_b = rho_b_sq * omega_b; + //logger::raw_ln("####### Da", D_a); + //logger::raw_ln("####### Db", D_b); + + Tvec acc_a = sham::inv_sat_zero(sub_fact_a) * (sycl::cross(D_a, nabla_Wab_ha)); Tvec acc_b = sham::inv_sat_zero(sub_fact_b) * (sycl::cross(D_b, nabla_Wab_hb)); return -m_b * (acc_a + acc_b); diff --git a/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp b/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp index bd5e0ad4d0..b57dedf8c2 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/SolverStorage.hpp @@ -105,7 +105,9 @@ namespace shammodels::sph { Component> old_dB_on_rho; Component> old_dpsi_on_ch; + Component>> MagCurrentJ_ghost; std::shared_ptr> MagCurrentJ; + std::shared_ptr> exchange_gz_J; Component> old_dtepsilon; Component> old_dtdeltav; diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 53c11fac92..4396f514b0 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -45,11 +45,11 @@ #include "shammodels/sph/math/q_ab.hpp" #include "shammodels/sph/modules/BuildTrees.hpp" #include "shammodels/sph/modules/ComputeEos.hpp" -#include "shammodels/sph/modules/ComputeJ.hpp" #include "shammodels/sph/modules/ComputeLoadBalanceValue.hpp" #include "shammodels/sph/modules/ComputeLuminosity.hpp" #include "shammodels/sph/modules/ComputeNeighStats.hpp" #include "shammodels/sph/modules/ComputeOmega.hpp" +#include "shammodels/sph/modules/ComputeJ.hpp" #include "shammodels/sph/modules/ConservativeCheck.hpp" #include "shammodels/sph/modules/DiffOperator.hpp" #include "shammodels/sph/modules/DiffOperatorDtDivv.hpp" @@ -574,8 +574,7 @@ void shammodels::sph::Solver::init_solver_graph() { storage.omega = std::make_shared>(1, "omega", "\\Omega"); - storage.MagCurrentJ - = std::make_shared>(1, "MagCurrentJ", "\\mathbf{J}"); + //torage.MagCurrentJ = std::make_shared>(1, "MagCurrentJ", "\\mathbf{J}"); if (solver_config.has_field_alphaAV()) { storage.alpha_av_updated = std::make_shared>( @@ -592,6 +591,8 @@ void shammodels::sph::Solver::init_solver_graph() { = std::make_shared(storage.ghost_layout); storage.exchange_gz_positions = std::make_shared(storage.xyzh_ghost_layout); + storage.exchange_gz_J + = std::make_shared>(); } template class Kern> @@ -1186,14 +1187,6 @@ void shammodels::sph::Solver::sph_prestep(Tscal time_val, Tscal dt) }); hnew_edge->set_refs(hnew_refs); - std::shared_ptr> B_on_rho_edge - = std::make_shared>("", ""); - shamrock::solvergraph::DDPatchDataFieldRef B_on_rho_refs = {}; - scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { - auto &field = pdat.get_field(iB_on_rho); - B_on_rho_refs.add_obj(p.id_patch, std::ref(field)); - }); - B_on_rho_edge->set_refs(B_on_rho_refs); modules::NodeComputeOmega compute_omega{solver_config.gpart_mass}; compute_omega.set_edges( @@ -1204,17 +1197,6 @@ void shammodels::sph::Solver::sph_prestep(Tscal time_val, Tscal dt) storage.omega); compute_omega.evaluate(); - Tscal const mu_0 = solver_config.get_constant_mu_0(); - modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0}; - computeJ.set_edges( - storage.part_counts, - storage.neigh_cache, - storage.positions_with_ghosts, - hnew_edge, - storage.omega, - B_on_rho_edge, - storage.MagCurrentJ); - computeJ.evaluate(); if (solver_config.smoothing_length_config.is_density_based_neigh_lim()) { // if the h limiter is triggered, omega does not hold it's sense of dh/dr anymore @@ -1347,7 +1329,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { const u32 iB_on_rho = (has_B_field) ? pdl.get_field_idx("B/rho") : 0; const u32 idB_on_rho = (has_B_field) ? pdl.get_field_idx("dB/rho") : 0; - const u32 iJ = (has_B_field) ? pdl.get_field_idx("J") : 0; const u32 ipsi_on_ch = (has_psi_field) ? pdl.get_field_idx("psi/ch") : 0; const u32 idpsi_on_ch = (has_psi_field) ? pdl.get_field_idx("dpsi/ch") : 0; const u32 icurlB = (has_curlB_field) ? pdl.get_field_idx("curlB") : 0; @@ -1372,7 +1353,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { u32 iuint_interf = ghost_layout.get_field_idx("uint"); u32 ivxyz_interf = ghost_layout.get_field_idx("vxyz"); u32 iomega_interf = ghost_layout.get_field_idx("omega"); - u32 iJ_interf = ghost_layout.get_field_idx("J"); const u32 iaxyz_interf = (solver_config.has_axyz_in_ghost()) ? ghost_layout.get_field_idx("axyz") : 0; @@ -1439,11 +1419,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { if (has_B_field) { sender_patch.get_field(iB_on_rho).append_subset_to( buf_idx, cnt, pdat.get_field(iB_interf)); - // sender_patch.get_field(iJ).append_subset_to( - // buf_idx, cnt, pdat.get_field(iJ_interf)); - shambase::get_check_ref(storage.MagCurrentJ) - .get(sender) - .append_subset_to(buf_idx, cnt, pdat.get_field(iJ_interf)); } if (has_psi_field) { @@ -1526,9 +1501,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { if (has_B_field) { pdat_new.get_field(iB_interf).insert(pdat.get_field(iB_on_rho)); - // pdat_new.get_field(iJ_interf).insert(pdat.get_field(iJ)); - pdat_new.get_field(iJ_interf).insert( - shambase::get_check_ref(storage.MagCurrentJ).get(p.id_patch)); } if (has_psi_field) { @@ -1581,6 +1553,40 @@ void shammodels::sph::Solver::update_artificial_viscosity(Tscal dt) .update_artificial_viscosity(dt); } +template class Kern> +void shammodels::sph::Solver::update_J() { + + using namespace shamrock::patch; + PatchDataLayerLayout &pdl = scheduler().pdl_old(); + + const u32 iB_on_rho = pdl.get_field_idx("B/rho"); + std::shared_ptr> B_on_rho_edge + = std::make_shared>("", ""); + + shamrock::solvergraph::DDPatchDataFieldRef B_on_rho_refs = {}; + scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { + auto &field = pdat.get_field(iB_on_rho); + B_on_rho_refs.add_obj(p.id_patch, std::ref(field)); + }); + + B_on_rho_edge->set_refs(B_on_rho_refs); + + Tscal const mu_0 = solver_config.get_constant_mu_0(); + + modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0}; + computeJ.set_edges( + storage.part_counts, + storage.neigh_cache, + storage.positions_with_ghosts, + storage.hpart_with_ghosts, + storage.omega, + B_on_rho_edge, + storage.MagCurrentJ); + + computeJ.evaluate(); + +} + //////////////////////////////////////////////////////////////////////////////////////////////////// // end artificial viscosity section //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1652,6 +1658,7 @@ void shammodels::sph::Solver::update_derivs() { ext_forces.add_ext_forces(); } + template class Kern> bool shammodels::sph::Solver::apply_corrector(Tscal dt, u64 Npart_all) { return false; @@ -1989,52 +1996,8 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() "a dt that is too large"); } - // communicate_merge_ghosts_fields(); - // modules::UpdateDerivs derivs(context, solver_config, storage); - // Tscal const mu_0 = solver_config.get_constant_mu_0(); - // derivs.compute_J(mu_0); - // reset_merge_ghosts_fields(); - - communicate_merge_ghosts_fields(); - - // Compute J using NodeComputeJ (needs up-to-date B/rho with ghosts) - Tscal const mu_0 = solver_config.get_constant_mu_0(); - modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0}; - - // Need to create B_on_rho_edge with ghost data - std::shared_ptr> B_on_rho_edge - = std::make_shared>("", ""); - shamrock::solvergraph::DDPatchDataFieldRef B_on_rho_refs = {}; - scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { - auto &field = pdat.get_field(iB_on_rho); - B_on_rho_refs.add_obj(p.id_patch, std::ref(field)); - }); - B_on_rho_edge->set_refs(B_on_rho_refs); - - // Need hnew_edge with current hpart values - std::shared_ptr> hnew_edge - = std::make_shared>("", ""); - shamrock::solvergraph::DDPatchDataFieldRef hnew_refs = {}; - scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { - auto &field = pdat.get_field(ihpart); - hnew_refs.add_obj(p.id_patch, std::ref(field)); - }); - hnew_edge->set_refs(hnew_refs); - - computeJ.set_edges( - storage.part_counts, - storage.neigh_cache, - storage.positions_with_ghosts, - hnew_edge, - storage.omega, - B_on_rho_edge, - storage.MagCurrentJ); - computeJ.evaluate(); - - reset_merge_ghosts_fields(); - // communicate fields - communicate_merge_ghosts_fields(); + communicate_merge_ghosts_fields(); //problem: communicate before computing J if (solver_config.has_field_alphaAV()) { @@ -2052,6 +2015,22 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() node_copy.evaluate(); } +// if (do_NIMHD){ +// +// std::shared_ptr patchdatas +// = std::make_shared( +// "patchdata_layer_ref", "patchdata_layer_ref"); +// +// auto node_set_edge = scheduler().get_node_set_edge_patchdata_layer_refs(); +// node_set_edge->set_edges(patchdatas); +// node_set_edge->evaluate(); +// +// shamrock::solvergraph::CopyPatchDataFieldFromLayer node_copy( +// scheduler().get_layout_ptr_old(), "J"); +// node_copy.set_edges(patchdatas, storage.MagCurrentJ); +// node_copy.evaluate(); +// } + if (solver_config.has_field_dtdivv()) { if (solver_config.combined_dtdiv_divcurlv_compute) { @@ -2099,7 +2078,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() // .update_curlB(); // } update_artificial_viscosity(dt); - + if (solver_config.has_field_alphaAV()) { shamrock::solvergraph::Field &comp_field_send @@ -2145,6 +2124,62 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() storage.alpha_av_ghost.set(std::move(merged_field)); } + if(do_NIMHD){ + + // communicate needed fields (B,b, hb): done just before + + // compute J field + logger::raw_ln("@@@@@ before update J"); + update_J(); + logger::raw_ln("@@@@@ after update J"); + + + // communicate J field + shamrock::solvergraph::Field &comp_field_send + = shambase::get_check_ref(storage.MagCurrentJ); + + using InterfaceBuildInfos = + typename sph::BasicSPHGhostHandler::InterfaceBuildInfos; + + shambase::Timer time_interf; + time_interf.start(); + + auto field_interf = ghost_handle.template build_interface_native>( + storage.ghost_patch_cache.get(), + [&](u64 sender, + u64 /*receiver*/, + InterfaceBuildInfos binfo, + sham::DeviceBuffer &buf_idx, + u32 cnt) -> PatchDataField { + PatchDataField &sender_field = comp_field_send.get_field(sender); + + return sender_field.make_new_from_subset(buf_idx, cnt); + }); + + shambase::DistributedDataShared> interf_pdat + = ghost_handle.communicate_pdatfield( + std::move(field_interf), 1, storage.exchange_gz_J); + + shambase::DistributedData> merged_field + = ghost_handle.template merge_native, PatchDataField>( + std::move(interf_pdat), + [&](const shamrock::patch::Patch p, shamrock::patch::PatchDataLayer &pdat) { + PatchDataField &receiver_field + = comp_field_send.get_field(p.id_patch); + return receiver_field.duplicate(); + }, + [](PatchDataField &mpdat, PatchDataField &pdat_interf) { + mpdat.insert(pdat_interf); + }); + + time_interf.stop(); + storage.timings_details.interface += time_interf.elapsed_sec(); + + // we get J with ghosts ! + storage.MagCurrentJ_ghost.set(std::move(merged_field)); + + } + // compute pressure compute_eos_fields(); @@ -2420,6 +2455,37 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() }); } + if (do_NIMHD) { + + const u32 iJ = pdl.get_field_idx("J"); + shamrock::solvergraph::Field &MagCurrentJ + = shambase::get_check_ref(storage.MagCurrentJ); + + scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { + sham::DeviceBuffer &buf_J + = pdat.get_field(iJ).get_buf(); + + sham::DeviceBuffer &buf_MagCurrentJ + = MagCurrentJ.get_field(cur_p.id_patch).get_buf(); + + auto &q = shamsys::instance::get_compute_scheduler().get_queue(); + sham::EventList depends_list; + + auto J = buf_J.get_write_access(depends_list); + auto MagCurrentJ = buf_MagCurrentJ.get_read_access(depends_list); + + auto e = q.submit(depends_list, [&](sycl::handler &cgh) { + shambase::parallel_for( + cgh, pdat.get_obj_cnt(), "write back J", [=](i32 id_a) { + J[id_a] = MagCurrentJ[id_a]; + }); + }); + + buf_J.complete_event_state(e); + buf_MagCurrentJ.complete_event_state(e); + }); + } + shamlog_debug_ln("BasicGas", "computing next CFL"); ComputeField vsig_max_dt = utility.make_compute_field("vsig_a", 1); @@ -2808,6 +2874,10 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() storage.alpha_av_ghost.reset(); } + if (do_NIMHD) { + storage.MagCurrentJ_ghost.reset(); + } + } while (need_rerun_corrector); reset_merge_ghosts_fields(); diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index eb09827991..82b1fae854 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -84,22 +84,27 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int Tscal rab = sycl::sqrt(rab2); Tscal rho_b = rho_h(part_mass, h_b, SPHKernel::hfactd); + if (h_b == 0) { + logger::raw_ln("@@@@@@ h_b", h_b); + logger::raw_ln("idb", id_b); + logger::raw_ln("@@@@@@ xyz_b", r[id_b]); + } Tvec B_b = B_on_rho[id_b] * rho_b; Tscal Fab_a = SPHKernel::dW_3d(rab, h_a); Tvec r_ab_unit = dr * sham::inv_sat_positive(rab); Tvec nabla_Wab_ha = r_ab_unit * Fab_a; - logger::raw_ln("@@@@@@ mu_0", mu_0); - logger::raw_ln("@@@@@@ Ba", B_a); - logger::raw_ln("@@@@@@ Bb", B_b); - logger::raw_ln("@@@@@@ nabla_Wab_ha", nabla_Wab_ha); + //logger::raw_ln("@@@@@@ mu_0", mu_0); + //logger::raw_ln("@@@@@@ Ba", B_a); + //logger::raw_ln("@@@@@@ Bb", B_b); + //logger::raw_ln("@@@@@@ nabla_Wab_ha", nabla_Wab_ha); J_sum += shamrock::sph::mhd::MagCurrentJ_sum( part_mass, B_a, B_b, nabla_Wab_ha, sub_fact_a, mu_0); }); J[id_a] = J_sum; - logger::raw_ln("@@@@@@@@@@@@@@@@@@@ J a", J_sum); + //logger::raw_ln("@@@@@@@@@@@@@@@@@@@ J a", J_sum); }); } From 30f5b05d1d5bf0953e23b824ef8c2537b509bf25 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Wed, 17 Jun 2026 10:38:32 +0200 Subject: [PATCH 17/54] fixed communication, now empty (?) field problem --- src/shammodels/sph/src/Solver.cpp | 41 +++++++++++-------- src/shammodels/sph/src/SolverConfig.cpp | 1 - src/shammodels/sph/src/modules/ComputeJ.cpp | 7 +++- .../include/shamrock/patch/PatchDataLayer.hpp | 4 ++ 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 4396f514b0..f9da931323 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -574,7 +574,7 @@ void shammodels::sph::Solver::init_solver_graph() { storage.omega = std::make_shared>(1, "omega", "\\Omega"); - //torage.MagCurrentJ = std::make_shared>(1, "MagCurrentJ", "\\mathbf{J}"); + storage.MagCurrentJ = std::make_shared>(1, "MagCurrentJ", "\\mathbf{J}"); if (solver_config.has_field_alphaAV()) { storage.alpha_av_updated = std::make_shared>( @@ -1559,6 +1559,7 @@ void shammodels::sph::Solver::update_J() { using namespace shamrock::patch; PatchDataLayerLayout &pdl = scheduler().pdl_old(); + logger::raw_ln("loading B"); const u32 iB_on_rho = pdl.get_field_idx("B/rho"); std::shared_ptr> B_on_rho_edge = std::make_shared>("", ""); @@ -1570,9 +1571,16 @@ void shammodels::sph::Solver::update_J() { }); B_on_rho_edge->set_refs(B_on_rho_refs); + logger::raw_ln("loaded B"); Tscal const mu_0 = solver_config.get_constant_mu_0(); + + shambase::get_check_ref(storage.hpart_with_ghosts); + logger::raw_ln(" hpart_with_ghosts is OK"); + shambase::get_check_ref(storage.MagCurrentJ); + logger::raw_ln(" MagCurrentJ is OK"); + // use MagCurrenJ: on active particles (no gz) modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0}; computeJ.set_edges( storage.part_counts, @@ -2015,21 +2023,21 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() node_copy.evaluate(); } -// if (do_NIMHD){ -// -// std::shared_ptr patchdatas -// = std::make_shared( -// "patchdata_layer_ref", "patchdata_layer_ref"); -// -// auto node_set_edge = scheduler().get_node_set_edge_patchdata_layer_refs(); -// node_set_edge->set_edges(patchdatas); -// node_set_edge->evaluate(); -// -// shamrock::solvergraph::CopyPatchDataFieldFromLayer node_copy( -// scheduler().get_layout_ptr_old(), "J"); -// node_copy.set_edges(patchdatas, storage.MagCurrentJ); -// node_copy.evaluate(); -// } + if (do_NIMHD){ + // copy J from sched patch data to storage.MagCurrentJ + std::shared_ptr patchdatas + = std::make_shared( + "patchdata_layer_ref", "patchdata_layer_ref"); + + auto node_set_edge = scheduler().get_node_set_edge_patchdata_layer_refs(); + node_set_edge->set_edges(patchdatas); + node_set_edge->evaluate(); + + shamrock::solvergraph::CopyPatchDataFieldFromLayer node_copy( + scheduler().get_layout_ptr_old(), "J"); + node_copy.set_edges(patchdatas, storage.MagCurrentJ); + node_copy.evaluate(); + } if (solver_config.has_field_dtdivv()) { @@ -2130,6 +2138,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() // compute J field logger::raw_ln("@@@@@ before update J"); + //logger::raw_ln("MagCurrentJ size after copy-in = ", storage.MagCurrentJ.size()); update_J(); logger::raw_ln("@@@@@ after update J"); diff --git a/src/shammodels/sph/src/SolverConfig.cpp b/src/shammodels/sph/src/SolverConfig.cpp index bdf60344ef..2fdcf18d70 100644 --- a/src/shammodels/sph/src/SolverConfig.cpp +++ b/src/shammodels/sph/src/SolverConfig.cpp @@ -139,7 +139,6 @@ namespace shammodels::sph { if (has_field_B_on_rho()) { ghost_layout.add_field("B/rho", 1); - ghost_layout.add_field("J", 1); // @@@ only for ni mhd } if (has_field_psi_on_ch()) { diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index 82b1fae854..8500dcc3dc 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -27,12 +27,13 @@ template class SPHKernel> void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_internal() { __shamrock_stack_entry(); - + logger::raw_ln("xinside compute J"); auto edges = get_edges(); auto dev_sched = shamsys::instance::get_compute_scheduler_ptr(); - + logger::raw_ln("before ensure size"); edges.J.ensure_sizes(edges.part_counts.indexes); + logger::raw_ln("after ensure size"); sham::distributed_data_kernel_call( dev_sched, @@ -56,6 +57,8 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int using namespace shamrock::sph; using namespace shamrock::sph::mhd; + + Tvec xyz_a = r[id_a]; // could be recovered from lambda Tscal h_a = hpart[id_a]; diff --git a/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp b/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp index d0af94a455..b2d79c4b4c 100644 --- a/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp +++ b/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp @@ -365,8 +365,12 @@ namespace shamrock::patch { */ inline void check_field_obj_cnt_match() { u32 cnt = get_obj_cnt(); + logger::raw_ln("obj count 333333", cnt); for (auto &field_var : fields) { field_var.visit([&](auto &field) { + + logger::raw_ln("obj count field", field.get_obj_cnt()); + logger::raw_ln("222222 field name", field.get_name()); if (field.get_obj_cnt() != cnt) { throw shambase::make_except_with_loc( "mismatch in obj cnt"); From a9bd33254fefa17496549e8042d1d7aa86eab03c Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 18 Jun 2026 22:58:02 +0200 Subject: [PATCH 18/54] remove logs --- src/shamrock/include/shamrock/patch/PatchDataLayer.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp b/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp index b2d79c4b4c..69d549eb22 100644 --- a/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp +++ b/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp @@ -365,12 +365,9 @@ namespace shamrock::patch { */ inline void check_field_obj_cnt_match() { u32 cnt = get_obj_cnt(); - logger::raw_ln("obj count 333333", cnt); for (auto &field_var : fields) { field_var.visit([&](auto &field) { - logger::raw_ln("obj count field", field.get_obj_cnt()); - logger::raw_ln("222222 field name", field.get_name()); if (field.get_obj_cnt() != cnt) { throw shambase::make_except_with_loc( "mismatch in obj cnt"); From 140d56f451d03afbe15548bb46c5bce0cd508d6b Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 18 Jun 2026 22:58:36 +0200 Subject: [PATCH 19/54] fix J handling (independant com) --- .../sph/src/modules/UpdateDerivs.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 1772f1b6c9..1e410b94cc 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -800,7 +800,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ u32 ipsi_on_ch_interf = ghost_layout.get_field_idx("psi/ch"); logger::raw_ln("@@@@@@@@@@@ before getting J @@@@@@@@@@@"); - u32 iJ_interf = ghost_layout.get_field_idx("J"); + //u32 iJ_interf = ghost_layout.get_field_idx("J"); auto &merged_xyzh = storage.merged_xyzh.get(); shamrock::solvergraph::Field &omega = shambase::get_check_ref(storage.omega); @@ -839,7 +839,11 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ // storage.MagCurrentJ.get().get_buf_check(cur_p.id_patch); // @@@ needs to be communicated // in ghosts !!) - sham::DeviceBuffer &buf_J = mpdat.get_field_buf_ref(iJ_interf); + //sham::DeviceBuffer &buf_J = mpdat.get_field_buf_ref(iJ_interf); + + // @@@ how to create an empty buffer + bool do_NIMHD = solver_config.do_NIMHD(); + sham::DeviceBuffer &buf_J = (do_NIMHD) ? storage.MagCurrentJ_ghost.get().get(cur_p.id_patch).get_buf(): pdat.get_field_buf_ref(idB_on_rho); tree::ObjectCache &pcache = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); @@ -861,7 +865,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ auto dB_on_rho = buf_dB_on_rho.get_write_access(depends_list); auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list); auto drho_dt = buf_drho_dt.get_write_access(depends_list); - auto J_field = buf_J.get_read_access(depends_list); + auto J_field = (do_NIMHD) ? buf_J.get_read_access(depends_list): nullptr; Tvec *mag_pressure = (do_MHD_debug) @@ -916,6 +920,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ tree::ObjectCacheIterator particle_looper(ploop_ptrs); constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern; + logger::raw_ln("before parralel for"); shambase::parallel_for(cgh, pdat.get_obj_cnt(), "compute MHD", [=](u64 gid) { u32 id_a = (u32) gid; @@ -929,7 +934,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal omega_a = omega[id_a]; Tscal u_a = u[id_a]; - Tvec J_a = J_field[id_a]; + Tvec J_a = (do_NIMHD) ? J_field[id_a]:Tvec{0, 0, 0}; Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); Tscal rho_a_sq = rho_a * rho_a; @@ -973,7 +978,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal cs_b = cs[id_b]; Tscal rab = sycl::sqrt(rab2); - Tvec J_b = J_field[id_b]; + Tvec J_b = (do_NIMHD) ? J_field[id_b]:Tvec{0, 0, 0}; Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); Tvec B_b = B_on_rho[id_b] * rho_b; @@ -1067,7 +1072,9 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ buf_dB_on_rho.complete_event_state(e); buf_dpsi_on_ch.complete_event_state(e); buf_drho_dt.complete_event_state(e); - buf_J.complete_event_state(e); + + if (do_NIMHD){ + buf_J.complete_event_state(e);} if (do_MHD_debug) { pdat.get_field_buf_ref(imag_pressure).complete_event_state(e); From 4ef2daf1ba7dd62241bc03a242084f1abcabaa41 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 18 Jun 2026 22:58:50 +0200 Subject: [PATCH 20/54] fix subfact --- src/shammodels/sph/src/modules/ComputeJ.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index 8500dcc3dc..c6e04c6723 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -69,7 +69,7 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int Tvec B_a = B_on_rho[id_a] * rho_a; Tscal omega_a = omega[id_a]; - Tscal sub_fact_a = rho_a_sq * omega_a; + Tscal sub_fact_a = rho_a * omega_a; Tscal part_omega_sum = 0; Tvec J_sum{0, 0, 0}; From b01a705e388fbb47e145fe48941eff903fe2741a Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 18 Jun 2026 22:59:59 +0200 Subject: [PATCH 21/54] fix dt_AD and J comm --- src/shammodels/sph/src/Solver.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index f9da931323..9848279f9d 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -2005,7 +2005,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() } // communicate fields - communicate_merge_ghosts_fields(); //problem: communicate before computing J + communicate_merge_ghosts_fields(); // is hpart_with_ghosts populated ? if (solver_config.has_field_alphaAV()) { @@ -2136,6 +2136,14 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() // communicate needed fields (B,b, hb): done just before + shambase::get_check_ref(storage.hpart_with_ghosts) + .set_refs(storage.merged_xyzh.get() + .template map>>( + [&](u64 id, shamrock::patch::PatchDataLayer &mpdat) { + return std::ref(mpdat.get_field( + 1)); // hpart is at index 1 in merged_xyzh + })); + // compute J field logger::raw_ln("@@@@@ before update J"); //logger::raw_ln("MagCurrentJ size after copy-in = ", storage.MagCurrentJ.size()); @@ -2741,8 +2749,9 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() cgh.parallel_for( sycl::range<1>{pdat.get_obj_cnt()}, [=](sycl::item<1> item) { Tscal h_a = hpart[item]; - - Tscal dt_AD = (etaAD > 0) ? (h_a * h_a / etaAD) + Tscal pi = shambase::constants::pi; + Tscal Ch_diff = 1. / (2 * pi); + Tscal dt_AD = (etaAD > 0) ? (Ch_diff * h_a * h_a / etaAD) : shambase::get_infty(); cfl_dt[item] = sycl::min(cfl_dt[item], dt_AD); From bf3c10112d13b032e63444389bc5ebddd32baec4 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 19 Jun 2026 14:58:10 +0200 Subject: [PATCH 22/54] fixed memory issue --- .../sph/include/shammodels/sph/math/mhd.hpp | 126 ++++++++++++++---- .../shammodels/sph/modules/ComputeJ.hpp | 3 +- src/shammodels/sph/src/Solver.cpp | 10 +- src/shammodels/sph/src/modules/ComputeJ.cpp | 48 ++++--- 4 files changed, 145 insertions(+), 42 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 6929565c85..fd3bf7df5d 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -36,8 +36,9 @@ namespace shamrock::sph::mhd { template inline Tvec MagCurrentJ_sum( Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0) { - + // ajout 4pi /c return m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha) / mu_0; + //return {0., 0., 0.}; } template @@ -48,17 +49,24 @@ namespace shamrock::sph::mhd { //logger::raw_ln("#### Bhat", Bhat); //logger::raw_ln("#### J", J); Tvec D = etaO * J + etaH * sycl::cross(J, Bhat) - + etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); + - etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); return D; } template - inline Tscal u_NI_heating(Tvec D, Tvec J, Tscal rho) { + inline Tscal u_NI_heating(Tvec B, Tvec J, Tscal rho, Tscal etaO, Tscal etaAD) { + + //return sycl::dot(D, J) * sham::inv_sat_zero(rho); + Tscal BdB = sycl::dot(B, B); + Tscal JdJ = sycl::dot(J, J); + Tscal BdJ = sycl::dot(B, J); + Tscal BdJBdJhat = sham::inv_sat_zero(BdB) * BdJ * BdJ; - return -sycl::dot(D, J) * sham::inv_sat_zero(rho); + return (etaO * JdJ + etaAD * (JdJ - BdJBdJhat)) * sham::inv_sat_zero(rho); } + template inline Tvec B_NI_terms( Tvec D_a, @@ -79,10 +87,47 @@ namespace shamrock::sph::mhd { //logger::raw_ln("####### Da", D_a); //logger::raw_ln("####### Db", D_b); + logger::raw_ln("#### Da", D_a); + logger::raw_ln("#### Db", D_b); + Tvec acc_a = sham::inv_sat_zero(sub_fact_a) * (sycl::cross(D_a, nabla_Wab_ha)); Tvec acc_b = sham::inv_sat_zero(sub_fact_b) * (sycl::cross(D_b, nabla_Wab_hb)); - return -m_b * (acc_a + acc_b); + return m_b * (acc_a + acc_b); + } + + template + inline Tvec B_NI_AD( + Tscal eta_AD, + Tvec J_a, + Tvec J_b, + Tscal m_b, + Tscal rho_a_sq, + Tscal rho_b_sq, + Tvec B_a, + Tvec B_b, + Tscal omega_a, + Tscal omega_b, + Tvec nabla_Wab_ha, + Tvec nabla_Wab_hb) { + + Tscal sub_fact_a = rho_a_sq * omega_a; + Tscal sub_fact_b = rho_b_sq * omega_b; + + //logger::raw_ln("####### Da", D_a); + //logger::raw_ln("####### Db", D_b); + + Tvec Bhat_a = B_a * sham::inv_sat_zero(sycl::length(B_a)); + Tvec Bhat_b = B_b * sham::inv_sat_zero(sycl::length(B_b)); + Tvec JcB_a = sycl::cross(J_a, Bhat_a); + Tvec JcB_b = sycl::cross(J_b, Bhat_b); + + Tvec JcBcB_a = sycl::cross(JcB_a, Bhat_a); + Tvec JcBcB_b = sycl::cross(JcB_b, Bhat_b); + + Tvec acc_a = sham::inv_sat_zero(sub_fact_a) * eta_AD * sycl::cross(JcBcB_a, nabla_Wab_ha); + Tvec acc_b = sham::inv_sat_zero(sub_fact_b) * eta_AD * sycl::cross(JcBcB_b, nabla_Wab_hb); + return -m_b * (acc_a + acc_b); } // mag tension form the Tricco 2023 formula @@ -334,8 +379,8 @@ namespace shamrock::sph::mhd { Tscal v_shock_b = shamphys::MHD_physics::v_shock(cs_b, B_b, rho_b, mu_0); Tscal vsig_B = shamphys::MHD_physics::vsigB(v_ab, r_ab_unit); - Tscal qa_ab = shamrock::sph::q_av(rho_a, vsig_a, v_ab_r_ab); - Tscal qb_ab = shamrock::sph::q_av(rho_b, vsig_b, v_ab_r_ab); + Tscal qa_ab = Tscal(0.);//shamrock::sph::q_av(rho_a, vsig_a, v_ab_r_ab); + Tscal qb_ab = Tscal(0.);//shamrock::sph::q_av(rho_b, vsig_b, v_ab_r_ab); Tscal AV_P_a = P_a + qa_ab; Tscal AV_P_b = P_b + qb_ab; @@ -353,16 +398,17 @@ namespace shamrock::sph::mhd { sum_fdivB += fdivB( pmass, B_a, B_b, r_ab_unit * dWab_a, r_ab_unit * dWab_b, sub_fact_a, sub_fact_b, mu_0); - Tvec gas_pressure_pishock = sph::sph_pressure_symetric( - pmass, - rho_a_sq, - rho_b * rho_b, - AV_P_a, - AV_P_b, - omega_a, - omega_b, - r_ab_unit * dWab_a, - r_ab_unit * dWab_b); + Tvec gas_pressure_pishock = Tvec(0., 0., 0.); + //sph::sph_pressure_symetric( + // pmass, + // rho_a_sq, + // rho_b * rho_b, + // AV_P_a, + // AV_P_b, + // omega_a, + // omega_b, + // r_ab_unit * dWab_a, + // r_ab_unit * dWab_b); sum_mag_tension += -B_dot_grad_W( pmass, @@ -463,9 +509,11 @@ namespace shamrock::sph::mhd { // for conservative checks drho_dt += (1. / omega_a) * pmass * sycl::dot(v_ab, r_ab_unit * dWab_a); + logger::raw_ln("dB_on rho dt", dB_on_rho_dt); + // Non-ideal MHD terms if constexpr (MHD_mode == NonIdeal) { - // logger::raw_ln("############# NON IDEAL MHD #############"); + logger::raw_ln("############# NON IDEAL MHD #############"); // Tvec J_a = MagCurrentJ( // pmass, B_a, B_b, r_ab_unit * dWab_a, sub_fact_a, mu_0); @@ -475,9 +523,25 @@ namespace shamrock::sph::mhd { Tvec D_a = WursterD(B_a, J_a, etaO, etaH, etaAD); Tvec D_b = WursterD(B_b, J_b, etaO, etaH, etaAD); - Tvec B_NI = B_NI_terms( - D_a, - D_b, + //Tvec B_NI = B_NI_terms( + // D_a, + // D_b, + // pmass, + // rho_a_sq, + // rho_b * rho_b, + // B_a, + // B_b, + // omega_a, + // omega_b, + // r_ab_unit * dWab_a, + // r_ab_unit * dWab_b); +// + //dB_on_rho_dt += B_NI; + + Tvec B_NI_ADterm = B_NI_AD( + etaAD, + J_a, + J_b, pmass, rho_a_sq, rho_b * rho_b, @@ -488,10 +552,24 @@ namespace shamrock::sph::mhd { r_ab_unit * dWab_a, r_ab_unit * dWab_b); - dB_on_rho_dt += B_NI; + logger::raw_ln(B_NI_ADterm); + + //logger::raw_ln("etaAD", etaAD); + //logger::raw_ln("J_a", J_a); + //logger::raw_ln("J_b", J_b); + //logger::raw_ln("pmass", pmass); + //logger::raw_ln("rho_a_sq", rho_a_sq); + //logger::raw_ln("rho_b", rho_b); + //logger::raw_ln("B_a", B_a); + //logger::raw_ln("B_b", B_b); + //logger::raw_ln("omega_a", omega_a); + //logger::raw_ln("omega_b", omega_b); + //logger::raw_ln("B_NI_ADterm", B_NI_ADterm); + + dB_on_rho_dt += B_NI_ADterm; - Tscal u_NI = u_NI_heating(D_a, J_a, rho_a) * 0.5 - + u_NI_heating(D_b, J_b, rho_b) * 0.5; + Tscal u_NI = u_NI_heating(B_a, J_a, rho_a, etaO, etaAD) * 0.5 + + u_NI_heating(B_b, J_b, rho_b, etaO, etaAD) * 0.5; du_dt += u_NI; } diff --git a/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp b/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp index 2274a1e8be..1ac558258c 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp @@ -32,9 +32,10 @@ namespace shammodels::sph::modules { static constexpr Tscal kernel_radius = SPHKernel::Rkern; Tscal part_mass; Tscal mu_0; + Tscal c; public: - NodeComputeJ(Tscal part_mass, Tscal mu_0) : part_mass(part_mass), mu_0(mu_0) {} + NodeComputeJ(Tscal part_mass, Tscal mu_0, Tscal c) : part_mass(part_mass), mu_0(mu_0), c(c) {} struct Edges { const shamrock::solvergraph::Indexes &part_counts; diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 9848279f9d..fb649fe86c 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1564,9 +1564,14 @@ void shammodels::sph::Solver::update_J() { std::shared_ptr> B_on_rho_edge = std::make_shared>("", ""); + shamrock::patch::PatchDataLayerLayout &ghost_layout + = shambase::get_check_ref(storage.ghost_layout.get()); + u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho") ; + + shamrock::solvergraph::DDPatchDataFieldRef B_on_rho_refs = {}; scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { - auto &field = pdat.get_field(iB_on_rho); + auto &field = storage.merged_patchdata_ghost.get().get(p.id_patch).template get_field(iB_on_rho_interf); B_on_rho_refs.add_obj(p.id_patch, std::ref(field)); }); @@ -1574,6 +1579,7 @@ void shammodels::sph::Solver::update_J() { logger::raw_ln("loaded B"); Tscal const mu_0 = solver_config.get_constant_mu_0(); + Tscal const c = solver_config.get_constant_c(); shambase::get_check_ref(storage.hpart_with_ghosts); @@ -1581,7 +1587,7 @@ void shammodels::sph::Solver::update_J() { shambase::get_check_ref(storage.MagCurrentJ); logger::raw_ln(" MagCurrentJ is OK"); // use MagCurrenJ: on active particles (no gz) - modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0}; + modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0, c}; computeJ.set_edges( storage.part_counts, storage.neigh_cache, diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index c6e04c6723..07ea09b159 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -9,7 +9,6 @@ /** * @file ComputeJ.cpp - * @author Timothée David--Cléris (tim.shamrock@proton.me) * @author Yona Lapeyre (yona.lapeyre@ens-lyon.fr) * @brief * @@ -22,18 +21,25 @@ #include "shammodels/sph/modules/ComputeJ.hpp" #include "shamrock/scheduler/SchedulerUtility.hpp" #include "shamrock/solvergraph/IFieldSpan.hpp" +#include template class SPHKernel> void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_internal() { __shamrock_stack_entry(); logger::raw_ln("xinside compute J"); + logger::raw_ln("1111 c = ", c); auto edges = get_edges(); auto dev_sched = shamsys::instance::get_compute_scheduler_ptr(); logger::raw_ln("before ensure size"); edges.J.ensure_sizes(edges.part_counts.indexes); logger::raw_ln("after ensure size"); + Tscal _pi = shambase::constants::pi; + + edges.part_counts.indexes.for_each([&](u64 id_patch, u32 count) { + fmt::print("patch {} has {} particles\n", id_patch, count); + }); sham::distributed_data_kernel_call( dev_sched, @@ -45,7 +51,7 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int edges.B_on_rho.get_spans()}, sham::DDMultiRef{edges.J.get_spans()}, edges.part_counts.indexes, - [part_mass = this->part_mass, mu_0 = this->mu_0, Rkern = kernel_radius]( + [part_mass = this->part_mass, mu_0 = this->mu_0, c = this->c, _pi = _pi, Rkern = kernel_radius]( u32 id_a, const Tvec *r, const Tscal *hpart, @@ -62,7 +68,6 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int Tvec xyz_a = r[id_a]; // could be recovered from lambda Tscal h_a = hpart[id_a]; - Tscal dint = h_a * h_a * Rkern * Rkern; Tscal rho_a = rho_h(part_mass, h_a, SPHKernel::hfactd); Tscal rho_a_sq = rho_a * rho_a; @@ -87,28 +92,41 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int Tscal rab = sycl::sqrt(rab2); Tscal rho_b = rho_h(part_mass, h_b, SPHKernel::hfactd); - if (h_b == 0) { - logger::raw_ln("@@@@@@ h_b", h_b); - logger::raw_ln("idb", id_b); - logger::raw_ln("@@@@@@ xyz_b", r[id_b]); - } + //if (id_a == 0) { + // logger::raw_ln("@@@@@@ h_b", h_b); + // logger::raw_ln("idb", id_b); + // logger::raw_ln("@@@@@@ xyz_b", r[id_b]); + //} Tvec B_b = B_on_rho[id_b] * rho_b; Tscal Fab_a = SPHKernel::dW_3d(rab, h_a); Tvec r_ab_unit = dr * sham::inv_sat_positive(rab); Tvec nabla_Wab_ha = r_ab_unit * Fab_a; - //logger::raw_ln("@@@@@@ mu_0", mu_0); - //logger::raw_ln("@@@@@@ Ba", B_a); - //logger::raw_ln("@@@@@@ Bb", B_b); - //logger::raw_ln("@@@@@@ nabla_Wab_ha", nabla_Wab_ha); - J_sum += shamrock::sph::mhd::MagCurrentJ_sum( + Tvec fucker = shamrock::sph::mhd::MagCurrentJ_sum( part_mass, B_a, B_b, nabla_Wab_ha, sub_fact_a, mu_0); + J_sum += fucker; + + //if (id_a == 0) { + // logger::raw_ln("@@@@@@ mu_0", mu_0); + // logger::raw_ln("@@@@@@ Ba", B_a); + // logger::raw_ln("@@@@@@ Bb", B_b); + // logger::raw_ln("@@@@@@ nabla_Wab_ha", nabla_Wab_ha); + // logger::raw_ln("@@@@@@ sub_fact_a", sub_fact_a); + // logger::raw_ln("@@@@@@ fucker", fucker); + // logger::raw_ln("@@@@@ J_sum", J_sum); + //} + }); - J[id_a] = J_sum; - //logger::raw_ln("@@@@@@@@@@@@@@@@@@@ J a", J_sum); + J[id_a] = J_sum; //* 4 * _pi / c; + //if (id_a == 0) { + // logger::raw_ln("@@@@@@@@@@@@@@@@@@@ J a", J_sum, id_a); + // + //} + }); + //std::abort(); } template class SPHKernel> From 1d693f6488471b05a6e09396590d4a6e034fdc49 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 21 Jun 2026 22:42:25 +0000 Subject: [PATCH 23/54] [autofix.ci] automatic fix: pre-commit hooks --- .../sph/include/shammodels/sph/math/mhd.hpp | 111 +++++++++--------- .../shammodels/sph/modules/ComputeJ.hpp | 3 +- src/shammodels/sph/src/Solver.cpp | 59 ++++------ src/shammodels/sph/src/modules/ComputeJ.cpp | 51 ++++---- .../sph/src/modules/UpdateDerivs.cpp | 21 ++-- .../include/shamrock/patch/PatchDataLayer.hpp | 1 - 6 files changed, 120 insertions(+), 126 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index fd3bf7df5d..831e14bb9d 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -36,20 +36,19 @@ namespace shamrock::sph::mhd { template inline Tvec MagCurrentJ_sum( Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0) { - // ajout 4pi /c + // ajout 4pi /c return m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha) / mu_0; - //return {0., 0., 0.}; + // return {0., 0., 0.}; } template inline Tvec WursterD(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD) { - Tvec Bhat = B * sham::inv_sat_zero(sycl::length(B)); - //logger::raw_ln("#### Bhat", Bhat); - //logger::raw_ln("#### J", J); - Tvec D = etaO * J + etaH * sycl::cross(J, Bhat) - - etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); + // logger::raw_ln("#### Bhat", Bhat); + // logger::raw_ln("#### J", J); + Tvec D = etaO * J + etaH * sycl::cross(J, Bhat) + - etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); return D; } @@ -57,16 +56,15 @@ namespace shamrock::sph::mhd { template inline Tscal u_NI_heating(Tvec B, Tvec J, Tscal rho, Tscal etaO, Tscal etaAD) { - //return sycl::dot(D, J) * sham::inv_sat_zero(rho); - Tscal BdB = sycl::dot(B, B); - Tscal JdJ = sycl::dot(J, J); - Tscal BdJ = sycl::dot(B, J); + // return sycl::dot(D, J) * sham::inv_sat_zero(rho); + Tscal BdB = sycl::dot(B, B); + Tscal JdJ = sycl::dot(J, J); + Tscal BdJ = sycl::dot(B, J); Tscal BdJBdJhat = sham::inv_sat_zero(BdB) * BdJ * BdJ; return (etaO * JdJ + etaAD * (JdJ - BdJBdJhat)) * sham::inv_sat_zero(rho); } - template inline Tvec B_NI_terms( Tvec D_a, @@ -84,13 +82,12 @@ namespace shamrock::sph::mhd { Tscal sub_fact_a = rho_a_sq * omega_a; Tscal sub_fact_b = rho_b_sq * omega_b; - //logger::raw_ln("####### Da", D_a); - //logger::raw_ln("####### Db", D_b); + // logger::raw_ln("####### Da", D_a); + // logger::raw_ln("####### Db", D_b); logger::raw_ln("#### Da", D_a); logger::raw_ln("#### Db", D_b); - Tvec acc_a = sham::inv_sat_zero(sub_fact_a) * (sycl::cross(D_a, nabla_Wab_ha)); Tvec acc_b = sham::inv_sat_zero(sub_fact_b) * (sycl::cross(D_b, nabla_Wab_hb)); return m_b * (acc_a + acc_b); @@ -114,20 +111,20 @@ namespace shamrock::sph::mhd { Tscal sub_fact_a = rho_a_sq * omega_a; Tscal sub_fact_b = rho_b_sq * omega_b; - //logger::raw_ln("####### Da", D_a); - //logger::raw_ln("####### Db", D_b); + // logger::raw_ln("####### Da", D_a); + // logger::raw_ln("####### Db", D_b); Tvec Bhat_a = B_a * sham::inv_sat_zero(sycl::length(B_a)); Tvec Bhat_b = B_b * sham::inv_sat_zero(sycl::length(B_b)); - Tvec JcB_a = sycl::cross(J_a, Bhat_a); - Tvec JcB_b = sycl::cross(J_b, Bhat_b); + Tvec JcB_a = sycl::cross(J_a, Bhat_a); + Tvec JcB_b = sycl::cross(J_b, Bhat_b); Tvec JcBcB_a = sycl::cross(JcB_a, Bhat_a); Tvec JcBcB_b = sycl::cross(JcB_b, Bhat_b); Tvec acc_a = sham::inv_sat_zero(sub_fact_a) * eta_AD * sycl::cross(JcBcB_a, nabla_Wab_ha); Tvec acc_b = sham::inv_sat_zero(sub_fact_b) * eta_AD * sycl::cross(JcBcB_b, nabla_Wab_hb); - return -m_b * (acc_a + acc_b); + return -m_b * (acc_a + acc_b); } // mag tension form the Tricco 2023 formula @@ -379,8 +376,8 @@ namespace shamrock::sph::mhd { Tscal v_shock_b = shamphys::MHD_physics::v_shock(cs_b, B_b, rho_b, mu_0); Tscal vsig_B = shamphys::MHD_physics::vsigB(v_ab, r_ab_unit); - Tscal qa_ab = Tscal(0.);//shamrock::sph::q_av(rho_a, vsig_a, v_ab_r_ab); - Tscal qb_ab = Tscal(0.);//shamrock::sph::q_av(rho_b, vsig_b, v_ab_r_ab); + Tscal qa_ab = Tscal(0.); // shamrock::sph::q_av(rho_a, vsig_a, v_ab_r_ab); + Tscal qb_ab = Tscal(0.); // shamrock::sph::q_av(rho_b, vsig_b, v_ab_r_ab); Tscal AV_P_a = P_a + qa_ab; Tscal AV_P_b = P_b + qb_ab; @@ -399,16 +396,16 @@ namespace shamrock::sph::mhd { pmass, B_a, B_b, r_ab_unit * dWab_a, r_ab_unit * dWab_b, sub_fact_a, sub_fact_b, mu_0); Tvec gas_pressure_pishock = Tvec(0., 0., 0.); - //sph::sph_pressure_symetric( - // pmass, - // rho_a_sq, - // rho_b * rho_b, - // AV_P_a, - // AV_P_b, - // omega_a, - // omega_b, - // r_ab_unit * dWab_a, - // r_ab_unit * dWab_b); + // sph::sph_pressure_symetric( + // pmass, + // rho_a_sq, + // rho_b * rho_b, + // AV_P_a, + // AV_P_b, + // omega_a, + // omega_b, + // r_ab_unit * dWab_a, + // r_ab_unit * dWab_b); sum_mag_tension += -B_dot_grad_W( pmass, @@ -523,20 +520,20 @@ namespace shamrock::sph::mhd { Tvec D_a = WursterD(B_a, J_a, etaO, etaH, etaAD); Tvec D_b = WursterD(B_b, J_b, etaO, etaH, etaAD); - //Tvec B_NI = B_NI_terms( - // D_a, - // D_b, - // pmass, - // rho_a_sq, - // rho_b * rho_b, - // B_a, - // B_b, - // omega_a, - // omega_b, - // r_ab_unit * dWab_a, - // r_ab_unit * dWab_b); -// - //dB_on_rho_dt += B_NI; + // Tvec B_NI = B_NI_terms( + // D_a, + // D_b, + // pmass, + // rho_a_sq, + // rho_b * rho_b, + // B_a, + // B_b, + // omega_a, + // omega_b, + // r_ab_unit * dWab_a, + // r_ab_unit * dWab_b); + // + // dB_on_rho_dt += B_NI; Tvec B_NI_ADterm = B_NI_AD( etaAD, @@ -554,17 +551,17 @@ namespace shamrock::sph::mhd { logger::raw_ln(B_NI_ADterm); - //logger::raw_ln("etaAD", etaAD); - //logger::raw_ln("J_a", J_a); - //logger::raw_ln("J_b", J_b); - //logger::raw_ln("pmass", pmass); - //logger::raw_ln("rho_a_sq", rho_a_sq); - //logger::raw_ln("rho_b", rho_b); - //logger::raw_ln("B_a", B_a); - //logger::raw_ln("B_b", B_b); - //logger::raw_ln("omega_a", omega_a); - //logger::raw_ln("omega_b", omega_b); - //logger::raw_ln("B_NI_ADterm", B_NI_ADterm); + // logger::raw_ln("etaAD", etaAD); + // logger::raw_ln("J_a", J_a); + // logger::raw_ln("J_b", J_b); + // logger::raw_ln("pmass", pmass); + // logger::raw_ln("rho_a_sq", rho_a_sq); + // logger::raw_ln("rho_b", rho_b); + // logger::raw_ln("B_a", B_a); + // logger::raw_ln("B_b", B_b); + // logger::raw_ln("omega_a", omega_a); + // logger::raw_ln("omega_b", omega_b); + // logger::raw_ln("B_NI_ADterm", B_NI_ADterm); dB_on_rho_dt += B_NI_ADterm; diff --git a/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp b/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp index 1ac558258c..6b74e20472 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp @@ -35,7 +35,8 @@ namespace shammodels::sph::modules { Tscal c; public: - NodeComputeJ(Tscal part_mass, Tscal mu_0, Tscal c) : part_mass(part_mass), mu_0(mu_0), c(c) {} + NodeComputeJ(Tscal part_mass, Tscal mu_0, Tscal c) + : part_mass(part_mass), mu_0(mu_0), c(c) {} struct Edges { const shamrock::solvergraph::Indexes &part_counts; diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 94b71f4c2c..cea43250c1 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -45,11 +45,11 @@ #include "shammodels/sph/math/q_ab.hpp" #include "shammodels/sph/modules/BuildTrees.hpp" #include "shammodels/sph/modules/ComputeEos.hpp" +#include "shammodels/sph/modules/ComputeJ.hpp" #include "shammodels/sph/modules/ComputeLoadBalanceValue.hpp" #include "shammodels/sph/modules/ComputeLuminosity.hpp" #include "shammodels/sph/modules/ComputeNeighStats.hpp" #include "shammodels/sph/modules/ComputeOmega.hpp" -#include "shammodels/sph/modules/ComputeJ.hpp" #include "shammodels/sph/modules/ConservativeCheck.hpp" #include "shammodels/sph/modules/DiffOperator.hpp" #include "shammodels/sph/modules/DiffOperatorDtDivv.hpp" @@ -574,7 +574,8 @@ void shammodels::sph::Solver::init_solver_graph() { storage.omega = std::make_shared>(1, "omega", "\\Omega"); - storage.MagCurrentJ = std::make_shared>(1, "MagCurrentJ", "\\mathbf{J}"); + storage.MagCurrentJ + = std::make_shared>(1, "MagCurrentJ", "\\mathbf{J}"); if (solver_config.has_field_alphaAV()) { storage.alpha_av_updated = std::make_shared>( @@ -591,8 +592,7 @@ void shammodels::sph::Solver::init_solver_graph() { = std::make_shared(storage.ghost_layout); storage.exchange_gz_positions = std::make_shared(storage.xyzh_ghost_layout); - storage.exchange_gz_J - = std::make_shared>(); + storage.exchange_gz_J = std::make_shared>(); } template class Kern> @@ -1187,7 +1187,6 @@ void shammodels::sph::Solver::sph_prestep(Tscal time_val, Tscal dt) }); hnew_edge->set_refs(hnew_refs); - modules::NodeComputeOmega compute_omega{solver_config.gpart_mass}; compute_omega.set_edges( storage.part_counts, @@ -1197,7 +1196,6 @@ void shammodels::sph::Solver::sph_prestep(Tscal time_val, Tscal dt) storage.omega); compute_omega.evaluate(); - if (solver_config.smoothing_length_config.is_density_based_neigh_lim()) { // if the h limiter is triggered, omega does not hold it's sense of dh/dr anymore // so we set it to 1, this effectively is equivalent of disabling the energy correction @@ -1560,20 +1558,21 @@ void shammodels::sph::Solver::update_J() { PatchDataLayerLayout &pdl = scheduler().pdl_old(); logger::raw_ln("loading B"); - const u32 iB_on_rho = pdl.get_field_idx("B/rho"); - std::shared_ptr> B_on_rho_edge - = std::make_shared>("", ""); + const u32 iB_on_rho = pdl.get_field_idx("B/rho"); + std::shared_ptr> B_on_rho_edge + = std::make_shared>("", ""); shamrock::patch::PatchDataLayerLayout &ghost_layout = shambase::get_check_ref(storage.ghost_layout.get()); - u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho") ; - + u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); shamrock::solvergraph::DDPatchDataFieldRef B_on_rho_refs = {}; scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { - auto &field = storage.merged_patchdata_ghost.get().get(p.id_patch).template get_field(iB_on_rho_interf); - B_on_rho_refs.add_obj(p.id_patch, std::ref(field)); - }); + auto &field = storage.merged_patchdata_ghost.get() + .get(p.id_patch) + .template get_field(iB_on_rho_interf); + B_on_rho_refs.add_obj(p.id_patch, std::ref(field)); + }); B_on_rho_edge->set_refs(B_on_rho_refs); logger::raw_ln("loaded B"); @@ -1581,7 +1580,6 @@ void shammodels::sph::Solver::update_J() { Tscal const mu_0 = solver_config.get_constant_mu_0(); Tscal const c = solver_config.get_constant_c(); - shambase::get_check_ref(storage.hpart_with_ghosts); logger::raw_ln(" hpart_with_ghosts is OK"); shambase::get_check_ref(storage.MagCurrentJ); @@ -1598,7 +1596,6 @@ void shammodels::sph::Solver::update_J() { storage.MagCurrentJ); computeJ.evaluate(); - } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1672,7 +1669,6 @@ void shammodels::sph::Solver::update_derivs(Tscal dt_hydro) { ext_forces.add_ext_forces(); } - template class Kern> bool shammodels::sph::Solver::apply_corrector(Tscal dt, u64 Npart_all) { return false; @@ -2029,7 +2025,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() node_copy.evaluate(); } - if (do_NIMHD){ + if (do_NIMHD) { // copy J from sched patch data to storage.MagCurrentJ std::shared_ptr patchdatas = std::make_shared( @@ -2092,7 +2088,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() // .update_curlB(); // } update_artificial_viscosity(dt); - + if (solver_config.has_field_alphaAV()) { shamrock::solvergraph::Field &comp_field_send @@ -2138,7 +2134,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() storage.alpha_av_ghost.set(std::move(merged_field)); } - if(do_NIMHD){ + if (do_NIMHD) { // communicate needed fields (B,b, hb): done just before @@ -2151,11 +2147,10 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() })); // compute J field - logger::raw_ln("@@@@@ before update J"); - //logger::raw_ln("MagCurrentJ size after copy-in = ", storage.MagCurrentJ.size()); - update_J(); - logger::raw_ln("@@@@@ after update J"); - + logger::raw_ln("@@@@@ before update J"); + // logger::raw_ln("MagCurrentJ size after copy-in = ", storage.MagCurrentJ.size()); + update_J(); + logger::raw_ln("@@@@@ after update J"); // communicate J field shamrock::solvergraph::Field &comp_field_send @@ -2200,7 +2195,6 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() // we get J with ghosts ! storage.MagCurrentJ_ghost.set(std::move(merged_field)); - } // compute pressure @@ -2486,8 +2480,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() = shambase::get_check_ref(storage.MagCurrentJ); scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { - sham::DeviceBuffer &buf_J - = pdat.get_field(iJ).get_buf(); + sham::DeviceBuffer &buf_J = pdat.get_field(iJ).get_buf(); sham::DeviceBuffer &buf_MagCurrentJ = MagCurrentJ.get_field(cur_p.id_patch).get_buf(); @@ -2495,7 +2488,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() auto &q = shamsys::instance::get_compute_scheduler().get_queue(); sham::EventList depends_list; - auto J = buf_J.get_write_access(depends_list); + auto J = buf_J.get_write_access(depends_list); auto MagCurrentJ = buf_MagCurrentJ.get_read_access(depends_list); auto e = q.submit(depends_list, [&](sycl::handler &cgh) { @@ -2755,11 +2748,11 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() cgh.parallel_for( sycl::range<1>{pdat.get_obj_cnt()}, [=](sycl::item<1> item) { - Tscal h_a = hpart[item]; - Tscal pi = shambase::constants::pi; + Tscal h_a = hpart[item]; + Tscal pi = shambase::constants::pi; Tscal Ch_diff = 1. / (2 * pi); - Tscal dt_AD = (etaAD > 0) ? (Ch_diff * h_a * h_a / etaAD) - : shambase::get_infty(); + Tscal dt_AD = (etaAD > 0) ? (Ch_diff * h_a * h_a / etaAD) + : shambase::get_infty(); cfl_dt[item] = sycl::min(cfl_dt[item], dt_AD); }); diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index 07ea09b159..636af0166d 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -51,7 +51,11 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int edges.B_on_rho.get_spans()}, sham::DDMultiRef{edges.J.get_spans()}, edges.part_counts.indexes, - [part_mass = this->part_mass, mu_0 = this->mu_0, c = this->c, _pi = _pi, Rkern = kernel_radius]( + [part_mass = this->part_mass, + mu_0 = this->mu_0, + c = this->c, + _pi = _pi, + Rkern = kernel_radius]( u32 id_a, const Tvec *r, const Tscal *hpart, @@ -64,10 +68,9 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int using namespace shamrock::sph; using namespace shamrock::sph::mhd; - Tvec xyz_a = r[id_a]; // could be recovered from lambda - Tscal h_a = hpart[id_a]; + Tscal h_a = hpart[id_a]; Tscal rho_a = rho_h(part_mass, h_a, SPHKernel::hfactd); Tscal rho_a_sq = rho_a * rho_a; @@ -92,12 +95,12 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int Tscal rab = sycl::sqrt(rab2); Tscal rho_b = rho_h(part_mass, h_b, SPHKernel::hfactd); - //if (id_a == 0) { - // logger::raw_ln("@@@@@@ h_b", h_b); - // logger::raw_ln("idb", id_b); - // logger::raw_ln("@@@@@@ xyz_b", r[id_b]); - //} - Tvec B_b = B_on_rho[id_b] * rho_b; + // if (id_a == 0) { + // logger::raw_ln("@@@@@@ h_b", h_b); + // logger::raw_ln("idb", id_b); + // logger::raw_ln("@@@@@@ xyz_b", r[id_b]); + // } + Tvec B_b = B_on_rho[id_b] * rho_b; Tscal Fab_a = SPHKernel::dW_3d(rab, h_a); Tvec r_ab_unit = dr * sham::inv_sat_positive(rab); @@ -107,26 +110,24 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int part_mass, B_a, B_b, nabla_Wab_ha, sub_fact_a, mu_0); J_sum += fucker; - //if (id_a == 0) { - // logger::raw_ln("@@@@@@ mu_0", mu_0); - // logger::raw_ln("@@@@@@ Ba", B_a); - // logger::raw_ln("@@@@@@ Bb", B_b); - // logger::raw_ln("@@@@@@ nabla_Wab_ha", nabla_Wab_ha); - // logger::raw_ln("@@@@@@ sub_fact_a", sub_fact_a); - // logger::raw_ln("@@@@@@ fucker", fucker); - // logger::raw_ln("@@@@@ J_sum", J_sum); - //} - + // if (id_a == 0) { + // logger::raw_ln("@@@@@@ mu_0", mu_0); + // logger::raw_ln("@@@@@@ Ba", B_a); + // logger::raw_ln("@@@@@@ Bb", B_b); + // logger::raw_ln("@@@@@@ nabla_Wab_ha", nabla_Wab_ha); + // logger::raw_ln("@@@@@@ sub_fact_a", sub_fact_a); + // logger::raw_ln("@@@@@@ fucker", fucker); + // logger::raw_ln("@@@@@ J_sum", J_sum); + // } }); J[id_a] = J_sum; //* 4 * _pi / c; - //if (id_a == 0) { - // logger::raw_ln("@@@@@@@@@@@@@@@@@@@ J a", J_sum, id_a); - // - //} - + // if (id_a == 0) { + // logger::raw_ln("@@@@@@@@@@@@@@@@@@@ J a", J_sum, id_a); + // + // } }); - //std::abort(); + // std::abort(); } template class SPHKernel> diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index e5c544196e..6a22524844 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -800,7 +800,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ u32 ipsi_on_ch_interf = ghost_layout.get_field_idx("psi/ch"); logger::raw_ln("@@@@@@@@@@@ before getting J @@@@@@@@@@@"); - //u32 iJ_interf = ghost_layout.get_field_idx("J"); + // u32 iJ_interf = ghost_layout.get_field_idx("J"); auto &merged_xyzh = storage.merged_xyzh.get(); shamrock::solvergraph::Field &omega = shambase::get_check_ref(storage.omega); @@ -839,11 +839,13 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ // storage.MagCurrentJ.get().get_buf_check(cur_p.id_patch); // @@@ needs to be communicated // in ghosts !!) - //sham::DeviceBuffer &buf_J = mpdat.get_field_buf_ref(iJ_interf); + // sham::DeviceBuffer &buf_J = mpdat.get_field_buf_ref(iJ_interf); - // @@@ how to create an empty buffer + // @@@ how to create an empty buffer bool do_NIMHD = solver_config.do_NIMHD(); - sham::DeviceBuffer &buf_J = (do_NIMHD) ? storage.MagCurrentJ_ghost.get().get(cur_p.id_patch).get_buf(): pdat.get_field_buf_ref(idB_on_rho); + sham::DeviceBuffer &buf_J + = (do_NIMHD) ? storage.MagCurrentJ_ghost.get().get(cur_p.id_patch).get_buf() + : pdat.get_field_buf_ref(idB_on_rho); tree::ObjectCache &pcache = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); @@ -865,7 +867,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ auto dB_on_rho = buf_dB_on_rho.get_write_access(depends_list); auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list); auto drho_dt = buf_drho_dt.get_write_access(depends_list); - auto J_field = (do_NIMHD) ? buf_J.get_read_access(depends_list): nullptr; + auto J_field = (do_NIMHD) ? buf_J.get_read_access(depends_list) : nullptr; Tvec *mag_pressure = (do_MHD_debug) @@ -934,7 +936,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal omega_a = omega[id_a]; Tscal u_a = u[id_a]; - Tvec J_a = (do_NIMHD) ? J_field[id_a]:Tvec{0, 0, 0}; + Tvec J_a = (do_NIMHD) ? J_field[id_a] : Tvec{0, 0, 0}; Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); Tscal rho_a_sq = rho_a * rho_a; @@ -978,7 +980,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal cs_b = cs[id_b]; Tscal rab = sycl::sqrt(rab2); - Tvec J_b = (do_NIMHD) ? J_field[id_b]:Tvec{0, 0, 0}; + Tvec J_b = (do_NIMHD) ? J_field[id_b] : Tvec{0, 0, 0}; Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); Tvec B_b = B_on_rho[id_b] * rho_b; @@ -1073,8 +1075,9 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ buf_dpsi_on_ch.complete_event_state(e); buf_drho_dt.complete_event_state(e); - if (do_NIMHD){ - buf_J.complete_event_state(e);} + if (do_NIMHD) { + buf_J.complete_event_state(e); + } if (do_MHD_debug) { pdat.get_field_buf_ref(imag_pressure).complete_event_state(e); diff --git a/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp b/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp index 69d549eb22..d0af94a455 100644 --- a/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp +++ b/src/shamrock/include/shamrock/patch/PatchDataLayer.hpp @@ -367,7 +367,6 @@ namespace shamrock::patch { u32 cnt = get_obj_cnt(); for (auto &field_var : fields) { field_var.visit([&](auto &field) { - if (field.get_obj_cnt() != cnt) { throw shambase::make_except_with_loc( "mismatch in obj cnt"); From 02c1b448afc0e3257a90e30965ae5ba6049c72d3 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Mon, 22 Jun 2026 02:49:06 +0200 Subject: [PATCH 24/54] clean up --- .../sph/include/shammodels/sph/Solver.hpp | 4 +-- .../sph/include/shammodels/sph/math/mhd.hpp | 29 ++++--------------- .../shammodels/sph/modules/UpdateDerivs.hpp | 4 +++ src/shammodels/sph/src/modules/ComputeJ.cpp | 15 ---------- .../sph/src/modules/UpdateDerivs.cpp | 12 ++++---- 5 files changed, 16 insertions(+), 48 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/Solver.hpp b/src/shammodels/sph/include/shammodels/sph/Solver.hpp index 8b2b2f1f1d..ddf967c0ff 100644 --- a/src/shammodels/sph/include/shammodels/sph/Solver.hpp +++ b/src/shammodels/sph/include/shammodels/sph/Solver.hpp @@ -12,7 +12,7 @@ /** * @file Solver.hpp * @author Timothée David--Cléris (tim.shamrock@proton.me) - * @author Yona Lapeyre (yona.lapeyre@ens-lyon.fr) --no git blame-- + * @author Yona Lapeyre (yona.lapeyre@ens-lyon.fr) * @brief */ @@ -206,7 +206,7 @@ namespace shammodels::sph { /// @brief Saves old derivative fields for predictor-corrector integration void prepare_corrector(); /// @brief Updates time derivatives and applies external forces - void update_derivs(); + void update_derivs(Tscal dt_hydro); /** * @brief diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 37f2321491..32d649367a 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -34,10 +34,10 @@ namespace shamrock::sph::mhd { enum MHDType { Ideal = 0, NonIdeal = 1 }; template - inline void MagCurrentJ_sum( - Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0, Tvec &J_a) { + inline Tvec MagCurrentJ_sum( + Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0) { - // ajout 4pi /c + // ajout 4pi /c return m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha) / mu_0; // return {0., 0., 0.}; @@ -123,7 +123,6 @@ namespace shamrock::sph::mhd { Tvec acc_b = sham::inv_sat_zero(sub_fact_b) * eta_AD * sycl::cross(JcBcB_b, nabla_Wab_hb); return -m_b * (acc_a + acc_b); } - // mag tension form the Tricco 2023 formula template @@ -508,12 +507,6 @@ namespace shamrock::sph::mhd { // Non-ideal MHD terms if constexpr (MHD_mode == NonIdeal) { - logger::raw_ln("############# NON IDEAL MHD #############"); - - // Tvec J_a = MagCurrentJ( - // pmass, B_a, B_b, r_ab_unit * dWab_a, sub_fact_a, mu_0); - // Tvec J_b = MagCurrentJ( - // pmass, B_a, B_b, r_ab_unit * dWab_b, sub_fact_b, mu_0); Tvec D_a = WursterD(B_a, J_a, etaO, etaH, etaAD); Tvec D_b = WursterD(B_b, J_b, etaO, etaH, etaAD); @@ -540,25 +533,13 @@ namespace shamrock::sph::mhd { pmass, rho_a_sq, rho_b * rho_b, + B_a, + B_b, omega_a, omega_b, r_ab_unit * dWab_a, r_ab_unit * dWab_b); - logger::raw_ln(B_NI_ADterm); - - // logger::raw_ln("etaAD", etaAD); - // logger::raw_ln("J_a", J_a); - // logger::raw_ln("J_b", J_b); - // logger::raw_ln("pmass", pmass); - // logger::raw_ln("rho_a_sq", rho_a_sq); - // logger::raw_ln("rho_b", rho_b); - // logger::raw_ln("B_a", B_a); - // logger::raw_ln("B_b", B_b); - // logger::raw_ln("omega_a", omega_a); - // logger::raw_ln("omega_b", omega_b); - // logger::raw_ln("B_NI_ADterm", B_NI_ADterm); - dB_on_rho_dt += B_NI_ADterm; Tscal u_NI = u_NI_heating(B_a, J_a, rho_a, etaO, etaAD) * 0.5 diff --git a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp index 9f5823051d..63d251649f 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp @@ -11,6 +11,7 @@ /** * @file UpdateDerivs.hpp + * @author Yona Lapeyre (yona.lapeyre@ens-lyon.fr) * @author Timothée David--Cléris (tim.shamrock@proton.me) * @brief * @@ -71,6 +72,9 @@ namespace shammodels::sph::modules { using IdealMHD = typename Cfg_MHD::IdealMHD_constrained_hyper_para; using NonIdealMHD = typename Cfg_MHD::NonIdealMHD; + template + void compute_J(Tscal mu_0); + // void update_derivs_MHD(Cfg_MHD cfg); // One templated implementation, specialised per MHDType at the call sites below. template diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index 636af0166d..a1069f6dfb 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -109,25 +109,10 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int Tvec fucker = shamrock::sph::mhd::MagCurrentJ_sum( part_mass, B_a, B_b, nabla_Wab_ha, sub_fact_a, mu_0); J_sum += fucker; - - // if (id_a == 0) { - // logger::raw_ln("@@@@@@ mu_0", mu_0); - // logger::raw_ln("@@@@@@ Ba", B_a); - // logger::raw_ln("@@@@@@ Bb", B_b); - // logger::raw_ln("@@@@@@ nabla_Wab_ha", nabla_Wab_ha); - // logger::raw_ln("@@@@@@ sub_fact_a", sub_fact_a); - // logger::raw_ln("@@@@@@ fucker", fucker); - // logger::raw_ln("@@@@@ J_sum", J_sum); - // } }); J[id_a] = J_sum; //* 4 * _pi / c; - // if (id_a == 0) { - // logger::raw_ln("@@@@@@@@@@@@@@@@@@@ J a", J_sum, id_a); - // - // } }); - // std::abort(); } template class SPHKernel> diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index c4970cee87..a40f935d4d 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -920,18 +920,12 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); u32 ipsi_on_ch_interf = ghost_layout.get_field_idx("psi/ch"); - bool do_NIMHD = solver_config.do_NIMHD(); auto &merged_xyzh = storage.merged_xyzh.get(); shamrock::solvergraph::Field &omega = shambase::get_check_ref(storage.omega); shambase::DistributedData &mpdats = storage.merged_patchdata_ghost.get(); - // Pre-compute J for all particles - if (do_NIMHD) { - compute_J(mu_0); - } - scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); @@ -956,6 +950,10 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ sham::DeviceBuffer &buf_psi_on_ch = mpdat.get_field_buf_ref(ipsi_on_ch_interf); + bool do_NIMHD = solver_config.do_NIMHD(); + sham::DeviceBuffer &buf_J + = (do_NIMHD) ? storage.MagCurrentJ_ghost.get().get(cur_p.id_patch).get_buf() + : pdat.get_field_buf_ref(idB_on_rho); tree::ObjectCache &pcache = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); @@ -977,6 +975,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ auto dB_on_rho = buf_dB_on_rho.get_write_access(depends_list); auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list); auto drho_dt = buf_drho_dt.get_write_access(depends_list); + auto J_field = (do_NIMHD) ? buf_J.get_read_access(depends_list) : nullptr; Tvec *mag_pressure = (do_MHD_debug) @@ -1031,7 +1030,6 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ logger::raw_ln("NOPE"); shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); - tree::ObjectCacheIterator particle_looper(ploop_ptrs); constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern; From ffa662f29b01e14a0d14c06434105c233e8b083f Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Mon, 22 Jun 2026 03:37:44 +0200 Subject: [PATCH 25/54] clean up + add warning --- .../sph/include/shammodels/sph/Solver.hpp | 2 +- .../include/shammodels/sph/SolverConfig.hpp | 16 +- .../sph/include/shammodels/sph/math/mhd.hpp | 24 +- src/shammodels/sph/src/modules/ComputeJ.cpp | 3 +- .../sph/src/modules/UpdateDerivs.cpp | 486 ------------------ 5 files changed, 29 insertions(+), 502 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/Solver.hpp b/src/shammodels/sph/include/shammodels/sph/Solver.hpp index ddf967c0ff..a1fd6f5087 100644 --- a/src/shammodels/sph/include/shammodels/sph/Solver.hpp +++ b/src/shammodels/sph/include/shammodels/sph/Solver.hpp @@ -186,7 +186,7 @@ namespace shammodels::sph { /// @brief Updates artificial viscosity coefficients for shock capturing void update_artificial_viscosity(Tscal dt); - /// @brief Updates artificial viscosity coefficients for shock capturing + /// @brief Updates the magnetic current field (for NIMHD) void update_J(); /// @brief Initializes data layout for ghost particle fields diff --git a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp index 2d0ddb1e57..3c42d2a79d 100644 --- a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp @@ -538,7 +538,21 @@ struct shammodels::sph::SolverConfig { mhd_config.set(v); } - inline void set_NonIdealMHD(typename MHDConfig::NonIdealMHD v) { mhd_config.set(v); } + inline void set_NonIdealMHD(typename MHDConfig::NonIdealMHD v) { + logger::raw_ln("$DANGER$DANGER$DANGER$DANGER$DANGER$DANGER$DANGER$DANGER$"); + logger::raw_ln(" ______ _______ __ _ _______ _______ ______ "); + logger::raw_ln("| | | _ || | | || || || _ | "); + logger::raw_ln("| _ || |_| || |_| || ___|| ___|| | ||"); + logger::raw_ln("| | | || || || | __ | |___ | |_||_"); + logger::raw_ln("| |_| || || _ || || || ___|| __ |"); + logger::raw_ln("| || _ || | | || |_| || |___ | | | |"); + logger::raw_ln("|______| |__| |__||_| |__||_______||_______||___| |_|"); + logger::raw_ln("$DANGER$DANGER$DANGER$DANGER$DANGER$DANGER$DANGER$DANGER$"); + logger::raw_ln("The Non-ideal MHD solver is UNDER DEVELOPMENT."); + logger::raw_ln("It is. NOT. FULLY. TESTED. YET."); + logger::raw_ln("Use at your own risk."); + mhd_config.set(v); + } ////////////////////////////////////////////////////////////////////////////////////////////// // MHD Config (END) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 32d649367a..74806bedd1 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -373,8 +373,8 @@ namespace shamrock::sph::mhd { Tscal v_shock_b = shamphys::MHD_physics::v_shock(cs_b, B_b, rho_b, mu_0); Tscal vsig_B = shamphys::MHD_physics::vsigB(v_ab, r_ab_unit); - Tscal qa_ab = Tscal(0.); // shamrock::sph::q_av(rho_a, vsig_a, v_ab_r_ab); - Tscal qb_ab = Tscal(0.); // shamrock::sph::q_av(rho_b, vsig_b, v_ab_r_ab); + Tscal qa_ab = shamrock::sph::q_av(rho_a, vsig_a, v_ab_r_ab); + Tscal qb_ab = shamrock::sph::q_av(rho_b, vsig_b, v_ab_r_ab); Tscal AV_P_a = P_a + qa_ab; Tscal AV_P_b = P_b + qb_ab; @@ -393,16 +393,16 @@ namespace shamrock::sph::mhd { pmass, B_a, B_b, r_ab_unit * dWab_a, r_ab_unit * dWab_b, sub_fact_a, sub_fact_b, mu_0); Tvec gas_pressure_pishock = Tvec(0., 0., 0.); - // sph::sph_pressure_symetric( - // pmass, - // rho_a_sq, - // rho_b * rho_b, - // AV_P_a, - // AV_P_b, - // omega_a, - // omega_b, - // r_ab_unit * dWab_a, - // r_ab_unit * dWab_b); + sph::sph_pressure_symetric( + pmass, + rho_a_sq, + rho_b * rho_b, + AV_P_a, + AV_P_b, + omega_a, + omega_b, + r_ab_unit * dWab_a, + r_ab_unit * dWab_b); sum_mag_tension += -B_dot_grad_W( pmass, diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index a1069f6dfb..bd0d6cad1f 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -106,9 +106,8 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int Tvec r_ab_unit = dr * sham::inv_sat_positive(rab); Tvec nabla_Wab_ha = r_ab_unit * Fab_a; - Tvec fucker = shamrock::sph::mhd::MagCurrentJ_sum( + J_sum += shamrock::sph::mhd::MagCurrentJ_sum( part_mass, B_a, B_b, nabla_Wab_ha, sub_fact_a, mu_0); - J_sum += fucker; }); J[id_a] = J_sum; //* 4 * _pi / c; diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index a40f935d4d..4ff373676c 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -738,127 +738,6 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_disc }); } -template class SPHKernel> -template -void shammodels::sph::modules::UpdateDerivs::compute_J(Tscal mu_0) { - - // skip for ideal MHD - logger::raw_ln("@@@@@@@@@@@@@@@@@@ stat computing j @@@@@@@@@@@@@@@@@@"); - if constexpr (MHD_mode == shamrock::sph::mhd::MHDType::Ideal) { - return; - } - - StackEntry stack_loc{}; - - using namespace shamrock; - using namespace shamrock::patch; - - shamrock::SchedulerUtility utility(scheduler()); - - shamrock::patch::PatchDataLayerLayout &ghost_layout - = shambase::get_check_ref(storage.ghost_layout.get()); - u32 ihpart_interf = ghost_layout.get_field_idx("hpart"); - u32 iomega_interf = ghost_layout.get_field_idx("omega"); - u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); - - auto &merged_xyzh = storage.merged_xyzh.get(); - shambase::DistributedData &mpdats = storage.merged_patchdata_ghost.get(); - - shamrock::patch::PatchDataLayerLayout &pdl = scheduler().pdl_old(); - u32 iJ = pdl.get_field_idx("J"); - - scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { - PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); - - sham::DeviceBuffer &buf_xyz - = merged_xyzh.get(cur_p.id_patch).template get_field_buf_ref(0); - sham::DeviceBuffer &buf_hpart = mpdat.get_field_buf_ref(ihpart_interf); - sham::DeviceBuffer &buf_omega = mpdat.get_field_buf_ref(iomega_interf); - sham::DeviceBuffer &buf_B_on_rho = mpdat.get_field_buf_ref(iB_on_rho_interf); - - sham::DeviceBuffer &buf_J = pdat.get_field_buf_ref(iJ); - - // get local cache - tree::ObjectCache &pcache - = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); - - sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().get_queue(); - sham::EventList depends_list; - - auto xyz = buf_xyz.get_read_access(depends_list); - auto hpart = buf_hpart.get_read_access(depends_list); - auto omega = buf_omega.get_read_access(depends_list); - auto B_on_rho = buf_B_on_rho.get_read_access(depends_list); - auto J_out = buf_J.get_write_access(depends_list); - auto ploop_ptrs = pcache.get_read_access(depends_list); - - auto e = q.submit(depends_list, [&](sycl::handler &cgh) { - // iterate on local particles - - const Tscal pmass = solver_config.gpart_mass; - const Tscal _mu_0 = mu_0; - - tree::ObjectCacheIterator particle_looper(ploop_ptrs); - constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern; - - shambase::parallel_for(cgh, mpdat.get_obj_cnt(), "compute J", [=](u64 gid) { - u32 id_a = (u32) gid; - - using namespace shamrock::sph; - - Tscal h_a = hpart[id_a]; - Tvec xyz_a = xyz[id_a]; - - Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); - Tscal rho_a_sq = rho_a * rho_a; - Tscal omega_a = omega[id_a]; - Tscal sub_fact_a = rho_a_sq * omega_a; - - Tvec B_a = B_on_rho[id_a] * rho_a; - - // Accumulate J_a = sum_b m_b / (rho_a^2 omega_a) - // * (B_a - B_b) x nabla_W(r_ab, h_a) / mu_0 - Tvec J_a{0, 0, 0}; - - particle_looper.for_each_object(id_a, [&](u32 id_b) { - Tvec dr = xyz_a - xyz[id_b]; - Tscal rab2 = sycl::dot(dr, dr); - Tscal h_b = hpart[id_b]; - - if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) { - return; - } - - Tscal rab = sycl::sqrt(rab2); - Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); - Tvec B_b = B_on_rho[id_b] * rho_b; - - Tscal Fab_a = Kernel::dW_3d(rab, h_a); - Tvec r_ab_unit = dr * sham::inv_sat_positive(rab); - Tvec nabla_Wab_ha = r_ab_unit * Fab_a; - - shamrock::sph::mhd::MagCurrentJ_sum( - pmass, B_a, B_b, nabla_Wab_ha, sub_fact_a, _mu_0, J_a); - }); - - J_out[id_a] = J_a; - }); - }); - - buf_xyz.complete_event_state(e); - buf_hpart.complete_event_state(e); - buf_omega.complete_event_state(e); - buf_B_on_rho.complete_event_state(e); - buf_J.complete_event_state(e); - - sham::EventList resulting_events; - resulting_events.add_event(e); - pcache.complete_event_state(resulting_events); - }); - - logger::raw_ln("@@@@@@@@@@@@@@@@@@finished @@@@@@@@@@@@@@@@@@"); -} - template class SPHKernel> void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(IdealMHD cfg) { update_derivs_MHD_impl( @@ -1020,14 +899,11 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ const Tscal _etaAD = etaAD; shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); - logger::raw_ln("44444444 problem loading args ?"); shamlog_debug_sycl_ln("deriv kernel", "sigma_mhd :", _sigma); - logger::raw_ln("NOPE"); shamlog_debug_sycl_ln("deriv kernel", "alpha_u :", _alpha_u); shamlog_debug_sycl_ln("deriv kernel", "etaO :", _etaO); shamlog_debug_sycl_ln("deriv kernel", "etaH :", _etaH); shamlog_debug_sycl_ln("deriv kernel", "etaAD :", _etaAD); - logger::raw_ln("NOPE"); shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); tree::ObjectCacheIterator particle_looper(ploop_ptrs); @@ -1037,7 +913,6 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ shambase::parallel_for(cgh, pdat.get_obj_cnt(), "compute MHD", [=](u64 gid) { u32 id_a = (u32) gid; - logger::raw_ln("bah alors ????????????????"); using namespace shamrock::sph; Tscal h_a = hpart[id_a]; @@ -1103,7 +978,6 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal Fab_a = Kernel::dW_3d(rab, h_a); Tscal Fab_b = Kernel::dW_3d(rab, h_b); - logger::raw_ln("before add_to_derivs_spmhd"); shamrock::sph::mhd::add_to_derivs_spmhd( pmass, dr, @@ -1211,366 +1085,6 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ // storage.MagCurrentJ.reset(); } -/** -template class SPHKernel> -void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(Cfg_MHD cfg) { - StackEntry stack_loc{}; - - using namespace shamrock; - using namespace shamrock::patch; - - - Tscal sigma_mhd = 0.0; - Tscal alpha_u = 0.0; - Tscal etaO = 0.0, etaH = 0.0, etaAD = 0.0; - - using namespace shamrock::sph::mhd; - using None = typename Cfg_MHD::None; - using IdealMHD = typename Cfg_MHD::IdealMHD_constrained_hyper_para; - using NonIdealMHD = typename Cfg_MHD::NonIdealMHD; - - MHDType mhd_mode = MHDType::Ideal; // Default - - if (auto* v = std::get_if(&cfg.configMHD)) { - mhd_mode = MHDType::Ideal; - } else if (auto* v = std::get_if(&cfg.configMHD)) { - sigma_mhd = v->sigma_mhd; - alpha_u = v->alpha_u; - mhd_mode = MHDType::Ideal; - } else if (auto* v = std::get_if(&cfg.configMHD)) { - sigma_mhd = v->sigma_mhd; - alpha_u = v->alpha_u; - etaO = v->etaO; - etaH = v->etaH; - etaAD = v->etaAD; - mhd_mode = MHDType::NonIdeal; - } else { - shambase::throw_unimplemented(); - } - - PatchDataLayerLayout &pdl = scheduler().pdl_old(); - - const u32 ixyz = pdl.get_field_idx("xyz"); - const u32 ivxyz = pdl.get_field_idx("vxyz"); - const u32 iaxyz = pdl.get_field_idx("axyz"); - const u32 iuint = pdl.get_field_idx("uint"); - const u32 iduint = pdl.get_field_idx("duint"); - const u32 ihpart = pdl.get_field_idx("hpart"); - const u32 iB_on_rho = pdl.get_field_idx("B/rho"); - const u32 idB_on_rho = pdl.get_field_idx("dB/rho"); - const u32 ipsi_on_ch = pdl.get_field_idx("psi/ch"); - const u32 idpsi_on_ch = pdl.get_field_idx("dpsi/ch"); - const u32 idrho_dt = pdl.get_field_idx("drho/dt"); - - bool do_MHD_debug = solver_config.do_MHD_debug(); - const u32 imag_pressure = (do_MHD_debug) ? pdl.get_field_idx("mag_pressure") : -1; - const u32 imag_tension = (do_MHD_debug) ? pdl.get_field_idx("mag_tension") : -1; - const u32 igas_pressure = (do_MHD_debug) ? pdl.get_field_idx("gas_pressure") : -1; - const u32 itensile_corr = (do_MHD_debug) ? pdl.get_field_idx("tensile_corr") : -1; - const u32 ipsi_propag = (do_MHD_debug) ? pdl.get_field_idx("psi_propag") : -1; - const u32 ipsi_diff = (do_MHD_debug) ? pdl.get_field_idx("psi_diff") : -1; - const u32 ipsi_cons = (do_MHD_debug) ? pdl.get_field_idx("psi_cons") : -1; - const u32 iu_mhd = (do_MHD_debug) ? pdl.get_field_idx("u_mhd") : -1; - - // Tscal mu_0 = 1.; - Tscal const mu_0 = solver_config.get_constant_mu_0(); - - shamrock::patch::PatchDataLayerLayout &ghost_layout - = shambase::get_check_ref(storage.ghost_layout.get()); - u32 ihpart_interf = ghost_layout.get_field_idx("hpart"); - u32 iuint_interf = ghost_layout.get_field_idx("uint"); - u32 ivxyz_interf = ghost_layout.get_field_idx("vxyz"); - u32 iomega_interf = ghost_layout.get_field_idx("omega"); - u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); - u32 ipsi_on_ch_interf = ghost_layout.get_field_idx("psi/ch"); - - // logger::raw_ln("charged the ghost fields."); - - auto &merged_xyzh = storage.merged_xyzh.get(); - shamrock::solvergraph::Field &omega = shambase::get_check_ref(storage.omega); - shambase::DistributedData &mpdats = storage.merged_patchdata_ghost.get(); - - scheduler().for_each_patchdata_nonempty([&](Patch cur_p, PatchDataLayer &pdat) { - PatchDataLayer &mpdat = mpdats.get(cur_p.id_patch); - - sham::DeviceBuffer &buf_xyz - = merged_xyzh.get(cur_p.id_patch).template get_field_buf_ref(0); - sham::DeviceBuffer &buf_axyz = pdat.get_field_buf_ref(iaxyz); - sham::DeviceBuffer &buf_duint = pdat.get_field_buf_ref(iduint); - sham::DeviceBuffer &buf_vxyz = mpdat.get_field_buf_ref(ivxyz_interf); - sham::DeviceBuffer &buf_hpart = mpdat.get_field_buf_ref(ihpart_interf); - sham::DeviceBuffer &buf_omega = mpdat.get_field_buf_ref(iomega_interf); - sham::DeviceBuffer &buf_uint = mpdat.get_field_buf_ref(iuint_interf); - sham::DeviceBuffer &buf_pressure - = shambase::get_check_ref(storage.pressure).get_field(cur_p.id_patch).get_buf(); - sham::DeviceBuffer &buf_cs - = shambase::get_check_ref(storage.soundspeed).get_field(cur_p.id_patch).get_buf(); - - sham::DeviceBuffer &buf_dB_on_rho = pdat.get_field_buf_ref(idB_on_rho); - sham::DeviceBuffer &buf_dpsi_on_ch = pdat.get_field_buf_ref(idpsi_on_ch); - sham::DeviceBuffer &buf_drho_dt = pdat.get_field_buf_ref(idrho_dt); - // logger::raw_ln("charged dB dpsi"); - - sham::DeviceBuffer &buf_B_on_rho = mpdat.get_field_buf_ref(iB_on_rho_interf); - sham::DeviceBuffer &buf_psi_on_ch - = mpdat.get_field_buf_ref(ipsi_on_ch_interf); - - // logger::raw_ln("charged B psi"); - // ADD curlBBBBBBBBB - - sycl::range range_npart{pdat.get_obj_cnt()}; - - tree::ObjectCache &pcache - = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); - - ///////////////////////////////////////////// - - sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().get_queue(); - sham::EventList depends_list; - - auto xyz = buf_xyz.get_read_access(depends_list); - auto axyz = buf_axyz.get_write_access(depends_list); - auto du = buf_duint.get_write_access(depends_list); - auto vxyz = buf_vxyz.get_read_access(depends_list); - auto hpart = buf_hpart.get_read_access(depends_list); - auto omega = buf_omega.get_read_access(depends_list); - auto u = buf_uint.get_read_access(depends_list); - auto pressure = buf_pressure.get_read_access(depends_list); - auto cs = buf_cs.get_read_access(depends_list); - auto B_on_rho = buf_B_on_rho.get_read_access(depends_list); - auto psi_on_ch = buf_psi_on_ch.get_read_access(depends_list); - auto dB_on_rho = buf_dB_on_rho.get_write_access(depends_list); - auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list); - auto drho_dt = buf_drho_dt.get_write_access(depends_list); - - Tvec *mag_pressure - = (do_MHD_debug) - ? pdat.get_field_buf_ref(imag_pressure).get_write_access(depends_list) - : nullptr; - Tvec *mag_tension - = (do_MHD_debug) - ? pdat.get_field_buf_ref(imag_tension).get_write_access(depends_list) - : nullptr; - Tvec *gas_pressure - = (do_MHD_debug) - ? pdat.get_field_buf_ref(igas_pressure).get_write_access(depends_list) - : nullptr; - Tvec *tensile_corr - = (do_MHD_debug) - ? pdat.get_field_buf_ref(itensile_corr).get_write_access(depends_list) - : nullptr; - - Tscal *psi_propag - = (do_MHD_debug) - ? pdat.get_field_buf_ref(ipsi_propag).get_write_access(depends_list) - : nullptr; - Tscal *psi_diff - = (do_MHD_debug) - ? pdat.get_field_buf_ref(ipsi_diff).get_write_access(depends_list) - : nullptr; - Tscal *psi_cons - = (do_MHD_debug) - ? pdat.get_field_buf_ref(ipsi_cons).get_write_access(depends_list) - : nullptr; - - Tscal *u_mhd = (do_MHD_debug) - ? pdat.get_field_buf_ref(iu_mhd).get_write_access(depends_list) - : nullptr; - - auto ploop_ptrs = pcache.get_read_access(depends_list); - - auto e = q.submit(depends_list, [&](sycl::handler &cgh) { - const Tscal pmass = solver_config.gpart_mass; - - shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); - shamlog_debug_sycl_ln("deriv kernel", "sigma_mhd :", sigma_mhd); - shamlog_debug_sycl_ln("deriv kernel", "alpha_u :", alpha_u); - shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); - - tree::ObjectCacheIterator particle_looper(ploop_ptrs); - - constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern; - - shambase::parallel_for(cgh, pdat.get_obj_cnt(), "compute MHD", [=](u64 gid) { - u32 id_a = (u32) gid; - - using namespace shamrock::sph; - - Tvec sum_axyz = {0, 0, 0}; - Tscal sum_du_a = 0; - - Tscal h_a = hpart[id_a]; - Tvec xyz_a = xyz[id_a]; - Tvec vxyz_a = vxyz[id_a]; - Tscal P_a = pressure[id_a]; - Tscal cs_a = cs[id_a]; - Tscal omega_a = omega[id_a]; - const Tscal u_a = u[id_a]; - - Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); - Tscal rho_a_sq = rho_a * rho_a; - Tscal rho_a_inv = 1. / rho_a; - - Tvec B_a = B_on_rho[id_a] * rho_a; - Tscal v_alfven_a = sycl::sqrt(sycl::dot(B_a, B_a) / (mu_0 * rho_a)); - Tscal v_shock_a = sycl::sqrt(cs_a * cs_a + v_alfven_a * v_alfven_a); - Tscal psi_a = psi_on_ch[id_a] * v_shock_a; - - Tscal omega_a_rho_a_inv = 1 / (omega_a * rho_a); - - Tvec force_pressure{0, 0, 0}; - Tscal tmpdU_pressure = 0; - Tvec magnetic_eq{0, 0, 0}; - Tscal psi_eq = 0; - Tscal drho_eq = 0; - - Tvec mag_pressure_term{0, 0, 0}; - Tvec mag_tension_term{0, 0, 0}; - Tvec gas_pressure_term{0, 0, 0}; - Tvec tensile_corr_term{0, 0, 0}; - - Tscal psi_propag_term = 0; - Tscal psi_diff_term = 0; - Tscal psi_cons_term = 0; - - Tscal u_mhd_term = 0; - - particle_looper.for_each_object(id_a, [&](u32 id_b) { - // compute only omega_a - Tvec dr = xyz_a - xyz[id_b]; - Tscal rab2 = sycl::dot(dr, dr); - Tscal h_b = hpart[id_b]; - - if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) { - return; - } - - Tvec vxyz_b = vxyz[id_b]; - const Tscal u_b = u[id_b]; - Tscal P_b = pressure[id_b]; - Tscal omega_b = omega[id_b]; - Tscal cs_b = cs[id_b]; - - Tscal rab = sycl::sqrt(rab2); - - Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); - Tvec B_b = B_on_rho[id_b] * rho_b; - Tscal v_alfven_b = sycl::sqrt(sycl::dot(B_b, B_b) / (mu_0 * rho_b)); - Tscal v_shock_b = sycl::sqrt(cs_b * cs_b + v_alfven_b * v_alfven_b); - Tscal psi_b = psi_on_ch[id_b] * v_shock_b; - // const Tscal alpha_a = alpha_AV; - // const Tscal alpha_b = alpha_AV; - Tscal Fab_a = Kernel::dW_3d(rab, h_a); - Tscal Fab_b = Kernel::dW_3d(rab, h_b); - - // Tscal sigma_mhd = 0.3; - shamrock::sph::mhd::add_to_derivs_spmhd( - pmass, - dr, - rab, - rho_a, - rho_a_sq, - omega_a_rho_a_inv, - rho_a_inv, - rho_b, - omega_a, - omega_b, - Fab_a, - Fab_b, - vxyz_a, - vxyz_b, - u_a, - u_b, - P_a, - P_b, - cs_a, - cs_b, - h_a, - h_b, - - alpha_u, - - B_a, - B_b, - - psi_a, - psi_b, - - mu_0, - sigma_mhd, - - force_pressure, - tmpdU_pressure, - magnetic_eq, - psi_eq, - drho_eq, - mag_pressure_term, - mag_tension_term, - gas_pressure_term, - tensile_corr_term, - - psi_propag_term, - psi_diff_term, - psi_cons_term, - u_mhd_term); - }); - - axyz[id_a] = force_pressure; - du[id_a] = tmpdU_pressure; - dB_on_rho[id_a] = magnetic_eq; - dpsi_on_ch[id_a] = psi_eq - psi_a / h_a; - drho_dt[id_a] = drho_eq; - - if (do_MHD_debug) { - mag_pressure[id_a] = mag_pressure_term; - mag_tension[id_a] = mag_tension_term; - gas_pressure[id_a] = gas_pressure_term; - tensile_corr[id_a] = tensile_corr_term; - - psi_propag[id_a] = psi_propag_term; - psi_diff[id_a] = psi_diff_term; - psi_cons[id_a] = -psi_a / h_a; - - u_mhd[id_a] = u_mhd_term; - } - }); - }); - - buf_xyz.complete_event_state(e); - buf_axyz.complete_event_state(e); - buf_duint.complete_event_state(e); - buf_vxyz.complete_event_state(e); - buf_hpart.complete_event_state(e); - buf_omega.complete_event_state(e); - buf_uint.complete_event_state(e); - buf_pressure.complete_event_state(e); - buf_cs.complete_event_state(e); - buf_B_on_rho.complete_event_state(e); - buf_psi_on_ch.complete_event_state(e); - buf_dB_on_rho.complete_event_state(e); - buf_dpsi_on_ch.complete_event_state(e); - buf_drho_dt.complete_event_state(e); - - if (do_MHD_debug) { - pdat.get_field_buf_ref(imag_pressure).complete_event_state(e); - pdat.get_field_buf_ref(imag_tension).complete_event_state(e); - pdat.get_field_buf_ref(igas_pressure).complete_event_state(e); - pdat.get_field_buf_ref(itensile_corr).complete_event_state(e); - - pdat.get_field_buf_ref(ipsi_propag).complete_event_state(e); - pdat.get_field_buf_ref(ipsi_diff).complete_event_state(e); - pdat.get_field_buf_ref(ipsi_cons).complete_event_state(e); - - pdat.get_field_buf_ref(iu_mhd).complete_event_state(e); - } - - sham::EventList resulting_events; - resulting_events.add_event(e); - pcache.complete_event_state(resulting_events); - }); -} -*/ - template class SPHKernel> void shammodels::sph::modules::UpdateDerivs::update_derivs_dust_monofluid_tvi_Sj( DustConfig cfg, Tscal dt_hydro) { From c9567647710fc3937c8d18f1618b53e1c9f8c382 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Mon, 22 Jun 2026 09:40:55 +0200 Subject: [PATCH 26/54] edit out typo --- src/shammodels/sph/src/Solver.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index c15c7382f5..d09b729124 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -973,7 +973,6 @@ void shammodels::sph::Solver::sph_prestep(Tscal time_val, Tscal dt) PatchDataLayerLayout &pdl = scheduler().pdl_old(); const u32 ihpart = pdl.get_field_idx("hpart"); - const u32 iB_on_rho = pdl.get_field_idx("B/rho"); ComputeField _epsilon_h, _h_old; From 4fa54e6586e3676565514ef3de198ac6975e64e8 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Mon, 22 Jun 2026 11:35:29 +0200 Subject: [PATCH 27/54] remove log --- src/shammodels/sph/include/shammodels/sph/math/mhd.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 74806bedd1..050f9fdebf 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -503,8 +503,6 @@ namespace shamrock::sph::mhd { // for conservative checks drho_dt += (1. / omega_a) * pmass * sycl::dot(v_ab, r_ab_unit * dWab_a); - logger::raw_ln("dB_on rho dt", dB_on_rho_dt); - // Non-ideal MHD terms if constexpr (MHD_mode == NonIdeal) { From b2456f5e61f77f0bb0c6793dd0cfef7aff1d242b Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Mon, 22 Jun 2026 11:48:41 +0200 Subject: [PATCH 28/54] correct wrongful merge deletion --- src/shammodels/sph/src/Solver.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 9be0be6398..791a0a47f8 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -2887,6 +2887,10 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() storage.alpha_av_ghost.reset(); } + if (do_NIMHD) { + storage.MagCurrentJ_ghost.reset(); + } + } while (need_rerun_corrector); reset_merge_ghosts_fields(); From 3dbec738ca93664c5154e775cf656f5f0846b76b Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 26 Jun 2026 17:21:00 +0200 Subject: [PATCH 29/54] remove prints --- .../sph/include/shammodels/sph/math/mhd.hpp | 12 ++---------- src/shammodels/sph/src/Solver.cpp | 7 ------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 050f9fdebf..abfaf22720 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -47,10 +47,8 @@ namespace shamrock::sph::mhd { inline Tvec WursterD(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD) { Tvec Bhat = B * sham::inv_sat_zero(sycl::length(B)); - // logger::raw_ln("#### Bhat", Bhat); - // logger::raw_ln("#### J", J); - Tvec D = etaO * J + etaH * sycl::cross(J, Bhat) - - etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); + Tvec D = etaO * J + etaH * sycl::cross(J, Bhat) + - etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); return D; } @@ -82,12 +80,6 @@ namespace shamrock::sph::mhd { Tscal sub_fact_a = rho_a_sq * omega_a; Tscal sub_fact_b = rho_b_sq * omega_b; - // logger::raw_ln("####### Da", D_a); - // logger::raw_ln("####### Db", D_b); - - logger::raw_ln("#### Da", D_a); - logger::raw_ln("#### Db", D_b); - Tvec acc_a = sham::inv_sat_zero(sub_fact_a) * (sycl::cross(D_a, nabla_Wab_ha)); Tvec acc_b = sham::inv_sat_zero(sub_fact_b) * (sycl::cross(D_b, nabla_Wab_hb)); return m_b * (acc_a + acc_b); diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 791a0a47f8..f08a095ecd 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1568,7 +1568,6 @@ void shammodels::sph::Solver::update_J() { using namespace shamrock::patch; PatchDataLayerLayout &pdl = scheduler().pdl_old(); - logger::raw_ln("loading B"); const u32 iB_on_rho = pdl.get_field_idx("B/rho"); std::shared_ptr> B_on_rho_edge = std::make_shared>("", ""); @@ -1586,15 +1585,12 @@ void shammodels::sph::Solver::update_J() { }); B_on_rho_edge->set_refs(B_on_rho_refs); - logger::raw_ln("loaded B"); Tscal const mu_0 = solver_config.get_constant_mu_0(); Tscal const c = solver_config.get_constant_c(); shambase::get_check_ref(storage.hpart_with_ghosts); - logger::raw_ln(" hpart_with_ghosts is OK"); shambase::get_check_ref(storage.MagCurrentJ); - logger::raw_ln(" MagCurrentJ is OK"); // use MagCurrenJ: on active particles (no gz) modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0, c}; computeJ.set_edges( @@ -2158,10 +2154,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() })); // compute J field - logger::raw_ln("@@@@@ before update J"); - // logger::raw_ln("MagCurrentJ size after copy-in = ", storage.MagCurrentJ.size()); update_J(); - logger::raw_ln("@@@@@ after update J"); // communicate J field shamrock::solvergraph::Field &comp_field_send From 60e828a6fb7772921ccc51dcea5d7a579d626b67 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 26 Jun 2026 18:00:02 +0200 Subject: [PATCH 30/54] add wave damping test runscript --- examples/sph/run_mhd_wavedamping.py | 257 ++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 examples/sph/run_mhd_wavedamping.py diff --git a/examples/sph/run_mhd_wavedamping.py b/examples/sph/run_mhd_wavedamping.py new file mode 100644 index 0000000000..9f3c8fdfef --- /dev/null +++ b/examples/sph/run_mhd_wavedamping.py @@ -0,0 +1,257 @@ +""" +Wave damping test in SPH with non-ideal MHD +=========================================== + +This example runs the wave damping test, aimed at evaluating the behaviour of the ambipolar diffusion term. +The RMS of the magnetic field components is +monitored and compared to the analytical dispersion relation. +""" + +# sphinx_gallery_multi_image = "single" + +import os + +import matplotlib.pyplot as plt +import numpy as np + +import shamrock + +# Initialize shamrock (if not already done by the executable) +if not shamrock.sys.is_initialized(): + shamrock.change_loglevel(1) + shamrock.sys.init("0:0") + +# Use shamrock plotting style +shamrock.matplotlib.set_shamrock_mpl_style() + +# %% +# Define physical parameters and unit system +# ------------------------------------------ +# We use a unit system where mu_0 = 1 in code units (defined via UnitSystem). +# The code unit system is set to have unit_length = 1, unit_mass = 1.2566370621219e-06 +# so that mu_0 = 1 exactly. + +Lx = 1.0 # box length +dr = 0.09 # particle spacing +rho0 = 1.0 # initial density +Bx0 = 1.0 # background field in x +C_ADc = 0.01 # ambipolar diffusion coefficient (Phantom convention) +cs = 1.0 # isothermal sound speed +t_target = 5.0 # total simulation time +dt_dump = 0.01 * t_target # dump interval + +# Unit system and constants +codeu = shamrock.UnitSystem( + unit_time=1.0, + unit_length=1.0, + unit_mass=1.2566370621219e-06, +) +ucte = shamrock.Constants(codeu) +mu_0 = ucte.mu_0() # = 1 in these units +c = ucte.c() # speed of light (used only for unit conversion) + +# Derived quantities +vA = Bx0 / np.sqrt(rho0) # Alfven speed +etaAD_cgs = C_ADc * vA * vA # ambipolar diffusivity (cgs-like) +etaAD_si = etaAD_cgs * (4 * np.pi / c) # SI conversion (not used in code) + +print(f"mu_0 = {mu_0}, vA = {vA:.3f}, etaAD = {etaAD_cgs:.3e}") + +# %% +# Create context and SPH model +# ---------------------------- +ctx = shamrock.Context() +ctx.pdata_layout_new() +model = shamrock.get_Model_SPH(context=ctx, vector_type="f64_3", sph_kernel="C4") + +# %% +# Set up simulation configuration +# ------------------------------- +cfg = model.gen_default_config() +cfg.set_units(codeu) +cfg.set_artif_viscosity_None() # no artificial viscosity +cfg.set_NonIdealMHD(sigma_mhd=1, sigma_u=0, etaO=0, etaH=0, etaAD=etaAD_cgs) +cfg.set_boundary_periodic() # periodic boundaries in all directions +cfg.set_eos_isothermal(cs) # isothermal equation of state +cfg.print_status() +model.set_solver_config(cfg) + +# Initialize scheduler and particle container +model.init_scheduler(int(1e6), 1) + +# %% +# Generate particle distribution in an FCC lattice +# ------------------------------------------------ +bmin = (-Lx / 2.0, -np.sqrt(3) / 4.0 * Lx, -np.sqrt(6) / 4.0 * Lx) +bmax = (Lx / 2.0, np.sqrt(3) / 4.0 * Lx, np.sqrt(6) / 4.0 * Lx) + +# Adjust box to exactly fit the lattice +bmin, bmax = model.get_ideal_fcc_box(dr, bmin, bmax) +xm, ym, zm = bmin +xM, yM, zM = bmax +Lx_actual = xM - xm + +model.resize_simulation_box(bmin, bmax) +model.add_cube_fcc_3d(dr, bmin, bmax) + +vol_b = (xM - xm) * (yM - ym) * (zM - zm) +totmass = rho0 * vol_b +pmass = model.total_mass_to_part_mass(totmass) +model.set_particle_mass(pmass) + +# %% +# Set initial conditions +# ---------------------- +# Background magnetic field in x, and a sinusoidal velocity perturbation in z. +k = 2 * np.pi / Lx_actual +v0 = 0.01 * vA + + +def B_func(r): + return (Bx0, 0.0, 0.0) + + +def vel_func(r): + x, y, z = r + vz = v0 * np.sin(k * (x - xm)) + return (0.0, 0.0, vz) + + +def u_func(r): + return 0.0 + + +model.set_field_value_lambda_f64_3("B/rho", B_func) +model.set_field_value_lambda_f64_3("vxyz", vel_func) +model.set_field_value_lambda_f64("uint", u_func) + +# %% +# Set CFL parameters +# ------------------ +model.set_cfl_cour(0.3) +model.set_cfl_force(0.25) + +# %% +# Prepare storage for time series and output directory +# ---------------------------------------------------- +times = [] +Brmsx = [] +Brmsy = [] +Brmsz = [] + +dump_folder = "_wave_dump" +if shamrock.sys.world_rank() == 0: + os.makedirs(dump_folder, exist_ok=True) + +# %% +# Time loop with data collection +# ------------------------------ +t_sum = 0.0 +i_dump = 0 +next_dt_target = t_sum + dt_dump + +while next_dt_target <= t_target + 1e-12: + # Evolve until next dump time + model.evolve_until(next_dt_target) + t_now = model.get_time() + + # Collect particle data from the context + data = ctx.collect_data() + h_arr = data["hpart"] + hfac = 1.0 + rho = pmass * (hfac / h_arr) * (hfac / h_arr) * (hfac / h_arr) + Bx = data["B/rho"][:, 0] * rho + By = data["B/rho"][:, 1] * rho + Bz = data["B/rho"][:, 2] * rho + + # Compute RMS values + rms_x = np.sqrt(np.mean(Bx**2)) + rms_y = np.sqrt(np.mean(By**2)) + rms_z = np.sqrt(np.mean(Bz**2)) + + times.append(t_now) + Brmsx.append(rms_x) + Brmsy.append(rms_y) + Brmsz.append(rms_z) + + # (Optional) write VTK for visualisation + model.do_vtk_dump(os.path.join(dump_folder, f"wave_{i_dump:04d}.vtk"), True) + + print(f"t = {t_now:.3f}, rms Bz = {rms_z:.5f}") + + i_dump += 1 + next_dt_target += dt_dump + +# Convert to numpy arrays +times = np.array(times) +Brmsx = np.array(Brmsx) +Brmsy = np.array(Brmsy) +Brmsz = np.array(Brmsz) + +# %% +# Analytical solution +# ------------------- +# For the damping of a sinusoidal Alfven wave with ambipolar diffusion, +# the dispersion relation gives: +# omega = omega_R + i omega_I +# with omega_I = - (k^2 etaAD)/2 (damping rate) +# and omega_R = 0.5 * sqrt( - (k^2 etaAD)^2 - 4 (k vA)^2 ) +# The z-component of B (the perturbed component) evolves as: +# Bz(t) = Bz(0) * |sin(omega_R t)| * exp(omega_I t) +# where Bz(0) = (rho0 * v0 * Bx0) / (vA * sqrt(2)) + +Lx = 1.0 +# Phantom's exact dispersion relation +Bx0 = 1.0 +rho0 = 1.0 +C_ADc = 0.01 # ion-neutral coupling, same as Phantom +vA = Bx0 / np.sqrt(rho0) # no mu_0 since mu_0=1 in your code units +v0 = 0.01 * vA +k = 2 * np.pi / Lx # = 2*pi since Lx=1 + +etaAD_cgs = C_ADc * vA * vA +etaAD_si = etaAD_cgs * 4 * np.pi / c +etaAD = etaAD_cgs + +quadb = (k) ** 2 * etaAD +quadc = -((k * vA) ** 2) +omegaI = -0.5 * quadb # negative = damping +omegaR = 0.5 * np.sqrt(-(quadb**2) - 4 * quadc) + +h0 = (4 * np.pi) * v0 * Bx0 / (vA * np.sqrt(2.0)) + +print(f"omegaR = {omegaR:.4f}, omegaI = {omegaI:.4f}, h0 = {h0:.4f}") + +time_th = np.linspace(0, t_target, 1000) +theory = h0 * np.abs(np.sin(omegaR * time_th)) * np.exp(omegaI * time_th) + +# %% +# Plot results +# ------------ +fig, axs = plt.subplots(1, 4, figsize=(12, 8)) + +axs[0].plot(times, Brmsz, "b-", linewidth=2) +axs[0].set_xlabel("Time (s)") +axs[0].set_ylabel("rms Bz") +axs[0].grid(alpha=0.3) + +axs[1].plot(times, Brmsy, "g-", linewidth=2) +axs[1].set_xlabel("Time (s)") +axs[1].set_ylabel("rms By") +axs[1].grid(alpha=0.3) + +axs[2].plot(times, Brmsx, "m-", linewidth=2) +axs[2].set_xlabel("Time (s)") +axs[2].set_ylabel("rms Bx") +axs[2].grid(alpha=0.3) + +axs[3].plot(time_th, theory, "r--", linewidth=2) +axs[3].set_xlabel("Time (s)") +axs[3].set_ylabel("rms Bz theory") +axs[3].grid(alpha=0.3) + +plt.tight_layout() +plt.savefig(os.path.join(dump_folder, "wave_damping_analysis.png"), dpi=150) +plt.show() + +print("Analysis completed. Results saved in", dump_folder) From 34f60c1e04885a49a5fbe3423cf769706ce9b354 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 26 Jun 2026 18:20:55 +0200 Subject: [PATCH 31/54] Put NIMHD in experimental mode --- examples/sph/run_mhd_wavedamping.py | 2 ++ .../sph/include/shammodels/sph/SolverConfig.hpp | 6 ++++++ .../sph/include/shammodels/sph/config/MHDConfig.hpp | 11 +++++++++++ 3 files changed, 19 insertions(+) diff --git a/examples/sph/run_mhd_wavedamping.py b/examples/sph/run_mhd_wavedamping.py index 9f3c8fdfef..119edc9cee 100644 --- a/examples/sph/run_mhd_wavedamping.py +++ b/examples/sph/run_mhd_wavedamping.py @@ -16,6 +16,8 @@ import shamrock +shamrock.enable_experimental_features() + # Initialize shamrock (if not already done by the executable) if not shamrock.sys.is_initialized(): shamrock.change_loglevel(1) diff --git a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp index 3c42d2a79d..6dd49ab79a 100644 --- a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp @@ -1021,6 +1021,7 @@ struct shammodels::sph::SolverConfig { inline void check_config() { dust_config.check_config(); + mhd_config.check_config(); if (track_particles_id && false /*particle injection when added*/) { shamrock::experimental_feature_check( @@ -1035,6 +1036,11 @@ struct shammodels::sph::SolverConfig { shamrock::experimental_feature_check( "Self gravity is experimental, please enable experimental features to use it"); } + + if (mhd_config.do_NIMHD()) { + shamrock::experimental_feature_check( + "Non-ideal MHD is experimental, please enable experimental features to use it"); + } } void set_layout(shamrock::patch::PatchDataLayerLayout &pdl); diff --git a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp index 09e219cf00..2034cc0a55 100644 --- a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp @@ -18,6 +18,7 @@ */ #include "shambackends/vec.hpp" +#include "shamrock/experimental_features.hpp" #include "shamsys/legacy/log.hpp" #include #include @@ -112,6 +113,16 @@ struct shammodels::sph::MHDConfig { logger::raw_ln("-------------"); } + + inline void check_config() { + + if (do_NIMHD()) { + + if (!shamrock::are_experimental_features_allowed()) { + shambase::throw_with_loc("Non Ideal MHD is experimental"); + } + } + } }; namespace shammodels::sph { From 1a9e7377c02c6a573e4fcd94e4baa2c3fb378e05 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 18 Sep 2026 11:30:28 +0000 Subject: [PATCH 32/54] [autofix.ci] automatic fix: pre-commit hooks --- src/shammodels/sph/src/Solver.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index b062611502..dc4509d52a 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -680,7 +680,6 @@ void shammodels::sph::Solver::init_solver_graph() { storage.exchange_gz_J = std::make_shared>(); - //////////////////////////////////////////////////////////////////////////////////////// // sink accretion //////////////////////////////////////////////////////////////////////////////////////// @@ -1038,7 +1037,6 @@ void shammodels::sph::Solver::init_solver_graph() { if_has_accretion, })); } - } template class Kern> From f29378711d774516b6de54efb9f53e9b31364e92 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 18 Sep 2026 13:43:44 +0200 Subject: [PATCH 33/54] remove debug logs --- .../sph/include/shammodels/sph/SolverConfig.hpp | 2 ++ src/shammodels/sph/src/modules/ComputeJ.cpp | 8 -------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp index d0814563f0..85fdce1f18 100644 --- a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp @@ -667,6 +667,8 @@ struct shammodels::sph::SolverConfig { logger::raw_ln("The Non-ideal MHD solver is UNDER DEVELOPMENT."); logger::raw_ln("It is. NOT. FULLY. TESTED. YET."); logger::raw_ln("Use at your own risk."); + shamrock::experimental_feature_check( + "Non-ideal MHD is experimental, please enable experimental features to use it"); mhd_config.set(v); } diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index bd0d6cad1f..681a9ad921 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -27,20 +27,12 @@ template class SPHKernel> void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_internal() { __shamrock_stack_entry(); - logger::raw_ln("xinside compute J"); - logger::raw_ln("1111 c = ", c); auto edges = get_edges(); auto dev_sched = shamsys::instance::get_compute_scheduler_ptr(); - logger::raw_ln("before ensure size"); edges.J.ensure_sizes(edges.part_counts.indexes); - logger::raw_ln("after ensure size"); Tscal _pi = shambase::constants::pi; - edges.part_counts.indexes.for_each([&](u64 id_patch, u32 count) { - fmt::print("patch {} has {} particles\n", id_patch, count); - }); - sham::distributed_data_kernel_call( dev_sched, sham::DDMultiRef{ From 3c607618fc3c9ef979230f4c79da5bd077adbbbc Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 18 Sep 2026 13:53:36 +0200 Subject: [PATCH 34/54] fix orztang diff --- src/shammodels/sph/include/shammodels/sph/math/mhd.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index abfaf22720..caf52cce52 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -384,8 +384,7 @@ namespace shamrock::sph::mhd { sum_fdivB += fdivB( pmass, B_a, B_b, r_ab_unit * dWab_a, r_ab_unit * dWab_b, sub_fact_a, sub_fact_b, mu_0); - Tvec gas_pressure_pishock = Tvec(0., 0., 0.); - sph::sph_pressure_symetric( + Tvec gas_pressure_pishock = sph::sph_pressure_symetric( pmass, rho_a_sq, rho_b * rho_b, From 03761fcbab862f1a72b17b7155739f024ed8ec6d Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 18 Sep 2026 14:45:34 +0200 Subject: [PATCH 35/54] CFL condition for NIMHD --- .../sph/include/shammodels/sph/Solver.hpp | 7 +- .../include/shammodels/sph/SolverConfig.hpp | 6 ++ .../sph/modules/ComputeCFLNIMHD.hpp | 74 +++++++++++++++++++ src/shammodels/sph/src/Solver.cpp | 40 ++++++++++ 4 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp diff --git a/src/shammodels/sph/include/shammodels/sph/Solver.hpp b/src/shammodels/sph/include/shammodels/sph/Solver.hpp index 4f5721f537..c5c27bd1fc 100644 --- a/src/shammodels/sph/include/shammodels/sph/Solver.hpp +++ b/src/shammodels/sph/include/shammodels/sph/Solver.hpp @@ -154,7 +154,12 @@ namespace shammodels::sph { static constexpr u32 dim = shambase::VectorProperties::dimension; using Kernel = SPHKernel; - using Config = SolverConfig; + using Config = SolverConfig; + using Cfg_MHD = typename Config::MHDConfig; + + using NoneMHD = typename Cfg_MHD::None; + using IdealMHD = typename Cfg_MHD::IdealMHD_constrained_hyper_para; + using NonIdealMHD = typename Cfg_MHD::NonIdealMHD; using u_morton = typename Config::u_morton; diff --git a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp index 85fdce1f18..d8fda93776 100644 --- a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp @@ -77,6 +77,12 @@ namespace shammodels::sph { */ Tscal cfl_force; + Tscal _pi = shambase::constants::pi; + /** + * @brief The CFL condition for the force + */ + Tscal cfl_NIMHD = 1. / (2 * _pi); // as in phantom + /** * @brief The CFL multiplier stiffness */ diff --git a/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp b/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp new file mode 100644 index 0000000000..a37ccf60b6 --- /dev/null +++ b/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp @@ -0,0 +1,74 @@ +// -------------------------------------------------------// +// +// SHAMROCK code for hydrodynamics +// Copyright (c) 2021-2026 Timothée David--Cléris +// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1 +// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information +// +// -------------------------------------------------------// + +#pragma once + +/** + * @file ComputeCFLNIMHD.hpp + * @brief + * + */ + +#include "shambackends/kernel_call_distrib.hpp" +#include "shamrock/solvergraph/IFieldSpan.hpp" +#include "shamrock/solvergraph/Indexes.hpp" +#include "shamsolvergraph/edge/IDataEdge.hpp" +#include "shamsolvergraph/node/INode.hpp" +#include "shamsys/NodeInstance.hpp" + +#define NODE_EDGES(X_RO, X_RW) \ + X_RO(shamrock::solvergraph::Indexes, part_counts) \ + X_RO(shamrock::solvergraph::IDataEdge, C_nimhd) \ + X_RO(shamrock::solvergraph::IDataEdge, eta_O) \ + X_RO(shamrock::solvergraph::IDataEdge, eta_AD) \ + X_RO(shamrock::solvergraph::IDataEdge, eta_H) \ + X_RO(shamrock::solvergraph::IFieldSpan, hpart) \ + X_RW(shamrock::solvergraph::IFieldSpan, cfl_dt) + +template +class ComputeCFLNIMHD : public shamrock::solvergraph::INode { + + using Tscal = shambase::VecComponent; + + public: + ComputeCFLNIMHD() {} + + EXPAND_NODE_EDGES(NODE_EDGES) + + inline void _impl_evaluate_internal() { + auto edges = get_edges(); + + auto dev_sched = shamsys::instance::get_compute_scheduler_ptr(); + + Tscal C_nimhd = edges.C_nimhd.data; + Tscal eta_O = edges.eta_O.data; + Tscal eta_AD = edges.eta_AD.data; + Tscal eta_H = edges.eta_H.data; + + sham::distributed_data_kernel_call( + dev_sched, + sham::DDMultiRef{edges.hpart.get_spans()}, + sham::DDMultiRef{edges.cfl_dt.get_spans()}, + edges.part_counts.indexes, + [C_nimhd, eta_O, eta_AD, eta_H](u32 id_a, const Tscal *hpart, Tscal *cfl_dt) { + Tscal h_a = hpart[id_a]; + Tscal max_eta = sycl::max(sycl::max(eta_O, eta_AD), eta_H); + + Tscal dt_nimhd = C_nimhd * h_a * h_a / max_eta; + + cfl_dt[id_a] = sycl::min(cfl_dt[id_a], dt_nimhd); + }); + } + + inline virtual std::string _impl_get_label() const { return "ComputeCFLNIMHD"; }; + + inline virtual std::string _impl_get_tex() const { return "C_{NIMHD}"; }; +}; + +#undef NODE_EDGES diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index dc4509d52a..535bb815ba 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -52,6 +52,7 @@ #include "shammodels/sph/modules/ComputeCFLDust1Fluid.hpp" #include "shammodels/sph/modules/ComputeCFLDustDrift.hpp" #include "shammodels/sph/modules/ComputeCFLForce.hpp" +#include "shammodels/sph/modules/ComputeCFLNIMHD.hpp" #include "shammodels/sph/modules/ComputeEos.hpp" #include "shammodels/sph/modules/ComputeJ.hpp" #include "shammodels/sph/modules/ComputeLoadBalanceValue.hpp" @@ -3414,6 +3415,40 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() compute_cfl_force->set_edges( storage.part_counts, C_force_edge, hpart_refs, axyz_refs, cfl_dt); + std::shared_ptr> compute_cfl_NIMHD; + if (do_NIMHD) { + compute_cfl_NIMHD = std::make_shared>(); + + Tscal C_NIMHD = solver_config.cfl_config.cfl_NIMHD * get_cfl_multipler(); + Cfg_MHD cfg_mhd = solver_config.mhd_config; + auto *nimhd = std::get_if(&cfg_mhd.configMHD); + + Tscal eta_AD = nimhd->etaAD; + Tscal eta_O = nimhd->etaO; + Tscal eta_H = nimhd->etaH; + std::shared_ptr> C_NIMHD_edge + = shamrock::solvergraph::IDataEdge::make_shared("C_NIMHD", "C_{NIMHD}"); + C_NIMHD_edge->data = C_NIMHD; + std::shared_ptr> eta_O_edge + = shamrock::solvergraph::IDataEdge::make_shared("eta_O", "eta_{O}"); + eta_O_edge->data = eta_O; + std::shared_ptr> eta_AD_edge + = shamrock::solvergraph::IDataEdge::make_shared("eta_AD", "eta_{AD}"); + eta_AD_edge->data = eta_AD; + std::shared_ptr> eta_H_edge + = shamrock::solvergraph::IDataEdge::make_shared("eta_H", "eta_{H}"); + eta_H_edge->data = eta_H; + + compute_cfl_NIMHD->set_edges( + storage.part_counts, + C_NIMHD_edge, + eta_O_edge, + eta_AD_edge, + eta_H_edge, + hpart_refs, + cfl_dt); + } + std::shared_ptr> compute_cfl_divB_cleaning; if (has_psi_field) { compute_cfl_divB_cleaning = std::make_shared>(); @@ -3528,6 +3563,11 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() compute_cfl_force->evaluate(); save_cfl_detail("force"); + if (do_NIMHD) { + compute_cfl_NIMHD->evaluate(); + save_cfl_detail("NIMHD"); + } + if (has_psi_field) { compute_cfl_divB_cleaning->evaluate(); save_cfl_detail("divB_cleaning"); From 99062010120c64ebeca9cb1cfd021858954eabc5 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 18 Sep 2026 15:15:43 +0200 Subject: [PATCH 36/54] general clean up --- .../shammodels/sph/config/MHDConfig.hpp | 3 +++ .../sph/include/shammodels/sph/math/mhd.hpp | 26 +++++++++---------- .../sph/modules/ComputeCFLNIMHD.hpp | 1 + src/shammodels/sph/src/Solver.cpp | 1 + src/shammodels/sph/src/modules/ComputeJ.cpp | 6 +---- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp index 2034cc0a55..a47263d542 100644 --- a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp @@ -158,6 +158,9 @@ namespace shammodels::sph { {"mhd_type", "non_ideal_mhd"}, {"sigma_mhd", v->sigma_mhd}, {"alpha_u", v->alpha_u}, + {"etaO", v->etaO}, + {"etaH", v->etaH}, + {"etaAD", v->etaAD}, }; } else { shambase::throw_unimplemented(); diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index caf52cce52..7d94a8d2d6 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -500,20 +500,18 @@ namespace shamrock::sph::mhd { Tvec D_a = WursterD(B_a, J_a, etaO, etaH, etaAD); Tvec D_b = WursterD(B_b, J_b, etaO, etaH, etaAD); - // Tvec B_NI = B_NI_terms( - // D_a, - // D_b, - // pmass, - // rho_a_sq, - // rho_b * rho_b, - // B_a, - // B_b, - // omega_a, - // omega_b, - // r_ab_unit * dWab_a, - // r_ab_unit * dWab_b); - // - // dB_on_rho_dt += B_NI; + Tvec B_NI = B_NI_terms( + D_a, + D_b, + pmass, + rho_a_sq, + rho_b * rho_b, + omega_a, + omega_b, + r_ab_unit * dWab_a, + r_ab_unit * dWab_b); + + dB_on_rho_dt += B_NI; Tvec B_NI_ADterm = B_NI_AD( etaAD, diff --git a/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp b/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp index a37ccf60b6..f121f7f7a3 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp @@ -11,6 +11,7 @@ /** * @file ComputeCFLNIMHD.hpp + * @author Yona Lapeyre (yona.lapeyre@ens-lyon.fr) * @brief * */ diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 535bb815ba..fdba1f2515 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -2729,6 +2729,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() // communicate needed fields (B,b, hb): done just before + // @@@ is this the correct hpsrt ? the one updated bu sph_prestep ? shambase::get_check_ref(storage.hpart_with_ghosts) .set_refs(storage.merged_xyzh.get() .template map>>( diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index 681a9ad921..9893b11e73 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -43,11 +43,7 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int edges.B_on_rho.get_spans()}, sham::DDMultiRef{edges.J.get_spans()}, edges.part_counts.indexes, - [part_mass = this->part_mass, - mu_0 = this->mu_0, - c = this->c, - _pi = _pi, - Rkern = kernel_radius]( + [part_mass = this->part_mass, mu_0 = this->mu_0, Rkern = kernel_radius]( u32 id_a, const Tvec *r, const Tscal *hpart, From 8a67b70b56484cf0e6b8a1035052e4ccb95ff19b Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Wed, 23 Sep 2026 10:18:18 +0200 Subject: [PATCH 37/54] correct NI heating term in energy --- .../sph/include/shammodels/sph/math/mhd.hpp | 56 ++++++++++--------- .../sph/src/modules/UpdateDerivs.cpp | 10 +++- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 7d94a8d2d6..c117dc4b4c 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -54,15 +54,17 @@ namespace shamrock::sph::mhd { } template - inline Tscal u_NI_heating(Tvec B, Tvec J, Tscal rho, Tscal etaO, Tscal etaAD) { + inline Tscal u_NI_heating(Tvec B, Tvec J, Tscal rho, Tscal etaO, Tscal etaH, Tscal etaAD) { // return sycl::dot(D, J) * sham::inv_sat_zero(rho); - Tscal BdB = sycl::dot(B, B); - Tscal JdJ = sycl::dot(J, J); - Tscal BdJ = sycl::dot(B, J); - Tscal BdJBdJhat = sham::inv_sat_zero(BdB) * BdJ * BdJ; - - return (etaO * JdJ + etaAD * (JdJ - BdJBdJhat)) * sham::inv_sat_zero(rho); + // Tscal BdB = sycl::dot(B, B); + // Tscal JdJ = sycl::dot(J, J); + // Tscal BdJ = sycl::dot(B, J); + // Tscal BdJBdJhat = sham::inv_sat_zero(BdB) * BdJ * BdJ; + + // return (etaO * JdJ + etaAD * (JdJ - BdJBdJhat)) * sham::inv_sat_zero(rho); @ to check + Tvec D = WursterD(B, J, etaO, etaH, etaAD); + return -sycl::dot(D, J) * sham::inv_sat_zero(rho); } template @@ -85,6 +87,7 @@ namespace shamrock::sph::mhd { return m_b * (acc_a + acc_b); } + // not using Whurster D, developping with J. Equivalent to B_NI_terms template inline Tvec B_NI_AD( Tscal eta_AD, @@ -513,26 +516,25 @@ namespace shamrock::sph::mhd { dB_on_rho_dt += B_NI; - Tvec B_NI_ADterm = B_NI_AD( - etaAD, - J_a, - J_b, - pmass, - rho_a_sq, - rho_b * rho_b, - B_a, - B_b, - omega_a, - omega_b, - r_ab_unit * dWab_a, - r_ab_unit * dWab_b); - - dB_on_rho_dt += B_NI_ADterm; - - Tscal u_NI = u_NI_heating(B_a, J_a, rho_a, etaO, etaAD) * 0.5 - + u_NI_heating(B_b, J_b, rho_b, etaO, etaAD) * 0.5; - - du_dt += u_NI; + // Tvec B_NI_ADterm = B_NI_AD( + // etaAD, + // J_a, + // J_b, + // pmass, + // rho_a_sq, + // rho_b * rho_b, + // B_a, + // B_b, + // omega_a, + // omega_b, + // r_ab_unit * dWab_a, + // r_ab_unit * dWab_b); + + // dB_on_rho_dt += B_NI_ADterm; + + // Tscal u_NI = u_NI_heating(B_a, J_a, rho_a, etaO, etaAD) * 0.5 + // + u_NI_heating(B_b, J_b, rho_b, etaO, etaAD) * + // 0.5; } } diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 241838139f..81209fce44 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -1075,6 +1075,13 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ dpsi_on_ch[id_a] = psi_eq - psi_a / h_a; drho_dt[id_a] = drho_eq; + if (do_NIMHD) { + // only add once per particle + Tscal u_NI = shamrock::sph::mhd::u_NI_heating( + B_a, J_a, rho_a, etaO, etaH, etaAD); + du[id_a] += u_NI; + } + if (do_MHD_debug) { mag_pressure[id_a] = mag_pressure_term; mag_tension[id_a] = mag_tension_term; @@ -1094,7 +1101,6 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ buf_vxyz.complete_event_state(e); buf_hpart.complete_event_state(e); buf_omega.complete_event_state(e); - buf_uint.complete_event_state(e); buf_pressure.complete_event_state(e); buf_cs.complete_event_state(e); buf_B_on_rho.complete_event_state(e); @@ -1107,6 +1113,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ buf_J.complete_event_state(e); } + buf_uint.complete_event_state(e); + if (do_MHD_debug) { pdat.get_field_buf_ref(imag_pressure).complete_event_state(e); pdat.get_field_buf_ref(imag_tension).complete_event_state(e); From 0d8fefa370068a5efc8ff1d46503b76593fa38f7 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Wed, 23 Sep 2026 10:18:37 +0200 Subject: [PATCH 38/54] fix analytical solution --- examples/sph/run_mhd_wavedamping.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/sph/run_mhd_wavedamping.py b/examples/sph/run_mhd_wavedamping.py index 119edc9cee..c661976607 100644 --- a/examples/sph/run_mhd_wavedamping.py +++ b/examples/sph/run_mhd_wavedamping.py @@ -160,7 +160,7 @@ def u_func(r): # Collect particle data from the context data = ctx.collect_data() h_arr = data["hpart"] - hfac = 1.0 + hfac = model.get_hfact() rho = pmass * (hfac / h_arr) * (hfac / h_arr) * (hfac / h_arr) Bx = data["B/rho"][:, 0] * rho By = data["B/rho"][:, 1] * rho @@ -202,14 +202,14 @@ def u_func(r): # Bz(t) = Bz(0) * |sin(omega_R t)| * exp(omega_I t) # where Bz(0) = (rho0 * v0 * Bx0) / (vA * sqrt(2)) -Lx = 1.0 +Lx = Lx_actual # Phantom's exact dispersion relation Bx0 = 1.0 rho0 = 1.0 C_ADc = 0.01 # ion-neutral coupling, same as Phantom vA = Bx0 / np.sqrt(rho0) # no mu_0 since mu_0=1 in your code units v0 = 0.01 * vA -k = 2 * np.pi / Lx # = 2*pi since Lx=1 +k = 2 * np.pi / Lx_actual # = 2*pi since Lx=1 etaAD_cgs = C_ADc * vA * vA etaAD_si = etaAD_cgs * 4 * np.pi / c @@ -220,7 +220,7 @@ def u_func(r): omegaI = -0.5 * quadb # negative = damping omegaR = 0.5 * np.sqrt(-(quadb**2) - 4 * quadc) -h0 = (4 * np.pi) * v0 * Bx0 / (vA * np.sqrt(2.0)) +h0 = v0 * Bx0 / (vA * np.sqrt(2.0)) # (4 * np.pi) * print(f"omegaR = {omegaR:.4f}, omegaI = {omegaI:.4f}, h0 = {h0:.4f}") From 859938d9d187dced85e98c3b1dbc0383ca3d4469 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 24 Sep 2026 00:29:59 +0200 Subject: [PATCH 39/54] clean up --- .../shammodels/sph/modules/ComputeCFLNIMHD.hpp | 17 +++++++++-------- .../include/shammodels/sph/modules/ComputeJ.hpp | 1 - src/shammodels/sph/src/modules/ComputeJ.cpp | 3 +-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp b/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp index f121f7f7a3..e193fa66ae 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/ComputeCFLNIMHD.hpp @@ -26,9 +26,9 @@ #define NODE_EDGES(X_RO, X_RW) \ X_RO(shamrock::solvergraph::Indexes, part_counts) \ X_RO(shamrock::solvergraph::IDataEdge, C_nimhd) \ - X_RO(shamrock::solvergraph::IDataEdge, eta_O) \ - X_RO(shamrock::solvergraph::IDataEdge, eta_AD) \ - X_RO(shamrock::solvergraph::IDataEdge, eta_H) \ + X_RO(shamrock::solvergraph::IDataEdge, eta_o) \ + X_RO(shamrock::solvergraph::IDataEdge, eta_ad) \ + X_RO(shamrock::solvergraph::IDataEdge, eta_h) \ X_RO(shamrock::solvergraph::IFieldSpan, hpart) \ X_RW(shamrock::solvergraph::IFieldSpan, cfl_dt) @@ -48,18 +48,19 @@ class ComputeCFLNIMHD : public shamrock::solvergraph::INode { auto dev_sched = shamsys::instance::get_compute_scheduler_ptr(); Tscal C_nimhd = edges.C_nimhd.data; - Tscal eta_O = edges.eta_O.data; - Tscal eta_AD = edges.eta_AD.data; - Tscal eta_H = edges.eta_H.data; + Tscal eta_o = edges.eta_o.data; + Tscal eta_ad = edges.eta_ad.data; + Tscal eta_h = edges.eta_h.data; sham::distributed_data_kernel_call( dev_sched, sham::DDMultiRef{edges.hpart.get_spans()}, sham::DDMultiRef{edges.cfl_dt.get_spans()}, edges.part_counts.indexes, - [C_nimhd, eta_O, eta_AD, eta_H](u32 id_a, const Tscal *hpart, Tscal *cfl_dt) { + [C_nimhd, eta_o, eta_ad, eta_h](u32 id_a, const Tscal *hpart, Tscal *cfl_dt) { Tscal h_a = hpart[id_a]; - Tscal max_eta = sycl::max(sycl::max(eta_O, eta_AD), eta_H); + Tscal max_eta = sycl::max( + sycl::max(sycl::fabs(eta_o), sycl::fabs(eta_ad)), sycl::fabs(eta_h)); Tscal dt_nimhd = C_nimhd * h_a * h_a / max_eta; diff --git a/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp b/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp index 6b74e20472..6d8d1d50e4 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp @@ -29,7 +29,6 @@ namespace shammodels::sph::modules { using Tscal = shambase::VecComponent; - static constexpr Tscal kernel_radius = SPHKernel::Rkern; Tscal part_mass; Tscal mu_0; Tscal c; diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index 9893b11e73..420637aa55 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -31,7 +31,6 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int auto dev_sched = shamsys::instance::get_compute_scheduler_ptr(); edges.J.ensure_sizes(edges.part_counts.indexes); - Tscal _pi = shambase::constants::pi; sham::distributed_data_kernel_call( dev_sched, @@ -43,7 +42,7 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int edges.B_on_rho.get_spans()}, sham::DDMultiRef{edges.J.get_spans()}, edges.part_counts.indexes, - [part_mass = this->part_mass, mu_0 = this->mu_0, Rkern = kernel_radius]( + [part_mass = this->part_mass, mu_0 = this->mu_0]( u32 id_a, const Tvec *r, const Tscal *hpart, From 5c6880d42ca37fefbd4cb6198181c34f464a7d0b Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 24 Sep 2026 17:17:33 +0200 Subject: [PATCH 40/54] add alpha_B, correct setup --- examples/sph/run_mhd_wavedamping.py | 5 +++-- .../shammodels/sph/config/MHDConfig.hpp | 8 ++++++++ .../sph/include/shammodels/sph/math/mhd.hpp | 17 +++++++++++++--- .../shammodels/sph/modules/UpdateDerivs.hpp | 2 +- .../sph/src/modules/UpdateDerivs.cpp | 8 ++++++-- src/shammodels/sph/src/pySPHModel.cpp | 20 +++++++++++++------ 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/examples/sph/run_mhd_wavedamping.py b/examples/sph/run_mhd_wavedamping.py index c661976607..1e0dbf83a5 100644 --- a/examples/sph/run_mhd_wavedamping.py +++ b/examples/sph/run_mhd_wavedamping.py @@ -34,7 +34,7 @@ # so that mu_0 = 1 exactly. Lx = 1.0 # box length -dr = 0.09 # particle spacing +dr = 1 / 128 # particle spacing rho0 = 1.0 # initial density Bx0 = 1.0 # background field in x C_ADc = 0.01 # ambipolar diffusion coefficient (Phantom convention) @@ -72,7 +72,7 @@ cfg = model.gen_default_config() cfg.set_units(codeu) cfg.set_artif_viscosity_None() # no artificial viscosity -cfg.set_NonIdealMHD(sigma_mhd=1, sigma_u=0, etaO=0, etaH=0, etaAD=etaAD_cgs) +cfg.set_NonIdealMHD(sigma_mhd=0, sigma_u=0, etaO=0, etaH=0, etaAD=etaAD_cgs, alpha_B=0) cfg.set_boundary_periodic() # periodic boundaries in all directions cfg.set_eos_isothermal(cs) # isothermal equation of state cfg.print_status() @@ -233,6 +233,7 @@ def u_func(r): fig, axs = plt.subplots(1, 4, figsize=(12, 8)) axs[0].plot(times, Brmsz, "b-", linewidth=2) +axs[0].plot(time_th, theory, "r--", linewidth=2) axs[0].set_xlabel("Time (s)") axs[0].set_ylabel("rms Bz") axs[0].grid(alpha=0.3) diff --git a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp index a47263d542..794e28d475 100644 --- a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp @@ -40,11 +40,13 @@ struct shammodels::sph::MHDConfig { struct IdealMHD_constrained_hyper_para { Tscal sigma_mhd = 0.1; Tscal alpha_u = 1.; + Tscal alpha_B = 1.; }; struct NonIdealMHD { Tscal sigma_mhd = 0.1; Tscal alpha_u = 1.; + Tscal alpha_B = 1.; Tscal etaO = 1.; Tscal etaH = 1.; Tscal etaAD = 1.; @@ -102,9 +104,11 @@ struct shammodels::sph::MHDConfig { = std::get_if(&configMHD)) { logger::raw_ln(" Config MHD : Ideal MHD, constrained hyperbolic/parabolic treatment"); logger::raw_ln(" sigma_mhd =", v->sigma_mhd); + logger::raw_ln(" alpha_B =", v->alpha_B); } else if (NonIdealMHD *v = std::get_if(&configMHD)) { logger::raw_ln(" Config MHD Type : Non Ideal MHD"); logger::raw_ln(" sigma_mhd =", v->sigma_mhd); + logger::raw_ln(" alpha_B =", v->alpha_B); } else { shambase::throw_unimplemented(); } @@ -151,6 +155,7 @@ namespace shammodels::sph { {"mhd_type", "ideal_mhd_constrained_hyper_para"}, {"sigma_mhd", v->sigma_mhd}, {"alpha_u", v->alpha_u}, + {"alpha_B", v->alpha_B}, }; } else if (const NonIdealMHD *v = std::get_if(&p.configMHD)) { // Write the shear base, direction, and speed into the JSON object @@ -158,6 +163,7 @@ namespace shammodels::sph { {"mhd_type", "non_ideal_mhd"}, {"sigma_mhd", v->sigma_mhd}, {"alpha_u", v->alpha_u}, + {"alpha_B", v->alpha_B}, {"etaO", v->etaO}, {"etaH", v->etaH}, {"etaAD", v->etaAD}, @@ -200,12 +206,14 @@ namespace shammodels::sph { IMHD{ j.at("sigma_mhd").get(), j.at("alpha_u").get(), + j.at("alpha_B").get(), }); } else if (mhd_type == "non_ideal_mhd") { p.set( NonIdealMHD{ j.at("sigma_mhd").get(), j.at("alpha_u").get(), + j.at("alpha_B").get(), }); } else { shambase::throw_unimplemented("wtf !"); diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index c117dc4b4c..f0a580617a 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -310,6 +310,7 @@ namespace shamrock::sph::mhd { Tscal h_b, Tscal alpha_u, + Tscal alpha_B, Tvec B_a, Tvec B_b, @@ -446,8 +447,18 @@ namespace shamrock::sph::mhd { dWab_a * omega_a_rho_a_inv, dWab_b / (rho_b * omega_b)); - du_dt += lambda_artes( - pmass, rho_a_sq, rho_b * rho_b, vsig_B, B_a, B_b, omega_a, omega_b, Fab_a, Fab_b); + du_dt += alpha_B + * lambda_artes( + pmass, + rho_a_sq, + rho_b * rho_b, + vsig_B, + B_a, + B_b, + omega_a, + omega_b, + Fab_a, + Fab_b); // end du/dt terms @@ -473,7 +484,7 @@ namespace shamrock::sph::mhd { r_ab_unit * dWab_a, r_ab_unit * dWab_b); - dB_on_rho_dt += dB_on_rho_dissipation_term; + dB_on_rho_dt += alpha_B * dB_on_rho_dissipation_term; // end d(B/rho)/dt terms diff --git a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp index e8075eee96..93ff2a2fac 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp @@ -79,7 +79,7 @@ namespace shammodels::sph::modules { // One templated implementation, specialised per MHDType at the call sites below. template void update_derivs_MHD_impl( - Tscal sigma_mhd, Tscal alpha_u, Tscal etaO, Tscal etaH, Tscal etaAD); + Tscal sigma_mhd, Tscal alpha_u, Tscal alpha_B, Tscal etaO, Tscal etaH, Tscal etaAD); // Thin wrappers that unpack the variant and forward to the template above. void update_derivs_MHD(IdealMHD cfg); diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 81209fce44..a80ef43360 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -784,6 +784,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD( update_derivs_MHD_impl( cfg.sigma_mhd, cfg.alpha_u, + cfg.alpha_B, /*etaO=*/Tscal(0), /*etaH=*/Tscal(0), /*etaAD=*/Tscal(0)); @@ -792,13 +793,13 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD( template class SPHKernel> void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(NonIdealMHD cfg) { update_derivs_MHD_impl( - cfg.sigma_mhd, cfg.alpha_u, cfg.etaO, cfg.etaH, cfg.etaAD); + cfg.sigma_mhd, cfg.alpha_u, cfg.alpha_B, cfg.etaO, cfg.etaH, cfg.etaAD); } template class SPHKernel> template void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_impl( - Tscal sigma_mhd, Tscal alpha_u, Tscal etaO, Tscal etaH, Tscal etaAD) { + Tscal sigma_mhd, Tscal alpha_u, Tscal alpha_B, Tscal etaO, Tscal etaH, Tscal etaAD) { StackEntry stack_loc{}; @@ -935,6 +936,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ const Tscal pmass = solver_config.gpart_mass; const Tscal _sigma = sigma_mhd; const Tscal _alpha_u = alpha_u; + const Tscal _alpha_B = alpha_B; const Tscal _etaO = etaO; const Tscal _etaH = etaH; const Tscal _etaAD = etaAD; @@ -942,6 +944,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); shamlog_debug_sycl_ln("deriv kernel", "sigma_mhd :", _sigma); shamlog_debug_sycl_ln("deriv kernel", "alpha_u :", _alpha_u); + shamlog_debug_sycl_ln("deriv kernel", "alpha_B :", _alpha_B); shamlog_debug_sycl_ln("deriv kernel", "etaO :", _etaO); shamlog_debug_sycl_ln("deriv kernel", "etaH :", _etaH); shamlog_debug_sycl_ln("deriv kernel", "etaAD :", _etaAD); @@ -1043,6 +1046,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ h_a, h_b, _alpha_u, + _alpha_B, B_a, B_b, J_a, diff --git a/src/shammodels/sph/src/pySPHModel.cpp b/src/shammodels/sph/src/pySPHModel.cpp index 89d0d9313a..fb61e1e2c1 100644 --- a/src/shammodels/sph/src/pySPHModel.cpp +++ b/src/shammodels/sph/src/pySPHModel.cpp @@ -198,23 +198,31 @@ void add_instance(py::module &m, std::string name_config, std::string name_model py::arg("beta_AV")) .def( "set_IdealMHD", - [](TConfig &self, Tscal sigma_mhd, Tscal sigma_u) { - self.set_IdealMHD({sigma_mhd, sigma_u}); + [](TConfig &self, Tscal sigma_mhd, Tscal sigma_u, Tscal alpha_B) { + self.set_IdealMHD({sigma_mhd, sigma_u, alpha_B}); }, py::kw_only(), py::arg("sigma_mhd"), - py::arg("sigma_u")) + py::arg("sigma_u"), + py::arg("alpha_B") = 1.0) .def( "set_NonIdealMHD", - [](TConfig &self, Tscal sigma_mhd, Tscal sigma_u, Tscal etaO, Tscal etaH, Tscal etaAD) { - self.set_NonIdealMHD({sigma_mhd, sigma_u, etaO, etaH, etaAD}); + [](TConfig &self, + Tscal sigma_mhd, + Tscal sigma_u, + Tscal etaO, + Tscal etaH, + Tscal etaAD, + Tscal alpha_B) { + self.set_NonIdealMHD({sigma_mhd, sigma_u, alpha_B, etaO, etaH, etaAD}); }, py::kw_only(), py::arg("sigma_mhd"), py::arg("sigma_u"), py::arg("etaO"), py::arg("etaH"), - py::arg("etaAD")) + py::arg("etaAD"), + py::arg("alpha_B") = 1.0) .def( "set_self_gravity_none", [](TConfig &self) { From 6576b368148ebfda53660cdd4a7d8eef82ac85b7 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 24 Sep 2026 17:35:58 +0200 Subject: [PATCH 41/54] add L2 error computation --- examples/sph/run_mhd_wavedamping.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/examples/sph/run_mhd_wavedamping.py b/examples/sph/run_mhd_wavedamping.py index 1e0dbf83a5..8954ec2501 100644 --- a/examples/sph/run_mhd_wavedamping.py +++ b/examples/sph/run_mhd_wavedamping.py @@ -40,7 +40,7 @@ C_ADc = 0.01 # ambipolar diffusion coefficient (Phantom convention) cs = 1.0 # isothermal sound speed t_target = 5.0 # total simulation time -dt_dump = 0.01 * t_target # dump interval +dt_dump = 0.01 # dump interval # Unit system and constants codeu = shamrock.UnitSystem( @@ -227,9 +227,30 @@ def u_func(r): time_th = np.linspace(0, t_target, 1000) theory = h0 * np.abs(np.sin(omegaR * time_th)) * np.exp(omegaI * time_th) +# %% +# L2 error against the analytical solution +# Evaluated at the simulation dump times (dt=0.01, same interval as Phantom's, see Phantom paper section 5.7.1). +theory_at_times = h0 * np.abs(np.sin(omegaR * times)) * np.exp(omegaI * times) +l2_error = np.sqrt(np.mean((Brmsz - theory_at_times) ** 2)) +print(f"L2 error (rms Bz vs theory, dt={dt_dump}) = {l2_error:.3e}") + +np.savez( + os.path.join(dump_folder, "wave_damping_data.npz"), + times=times, + Brmsx=Brmsx, + Brmsy=Brmsy, + Brmsz=Brmsz, + theory_at_times=theory_at_times, + l2_error=l2_error, + dr=dr, + omegaR=omegaR, + omegaI=omegaI, + h0=h0, +) + # %% # Plot results -# ------------ + fig, axs = plt.subplots(1, 4, figsize=(12, 8)) axs[0].plot(times, Brmsz, "b-", linewidth=2) From eec8b7b3d9250962898a7465384ce9f21ac04be8 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 24 Sep 2026 23:36:14 +0200 Subject: [PATCH 42/54] expose artificial viscosity parameters --- examples/sph/run_mhd_wavedamping.py | 4 +- .../shammodels/sph/config/MHDConfig.hpp | 16 ++++++++ .../sph/include/shammodels/sph/math/mhd.hpp | 6 ++- .../shammodels/sph/modules/UpdateDerivs.hpp | 9 ++++- .../sph/src/modules/UpdateDerivs.cpp | 40 ++++++++++++++----- src/shammodels/sph/src/pySPHModel.cpp | 24 ++++++++--- 6 files changed, 80 insertions(+), 19 deletions(-) diff --git a/examples/sph/run_mhd_wavedamping.py b/examples/sph/run_mhd_wavedamping.py index 8954ec2501..0113f3a3b0 100644 --- a/examples/sph/run_mhd_wavedamping.py +++ b/examples/sph/run_mhd_wavedamping.py @@ -72,7 +72,9 @@ cfg = model.gen_default_config() cfg.set_units(codeu) cfg.set_artif_viscosity_None() # no artificial viscosity -cfg.set_NonIdealMHD(sigma_mhd=0, sigma_u=0, etaO=0, etaH=0, etaAD=etaAD_cgs, alpha_B=0) +cfg.set_NonIdealMHD( + sigma_mhd=0, sigma_u=0, etaO=0, etaH=0, etaAD=etaAD_cgs, alpha_B=0, alpha_AV=0, beta_AV=0 +) cfg.set_boundary_periodic() # periodic boundaries in all directions cfg.set_eos_isothermal(cs) # isothermal equation of state cfg.print_status() diff --git a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp index 794e28d475..3fcbefea44 100644 --- a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp @@ -41,12 +41,16 @@ struct shammodels::sph::MHDConfig { Tscal sigma_mhd = 0.1; Tscal alpha_u = 1.; Tscal alpha_B = 1.; + Tscal alpha_AV = 1.; + Tscal beta_AV = 1.; }; struct NonIdealMHD { Tscal sigma_mhd = 0.1; Tscal alpha_u = 1.; Tscal alpha_B = 1.; + Tscal alpha_AV = 1.; + Tscal beta_AV = 1.; Tscal etaO = 1.; Tscal etaH = 1.; Tscal etaAD = 1.; @@ -105,10 +109,14 @@ struct shammodels::sph::MHDConfig { logger::raw_ln(" Config MHD : Ideal MHD, constrained hyperbolic/parabolic treatment"); logger::raw_ln(" sigma_mhd =", v->sigma_mhd); logger::raw_ln(" alpha_B =", v->alpha_B); + logger::raw_ln(" alpha_AV =", v->alpha_AV); + logger::raw_ln(" beta_AV =", v->beta_AV); } else if (NonIdealMHD *v = std::get_if(&configMHD)) { logger::raw_ln(" Config MHD Type : Non Ideal MHD"); logger::raw_ln(" sigma_mhd =", v->sigma_mhd); logger::raw_ln(" alpha_B =", v->alpha_B); + logger::raw_ln(" alpha_AV =", v->alpha_AV); + logger::raw_ln(" beta_AV =", v->beta_AV); } else { shambase::throw_unimplemented(); } @@ -156,6 +164,8 @@ namespace shammodels::sph { {"sigma_mhd", v->sigma_mhd}, {"alpha_u", v->alpha_u}, {"alpha_B", v->alpha_B}, + {"alpha_AV", v->alpha_AV}, + {"beta_AV", v->beta_AV}, }; } else if (const NonIdealMHD *v = std::get_if(&p.configMHD)) { // Write the shear base, direction, and speed into the JSON object @@ -164,6 +174,8 @@ namespace shammodels::sph { {"sigma_mhd", v->sigma_mhd}, {"alpha_u", v->alpha_u}, {"alpha_B", v->alpha_B}, + {"alpha_AV", v->alpha_AV}, + {"beta_AV", v->beta_AV}, {"etaO", v->etaO}, {"etaH", v->etaH}, {"etaAD", v->etaAD}, @@ -207,6 +219,8 @@ namespace shammodels::sph { j.at("sigma_mhd").get(), j.at("alpha_u").get(), j.at("alpha_B").get(), + j.at("alpha_AV").get(), + j.at("beta_AV").get(), }); } else if (mhd_type == "non_ideal_mhd") { p.set( @@ -214,6 +228,8 @@ namespace shammodels::sph { j.at("sigma_mhd").get(), j.at("alpha_u").get(), j.at("alpha_B").get(), + j.at("alpha_AV").get(), + j.at("beta_AV").get(), }); } else { shambase::throw_unimplemented("wtf !"); diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index f0a580617a..7ccc7ec3ee 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -311,6 +311,8 @@ namespace shamrock::sph::mhd { Tscal alpha_u, Tscal alpha_B, + Tscal alpha_AV, + Tscal beta_AV, Tvec B_a, Tvec B_b, @@ -355,9 +357,9 @@ namespace shamrock::sph::mhd { Tscal vsig_u = shamrock::sph::vsig_u(P_a, P_b, rho_a, rho_b); Tscal vsig_a = shamphys::MHD_physics::vsig_MHD( - v_ab, r_ab_unit, cs_a, B_a, rho_a, mu_0, 1., 1.); + v_ab, r_ab_unit, cs_a, B_a, rho_a, mu_0, alpha_AV, beta_AV); Tscal vsig_b = shamphys::MHD_physics::vsig_MHD( - v_ab, r_ab_unit, cs_a, B_b, rho_b, mu_0, 1., 1.); + v_ab, r_ab_unit, cs_a, B_b, rho_b, mu_0, alpha_AV, beta_AV); Tscal dWab_a = Fab_a; Tscal dWab_b = Fab_b; diff --git a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp index 93ff2a2fac..f357637993 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp @@ -79,7 +79,14 @@ namespace shammodels::sph::modules { // One templated implementation, specialised per MHDType at the call sites below. template void update_derivs_MHD_impl( - Tscal sigma_mhd, Tscal alpha_u, Tscal alpha_B, Tscal etaO, Tscal etaH, Tscal etaAD); + Tscal sigma_mhd, + Tscal alpha_u, + Tscal alpha_B, + Tscal alpha_AV, + Tscal beta_AV, + Tscal etaO, + Tscal etaH, + Tscal etaAD); // Thin wrappers that unpack the variant and forward to the template above. void update_derivs_MHD(IdealMHD cfg); diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index a80ef43360..256c10041e 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -785,6 +785,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD( cfg.sigma_mhd, cfg.alpha_u, cfg.alpha_B, + cfg.alpha_AV, + cfg.beta_AV, /*etaO=*/Tscal(0), /*etaH=*/Tscal(0), /*etaAD=*/Tscal(0)); @@ -793,13 +795,27 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD( template class SPHKernel> void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(NonIdealMHD cfg) { update_derivs_MHD_impl( - cfg.sigma_mhd, cfg.alpha_u, cfg.alpha_B, cfg.etaO, cfg.etaH, cfg.etaAD); + cfg.sigma_mhd, + cfg.alpha_u, + cfg.alpha_B, + cfg.alpha_AV, + cfg.beta_AV, + cfg.etaO, + cfg.etaH, + cfg.etaAD); } template class SPHKernel> template void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_impl( - Tscal sigma_mhd, Tscal alpha_u, Tscal alpha_B, Tscal etaO, Tscal etaH, Tscal etaAD) { + Tscal sigma_mhd, + Tscal alpha_u, + Tscal alpha_B, + Tscal alpha_AV, + Tscal beta_AV, + Tscal etaO, + Tscal etaH, + Tscal etaAD) { StackEntry stack_loc{}; @@ -933,18 +949,22 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ auto ploop_ptrs = pcache.get_read_access(depends_list); auto e = q.submit(depends_list, [&](sycl::handler &cgh) { - const Tscal pmass = solver_config.gpart_mass; - const Tscal _sigma = sigma_mhd; - const Tscal _alpha_u = alpha_u; - const Tscal _alpha_B = alpha_B; - const Tscal _etaO = etaO; - const Tscal _etaH = etaH; - const Tscal _etaAD = etaAD; + const Tscal pmass = solver_config.gpart_mass; + const Tscal _sigma = sigma_mhd; + const Tscal _alpha_u = alpha_u; + const Tscal _alpha_B = alpha_B; + const Tscal _alpha_AV = alpha_AV; + const Tscal _beta_AV = beta_AV; + const Tscal _etaO = etaO; + const Tscal _etaH = etaH; + const Tscal _etaAD = etaAD; shamlog_debug_ln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", ""); shamlog_debug_sycl_ln("deriv kernel", "sigma_mhd :", _sigma); shamlog_debug_sycl_ln("deriv kernel", "alpha_u :", _alpha_u); shamlog_debug_sycl_ln("deriv kernel", "alpha_B :", _alpha_B); + shamlog_debug_sycl_ln("deriv kernel", "alpha_AV :", _alpha_AV); + shamlog_debug_sycl_ln("deriv kernel", "beta_AV :", _beta_AV); shamlog_debug_sycl_ln("deriv kernel", "etaO :", _etaO); shamlog_debug_sycl_ln("deriv kernel", "etaH :", _etaH); shamlog_debug_sycl_ln("deriv kernel", "etaAD :", _etaAD); @@ -1047,6 +1067,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ h_b, _alpha_u, _alpha_B, + _alpha_AV, + _beta_AV, B_a, B_b, J_a, diff --git a/src/shammodels/sph/src/pySPHModel.cpp b/src/shammodels/sph/src/pySPHModel.cpp index fb61e1e2c1..981016a03f 100644 --- a/src/shammodels/sph/src/pySPHModel.cpp +++ b/src/shammodels/sph/src/pySPHModel.cpp @@ -198,13 +198,20 @@ void add_instance(py::module &m, std::string name_config, std::string name_model py::arg("beta_AV")) .def( "set_IdealMHD", - [](TConfig &self, Tscal sigma_mhd, Tscal sigma_u, Tscal alpha_B) { - self.set_IdealMHD({sigma_mhd, sigma_u, alpha_B}); + [](TConfig &self, + Tscal sigma_mhd, + Tscal sigma_u, + Tscal alpha_B, + Tscal alpha_AV, + Tscal beta_AV) { + self.set_IdealMHD({sigma_mhd, sigma_u, alpha_B, alpha_AV, beta_AV}); }, py::kw_only(), py::arg("sigma_mhd"), py::arg("sigma_u"), - py::arg("alpha_B") = 1.0) + py::arg("alpha_B") = 1.0, + py::arg("alpha_AV") = 1.0, + py::arg("beta_AV") = 1.0) .def( "set_NonIdealMHD", [](TConfig &self, @@ -213,8 +220,11 @@ void add_instance(py::module &m, std::string name_config, std::string name_model Tscal etaO, Tscal etaH, Tscal etaAD, - Tscal alpha_B) { - self.set_NonIdealMHD({sigma_mhd, sigma_u, alpha_B, etaO, etaH, etaAD}); + Tscal alpha_B, + Tscal alpha_AV, + Tscal beta_AV) { + self.set_NonIdealMHD( + {sigma_mhd, sigma_u, alpha_B, alpha_AV, beta_AV, etaO, etaH, etaAD}); }, py::kw_only(), py::arg("sigma_mhd"), @@ -222,7 +232,9 @@ void add_instance(py::module &m, std::string name_config, std::string name_model py::arg("etaO"), py::arg("etaH"), py::arg("etaAD"), - py::arg("alpha_B") = 1.0) + py::arg("alpha_B") = 1.0, + py::arg("alpha_AV") = 1.0, + py::arg("beta_AV") = 1.0) .def( "set_self_gravity_none", [](TConfig &self) { From 2f0876269f309f1221ff4c3aafb49d8c4a1e9ba1 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 24 Sep 2026 23:37:06 +0200 Subject: [PATCH 43/54] fix typo in vsig_b --- src/shammodels/sph/include/shammodels/sph/math/mhd.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 7ccc7ec3ee..f5464816d2 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -359,7 +359,7 @@ namespace shamrock::sph::mhd { Tscal vsig_a = shamphys::MHD_physics::vsig_MHD( v_ab, r_ab_unit, cs_a, B_a, rho_a, mu_0, alpha_AV, beta_AV); Tscal vsig_b = shamphys::MHD_physics::vsig_MHD( - v_ab, r_ab_unit, cs_a, B_b, rho_b, mu_0, alpha_AV, beta_AV); + v_ab, r_ab_unit, cs_b, B_b, rho_b, mu_0, alpha_AV, beta_AV); Tscal dWab_a = Fab_a; Tscal dWab_b = Fab_b; From 0865323c8d9be40821cf851f9f04365d8b7e5a06 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 24 Sep 2026 23:41:40 +0200 Subject: [PATCH 44/54] complete restart in NIMHD case --- src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp index 3fcbefea44..ff213179de 100644 --- a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp @@ -227,6 +227,9 @@ namespace shammodels::sph { NonIdealMHD{ j.at("sigma_mhd").get(), j.at("alpha_u").get(), + j.at("etaO").get(), + j.at("etaH").get(), + j.at("etaAD").get(), j.at("alpha_B").get(), j.at("alpha_AV").get(), j.at("beta_AV").get(), From 170e35877cdef37e8c62ca5f0e68ab93c01458b7 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 24 Sep 2026 23:42:38 +0200 Subject: [PATCH 45/54] fix sign of heating --- src/shammodels/sph/include/shammodels/sph/math/mhd.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index f5464816d2..1d2725b5f4 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -64,7 +64,7 @@ namespace shamrock::sph::mhd { // return (etaO * JdJ + etaAD * (JdJ - BdJBdJhat)) * sham::inv_sat_zero(rho); @ to check Tvec D = WursterD(B, J, etaO, etaH, etaAD); - return -sycl::dot(D, J) * sham::inv_sat_zero(rho); + return sycl::dot(D, J) * sham::inv_sat_zero(rho); } template From 1fae6e6061dfe64d0811c8debe852df8fcb562b7 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Thu, 24 Sep 2026 23:57:46 +0200 Subject: [PATCH 46/54] fix constants --- .../sph/include/shammodels/sph/math/mhd.hpp | 21 +++++++++++-------- .../shammodels/sph/modules/ComputeJ.hpp | 4 +--- src/shammodels/sph/src/Solver.cpp | 5 ++--- .../sph/src/modules/UpdateDerivs.cpp | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 1d2725b5f4..a940c2db4f 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -37,24 +37,27 @@ namespace shamrock::sph::mhd { inline Tvec MagCurrentJ_sum( Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0) { - // ajout 4pi /c + // J = curl(B)/mu_0 (mu_0 explicit, SI/Heaviside-Lorentz-like convention, not + // Gaussian-cgs 4*pi/c) return m_b * sham::inv_sat_zero(sub_fact_a) * sycl::cross(B_a - B_b, nabla_Wab_ha) / mu_0; // return {0., 0., 0.}; } template - inline Tvec WursterD(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD) { + inline Tvec WursterD(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD, Tscal mu_0) { - Tvec Bhat = B * sham::inv_sat_zero(sycl::length(B)); - Tvec D = etaO * J + etaH * sycl::cross(J, Bhat) - - etaAD * sycl::cross(sycl::cross(J, Bhat), Bhat); + Tvec Bhat = B * sham::inv_sat_zero(sycl::length(B)); + Tvec curlB = mu_0 * J; // diffusivities in L^2/T in any unit system + Tvec D = etaO * curlB + etaH * sycl::cross(curlB, Bhat) + - etaAD * sycl::cross(sycl::cross(curlB, Bhat), Bhat); return D; } template - inline Tscal u_NI_heating(Tvec B, Tvec J, Tscal rho, Tscal etaO, Tscal etaH, Tscal etaAD) { + inline Tscal u_NI_heating( + Tvec B, Tvec J, Tscal rho, Tscal etaO, Tscal etaH, Tscal etaAD, Tscal mu_0) { // return sycl::dot(D, J) * sham::inv_sat_zero(rho); // Tscal BdB = sycl::dot(B, B); @@ -63,7 +66,7 @@ namespace shamrock::sph::mhd { // Tscal BdJBdJhat = sham::inv_sat_zero(BdB) * BdJ * BdJ; // return (etaO * JdJ + etaAD * (JdJ - BdJBdJhat)) * sham::inv_sat_zero(rho); @ to check - Tvec D = WursterD(B, J, etaO, etaH, etaAD); + Tvec D = WursterD(B, J, etaO, etaH, etaAD, mu_0); return sycl::dot(D, J) * sham::inv_sat_zero(rho); } @@ -513,8 +516,8 @@ namespace shamrock::sph::mhd { // Non-ideal MHD terms if constexpr (MHD_mode == NonIdeal) { - Tvec D_a = WursterD(B_a, J_a, etaO, etaH, etaAD); - Tvec D_b = WursterD(B_b, J_b, etaO, etaH, etaAD); + Tvec D_a = WursterD(B_a, J_a, etaO, etaH, etaAD, mu_0); + Tvec D_b = WursterD(B_b, J_b, etaO, etaH, etaAD, mu_0); Tvec B_NI = B_NI_terms( D_a, diff --git a/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp b/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp index 6d8d1d50e4..60cf6b81d6 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/ComputeJ.hpp @@ -31,11 +31,9 @@ namespace shammodels::sph::modules { Tscal part_mass; Tscal mu_0; - Tscal c; public: - NodeComputeJ(Tscal part_mass, Tscal mu_0, Tscal c) - : part_mass(part_mass), mu_0(mu_0), c(c) {} + NodeComputeJ(Tscal part_mass, Tscal mu_0) : part_mass(part_mass), mu_0(mu_0) {} struct Edges { const shamrock::solvergraph::Indexes &part_counts; diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index fdba1f2515..7c8c999823 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1970,12 +1970,11 @@ void shammodels::sph::Solver::update_J() { B_on_rho_edge->set_refs(B_on_rho_refs); Tscal const mu_0 = solver_config.get_constant_mu_0(); - Tscal const c = solver_config.get_constant_c(); shambase::get_check_ref(storage.hpart_with_ghosts); shambase::get_check_ref(storage.MagCurrentJ); // use MagCurrenJ: on active particles (no gz) - modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0, c}; + modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0}; computeJ.set_edges( storage.part_counts, storage.neigh_cache, @@ -2729,7 +2728,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() // communicate needed fields (B,b, hb): done just before - // @@@ is this the correct hpsrt ? the one updated bu sph_prestep ? + // @@@ is this the correct hpart ? the one updated bu sph_prestep ? shambase::get_check_ref(storage.hpart_with_ghosts) .set_refs(storage.merged_xyzh.get() .template map>>( diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 256c10041e..8818150b96 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -1104,7 +1104,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ if (do_NIMHD) { // only add once per particle Tscal u_NI = shamrock::sph::mhd::u_NI_heating( - B_a, J_a, rho_a, etaO, etaH, etaAD); + B_a, J_a, rho_a, etaO, etaH, etaAD, mu_0); du[id_a] += u_NI; } From 19b562a047c0807f307d36a0cb5ee070245d1862 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 25 Sep 2026 00:06:08 +0200 Subject: [PATCH 47/54] get refreshed hpart --- src/shammodels/sph/src/Solver.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 7c8c999823..505c077e55 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1958,6 +1958,7 @@ void shammodels::sph::Solver::update_J() { shamrock::patch::PatchDataLayerLayout &ghost_layout = shambase::get_check_ref(storage.ghost_layout.get()); u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); + u32 ihpart_interf = ghost_layout.get_field_idx("hpart"); shamrock::solvergraph::DDPatchDataFieldRef B_on_rho_refs = {}; scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { @@ -1969,9 +1970,23 @@ void shammodels::sph::Solver::update_J() { B_on_rho_edge->set_refs(B_on_rho_refs); + // Use the "hpart" field of merged_patchdata_ghost (refreshed every corrector iteration by + // communicate_merge_ghosts_fields(), same as update_derivs) + std::shared_ptr> hpart_edge + = std::make_shared>("", ""); + + shamrock::solvergraph::DDPatchDataFieldRef hpart_refs = {}; + scheduler().for_each_patchdata_nonempty([&](const Patch p, PatchDataLayer &pdat) { + auto &field = storage.merged_patchdata_ghost.get() + .get(p.id_patch) + .template get_field(ihpart_interf); + hpart_refs.add_obj(p.id_patch, std::ref(field)); + }); + + hpart_edge->set_refs(hpart_refs); + Tscal const mu_0 = solver_config.get_constant_mu_0(); - shambase::get_check_ref(storage.hpart_with_ghosts); shambase::get_check_ref(storage.MagCurrentJ); // use MagCurrenJ: on active particles (no gz) modules::NodeComputeJ computeJ{solver_config.gpart_mass, mu_0}; @@ -1979,7 +1994,7 @@ void shammodels::sph::Solver::update_J() { storage.part_counts, storage.neigh_cache, storage.positions_with_ghosts, - storage.hpart_with_ghosts, + hpart_edge, storage.omega, B_on_rho_edge, storage.MagCurrentJ); From 216352e6143a2424f9959542376222ca76c4a763 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 25 Sep 2026 00:15:10 +0200 Subject: [PATCH 48/54] remove eftover from previous J computation --- src/shammodels/sph/src/Solver.cpp | 28 ------------------------- src/shammodels/sph/src/SolverConfig.cpp | 4 ---- 2 files changed, 32 deletions(-) diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 505c077e55..5465094bdf 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1691,7 +1691,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { bool has_B_field = solver_config.has_field_B_on_rho(); bool has_psi_field = solver_config.has_field_psi_on_ch(); - bool do_NIMHD = solver_config.do_NIMHD(); bool has_curlB_field = solver_config.has_field_curlB(); bool has_epsilon_field = solver_config.dust_config.has_epsilon_field(); bool has_deltav_field = solver_config.dust_config.has_deltav_field(); @@ -1710,7 +1709,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { const u32 iB_on_rho = (has_B_field) ? pdl.get_field_idx("B/rho") : 0; const u32 idB_on_rho = (has_B_field) ? pdl.get_field_idx("dB/rho") : 0; - const u32 iJ = (do_NIMHD) ? pdl.get_field_idx("J") : 0; const u32 ipsi_on_ch = (has_psi_field) ? pdl.get_field_idx("psi/ch") : 0; const u32 idpsi_on_ch = (has_psi_field) ? pdl.get_field_idx("dpsi/ch") : 0; const u32 icurlB = (has_curlB_field) ? pdl.get_field_idx("curlB") : 0; @@ -1745,7 +1743,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { const u32 iB_interf = (has_B_field) ? ghost_layout.get_field_idx("B/rho") : 0; const u32 ipsi_interf = (has_psi_field) ? ghost_layout.get_field_idx("psi/ch") : 0; const u32 icurlB_interf = (has_curlB_field) ? ghost_layout.get_field_idx("curlB") : 0; - const u32 iJ_interf = (do_NIMHD) ? ghost_layout.get_field_idx("J") : 0; const u32 iepsilon_interf = (has_epsilon_field) ? ghost_layout.get_field_idx("epsilon") : 0; @@ -1809,11 +1806,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { .append_subset_to(buf_idx, cnt, pdat.get_field(ipsi_interf)); } - if (do_NIMHD) { - sender_patch.get_field(iJ).append_subset_to( - buf_idx, cnt, pdat.get_field(iJ_interf)); - } - if (has_curlB_field) { sender_patch.get_field(icurlB).append_subset_to( buf_idx, cnt, pdat.get_field(icurlB_interf)); @@ -1896,10 +1888,6 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { .insert(pdat.get_field(ipsi_on_ch)); } - if (do_NIMHD) { - pdat_new.get_field(iJ_interf).insert(pdat.get_field(iJ)); - } - if (has_curlB_field) { pdat_new.get_field(icurlB_interf).insert(pdat.get_field(icurlB)); } @@ -2630,22 +2618,6 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() node_copy.evaluate(); } - if (do_NIMHD) { - // copy J from sched patch data to storage.MagCurrentJ - std::shared_ptr patchdatas - = std::make_shared( - "patchdata_layer_ref", "patchdata_layer_ref"); - - auto node_set_edge = scheduler().get_node_set_edge_patchdata_layer_refs(); - node_set_edge->set_edges(patchdatas); - node_set_edge->evaluate(); - - shamrock::solvergraph::CopyPatchDataFieldFromLayer node_copy( - scheduler().get_layout_ptr_old(), "J"); - node_copy.set_edges(patchdatas, storage.MagCurrentJ); - node_copy.evaluate(); - } - if (solver_config.has_field_dtdivv()) { if (solver_config.combined_dtdiv_divcurlv_compute) { diff --git a/src/shammodels/sph/src/SolverConfig.cpp b/src/shammodels/sph/src/SolverConfig.cpp index 9ae8b09c5c..5c5ec2dab4 100644 --- a/src/shammodels/sph/src/SolverConfig.cpp +++ b/src/shammodels/sph/src/SolverConfig.cpp @@ -151,10 +151,6 @@ namespace shammodels::sph { ghost_layout.add_field("psi/ch", 1); } - if (do_NIMHD()) { - ghost_layout.add_field("J", 1); // @@@ only for ni mhd - } - if (has_field_curlB()) { ghost_layout.add_field("curlB", 1); } From cdf2e182de091ae40b3816b73168b6db200eb00f Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 25 Sep 2026 00:22:21 +0200 Subject: [PATCH 49/54] remove useless import --- src/shammodels/sph/include/shammodels/sph/math/mhd.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index a940c2db4f..b2cae3c137 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -24,7 +24,6 @@ #include "shammodels/sph/SolverConfig.hpp" #include "shammodels/sph/math/forces.hpp" #include "shammodels/sph/math/q_ab.hpp" -#include "shammodels/sph/modules/SolverStorage.hpp" #include "shamphys/mhd.hpp" #include "shamunits/Constants.hpp" #include From 2122c9fc24e97da1b5618aa48be51fd037458a71 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 25 Sep 2026 00:55:26 +0200 Subject: [PATCH 50/54] add ci test --- .github/workflows/shamrock-acpp-phys-test.yml | 2 + examples/tests_ci/run_mhd_wavedamping.py | 186 ++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 examples/tests_ci/run_mhd_wavedamping.py diff --git a/.github/workflows/shamrock-acpp-phys-test.yml b/.github/workflows/shamrock-acpp-phys-test.yml index b8d38c2c78..9dc5ab9a4a 100644 --- a/.github/workflows/shamrock-acpp-phys-test.yml +++ b/.github/workflows/shamrock-acpp-phys-test.yml @@ -126,6 +126,8 @@ jobs: testfile: regression_godunov_soundwave_3d.py - worldsize: 1 testfile: run_sg_compare_error_sph.py + - worldsize: 1 + testfile: run_mhd_wavedamping.py - worldsize: 1 testfile: run_compare_shamrock_ph_disc.py - worldsize: 1 diff --git a/examples/tests_ci/run_mhd_wavedamping.py b/examples/tests_ci/run_mhd_wavedamping.py new file mode 100644 index 0000000000..1983b06330 --- /dev/null +++ b/examples/tests_ci/run_mhd_wavedamping.py @@ -0,0 +1,186 @@ +""" +Wave damping test for the non-ideal MHD ambipolar diffusion +================================================================ + +(Choi et al. 2009, Wurster, Price & Ayliffe 2014, Wurster, Price & Bate 2016 section 4.1) at the same +Resolution nx=128 as in the Phantom paper section 5.7.1. +""" + +import numpy as np + +import shamrock + +shamrock.enable_experimental_features() + +# If we use the shamrock executable to run this script instead of the python interpreter, +# we should not initialize the system as the shamrock executable needs to handle specific MPI logic +if not shamrock.sys.is_initialized(): + shamrock.change_loglevel(1) + shamrock.sys.init("0:0") + +# %% +# Parameters of the test (matches examples/sph/run_mhd_wavedamping.py / Phantom nx=128) + +L2_ERROR_THRESHOLD = 7.5e-5 + +Lx = 1.0 # box length +dr = 1 / 128 # particle spacing (nx=128, matching Phantom's benchmark resolution) +rho0 = 1.0 # initial density +Bx0 = 1.0 # background field in x +C_ADc = 0.01 # ambipolar diffusion coefficient (Phantom convention) +cs = 1.0 # isothermal sound speed +t_target = 5.0 # total simulation time +dt_dump = 0.01 # dump interval (matches Phantom's L2-error sampling interval) + +# Unit system chosen so that mu_0 = 1 exactly in code units +codeu = shamrock.UnitSystem( + unit_time=1.0, + unit_length=1.0, + unit_mass=1.2566370621219e-06, +) +ucte = shamrock.Constants(codeu) +mu_0 = ucte.mu_0() # = 1 in these units + +vA = Bx0 / np.sqrt(rho0) # Alfven speed +etaAD = C_ADc * vA * vA # ambipolar diffusivity + +if shamrock.sys.world_rank() == 0: + print(f"mu_0 = {mu_0}, vA = {vA:.3f}, etaAD = {etaAD:.3e}") + +# %% +# Create context and SPH model + +ctx = shamrock.Context() +ctx.pdata_layout_new() +model = shamrock.get_Model_SPH(context=ctx, vector_type="f64_3", sph_kernel="C4") + +# %% +# Set up simulation configuration +# All artificial dissipation terms are turned off (alpha_B, alpha_AV, beta_AV, sigma_mhd), +# matching Phantom's stated methodology for this test. + +cfg = model.gen_default_config() +cfg.set_units(codeu) +cfg.set_artif_viscosity_None() +cfg.set_NonIdealMHD( + sigma_mhd=0, sigma_u=0, etaO=0, etaH=0, etaAD=etaAD, alpha_B=0, alpha_AV=0, beta_AV=0 +) +cfg.set_boundary_periodic() +cfg.set_eos_isothermal(cs) +cfg.print_status() +model.set_solver_config(cfg) + +model.init_scheduler(int(1e6), 1) + +# %% +# Generate particle distribution in an FCC lattice + +bmin = (-Lx / 2.0, -np.sqrt(3) / 4.0 * Lx, -np.sqrt(6) / 4.0 * Lx) +bmax = (Lx / 2.0, np.sqrt(3) / 4.0 * Lx, np.sqrt(6) / 4.0 * Lx) + +bmin, bmax = model.get_ideal_fcc_box(dr, bmin, bmax) +xm, ym, zm = bmin +xM, yM, zM = bmax +Lx_actual = xM - xm + +model.resize_simulation_box(bmin, bmax) +model.add_cube_fcc_3d(dr, bmin, bmax) + +vol_b = (xM - xm) * (yM - ym) * (zM - zm) +totmass = rho0 * vol_b +pmass = model.total_mass_to_part_mass(totmass) +model.set_particle_mass(pmass) + +# %% +# Set initial conditions: background field in x, sinusoidal velocity perturbation in z. + +k = 2 * np.pi / Lx_actual +v0 = 0.01 * vA + + +def B_func(r): + return (Bx0, 0.0, 0.0) + + +def vel_func(r): + x, y, z = r + vz = v0 * np.sin(k * (x - xm)) + return (0.0, 0.0, vz) + + +def u_func(r): + return 0.0 + + +model.set_field_value_lambda_f64_3("B/rho", B_func) +model.set_field_value_lambda_f64_3("vxyz", vel_func) +model.set_field_value_lambda_f64("uint", u_func) + +model.set_cfl_cour(0.3) +model.set_cfl_force(0.25) + +# %% +# Time loop with data collection + +times = [] +Brmsz = [] + +t_sum = 0.0 +next_dt_target = t_sum + dt_dump + +while next_dt_target <= t_target + 1e-12: + model.evolve_until(next_dt_target) + t_now = model.get_time() + + data = ctx.collect_data() + h_arr = data["hpart"] + hfac = model.get_hfact() + rho = pmass * (hfac / h_arr) * (hfac / h_arr) * (hfac / h_arr) + Bz = data["B/rho"][:, 2] * rho + + rms_z = np.sqrt(np.mean(Bz**2)) + + times.append(t_now) + Brmsz.append(rms_z) + + if shamrock.sys.world_rank() == 0: + print(f"t = {t_now:.3f}, rms Bz = {rms_z:.5f}") + + next_dt_target += dt_dump + +times = np.array(times) +Brmsz = np.array(Brmsz) + +# %% +# Analytical solution (damped Alfven wave dispersion relation, see +# examples/sph/run_mhd_wavedamping.py for the full derivation) + +k = 2 * np.pi / Lx_actual +quadb = k**2 * etaAD +quadc = -((k * vA) ** 2) +omegaI = -0.5 * quadb +omegaR = 0.5 * np.sqrt(-(quadb**2) - 4 * quadc) +h0 = v0 * Bx0 / (vA * np.sqrt(2.0)) + +if shamrock.sys.world_rank() == 0: + print(f"omegaR = {omegaR:.4f}, omegaI = {omegaI:.4f}, h0 = {h0:.4f}") + +theory_at_times = h0 * np.abs(np.sin(omegaR * times)) * np.exp(omegaI * times) +l2_error = np.sqrt(np.mean((Brmsz - theory_at_times) ** 2)) + +if shamrock.sys.world_rank() == 0: + print(f"L2 error (rms Bz vs theory) = {l2_error:.3e} (threshold = {L2_ERROR_THRESHOLD:.3e})") + +# %% +# Check the L2 error against Phantom's published benchmark threshold + +to_raise = [] + +if l2_error > L2_ERROR_THRESHOLD: + to_raise.append( + f"L2 error of rms Bz vs analytical solution is out of tolerance: " + f"{l2_error:.3e} > {L2_ERROR_THRESHOLD:.3e}" + ) + +for to_raise_item in to_raise: + raise ValueError(to_raise_item) From 1c998679e6b5d631f6943b86cb54c36e728daa89 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 25 Sep 2026 16:26:31 +0200 Subject: [PATCH 51/54] fix horrendous default buf val + remove comment --- src/shammodels/sph/src/Solver.cpp | 2 +- src/shammodels/sph/src/modules/UpdateDerivs.cpp | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index 4204812a4c..fc2fe00bc4 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -2681,7 +2681,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() } // communicate fields - communicate_merge_ghosts_fields(); // is hpart_with_ghosts populated ? + communicate_merge_ghosts_fields(); if (solver_config.has_field_alphaAV()) { diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 8818150b96..3573c8523b 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -888,9 +888,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ = mpdat.get_field_buf_ref(ipsi_on_ch_interf); bool do_NIMHD = solver_config.do_NIMHD(); - sham::DeviceBuffer &buf_J - = (do_NIMHD) ? storage.MagCurrentJ_ghost.get().get(cur_p.id_patch).get_buf() - : pdat.get_field_buf_ref(idB_on_rho); + sham::DeviceBuffer *buf_J + = (do_NIMHD) ? &storage.MagCurrentJ_ghost.get().get(cur_p.id_patch).get_buf() : nullptr; tree::ObjectCache &pcache = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); @@ -912,7 +911,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ auto dB_on_rho = buf_dB_on_rho.get_write_access(depends_list); auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list); auto drho_dt = buf_drho_dt.get_write_access(depends_list); - auto J_field = (do_NIMHD) ? buf_J.get_read_access(depends_list) : nullptr; + auto J_field = (do_NIMHD) ? buf_J->get_read_access(depends_list) : nullptr; Tvec *mag_pressure = (do_MHD_debug) @@ -1136,7 +1135,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ buf_drho_dt.complete_event_state(e); if (do_NIMHD) { - buf_J.complete_event_state(e); + buf_J->complete_event_state(e); } buf_uint.complete_event_state(e); From 1741371e4fb19b0fb7f81dec315f64176dc74d7e Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 25 Sep 2026 16:52:20 +0200 Subject: [PATCH 52/54] Accept ugliness. Remove warnings. --- .../sph/include/shammodels/sph/Solver.hpp | 4 +- .../include/shammodels/sph/SolverConfig.hpp | 16 ++--- .../shammodels/sph/config/MHDConfig.hpp | 30 ++++---- .../sph/include/shammodels/sph/math/mhd.hpp | 56 +++++++-------- .../shammodels/sph/modules/UpdateDerivs.hpp | 16 ++--- src/shammodels/sph/src/Solver.cpp | 70 +++++++++---------- src/shammodels/sph/src/SolverConfig.cpp | 6 +- src/shammodels/sph/src/modules/ComputeJ.cpp | 6 +- .../sph/src/modules/ConservativeCheck.cpp | 10 +-- .../sph/src/modules/UpdateDerivs.cpp | 36 +++++----- src/shammodels/sph/src/pySPHModel.cpp | 4 +- 11 files changed, 127 insertions(+), 127 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/Solver.hpp b/src/shammodels/sph/include/shammodels/sph/Solver.hpp index c5c27bd1fc..582e896688 100644 --- a/src/shammodels/sph/include/shammodels/sph/Solver.hpp +++ b/src/shammodels/sph/include/shammodels/sph/Solver.hpp @@ -158,7 +158,7 @@ namespace shammodels::sph { using Cfg_MHD = typename Config::MHDConfig; using NoneMHD = typename Cfg_MHD::None; - using IdealMHD = typename Cfg_MHD::IdealMHD_constrained_hyper_para; + using IdealMHD = typename Cfg_MHD::IdealMhdConstrainedHyperPara; using NonIdealMHD = typename Cfg_MHD::NonIdealMHD; using u_morton = typename Config::u_morton; @@ -329,7 +329,7 @@ namespace shammodels::sph { void update_artificial_viscosity(Tscal dt); /// @brief Updates the magnetic current field (for NIMHD) - void update_J(); + void update_j(); /// @brief Initializes data layout for ghost particle fields void init_ghost_layout(); diff --git a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp index bb62aaa8eb..1956b1235b 100644 --- a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp @@ -657,11 +657,11 @@ struct shammodels::sph::SolverConfig { } /// Enable the ideal MHD hydro solver - inline void set_IdealMHD(typename MHDConfig::IdealMHD_constrained_hyper_para v) { + inline void set_IdealMHD(typename MHDConfig::IdealMhdConstrainedHyperPara v) { mhd_config.set(v); } - inline void set_NonIdealMHD(typename MHDConfig::NonIdealMHD v) { + inline void set_non_ideal_mhd(typename MHDConfig::NonIdealMHD v) { logger::raw_ln("$DANGER$DANGER$DANGER$DANGER$DANGER$DANGER$DANGER$DANGER$"); logger::raw_ln(" ______ _______ __ _ _______ _______ ______ "); logger::raw_ln("| | | _ || | | || || || _ | "); @@ -1144,22 +1144,22 @@ struct shammodels::sph::SolverConfig { } /// @brief Whether the solver is set for non ideal MHD - inline bool do_NIMHD() { return mhd_config.do_NIMHD(); } + inline bool do_nimhd() { return mhd_config.do_nimhd(); } /// @brief Whether the solver has a field for B_on_rho - inline bool has_field_B_on_rho() { return mhd_config.has_B_field() && (dim == 3); } + inline bool has_field_b_on_rho() { return mhd_config.has_b_field() && (dim == 3); } /// @brief Whether the solver has a field for psi_on_ch inline bool has_field_psi_on_ch() { return mhd_config.has_psi_field(); } /// @brief Whether the solver has a field for divB - inline bool has_field_divB() { return mhd_config.has_divB_field(); } + inline bool has_field_divB() { return mhd_config.has_div_b_field(); } /// @brief Whether the solver has a field for curlB - inline bool has_field_curlB() { return mhd_config.has_curlB_field() && (dim == 3); } + inline bool has_field_curlB() { return mhd_config.has_curl_b_field() && (dim == 3); } /// @brief Whether the solver has a field for dt divB - inline bool has_field_dtdivB() { return mhd_config.has_dtdivB_field(); } + inline bool has_field_dtdivB() { return mhd_config.has_dtdiv_b_field(); } /// @brief Whether to store luminosity bool compute_luminosity = false; @@ -1200,7 +1200,7 @@ struct shammodels::sph::SolverConfig { "Self gravity is experimental, please enable experimental features to use it"); } - if (mhd_config.do_NIMHD()) { + if (mhd_config.do_nimhd()) { shamrock::experimental_feature_check( "Non-ideal MHD is experimental, please enable experimental features to use it"); } diff --git a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp index ff213179de..599a30be59 100644 --- a/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/config/MHDConfig.hpp @@ -37,7 +37,7 @@ struct shammodels::sph::MHDConfig { struct None {}; - struct IdealMHD_constrained_hyper_para { + struct IdealMhdConstrainedHyperPara { Tscal sigma_mhd = 0.1; Tscal alpha_u = 1.; Tscal alpha_B = 1.; @@ -60,40 +60,40 @@ struct shammodels::sph::MHDConfig { // a) do everything right // b) forget to add the state to the variant //-> question your life choices - using Variant = std::variant; + using Variant = std::variant; Variant configMHD = None{}; void set(Variant v) { configMHD = v; } - inline bool do_NIMHD() { + inline bool do_nimhd() { bool is_NIMHD = bool(std::get_if(&configMHD)); return is_NIMHD; } - inline bool has_B_field() { - bool is_B = bool(std::get_if(&configMHD)) + inline bool has_b_field() { + bool is_B = bool(std::get_if(&configMHD)) || bool(std::get_if(&configMHD)); return is_B; } inline bool has_psi_field() { - bool is_psi = bool(std::get_if(&configMHD)) + bool is_psi = bool(std::get_if(&configMHD)) || bool(std::get_if(&configMHD)); return is_psi; } - inline bool has_divB_field() { - bool is_divB = bool(std::get_if(&configMHD)); + inline bool has_div_b_field() { + bool is_divB = bool(std::get_if(&configMHD)); return is_divB; } - inline bool has_curlB_field() { + inline bool has_curl_b_field() { bool is_curlB = bool(std::get_if(&configMHD)); return is_curlB; } - inline bool has_dtdivB_field() { + inline bool has_dtdiv_b_field() { bool is_dtdivB = bool(std::get_if(&configMHD)); return is_dtdivB; } @@ -104,8 +104,8 @@ struct shammodels::sph::MHDConfig { if (None *v = std::get_if(&configMHD)) { logger::raw_ln(" Config MHD Type : None (No MHD)"); } else if ( - IdealMHD_constrained_hyper_para *v - = std::get_if(&configMHD)) { + IdealMhdConstrainedHyperPara *v + = std::get_if(&configMHD)) { logger::raw_ln(" Config MHD : Ideal MHD, constrained hyperbolic/parabolic treatment"); logger::raw_ln(" sigma_mhd =", v->sigma_mhd); logger::raw_ln(" alpha_B =", v->alpha_B); @@ -128,7 +128,7 @@ struct shammodels::sph::MHDConfig { inline void check_config() { - if (do_NIMHD()) { + if (do_nimhd()) { if (!shamrock::are_experimental_features_allowed()) { shambase::throw_with_loc("Non Ideal MHD is experimental"); @@ -150,7 +150,7 @@ namespace shammodels::sph { using T = MHDConfig; using None = typename T::None; - using IMHD = typename T::IdealMHD_constrained_hyper_para; + using IMHD = typename T::IdealMhdConstrainedHyperPara; using NonIdealMHD = typename T::NonIdealMHD; // Write the configMHD type into the JSON object @@ -207,7 +207,7 @@ namespace shammodels::sph { j.at("mhd_type").get_to(mhd_type); using None = typename T::None; - using IMHD = typename T::IdealMHD_constrained_hyper_para; + using IMHD = typename T::IdealMhdConstrainedHyperPara; using NonIdealMHD = typename T::NonIdealMHD; // Set the BCConfig based on the configMHD type diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index b2cae3c137..8d70c7f3aa 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -32,8 +32,8 @@ namespace shamrock::sph::mhd { enum MHDType { Ideal = 0, NonIdeal = 1 }; - template - inline Tvec MagCurrentJ_sum( + template + inline Tvec mag_current_j_sum( Tscal m_b, Tvec B_a, Tvec B_b, Tvec nabla_Wab_ha, Tscal sub_fact_a, Tscal mu_0) { // J = curl(B)/mu_0 (mu_0 explicit, SI/Heaviside-Lorentz-like convention, not @@ -43,8 +43,8 @@ namespace shamrock::sph::mhd { // return {0., 0., 0.}; } - template - inline Tvec WursterD(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD, Tscal mu_0) { + template + inline Tvec wurster_d(Tvec B, Tvec J, Tscal etaO, Tscal etaH, Tscal etaAD, Tscal mu_0) { Tvec Bhat = B * sham::inv_sat_zero(sycl::length(B)); Tvec curlB = mu_0 * J; // diffusivities in L^2/T in any unit system @@ -54,8 +54,8 @@ namespace shamrock::sph::mhd { return D; } - template - inline Tscal u_NI_heating( + template + inline Tscal u_ni_heating( Tvec B, Tvec J, Tscal rho, Tscal etaO, Tscal etaH, Tscal etaAD, Tscal mu_0) { // return sycl::dot(D, J) * sham::inv_sat_zero(rho); @@ -65,12 +65,12 @@ namespace shamrock::sph::mhd { // Tscal BdJBdJhat = sham::inv_sat_zero(BdB) * BdJ * BdJ; // return (etaO * JdJ + etaAD * (JdJ - BdJBdJhat)) * sham::inv_sat_zero(rho); @ to check - Tvec D = WursterD(B, J, etaO, etaH, etaAD, mu_0); + Tvec D = wurster_d(B, J, etaO, etaH, etaAD, mu_0); return sycl::dot(D, J) * sham::inv_sat_zero(rho); } - template - inline Tvec B_NI_terms( + template + inline Tvec b_ni_terms( Tvec D_a, Tvec D_b, Tscal m_b, @@ -89,9 +89,9 @@ namespace shamrock::sph::mhd { return m_b * (acc_a + acc_b); } - // not using Whurster D, developping with J. Equivalent to B_NI_terms - template - inline Tvec B_NI_AD( + // not using Whurster D, developping with J. Equivalent to b_ni_terms + template + inline Tvec b_ni_ad( Tscal eta_AD, Tvec J_a, Tvec J_b, @@ -123,7 +123,7 @@ namespace shamrock::sph::mhd { // mag tension form the Tricco 2023 formula template - inline Tvec B_dot_grad_W( + inline Tvec b_dot_grad_w( Tscal m_b, Tscal rho_a_sq, Tscal rho_b_sq, @@ -148,7 +148,7 @@ namespace shamrock::sph::mhd { } // from the Phantom paper formula - template + template inline Tvec mag_tension( Tscal m_b, Tvec B_a, @@ -177,7 +177,7 @@ namespace shamrock::sph::mhd { return magnetic_tension_term; } - template + template inline Tvec fdivB( Tscal m_b, Tvec B_a, @@ -219,7 +219,7 @@ namespace shamrock::sph::mhd { return artres; } - template + template inline Tscal dB_on_rho_induction_term( Tscal m_b, Tscal rho_a_sq, Tvec B_a, Tscal omega_a, Tvec nabla_Wab_ha) { @@ -230,7 +230,7 @@ namespace shamrock::sph::mhd { return induction_term_no_vab; } - template + template inline Tvec dB_on_rho_psi_term( Tscal m_b, Tscal rho_a_sq, @@ -253,7 +253,7 @@ namespace shamrock::sph::mhd { return psiterm; } - template + template inline Tscal dpsi_on_ch_parabolic_propag( Tscal m_b, Tscal rho_a, Tvec B_a, Tvec B_b, Tscal omega_a, Tvec nabla_Wab_ha, Tscal ch_a) { @@ -268,7 +268,7 @@ namespace shamrock::sph::mhd { return parabolic_propag; } - template + template inline Tscal dpsi_on_ch_parabolic_diff( Tscal m_b, Tscal rho_a, @@ -286,7 +286,7 @@ namespace shamrock::sph::mhd { return parabolic_diff; } - template + template inline void add_to_derivs_spmhd( Tscal pmass, Tvec dr, @@ -403,7 +403,7 @@ namespace shamrock::sph::mhd { r_ab_unit * dWab_a, r_ab_unit * dWab_b); - sum_mag_tension += -B_dot_grad_W( + sum_mag_tension += -b_dot_grad_w( pmass, rho_a_sq, rho_b * rho_b, @@ -513,12 +513,12 @@ namespace shamrock::sph::mhd { drho_dt += (1. / omega_a) * pmass * sycl::dot(v_ab, r_ab_unit * dWab_a); // Non-ideal MHD terms - if constexpr (MHD_mode == NonIdeal) { + if constexpr (mhd_mode == NonIdeal) { - Tvec D_a = WursterD(B_a, J_a, etaO, etaH, etaAD, mu_0); - Tvec D_b = WursterD(B_b, J_b, etaO, etaH, etaAD, mu_0); + Tvec D_a = wurster_d(B_a, J_a, etaO, etaH, etaAD, mu_0); + Tvec D_b = wurster_d(B_b, J_b, etaO, etaH, etaAD, mu_0); - Tvec B_NI = B_NI_terms( + Tvec B_NI = b_ni_terms( D_a, D_b, pmass, @@ -531,7 +531,7 @@ namespace shamrock::sph::mhd { dB_on_rho_dt += B_NI; - // Tvec B_NI_ADterm = B_NI_AD( + // Tvec B_NI_ADterm = b_ni_ad( // etaAD, // J_a, // J_b, @@ -547,8 +547,8 @@ namespace shamrock::sph::mhd { // dB_on_rho_dt += B_NI_ADterm; - // Tscal u_NI = u_NI_heating(B_a, J_a, rho_a, etaO, etaAD) * 0.5 - // + u_NI_heating(B_b, J_b, rho_b, etaO, etaAD) * + // Tscal u_NI = u_ni_heating(B_a, J_a, rho_a, etaO, etaAD) * 0.5 + // + u_ni_heating(B_b, J_b, rho_b, etaO, etaAD) * // 0.5; } } diff --git a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp index f357637993..6e66e95cae 100644 --- a/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp +++ b/src/shammodels/sph/include/shammodels/sph/modules/UpdateDerivs.hpp @@ -69,16 +69,16 @@ namespace shammodels::sph::modules { using Cfg_MHD = typename Config::MHDConfig; using NoneMHD = typename Cfg_MHD::None; - using IdealMHD = typename Cfg_MHD::IdealMHD_constrained_hyper_para; + using IdealMHD = typename Cfg_MHD::IdealMhdConstrainedHyperPara; using NonIdealMHD = typename Cfg_MHD::NonIdealMHD; - template - void compute_J(Tscal mu_0); + template + void compute_j(Tscal mu_0); - // void update_derivs_MHD(Cfg_MHD cfg); + // void update_derivs_mhd(Cfg_MHD cfg); // One templated implementation, specialised per MHDType at the call sites below. - template - void update_derivs_MHD_impl( + template + void update_derivs_mhd_impl( Tscal sigma_mhd, Tscal alpha_u, Tscal alpha_B, @@ -89,8 +89,8 @@ namespace shammodels::sph::modules { Tscal etaAD); // Thin wrappers that unpack the variant and forward to the template above. - void update_derivs_MHD(IdealMHD cfg); - void update_derivs_MHD(NonIdealMHD cfg); + void update_derivs_mhd(IdealMHD cfg); + void update_derivs_mhd(NonIdealMHD cfg); }; } // namespace shammodels::sph::modules diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index fc2fe00bc4..d939ee79c6 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -269,7 +269,7 @@ void shammodels::sph::Solver::init_solver_graph() { auto &sync_data = sched.synchronized_data; shamrock::patch::PatchDataLayerLayout &pdl = scheduler().pdl_old(); - bool has_B_field = solver_config.has_field_B_on_rho(); + bool has_b_field = solver_config.has_field_b_on_rho(); bool has_psi_field = solver_config.has_field_psi_on_ch(); bool has_epsilon_field = solver_config.dust_config.has_epsilon_field(); bool has_deltav_field = solver_config.dust_config.has_deltav_field(); @@ -293,7 +293,7 @@ void shammodels::sph::Solver::init_solver_graph() { solver_graph.register_edge("duint", FieldRefs("duint", "du_{\\rm int}")); solver_graph.register_edge("hpart", FieldRefs("hpart", "h_{\\rm part}")); - if (has_B_field) { + if (has_b_field) { solver_graph.register_edge("B/rho", FieldRefs("B/rho", "B_{\\rho}")); solver_graph.register_edge("dB/rho", FieldRefs("dB/rho", "dB_{\\rho}")); } @@ -418,7 +418,7 @@ void shammodels::sph::Solver::init_solver_graph() { attach_field_sequence.push_back(attach_hpart); } - if (has_B_field) { + if (has_b_field) { auto attach_B_on_rho = solver_graph.register_node( "attach_B_on_rho", GetFieldRefFromLayer(pdl, "B/rho")); shambase::get_check_ref(attach_B_on_rho) @@ -428,7 +428,7 @@ void shammodels::sph::Solver::init_solver_graph() { attach_field_sequence.push_back(attach_B_on_rho); } - if (has_B_field) { + if (has_b_field) { auto attach_dB_on_rho = solver_graph.register_node( "attach_dB_on_rho", GetFieldRefFromLayer(pdl, "dB/rho")); shambase::get_check_ref(attach_dB_on_rho) @@ -555,7 +555,7 @@ void shammodels::sph::Solver::init_solver_graph() { half_step_sequence.push_back(half_step_uint); } - if (has_B_field) { + if (has_b_field) { auto half_step_B_on_rho = solver_graph.register_node( prefix + "_B_on_rho", shammodels::common::modules::ForwardEuler{}); shambase::get_check_ref(half_step_B_on_rho) @@ -1935,9 +1935,9 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { bool has_alphaAV_field = solver_config.has_field_alphaAV(); bool has_soundspeed_field = solver_config.ghost_has_soundspeed(); - bool has_B_field = solver_config.has_field_B_on_rho(); + bool has_b_field = solver_config.has_field_b_on_rho(); bool has_psi_field = solver_config.has_field_psi_on_ch(); - bool has_curlB_field = solver_config.has_field_curlB(); + bool has_curl_b_field = solver_config.has_field_curlB(); bool has_epsilon_field = solver_config.dust_config.has_epsilon_field(); bool has_deltav_field = solver_config.dust_config.has_deltav_field(); bool has_s_j_field = solver_config.dust_config.has_s_j_field(); @@ -1953,11 +1953,11 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { const u32 ialpha_AV = (has_alphaAV_field) ? pdl.get_field_idx("alpha_AV") : 0; const u32 isoundspeed = (has_soundspeed_field) ? pdl.get_field_idx("soundspeed") : 0; - const u32 iB_on_rho = (has_B_field) ? pdl.get_field_idx("B/rho") : 0; - const u32 idB_on_rho = (has_B_field) ? pdl.get_field_idx("dB/rho") : 0; + const u32 iB_on_rho = (has_b_field) ? pdl.get_field_idx("B/rho") : 0; + const u32 idB_on_rho = (has_b_field) ? pdl.get_field_idx("dB/rho") : 0; const u32 ipsi_on_ch = (has_psi_field) ? pdl.get_field_idx("psi/ch") : 0; const u32 idpsi_on_ch = (has_psi_field) ? pdl.get_field_idx("dpsi/ch") : 0; - const u32 icurlB = (has_curlB_field) ? pdl.get_field_idx("curlB") : 0; + const u32 icurlB = (has_curl_b_field) ? pdl.get_field_idx("curlB") : 0; bool do_MHD_debug = solver_config.do_MHD_debug(); const u32 imag_pressure = (do_MHD_debug) ? pdl.get_field_idx("mag_pressure") : -1; @@ -1986,9 +1986,9 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { const u32 isoundspeed_interf = (has_soundspeed_field) ? ghost_layout.get_field_idx("soundspeed") : 0; - const u32 iB_interf = (has_B_field) ? ghost_layout.get_field_idx("B/rho") : 0; + const u32 iB_interf = (has_b_field) ? ghost_layout.get_field_idx("B/rho") : 0; const u32 ipsi_interf = (has_psi_field) ? ghost_layout.get_field_idx("psi/ch") : 0; - const u32 icurlB_interf = (has_curlB_field) ? ghost_layout.get_field_idx("curlB") : 0; + const u32 icurlB_interf = (has_curl_b_field) ? ghost_layout.get_field_idx("curlB") : 0; const u32 iepsilon_interf = (has_epsilon_field) ? ghost_layout.get_field_idx("epsilon") : 0; @@ -2042,7 +2042,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { .append_subset_to(buf_idx, cnt, pdat.get_field(isoundspeed_interf)); } - if (has_B_field) { + if (has_b_field) { sender_patch.get_field(iB_on_rho).append_subset_to( buf_idx, cnt, pdat.get_field(iB_interf)); } @@ -2052,7 +2052,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { .append_subset_to(buf_idx, cnt, pdat.get_field(ipsi_interf)); } - if (has_curlB_field) { + if (has_curl_b_field) { sender_patch.get_field(icurlB).append_subset_to( buf_idx, cnt, pdat.get_field(icurlB_interf)); } @@ -2125,7 +2125,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { .insert(pdat.get_field(isoundspeed)); } - if (has_B_field) { + if (has_b_field) { pdat_new.get_field(iB_interf).insert(pdat.get_field(iB_on_rho)); } @@ -2134,7 +2134,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { .insert(pdat.get_field(ipsi_on_ch)); } - if (has_curlB_field) { + if (has_curl_b_field) { pdat_new.get_field(icurlB_interf).insert(pdat.get_field(icurlB)); } @@ -2180,7 +2180,7 @@ void shammodels::sph::Solver::update_artificial_viscosity(Tscal dt) } template class Kern> -void shammodels::sph::Solver::update_J() { +void shammodels::sph::Solver::update_j() { using namespace shamrock::patch; PatchDataLayerLayout &pdl = scheduler().pdl_old(); @@ -2262,7 +2262,7 @@ void shammodels::sph::Solver::prepare_corrector() { shamrock::SchedulerUtility utility(scheduler()); PatchDataLayerLayout &pdl = scheduler().pdl_old(); - bool has_B_field = solver_config.has_field_B_on_rho(); + bool has_b_field = solver_config.has_field_b_on_rho(); bool has_psi_field = solver_config.has_field_psi_on_ch(); bool has_epsilon_field = solver_config.dust_config.has_epsilon_field(); bool has_deltav_field = solver_config.dust_config.has_deltav_field(); @@ -2270,14 +2270,14 @@ void shammodels::sph::Solver::prepare_corrector() { const u32 iduint = pdl.get_field_idx("duint"); const u32 iaxyz = pdl.get_field_idx("axyz"); - const u32 idB_on_rho = (has_B_field) ? pdl.get_field_idx("dB/rho") : 0; + const u32 idB_on_rho = (has_b_field) ? pdl.get_field_idx("dB/rho") : 0; const u32 idpsi_on_ch = (has_psi_field) ? pdl.get_field_idx("dpsi/ch") : 0; shamlog_debug_ln("sph::BasicGas", "save old fields"); storage.old_axyz.set(utility.save_field(iaxyz, "axyz_old")); storage.old_duint.set(utility.save_field(iduint, "duint_old")); - if (has_B_field) { + if (has_b_field) { storage.old_dB_on_rho.set(utility.save_field(idB_on_rho, "dB/rho_old")); } if (has_psi_field) { @@ -2569,13 +2569,13 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() using namespace shamrock; using namespace shamrock::patch; - bool has_B_field = solver_config.has_field_B_on_rho(); + bool has_b_field = solver_config.has_field_b_on_rho(); bool has_psi_field = solver_config.has_field_psi_on_ch(); bool has_epsilon_field = solver_config.dust_config.has_epsilon_field(); bool has_deltav_field = solver_config.dust_config.has_deltav_field(); bool has_s_j_field = solver_config.dust_config.has_s_j_field(); - bool do_NIMHD = solver_config.do_NIMHD(); + bool do_nimhd = solver_config.do_nimhd(); PatchDataLayerLayout &pdl = scheduler().pdl_old(); @@ -2585,8 +2585,8 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() const u32 iuint = pdl.get_field_idx("uint"); const u32 iduint = pdl.get_field_idx("duint"); const u32 ihpart = pdl.get_field_idx("hpart"); - const u32 iB_on_rho = (has_B_field) ? pdl.get_field_idx("B/rho") : 0; - const u32 idB_on_rho = (has_B_field) ? pdl.get_field_idx("dB/rho") : 0; + const u32 iB_on_rho = (has_b_field) ? pdl.get_field_idx("B/rho") : 0; + const u32 idB_on_rho = (has_b_field) ? pdl.get_field_idx("dB/rho") : 0; const u32 ipsi_on_ch = (has_psi_field) ? pdl.get_field_idx("psi/ch") : 0; const u32 idpsi_on_ch = (has_psi_field) ? pdl.get_field_idx("dpsi/ch") : 0; const u32 iepsilon = (has_epsilon_field) ? pdl.get_field_idx("epsilon") : 0; @@ -2659,7 +2659,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() u32 iuint_interf = ghost_layout.get_field_idx("uint"); u32 ivxyz_interf = ghost_layout.get_field_idx("vxyz"); u32 iomega_interf = ghost_layout.get_field_idx("omega"); - u32 iB_on_rho_interf = (has_B_field) ? ghost_layout.get_field_idx("B/rho") : 0; + u32 iB_on_rho_interf = (has_b_field) ? ghost_layout.get_field_idx("B/rho") : 0; u32 ipsi_on_rho_interf = (has_psi_field) ? ghost_layout.get_field_idx("psi/ch") : 0; using RTreeField = RadixTreeField; @@ -2792,7 +2792,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() storage.alpha_av_ghost.set(std::move(merged_field)); } - if (do_NIMHD) { + if (do_nimhd) { // communicate needed fields (B,b, hb): done just before @@ -2806,7 +2806,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() })); // compute J field - update_J(); + update_j(); // communicate J field shamrock::solvergraph::Field &comp_field_send @@ -3096,13 +3096,13 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() utility.fields_leapfrog_corrector( iuint, iduint, storage.old_duint.get(), uepsilon_u_sq, dt / 2); - if (solver_config.has_field_B_on_rho()) { + if (solver_config.has_field_b_on_rho()) { ComputeField BOR_epsilon_BOR_sq = utility.make_compute_field("B/rho epsilon_B/rho^2", 1); utility.fields_leapfrog_corrector( iB_on_rho, idB_on_rho, storage.old_dB_on_rho.get(), BOR_epsilon_BOR_sq, dt / 2); } - if (solver_config.has_field_B_on_rho()) { + if (solver_config.has_field_b_on_rho()) { ComputeField POC_epsilon_POC_sq = utility.make_compute_field("psi/ch epsilon_psi/ch^2", 1); utility.fields_leapfrog_corrector( @@ -3166,10 +3166,10 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() storage.old_axyz.reset(); storage.old_duint.reset(); - if (solver_config.has_field_B_on_rho()) { + if (solver_config.has_field_b_on_rho()) { storage.old_dB_on_rho.reset(); } - if (solver_config.has_field_B_on_rho()) { + if (solver_config.has_field_b_on_rho()) { storage.old_dpsi_on_ch.reset(); } @@ -3258,7 +3258,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() }); } - if (do_NIMHD) { + if (do_nimhd) { const u32 iJ = pdl.get_field_idx("J"); shamrock::solvergraph::Field &MagCurrentJ @@ -3555,7 +3555,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() storage.part_counts, C_force_edge, hpart_refs, axyz_refs, cfl_dt); std::shared_ptr> compute_cfl_NIMHD; - if (do_NIMHD) { + if (do_nimhd) { compute_cfl_NIMHD = std::make_shared>(); Tscal C_NIMHD = solver_config.cfl_config.cfl_NIMHD * get_cfl_multipler(); @@ -3702,7 +3702,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() compute_cfl_force->evaluate(); save_cfl_detail("force"); - if (do_NIMHD) { + if (do_nimhd) { compute_cfl_NIMHD->evaluate(); save_cfl_detail("NIMHD"); } @@ -3833,7 +3833,7 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() storage.alpha_av_ghost.reset(); } - if (do_NIMHD) { + if (do_nimhd) { storage.MagCurrentJ_ghost.reset(); } diff --git a/src/shammodels/sph/src/SolverConfig.cpp b/src/shammodels/sph/src/SolverConfig.cpp index 5c5ec2dab4..5cd2ef0922 100644 --- a/src/shammodels/sph/src/SolverConfig.cpp +++ b/src/shammodels/sph/src/SolverConfig.cpp @@ -61,7 +61,7 @@ namespace shammodels::sph { pdl.add_field("soundspeed", 1); } - if (has_field_B_on_rho()) { + if (has_field_b_on_rho()) { pdl.add_field("B/rho", 1); pdl.add_field("dB/rho", 1); @@ -80,7 +80,7 @@ namespace shammodels::sph { pdl.add_field("curlB", 1); } - if (do_NIMHD()) { + if (do_nimhd()) { pdl.add_field("J", 1); } @@ -143,7 +143,7 @@ namespace shammodels::sph { ghost_layout.add_field("soundspeed", 1); } - if (has_field_B_on_rho()) { + if (has_field_b_on_rho()) { ghost_layout.add_field("B/rho", 1); } diff --git a/src/shammodels/sph/src/modules/ComputeJ.cpp b/src/shammodels/sph/src/modules/ComputeJ.cpp index 420637aa55..799f5c3164 100644 --- a/src/shammodels/sph/src/modules/ComputeJ.cpp +++ b/src/shammodels/sph/src/modules/ComputeJ.cpp @@ -69,14 +69,14 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int Tscal part_omega_sum = 0; Tvec J_sum{0, 0, 0}; - constexpr Tscal Rker2 = SPHKernel::Rkern * SPHKernel::Rkern; + constexpr Tscal rker2 = SPHKernel::Rkern * SPHKernel::Rkern; particle_looper.for_each_object(id_a, [&](u32 id_b) { Tvec dr = xyz_a - r[id_b]; Tscal rab2 = sycl::dot(dr, dr); Tscal h_b = hpart[id_b]; - if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) { + if (rab2 > h_a * h_a * rker2 && rab2 > h_b * h_b * rker2) { return; } @@ -93,7 +93,7 @@ void shammodels::sph::modules::NodeComputeJ::_impl_evaluate_int Tvec r_ab_unit = dr * sham::inv_sat_positive(rab); Tvec nabla_Wab_ha = r_ab_unit * Fab_a; - J_sum += shamrock::sph::mhd::MagCurrentJ_sum( + J_sum += shamrock::sph::mhd::mag_current_j_sum( part_mass, B_a, B_b, nabla_Wab_ha, sub_fact_a, mu_0); }); diff --git a/src/shammodels/sph/src/modules/ConservativeCheck.cpp b/src/shammodels/sph/src/modules/ConservativeCheck.cpp index 70c8a44915..2cd582d15a 100644 --- a/src/shammodels/sph/src/modules/ConservativeCheck.cpp +++ b/src/shammodels/sph/src/modules/ConservativeCheck.cpp @@ -45,10 +45,10 @@ void shammodels::sph::modules::ConservativeCheck::check_conserv const u32 iduint = pdl.get_field_idx("duint"); const u32 ihpart = pdl.get_field_idx("hpart"); - bool has_B_field = solver_config.has_field_B_on_rho(); - const u32 iB_on_rho = (has_B_field) ? pdl.get_field_idx("B/rho") : -1; - const u32 idB_on_rho = (has_B_field) ? pdl.get_field_idx("dB/rho") : -1; - const u32 idrho_dt = (has_B_field) ? pdl.get_field_idx("drho/dt") : -1; + bool has_b_field = solver_config.has_field_b_on_rho(); + const u32 iB_on_rho = (has_b_field) ? pdl.get_field_idx("B/rho") : -1; + const u32 idB_on_rho = (has_b_field) ? pdl.get_field_idx("dB/rho") : -1; + const u32 idrho_dt = (has_b_field) ? pdl.get_field_idx("drho/dt") : -1; std::string cv_checks = "conservation infos :\n"; @@ -133,7 +133,7 @@ void shammodels::sph::modules::ConservativeCheck::check_conserv de[item] = pmass * (sycl::dot(v[item], a[item]) + du[item]); }); - if (has_B_field) { + if (has_b_field) { PatchDataField &field_B_on_rho = pdat.get_field(iB_on_rho); PatchDataField &field_dB_on_rho = pdat.get_field(idB_on_rho); PatchDataField &field_drho_dt = pdat.get_field(idrho_dt); diff --git a/src/shammodels/sph/src/modules/UpdateDerivs.cpp b/src/shammodels/sph/src/modules/UpdateDerivs.cpp index 3573c8523b..585289af05 100644 --- a/src/shammodels/sph/src/modules/UpdateDerivs.cpp +++ b/src/shammodels/sph/src/modules/UpdateDerivs.cpp @@ -65,9 +65,9 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs(Tsca } else if (ConstantDisc *v = std::get_if(&cfg_av.config)) { update_derivs_disc_visco(*v); } else if (IdealMHD *v = std::get_if(&cfg_mhd.configMHD)) { - update_derivs_MHD(*v); + update_derivs_mhd(*v); } else if (NonIdealMHD *v = std::get_if(&cfg_mhd.configMHD)) { - update_derivs_MHD(*v); + update_derivs_mhd(*v); } else if (NoneMHD *v = std::get_if(&cfg_mhd.configMHD)) { shambase::throw_unimplemented(); } else if (None *v = std::get_if(&cfg_av.config)) { @@ -780,8 +780,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_disc } template class SPHKernel> -void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(IdealMHD cfg) { - update_derivs_MHD_impl( +void shammodels::sph::modules::UpdateDerivs::update_derivs_mhd(IdealMHD cfg) { + update_derivs_mhd_impl( cfg.sigma_mhd, cfg.alpha_u, cfg.alpha_B, @@ -793,8 +793,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD( } template class SPHKernel> -void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD(NonIdealMHD cfg) { - update_derivs_MHD_impl( +void shammodels::sph::modules::UpdateDerivs::update_derivs_mhd(NonIdealMHD cfg) { + update_derivs_mhd_impl( cfg.sigma_mhd, cfg.alpha_u, cfg.alpha_B, @@ -806,8 +806,8 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD( } template class SPHKernel> -template -void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_impl( +template +void shammodels::sph::modules::UpdateDerivs::update_derivs_mhd_impl( Tscal sigma_mhd, Tscal alpha_u, Tscal alpha_B, @@ -857,7 +857,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ u32 iB_on_rho_interf = ghost_layout.get_field_idx("B/rho"); u32 ipsi_on_ch_interf = ghost_layout.get_field_idx("psi/ch"); - bool do_NIMHD = solver_config.do_NIMHD(); + bool do_nimhd = solver_config.do_nimhd(); auto &merged_xyzh = storage.merged_xyzh.get(); shamrock::solvergraph::Field &omega = shambase::get_check_ref(storage.omega); @@ -887,9 +887,9 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ sham::DeviceBuffer &buf_psi_on_ch = mpdat.get_field_buf_ref(ipsi_on_ch_interf); - bool do_NIMHD = solver_config.do_NIMHD(); + bool do_nimhd = solver_config.do_nimhd(); sham::DeviceBuffer *buf_J - = (do_NIMHD) ? &storage.MagCurrentJ_ghost.get().get(cur_p.id_patch).get_buf() : nullptr; + = (do_nimhd) ? &storage.MagCurrentJ_ghost.get().get(cur_p.id_patch).get_buf() : nullptr; tree::ObjectCache &pcache = shambase::get_check_ref(storage.neigh_cache).get_cache(cur_p.id_patch); @@ -911,7 +911,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ auto dB_on_rho = buf_dB_on_rho.get_write_access(depends_list); auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list); auto drho_dt = buf_drho_dt.get_write_access(depends_list); - auto J_field = (do_NIMHD) ? buf_J->get_read_access(depends_list) : nullptr; + auto J_field = (do_nimhd) ? buf_J->get_read_access(depends_list) : nullptr; Tvec *mag_pressure = (do_MHD_debug) @@ -986,7 +986,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal omega_a = omega[id_a]; Tscal u_a = u[id_a]; - Tvec J_a = (do_NIMHD) ? J_field[id_a] : Tvec{0, 0, 0}; + Tvec J_a = (do_nimhd) ? J_field[id_a] : Tvec{0, 0, 0}; Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd); Tscal rho_a_sq = rho_a * rho_a; @@ -1030,7 +1030,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal cs_b = cs[id_b]; Tscal rab = sycl::sqrt(rab2); - Tvec J_b = (do_NIMHD) ? J_field[id_b] : Tvec{0, 0, 0}; + Tvec J_b = (do_nimhd) ? J_field[id_b] : Tvec{0, 0, 0}; Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd); Tvec B_b = B_on_rho[id_b] * rho_b; @@ -1041,7 +1041,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ Tscal Fab_a = Kernel::dW_3d(rab, h_a); Tscal Fab_b = Kernel::dW_3d(rab, h_b); - shamrock::sph::mhd::add_to_derivs_spmhd( + shamrock::sph::mhd::add_to_derivs_spmhd( pmass, dr, rab, @@ -1100,9 +1100,9 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ dpsi_on_ch[id_a] = psi_eq - psi_a / h_a; drho_dt[id_a] = drho_eq; - if (do_NIMHD) { + if (do_nimhd) { // only add once per particle - Tscal u_NI = shamrock::sph::mhd::u_NI_heating( + Tscal u_NI = shamrock::sph::mhd::u_ni_heating( B_a, J_a, rho_a, etaO, etaH, etaAD, mu_0); du[id_a] += u_NI; } @@ -1134,7 +1134,7 @@ void shammodels::sph::modules::UpdateDerivs::update_derivs_MHD_ buf_dpsi_on_ch.complete_event_state(e); buf_drho_dt.complete_event_state(e); - if (do_NIMHD) { + if (do_nimhd) { buf_J->complete_event_state(e); } diff --git a/src/shammodels/sph/src/pySPHModel.cpp b/src/shammodels/sph/src/pySPHModel.cpp index 21ecacc704..38281e6577 100644 --- a/src/shammodels/sph/src/pySPHModel.cpp +++ b/src/shammodels/sph/src/pySPHModel.cpp @@ -235,7 +235,7 @@ void add_instance(py::module &m, std::string name_config, std::string name_model py::arg("alpha_AV") = 1.0, py::arg("beta_AV") = 1.0) .def( - "set_NonIdealMHD", + "set_non_ideal_mhd", [](TConfig &self, Tscal sigma_mhd, Tscal sigma_u, @@ -245,7 +245,7 @@ void add_instance(py::module &m, std::string name_config, std::string name_model Tscal alpha_B, Tscal alpha_AV, Tscal beta_AV) { - self.set_NonIdealMHD( + self.set_non_ideal_mhd( {sigma_mhd, sigma_u, alpha_B, alpha_AV, beta_AV, etaO, etaH, etaAD}); }, py::kw_only(), From 761fd520f911f4714cdabf1ae3ed6f78c6e09d46 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 25 Sep 2026 17:20:27 +0200 Subject: [PATCH 53/54] add default values in solverconfig params --- src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp index 1956b1235b..1a84b2adc2 100644 --- a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp @@ -71,12 +71,12 @@ namespace shammodels::sph { /** * @brief The CFL condition for the courant factor */ - Tscal cfl_cour; + Tscal cfl_cour = 0.3; /** * @brief The CFL condition for the force */ - Tscal cfl_force; + Tscal cfl_force = 0.25; Tscal _pi = shambase::constants::pi; /** @@ -558,7 +558,7 @@ struct shammodels::sph::SolverConfig { /// The radius of the sph kernel static constexpr Tscal Rkern = Kernel::Rkern; - Tscal gpart_mass; ///< The mass of each gas particle + Tscal gpart_mass{0}; ///< The mass of each gas particle (must be set before use) bool track_particles_id = false; From b7a8e079ffecb7c408a49841094e865f6b6ff903 Mon Sep 17 00:00:00 2001 From: Yona Lapeyre Date: Fri, 25 Sep 2026 17:29:26 +0200 Subject: [PATCH 54/54] more clang tidy stuff --- .../sph/include/shammodels/sph/SolverConfig.hpp | 8 ++++---- .../sph/include/shammodels/sph/math/mhd.hpp | 12 ++++++------ src/shammodels/sph/src/Solver.cpp | 6 +++--- src/shammodels/sph/src/SolverConfig.cpp | 6 +++--- src/shammodels/sph/src/pySPHModel.cpp | 4 ++-- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp index 1a84b2adc2..09dfa38bd3 100644 --- a/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp +++ b/src/shammodels/sph/include/shammodels/sph/SolverConfig.hpp @@ -657,7 +657,7 @@ struct shammodels::sph::SolverConfig { } /// Enable the ideal MHD hydro solver - inline void set_IdealMHD(typename MHDConfig::IdealMhdConstrainedHyperPara v) { + inline void set_ideal_mhd(typename MHDConfig::IdealMhdConstrainedHyperPara v) { mhd_config.set(v); } @@ -1153,13 +1153,13 @@ struct shammodels::sph::SolverConfig { inline bool has_field_psi_on_ch() { return mhd_config.has_psi_field(); } /// @brief Whether the solver has a field for divB - inline bool has_field_divB() { return mhd_config.has_div_b_field(); } + inline bool has_field_div_b() { return mhd_config.has_div_b_field(); } /// @brief Whether the solver has a field for curlB - inline bool has_field_curlB() { return mhd_config.has_curl_b_field() && (dim == 3); } + inline bool has_field_curl_b() { return mhd_config.has_curl_b_field() && (dim == 3); } /// @brief Whether the solver has a field for dt divB - inline bool has_field_dtdivB() { return mhd_config.has_dtdiv_b_field(); } + inline bool has_field_dtdiv_b() { return mhd_config.has_dtdiv_b_field(); } /// @brief Whether to store luminosity bool compute_luminosity = false; diff --git a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp index 8d70c7f3aa..6f50e8cc02 100644 --- a/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp +++ b/src/shammodels/sph/include/shammodels/sph/math/mhd.hpp @@ -178,7 +178,7 @@ namespace shamrock::sph::mhd { } template - inline Tvec fdivB( + inline Tvec fdiv_b( Tscal m_b, Tvec B_a, Tvec B_b, @@ -220,7 +220,7 @@ namespace shamrock::sph::mhd { } template - inline Tscal dB_on_rho_induction_term( + inline Tscal d_b_on_rho_induction_term( Tscal m_b, Tscal rho_a_sq, Tvec B_a, Tscal omega_a, Tvec nabla_Wab_ha) { Tscal sub_fact_a = rho_a_sq * omega_a; @@ -231,7 +231,7 @@ namespace shamrock::sph::mhd { } template - inline Tvec dB_on_rho_psi_term( + inline Tvec d_b_on_rho_psi_term( Tscal m_b, Tscal rho_a_sq, Tscal rho_b_sq, @@ -389,7 +389,7 @@ namespace shamrock::sph::mhd { // update_derivs) // dv/dt terms - sum_fdivB += fdivB( + sum_fdivB += fdiv_b( pmass, B_a, B_b, r_ab_unit * dWab_a, r_ab_unit * dWab_b, sub_fact_a, sub_fact_b, mu_0); Tvec gas_pressure_pishock = sph::sph_pressure_symetric( @@ -474,10 +474,10 @@ namespace shamrock::sph::mhd { = 0.5 * pmass * (rho_diss_term_a + rho_diss_term_b) * (B_a - B_b) * vsig_B; dB_on_rho_dt += v_ab - * dB_on_rho_induction_term( + * d_b_on_rho_induction_term( pmass, rho_a_sq, B_a, omega_a, r_ab_unit * dWab_a); // @@@ dWab_b ? - dB_on_rho_dt += dB_on_rho_psi_term( + dB_on_rho_dt += d_b_on_rho_psi_term( pmass, rho_a_sq, rho_b * rho_b, diff --git a/src/shammodels/sph/src/Solver.cpp b/src/shammodels/sph/src/Solver.cpp index d939ee79c6..35b5e86b01 100644 --- a/src/shammodels/sph/src/Solver.cpp +++ b/src/shammodels/sph/src/Solver.cpp @@ -1937,7 +1937,7 @@ void shammodels::sph::Solver::communicate_merge_ghosts_fields() { bool has_b_field = solver_config.has_field_b_on_rho(); bool has_psi_field = solver_config.has_field_psi_on_ch(); - bool has_curl_b_field = solver_config.has_field_curlB(); + bool has_curl_b_field = solver_config.has_field_curl_b(); bool has_epsilon_field = solver_config.dust_config.has_epsilon_field(); bool has_deltav_field = solver_config.dust_config.has_deltav_field(); bool has_s_j_field = solver_config.dust_config.has_s_j_field(); @@ -2736,12 +2736,12 @@ shammodels::sph::TimestepLog shammodels::sph::Solver::evolve_once() } } - // if (solver_config.has_field_divB()) { + // if (solver_config.has_field_div_b()) { // sph::modules::DiffOperatorsB(context, solver_config, storage) // .update_divB(); // } - // if (solver_config.has_field_curlB()) { + // if (solver_config.has_field_curl_b()) { // sph::modules::DiffOperatorsB(context, solver_config, storage) // .update_curlB(); // } diff --git a/src/shammodels/sph/src/SolverConfig.cpp b/src/shammodels/sph/src/SolverConfig.cpp index 5cd2ef0922..cc4d13df33 100644 --- a/src/shammodels/sph/src/SolverConfig.cpp +++ b/src/shammodels/sph/src/SolverConfig.cpp @@ -72,11 +72,11 @@ namespace shammodels::sph { pdl.add_field("psi/ch", 1); pdl.add_field("dpsi/ch", 1); } - if (has_field_divB()) { + if (has_field_div_b()) { pdl.add_field("divB", 1); } - if (has_field_curlB()) { + if (has_field_curl_b()) { pdl.add_field("curlB", 1); } @@ -151,7 +151,7 @@ namespace shammodels::sph { ghost_layout.add_field("psi/ch", 1); } - if (has_field_curlB()) { + if (has_field_curl_b()) { ghost_layout.add_field("curlB", 1); } diff --git a/src/shammodels/sph/src/pySPHModel.cpp b/src/shammodels/sph/src/pySPHModel.cpp index 38281e6577..04bfebf4b4 100644 --- a/src/shammodels/sph/src/pySPHModel.cpp +++ b/src/shammodels/sph/src/pySPHModel.cpp @@ -219,14 +219,14 @@ void add_instance(py::module &m, std::string name_config, std::string name_model py::arg("alpha_u"), py::arg("beta_AV")) .def( - "set_IdealMHD", + "set_ideal_mhd", [](TConfig &self, Tscal sigma_mhd, Tscal sigma_u, Tscal alpha_B, Tscal alpha_AV, Tscal beta_AV) { - self.set_IdealMHD({sigma_mhd, sigma_u, alpha_B, alpha_AV, beta_AV}); + self.set_ideal_mhd({sigma_mhd, sigma_u, alpha_B, alpha_AV, beta_AV}); }, py::kw_only(), py::arg("sigma_mhd"),