10#include <compile_time_options.h>
19#include <deal.II/base/parameter_acceptor.h>
20#include <deal.II/base/vectorization.h>
24 namespace ShallowWater
27 typename Number = double,
28 typename MemorySpace = dealii::MemorySpace::Host>
37 template <
typename ScalarNumber =
double>
63 const std::string &subsection =
"/Indicator")
64 : ParameterAcceptor(subsection)
65 , parameters_(
"shallow_water_indicator_parameters",
67 , hyperbolic_system_(&hyperbolic_system)
70 auto ¶meters = *parameters_.view();
72 parameters.evc_factor = 1.;
73 add_parameter(
"evc factor",
74 parameters.evc_factor,
75 "Factor for scaling the entropy viscocity commuator");
78 ParameterAcceptor::parse_parameters_call_back.connect(
79 [
this] { parameters_.view(); });
91 typename MemorySpace = dealii::MemorySpace::Host>
95 hyperbolic_system_->template view<dim, Number, MemorySpace>(),
114 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
116 template <
int,
typename,
typename>
131 template <
int dim,
typename Number,
typename MemorySpace>
136 std::is_same_v<MemorySpace, dealii::MemorySpace::Host> ||
137 std::is_same_v<MemorySpace, dealii::MemorySpace::Default>,
138 "Unexpected memory space");
185 , parameters_(indicator.parameters_.template view<MemorySpace>())
203 const unsigned int i,
210 DEAL_II_HOST_DEVICE
void
212 const unsigned int *js,
214 const dealii::Tensor<1, dim, Number> &c_ij);
219 DEAL_II_HOST_DEVICE Number
alpha(
const Number h_i)
const;
236 Number pressure_i_ = 0.;
251 template <
int dim,
typename Number,
typename MemorySpace>
252 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
void
255 const unsigned int i,
260 const auto &[eta_m, h_star] =
261 pv.template read_tensor<Number, precomputed_type>(i);
263 h_i_ = view_.water_depth(U_i);
265 d_eta_i_ = view_.mathematical_entropy_derivative(U_i);
267 pressure_i_ = view_.pressure(U_i);
274 template <
int dim,
typename Number,
typename MemorySpace>
275 DEAL_II_HOST_DEVICE_ALWAYS_INLINE
void
278 const unsigned int *js,
280 const dealii::Tensor<1, dim, Number> &c_ij)
284 const auto &[eta_j, h_star_j] =
285 pv.template read_tensor<Number, precomputed_type>(js);
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);
292 left_ += (eta_j + pressure_j) * (velocity_j * c_ij);
294 for (
unsigned int k = 0; k < problem_dimension; ++k)
295 right_[k] += (f_j[k] - f_i_[k]) * c_ij;
299 template <
int dim,
typename Number,
typename MemorySpace>
300 DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number
304 for (
unsigned int k = 0; k < problem_dimension; ++k) {
305 my_sum += d_eta_i_[k] * right_[k];
308 Number numerator = std::abs(left_ - my_sum);
309 Number denominator = std::abs(left_) + std::abs(my_sum);
311 const auto regularization =
312 Number(100. * std::numeric_limits<ScalarNumber>::min());
314 const auto quotient =
315 std::abs(numerator) /
316 (denominator + std::max(hd_i * std::abs(eta_i_), regularization));
318 return std::min(Number(1.), evc_factor() * quotient);
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)
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)
static constexpr auto problem_dimension
typename View::PrecomputedVectorView PrecomputedVectorView
typename View::state_type state_type
typename View::precomputed_type precomputed_type
typename View::flux_type flux_type
typename View::ScalarNumber ScalarNumber
IndicatorView(const View &view, const Indicator< ScalarNumber > &indicator)
DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber evc_factor() const
HyperbolicSystemView< dim, Number, MemorySpace > View
DEAL_II_HOST_DEVICE Number alpha(const Number h_i) const
Indicator(const HyperbolicSystem &hyperbolic_system, const std::string &subsection="/Indicator")
@ implicit_transfers_host_resident