ryujin 2.1.1 revision b04fb4aba7bd97ddfa5994a6b4b6e8586eb15db2
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 - 2026 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 <gpu.h>
13#include <observer_pointer.h>
14#include <simd.h>
15
16#include <deal.II/base/point.h>
17#include <deal.II/base/tensor.h>
18
19// #define DEBUG_WAVE_SPEED_ESTIMATOR
20
21namespace ryujin
22{
23 namespace EulerBarotropic
24 {
25 template <int dim,
26 typename Number = double,
27 typename MemorySpace = dealii::MemorySpace::Host>
28 class WaveSpeedEstimatorView;
29
38 template <typename ScalarNumber = double>
39 class WaveSpeedEstimator : public dealii::ParameterAcceptor
40 {
41 public:
46
50 WaveSpeedEstimator(const HyperbolicSystem &hyperbolic_system,
51 const std::string &subsection = "/WaveSpeedEstimator")
52 : ParameterAcceptor(subsection)
53 , hyperbolic_system_(&hyperbolic_system)
54 {
55 }
56
64 template <int dim,
65 typename Number,
66 typename MemorySpace = dealii::MemorySpace::Host>
67 auto view() const
68 {
70 hyperbolic_system_->template view<dim, Number, MemorySpace>(),
71 *this};
72 }
73
74 private:
76
80
81 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
82
83 template <int, typename, typename>
85
87 };
88
89
98 template <int dim, typename Number, typename MemorySpace>
100 {
101 public:
102 static_assert(
103 std::is_same_v<MemorySpace, dealii::MemorySpace::Host> ||
104 std::is_same_v<MemorySpace, dealii::MemorySpace::Default>,
105 "Unexpected memory space");
106
111
113
115
116 using state_type = typename View::state_type;
117
121 static constexpr unsigned int riemann_data_size = 2;
122
127 using primitive_type = typename std::array<Number, riemann_data_size>;
128
130
132
134
138
144 const WaveSpeedEstimator<ScalarNumber> & /*wse*/)
145 : view_(view)
146 {
147 }
148
154 DEAL_II_HOST_DEVICE Number
155 compute(const primitive_type &riemann_data_i,
156 const primitive_type &riemann_data_j) const;
157
163 DEAL_II_HOST_DEVICE Number
165 const state_type &U_i,
166 const state_type &U_j,
167 const unsigned int i,
168 const unsigned int *js,
169 const dealii::Tensor<1, dim, Number> &n_ij) const;
170
171 private:
173
177
178 const View view_;
179
181 };
182
183
184 /*
185 * -------------------------------------------------------------------------
186 * Inline definitions
187 * -------------------------------------------------------------------------
188 */
189
190
191 template <int dim, typename Number, typename MemorySpace>
192 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
194 const primitive_type &riemann_data_i,
195 const primitive_type &riemann_data_j) const
196 {
197 const auto &[u_i, a_i] = riemann_data_i;
198 const auto &[u_j, a_j] = riemann_data_j;
199
200#ifdef DEBUG_WAVE_SPEED_ESTIMATOR
201 std::cout << "u_left: " << u_i << std::endl;
202 std::cout << "a_left: " << a_i << std::endl;
203 std::cout << "u_right: " << u_j << std::endl;
204 std::cout << "a_right: " << a_j << std::endl;
205#endif
206
207 const Number lambda_max =
208 std::max(std::abs(u_i) + a_i, std::abs(u_j) + a_j);
209 return lambda_max;
210 }
211
212
213 template <int dim, typename Number, typename MemorySpace>
214 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
216 const PrecomputedVectorView &pv,
217 const state_type &U_i,
218 const state_type &U_j,
219 const unsigned int i,
220 const unsigned int *js,
221 const dealii::Tensor<1, dim, Number> &n_ij) const
222 {
223 const auto &[e_i, p_i, a_i] =
224 pv.template read_tensor<Number, precomputed_type>(i);
225
226 const auto &[e_j, p_j, a_j] =
227 pv.template read_tensor<Number, precomputed_type>(js);
228
229 const auto rho_i = view_.density(U_i);
230 const auto rho_i_inverse = Number(1.0) / rho_i;
231 const auto m_i = view_.momentum(U_i);
232 const auto u_i = rho_i_inverse * n_ij * m_i;
233
234 const auto rho_j = view_.density(U_j);
235 const auto rho_j_inverse = Number(1.0) / rho_j;
236 const auto m_j = view_.momentum(U_j);
237 const auto u_j = rho_j_inverse * n_ij * m_j;
238
239 return compute(primitive_type{u_i, a_i}, primitive_type{u_j, a_j});
240 }
241 } // namespace EulerBarotropic
242} // namespace ryujin
VectorView< n_precomputed_values > PrecomputedVectorView
std::array< Number, n_precomputed_values > precomputed_type
dealii::Tensor< 1, problem_dimension, Number > state_type
typename get_value_type< Number >::type ScalarNumber
DEAL_II_HOST_DEVICE Number compute(const primitive_type &riemann_data_i, const primitive_type &riemann_data_j) const
typename std::array< Number, riemann_data_size > primitive_type
typename View::PrecomputedVectorView PrecomputedVectorView
HyperbolicSystemView< dim, Number, MemorySpace > View
WaveSpeedEstimatorView(const View &view, const WaveSpeedEstimator< ScalarNumber > &)
WaveSpeedEstimator(const HyperbolicSystem &hyperbolic_system, const std::string &subsection="/WaveSpeedEstimator")