8#include <compile_time_options.h>
15#include <deal.II/base/parameter_acceptor.h>
16#include <deal.II/base/vectorization.h>
21 namespace ScalarConservation
23 template <
typename ScalarNumber =
double>
28 : ParameterAcceptor(subsection)
30 evc_factor_ = ScalarNumber(1.);
31 add_parameter(
"evc factor",
33 "Factor for scaling the entropy viscocity commuator");
39 ScalarNumber evc_factor_;
49 template <
int dim,
typename Number =
double>
100 : hyperbolic_system(hyperbolic_system)
101 , parameters(parameters)
102 , precomputed_values(precomputed_values)
118 const dealii::Tensor<1, dim, Number> &c_ij);
123 Number
alpha(
const Number h_i)
const;
139 dealii::Tensor<1, dim, Number> f_i;
153 template <
int dim,
typename Number>
154 DEAL_II_ALWAYS_INLINE
inline void
159 const auto view = hyperbolic_system.view<dim, Number>();
162 precomputed_values.template get_tensor<Number, precomputed_type>(i);
164 u_i = view.state(U_i);
165 u_abs_max = std::abs(u_i);
166 f_i = view.construct_flux_tensor(prec_i);
172 template <
int dim,
typename Number>
174 const unsigned int *js,
176 const dealii::Tensor<1, dim, Number> &c_ij)
180 const auto view = hyperbolic_system.view<dim, Number>();
183 precomputed_values.template get_tensor<Number, precomputed_type>(js);
185 const auto u_j = view.state(U_j);
186 u_abs_max = std::max(u_abs_max, std::abs(u_j));
187 const auto d_eta_j = view.kruzkov_entropy_derivative(u_i, u_j);
188 const auto f_j = view.construct_flux_tensor(prec_j);
190 left += d_eta_j * (f_j * c_ij);
191 right += d_eta_j * (f_i * c_ij);
195 template <
int dim,
typename Number>
196 DEAL_II_ALWAYS_INLINE
inline Number
199 Number numerator = left - right;
200 Number denominator = std::abs(left) + std::abs(right);
202 const auto regularization =
203 Number(100. * std::numeric_limits<ScalarNumber>::min());
205 const auto quotient =
206 std::abs(numerator) /
207 (denominator + std::max(hd_i * std::abs(u_abs_max), regularization));
209 return std::min(Number(1.), parameters.evc_factor() * quotient);
static constexpr unsigned int problem_dimension
dealii::Tensor< 1, problem_dimension, dealii::Tensor< 1, dim, Number > > flux_type
std::array< Number, n_precomputed_values > precomputed_type
Vectors::MultiComponentVector< ScalarNumber, n_precomputed_values > PrecomputedVector
typename get_value_type< Number >::type ScalarNumber
dealii::Tensor< 1, problem_dimension, Number > state_type
ACCESSOR_READ_ONLY(evc_factor)
IndicatorParameters(const std::string &subsection="/Indicator")
void reset(const unsigned int i, const state_type &U_i)
typename View::state_type state_type
typename View::PrecomputedVector PrecomputedVector
typename View::ScalarNumber ScalarNumber
void accumulate(const unsigned int *js, const state_type &U_j, const dealii::Tensor< 1, dim, Number > &c_ij)
static constexpr auto problem_dimension
typename View::flux_type flux_type
Indicator(const HyperbolicSystem &hyperbolic_system, const Parameters ¶meters, const PrecomputedVector &precomputed_values)
Number alpha(const Number h_i) const
typename View::precomputed_type precomputed_type