51template<
class Tvec,
template<
class>
class SPHKernel>
52void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs(Tscal dt_hydro) {
54 Cfg_AV cfg_av = solver_config.artif_viscosity;
55 Cfg_MHD cfg_mhd = solver_config.mhd_config;
56 DustConfig cfg_dust = solver_config.dust_config;
58 if (Constant *v = std::get_if<Constant>(&cfg_av.config)) {
59 update_derivs_constantAV(*v);
60 }
else if (VaryingMM97 *v = std::get_if<VaryingMM97>(&cfg_av.config)) {
61 update_derivs_mm97(*v);
62 }
else if (VaryingCD10 *v = std::get_if<VaryingCD10>(&cfg_av.config)) {
63 update_derivs_cd10(*v);
64 }
else if (ConstantDisc *v = std::get_if<ConstantDisc>(&cfg_av.config)) {
65 update_derivs_disc_visco(*v);
66 }
else if (IdealMHD *v = std::get_if<IdealMHD>(&cfg_mhd.config)) {
67 update_derivs_MHD(*v);
68 }
else if (NonIdealMHD *v = std::get_if<NonIdealMHD>(&cfg_mhd.config)) {
70 }
else if (NoneMHD *v = std::get_if<NoneMHD>(&cfg_mhd.config)) {
72 }
else if (None *v = std::get_if<None>(&cfg_av.config)) {
78 if (cfg_dust.has_s_j_field()) {
80 update_derivs_dust_monofluid_tva_Sj(cfg_dust, dt_hydro);
84template<
class Tvec,
template<
class>
class SPHKernel>
85void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_noAV(None cfg) {}
87template<
class Tvec,
template<
class>
class SPHKernel>
88void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_constantAV(
93 using namespace shamrock::patch;
106 u32 ihpart_interf = ghost_layout.get_field_idx<Tscal>(
"hpart");
107 u32 iuint_interf = ghost_layout.get_field_idx<Tscal>(
"uint");
108 u32 ivxyz_interf = ghost_layout.get_field_idx<Tvec>(
"vxyz");
109 u32 iomega_interf = ghost_layout.get_field_idx<Tscal>(
"omega");
111 auto &merged_xyzh = storage.merged_xyzh.get();
119 = merged_xyzh.get(cur_p.
id_patch).template get_field_buf_ref<Tvec>(0);
131 sycl::range range_npart{pdat.get_obj_cnt()};
143 auto du = buf_duint.get_write_access(depends_list);
144 auto vxyz = buf_vxyz.get_read_access(depends_list);
145 auto hpart = buf_hpart.get_read_access(depends_list);
146 auto omega = buf_omega.get_read_access(depends_list);
147 auto u = buf_uint.get_read_access(depends_list);
148 auto pressure = buf_pressure.get_read_access(depends_list);
150 auto ploop_ptrs = pcache.get_read_access(depends_list);
152 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
153 const Tscal pmass = solver_config.gpart_mass;
154 const Tscal alpha_u = cfg.alpha_u;
155 const Tscal alpha_AV = cfg.alpha_AV;
156 const Tscal beta_AV = cfg.beta_AV;
158 shamlog_debug_sycl_ln(
"deriv kernel",
"alpha_u :", alpha_u);
159 shamlog_debug_sycl_ln(
"deriv kernel",
"alpha_AV :", alpha_AV);
160 shamlog_debug_sycl_ln(
"deriv kernel",
"beta_AV :", beta_AV);
173 constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern;
175 shambase::parallel_for(cgh, pdat.get_obj_cnt(),
"compute force cte AV", [=](
u64 gid) {
176 u32 id_a = (u32) gid;
178 using namespace shamrock::sph;
180 Tvec sum_axyz = {0, 0, 0};
183 Tscal h_a = hpart[id_a];
184 Tvec xyz_a = xyz[id_a];
185 Tvec vxyz_a = vxyz[id_a];
186 Tscal P_a = pressure[id_a];
187 Tscal omega_a = omega[id_a];
188 const Tscal u_a = u[id_a];
190 Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd);
191 Tscal rho_a_sq = rho_a * rho_a;
192 Tscal rho_a_inv = 1. / rho_a;
196 Tscal omega_a_rho_a_inv = 1 / (omega_a * rho_a);
198 Tscal cs_a = cs[id_a];
200 Tvec force_pressure{0, 0, 0};
201 Tscal tmpdU_pressure = 0;
203 particle_looper.for_each_object(id_a, [&](
u32 id_b) {
205 Tvec dr = xyz_a -
xyz[id_b];
206 Tscal rab2 = sycl::dot(dr, dr);
207 Tscal h_b =
hpart[id_b];
209 if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) {
213 Tscal rab = sycl::sqrt(rab2);
214 Tvec vxyz_b =
vxyz[id_b];
215 const Tscal u_b = u[id_b];
217 Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd);
220 Tscal omega_b =
omega[id_b];
221 Tscal cs_b = cs[id_b];
223 const Tscal alpha_a = alpha_AV;
224 const Tscal alpha_b = alpha_AV;
226 Tscal Fab_a = Kernel::dW_3d(rab, h_a);
227 Tscal Fab_b = Kernel::dW_3d(rab, h_b);
229 Tvec v_ab = vxyz_a - vxyz_b;
234 Tscal v_ab_r_ab = sycl::dot(v_ab, r_ab_unit);
235 Tscal abs_v_ab_r_ab = sycl::fabs(v_ab_r_ab);
237 Tscal vsig_a = alpha_a * cs_a + beta_AV * abs_v_ab_r_ab;
238 Tscal vsig_b = alpha_b * cs_b + beta_AV * abs_v_ab_r_ab;
240 Tscal vsig_u = shamrock::sph::vsig_u(P_a, P_b, rho_a, rho_b);
245 add_to_derivs_sph_artif_visco_cond(
268 axyz[id_a] = force_pressure;
269 du[id_a] = tmpdU_pressure;
275 buf_duint.complete_event_state(e);
276 buf_vxyz.complete_event_state(e);
277 buf_hpart.complete_event_state(e);
278 buf_omega.complete_event_state(e);
279 buf_uint.complete_event_state(e);
280 buf_pressure.complete_event_state(e);
285 pcache.complete_event_state(resulting_events);
288template<
class Tvec,
template<
class>
class SPHKernel>
289void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_mm97(VaryingMM97 cfg) {
293 using namespace shamrock::patch;
306 u32 ihpart_interf = ghost_layout.get_field_idx<Tscal>(
"hpart");
307 u32 iuint_interf = ghost_layout.get_field_idx<Tscal>(
"uint");
308 u32 ivxyz_interf = ghost_layout.get_field_idx<Tvec>(
"vxyz");
309 u32 iomega_interf = ghost_layout.get_field_idx<Tscal>(
"omega");
311 auto &merged_xyzh = storage.merged_xyzh.get();
317 auto &xyz_refs = storage.positions_with_ghosts;
318 auto &pressure_field = storage.pressure;
319 auto &soundspeed_field = storage.soundspeed;
321 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> uint_refs
322 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"uint",
"u");
327 return std::ref(mpdat.get_field<Tscal>(iuint_interf));
331 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tvec>> vxyz_refs
332 = std::make_shared<shamrock::solvergraph::FieldRefs<Tvec>>(
"vxyz",
"v");
337 return std::ref(mpdat.get_field<Tvec>(ivxyz_interf));
341 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> hpart_refs
342 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"hpart",
"h");
347 return std::ref(mpdat.get_field<Tscal>(ihpart_interf));
351 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> omega_refs
352 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"omega",
"omega");
357 return std::ref(mpdat.get_field<Tscal>(iomega_interf));
361 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> alpha_av_refs
362 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"alpha_av",
"alpha_av");
367 cur_p.
id_patch, std::ref(storage.alpha_av_ghost.get().get(cur_p.
id_patch)));
379 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> alpha_u
380 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"alpha_u",
"alpha_u");
384 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> beta_AV
385 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"beta_AV",
"beta_AV");
390 std::shared_ptr<NodeUpdateDerivsVaryingAlphaAV<Tvec, SPHKernel>> node
391 = std::make_shared<NodeUpdateDerivsVaryingAlphaAV<Tvec, SPHKernel>>();
398 part_counts_with_ghost,
413template<
class Tvec,
template<
class>
class SPHKernel>
414void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_cd10(VaryingCD10 cfg) {
418 using namespace shamrock::patch;
431 u32 ihpart_interf = ghost_layout.get_field_idx<Tscal>(
"hpart");
432 u32 iuint_interf = ghost_layout.get_field_idx<Tscal>(
"uint");
433 u32 ivxyz_interf = ghost_layout.get_field_idx<Tvec>(
"vxyz");
434 u32 iomega_interf = ghost_layout.get_field_idx<Tscal>(
"omega");
436 auto &merged_xyzh = storage.merged_xyzh.get();
442 auto &xyz_refs = storage.positions_with_ghosts;
443 auto &pressure_field = storage.pressure;
444 auto &soundspeed_field = storage.soundspeed;
446 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> uint_refs
447 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"uint",
"u");
452 return std::ref(mpdat.get_field<Tscal>(iuint_interf));
456 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tvec>> vxyz_refs
457 = std::make_shared<shamrock::solvergraph::FieldRefs<Tvec>>(
"vxyz",
"v");
462 return std::ref(mpdat.get_field<Tvec>(ivxyz_interf));
466 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> hpart_refs
467 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"hpart",
"h");
472 return std::ref(mpdat.get_field<Tscal>(ihpart_interf));
476 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> omega_refs
477 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"omega",
"omega");
482 return std::ref(mpdat.get_field<Tscal>(iomega_interf));
486 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> alpha_av_refs
487 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"alpha_av",
"alpha_av");
492 cur_p.
id_patch, std::ref(storage.alpha_av_ghost.get().get(cur_p.
id_patch)));
504 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> alpha_u
505 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"alpha_u",
"alpha_u");
509 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> beta_AV
510 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"beta_AV",
"beta_AV");
515 if (solver_config.dust_config.should_use_dust_av()) {
516 u32 ndust = solver_config.dust_config.get_dust_nvar();
517 u32 is_j_interf = ghost_layout.get_field_idx<Tscal>(
"s_j");
519 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> s_j_refs
520 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"s_j",
"s_j");
525 return std::ref(mpdat.get_field<Tscal>(is_j_interf));
529 std::shared_ptr<NodeUpdateDerivsVaryingAlphaAVDustTVA<Tvec, SPHKernel>> node
530 = std::make_shared<NodeUpdateDerivsVaryingAlphaAVDustTVA<Tvec, SPHKernel>>(ndust);
537 part_counts_with_ghost,
553 std::shared_ptr<NodeUpdateDerivsVaryingAlphaAV<Tvec, SPHKernel>> node
554 = std::make_shared<NodeUpdateDerivsVaryingAlphaAV<Tvec, SPHKernel>>();
561 part_counts_with_ghost,
578template<
class Tvec,
template<
class>
class SPHKernel>
579void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_disc_visco(
584 using namespace shamrock::patch;
597 u32 ihpart_interf = ghost_layout.get_field_idx<Tscal>(
"hpart");
598 u32 iuint_interf = ghost_layout.get_field_idx<Tscal>(
"uint");
599 u32 ivxyz_interf = ghost_layout.get_field_idx<Tvec>(
"vxyz");
600 u32 iomega_interf = ghost_layout.get_field_idx<Tscal>(
"omega");
602 auto &merged_xyzh = storage.merged_xyzh.get();
610 = merged_xyzh.get(cur_p.
id_patch).template get_field_buf_ref<Tvec>(0);
622 sycl::range range_npart{pdat.get_obj_cnt()};
634 auto du = buf_duint.get_write_access(depends_list);
635 auto vxyz = buf_vxyz.get_read_access(depends_list);
636 auto hpart = buf_hpart.get_read_access(depends_list);
637 auto omega = buf_omega.get_read_access(depends_list);
638 auto u = buf_uint.get_read_access(depends_list);
639 auto pressure = buf_pressure.get_read_access(depends_list);
641 auto ploop_ptrs = pcache.get_read_access(depends_list);
643 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
644 const Tscal pmass = solver_config.gpart_mass;
645 const Tscal alpha_AV = cfg.alpha_AV;
646 const Tscal alpha_u = cfg.alpha_u;
647 const Tscal beta_AV = cfg.beta_AV;
649 shamlog_debug_sycl_ln(
"deriv kernel",
"alpha_AV :", alpha_AV);
650 shamlog_debug_sycl_ln(
"deriv kernel",
"alpha_u :", alpha_u);
651 shamlog_debug_sycl_ln(
"deriv kernel",
"beta_AV :", beta_AV);
664 constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern;
666 shambase::parallel_for(cgh, pdat.get_obj_cnt(),
"compute force disc", [=](
u64 gid) {
667 u32 id_a = (u32) gid;
669 using namespace shamrock::sph;
671 Tvec sum_axyz = {0, 0, 0};
674 Tscal h_a = hpart[id_a];
675 Tvec xyz_a = xyz[id_a];
676 Tvec vxyz_a = vxyz[id_a];
677 Tscal P_a = pressure[id_a];
678 Tscal cs_a = cs[id_a];
679 Tscal omega_a = omega[id_a];
680 const Tscal u_a = u[id_a];
682 Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd);
683 Tscal rho_a_sq = rho_a * rho_a;
684 Tscal rho_a_inv = 1. / rho_a;
688 Tscal omega_a_rho_a_inv = 1 / (omega_a * rho_a);
690 Tvec force_pressure{0, 0, 0};
691 Tscal tmpdU_pressure = 0;
693 particle_looper.for_each_object(id_a, [&](
u32 id_b) {
695 Tvec dr = xyz_a -
xyz[id_b];
696 Tscal rab2 = sycl::dot(dr, dr);
697 Tscal h_b =
hpart[id_b];
699 if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) {
703 Tvec vxyz_b =
vxyz[id_b];
704 const Tscal u_b = u[id_b];
706 Tscal omega_b =
omega[id_b];
707 Tscal cs_b = cs[id_b];
709 Tscal rab = sycl::sqrt(rab2);
711 Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd);
712 const Tscal alpha_a = alpha_AV;
713 const Tscal alpha_b = alpha_AV;
714 Tscal Fab_a = Kernel::dW_3d(rab, h_a);
715 Tscal Fab_b = Kernel::dW_3d(rab, h_b);
717 Tvec v_ab = vxyz_a - vxyz_b;
722 Tscal v_ab_r_ab = sycl::dot(v_ab, r_ab_unit);
723 Tscal abs_v_ab_r_ab = sycl::fabs(v_ab_r_ab);
725 Tscal vsig_a = alpha_a * cs_a + beta_AV * abs_v_ab_r_ab;
726 Tscal vsig_b = alpha_b * cs_b + beta_AV * abs_v_ab_r_ab;
728 Tscal vsig_u = shamrock::sph::vsig_u(P_a, P_b, rho_a, rho_b);
730 Tscal qa_ab = shamrock::sph::q_av_disc(
731 rho_a, h_a, rab, alpha_a, cs_a, vsig_a, v_ab_r_ab);
732 Tscal qb_ab = shamrock::sph::q_av_disc(
733 rho_b, h_b, rab, alpha_b, cs_b, vsig_b, v_ab_r_ab);
735 add_to_derivs_sph_artif_visco_cond(
760 axyz[id_a] = force_pressure;
761 du[id_a] = tmpdU_pressure;
767 buf_duint.complete_event_state(e);
768 buf_vxyz.complete_event_state(e);
769 buf_hpart.complete_event_state(e);
770 buf_omega.complete_event_state(e);
771 buf_uint.complete_event_state(e);
772 buf_pressure.complete_event_state(e);
777 pcache.complete_event_state(resulting_events);
781template<
class Tvec,
template<
class>
class SPHKernel>
782void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_MHD(IdealMHD cfg) {
786 using namespace shamrock::patch;
802 bool do_MHD_debug = solver_config.do_MHD_debug();
803 const u32 imag_pressure = (do_MHD_debug) ? pdl.
get_field_idx<Tvec>(
"mag_pressure") : -1;
804 const u32 imag_tension = (do_MHD_debug) ? pdl.
get_field_idx<Tvec>(
"mag_tension") : -1;
805 const u32 igas_pressure = (do_MHD_debug) ? pdl.
get_field_idx<Tvec>(
"gas_pressure") : -1;
806 const u32 itensile_corr = (do_MHD_debug) ? pdl.
get_field_idx<Tvec>(
"tensile_corr") : -1;
807 const u32 ipsi_propag = (do_MHD_debug) ? pdl.
get_field_idx<Tscal>(
"psi_propag") : -1;
808 const u32 ipsi_diff = (do_MHD_debug) ? pdl.
get_field_idx<Tscal>(
"psi_diff") : -1;
809 const u32 ipsi_cons = (do_MHD_debug) ? pdl.
get_field_idx<Tscal>(
"psi_cons") : -1;
813 Tscal
const mu_0 = solver_config.get_constant_mu_0();
826 auto &merged_xyzh = storage.merged_xyzh.get();
834 = merged_xyzh.get(cur_p.
id_patch).template get_field_buf_ref<Tvec>(0);
853 = mpdat.get_field_buf_ref<Tscal>(ipsi_on_ch_interf);
858 sycl::range range_npart{pdat.get_obj_cnt()};
870 auto du = buf_duint.get_write_access(depends_list);
871 auto vxyz = buf_vxyz.get_read_access(depends_list);
872 auto hpart = buf_hpart.get_read_access(depends_list);
873 auto omega = buf_omega.get_read_access(depends_list);
874 auto u = buf_uint.get_read_access(depends_list);
875 auto pressure = buf_pressure.get_read_access(depends_list);
877 auto B_on_rho = buf_B_on_rho.get_read_access(depends_list);
878 auto psi_on_ch = buf_psi_on_ch.get_read_access(depends_list);
880 auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list);
881 auto drho_dt = buf_drho_dt.get_write_access(depends_list);
885 ? pdat.get_field_buf_ref<Tvec>(imag_pressure).get_write_access(depends_list)
889 ? pdat.get_field_buf_ref<Tvec>(imag_tension).get_write_access(depends_list)
893 ? pdat.get_field_buf_ref<Tvec>(igas_pressure).get_write_access(depends_list)
897 ? pdat.get_field_buf_ref<Tvec>(itensile_corr).get_write_access(depends_list)
902 ? pdat.get_field_buf_ref<Tscal>(ipsi_propag).get_write_access(depends_list)
906 ? pdat.get_field_buf_ref<Tscal>(ipsi_diff).get_write_access(depends_list)
910 ? pdat.get_field_buf_ref<Tscal>(ipsi_cons).get_write_access(depends_list)
913 Tscal *u_mhd = (do_MHD_debug)
914 ? pdat.get_field_buf_ref<Tscal>(iu_mhd).get_write_access(depends_list)
917 auto ploop_ptrs = pcache.get_read_access(depends_list);
919 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
920 const Tscal pmass = solver_config.gpart_mass;
921 const Tscal sigma_mhd = cfg.sigma_mhd;
922 const Tscal alpha_u = cfg.alpha_u;
924 shamlog_debug_ln(
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
"");
925 shamlog_debug_sycl_ln(
"deriv kernel",
"sigma_mhd :", sigma_mhd);
926 shamlog_debug_sycl_ln(
"deriv kernel",
"alpha_u :", alpha_u);
927 shamlog_debug_ln(
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
"");
931 constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern;
933 shambase::parallel_for(cgh, pdat.get_obj_cnt(),
"compute MHD", [=](
u64 gid) {
934 u32 id_a = (u32) gid;
936 using namespace shamrock::sph;
938 Tvec sum_axyz = {0, 0, 0};
941 Tscal h_a = hpart[id_a];
942 Tvec xyz_a = xyz[id_a];
943 Tvec vxyz_a = vxyz[id_a];
944 Tscal P_a = pressure[id_a];
945 Tscal cs_a = cs[id_a];
946 Tscal omega_a = omega[id_a];
947 const Tscal u_a = u[id_a];
949 Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd);
950 Tscal rho_a_sq = rho_a * rho_a;
951 Tscal rho_a_inv = 1. / rho_a;
953 Tvec B_a = B_on_rho[id_a] * rho_a;
954 Tscal v_alfven_a = sycl::sqrt(sycl::dot(B_a, B_a) / (mu_0 * rho_a));
955 Tscal v_shock_a = sycl::sqrt(cs_a * cs_a + v_alfven_a * v_alfven_a);
956 Tscal psi_a = psi_on_ch[id_a] * v_shock_a;
958 Tscal omega_a_rho_a_inv = 1 / (omega_a * rho_a);
960 Tvec force_pressure{0, 0, 0};
961 Tscal tmpdU_pressure = 0;
962 Tvec magnetic_eq{0, 0, 0};
966 Tvec mag_pressure_term{0, 0, 0};
967 Tvec mag_tension_term{0, 0, 0};
968 Tvec gas_pressure_term{0, 0, 0};
969 Tvec tensile_corr_term{0, 0, 0};
971 Tscal psi_propag_term = 0;
972 Tscal psi_diff_term = 0;
973 Tscal psi_cons_term = 0;
975 Tscal u_mhd_term = 0;
977 particle_looper.for_each_object(id_a, [&](
u32 id_b) {
979 Tvec dr = xyz_a -
xyz[id_b];
980 Tscal rab2 = sycl::dot(dr, dr);
981 Tscal h_b =
hpart[id_b];
983 if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) {
987 Tvec vxyz_b =
vxyz[id_b];
988 const Tscal u_b = u[id_b];
990 Tscal omega_b =
omega[id_b];
991 Tscal cs_b = cs[id_b];
993 Tscal rab = sycl::sqrt(rab2);
995 Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd);
996 Tvec B_b = B_on_rho[id_b] * rho_b;
997 Tscal v_alfven_b = sycl::sqrt(sycl::dot(B_b, B_b) / (mu_0 * rho_b));
998 Tscal v_shock_b = sycl::sqrt(cs_b * cs_b + v_alfven_b * v_alfven_b);
999 Tscal psi_b = psi_on_ch[id_b] * v_shock_b;
1002 Tscal Fab_a = Kernel::dW_3d(rab, h_a);
1003 Tscal Fab_b = Kernel::dW_3d(rab, h_b);
1006 shamrock::sph::mhd::add_to_derivs_spmhd<Kernel, Tvec, Tscal>(
1057 axyz[id_a] = force_pressure;
1058 du[id_a] = tmpdU_pressure;
1059 dB_on_rho[id_a] = magnetic_eq;
1060 dpsi_on_ch[id_a] = psi_eq - psi_a / h_a;
1061 drho_dt[id_a] = drho_eq;
1064 mag_pressure[id_a] = mag_pressure_term;
1065 mag_tension[id_a] = mag_tension_term;
1066 gas_pressure[id_a] = gas_pressure_term;
1067 tensile_corr[id_a] = tensile_corr_term;
1069 psi_propag[id_a] = psi_propag_term;
1070 psi_diff[id_a] = psi_diff_term;
1071 psi_cons[id_a] = -psi_a / h_a;
1073 u_mhd[id_a] = u_mhd_term;
1080 buf_duint.complete_event_state(e);
1081 buf_vxyz.complete_event_state(e);
1082 buf_hpart.complete_event_state(e);
1083 buf_omega.complete_event_state(e);
1084 buf_uint.complete_event_state(e);
1085 buf_pressure.complete_event_state(e);
1087 buf_B_on_rho.complete_event_state(e);
1088 buf_psi_on_ch.complete_event_state(e);
1090 buf_dpsi_on_ch.complete_event_state(e);
1091 buf_drho_dt.complete_event_state(e);
1094 pdat.get_field_buf_ref<Tvec>(imag_pressure).complete_event_state(e);
1095 pdat.get_field_buf_ref<Tvec>(imag_tension).complete_event_state(e);
1096 pdat.get_field_buf_ref<Tvec>(igas_pressure).complete_event_state(e);
1097 pdat.get_field_buf_ref<Tvec>(itensile_corr).complete_event_state(e);
1099 pdat.get_field_buf_ref<Tscal>(ipsi_propag).complete_event_state(e);
1100 pdat.get_field_buf_ref<Tscal>(ipsi_diff).complete_event_state(e);
1101 pdat.get_field_buf_ref<Tscal>(ipsi_cons).complete_event_state(e);
1103 pdat.get_field_buf_ref<Tscal>(iu_mhd).complete_event_state(e);
1108 pcache.complete_event_state(resulting_events);
1112template<
class Tvec,
template<
class>
class SPHKernel>
1113void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_dust_monofluid_tva_Sj(
1114 DustConfig cfg, Tscal dt_hydro) {
1116 using MonofluidTVA =
typename DustConfig::MonofluidTVA;
1121 using namespace shamrock::patch;
1134 u32 ihpart_interf = ghost_layout.get_field_idx<Tscal>(
"hpart");
1135 u32 ivxyz_interf = ghost_layout.get_field_idx<Tvec>(
"vxyz");
1136 u32 iomega_interf = ghost_layout.get_field_idx<Tscal>(
"omega");
1137 u32 is_j_interf = ghost_layout.get_field_idx<Tscal>(
"s_j");
1139 u32 ndust = cfg.get_dust_nvar();
1141 auto &merged_xyzh = storage.merged_xyzh.get();
1147 auto &xyz_refs = storage.positions_with_ghosts;
1148 auto &pressure_field = storage.pressure;
1154 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tvec>> vxyz_refs
1155 = std::make_shared<shamrock::solvergraph::FieldRefs<Tvec>>(
"vxyz",
"v");
1160 return std::ref(mpdat.get_field<Tvec>(ivxyz_interf));
1164 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> hpart_refs
1165 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"hpart",
"h");
1170 return std::ref(mpdat.get_field<Tscal>(ihpart_interf));
1174 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> omega_refs
1175 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"omega",
"omega");
1180 return std::ref(mpdat.get_field<Tscal>(iomega_interf));
1185 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> s_j_refs
1186 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"s_j",
"s_j");
1191 return std::ref(mpdat.get_field<Tscal>(is_j_interf));
1196 = storage.solver_graph.template get_edge_ptr<shamrock::solvergraph::Field<Tscal>>(
"Ts_j");
1198 std::shared_ptr<shamrock::solvergraph::Field<Tscal>> Ttilde_sj_field
1199 = std::make_shared<shamrock::solvergraph::Field<Tscal>>(ndust,
"Ttilde_sj",
"Ttilde_sj");
1204 std::shared_ptr<ComputeDustTtilde<Tvec, SPHKernel>> node_tj
1205 = std::make_shared<ComputeDustTtilde<Tvec, SPHKernel>>(ndust);
1208 gpart_mass, part_counts_with_ghost, hpart_refs, s_j_refs, t_j_field, Ttilde_sj_field);
1210 node_tj->evaluate();
1212 std::shared_ptr<NodeUpdateDerivsMonofluidTVA<Tvec, SPHKernel>> node
1213 = std::make_shared<NodeUpdateDerivsMonofluidTVA<Tvec, SPHKernel>>(ndust);
1218 part_counts_with_ghost,
1226 storage.neigh_cache,
1231 MonofluidTVA &cfg_monofluid_tva
1234 if (cfg_monofluid_tva.smooth_s_positivity_limiter) {
1235 std::shared_ptr<NodeMonofluidTVASmoothSPositivityLimiter<Tvec>> node_limiter
1236 = std::make_shared<NodeMonofluidTVASmoothSPositivityLimiter<Tvec>>(ndust);
1238 node_limiter->set_edges(part_counts, s_j_refs, Ttilde_sj_field, ds_j_dt_refs);
1240 node_limiter->evaluate();
1243 if (cfg_monofluid_tva.pure_diffusion_mode) {
1250 pdat.get_field_buf_ref<Tvec>(iaxyz).fill({0, 0, 0});
1251 pdat.get_field_buf_ref<Tscal>(iduint).fill(0);
Compute the dust combined stopping times Ttilde_sj for each dust species j see Hutchison 2018 eq 15.
constexpr const char * axyz
3-acceleration field
constexpr const char * vxyz
3-velocity field
constexpr const char * part_counts_with_ghost
Particle counts including ghosts.
constexpr const char * xyz
Position field (3D coordinates).
constexpr const char * part_counts
Particle counts per patch.
constexpr const char * pressure
Pressure P (derived from EOS).
constexpr const char * hpart
Smoothing length field.
constexpr const char * omega
Grad-h correction factor \Omega.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
A buffer allocated in USM (Unified Shared Memory).
void complete_event_state(sycl::event e) const
Complete the event state of the buffer.
T * get_write_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{})
Get a read-write pointer to the buffer's data.
const T * get_read_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{}) const
Get a read-only pointer to the buffer's data.
A SYCL queue associated with a device and a context.
sycl::event submit(Fct &&fct)
Submits a kernel to the SYCL queue.
Class to manage a list of SYCL events.
void add_event(sycl::event e)
Add an event to the list of events.
Represents a collection of objects distributed across patches identified by a u64 id.
iterator add_obj(u64 id, T &&obj)
Adds a new object to the collection.
DistributedData< Tmap > map(std::function< Tmap(u64, T &)> map_func)
Apply a function to all objects in the collection and return a new collection containing the results.
T & get(u64 id)
Returns a reference to an object in the collection.
u32 get_field_idx(const std::string &field_name) const
Get the field id if matching name & type.
PatchDataLayer container class, the layout is described in patchdata_layout.
A graph container for managing solver nodes and edges with type-safe access.
std::shared_ptr< T > get_edge_ptr(const std::string &name)
Get a typed shared pointer to an edge by name.
T inv_sat_positive(T v, T minvsat=T{1e-9}, T satval=T{0.}) noexcept
inverse saturated (positive numbers only)
T & get_check_ref(const std::unique_ptr< T > &ptr, SourceLocation loc=SourceLocation())
Takes a std::unique_ptr and returns a reference to the object it holds. It throws a std::runtime_erro...
void throw_unimplemented(SourceLocation loc=SourceLocation{})
Throw a std::runtime_error saying that the function is unimplemented.
namespace for math utility
namespace for the main framework
constexpr Tscal q_av(const Tscal &rho, const Tscal &vsig, const Tscal &v_scal_rhat)
phantom_2018 eq.40
file containing formulas for sphmhd forces, evolution of magnetic and divergence cleaning fields.
file containing formulas for sph forces
shambase::details::BasicStackEntry StackEntry
Alias for shambase::details::BasicStackEntry.
Patch object that contain generic patch information.
u64 id_patch
unique key that identify the patch