49template<
class Tvec,
template<
class>
class SPHKernel>
50void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs(Tscal dt_hydro) {
52 Cfg_AV cfg_av = solver_config.artif_viscosity;
53 Cfg_MHD cfg_mhd = solver_config.mhd_config;
54 DustConfig cfg_dust = solver_config.dust_config;
56 if (Constant *v = std::get_if<Constant>(&cfg_av.config)) {
57 update_derivs_constantAV(*v);
58 }
else if (VaryingMM97 *v = std::get_if<VaryingMM97>(&cfg_av.config)) {
59 update_derivs_mm97(*v);
60 }
else if (VaryingCD10 *v = std::get_if<VaryingCD10>(&cfg_av.config)) {
61 update_derivs_cd10(*v);
62 }
else if (ConstantDisc *v = std::get_if<ConstantDisc>(&cfg_av.config)) {
63 update_derivs_disc_visco(*v);
64 }
else if (IdealMHD *v = std::get_if<IdealMHD>(&cfg_mhd.config)) {
65 update_derivs_MHD(*v);
66 }
else if (NonIdealMHD *v = std::get_if<NonIdealMHD>(&cfg_mhd.config)) {
68 }
else if (NoneMHD *v = std::get_if<NoneMHD>(&cfg_mhd.config)) {
70 }
else if (None *v = std::get_if<None>(&cfg_av.config)) {
76 if (cfg_dust.has_s_j_field()) {
78 update_derivs_dust_monofluid_tvi_Sj(cfg_dust, dt_hydro);
82template<
class Tvec,
template<
class>
class SPHKernel>
83void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_noAV(None cfg) {}
85template<
class Tvec,
template<
class>
class SPHKernel>
86void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_constantAV(
91 using namespace shamrock::patch;
104 u32 ihpart_interf = ghost_layout.get_field_idx<Tscal>(
"hpart");
105 u32 iuint_interf = ghost_layout.get_field_idx<Tscal>(
"uint");
106 u32 ivxyz_interf = ghost_layout.get_field_idx<Tvec>(
"vxyz");
107 u32 iomega_interf = ghost_layout.get_field_idx<Tscal>(
"omega");
109 auto &merged_xyzh = storage.merged_xyzh.get();
117 = merged_xyzh.get(cur_p.
id_patch).template get_field_buf_ref<Tvec>(0);
129 sycl::range range_npart{pdat.get_obj_cnt()};
141 auto du = buf_duint.get_write_access(depends_list);
142 auto vxyz = buf_vxyz.get_read_access(depends_list);
143 auto hpart = buf_hpart.get_read_access(depends_list);
144 auto omega = buf_omega.get_read_access(depends_list);
145 auto u = buf_uint.get_read_access(depends_list);
146 auto pressure = buf_pressure.get_read_access(depends_list);
148 auto ploop_ptrs = pcache.get_read_access(depends_list);
150 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
151 const Tscal pmass = solver_config.gpart_mass;
152 const Tscal alpha_u = cfg.alpha_u;
153 const Tscal alpha_AV = cfg.alpha_AV;
154 const Tscal beta_AV = cfg.beta_AV;
156 shamlog_debug_sycl_ln(
"deriv kernel",
"alpha_u :", alpha_u);
157 shamlog_debug_sycl_ln(
"deriv kernel",
"alpha_AV :", alpha_AV);
158 shamlog_debug_sycl_ln(
"deriv kernel",
"beta_AV :", beta_AV);
171 constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern;
173 shambase::parallel_for(cgh, pdat.get_obj_cnt(),
"compute force cte AV", [=](
u64 gid) {
174 u32 id_a = (u32) gid;
176 using namespace shamrock::sph;
178 Tvec sum_axyz = {0, 0, 0};
181 Tscal h_a = hpart[id_a];
182 Tvec xyz_a = xyz[id_a];
183 Tvec vxyz_a = vxyz[id_a];
184 Tscal P_a = pressure[id_a];
185 Tscal omega_a = omega[id_a];
186 const Tscal u_a = u[id_a];
188 Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd);
189 Tscal rho_a_sq = rho_a * rho_a;
190 Tscal rho_a_inv = 1. / rho_a;
194 Tscal omega_a_rho_a_inv = 1 / (omega_a * rho_a);
196 Tscal cs_a = cs[id_a];
198 Tvec force_pressure{0, 0, 0};
199 Tscal tmpdU_pressure = 0;
201 particle_looper.for_each_object(id_a, [&](
u32 id_b) {
203 Tvec dr = xyz_a -
xyz[id_b];
204 Tscal rab2 = sycl::dot(dr, dr);
205 Tscal h_b =
hpart[id_b];
207 if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) {
211 Tscal rab = sycl::sqrt(rab2);
212 Tvec vxyz_b =
vxyz[id_b];
213 const Tscal u_b = u[id_b];
215 Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd);
218 Tscal omega_b =
omega[id_b];
219 Tscal cs_b = cs[id_b];
221 const Tscal alpha_a = alpha_AV;
222 const Tscal alpha_b = alpha_AV;
224 Tscal Fab_a = Kernel::dW_3d(rab, h_a);
225 Tscal Fab_b = Kernel::dW_3d(rab, h_b);
227 Tvec v_ab = vxyz_a - vxyz_b;
232 Tscal v_ab_r_ab = sycl::dot(v_ab, r_ab_unit);
233 Tscal abs_v_ab_r_ab = sycl::fabs(v_ab_r_ab);
235 Tscal vsig_a = alpha_a * cs_a + beta_AV * abs_v_ab_r_ab;
236 Tscal vsig_b = alpha_b * cs_b + beta_AV * abs_v_ab_r_ab;
238 Tscal vsig_u = shamrock::sph::vsig_u(P_a, P_b, rho_a, rho_b);
243 add_to_derivs_sph_artif_visco_cond(
266 axyz[id_a] = force_pressure;
267 du[id_a] = tmpdU_pressure;
273 buf_duint.complete_event_state(e);
274 buf_vxyz.complete_event_state(e);
275 buf_hpart.complete_event_state(e);
276 buf_omega.complete_event_state(e);
277 buf_uint.complete_event_state(e);
278 buf_pressure.complete_event_state(e);
283 pcache.complete_event_state(resulting_events);
286template<
class Tvec,
template<
class>
class SPHKernel>
287void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_mm97(VaryingMM97 cfg) {
291 using namespace shamrock::patch;
304 u32 ihpart_interf = ghost_layout.get_field_idx<Tscal>(
"hpart");
305 u32 iuint_interf = ghost_layout.get_field_idx<Tscal>(
"uint");
306 u32 ivxyz_interf = ghost_layout.get_field_idx<Tvec>(
"vxyz");
307 u32 iomega_interf = ghost_layout.get_field_idx<Tscal>(
"omega");
309 auto &merged_xyzh = storage.merged_xyzh.get();
315 auto &xyz_refs = storage.positions_with_ghosts;
316 auto &pressure_field = storage.pressure;
317 auto &soundspeed_field = storage.soundspeed;
319 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> uint_refs
320 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"uint",
"u");
325 return std::ref(mpdat.get_field<Tscal>(iuint_interf));
329 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tvec>> vxyz_refs
330 = std::make_shared<shamrock::solvergraph::FieldRefs<Tvec>>(
"vxyz",
"v");
335 return std::ref(mpdat.get_field<Tvec>(ivxyz_interf));
339 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> hpart_refs
340 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"hpart",
"h");
345 return std::ref(mpdat.get_field<Tscal>(ihpart_interf));
349 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> omega_refs
350 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"omega",
"omega");
355 return std::ref(mpdat.get_field<Tscal>(iomega_interf));
359 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> alpha_av_refs
360 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"alpha_av",
"alpha_av");
365 cur_p.
id_patch, std::ref(storage.alpha_av_ghost.get().get(cur_p.
id_patch)));
377 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> alpha_u
378 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"alpha_u",
"alpha_u");
382 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> beta_AV
383 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"beta_AV",
"beta_AV");
388 std::shared_ptr<NodeUpdateDerivsVaryingAlphaAV<Tvec, SPHKernel>> node
389 = std::make_shared<NodeUpdateDerivsVaryingAlphaAV<Tvec, SPHKernel>>();
396 part_counts_with_ghost,
411template<
class Tvec,
template<
class>
class SPHKernel>
412void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_cd10(VaryingCD10 cfg) {
416 using namespace shamrock::patch;
429 u32 ihpart_interf = ghost_layout.get_field_idx<Tscal>(
"hpart");
430 u32 iuint_interf = ghost_layout.get_field_idx<Tscal>(
"uint");
431 u32 ivxyz_interf = ghost_layout.get_field_idx<Tvec>(
"vxyz");
432 u32 iomega_interf = ghost_layout.get_field_idx<Tscal>(
"omega");
434 auto &merged_xyzh = storage.merged_xyzh.get();
440 auto &xyz_refs = storage.positions_with_ghosts;
441 auto &pressure_field = storage.pressure;
442 auto &soundspeed_field = storage.soundspeed;
444 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> uint_refs
445 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"uint",
"u");
450 return std::ref(mpdat.get_field<Tscal>(iuint_interf));
454 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tvec>> vxyz_refs
455 = std::make_shared<shamrock::solvergraph::FieldRefs<Tvec>>(
"vxyz",
"v");
460 return std::ref(mpdat.get_field<Tvec>(ivxyz_interf));
464 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> hpart_refs
465 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"hpart",
"h");
470 return std::ref(mpdat.get_field<Tscal>(ihpart_interf));
474 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> omega_refs
475 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"omega",
"omega");
480 return std::ref(mpdat.get_field<Tscal>(iomega_interf));
484 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> alpha_av_refs
485 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"alpha_av",
"alpha_av");
490 cur_p.
id_patch, std::ref(storage.alpha_av_ghost.get().get(cur_p.
id_patch)));
502 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> alpha_u
503 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"alpha_u",
"alpha_u");
507 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> beta_AV
508 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"beta_AV",
"beta_AV");
513 std::shared_ptr<NodeUpdateDerivsVaryingAlphaAV<Tvec, SPHKernel>> node
514 = std::make_shared<NodeUpdateDerivsVaryingAlphaAV<Tvec, SPHKernel>>();
521 part_counts_with_ghost,
537template<
class Tvec,
template<
class>
class SPHKernel>
538void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_disc_visco(
543 using namespace shamrock::patch;
556 u32 ihpart_interf = ghost_layout.get_field_idx<Tscal>(
"hpart");
557 u32 iuint_interf = ghost_layout.get_field_idx<Tscal>(
"uint");
558 u32 ivxyz_interf = ghost_layout.get_field_idx<Tvec>(
"vxyz");
559 u32 iomega_interf = ghost_layout.get_field_idx<Tscal>(
"omega");
561 auto &merged_xyzh = storage.merged_xyzh.get();
569 = merged_xyzh.get(cur_p.
id_patch).template get_field_buf_ref<Tvec>(0);
581 sycl::range range_npart{pdat.get_obj_cnt()};
593 auto du = buf_duint.get_write_access(depends_list);
594 auto vxyz = buf_vxyz.get_read_access(depends_list);
595 auto hpart = buf_hpart.get_read_access(depends_list);
596 auto omega = buf_omega.get_read_access(depends_list);
597 auto u = buf_uint.get_read_access(depends_list);
598 auto pressure = buf_pressure.get_read_access(depends_list);
600 auto ploop_ptrs = pcache.get_read_access(depends_list);
602 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
603 const Tscal pmass = solver_config.gpart_mass;
604 const Tscal alpha_AV = cfg.alpha_AV;
605 const Tscal alpha_u = cfg.alpha_u;
606 const Tscal beta_AV = cfg.beta_AV;
608 shamlog_debug_sycl_ln(
"deriv kernel",
"alpha_AV :", alpha_AV);
609 shamlog_debug_sycl_ln(
"deriv kernel",
"alpha_u :", alpha_u);
610 shamlog_debug_sycl_ln(
"deriv kernel",
"beta_AV :", beta_AV);
623 constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern;
625 shambase::parallel_for(cgh, pdat.get_obj_cnt(),
"compute force disc", [=](
u64 gid) {
626 u32 id_a = (u32) gid;
628 using namespace shamrock::sph;
630 Tvec sum_axyz = {0, 0, 0};
633 Tscal h_a = hpart[id_a];
634 Tvec xyz_a = xyz[id_a];
635 Tvec vxyz_a = vxyz[id_a];
636 Tscal P_a = pressure[id_a];
637 Tscal cs_a = cs[id_a];
638 Tscal omega_a = omega[id_a];
639 const Tscal u_a = u[id_a];
641 Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd);
642 Tscal rho_a_sq = rho_a * rho_a;
643 Tscal rho_a_inv = 1. / rho_a;
647 Tscal omega_a_rho_a_inv = 1 / (omega_a * rho_a);
649 Tvec force_pressure{0, 0, 0};
650 Tscal tmpdU_pressure = 0;
652 particle_looper.for_each_object(id_a, [&](
u32 id_b) {
654 Tvec dr = xyz_a -
xyz[id_b];
655 Tscal rab2 = sycl::dot(dr, dr);
656 Tscal h_b =
hpart[id_b];
658 if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) {
662 Tvec vxyz_b =
vxyz[id_b];
663 const Tscal u_b = u[id_b];
665 Tscal omega_b =
omega[id_b];
666 Tscal cs_b = cs[id_b];
668 Tscal rab = sycl::sqrt(rab2);
670 Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd);
671 const Tscal alpha_a = alpha_AV;
672 const Tscal alpha_b = alpha_AV;
673 Tscal Fab_a = Kernel::dW_3d(rab, h_a);
674 Tscal Fab_b = Kernel::dW_3d(rab, h_b);
676 Tvec v_ab = vxyz_a - vxyz_b;
681 Tscal v_ab_r_ab = sycl::dot(v_ab, r_ab_unit);
682 Tscal abs_v_ab_r_ab = sycl::fabs(v_ab_r_ab);
684 Tscal vsig_a = alpha_a * cs_a + beta_AV * abs_v_ab_r_ab;
685 Tscal vsig_b = alpha_b * cs_b + beta_AV * abs_v_ab_r_ab;
687 Tscal vsig_u = shamrock::sph::vsig_u(P_a, P_b, rho_a, rho_b);
689 Tscal qa_ab = shamrock::sph::q_av_disc(
690 rho_a, h_a, rab, alpha_a, cs_a, vsig_a, v_ab_r_ab);
691 Tscal qb_ab = shamrock::sph::q_av_disc(
692 rho_b, h_b, rab, alpha_b, cs_b, vsig_b, v_ab_r_ab);
694 add_to_derivs_sph_artif_visco_cond(
719 axyz[id_a] = force_pressure;
720 du[id_a] = tmpdU_pressure;
726 buf_duint.complete_event_state(e);
727 buf_vxyz.complete_event_state(e);
728 buf_hpart.complete_event_state(e);
729 buf_omega.complete_event_state(e);
730 buf_uint.complete_event_state(e);
731 buf_pressure.complete_event_state(e);
736 pcache.complete_event_state(resulting_events);
740template<
class Tvec,
template<
class>
class SPHKernel>
741void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_MHD(IdealMHD cfg) {
745 using namespace shamrock::patch;
761 bool do_MHD_debug = solver_config.do_MHD_debug();
762 const u32 imag_pressure = (do_MHD_debug) ? pdl.
get_field_idx<Tvec>(
"mag_pressure") : -1;
763 const u32 imag_tension = (do_MHD_debug) ? pdl.
get_field_idx<Tvec>(
"mag_tension") : -1;
764 const u32 igas_pressure = (do_MHD_debug) ? pdl.
get_field_idx<Tvec>(
"gas_pressure") : -1;
765 const u32 itensile_corr = (do_MHD_debug) ? pdl.
get_field_idx<Tvec>(
"tensile_corr") : -1;
766 const u32 ipsi_propag = (do_MHD_debug) ? pdl.
get_field_idx<Tscal>(
"psi_propag") : -1;
767 const u32 ipsi_diff = (do_MHD_debug) ? pdl.
get_field_idx<Tscal>(
"psi_diff") : -1;
768 const u32 ipsi_cons = (do_MHD_debug) ? pdl.
get_field_idx<Tscal>(
"psi_cons") : -1;
772 Tscal
const mu_0 = solver_config.get_constant_mu_0();
785 auto &merged_xyzh = storage.merged_xyzh.get();
793 = merged_xyzh.get(cur_p.
id_patch).template get_field_buf_ref<Tvec>(0);
812 = mpdat.get_field_buf_ref<Tscal>(ipsi_on_ch_interf);
817 sycl::range range_npart{pdat.get_obj_cnt()};
829 auto du = buf_duint.get_write_access(depends_list);
830 auto vxyz = buf_vxyz.get_read_access(depends_list);
831 auto hpart = buf_hpart.get_read_access(depends_list);
832 auto omega = buf_omega.get_read_access(depends_list);
833 auto u = buf_uint.get_read_access(depends_list);
834 auto pressure = buf_pressure.get_read_access(depends_list);
836 auto B_on_rho = buf_B_on_rho.get_read_access(depends_list);
837 auto psi_on_ch = buf_psi_on_ch.get_read_access(depends_list);
839 auto dpsi_on_ch = buf_dpsi_on_ch.get_write_access(depends_list);
840 auto drho_dt = buf_drho_dt.get_write_access(depends_list);
844 ? pdat.get_field_buf_ref<Tvec>(imag_pressure).get_write_access(depends_list)
848 ? pdat.get_field_buf_ref<Tvec>(imag_tension).get_write_access(depends_list)
852 ? pdat.get_field_buf_ref<Tvec>(igas_pressure).get_write_access(depends_list)
856 ? pdat.get_field_buf_ref<Tvec>(itensile_corr).get_write_access(depends_list)
861 ? pdat.get_field_buf_ref<Tscal>(ipsi_propag).get_write_access(depends_list)
865 ? pdat.get_field_buf_ref<Tscal>(ipsi_diff).get_write_access(depends_list)
869 ? pdat.get_field_buf_ref<Tscal>(ipsi_cons).get_write_access(depends_list)
872 Tscal *u_mhd = (do_MHD_debug)
873 ? pdat.get_field_buf_ref<Tscal>(iu_mhd).get_write_access(depends_list)
876 auto ploop_ptrs = pcache.get_read_access(depends_list);
878 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
879 const Tscal pmass = solver_config.gpart_mass;
880 const Tscal sigma_mhd = cfg.sigma_mhd;
881 const Tscal alpha_u = cfg.alpha_u;
883 shamlog_debug_ln(
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
"");
884 shamlog_debug_sycl_ln(
"deriv kernel",
"sigma_mhd :", sigma_mhd);
885 shamlog_debug_sycl_ln(
"deriv kernel",
"alpha_u :", alpha_u);
886 shamlog_debug_ln(
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
"");
890 constexpr Tscal Rker2 = Kernel::Rkern * Kernel::Rkern;
892 shambase::parallel_for(cgh, pdat.get_obj_cnt(),
"compute MHD", [=](
u64 gid) {
893 u32 id_a = (u32) gid;
895 using namespace shamrock::sph;
897 Tvec sum_axyz = {0, 0, 0};
900 Tscal h_a = hpart[id_a];
901 Tvec xyz_a = xyz[id_a];
902 Tvec vxyz_a = vxyz[id_a];
903 Tscal P_a = pressure[id_a];
904 Tscal cs_a = cs[id_a];
905 Tscal omega_a = omega[id_a];
906 const Tscal u_a = u[id_a];
908 Tscal rho_a = rho_h(pmass, h_a, Kernel::hfactd);
909 Tscal rho_a_sq = rho_a * rho_a;
910 Tscal rho_a_inv = 1. / rho_a;
912 Tvec B_a = B_on_rho[id_a] * rho_a;
913 Tscal v_alfven_a = sycl::sqrt(sycl::dot(B_a, B_a) / (mu_0 * rho_a));
914 Tscal v_shock_a = sycl::sqrt(cs_a * cs_a + v_alfven_a * v_alfven_a);
915 Tscal psi_a = psi_on_ch[id_a] * v_shock_a;
917 Tscal omega_a_rho_a_inv = 1 / (omega_a * rho_a);
919 Tvec force_pressure{0, 0, 0};
920 Tscal tmpdU_pressure = 0;
921 Tvec magnetic_eq{0, 0, 0};
925 Tvec mag_pressure_term{0, 0, 0};
926 Tvec mag_tension_term{0, 0, 0};
927 Tvec gas_pressure_term{0, 0, 0};
928 Tvec tensile_corr_term{0, 0, 0};
930 Tscal psi_propag_term = 0;
931 Tscal psi_diff_term = 0;
932 Tscal psi_cons_term = 0;
934 Tscal u_mhd_term = 0;
936 particle_looper.for_each_object(id_a, [&](
u32 id_b) {
938 Tvec dr = xyz_a -
xyz[id_b];
939 Tscal rab2 = sycl::dot(dr, dr);
940 Tscal h_b =
hpart[id_b];
942 if (rab2 > h_a * h_a * Rker2 && rab2 > h_b * h_b * Rker2) {
946 Tvec vxyz_b =
vxyz[id_b];
947 const Tscal u_b = u[id_b];
949 Tscal omega_b =
omega[id_b];
950 Tscal cs_b = cs[id_b];
952 Tscal rab = sycl::sqrt(rab2);
954 Tscal rho_b = rho_h(pmass, h_b, Kernel::hfactd);
955 Tvec B_b = B_on_rho[id_b] * rho_b;
956 Tscal v_alfven_b = sycl::sqrt(sycl::dot(B_b, B_b) / (mu_0 * rho_b));
957 Tscal v_shock_b = sycl::sqrt(cs_b * cs_b + v_alfven_b * v_alfven_b);
958 Tscal psi_b = psi_on_ch[id_b] * v_shock_b;
961 Tscal Fab_a = Kernel::dW_3d(rab, h_a);
962 Tscal Fab_b = Kernel::dW_3d(rab, h_b);
965 shamrock::sph::mhd::add_to_derivs_spmhd<Kernel, Tvec, Tscal>(
1016 axyz[id_a] = force_pressure;
1017 du[id_a] = tmpdU_pressure;
1018 dB_on_rho[id_a] = magnetic_eq;
1019 dpsi_on_ch[id_a] = psi_eq - psi_a / h_a;
1020 drho_dt[id_a] = drho_eq;
1023 mag_pressure[id_a] = mag_pressure_term;
1024 mag_tension[id_a] = mag_tension_term;
1025 gas_pressure[id_a] = gas_pressure_term;
1026 tensile_corr[id_a] = tensile_corr_term;
1028 psi_propag[id_a] = psi_propag_term;
1029 psi_diff[id_a] = psi_diff_term;
1030 psi_cons[id_a] = -psi_a / h_a;
1032 u_mhd[id_a] = u_mhd_term;
1039 buf_duint.complete_event_state(e);
1040 buf_vxyz.complete_event_state(e);
1041 buf_hpart.complete_event_state(e);
1042 buf_omega.complete_event_state(e);
1043 buf_uint.complete_event_state(e);
1044 buf_pressure.complete_event_state(e);
1046 buf_B_on_rho.complete_event_state(e);
1047 buf_psi_on_ch.complete_event_state(e);
1049 buf_dpsi_on_ch.complete_event_state(e);
1050 buf_drho_dt.complete_event_state(e);
1053 pdat.get_field_buf_ref<Tvec>(imag_pressure).complete_event_state(e);
1054 pdat.get_field_buf_ref<Tvec>(imag_tension).complete_event_state(e);
1055 pdat.get_field_buf_ref<Tvec>(igas_pressure).complete_event_state(e);
1056 pdat.get_field_buf_ref<Tvec>(itensile_corr).complete_event_state(e);
1058 pdat.get_field_buf_ref<Tscal>(ipsi_propag).complete_event_state(e);
1059 pdat.get_field_buf_ref<Tscal>(ipsi_diff).complete_event_state(e);
1060 pdat.get_field_buf_ref<Tscal>(ipsi_cons).complete_event_state(e);
1062 pdat.get_field_buf_ref<Tscal>(iu_mhd).complete_event_state(e);
1067 pcache.complete_event_state(resulting_events);
1071template<
class Tvec,
template<
class>
class SPHKernel>
1072void shammodels::sph::modules::UpdateDerivs<Tvec, SPHKernel>::update_derivs_dust_monofluid_tvi_Sj(
1073 DustConfig cfg, Tscal dt_hydro) {
1075 using MonofluidTVI =
typename DustConfig::MonofluidTVI;
1080 using namespace shamrock::patch;
1093 u32 ihpart_interf = ghost_layout.get_field_idx<Tscal>(
"hpart");
1094 u32 ivxyz_interf = ghost_layout.get_field_idx<Tvec>(
"vxyz");
1095 u32 iomega_interf = ghost_layout.get_field_idx<Tscal>(
"omega");
1096 u32 is_j_interf = ghost_layout.get_field_idx<Tscal>(
"s_j");
1098 u32 ndust = cfg.get_dust_nvar();
1100 auto &merged_xyzh = storage.merged_xyzh.get();
1106 auto &xyz_refs = storage.positions_with_ghosts;
1107 auto &pressure_field = storage.pressure;
1113 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tvec>> vxyz_refs
1114 = std::make_shared<shamrock::solvergraph::FieldRefs<Tvec>>(
"vxyz",
"v");
1119 return std::ref(mpdat.get_field<Tvec>(ivxyz_interf));
1123 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> hpart_refs
1124 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"hpart",
"h");
1129 return std::ref(mpdat.get_field<Tscal>(ihpart_interf));
1133 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> omega_refs
1134 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"omega",
"omega");
1139 return std::ref(mpdat.get_field<Tscal>(iomega_interf));
1144 std::shared_ptr<shamrock::solvergraph::FieldRefs<Tscal>> s_j_refs
1145 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"s_j",
"s_j");
1150 return std::ref(mpdat.get_field<Tscal>(is_j_interf));
1154 std::shared_ptr<shamrock::solvergraph::Field<Tscal>> t_j_field
1155 = std::make_shared<shamrock::solvergraph::Field<Tscal>>(ndust,
"t_j",
"t_j");
1157 using None =
typename DustConfig::None;
1158 using ConstantStoppingTimes =
typename DustConfig::ConstantStoppingTimes;
1159 using EpsteinDrag =
typename DustConfig::EpsteinDrag;
1161 if (std::holds_alternative<None>(cfg.dust_drag_mode)) {
1166 ConstantStoppingTimes *cfg_drag = std::get_if<ConstantStoppingTimes>(&cfg.dust_drag_mode)) {
1168 std::shared_ptr<shamrock::solvergraph::ScalarEdge<std::vector<Tscal>>> input_t_j
1169 = std::make_shared<shamrock::solvergraph::ScalarEdge<std::vector<Tscal>>>(
"",
"");
1170 input_t_j->value = cfg_drag->stopping_times;
1172 std::shared_ptr<SetDustStoppingTimeConstant<Tvec>> node_set_tj
1173 = std::make_shared<SetDustStoppingTimeConstant<Tvec>>(ndust);
1175 node_set_tj->set_edges(input_t_j, part_counts_with_ghost, t_j_field);
1177 node_set_tj->evaluate();
1179 }
else if (EpsteinDrag *cfg_drag = std::get_if<EpsteinDrag>(&cfg.dust_drag_mode)) {
1181 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> input_gamma
1182 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"",
"");
1183 input_gamma->value = cfg_drag->gamma;
1185 std::shared_ptr<shamrock::solvergraph::ScalarEdge<std::vector<Tscal>>> input_sgrain_j
1186 = std::make_shared<shamrock::solvergraph::ScalarEdge<std::vector<Tscal>>>(
"",
"");
1187 input_sgrain_j->value = cfg_drag->grains_sizes;
1189 std::shared_ptr<shamrock::solvergraph::ScalarEdge<std::vector<Tscal>>> input_rho_grain_j
1190 = std::make_shared<shamrock::solvergraph::ScalarEdge<std::vector<Tscal>>>(
"",
"");
1191 input_rho_grain_j->value = cfg_drag->grains_densities;
1193 std::shared_ptr<SetDustStoppingTimeEpstein<Tvec, SPHKernel>> node_set_tj
1194 = std::make_shared<SetDustStoppingTimeEpstein<Tvec, SPHKernel>>(ndust);
1196 node_set_tj->set_edges(
1201 part_counts_with_ghost,
1206 node_set_tj->evaluate();
1209 std::shared_ptr<shamrock::solvergraph::Field<Tscal>> Ttilde_sj_field
1210 = std::make_shared<shamrock::solvergraph::Field<Tscal>>(ndust,
"Ttilde_sj",
"Ttilde_sj");
1215 std::shared_ptr<ComputeDustTtilde<Tvec, SPHKernel>> node_tj
1216 = std::make_shared<ComputeDustTtilde<Tvec, SPHKernel>>(ndust);
1219 gpart_mass, part_counts_with_ghost, hpart_refs, s_j_refs, t_j_field, Ttilde_sj_field);
1221 node_tj->evaluate();
1223 std::shared_ptr<NodeUpdateDerivsMonofluidTVI<Tvec, SPHKernel>> node
1224 = std::make_shared<NodeUpdateDerivsMonofluidTVI<Tvec, SPHKernel>>(ndust);
1229 part_counts_with_ghost,
1237 storage.neigh_cache,
1242 MonofluidTVI &cfg_monofluid_tvi
1245 if (cfg_monofluid_tvi.pure_diffusion_mode) {
1252 pdat.get_field_buf_ref<Tvec>(iaxyz).fill({0, 0, 0});
1253 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