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) 2023 - 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 ScalarConservation
21 {
22 template <int dim, typename Number = double>
23 class WaveSpeedEstimatorView;
24
35 template <typename ScalarNumber = double>
36 class WaveSpeedEstimator : public dealii::ParameterAcceptor
37 {
38 public:
43
48 template <int dim, typename Number = double>
50
52
56
60 WaveSpeedEstimator(const HyperbolicSystem &hyperbolic_system,
61 const std::string &subsection = "/WaveSpeedEstimator")
62 : ParameterAcceptor(subsection)
63 , hyperbolic_system_(&hyperbolic_system)
64 {
65 use_greedy_wavespeed_ = false;
66 add_parameter("use greedy wavespeed",
67 use_greedy_wavespeed_,
68 "Use a greedy wavespeed estimate instead of a guaranteed "
69 "upper bound "
70 "on the maximal wavespeed (for convex fluxes).");
71
72 use_averaged_entropy_ = false;
73 add_parameter("use averaged entropy",
74 use_averaged_entropy_,
75 "In addition to the wavespeed estimate based on the Roe "
76 "average and "
77 "flux gradients of the left and right state also enforce "
78 "an entropy "
79 "inequality on the averaged Krŭzkov entropy.");
80
81 random_entropies_ = 0;
82 add_parameter(
83 "random entropies",
84 random_entropies_,
85 "In addition to the wavespeed estimate based on the Roe average "
86 "and "
87 "flux gradients of the left and right state also enforce an "
88 "entropy "
89 "inequality on the prescribed number of random Krŭzkov entropies.");
90 }
91
93
97
98 ACCESSOR_READ_ONLY(use_greedy_wavespeed);
99 ACCESSOR_READ_ONLY(use_averaged_entropy);
100 ACCESSOR_READ_ONLY(random_entropies);
101
107 template <int dim, typename Number>
108 auto view() const
109 {
110 return View<dim, Number>{
111 hyperbolic_system_->template view<dim, Number>(), *this};
112 }
113
114 private:
116
120
121 bool use_greedy_wavespeed_;
122 bool use_averaged_entropy_;
123 unsigned int random_entropies_;
124
126
130
131 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
132
134 };
135
136
145 template <int dim, typename Number>
147 {
148 public:
153
155
157
159
160 using state_type = typename View::state_type;
161
163
165
167
172
178 const View &view,
179 const WaveSpeedEstimator<ScalarNumber> &wave_speed_estimator)
180 : view_(view)
181 , wave_speed_estimator_(wave_speed_estimator)
182 {
183 }
184
190 Number compute(const Number &u_i,
191 const Number &u_j,
192 const precomputed_type &prec_i,
193 const precomputed_type &prec_j,
194 const dealii::Tensor<1, dim, Number> &n_ij) const;
195
200 Number compute(const PrecomputedVectorView &pv,
201 const state_type &U_i,
202 const state_type &U_j,
203 const unsigned int i,
204 const unsigned int *js,
205 const dealii::Tensor<1, dim, Number> &n_ij) const;
206
207 private:
209
213
214 const View view_;
215 const WaveSpeedEstimator<ScalarNumber> &wave_speed_estimator_;
216
218 };
219 } // namespace ScalarConservation
220} // namespace ryujin
std::array< Number, n_precomputed_values > precomputed_type
Vectors::MultiComponentVectorView< ScalarNumber, n_precomputed_values, dealii::VectorizedArray< ScalarNumber >::size(), dealii::MemorySpace::Host, false > PrecomputedVectorView
typename get_value_type< Number >::type ScalarNumber
dealii::Tensor< 1, problem_dimension, Number > state_type
typename View::PrecomputedVectorView PrecomputedVectorView
WaveSpeedEstimatorView(const View &view, const WaveSpeedEstimator< ScalarNumber > &wave_speed_estimator)
Number compute(const Number &u_i, const Number &u_j, const precomputed_type &prec_i, const precomputed_type &prec_j, const dealii::Tensor< 1, dim, Number > &n_ij) const
WaveSpeedEstimator(const HyperbolicSystem &hyperbolic_system, const std::string &subsection="/WaveSpeedEstimator")