ryujin 2.1.1 revision ee5cbcbf2346c1299c942d0e1f13b46449973c18
Loading...
Searching...
No Matches
wave_speed_estimator.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2020 - 2025 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "hyperbolic_system.h"
11
12#include <observer_pointer.h>
13#include <simd.h>
14
15#include <deal.II/base/point.h>
16#include <deal.II/base/tensor.h>
17
18namespace ryujin
19{
20 namespace EulerAEOS
21 {
22 template <int dim, typename Number = double>
23 class WaveSpeedEstimatorView;
24
34 template <typename ScalarNumber = double>
35 class WaveSpeedEstimator : public dealii::ParameterAcceptor
36 {
37 public:
42
47 template <int dim, typename Number = double>
49
51
55
59 WaveSpeedEstimator(const HyperbolicSystem &hyperbolic_system,
60 const std::string &subsection = "/WaveSpeedEstimator")
61 : ParameterAcceptor(subsection)
62 , hyperbolic_system_(&hyperbolic_system)
63 {
64 }
65
67
71
77 template <int dim, typename Number>
78 auto view() const
79 {
80 return View<dim, Number>{
81 hyperbolic_system_->template view<dim, Number>(), *this};
82 }
83
84 private:
86
90
91 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
92
94 };
95
96
105 template <int dim, typename Number>
107 {
108 public:
113
115
117
119
120 using state_type = typename View::state_type;
121
126 static constexpr unsigned int riemann_data_size = 5;
127
132 using primitive_type = typename std::array<Number, riemann_data_size>;
133
135
137
139
143
149 const View &view,
150 const WaveSpeedEstimator<ScalarNumber> &wave_speed_estimator)
151 : view_(view)
152 , wave_speed_estimator_(wave_speed_estimator)
153 {
154 }
155
161 Number compute(const primitive_type &riemann_data_i,
162 const primitive_type &riemann_data_j) const;
163
169 Number compute(const PrecomputedVectorView &pv,
170 const state_type &U_i,
171 const state_type &U_j,
172 const unsigned int i,
173 const unsigned int *js,
174 const dealii::Tensor<1, dim, Number> &n_ij) const;
175
177
178 protected:
183
189 Number c(const Number &gamma_Z) const;
190
196 Number
197 alpha(const Number &rho, const Number &gamma, const Number &a) const;
198
206 Number p_star_RS_full(const primitive_type &riemann_data_i,
207 const primitive_type &riemann_data_j) const;
208
216 Number p_star_SS_full(const primitive_type &riemann_data_i,
217 const primitive_type &riemann_data_j) const;
218
219 /*
220 * Compute only the failsafe the failsafe bound for \f$\tilde
221 * p_2^\ast\f$ (5.11) in @cite ClaytonGuermondPopov-2022
222 *
223 * Cost: 0x pow, 3x division, 3x sqrt
224 */
225 Number p_star_failsafe(const primitive_type &riemann_data_i,
226 const primitive_type &riemann_data_j) const;
227
228 /*
229 * Compute a simultaneous upper bound on (5.7) second formula for
230 * \tilde p_2^\ast (5.8) first formula for \tilde p_1^\ast (5.11)
231 * formula for \tilde p_2^\ast in @cite ClaytonGuermondPopov-2022
232 *
233 * Cost: 3x pow, 9x division, 2x sqrt
234 *
235 * @todo improve documentation
236 */
237 Number p_star_interpolated(const primitive_type &riemann_data_i,
238 const primitive_type &riemann_data_j) const;
239
240
241#ifndef DOXYGEN
242 /*
243 * FIXME
244 */
245 Number f(const primitive_type &riemann_data, const Number p_star) const;
246
247
248 /*
249 * FIXME
250 */
251 Number phi(const primitive_type &riemann_data_i,
252 const primitive_type &riemann_data_j,
253 const Number p_in) const;
254#endif
255
256
271 Number phi_of_p_max(const primitive_type &riemann_data_i,
272 const primitive_type &riemann_data_j) const;
273
274
280 Number lambda1_minus(const primitive_type &riemann_data,
281 const Number p_star) const;
282
283
289 Number lambda3_plus(const primitive_type &primitive_state,
290 const Number p_star) const;
291
292
302 Number compute_lambda(const primitive_type &riemann_data_i,
303 const primitive_type &riemann_data_j,
304 const Number p_star) const;
305
306
316 const Number &p,
317 const dealii::Tensor<1, dim, Number> &n_ij) const;
318
319 private:
321
325
326 const View view_;
327 const WaveSpeedEstimator<ScalarNumber> &wave_speed_estimator_;
328
330 };
331 } // namespace EulerAEOS
332} /* namespace ryujin */
dealii::Tensor< 1, problem_dimension, Number > state_type
Vectors::MultiComponentVectorView< ScalarNumber, n_precomputed_values, dealii::VectorizedArray< ScalarNumber >::size(), dealii::MemorySpace::Host, false > PrecomputedVectorView
typename get_value_type< Number >::type ScalarNumber
static constexpr unsigned int problem_dimension
std::array< Number, n_precomputed_values > precomputed_type
primitive_type riemann_data_from_state(const state_type &U, const Number &p, const dealii::Tensor< 1, dim, Number > &n_ij) const
Number alpha(const Number &rho, const Number &gamma, const Number &a) const
WaveSpeedEstimatorView(const View &view, const WaveSpeedEstimator< ScalarNumber > &wave_speed_estimator)
typename View::PrecomputedVectorView PrecomputedVectorView
static constexpr unsigned int riemann_data_size
Number phi_of_p_max(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
typename View::precomputed_type precomputed_type
Number p_star_SS_full(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
typename std::array< Number, riemann_data_size > primitive_type
Number p_star_interpolated(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
HyperbolicSystemView< dim, Number > View
Number p_star_failsafe(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
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 compute(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
WaveSpeedEstimator(const HyperbolicSystem &hyperbolic_system, const std::string &subsection="/WaveSpeedEstimator")