8#include <ryujin/base/compile_time_options.h>
14#include <deal.II/base/point.h>
15#include <deal.II/base/tensor.h>
21 namespace EulerBarotropic
24 typename Number = double,
25 typename MemorySpace = dealii::MemorySpace::Host>
26 class WaveSpeedEstimatorView;
36 template <
typename ScalarNumber =
double>
49 const std::string &subsection =
"/WaveSpeedEstimator")
50 : ParameterAcceptor(subsection)
51 , hyperbolic_system_(&hyperbolic_system)
64 typename MemorySpace = dealii::MemorySpace::Host>
68 hyperbolic_system_->template view<dim, Number, MemorySpace>(),
79 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
81 template <
int,
typename,
typename>
96 template <
int dim,
typename Number,
typename MemorySpace>
101 std::is_same_v<MemorySpace, dealii::MemorySpace::Host> ||
102 std::is_same_v<MemorySpace, dealii::MemorySpace::Default>,
103 "Unexpected memory space");
154 DEAL_II_HOST_DEVICE Number
163 DEAL_II_HOST_DEVICE Number
165 const unsigned int i,
166 const unsigned int *js,
171 const dealii::Tensor<1, dim, Number> &n_ij)
const;
193 template <
int dim,
typename Number,
typename MemorySpace>
194 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
199 const auto &[u_i, a_i] = riemann_data_i;
200 const auto &[u_j, a_j] = riemann_data_j;
202#ifdef DEBUG_WAVE_SPEED_ESTIMATOR
203 std::cout <<
"u_left: " << u_i << std::endl;
204 std::cout <<
"a_left: " << a_i << std::endl;
205 std::cout <<
"u_right: " << u_j << std::endl;
206 std::cout <<
"a_right: " << a_j << std::endl;
209 const Number lambda_max =
210 std::max(std::abs(u_i) + a_i, std::abs(u_j) + a_j);
215 template <
int dim,
typename Number,
typename MemorySpace>
216 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
219 const unsigned int i,
220 const unsigned int *js,
225 const dealii::Tensor<1, dim, Number> &n_ij)
const
227 const auto &[e_i, p_i, a_i] =
228 pv.template read_tensor<Number, precomputed_type>(i);
230 const auto &[e_j, p_j, a_j] =
231 pv.template read_tensor<Number, precomputed_type>(js);
233 const auto rho_i = view_.density(U_i);
234 const auto rho_i_inverse = Number(1.0) / rho_i;
235 const auto m_i = view_.momentum(U_i);
236 const auto u_i = rho_i_inverse * n_ij * m_i;
238 const auto rho_j = view_.density(U_j);
239 const auto rho_j_inverse = Number(1.0) / rho_j;
240 const auto m_j = view_.momentum(U_j);
241 const auto u_j = rho_j_inverse * n_ij * m_j;
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
flux_type flux_contribution_type
typename View::precomputed_type precomputed_type
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
typename View::ScalarNumber ScalarNumber
typename View::state_type state_type
typename View::flux_contribution_type flux_contribution_type
WaveSpeedEstimatorView(const View &view, const WaveSpeedEstimator< ScalarNumber > &)
static constexpr unsigned int riemann_data_size
WaveSpeedEstimator(const HyperbolicSystem &hyperbolic_system, const std::string &subsection="/WaveSpeedEstimator")