|
SpECTRE
v2026.04.01
|
An exponential spectral filter applied in each logical direction of a tensor-product (line, square, cube, ...) element. More...
#include <Hypercube.hpp>
Classes | |
| struct | BlocksToFilter |
| Which blocks and block groups the filter should be applied to. More... | |
| struct | BoundaryCorrectionFilterEveryNSteps |
| Apply the boundary correction filter once every N steps. None (std::nullopt) disables the every-N-steps trigger. More... | |
| struct | BoundaryCorrectionFilterOnSubstep |
| Apply the boundary correction filter inside every substep instead of only at step boundaries. More... | |
| struct | Enable |
| Enable the filter. More... | |
| struct | HalfPower |
| Half of the exponent in the exponential. More... | |
| struct | VolumeFilterEveryNSteps |
| Apply the volume filter once every N steps. None (std::nullopt) disables the every-N-steps trigger. More... | |
| struct | VolumeFilterOnSubstep |
| Apply the volume filter inside every substep instead of only at step boundaries. More... | |
Public Types | |
| using | options |
Public Member Functions | |
| Hypercube (unsigned half_power, bool enable, const std::optional< std::vector< std::string > > &blocks_to_filter, bool volume_filter_on_substep, bool boundary_filter_on_substep, std::optional< size_t > volume_filter_every_n_steps, std::optional< size_t > boundary_filter_every_n_steps, const Options::Context &context={}) | |
| WRAPPED_PUPable_decl_base_template (SINGLE_ARG(Filter< Dim, TagList >), Hypercube) | |
| Hypercube (CkMigrateMessage *msg) | |
| void | pup (PUP::er &p) override |
| std::unique_ptr< Filter< Dim, TagList > > | get_clone () const override |
| Return a heap-allocated deep copy of this filter. | |
| bool | apply_volume_filter_on_substep () const override |
| Whether the volume filter should be applied inside every Runge-Kutta substep. | |
| bool | apply_volume_filter_on_this_step (size_t step_number) const override |
| Whether the volume filter should be applied at the given step_number. | |
| bool | apply_boundary_filter_on_substep () const override |
| Whether the boundary filter should be applied inside every Runge-Kutta substep. | |
| bool | apply_boundary_filter_on_this_step (size_t step_number) const override |
| Whether the boundary filter should be applied at the given step_number. | |
| bool | need_jacobians () const override |
| Whether the filter needs the grid-to-inertial Jacobian and its inverse. | |
| bool | supports_mesh (const Mesh< Dim > &mesh) const override |
| Returns true if this filter can filter the mesh. | |
| const std::optional< std::vector< size_t > > & | blocks_to_filter () const override |
| The set of block (or block group) names the filter applies to. | |
| void | set_blocks_to_filter (const std::vector< std::string > &all_block_names, const std::unordered_map< std::string, std::unordered_set< std::string > > &block_groups) override |
| Used after construction to change blocks and groups labeled by strings to size_ts, which is what is used throughout the code. | |
| void | apply_in_volume (gsl::not_null< Variables< TagList > * > vars, const Mesh< Dim > &mesh, const std::optional< InverseJacobian< DataVector, Dim, Frame::Grid, Frame::Inertial > > &inv_jac_grid_to_inertial, const std::optional< Jacobian< DataVector, Dim, Frame::Grid, Frame::Inertial > > &jac_grid_to_inertial) const override |
| Apply the filter in place to the volume vars on the Dim-dimensional mesh. | |
| void | apply_on_boundary (gsl::not_null< Variables< TagList > * > vars, const Mesh< Dim - 1 > &mesh, const std::optional< InverseJacobian< DataVector, Dim, Frame::Grid, Frame::Inertial > > &inv_jac_grid_to_inertial, const std::optional< Jacobian< DataVector, Dim, Frame::Grid, Frame::Inertial > > &jac_grid_to_inertial) const override |
| Apply the filter in place to face vars on the Dim - 1 face mesh. | |
| bool | is_equal (const Filter< Dim, TagList > &other) const override |
| Returns true if other is the same concrete filter type and is equivalent to *this. | |
| Public Member Functions inherited from Filters::Filter< Dim, TagList > | |
| WRAPPED_PUPable_abstract (Filter) | |
| Filter (CkMigrateMessage *m) | |
Static Public Attributes | |
| static constexpr Options::String | help |
Friends | |
| template<size_t LocalDim, typename LocalTagList> | |
| bool | operator== (const Hypercube< LocalDim, LocalTagList > &lhs, const Hypercube< LocalDim, LocalTagList > &rhs) |
An exponential spectral filter applied in each logical direction of a tensor-product (line, square, cube, ...) element.
Concrete implementation of Filters::Filter for tensor-product (hypercube) elements, driven by the DG filtering action. See Filters::Filter for the framing of volume vs. boundary application, the substep / every-N-steps cadence controls, and the blocks_to_filter semantics.
For each component of the tensors in TagList, the filter rescales the 1-D modal coefficients \(c_i\) in each logical direction as
\begin{align*} c_i \to c_i \exp\!\left[-36 \left(\frac{i}{N}\right)^{2m}\right], \end{align*}
where \(N\) is the basis degree (number of grid points per element per dimension minus one) and \(m\) is the HalfPower option. The same coefficient and HalfPower are used in every logical direction. With the fixed coefficient 36 the highest mode is rescaled by approximately machine epsilon, i.e. effectively zeroed. For a discussion of filtering see section 5.3 of [101].
The exponential coefficient is hardcoded to 36 since this is what has worked well in practice for several decades in SpEC. If we ever use quad or double-double types, we may want to try 72, but that is unlikely to be necessary since 36 decreases the highest coefficient by 1e-16. I.e., this is not relative to the largest coefficient.
| using Filters::Hypercube< Dim, TagList >::options |
|
overridevirtual |
Whether the boundary filter should be applied inside every Runge-Kutta substep.
Implements Filters::Filter< Dim, TagList >.
|
overridevirtual |
Whether the boundary filter should be applied at the given step_number.
Implements Filters::Filter< Dim, TagList >.
|
overridevirtual |
Apply the filter in place to the volume vars on the Dim-dimensional mesh.
The grid-to-inertial Jacobian jac_grid_to_inertial and its inverse inv_jac_grid_to_inertial are populated only when need_jacobians() returns true; otherwise both arguments are std::nullopt.
Implements Filters::Filter< Dim, TagList >.
|
overridevirtual |
Apply the filter in place to face vars on the Dim - 1 face mesh.
Used to filter the lifted boundary corrections produced by the DG numerical flux before they enter the volume right-hand side. The grid-to-inertial Jacobian jac_grid_to_inertial and its inverse inv_jac_grid_to_inertial are populated only when need_jacobians() returns true; otherwise both arguments are std::nullopt.
Implements Filters::Filter< Dim, TagList >.
|
overridevirtual |
Whether the volume filter should be applied inside every Runge-Kutta substep.
Implements Filters::Filter< Dim, TagList >.
|
overridevirtual |
Whether the volume filter should be applied at the given step_number.
Implements Filters::Filter< Dim, TagList >.
|
overridevirtual |
The set of block (or block group) names the filter applies to.
std::nullopt means the filter applies to every block in the domain.
Implements Filters::Filter< Dim, TagList >.
|
overridevirtual |
Return a heap-allocated deep copy of this filter.
Implements Filters::Filter< Dim, TagList >.
|
overridevirtual |
Returns true if other is the same concrete filter type and is equivalent to *this.
Implements Filters::Filter< Dim, TagList >.
|
inlineoverridevirtual |
Whether the filter needs the grid-to-inertial Jacobian and its inverse.
When false, the driving action passes std::nullopt for the Jacobian arguments of apply_in_volume and apply_on_boundary and avoids constructing them.
Implements Filters::Filter< Dim, TagList >.
|
overridevirtual |
Used after construction to change blocks and groups labeled by strings to size_ts, which is what is used throughout the code.
Implements Filters::Filter< Dim, TagList >.
|
overridevirtual |
Returns true if this filter can filter the mesh.
Implements Filters::Filter< Dim, TagList >.
|
staticconstexpr |