32namespace shammodels::gsph::riemann {
57 const Tscal inv_gp1 = Tscal{1} / (gamma + Tscal{1});
58 const Tscal A = Tscal{2} * inv_gp1 / r1;
60 const Tscal B = p1 * (gamma - Tscal{1}) * inv_gp1;
61 return Tscal{-1} * LR * (p2 - p1) * sycl::sqrt(A / (p2 + B));
75 const Tscal cs1 = sycl::sqrt(gamma * p1 / r1);
76 return Tscal{-1} * LR * Tscal{2} * cs1 / (gamma - Tscal{1})
77 * (sycl::pow(p2 / p1, Tscal{0.5} * (gamma - Tscal{1}) / gamma) - Tscal{1});
81 inline Tscal exact_v_lr_ss(
82 Tscal pS, ExactState<Tscal> left, ExactState<Tscal> right, Tscal gamma) {
83 return exact_v_xc_shock(Tscal{-1}, pS, left.p, left.r, gamma)
84 - exact_v_xc_shock(Tscal{1}, pS, right.p, right.r, gamma);
88 inline Tscal exact_v_lr_rs(
95 inline Tscal exact_v_lr_sr(
101 template<
class Tscal>
102 inline Tscal exact_v_lr_rr(
112 template<
class Tscal>
115 const Tscal v_lr_0 = left.
v - right.
v;
116 if (left.
p > right.
p) {
117 if (v_lr_0 > exact_v_lr_ss(left.
p, left, right, gamma)) {
119 }
else if (v_lr_0 > exact_v_lr_rs(right.
p, left, right, gamma)) {
125 if (v_lr_0 > exact_v_lr_ss(right.
p, left, right, gamma)) {
127 }
else if (v_lr_0 > exact_v_lr_sr(left.
p, left, right, gamma)) {
143 template<
class Tscal,
class Res
idualFn>
145 Tscal posi, Tscal nega, Tscal v_lr_0, Tscal tol,
u32 max_iter, ResidualFn residual) {
146 constexpr Tscal eps = Tscal{1e-16};
148 Tscal half = Tscal{0};
149 Tscal bis2 = residual(posi) - v_lr_0;
150 for (
u32 i = 0; i < max_iter; ++i) {
151 const Tscal bis1 = bis2;
152 half = Tscal{0.5} * (posi + nega);
153 bis2 = residual(half) - v_lr_0;
155 if (sycl::fmax(sycl::fabs(bis2), sycl::fabs(bis2 - bis1) / (sycl::fabs(bis1) + eps))
157 || bis2 == Tscal{0}) {
161 if (bis2 > Tscal{0}) {
173 template<
class Tscal>
176 constexpr Tscal scale_up = Tscal{1.00001};
177 constexpr Tscal scale_down = Tscal{0.99999};
179 const Tscal v_lr_0 = left.
v - right.
v;
185 Tscal posi = (left.
p + right.
p) * scale_up;
186 bool bracketed =
false;
187 for (
u32 i = 0; i < 300; ++i) {
188 if (exact_v_lr_ss(posi, left, right, gamma) - v_lr_0 > Tscal{0}) {
195 posi = sycl::fmax(left.
p, right.
p);
197 const Tscal nega = sycl::fmin(left.
p, right.
p) * scale_down;
200 return exact_v_lr_ss(p, left, right, gamma);
207 template<
class Tscal>
210 constexpr Tscal scale_up = Tscal{1.00001};
211 constexpr Tscal scale_down = Tscal{0.99999};
213 const Tscal v_lr_0 = left.
v - right.
v;
214 const Tscal posi = left.
p * scale_up;
215 const Tscal nega = right.
p * scale_down;
218 return exact_v_lr_rs(p, left, right, gamma);
225 template<
class Tscal>
228 constexpr Tscal scale_up = Tscal{1.00001};
229 constexpr Tscal scale_down = Tscal{0.99999};
231 const Tscal v_lr_0 = left.
v - right.
v;
232 const Tscal posi = right.
p * scale_up;
233 const Tscal nega = left.
p * scale_down;
236 return exact_v_lr_sr(p, left, right, gamma);
243 template<
class Tscal>
246 constexpr Tscal scale_up = Tscal{1.00001};
248 const Tscal v_lr_0 = left.
v - right.
v;
249 const Tscal posi = sycl::fmin(left.
p, right.
p) * scale_up;
250 const Tscal nega = Tscal{0};
253 return exact_v_lr_rr(p, left, right, gamma);
280 template<
class Tscal>
289 Tscal tol = Tscal{1.0e-8},
290 u32 max_iter = 100) {
292 RiemannResult<Tscal> result;
294 const Tscal smallp = Tscal{1.0e-25};
295 const Tscal smallrho = Tscal{1.0e-25};
297 if (rho_L < smallrho || rho_R < smallrho || p_L < smallp || p_R < smallp) {
298 result.p_star = sycl::fmax(smallp, Tscal{0.5} * (p_L + p_R));
299 result.v_star = Tscal{0.5} * (u_L + u_R);
316 if (wave_pattern == 11) {
318 }
else if (wave_pattern == 21) {
320 }
else if (wave_pattern == 12) {
325 p_star = sycl::fmax(p_star, smallp);
327 const Tscal ave_v = Tscal{0.5} * (left.v + right.v);
329 if (wave_pattern == 11) {
334 }
else if (wave_pattern == 21) {
339 }
else if (wave_pattern == 12) {
351 result.p_star = p_star;
352 result.v_star = v_star;
std::uint32_t u32
32 bit unsigned integer
std::int32_t i32
32 bit integer
Tscal exact_bisection_rs(ExactState< Tscal > left, ExactState< Tscal > right, Tscal gamma, Tscal tol, u32 max_iter)
Bisection solve for the rarefaction/shock (21) wave pattern.
i32 exact_judge_wave_pattern(ExactState< Tscal > left, ExactState< Tscal > right, Tscal gamma)
Wave pattern codes: 11=shock/shock, 21=rarefaction/shock, 12=shock/rarefaction, 22=rarefaction/rarefa...
Tscal exact_v_xc_shock(Tscal LR, Tscal p2, Tscal p1, Tscal r1, Tscal gamma)
Relative velocity jump across a shock wave (Rankine-Hugoniot).
Tscal exact_bisection_generic(Tscal posi, Tscal nega, Tscal v_lr_0, Tscal tol, u32 max_iter, ResidualFn residual)
Shared bisection loop for a single wave-pattern's residual function.
Tscal exact_bisection_rr(ExactState< Tscal > left, ExactState< Tscal > right, Tscal gamma, Tscal tol, u32 max_iter)
Bisection solve for the rarefaction/rarefaction (22) wave pattern.
Tscal exact_bisection_ss(ExactState< Tscal > left, ExactState< Tscal > right, Tscal gamma, Tscal tol, u32 max_iter)
Bisection solve for the shock/shock (11) wave pattern.
Tscal exact_bisection_sr(ExactState< Tscal > left, ExactState< Tscal > right, Tscal gamma, Tscal tol, u32 max_iter)
Bisection solve for the shock/rarefaction (12) wave pattern.
Tscal exact_v_xc_rarefaction(Tscal LR, Tscal p2, Tscal p1, Tscal r1, Tscal gamma)
Relative velocity jump across a rarefaction wave (isentropic relation).
RiemannResult< Tscal > exact_solver(Tscal u_L, Tscal rho_L, Tscal p_L, Tscal u_R, Tscal rho_R, Tscal p_R, Tscal gamma, Tscal tol=Tscal{1.0e-8}, u32 max_iter=100)
Exact Riemann solver for the 1D Euler equations (ideal gas).
Iterative Riemann solver for GSPH (van Leer 1997).
Left/right primitive state for the exact solver (velocity along pair axis).
Tscal v
Velocity along the pair axis.
Result of Riemann solver.