ryujin 2.1.1 revision b04fb4aba7bd97ddfa5994a6b4b6e8586eb15db2
Loading...
Searching...
No Matches
indicator.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0
3// [LANL Copyright Statement]
4// Copyright (C) 2023 - 2026 by the ryujin authors
5// Copyright (C) 2023 - 2024 by Triad National Security, LLC
6//
7
8#pragma once
9
10#include <compile_time_options.h>
11
12#include "hyperbolic_system.h"
13
14#include <gpu.h>
16#include <observer_pointer.h>
17#include <simd.h>
18
19#include <deal.II/base/parameter_acceptor.h>
20#include <deal.II/base/vectorization.h>
21
22namespace ryujin
23{
24 namespace ShallowWater
25 {
26 template <int dim,
27 typename Number = double,
28 typename MemorySpace = dealii::MemorySpace::Host>
29 class IndicatorView;
30
37 template <typename ScalarNumber = double>
38 class Indicator : public dealii::ParameterAcceptor
39 {
40 public:
45
49 struct Parameters {
50 double evc_factor;
51 };
52
54
58
62 Indicator(const HyperbolicSystem &hyperbolic_system,
63 const std::string &subsection = "/Indicator")
64 : ParameterAcceptor(subsection)
65 , parameters_("shallow_water_indicator_parameters",
67 , hyperbolic_system_(&hyperbolic_system)
68 {
69 /* reference remains valid due to implicit_transfers_host_resident */
70 auto &parameters = *parameters_.view();
71
72 parameters.evc_factor = 1.;
73 add_parameter("evc factor",
74 parameters.evc_factor,
75 "Factor for scaling the entropy viscocity commuator");
76
77 /* invalidates view on default memory space */
78 ParameterAcceptor::parse_parameters_call_back.connect(
79 [this] { parameters_.view(); });
80 }
81
89 template <int dim,
90 typename Number,
91 typename MemorySpace = dealii::MemorySpace::Host>
92 auto view() const
93 {
95 hyperbolic_system_->template view<dim, Number, MemorySpace>(),
96 *this};
97 }
98
99 private:
101
105
106 Mirrored<Parameters> parameters_;
107
109
113
114 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
115
116 template <int, typename, typename>
117 friend class IndicatorView;
118
120 };
121
122
131 template <int dim, typename Number, typename MemorySpace>
133 {
134 public:
135 static_assert(
136 std::is_same_v<MemorySpace, dealii::MemorySpace::Host> ||
137 std::is_same_v<MemorySpace, dealii::MemorySpace::Default>,
138 "Unexpected memory space");
139
144
146
148
150
151 using state_type = typename View::state_type;
152
153 using flux_type = typename View::flux_type;
154
156
158
160
178
183 IndicatorView(const View &view, const Indicator<ScalarNumber> &indicator)
184 : view_(view)
185 , parameters_(indicator.parameters_.template view<MemorySpace>())
186 {
187 }
188
193 DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber evc_factor() const
194 {
195 return ScalarNumber(parameters_->evc_factor);
196 }
197
202 DEAL_II_HOST_DEVICE void reset(const PrecomputedVectorView &pv,
203 const unsigned int i,
204 const state_type &U_i);
205
210 DEAL_II_HOST_DEVICE void
212 const unsigned int *js,
213 const state_type &U_j,
214 const dealii::Tensor<1, dim, Number> &c_ij);
215
219 DEAL_II_HOST_DEVICE Number alpha(const Number h_i) const;
220
221
222 private:
224
228
229 const View view_;
230 const Indicator<ScalarNumber>::Parameters *const parameters_;
231
232 Number h_i_ = 0.;
233 Number eta_i_ = 0.;
234 flux_type f_i_;
235 state_type d_eta_i_;
236 Number pressure_i_ = 0.;
237
238 Number left_ = 0.;
239 state_type right_;
241 };
242
243
244 /*
245 * -------------------------------------------------------------------------
246 * Inline definitions
247 * -------------------------------------------------------------------------
248 */
249
250
251 template <int dim, typename Number, typename MemorySpace>
252 DEAL_II_HOST_DEVICE_ALWAYS_INLINE void
254 const PrecomputedVectorView &pv,
255 const unsigned int i,
256 const state_type &U_i)
257 {
258 /* entropy viscosity commutator: */
259
260 const auto &[eta_m, h_star] =
261 pv.template read_tensor<Number, precomputed_type>(i);
262
263 h_i_ = view_.water_depth(U_i);
264 eta_i_ = eta_m;
265 d_eta_i_ = view_.mathematical_entropy_derivative(U_i);
266 f_i_ = view_.f(U_i);
267 pressure_i_ = view_.pressure(U_i);
268
269 left_ = 0.;
270 right_ = 0.;
271 }
272
273
274 template <int dim, typename Number, typename MemorySpace>
275 DEAL_II_HOST_DEVICE_ALWAYS_INLINE void
277 const PrecomputedVectorView &pv,
278 const unsigned int *js,
279 const state_type &U_j,
280 const dealii::Tensor<1, dim, Number> &c_ij)
281 {
282 /* entropy viscosity commutator: */
283
284 const auto &[eta_j, h_star_j] =
285 pv.template read_tensor<Number, precomputed_type>(js);
286
287 const auto velocity_j =
288 view_.momentum(U_j) * view_.inverse_water_depth_sharp(U_j);
289 const auto f_j = view_.f(U_j);
290 const auto pressure_j = view_.pressure(U_j);
291
292 left_ += (eta_j + pressure_j) * (velocity_j * c_ij);
293
294 for (unsigned int k = 0; k < problem_dimension; ++k)
295 right_[k] += (f_j[k] - f_i_[k]) * c_ij;
296 }
297
298
299 template <int dim, typename Number, typename MemorySpace>
300 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
302 {
303 Number my_sum = 0.;
304 for (unsigned int k = 0; k < problem_dimension; ++k) {
305 my_sum += d_eta_i_[k] * right_[k];
306 }
307
308 Number numerator = std::abs(left_ - my_sum);
309 Number denominator = std::abs(left_) + std::abs(my_sum);
310
311 const auto regularization =
312 Number(100. * std::numeric_limits<ScalarNumber>::min());
313
314 const auto quotient =
315 std::abs(numerator) /
316 (denominator + std::max(hd_i * std::abs(eta_i_), regularization));
317
318 return std::min(Number(1.), evc_factor() * quotient);
319 }
320 } // namespace ShallowWater
321} // namespace ryujin
static constexpr unsigned int problem_dimension
typename get_value_type< Number >::type ScalarNumber
dealii::Tensor< 1, problem_dimension, Number > state_type
VectorView< n_precomputed_values > PrecomputedVectorView
dealii::Tensor< 1, problem_dimension, dealii::Tensor< 1, dim, Number > > flux_type
std::array< Number, n_precomputed_values > precomputed_type
DEAL_II_HOST_DEVICE void reset(const PrecomputedVectorView &pv, const unsigned int i, const state_type &U_i)
Definition indicator.h:253
DEAL_II_HOST_DEVICE void accumulate(const PrecomputedVectorView &pv, const unsigned int *js, const state_type &U_j, const dealii::Tensor< 1, dim, Number > &c_ij)
Definition indicator.h:276
static constexpr auto problem_dimension
Definition indicator.h:149
typename View::PrecomputedVectorView PrecomputedVectorView
Definition indicator.h:157
typename View::state_type state_type
Definition indicator.h:151
typename View::precomputed_type precomputed_type
Definition indicator.h:155
typename View::flux_type flux_type
Definition indicator.h:153
typename View::ScalarNumber ScalarNumber
Definition indicator.h:147
IndicatorView(const View &view, const Indicator< ScalarNumber > &indicator)
Definition indicator.h:183
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber evc_factor() const
Definition indicator.h:193
HyperbolicSystemView< dim, Number, MemorySpace > View
Definition indicator.h:145
DEAL_II_HOST_DEVICE Number alpha(const Number h_i) const
Definition indicator.h:301
Indicator(const HyperbolicSystem &hyperbolic_system, const std::string &subsection="/Indicator")
Definition indicator.h:62
TransferPolicy
Definition gpu.h:88