ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
Loading...
Searching...
No Matches
indicator.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2023 - 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
9#include <ryujin/base/gpu.h>
11#include <ryujin/base/simd.h>
14
15#include <deal.II/base/parameter_acceptor.h>
16#include <deal.II/base/vectorization.h>
17
18namespace ryujin
19{
20 namespace EulerBarotropic
21 {
22 template <int dim,
23 typename Number = double,
24 typename MemorySpace = dealii::MemorySpace::Host>
25 class IndicatorView;
26
33 template <typename ScalarNumber = double>
34 class Indicator : public dealii::ParameterAcceptor
35 {
36 public:
41
45 struct Parameters {
46 double evc_factor;
47 };
48
50
54
58 Indicator(const HyperbolicSystem &hyperbolic_system,
59 const std::string &subsection = "/Indicator")
60 : ParameterAcceptor(subsection)
61 , parameters_("euler_barotropic_indicator_parameters",
63 , hyperbolic_system_(&hyperbolic_system)
64 {
65 /* reference remains valid due to implicit_transfers_host_resident */
66 auto &parameters = *parameters_.view();
67
68 parameters.evc_factor = 1.;
69 add_parameter("evc factor",
70 parameters.evc_factor,
71 "Factor for scaling the entropy viscocity commuator");
72
73 /* invalidates view on default memory space */
74 ParameterAcceptor::parse_parameters_call_back.connect(
75 [this] { parameters_.view(); });
76 }
77
85 template <int dim,
86 typename Number,
87 typename MemorySpace = dealii::MemorySpace::Host>
88 auto view() const
89 {
91 hyperbolic_system_->template view<dim, Number, MemorySpace>(),
92 *this};
93 }
94
95 private:
97
101
102 Mirrored<Parameters> parameters_;
103
105
109
110 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
111
112 template <int, typename, typename>
113 friend class IndicatorView;
114
116 };
117
118
127 template <int dim, typename Number, typename MemorySpace>
129 {
130 public:
131 static_assert(
132 std::is_same_v<MemorySpace, dealii::MemorySpace::Host> ||
133 std::is_same_v<MemorySpace, dealii::MemorySpace::Default>,
134 "Unexpected memory space");
135
140
142
144
146
147 using state_type = typename View::state_type;
148
150
152
154
156
174
179 IndicatorView(const View &view, const Indicator<ScalarNumber> &indicator)
180 : view_(view)
181 , parameters_(indicator.parameters_.template view<MemorySpace>())
182 {
183 }
184
189 DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber evc_factor() const
190 {
191 return ScalarNumber(parameters_->evc_factor);
192 }
193
198 DEAL_II_HOST_DEVICE void reset(const PrecomputedVectorView &pv,
199 const unsigned int i,
200 const state_type &U_i,
201 const flux_contribution_type &flux_i);
202
207 DEAL_II_HOST_DEVICE void
209 const unsigned int *js,
210 const state_type &U_j,
211 const flux_contribution_type &flux_j,
212 const dealii::Tensor<1, dim, Number> &c_ij);
213
217 DEAL_II_HOST_DEVICE Number alpha(const Number h_i) const;
218
219
220 private:
222
226
227 const View view_;
228 const Indicator<ScalarNumber>::Parameters *const parameters_;
229
230 Number eta_i_ = 0.;
231 state_type d_eta_i_;
232
233 Number left_ = 0.;
234 state_type right_;
235
237 };
238
239
240 /*
241 * -------------------------------------------------------------------------
242 * Inline definitions
243 * -------------------------------------------------------------------------
244 */
245
246
247 template <int dim, typename Number, typename MemorySpace>
248 DEAL_II_HOST_DEVICE_ALWAYS_INLINE void
250 const PrecomputedVectorView &pv,
251 const unsigned int i,
252 const state_type &U_i,
253 const flux_contribution_type & /*flux_i*/)
254 {
255 /* Entropy viscosity commutator: */
256
257 const auto &[e_i, p_i, a_i] =
258 pv.template read_tensor<Number, precomputed_type>(i);
259
260 eta_i_ = view_.total_energy(U_i, e_i);
261 d_eta_i_ = view_.total_energy_derivative(U_i, e_i, p_i);
262
263 // left_ = sum_j F(U_j) * c_ij, where F is the mathematical entropy flux
264 left_ = 0.;
265
266 // right_ = sum_j f(U_j) * c_ij, where f is the flux of the system
267 right_ = 0.;
268 }
269
270
271 template <int dim, typename Number, typename MemorySpace>
272 DEAL_II_HOST_DEVICE_ALWAYS_INLINE void
274 const PrecomputedVectorView &pv,
275 const unsigned int *js,
276 const state_type &U_j,
277 const flux_contribution_type & /*flux_j*/,
278 const dealii::Tensor<1, dim, Number> &c_ij)
279 {
280 /* Entropy viscosity commutator: */
281
282 const auto &[e_j, p_j, a_j] =
283 pv.template read_tensor<Number, precomputed_type>(js);
284
285 const auto rho_j = view_.density(U_j);
286 const auto rho_j_inverse = Number(1.) / rho_j;
287 const auto eta_j = view_.total_energy(U_j, e_j);
288
289 const auto m_j = view_.momentum(U_j);
290
291 const auto f_j = view_.f(U_j, p_j);
292
293 const auto entropy_flux = (eta_j + p_j) * rho_j_inverse * (m_j * c_ij);
294
295 left_ += entropy_flux;
296 for (unsigned int k = 0; k < problem_dimension; ++k) {
297 right_[k] += f_j[k] * c_ij;
298 }
299 }
300
301
302 template <int dim, typename Number, typename MemorySpace>
303 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
305 {
306 /* Entropy viscosity commutator: */
307
308 Number numerator = left_;
309 Number denominator = std::abs(left_);
310 for (unsigned int k = 0; k < problem_dimension; ++k) {
311 numerator -= d_eta_i_[k] * right_[k];
312 denominator += std::abs(d_eta_i_[k] * right_[k]);
313 }
314
315 const auto quotient = safe_division(
316 std::abs(numerator), denominator + hd_i * std::abs(eta_i_));
317
318 return std::min(Number(1.), evc_factor() * quotient);
319 }
320 } // namespace EulerBarotropic
321} // namespace ryujin
VectorView< n_precomputed_values > PrecomputedVectorView
static constexpr unsigned int problem_dimension
std::array< Number, n_precomputed_values > precomputed_type
dealii::Tensor< 1, problem_dimension, Number > state_type
typename get_value_type< Number >::type ScalarNumber
HyperbolicSystemView< dim, Number, MemorySpace > View
Definition indicator.h:141
DEAL_II_HOST_DEVICE Number alpha(const Number h_i) const
Definition indicator.h:304
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber evc_factor() const
Definition indicator.h:189
static constexpr auto problem_dimension
Definition indicator.h:145
DEAL_II_HOST_DEVICE void reset(const PrecomputedVectorView &pv, const unsigned int i, const state_type &U_i, const flux_contribution_type &flux_i)
Definition indicator.h:249
IndicatorView(const View &view, const Indicator< ScalarNumber > &indicator)
Definition indicator.h:179
DEAL_II_HOST_DEVICE void accumulate(const PrecomputedVectorView &pv, const unsigned int *js, const state_type &U_j, const flux_contribution_type &flux_j, const dealii::Tensor< 1, dim, Number > &c_ij)
Definition indicator.h:273
typename View::PrecomputedVectorView PrecomputedVectorView
Definition indicator.h:153
typename View::state_type state_type
Definition indicator.h:147
typename View::ScalarNumber ScalarNumber
Definition indicator.h:143
typename View::flux_contribution_type flux_contribution_type
Definition indicator.h:149
typename View::precomputed_type precomputed_type
Definition indicator.h:151
Indicator(const HyperbolicSystem &hyperbolic_system, const std::string &subsection="/Indicator")
Definition indicator.h:58
TransferPolicy
Definition gpu.h:88
DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number safe_division(const Number &numerator, const Number &denominator)
Definition simd.h:164