8#include <compile_time_options.h>
50 template <
int dim,
typename Number>
51 DEAL_II_ALWAYS_INLINE
inline Number
70 const Number first_radicand = (
ScalarNumber(3.) * gamma + Number(11.)) /
73 const Number second_radicand =
74 Number(5. / 6.) + slope * (gamma - Number(3.));
76 Number radicand = std::min(first_radicand, second_radicand);
77 radicand = std::min(Number(1.), radicand);
78 radicand = std::max(Number(1. / 2.), radicand);
80 return std::sqrt(radicand);
84 template <
int dim,
typename Number>
86 const Number &rho,
const Number &gamma,
const Number &a)
const
88 const auto interpolation_b = hyperbolic_system.eos_interpolation_b();
90 const Number numerator =
91 ScalarNumber(2.) * a * (Number(1.) - interpolation_b * rho);
93 const Number denominator = gamma - Number(1.);
95 return numerator / denominator;
99 template <
int dim,
typename Number>
100 DEAL_II_ALWAYS_INLINE
inline Number
105 const auto &[rho_i, u_i, p_i, gamma_i, a_i] = riemann_data_i;
106 const auto &[rho_j, u_j, p_j, gamma_j, a_j] = riemann_data_j;
107 const auto alpha_i = alpha(rho_i, gamma_i, a_i);
108 const auto alpha_j = alpha(rho_j, gamma_j, a_j);
118 const Number p_min = std::min(p_i, p_j);
119 const Number p_max = std::max(p_i, p_j);
121 const Number gamma_min =
122 dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
123 p_i, p_j, gamma_i, gamma_j);
125 const Number alpha_min =
126 dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
127 p_i, p_j, alpha_i, alpha_j);
129 const Number alpha_hat_min = c(gamma_min) * alpha_min;
131 const Number alpha_max = dealii::compare_and_apply_mask<
132 dealii::SIMDComparison::greater_than_or_equal>(
133 p_i, p_j, alpha_i, alpha_j);
135 const Number gamma_m = std::min(gamma_i, gamma_j);
136 const Number gamma_M = std::max(gamma_i, gamma_j);
138 const Number numerator =
141 const Number p_ratio = p_min / p_max;
149 const Number r_exponent =
150 (gamma_M - gamma_min) / (
ScalarNumber(2.) * gamma_min * gamma_M);
157 const Number first_exponent =
159 const Number first_exponent_inverse = Number(1.) / first_exponent;
161 const Number first_denom =
162 alpha_hat_min *
ryujin::pow(p_ratio, r_exponent - first_exponent) +
165 const Number p_1_tilde =
166 p_max *
ryujin::pow(numerator / first_denom, first_exponent_inverse);
167#ifdef DEBUG_RIEMANN_SOLVER
168 std::cout <<
"RS p_1_tilde = " << p_1_tilde <<
"\n";
176 const Number second_exponent =
178 const Number second_exponent_inverse = Number(1.) / second_exponent;
180 Number second_denom =
181 alpha_hat_min *
ryujin::pow(p_ratio, -second_exponent) +
184 const Number p_2_tilde = p_max *
ryujin::pow(numerator / second_denom,
185 second_exponent_inverse);
187#ifdef DEBUG_RIEMANN_SOLVER
188 std::cout <<
"RS p_2_tilde = " << p_2_tilde <<
"\n";
191 return std::min(p_1_tilde, p_2_tilde);
195 template <
int dim,
typename Number>
196 DEAL_II_ALWAYS_INLINE
inline Number
201 const auto &[rho_i, u_i, p_i, gamma_i, a_i] = riemann_data_i;
202 const auto &[rho_j, u_j, p_j, gamma_j, a_j] = riemann_data_j;
204 const Number gamma_m = std::min(gamma_i, gamma_j);
206 const Number alpha_hat_i = c(gamma_i) * alpha(rho_i, gamma_i, a_i);
207 const Number alpha_hat_j = c(gamma_j) * alpha(rho_j, gamma_j, a_j);
215 const Number exponent =
217 const Number exponent_inverse = Number(1.) / exponent;
219 const Number numerator =
222 const Number denominator =
223 alpha_hat_i *
ryujin::pow(p_i / p_j, -exponent) + alpha_hat_j;
225 const Number p_1_tilde =
226 p_j *
ryujin::pow(numerator / denominator, exponent_inverse);
228#ifdef DEBUG_RIEMANN_SOLVER
229 std::cout <<
"SS p_1_tilde = " << p_1_tilde <<
"\n";
232 const auto p_2_tilde = p_star_failsafe(riemann_data_i, riemann_data_j);
234 return std::min(p_1_tilde, p_2_tilde);
238 template <
int dim,
typename Number>
239 DEAL_II_ALWAYS_INLINE
inline Number
244 const auto interpolation_b = hyperbolic_system.eos_interpolation_b();
246 const auto &[rho_i, u_i, p_i, gamma_i, a_i] = riemann_data_i;
247 const auto &[rho_j, u_j, p_j, gamma_j, a_j] = riemann_data_j;
255 const Number p_max = std::max(p_i, p_j);
258 ScalarNumber(2.) * (Number(1.) - interpolation_b * rho_i) * p_max;
259 radicand_i /= rho_i * ((gamma_i + Number(1.)) * p_max +
260 (gamma_i - Number(1.)) * p_i);
262 const Number x_i = std::sqrt(radicand_i);
265 ScalarNumber(2.) * (Number(1.) - interpolation_b * rho_j) * p_max;
266 radicand_j /= rho_j * ((gamma_j + Number(1.)) * p_max +
267 (gamma_j - Number(1.)) * p_j);
269 const Number x_j = std::sqrt(radicand_j);
271 const Number a = x_i + x_j;
272 const Number b = u_j - u_i;
273 const Number c = -p_i * x_i - p_j * x_j;
275 const Number base = (-b + std::sqrt(b * b -
ScalarNumber(4.) * a * c)) /
277 const Number p_2_tilde = base * base;
279#ifdef DEBUG_RIEMANN_SOLVER
280 std::cout <<
"SS p_2_tilde = " << p_2_tilde <<
"\n";
286 template <
int dim,
typename Number>
287 DEAL_II_ALWAYS_INLINE
inline Number
292 const auto &[rho_i, u_i, p_i, gamma_i, a_i] = riemann_data_i;
293 const auto &[rho_j, u_j, p_j, gamma_j, a_j] = riemann_data_j;
294 const auto alpha_i = alpha(rho_i, gamma_i, a_i);
295 const auto alpha_j = alpha(rho_j, gamma_j, a_j);
305 const Number p_min = std::min(p_i, p_j);
306 const Number p_max = std::max(p_i, p_j);
308 const Number gamma_min =
309 dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
310 p_i, p_j, gamma_i, gamma_j);
312 const Number alpha_min =
313 dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
314 p_i, p_j, alpha_i, alpha_j);
316 const Number alpha_hat_min = c(gamma_min) * alpha_min;
318 const Number gamma_max = dealii::compare_and_apply_mask<
319 dealii::SIMDComparison::greater_than_or_equal>(
320 p_i, p_j, gamma_i, gamma_j);
322 const Number alpha_max = dealii::compare_and_apply_mask<
323 dealii::SIMDComparison::greater_than_or_equal>(
324 p_i, p_j, alpha_i, alpha_j);
326 const Number alpha_hat_max = c(gamma_max) * alpha_max;
328 const Number gamma_m = std::min(gamma_i, gamma_j);
329 const Number gamma_M = std::max(gamma_i, gamma_j);
331 const Number p_ratio = p_min / p_max;
339 const Number r_exponent =
340 (gamma_M - gamma_min) / (
ScalarNumber(2.) * gamma_min * gamma_M);
349 const Number exponent =
351 const Number exponent_inverse = Number(1.) / exponent;
353 const Number numerator =
356 Number denominator = alpha_hat_min *
ryujin::pow(p_ratio, -exponent) +
359 const Number p_tilde =
360 p_max *
ryujin::pow(numerator / denominator, exponent_inverse);
362#ifdef DEBUG_RIEMANN_SOLVER
363 std::cout <<
"IN p_*_tilde = " << p_tilde <<
"\n";
370 template <
int dim,
typename Number>
371 DEAL_II_ALWAYS_INLINE
inline Number
373 const Number p_star)
const
375 const auto interpolation_b = hyperbolic_system.eos_interpolation_b();
377 const auto &[rho, u, p, gamma, a] = riemann_data;
379 const Number one_minus_b_rho = Number(1.) - interpolation_b * rho;
382 ScalarNumber(2.) * one_minus_b_rho / (rho * (gamma + Number(1.)));
384 const Number Bz = (gamma - Number(1.)) / (gamma + Number(1.)) * p;
386 const Number radicand = Az / (p_star + Bz);
388 const Number true_value = (p_star - p) * std::sqrt(radicand);
390 const auto exponent = ScalarNumber(0.5) * (gamma - Number(1.)) / gamma;
391 const Number factor =
ryujin::pow(p_star / p, exponent) - Number(1.);
392 const auto false_value = ScalarNumber(2.) * a * one_minus_b_rho * factor /
393 (gamma - Number(1.));
395 return dealii::compare_and_apply_mask<
396 dealii::SIMDComparison::greater_than_or_equal>(
397 p_star, p, true_value, false_value);
401 template <
int dim,
typename Number>
402 DEAL_II_ALWAYS_INLINE
inline Number
404 const primitive_type &riemann_data_j,
405 const Number p_in)
const
407 const Number &u_i = riemann_data_i[1];
408 const Number &u_j = riemann_data_j[1];
410 return f(riemann_data_i, p_in) + f(riemann_data_j, p_in) + u_j - u_i;
414 template <
int dim,
typename Number>
415 DEAL_II_ALWAYS_INLINE
inline Number
420 const auto interpolation_b = hyperbolic_system.eos_interpolation_b();
422 const auto &[rho_i, u_i, p_i, gamma_i, a_i] = riemann_data_i;
423 const auto &[rho_j, u_j, p_j, gamma_j, a_j] = riemann_data_j;
425 const Number p_max = std::max(p_i, p_j);
427 const Number radicand_inverse_i =
428 ScalarNumber(0.5) * rho_i / (Number(1.) - interpolation_b * rho_i) *
429 ((gamma_i + Number(1.)) * p_max + (gamma_i - Number(1.)) * p_i);
431 const Number value_i = (p_max - p_i) / std::sqrt(radicand_inverse_i);
433 const Number radicand_jnverse_j =
434 ScalarNumber(0.5) * rho_j / (Number(1.) - interpolation_b * rho_j) *
435 ((gamma_j + Number(1.)) * p_max + (gamma_j - Number(1.)) * p_j);
437 const Number value_j = (p_max - p_j) / std::sqrt(radicand_jnverse_j);
439 return value_i + value_j + u_j - u_i;
443 template <
int dim,
typename Number>
444 DEAL_II_ALWAYS_INLINE
inline Number
448 const auto &[rho, u, p, gamma, a] = riemann_data;
455 return u - a * std::sqrt(Number(1.) + factor * tmp);
459 template <
int dim,
typename Number>
460 DEAL_II_ALWAYS_INLINE
inline Number
462 const Number p_star)
const
464 const auto &[rho, u, p, gamma, a] = riemann_data;
471 return u + a * std::sqrt(Number(1.) + factor * tmp);
475 template <
int dim,
typename Number>
476 DEAL_II_ALWAYS_INLINE
inline Number
480 const Number p_star)
const
482 const Number nu_11 = lambda1_minus(riemann_data_i, p_star);
483 const Number nu_32 = lambda3_plus(riemann_data_j, p_star);
489 template <
int dim,
typename Number>
494 const auto &[rho_i, u_i, p_i, gamma_i, a_i] = riemann_data_i;
495 const auto &[rho_j, u_j, p_j, gamma_j, a_j] = riemann_data_j;
497#ifdef DEBUG_RIEMANN_SOLVER
498 std::cout <<
"rho_left: " << rho_i << std::endl;
499 std::cout <<
"u_left: " << u_i << std::endl;
500 std::cout <<
"p_left: " << p_i << std::endl;
501 std::cout <<
"gamma_left: " << gamma_i << std::endl;
502 std::cout <<
"a_left: " << a_i << std::endl;
503 std::cout <<
"rho_right: " << rho_j << std::endl;
504 std::cout <<
"u_right: " << u_j << std::endl;
505 std::cout <<
"p_right: " << p_j << std::endl;
506 std::cout <<
"gamma_right: " << gamma_j << std::endl;
507 std::cout <<
"a_right: " << a_j << std::endl;
510 const Number p_max = std::max(p_i, p_j);
511 const Number phi_p_max = phi_of_p_max(riemann_data_i, riemann_data_j);
513 if (!hyperbolic_system.compute_strict_bounds()) {
514#ifdef DEBUG_RIEMANN_SOLVER
515 const Number p_star_RS = p_star_RS_full(riemann_data_i, riemann_data_j);
516 const Number p_star_SS = p_star_SS_full(riemann_data_i, riemann_data_j);
517 const Number p_debug =
518 dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
519 phi_p_max, Number(0.), p_star_SS, std::min(p_max, p_star_RS));
520 std::cout <<
" p^*_debug = " << p_debug <<
"\n";
521 std::cout <<
" phi(p_*_d) = "
522 << phi(riemann_data_i, riemann_data_j, p_debug) <<
"\n";
523 std::cout <<
"-> lambda_deb = "
524 << compute_lambda(riemann_data_i, riemann_data_j, p_debug)
528 const Number p_star_tilde =
529 p_star_interpolated(riemann_data_i, riemann_data_j);
530 const Number p_star_backup =
531 p_star_failsafe(riemann_data_i, riemann_data_j);
534 dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
537 std::min(p_star_tilde, p_star_backup),
538 std::min(p_max, p_star_tilde));
540#ifdef DEBUG_RIEMANN_SOLVER
541 std::cout <<
" p^*_tilde = " << p_2 <<
"\n";
542 std::cout <<
" phi(p_*_t) = "
543 << phi(riemann_data_i, riemann_data_j, p_2) <<
"\n";
544 std::cout <<
"-> lambda_max = "
545 << compute_lambda(riemann_data_i, riemann_data_j, p_2) <<
"\n"
549 return compute_lambda(riemann_data_i, riemann_data_j, p_2);
552 const Number p_star_RS = p_star_RS_full(riemann_data_i, riemann_data_j);
553 const Number p_star_SS = p_star_SS_full(riemann_data_i, riemann_data_j);
556 dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
557 phi_p_max, Number(0.), p_star_SS, std::min(p_max, p_star_RS));
559#ifdef DEBUG_RIEMANN_SOLVER
560 std::cout <<
" p^*_tilde = " << p_2 <<
"\n";
561 std::cout <<
" phi(p_*_t) = "
562 << phi(riemann_data_i, riemann_data_j, p_2) <<
"\n";
563 std::cout <<
"-> lambda_max = "
564 << compute_lambda(riemann_data_i, riemann_data_j, p_2)
568 return compute_lambda(riemann_data_i, riemann_data_j, p_2);
Number p_star_RS_full(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
Number lambda1_minus(const primitive_type &riemann_data, const Number p_star) const
Number alpha(const Number &rho, const Number &gamma, const Number &a) const
Number p_star_failsafe(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
Number p_star_SS_full(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
Number lambda3_plus(const primitive_type &primitive_state, const Number p_star) const
typename HyperbolicSystemView::ScalarNumber ScalarNumber
Number p_star_interpolated(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
Number phi_of_p_max(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
Number compute_lambda(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j, const Number p_star) const
std::array< Number, riemann_data_size > primitive_type
Number c(const Number gamma_Z) const
Number compute(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
T pow(const T x, const T b)
DEAL_II_ALWAYS_INLINE Number negative_part(const Number number)
DEAL_II_ALWAYS_INLINE Number positive_part(const Number number)