40 const typename FSpec::Tprim &prim_l,
41 const typename FSpec::Tprim &prim_r,
42 const typename FSpec::Tvec &n) {
43 using Tscal =
typename FSpec::Tscal;
44 using Tvec =
typename FSpec::Tvec;
45 using Tcons =
typename FSpec::Tcons;
51 const Tcons c_l = fspec.prim_to_cons(prim_l);
52 const Tcons c_r = fspec.prim_to_cons(prim_r);
55 const auto cs_l = fspec.sound_speed(prim_l);
56 const auto cs_r = fspec.sound_speed(prim_r);
59 const auto rho_l = prim_l.rho;
60 const auto press_l = prim_l.press;
61 const auto velx_l = fspec.vn(prim_l, n);
64 const auto rho_r = prim_r.rho;
65 const auto press_r = prim_r.press;
66 const auto velx_r = fspec.vn(prim_r, n);
69 const auto f_l = fspec.flux(prim_l, n, velx_l);
70 const auto f_r = fspec.flux(prim_r, n, velx_r);
82 Tscal rho_bar = 0.5 * (rho_l + rho_r);
83 Tscal cs_bar = 0.5 * (cs_l + cs_r);
84 Tscal p_pvrs = 0.5 * (press_l + press_r) - 0.5 * (velx_r - velx_l) * rho_bar * cs_bar;
86 Tscal press_star = sham::max(0., p_pvrs);
91 Tscal q_l = 0, q_r = 0;
92 if (press_star <= press_l) {
97 + (0.5 * (1. + gamma_l) / (Tscal) gamma_l) * (press_star / (Tscal) press_l - 1.));
100 if (press_star <= press_r) {
105 + (0.5 * (1. + gamma_r) / (Tscal) gamma_r) * (press_star / (Tscal) press_r - 1.));
109 Tscal s_l = velx_l - cs_l * q_l;
110 Tscal s_r = velx_r + cs_r * q_r;
113 const Tscal var_l = rho_l * (s_l - velx_l);
114 const Tscal var_r = rho_r * (s_r - velx_r);
121 = (prim_r.press - prim_l.press + velx_l * var_l - velx_r * var_r) / (var_l - var_r);
127 = 0.5 * (press_l + press_r + var_l * (S_star - velx_l) + var_r * (S_star - velx_r));
128 Tcons D_star{0, S_star, n};
135 Tcons c_l_star = (s_l * c_l - f_l + press_lr * D_star) * (1.0 / (s_l - S_star));
140 Tcons c_r_star = (s_r * c_r - f_r + press_lr * D_star) * (1.0 / (s_r - S_star));
144 Tcons f_l_star = f_l + s_l * (c_l_star - c_l);
145 Tcons f_r_star = f_r + s_r * (c_r_star - c_r);
150 }
else if (S_star >= 0) {
152 }
else if (s_r >= 0) {
175 const typename FSpec::Tprim &prim_l,
176 const typename FSpec::Tprim &prim_r,
177 const typename FSpec::Tvec &n) {
178 using Tscal =
typename FSpec::Tscal;
179 using Tvec =
typename FSpec::Tvec;
180 using Tcons =
typename FSpec::Tcons;
183 const Tcons c_l = fspec.prim_to_cons(prim_l);
184 const Tcons c_r = fspec.prim_to_cons(prim_r);
187 const auto cs_l = fspec.sound_speed(prim_l);
188 const auto cs_r = fspec.sound_speed(prim_r);
191 const auto rho_l = prim_l.rho;
192 const auto press_l = prim_l.press;
193 const auto velx_l = fspec.vn(prim_l, n);
196 const auto rho_r = prim_r.rho;
197 const auto press_r = prim_r.press;
198 const auto velx_r = fspec.vn(prim_r, n);
201 const auto f_l = fspec.flux(prim_l, n, velx_l);
202 const auto f_r = fspec.flux(prim_r, n, velx_r);
205 Tscal s_l = sham::min(velx_l - cs_l, velx_r - cs_r);
206 Tscal s_r = sham::max(velx_l + cs_l, velx_r + cs_r);
209 const Tscal var_l = rho_l * (s_l - velx_l);
210 const Tscal var_r = rho_r * (s_r - velx_r);
217 = (prim_r.press - prim_l.press + velx_l * var_l - velx_r * var_r) / (var_l - var_r);
223 = 0.5 * (press_l + press_r + var_l * (S_star - velx_l) + var_r * (S_star - velx_r));
224 Tcons D_star{0, S_star, n};
230 Tcons c_l_star = (s_l * c_l - f_l + press_lr * D_star) * (1.0 / (s_l - S_star));
234 Tcons c_r_star = (s_r * c_r - f_r + press_lr * D_star) * (1.0 / (s_r - S_star));
238 Tcons f_l_star = f_l + s_l * (c_l_star - c_l);
239 Tcons f_r_star = f_r + s_r * (c_r_star - c_r);
244 }
else if (S_star >= 0) {
246 }
else if (s_r >= 0) {
constexpr std::pair< typename FSpec::Tscal, typename FSpec::Tscal > get_adiabatic_index_lr(const FSpec &fspec, const typename FSpec::Tprim &prim_l, const typename FSpec::Tprim &prim_r)
Read the left/right adiabatic indices a HLLC-style solver should use for a given L/R pair.
constexpr FSpec::Tcons hllc_davis_flux(const FSpec &fspec, const typename FSpec::Tprim &prim_l, const typename FSpec::Tprim &prim_r, const typename FSpec::Tvec &n)
HLLC solver based on section 10.4 from Toro 3rd Edition , Springer 2009, using the Davis (1988) wave ...
constexpr FSpec::Tcons hllc_adiab_toro_flux(const FSpec &fspec, const typename FSpec::Tprim &prim_l, const typename FSpec::Tprim &prim_r, const typename FSpec::Tvec &n)
HLLC solver based on section 10.4 from Toro 3rd Edition , Springer 2009. The wave speeds estimates ar...