31namespace shamrock::sph::mhd {
33 enum MHDType { Ideal = 0, NonIdeal = 1 };
36 template<
class Tvec,
class Tscal>
37 inline Tvec B_dot_grad_W(
49 Tscal sub_fact_a = rho_a_sq * omega_a;
50 Tscal sub_fact_b = rho_b_sq * omega_b;
52 Tscal B_dot_grad_W_a = sycl::dot(B_a, nabla_Wab_ha);
53 Tscal B_dot_grad_W_b = sycl::dot(B_b, nabla_Wab_hb);
58 return -m_b * (acc_a + acc_b);
62 template<
class Tvec,
class Tscal, MHDType MHD_mode = Ideal>
63 inline Tvec mag_tension(
72 Tvec magnetic_tension_term;
74 for (
int i = 0; i < 3; ++i) {
75 for (
int j = 0; j < 3; ++j) {
77 Tscal mag_tension_a = -(1. / mu_0) * B_a[i] * B_a[j];
78 Tscal mag_tension_b = -(1. / mu_0) * B_b[i] * B_b[j];
82 magnetic_tension_term[i] += -m_b
83 * (acc_mag_tension_a * nabla_Wab_ha[j]
84 + acc_mag_tension_b * nabla_Wab_hb[j]);
88 return magnetic_tension_term;
91 template<
class Tvec,
class Tscal, MHDType MHD_mode = Ideal>
104 return -0.5 * B_a * m_b * (acc_fdivB_a + acc_fdivB_b)
108 template<
class Tvec,
class Tscal>
109 inline Tscal lambda_artes(
121 Tscal B_ab_sq = sycl::dot(B_a - B_b, B_a - B_b);
123 Tscal sub_fact_a = rho_a_sq * omega_a;
124 Tscal sub_fact_b = rho_b_sq * omega_b;
129 Tscal artres = -0.25 * m_b * vsigb * (acc_a + acc_b) * B_ab_sq;
133 template<
class Tvec,
class Tscal, MHDType MHD_mode = Ideal>
134 inline Tscal dB_on_rho_induction_term(
135 Tscal m_b, Tscal rho_a_sq, Tvec B_a, Tscal omega_a, Tvec nabla_Wab_ha) {
137 Tscal sub_fact_a = rho_a_sq * omega_a;
138 Tscal induction_term_no_vab
141 return induction_term_no_vab;
144 template<
class Tvec,
class Tscal, MHDType MHD_mode = Ideal>
145 inline Tvec dB_on_rho_psi_term(
156 Tscal sub_fact_a = rho_a_sq * omega_a;
157 Tscal sub_fact_b = rho_b_sq * omega_b;
162 Tvec psiterm = -m_b * (psisubterm_a + psisubterm_a);
167 template<
class Tvec,
class Tscal, MHDType MHD_mode = Ideal>
168 inline Tscal dpsi_on_ch_parabolic_propag(
169 Tscal m_b, Tscal rho_a, Tvec B_a, Tvec B_b, Tscal omega_a, Tvec nabla_Wab_ha, Tscal ch_a) {
171 Tscal sub_fact_a = rho_a * omega_a;
172 Tvec B_ab = (B_a - B_b);
174 Tscal divB_a = -(1. *
sham::inv_sat_zero(sub_fact_a)) * m_b * sycl::dot(B_ab, nabla_Wab_ha);
177 * sycl::dot(B_ab, nabla_Wab_ha);
179 return parabolic_propag;
182 template<
class Tvec,
class Tscal, MHDType MHD_mode = Ideal>
183 inline Tscal dpsi_on_ch_parabolic_diff(
192 Tscal sub_fact_a = 2. * rho_a * omega_a * ch_a;
197 return parabolic_diff;
200 template<
class Kernel,
class Tvec,
class Tscal, MHDType MHD_mode = Ideal>
201 inline void add_to_derivs_spmhd(
207 Tscal omega_a_rho_a_inv,
239 Tscal &dpsi_on_ch_dt,
251 Tscal &u_pressure_viscous_heating) {
253 using namespace shamrock::sph;
255 Tvec v_ab = vxyz_a - vxyz_b;
258 Tscal v_ab_r_ab = sycl::dot(v_ab, r_ab_unit);
259 Tscal abs_v_ab_r_ab = sycl::fabs(v_ab_r_ab);
261 Tscal vsig_u = shamrock::sph::vsig_u(P_a, P_b, rho_a, rho_b);
263 v_ab, r_ab_unit, cs_a, B_a, rho_a, mu_0, 1., 1.);
265 v_ab, r_ab_unit, cs_a, B_b, rho_b, mu_0, 1., 1.);
267 Tscal dWab_a = Fab_a;
268 Tscal dWab_b = Fab_b;
270 Tscal sub_fact_a = rho_a_sq * omega_a;
271 Tscal sub_fact_b = rho_b * rho_b * omega_b;
280 Tscal AV_P_a = P_a + qa_ab;
281 Tscal AV_P_b = P_b + qb_ab;
283 Tvec sum_mag_tension, sum_fdivB = {0., 0., 0.};
284 Tscal sum_psi_propag, sum_psi_diff = 0.;
294 pmass, B_a, B_b, r_ab_unit * dWab_a, r_ab_unit * dWab_b, sub_fact_a, sub_fact_b, mu_0);
296 Tvec gas_pressure_pishock = sph::sph_pressure_symetric(
307 sum_mag_tension += -B_dot_grad_W(
319 Tvec magnetic_pressure_term = (1. / (2 * mu_0))
320 * sph::sph_pressure_symetric(
331 dv_dt += gas_pressure_pishock + magnetic_pressure_term + sum_mag_tension + sum_fdivB;
335 mag_pressure += magnetic_pressure_term;
336 gas_pressure += gas_pressure_pishock;
337 mag_tension += sum_mag_tension;
338 tensile_corr += sum_fdivB;
342 u_pressure_viscous_heating = sph::duint_dt_pressure(
343 pmass, AV_P_a, omega_a_rho_a_inv * rho_a_inv, v_ab, r_ab_unit * dWab_a);
345 du_dt += u_pressure_viscous_heating;
347 du_dt += sph::lambda_shock_conductivity(
352 dWab_a * omega_a_rho_a_inv,
353 dWab_b / (rho_b * omega_b));
355 du_dt += lambda_artes(
356 pmass, rho_a_sq, rho_b * rho_b, vsig_B, B_a, B_b, omega_a, omega_b, Fab_a, Fab_b);
364 Tvec dB_on_rho_dissipation_term
365 = 0.5 * pmass * (rho_diss_term_a + rho_diss_term_b) * (B_a - B_b) * vsig_B;
368 += v_ab * dB_on_rho_induction_term(pmass, rho_a_sq, B_a, omega_a, r_ab_unit * dWab_b);
370 dB_on_rho_dt += dB_on_rho_psi_term(
381 dB_on_rho_dt += dB_on_rho_dissipation_term;
386 sum_psi_propag = dpsi_on_ch_parabolic_propag(
387 pmass, rho_a, B_a, B_b, omega_a, r_ab_unit * dWab_a, v_shock_a);
389 sum_psi_diff = dpsi_on_ch_parabolic_diff(
390 pmass, rho_a, v_ab, psi_a, omega_a, r_ab_unit * dWab_a, v_shock_a);
392 dpsi_on_ch_dt += sum_psi_propag;
393 dpsi_on_ch_dt += sum_psi_diff;
398 psi_propag += sum_psi_propag;
399 psi_diff += sum_psi_diff;
403 drho_dt += (1. / omega_a) * pmass * sycl::dot(v_ab, r_ab_unit * dWab_a);
T inv_sat_positive(T v, T minvsat=T{1e-9}, T satval=T{0.}) noexcept
inverse saturated (positive numbers only)
T inv_sat_zero(T v, T satval=T{0.}) noexcept
inverse saturated (zero version)
constexpr Tscal q_av(const Tscal &rho, const Tscal &vsig, const Tscal &v_scal_rhat)
eq.40
file containing formulas for sph forces