10#include <compile_time_options.h>
17#include <deal.II/base/parameter_acceptor.h>
18#include <deal.II/base/vectorization.h>
23 namespace ShallowWater
25 template <
int dim,
typename Number =
double>
34 template <
typename ScalarNumber =
double>
47 template <
int dim,
typename Number =
double>
60 const std::string &subsection =
"/Indicator")
61 : ParameterAcceptor(subsection)
62 , hyperbolic_system_(&hyperbolic_system)
64 evc_factor_ = ScalarNumber(1.);
65 add_parameter(
"evc factor",
67 "Factor for scaling the entropy viscocity commuator");
83 template <
int dim,
typename Number>
87 hyperbolic_system_->template view<dim, Number>(), *
this};
97 ScalarNumber evc_factor_;
105 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
119 template <
int dim,
typename Number>
168 , indicator_(indicator)
185 const unsigned int *js,
187 const dealii::Tensor<1, dim, Number> &c_ij);
192 Number
alpha(
const Number h_i);
209 Number pressure_i_ = 0.;
224 template <
int dim,
typename Number>
225 DEAL_II_ALWAYS_INLINE
inline void
227 const unsigned int i,
232 const auto &[eta_m, h_star] =
233 pv.template read_tensor<Number, precomputed_type>(i);
235 h_i_ = view_.water_depth(U_i);
237 d_eta_i_ = view_.mathematical_entropy_derivative(U_i);
239 pressure_i_ = view_.pressure(U_i);
246 template <
int dim,
typename Number>
249 const unsigned int *js,
251 const dealii::Tensor<1, dim, Number> &c_ij)
255 const auto &[eta_j, h_star_j] =
256 pv.template read_tensor<Number, precomputed_type>(js);
258 const auto velocity_j =
259 view_.momentum(U_j) * view_.inverse_water_depth_sharp(U_j);
260 const auto f_j = view_.f(U_j);
261 const auto pressure_j = view_.pressure(U_j);
263 left_ += (eta_j + pressure_j) * (velocity_j * c_ij);
265 for (
unsigned int k = 0; k < problem_dimension; ++k)
266 right_[k] += (f_j[k] - f_i_[k]) * c_ij;
270 template <
int dim,
typename Number>
271 DEAL_II_ALWAYS_INLINE
inline Number
275 for (
unsigned int k = 0; k < problem_dimension; ++k) {
276 my_sum += d_eta_i_[k] * right_[k];
279 Number numerator = std::abs(left_ - my_sum);
280 Number denominator = std::abs(left_) + std::abs(my_sum);
282 const auto regularization =
283 Number(100. * std::numeric_limits<ScalarNumber>::min());
285 const auto quotient =
286 std::abs(numerator) /
287 (denominator + std::max(hd_i * std::abs(eta_i_), regularization));
289 return std::min(Number(1.), indicator_.evc_factor() * quotient);
dealii::Tensor< 1, problem_dimension, dealii::Tensor< 1, dim, Number > > flux_type
typename get_value_type< Number >::type ScalarNumber
dealii::Tensor< 1, problem_dimension, Number > state_type
Vectors::MultiComponentVectorView< ScalarNumber, n_precomputed_values, dealii::VectorizedArray< ScalarNumber >::size(), dealii::MemorySpace::Host, false > PrecomputedVectorView
std::array< Number, n_precomputed_values > precomputed_type
static constexpr unsigned int problem_dimension
typename View::ScalarNumber ScalarNumber
IndicatorView(const View &view, const Indicator< ScalarNumber > &indicator)
void reset(const PrecomputedVectorView &pv, const unsigned int, const state_type &U_i)
typename View::PrecomputedVectorView PrecomputedVectorView
HyperbolicSystemView< dim, Number > View
void accumulate(const PrecomputedVectorView &pv, const unsigned int *js, const state_type &U_j, const dealii::Tensor< 1, dim, Number > &c_ij)
Number alpha(const Number h_i)
typename View::flux_type flux_type
typename View::state_type state_type
static constexpr auto problem_dimension
typename View::precomputed_type precomputed_type
Indicator(const HyperbolicSystem &hyperbolic_system, const std::string &subsection="/Indicator")
ACCESSOR_READ_ONLY(evc_factor)