ryujin 2.1.1 revision d0a94ad2ccc0c4c2e8c2485c52b06b90e2fc9853
riemann_solver.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2020 - 2024 by the ryujin authors
4//
5
6#pragma once
7
8#include "hyperbolic_system.h"
9
10#include <simd.h>
11
12#include <deal.II/base/point.h>
13#include <deal.II/base/tensor.h>
14
15namespace ryujin
16{
17 namespace Euler
18 {
19 template <typename ScalarNumber = double>
20 class RiemannSolverParameters : public dealii::ParameterAcceptor
21 {
22 public:
23 RiemannSolverParameters(const std::string &subsection = "/RiemannSolver")
24 : ParameterAcceptor(subsection)
25 {
26 if constexpr (std::is_same<ScalarNumber, double>::value)
27 newton_tolerance_ = 1.e-10;
28 else
29 newton_tolerance_ = 1.e-4;
30 add_parameter("newton tolerance",
31 newton_tolerance_,
32 "Tolerance for the quadratic newton stopping criterion");
33
34 newton_max_iterations_ = 0;
35 add_parameter("newton max iterations",
36 newton_max_iterations_,
37 "Maximal number of quadratic newton iterations performed "
38 "during limiting");
39 }
40
41 ACCESSOR_READ_ONLY(newton_tolerance);
42 ACCESSOR_READ_ONLY(newton_max_iterations);
43
44 private:
45 ScalarNumber newton_tolerance_;
46 unsigned int newton_max_iterations_;
47 };
48
49
59 template <int dim, typename Number = double>
61 {
62 public:
67
71 static constexpr unsigned int problem_dimension = View::problem_dimension;
72
77 static constexpr unsigned int riemann_data_size = 4;
78
83 using primitive_type = std::array<Number, riemann_data_size>;
84
88 using state_type = typename View::state_type;
89
93 static constexpr unsigned int n_precomputed_values =
95
100
105
110
115 const HyperbolicSystem &hyperbolic_system,
116 const Parameters &parameters,
118 &precomputed_values)
119 : hyperbolic_system(hyperbolic_system)
120 , parameters(parameters)
121 , precomputed_values(precomputed_values)
122 {
123 }
124
130 Number compute(const primitive_type &riemann_data_i,
131 const primitive_type &riemann_data_j) const;
132
140 Number compute(const state_type &U_i,
141 const state_type &U_j,
142 const unsigned int i,
143 const unsigned int *js,
144 const dealii::Tensor<1, dim, Number> &n_ij) const;
145
147
148 protected:
151
157 Number f(const primitive_type &riemann_data, const Number p_star) const;
158
159
165 Number df(const primitive_type &riemann_data, const Number &p_star) const;
166
167
173 Number phi(const primitive_type &riemann_data_i,
174 const primitive_type &riemann_data_j,
175 const Number p_in) const;
176
177
183 Number dphi(const primitive_type &riemann_data_i,
184 const primitive_type &riemann_data_j,
185 const Number &p) const;
186
187
202 Number phi_of_p_max(const primitive_type &riemann_data_i,
203 const primitive_type &riemann_data_j) const;
204
205
211 Number lambda1_minus(const primitive_type &riemann_data,
212 const Number p_star) const;
213
214
220 Number lambda3_plus(const primitive_type &primitive_state,
221 const Number p_star) const;
222
223
234 std::array<Number, 2> compute_gap(const primitive_type &riemann_data_i,
235 const primitive_type &riemann_data_j,
236 const Number p_1,
237 const Number p_2) const;
238
239
249 Number compute_lambda(const primitive_type &riemann_data_i,
250 const primitive_type &riemann_data_j,
251 const Number p_star) const;
252
253
262 Number p_star_two_rarefaction(const primitive_type &riemann_data_i,
263 const primitive_type &riemann_data_j) const;
264
273 Number p_star_failsafe(const primitive_type &riemann_data_i,
274 const primitive_type &riemann_data_j) const;
275
276
286 const dealii::Tensor<1, dim, Number> &n_ij) const;
287
288 private:
289 const HyperbolicSystem &hyperbolic_system;
290 const Parameters &parameters;
291
293 &precomputed_values;
295 };
296 } // namespace Euler
297} // namespace ryujin
typename get_value_type< Number >::type ScalarNumber
static constexpr unsigned int problem_dimension
dealii::Tensor< 1, problem_dimension, Number > state_type
static constexpr unsigned int n_precomputed_values
RiemannSolverParameters(const std::string &subsection="/RiemannSolver")
ACCESSOR_READ_ONLY(newton_max_iterations)
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
static constexpr unsigned int n_precomputed_values
typename View::ScalarNumber ScalarNumber
Number df(const primitive_type &riemann_data, const Number &p_star) const
Number lambda1_minus(const primitive_type &riemann_data, const Number p_star) const
Number phi(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j, const Number p_in) const
Number p_star_two_rarefaction(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
primitive_type riemann_data_from_state(const state_type &U, const dealii::Tensor< 1, dim, Number > &n_ij) const
std::array< Number, 2 > compute_gap(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j, const Number p_1, const Number p_2) const
static constexpr unsigned int problem_dimension
typename View::state_type state_type
Number compute(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
static constexpr unsigned int riemann_data_size
std::array< Number, riemann_data_size > primitive_type
Number p_star_failsafe(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
RiemannSolver(const HyperbolicSystem &hyperbolic_system, const Parameters &parameters, const MultiComponentVector< ScalarNumber, n_precomputed_values > &precomputed_values)
Number dphi(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j, const Number &p) const
RiemannSolverParameters< ScalarNumber > Parameters
Number f(const primitive_type &riemann_data, const Number p_star) const
Number lambda3_plus(const primitive_type &primitive_state, const Number p_star) const