Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
forces.hpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
10#pragma once
11
20#include "shambackends/math.hpp"
21
22namespace shamrock::sph {
23
24 template<class Tscal>
25 inline static constexpr Tscal vsig_hydro(
26 const Tscal &abs_v_ab_r_ab,
27 const Tscal &cs_a,
28 const Tscal &alpha_av,
29 const Tscal &beta_av) {
30 return alpha_av * cs_a + beta_av * abs_v_ab_r_ab;
31 ;
32 };
33
34 template<class Tscal>
35 inline static constexpr Tscal vsig_u(
36 const Tscal &P_a, const Tscal &P_b, const Tscal &rho_a, const Tscal &rho_b) {
37 Tscal rho_avg = (rho_a + rho_b) * 0.5;
38 Tscal abs_dp = sham::abs(P_a - P_b);
39 return sycl::sqrt(abs_dp / rho_avg);
40 // Tscal vsig_u = abs_v_ab_r_ab;
41 }
42
59 template<class Tvec, class Tscal>
61 const Tscal &m_b,
62 const Tscal &rho_a_sq,
63 const Tscal &rho_b_sq,
64 const Tscal &P_a,
65 const Tscal &P_b,
66 const Tscal &omega_a,
67 const Tscal &omega_b,
68 const Tvec &nabla_Wab_ha,
69 const Tvec &nabla_Wab_hb) {
70
71 Tscal sub_fact_a = rho_a_sq * omega_a;
72 Tscal sub_fact_b = rho_b_sq * omega_b;
73
74 // inv_sat(.,eps) mean that if sub_fact_. == 0, we return 0
75 Tvec acc_a = ((P_a) *sham::inv_sat_zero(sub_fact_a)) * nabla_Wab_ha;
76 Tvec acc_b = ((P_b) *sham::inv_sat_zero(sub_fact_b)) * nabla_Wab_hb;
77
78 return -m_b * (acc_a + acc_b);
79 }
80
99 template<class Tvec, class Tscal>
101 const Tscal &m_b,
102 const Tscal &rho_a_sq,
103 const Tscal &rho_b_sq,
104 const Tscal &P_a,
105 const Tscal &P_b,
106 const Tscal &omega_a,
107 const Tscal &omega_b,
108 const Tscal &qa_ab,
109 const Tscal &qb_ab,
110 const Tvec &nabla_Wab_ha,
111 const Tvec &nabla_Wab_hb) {
113 m_b,
114 rho_a_sq,
115 rho_b_sq,
116 P_b + qa_ab,
117 P_a + qb_ab,
118 omega_a,
119 omega_b,
120 nabla_Wab_ha,
121 nabla_Wab_hb);
122 }
123
137 template<class Tvec, class Tscal>
138 inline Tscal duint_dt_pressure(
139 const Tscal &pmass,
140 const Tscal &P_a,
141 const Tscal &inv_omega_a_2_rho_a,
142 const Tvec &v_ab,
143 const Tvec &grad_W_ab) {
144 return P_a * inv_omega_a_2_rho_a * pmass * sycl::dot(v_ab, grad_W_ab);
145 }
146
160 template<class Tscal>
162 const Tscal &pmass,
163 const Tscal &alpha_u,
164 const Tscal &vsig_u,
165 const Tscal &u_ab,
166 const Tscal &Fab_inv_omega_a_rho_a,
167 const Tscal &Fab_inv_omega_b_rho_b) {
168 return pmass * alpha_u * vsig_u * u_ab * Tscal(0.5)
169 * (Fab_inv_omega_a_rho_a + Fab_inv_omega_b_rho_b);
170 }
171
172 template<class Tvec, class Tscal>
173 inline void add_to_derivs_sph_artif_visco_cond(
174 const Tscal &pmass,
175 const Tscal &rho_a_sq,
176 const Tscal &omega_a_rho_a_inv,
177 const Tscal &rho_a_inv,
178 const Tscal &rho_b,
179 const Tscal &omega_a,
180 const Tscal &omega_b,
181 const Tscal &Fab_a,
182 const Tscal &Fab_b,
183 const Tscal &u_a,
184 const Tscal &u_b,
185 const Tscal &P_a,
186 const Tscal &P_b,
187 const Tscal &alpha_u,
188
189 const Tvec &v_ab,
190 const Tvec &r_ab_unit,
191 const Tscal &vsig_u,
192
193 const Tscal &qa_ab,
194 const Tscal &qb_ab,
195
196 Tvec &dv_dt,
197 Tscal &du_dt) {
198
199 Tscal AV_P_a = P_a + qa_ab;
200 Tscal AV_P_b = P_b + qb_ab;
201
202 dv_dt += sph_pressure_symetric(
203 pmass,
204 rho_a_sq,
205 rho_b * rho_b,
206 AV_P_a,
207 AV_P_b,
208 omega_a,
209 omega_b,
210 r_ab_unit * Fab_a,
211 r_ab_unit * Fab_b);
212
213 // compared to Phantom_2018 eq.35 we move lambda shock artificial viscosity
214 // pressure part as just a modified SPH pressure (which is the case already in
215 // phantom paper but not written that way)
216 du_dt += duint_dt_pressure(
217 pmass, AV_P_a, omega_a_rho_a_inv * rho_a_inv, v_ab, r_ab_unit * Fab_a);
218
219 du_dt += lambda_shock_conductivity(
220 pmass,
221 alpha_u,
222 vsig_u,
223 u_a - u_b,
224 Fab_a * omega_a_rho_a_inv,
225 Fab_b / (rho_b * omega_b));
226 }
227
228} // namespace shamrock::sph
T inv_sat_zero(T v, T satval=T{0.}) noexcept
inverse saturated (zero version)
Definition math.hpp:870
Tvec sph_pressure_symetric(const Tscal &m_b, const Tscal &rho_a_sq, const Tscal &rho_b_sq, const Tscal &P_a, const Tscal &P_b, const Tscal &omega_a, const Tscal &omega_b, const Tvec &nabla_Wab_ha, const Tvec &nabla_Wab_hb)
eq.34, with
Definition forces.hpp:60
Tvec sph_pressure_symetric_av(const Tscal &m_b, const Tscal &rho_a_sq, const Tscal &rho_b_sq, const Tscal &P_a, const Tscal &P_b, const Tscal &omega_a, const Tscal &omega_b, const Tscal &qa_ab, const Tscal &qb_ab, const Tvec &nabla_Wab_ha, const Tvec &nabla_Wab_hb)
eq.34
Definition forces.hpp:100
Tscal duint_dt_pressure(const Tscal &pmass, const Tscal &P_a, const Tscal &inv_omega_a_2_rho_a, const Tvec &v_ab, const Tvec &grad_W_ab)
eq.35
Definition forces.hpp:138
Tscal lambda_shock_conductivity(const Tscal &pmass, const Tscal &alpha_u, const Tscal &vsig_u, const Tscal &u_ab, const Tscal &Fab_inv_omega_a_rho_a, const Tscal &Fab_inv_omega_b_rho_b)
eq.42
Definition forces.hpp:161