SpECTRE  v2026.04.01
Loading...
Searching...
No Matches
Filters::Hypercube< Dim, TagList > Class Template Reference

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)

Detailed Description

template<size_t Dim, typename TagList>
class Filters::Hypercube< Dim, TagList >

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].

Design decision:

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.

Member Typedef Documentation

◆ options

template<size_t Dim, typename TagList>
using Filters::Hypercube< Dim, TagList >::options
Initial value:
Which blocks and block groups the filter should be applied to.
Definition Hypercube.hpp:91
Apply the boundary correction filter once every N steps. None (std::nullopt) disables the every-N-ste...
Definition Hypercube.hpp:126
Apply the boundary correction filter inside every substep instead of only at step boundaries.
Definition Hypercube.hpp:110
Enable the filter.
Definition Hypercube.hpp:85
Half of the exponent in the exponential.
Definition Hypercube.hpp:77
Apply the volume filter once every N steps. None (std::nullopt) disables the every-N-steps trigger.
Definition Hypercube.hpp:118
Apply the volume filter inside every substep instead of only at step boundaries.
Definition Hypercube.hpp:102

Member Function Documentation

◆ apply_boundary_filter_on_substep()

template<size_t Dim, typename TagList>
bool Filters::Hypercube< Dim, TagList >::apply_boundary_filter_on_substep ( ) const
overridevirtual

Whether the boundary filter should be applied inside every Runge-Kutta substep.

Implements Filters::Filter< Dim, TagList >.

◆ apply_boundary_filter_on_this_step()

template<size_t Dim, typename TagList>
bool Filters::Hypercube< Dim, TagList >::apply_boundary_filter_on_this_step ( size_t step_number) const
overridevirtual

Whether the boundary filter should be applied at the given step_number.

Implements Filters::Filter< Dim, TagList >.

◆ apply_in_volume()

template<size_t Dim, typename TagList>
void Filters::Hypercube< Dim, TagList >::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
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 >.

◆ apply_on_boundary()

template<size_t Dim, typename TagList>
void Filters::Hypercube< Dim, TagList >::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
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 >.

◆ apply_volume_filter_on_substep()

template<size_t Dim, typename TagList>
bool Filters::Hypercube< Dim, TagList >::apply_volume_filter_on_substep ( ) const
overridevirtual

Whether the volume filter should be applied inside every Runge-Kutta substep.

Implements Filters::Filter< Dim, TagList >.

◆ apply_volume_filter_on_this_step()

template<size_t Dim, typename TagList>
bool Filters::Hypercube< Dim, TagList >::apply_volume_filter_on_this_step ( size_t step_number) const
overridevirtual

Whether the volume filter should be applied at the given step_number.

Implements Filters::Filter< Dim, TagList >.

◆ blocks_to_filter()

template<size_t Dim, typename TagList>
const std::optional< std::vector< size_t > > & Filters::Hypercube< Dim, TagList >::blocks_to_filter ( ) const
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 >.

◆ get_clone()

template<size_t Dim, typename TagList>
std::unique_ptr< Filter< Dim, TagList > > Filters::Hypercube< Dim, TagList >::get_clone ( ) const
overridevirtual

Return a heap-allocated deep copy of this filter.

Implements Filters::Filter< Dim, TagList >.

◆ is_equal()

template<size_t Dim, typename TagList>
bool Filters::Hypercube< Dim, TagList >::is_equal ( const Filter< Dim, TagList > & other) const
overridevirtual

Returns true if other is the same concrete filter type and is equivalent to *this.

Implements Filters::Filter< Dim, TagList >.

◆ need_jacobians()

template<size_t Dim, typename TagList>
bool Filters::Hypercube< Dim, TagList >::need_jacobians ( ) const
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 >.

◆ set_blocks_to_filter()

template<size_t Dim, typename TagList>
void Filters::Hypercube< Dim, TagList >::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 )
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 >.

◆ supports_mesh()

template<size_t Dim, typename TagList>
bool Filters::Hypercube< Dim, TagList >::supports_mesh ( const Mesh< Dim > & mesh) const
overridevirtual

Returns true if this filter can filter the mesh.

Implements Filters::Filter< Dim, TagList >.

Member Data Documentation

◆ help

template<size_t Dim, typename TagList>
Options::String Filters::Hypercube< Dim, TagList >::help
staticconstexpr
Initial value:
= {
"An exponential filter applied in each direction of a line, square, or "
"cube (hypercube)."}

The documentation for this class was generated from the following file:
  • src/NumericalAlgorithms/LinearOperators/Filters/Hypercube.hpp