![]() |
ryujin 2.1.1 revision ee5cbcbf2346c1299c942d0e1f13b46449973c18
|
#include <source/euler/limiter.h>
Public Member Functions | |
Stencil-based computation of bounds | |
Intended usage: LimiterView<dim, Number> limiter_view;
for (unsigned int i = n_internal; i < n_owned; ++i) {
// ...
limiter_view.reset(pv, i, U_i, flux_i);
for (unsigned int col_idx = 1; col_idx < row_length; ++col_idx) {
// ...
limiter_view.accumulate(pv, js, U_j, flux_j, scaled_c_ij,
affine_shift);
}
limiter_view.bounds(hd_i);
}
Definition limiter.h:201 DEAL_II_HOST_DEVICE void reset(const PrecomputedVectorView &pv, const unsigned int i, const state_type &U_i, const flux_contribution_type &flux_i) Definition limiter.h:473 DEAL_II_HOST_DEVICE void accumulate(const PrecomputedVectorView &pv, const unsigned int *js, const state_type &U_j, const flux_contribution_type &flux_j, const dealii::Tensor< 1, dim, Number > &scaled_c_ij, const state_type &affine_shift) Definition limiter.h:499 DEAL_II_HOST_DEVICE Bounds bounds(const Number hd_i) const Definition limiter.h:550 | |
| DEAL_II_HOST_DEVICE void | reset (const PrecomputedVectorView &pv, const unsigned int i, const state_type &U_i, const flux_contribution_type &flux_i) |
| DEAL_II_HOST_DEVICE void | accumulate (const PrecomputedVectorView &pv, const unsigned int *js, const state_type &U_j, const flux_contribution_type &flux_j, const dealii::Tensor< 1, dim, Number > &scaled_c_ij, const state_type &affine_shift) |
| DEAL_II_HOST_DEVICE Bounds | bounds (const Number hd_i) const |
Convex limiter | |
| DEAL_II_HOST_DEVICE std::tuple< Number, bool > | limit (const Bounds &bounds, const state_type &U, const state_type &P, const Number t_min=Number(0.), const Number t_max=Number(1.)) const |
Typedefs and constexpr constants | |
| using | View = HyperbolicSystemView< dim, Number, MemorySpace > |
| using | ScalarNumber = typename View::ScalarNumber |
| using | state_type = typename View::state_type |
| using | flux_contribution_type = typename View::flux_contribution_type |
| using | precomputed_type = typename View::precomputed_type |
| using | PrecomputedVectorView = typename View::PrecomputedVectorView |
| static constexpr auto | problem_dimension = View::problem_dimension |
Computation and manipulation of bounds | |
| using | Bounds = std::array< Number, n_bounds > |
| static constexpr unsigned int | n_bounds = 3 |
| LimiterView (const View &view, const Limiter< ScalarNumber > &limiter) | |
| DEAL_II_HOST_DEVICE_ALWAYS_INLINE unsigned int | iterations () const |
| DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber | newton_tolerance () const |
| DEAL_II_HOST_DEVICE_ALWAYS_INLINE unsigned int | newton_max_iterations () const |
| DEAL_II_HOST_DEVICE_ALWAYS_INLINE ScalarNumber | relaxation_factor () const |
| DEAL_II_HOST_DEVICE Bounds | projection_bounds_from_state (const PrecomputedVectorView &pv, const unsigned int i, const state_type &U_i) const |
| DEAL_II_HOST_DEVICE Bounds | combine_bounds (const Bounds &bounds_left, const Bounds &bounds_right) const |
| DEAL_II_HOST_DEVICE Bounds | fully_relax_bounds (const Bounds &bounds, const Number &hd) const |
A view of the Limiter that makes the interface available for a given dimension dim and choice of number type Number (which can be a scalar float, or double, as well as a VectorizedArray holding packed scalars).
| using ryujin::Euler::LimiterView< dim, Number, MemorySpace >::View = HyperbolicSystemView<dim, Number, MemorySpace> |
| using ryujin::Euler::LimiterView< dim, Number, MemorySpace >::ScalarNumber = typename View::ScalarNumber |
| using ryujin::Euler::LimiterView< dim, Number, MemorySpace >::state_type = typename View::state_type |
| using ryujin::Euler::LimiterView< dim, Number, MemorySpace >::flux_contribution_type = typename View::flux_contribution_type |
| using ryujin::Euler::LimiterView< dim, Number, MemorySpace >::precomputed_type = typename View::precomputed_type |
| using ryujin::Euler::LimiterView< dim, Number, MemorySpace >::PrecomputedVectorView = typename View::PrecomputedVectorView |
| using ryujin::Euler::LimiterView< dim, Number, MemorySpace >::Bounds = std::array<Number, n_bounds> |
|
inline |
Constructor taking a HyperbolicSystemView and a Limiter object as arguments
|
inline |
|
inline |
|
inline |
|
inline |
| DEAL_II_HOST_DEVICE_ALWAYS_INLINE auto ryujin::Euler::LimiterView< dim, Number, MemorySpace >::projection_bounds_from_state | ( | const PrecomputedVectorView & | pv, |
| const unsigned int | i, | ||
| const state_type & | U_i | ||
| ) | const |
| DEAL_II_HOST_DEVICE_ALWAYS_INLINE auto ryujin::Euler::LimiterView< dim, Number, MemorySpace >::combine_bounds | ( | const Bounds & | bounds_left, |
| const Bounds & | bounds_right | ||
| ) | const |
| DEAL_II_HOST_DEVICE_ALWAYS_INLINE auto ryujin::Euler::LimiterView< dim, Number, MemorySpace >::fully_relax_bounds | ( | const Bounds & | bounds, |
| const Number & | hd | ||
| ) | const |
This function applies a relaxation to a given a (strict) bound bounds using a non dimensionalized measure hd (that should scale as $h^d$, where $h$ is the local mesh size). This is done for the case of the Euler equations by multiplying maximum bounds with $(1+r)$ and minimum bounds with $(1-r)$, while ensuring that the bounds still describe an admissible state.
| DEAL_II_HOST_DEVICE_ALWAYS_INLINE void ryujin::Euler::LimiterView< dim, Number, MemorySpace >::reset | ( | const PrecomputedVectorView & | pv, |
| const unsigned int | i, | ||
| const state_type & | U_i, | ||
| const flux_contribution_type & | flux_i | ||
| ) |
| DEAL_II_HOST_DEVICE_ALWAYS_INLINE void ryujin::Euler::LimiterView< dim, Number, MemorySpace >::accumulate | ( | const PrecomputedVectorView & | pv, |
| const unsigned int * | js, | ||
| const state_type & | U_j, | ||
| const flux_contribution_type & | flux_j, | ||
| const dealii::Tensor< 1, dim, Number > & | scaled_c_ij, | ||
| const state_type & | affine_shift | ||
| ) |
| DEAL_II_HOST_DEVICE_ALWAYS_INLINE auto ryujin::Euler::LimiterView< dim, Number, MemorySpace >::bounds | ( | const Number | hd_i | ) | const |
| DEAL_II_HOST_DEVICE std::tuple< Number, bool > ryujin::Euler::LimiterView< dim, Number, MemorySpace >::limit | ( | const Bounds & | bounds, |
| const state_type & | U, | ||
| const state_type & | P, | ||
| const Number | t_min = Number(0.), |
||
| const Number | t_max = Number(1.) |
||
| ) | const |
Given a state \(\mathbf U\) and an update \(\mathbf P\) this function computes and returns the maximal coefficient \(t\), obeying \(t_{\text{min}} < t < t_{\text{max}}\), such that the selected local minimum principles are obeyed.
The returned boolean is set to true if the original low-order update was within bounds.
DEBUG_EXPENSIVE_BOUNDS_CHECK is set to true, then the boolean is set to true if the low-order and the resulting high-order update are within bounds. The latter might be violated due to round-off errors when computing the limiter bounds. Definition at line 580 of file limiter.h.
References ryujin::compare_and_apply_mask(), ryujin::negative_part(), ryujin::positive_part(), ryujin::pow(), and ryujin::quadratic_newton_step().
|
staticconstexpr |
|
staticconstexpr |