SpECTRE  v2024.04.12
Limiters::Minmod< VolumeDim, TagsToLimit > Class Template Reference

A minmod-based generalized slope limiter. More...

Detailed Description

template<size_t VolumeDim, typename TagsToLimit>
class Limiters::Minmod< VolumeDim, TagsToLimit >

A minmod-based generalized slope limiter.

Implements the three minmod-based generalized slope limiters from [40] Sec. 2.4: \(\Lambda\Pi^1\), \(\Lambda\Pi^N\), and MUSCL. The implementation is system-agnostic and can act on an arbitrary set of tensors.

Summary of the generalized slope limiter algorithms:

The MUSCL and \(\Lambda\Pi^1\) limiters are both intended for use on piecewise-linear solutions, i.e., on linear-order elements with two points per dimension. These limiters operate by reducing the spatial slope of the tensor components if the data look like they may contain oscillations. Between these two, MUSCL is more dissipative — it more aggressively reduces the slopes of the data, so it may better handle strong shocks, but it correspondingly produces the most broadening of features in the solution.

Note that we do not require the MUSCL and \(\Lambda\Pi^1\) limiters to be used on linear-order elements. However, when they are used on a higher-resolution grid, the limiters act to linearize the solution (by discarding higher-order mode content) whether or not the slopes must be reduced.

The \(\Lambda\Pi^N\) limiter is intended for use with higher-order elements (with more than two points per dimension), where the solution is a piecewise polynomial of higher-than-linear order. This limiter generalizes \(\Lambda\Pi^1\): the post-limiter solution is the linearized solution of \(\Lambda\Pi^1\) in the case that the slopes must be reduced, but is the original (higher-order) data in the case that the slopes are acceptable.

For all three types of minmod limiter, the algorithm can be relaxed from TVD (total variation diminishing) in the means to TVB (total variation bound) in the means. This may avoid limiting away smooth extrema in the solution that would otherwise look like spurious oscillations. When this correction is enabled, the limiter will not reduce the slope (but may still linearize) on elements where the slope is less than \(m h^2\), where \(m\) is the TVB constant and \(h\) is the size of the DG element. Note the "in the means" qualifier: the limiter controls the oscillation between the mean solution values across neighboring cells, but may not control oscillations within the cells.

The choice of the TVB constant \(m\) is difficult. Larger values result in fewer limiter activations, especially near smooth extrema in the solution — this can help to avoid incorrectly limiting away these smooth extrema, but can also result in insufficient limiting of truly spurious oscillations. The reference uses a value of 50 when presenting the limiter with simple shock tests, but in general the value \(m\) that optimizes between robustness and minimal loss of accuracy is problem dependent.

Notes on the SpECTRE implementation of the generalized slope limiters:

This implementation can act on an arbitrary set of tensors; the limiting algorithm is applied to each component of each tensor independently. This is a convenient and general interface. However, when the evolution system has multiple evolved variables, the recommendation of the reference is to apply the limiter to the system's characteristic variables to reduce spurious post-limiting oscillations. In SpECTRE, applying the limiter to the characteristic variables requires specializing the limiter to each evolution system.

The limiter acts in the Frame::ElementLogical coordinates, because in these coordinates it is straightforward to formulate the algorithm. This means the limiter can operate on generic deformed grids — however, some things can start to break down, especially on strongly deformed grids:

  1. When the Jacobian (from Frame::ElementLogical to Frame::Inertial) varies across the element, then the limiter fails to be conservative. This is because the integral of a tensor u over the element will change after the limiter activates on u.
  2. When there is a sudden change in the size of the elements (perhaps at an h-refinement boundary, or at the boundary between two blocks with very different mappings), a smooth solution in Frame::Inertial can appear to have a kink in Frame::ElementLogical. The Minmod implementation includes some (tested but unproven) corrections based on the size of the elements that try to reduce spurious limiter activations near these fake kinks.

When an element has multiple neighbors in any direction, an effective mean and neighbor size in this direction are computed by averaging over the multiple neighbors. This simple generalization of the minmod limiter enables it to operate on h-refined grids.

Template Parameters
VolumeDimThe number of spatial dimensions.
TagsToLimitA typelist of tags specifying the tensors to limit.

The documentation for this class was generated from the following file: