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 ScalarConservation
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_("scalar_conservation_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
145 using state_type = typename View::state_type;
146
148
150
152
154
172
177 IndicatorView(const View &view, const Indicator<ScalarNumber> &indicator)
178 : view_(view)
179 , parameters_(indicator.parameters_.template view<MemorySpace>())
180 {
181 }
182
187 DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber evc_factor() const
188 {
189 return ScalarNumber(parameters_->evc_factor);
190 }
191
196 DEAL_II_HOST_DEVICE void reset(const PrecomputedVectorView &pv,
197 const unsigned int i,
198 const state_type &U_i,
199 const flux_contribution_type &flux_i);
200
205 DEAL_II_HOST_DEVICE void
207 const unsigned int *js,
208 const state_type &U_j,
209 const flux_contribution_type &flux_j,
210 const dealii::Tensor<1, dim, Number> &c_ij);
211
215 DEAL_II_HOST_DEVICE Number alpha(const Number h_i) const;
216
217
218 private:
220
224
225 const View view_;
226 const Indicator<ScalarNumber>::Parameters *const parameters_;
227
228 Number u_i_ = 0.;
229 Number u_abs_max_ = 0.;
230 dealii::Tensor<1, dim, Number> f_i_;
231 Number left_ = 0.;
232 Number right_ = 0.;
234 };
235
236
237 /*
238 * -------------------------------------------------------------------------
239 * Inline definitions
240 * -------------------------------------------------------------------------
241 */
242
243
244 template <int dim, typename Number, typename MemorySpace>
245 DEAL_II_HOST_DEVICE_ALWAYS_INLINE void
247 const PrecomputedVectorView &pv,
248 const unsigned int i,
249 const state_type &U_i,
250 const flux_contribution_type & /*flux_i*/)
251 {
252 /* entropy viscosity commutator: */
253
254 const auto prec_i = pv.template read_tensor<Number, precomputed_type>(i);
255
256 u_i_ = view_.state(U_i);
257 u_abs_max_ = std::abs(u_i_);
258 f_i_ = view_.construct_flux_tensor(prec_i);
259 left_ = 0.;
260 right_ = 0.;
261 }
262
263
264 template <int dim, typename Number, typename MemorySpace>
265 DEAL_II_HOST_DEVICE_ALWAYS_INLINE void
267 const PrecomputedVectorView &pv,
268 const unsigned int *js,
269 const state_type &U_j,
270 const flux_contribution_type & /*flux_j*/,
271 const dealii::Tensor<1, dim, Number> &c_ij)
272 {
273 /* entropy viscosity commutator: */
274
275 const auto prec_j = pv.template read_tensor<Number, precomputed_type>(js);
276
277 const auto u_j = view_.state(U_j);
278 u_abs_max_ = std::max(u_abs_max_, std::abs(u_j));
279 const auto d_eta_j = view_.kruzkov_entropy_derivative(u_i_, u_j);
280 const auto f_j = view_.construct_flux_tensor(prec_j);
281
282 left_ += d_eta_j * (f_j * c_ij);
283 right_ += d_eta_j * (f_i_ * c_ij);
284 }
285
286
287 template <int dim, typename Number, typename MemorySpace>
288 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
290 {
291 Number numerator = left_ - right_;
292 Number denominator = std::abs(left_) + std::abs(right_);
293
294 const auto regularization =
295 Number(100. * std::numeric_limits<ScalarNumber>::min());
296
297 const auto quotient =
298 std::abs(numerator) /
299 (denominator + std::max(hd_i * std::abs(u_abs_max_), regularization));
300
301 return std::min(Number(1.), evc_factor() * quotient);
302 }
303
304 } // namespace ScalarConservation
305} // namespace ryujin
dealii::Tensor< 1, problem_dimension, Number > state_type
std::array< Number, n_precomputed_values > precomputed_type
typename get_value_type< Number >::type ScalarNumber
VectorView< n_precomputed_values > PrecomputedVectorView
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:266
IndicatorView(const View &view, const Indicator< ScalarNumber > &indicator)
Definition indicator.h:177
HyperbolicSystemView< dim, Number, MemorySpace > View
Definition indicator.h:141
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber evc_factor() const
Definition indicator.h:187
typename View::PrecomputedVectorView PrecomputedVectorView
Definition indicator.h:151
typename View::state_type state_type
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:246
typename View::precomputed_type precomputed_type
Definition indicator.h:149
DEAL_II_HOST_DEVICE Number alpha(const Number h_i) const
Definition indicator.h:289
typename View::flux_contribution_type flux_contribution_type
Definition indicator.h:147
typename View::ScalarNumber ScalarNumber
Definition indicator.h:143
Indicator(const HyperbolicSystem &hyperbolic_system, const std::string &subsection="/Indicator")
Definition indicator.h:58
TransferPolicy
Definition gpu.h:88