33 using Tscal = shambase::VecComponent<Tvec>;
46 using Tscal = shambase::VecComponent<Tvec>;
61 const ConsState<Tvec> operator+(
const ConsState<Tvec> &lhs,
const ConsState<Tvec> &rhs) {
62 return ConsState<Tvec>(lhs) += rhs;
66 const ConsState<Tvec> &ConsState<Tvec>::operator-=(
const ConsState<Tvec> &cst) {
74 const ConsState<Tvec> operator-(
const ConsState<Tvec> &lhs,
const ConsState<Tvec> &rhs) {
75 return ConsState<Tvec>(lhs) -= rhs;
79 const ConsState<Tvec> &ConsState<Tvec>::operator*=(
80 const typename ConsState<Tvec>::Tscal factor) {
88 const ConsState<Tvec> operator*(
89 const typename ConsState<Tvec>::Tscal factor,
const ConsState<Tvec> &rhs) {
90 return ConsState<Tvec>(rhs) *= factor;
94 const ConsState<Tvec> operator*(
95 const ConsState<Tvec> &lhs,
const typename ConsState<Tvec>::Tscal factor) {
96 return ConsState<Tvec>(lhs) *= factor;
102 using Tscal = shambase::VecComponent<Tvec>;
104 std::array<ConsState<Tvec>, 3> F;
108 inline constexpr shambase::VecComponent<Tvec> rhoekin(
109 shambase::VecComponent<Tvec> rho, Tvec v) {
110 using Tscal = shambase::VecComponent<Tvec>;
111 const Tscal v2 = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
112 return 0.5 * rho * v2;
116 inline constexpr ConsState<Tvec> prim_to_cons(
117 const PrimState<Tvec> prim,
typename PrimState<Tvec>::Tscal gamma) {
118 ConsState<Tvec> cons;
122 const auto rhoeint = prim.press / (gamma - 1.0);
123 cons.rhoe = rhoeint + rhoekin(prim.rho, prim.vel);
125 cons.rhovel[0] = prim.rho * prim.vel[0];
126 cons.rhovel[1] = prim.rho * prim.vel[1];
127 cons.rhovel[2] = prim.rho * prim.vel[2];
133 inline constexpr PrimState<Tvec> cons_to_prim(
134 const ConsState<Tvec> cons,
typename ConsState<Tvec>::Tscal gamma) {
135 PrimState<Tvec> prim;
139 prim.vel[0] = cons.rhovel[0] / cons.rho;
140 prim.vel[1] = cons.rhovel[1] / cons.rho;
141 prim.vel[2] = cons.rhovel[2] / cons.rho;
143 const auto rhoeint = cons.rhoe - rhoekin(prim.rho, prim.vel);
144 prim.press = (gamma - 1.0) * rhoeint;
150 inline constexpr ConsState<Tvec> hydro_flux_x(
151 const ConsState<Tvec> cons,
typename ConsState<Tvec>::Tscal gamma) {
152 ConsState<Tvec> flux;
154 const PrimState<Tvec> prim = cons_to_prim(cons, gamma);
156 flux.rho = cons.rhovel[0];
158 flux.rhoe = (cons.rhoe + prim.press) * prim.vel[0];
160 flux.rhovel[0] = cons.rho * prim.vel[0] * prim.vel[0] + prim.press;
161 flux.rhovel[1] = cons.rho * prim.vel[0] * prim.vel[1];
162 flux.rhovel[2] = cons.rho * prim.vel[0] * prim.vel[2];
168 inline constexpr shambase::VecComponent<Tvec> sound_speed(
169 PrimState<Tvec> prim, shambase::VecComponent<Tvec> gamma) {
170 return sycl::sqrt(gamma * prim.press / prim.rho);
193 template<
class Tcons>
194 inline constexpr Tcons rusanov_flux_x(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
197 const auto primL = cons_to_prim(cL, gamma);
198 const auto primR = cons_to_prim(cR, gamma);
200 const auto csL = sound_speed(primL, gamma);
201 const auto csR = sound_speed(primR, gamma);
204 const auto S = sham::max((sham::abs(primL.vel[0]) + csL), (sham::abs(primR.vel[0]) + csR));
206 const auto fL = hydro_flux_x(cL, gamma);
207 const auto fR = hydro_flux_x(cR, gamma);
210 return 0.5 * ((fL + fR) - (cR - cL) * S);
213 template<
class Tcons>
214 inline constexpr Tcons y_to_x(
const Tcons c) {
217 cprime.rhoe = c.rhoe;
218 cprime.rhovel[0] = c.rhovel[1];
219 cprime.rhovel[1] = -c.rhovel[0];
220 cprime.rhovel[2] = c.rhovel[2];
224 template<
class Tcons>
225 inline constexpr Tcons x_to_y(
const Tcons c) {
228 cprime.rhoe = c.rhoe;
229 cprime.rhovel[0] = -c.rhovel[1];
230 cprime.rhovel[1] = c.rhovel[0];
231 cprime.rhovel[2] = c.rhovel[2];
235 template<
class Tcons>
236 inline constexpr Tcons z_to_x(
const Tcons c) {
239 cprime.rhoe = c.rhoe;
240 cprime.rhovel[0] = c.rhovel[2];
241 cprime.rhovel[1] = c.rhovel[1];
242 cprime.rhovel[2] = -c.rhovel[0];
246 template<
class Tcons>
247 inline constexpr Tcons x_to_z(
const Tcons c) {
250 cprime.rhoe = c.rhoe;
251 cprime.rhovel[0] = -c.rhovel[2];
252 cprime.rhovel[1] = c.rhovel[1];
253 cprime.rhovel[2] = c.rhovel[0];
257 template<
class Tcons>
258 inline constexpr Tcons invert_axis(
const Tcons c) {
261 cprime.rhoe = c.rhoe;
262 cprime.rhovel[0] = -c.rhovel[0];
263 cprime.rhovel[1] = -c.rhovel[1];
264 cprime.rhovel[2] = -c.rhovel[2];
268 template<
class Tcons>
269 inline constexpr Tcons rusanov_flux_y(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
270 return x_to_y(rusanov_flux_x(y_to_x(cL), y_to_x(cR), gamma));
273 template<
class Tcons>
274 inline constexpr Tcons rusanov_flux_z(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
275 return x_to_z(rusanov_flux_x(z_to_x(cL), z_to_x(cR), gamma));
278 template<
class Tcons>
279 inline constexpr Tcons rusanov_flux_mx(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
280 return invert_axis(rusanov_flux_x(invert_axis(cL), invert_axis(cR), gamma));
283 template<
class Tcons>
284 inline constexpr Tcons rusanov_flux_my(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
285 return invert_axis(rusanov_flux_y(invert_axis(cL), invert_axis(cR), gamma));
288 template<
class Tcons>
289 inline constexpr Tcons rusanov_flux_mz(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
290 return invert_axis(rusanov_flux_z(invert_axis(cL), invert_axis(cR), gamma));
293 template<
class Tcons>
294 inline constexpr auto hll_flux_x(
295 const Tcons consL,
const Tcons consR,
const typename Tcons::Tscal gamma) {
296 const auto primL = cons_to_prim(consL, gamma);
297 const auto primR = cons_to_prim(consR, gamma);
299 const auto csL = sound_speed(primL, gamma);
300 const auto csR = sound_speed(primR, gamma);
307 const auto S_L = sham::min(primL.vel[0] - csL, primR.vel[0] - csR);
308 const auto S_R = sham::max(primL.vel[0] + csL, primR.vel[0] + csR);
310 const auto fluxL = hydro_flux_x(consL, gamma);
311 const auto fluxR = hydro_flux_x(consR, gamma);
314 auto hll_flux = [=]() {
327 const auto S_norm = 1.0 / (S_R - S_L);
328 return (fluxL * S_R - fluxR * S_L + (consR - consL) * S_R * S_L) * S_norm;
335 template<
class Tcons>
336 inline constexpr Tcons hll_flux_y(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
337 return x_to_y(hll_flux_x(y_to_x(cL), y_to_x(cR), gamma));
340 template<
class Tcons>
341 inline constexpr Tcons hll_flux_z(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
342 return x_to_z(hll_flux_x(z_to_x(cL), z_to_x(cR), gamma));
345 template<
class Tcons>
346 inline constexpr Tcons hll_flux_mx(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
347 return invert_axis(hll_flux_x(invert_axis(cL), invert_axis(cR), gamma));
350 template<
class Tcons>
351 inline constexpr Tcons hll_flux_my(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
352 return invert_axis(hll_flux_y(invert_axis(cL), invert_axis(cR), gamma));
355 template<
class Tcons>
356 inline constexpr Tcons hll_flux_mz(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
357 return invert_axis(hll_flux_z(invert_axis(cL), invert_axis(cR), gamma));
369 template<
class Tcons>
370 inline constexpr Tcons
hllc_flux_x(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
372 using Tscal =
typename Tcons::Tscal;
373 using Tvec =
typename Tcons::Tvec;
376 const auto primL = cons_to_prim(cL, gamma);
377 const auto primR = cons_to_prim(cR, gamma);
380 const auto csL = sound_speed(primL, gamma);
381 const auto csR = sound_speed(primR, gamma);
384 const auto FL = hydro_flux_x(cL, gamma);
385 const auto FR = hydro_flux_x(cR, gamma);
388 const auto rhoL = primL.rho;
389 const auto pressL = primL.press;
390 const auto velxL = primL.vel[0];
393 const auto rhoR = primR.rho;
394 const auto pressR = primR.press;
395 const auto velxR = primR.vel[0];
407 Tscal rho_bar = 0.5 * (rhoL + rhoR);
408 Tscal cs_bar = 0.5 * (csL + csR);
409 Tscal p_pvrs = 0.5 * (pressL + pressR) - 0.5 * (velxR - velxL) * rho_bar * cs_bar;
411 Tscal press_star = sham::max(0., p_pvrs);
416 Tscal qL = 0, qR = 0;
417 if (press_star <= pressL) {
421 1. + (0.5 * (1. + gamma) / (Tscal) gamma) * (press_star / (Tscal) pressL - 1.));
424 if (press_star <= pressR) {
428 1. + (0.5 * (1. + gamma) / (Tscal) gamma) * (press_star / (Tscal) pressR - 1.));
432 Tscal SL = velxL - csL * qL;
433 Tscal SR = velxR + csR * qR;
436 const Tscal var_L = rhoL * (SL - velxL);
437 const Tscal var_R = rhoR * (SR - velxR);
442 = (primR.press - primL.press + velxL * var_L - velxR * var_R) / (var_L - var_R);
448 = 0.5 * (pressL + pressR + var_L * (S_star - velxL) + var_R * (S_star - velxR));
450 Tcons D_star{0, S_star, D};
455 Tcons cL_star = (SL * cL - FL + press_LR * D_star) * (1.0 / (SL - S_star));
460 Tcons cR_star = (SR * cR - FR + press_LR * D_star) * (1.0 / (SR - S_star));
464 Tcons FL_star = FL + SL * (cL_star - cL);
465 Tcons FR_star = FR + SR * (cR_star - cR);
468 auto hllc_flux = [=]() {
471 }
else if (S_star >= 0) {
473 }
else if (SR >= 0) {
485 template<
class Tcons>
486 inline constexpr Tcons
hllc_flux_y(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
487 return x_to_y(
hllc_flux_x(y_to_x(cL), y_to_x(cR), gamma));
493 template<
class Tcons>
494 inline constexpr Tcons
hllc_flux_z(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
495 return x_to_z(
hllc_flux_x(z_to_x(cL), z_to_x(cR), gamma));
501 template<
class Tcons>
502 inline constexpr Tcons
hllc_flux_mx(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
503 return invert_axis(
hllc_flux_x(invert_axis(cL), invert_axis(cR), gamma));
509 template<
class Tcons>
510 inline constexpr Tcons
hllc_flux_my(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
511 return invert_axis(
hllc_flux_y(invert_axis(cL), invert_axis(cR), gamma));
517 template<
class Tcons>
518 inline constexpr Tcons
hllc_flux_mz(Tcons cL, Tcons cR,
typename Tcons::Tscal gamma) {
519 return invert_axis(
hllc_flux_z(invert_axis(cL), invert_axis(cR), gamma));
namespace for math utility
constexpr Tcons hllc_flux_y(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the +y direction.
constexpr Tcons hllc_flux_z(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the +z direction.
constexpr Tcons hllc_flux_x(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC solver based on section 10.4 from Toro 3rd Edition , Springer 2009. The wave speeds estimates ar...
constexpr Tcons hllc_flux_my(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the -y direction.
constexpr Tcons hllc_flux_mz(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the -z direction.
constexpr Tcons hllc_flux_mx(Tcons cL, Tcons cR, typename Tcons::Tscal gamma)
HLLC flux in the -x direction.