SpECTRE  v2026.06.09.01
Loading...
Searching...
No Matches
Filters::SphericalShell< TagList > Class Template Reference

A modal filter for spherical-shell elements: a top- \(\ell\) Heaviside cutoff in the angular direction plus optional smooth exponential roll-offs in both the angular \(\ell\) direction and the radial direction. More...

#include <SphericalShell.hpp>

Classes

struct  NumModesToKill
 The number of top \(\ell\) modes to set to zero. More...
struct  AngularHalfPower
 Half of the exponent \(\sigma_a\) in the smooth exponential roll-off applied to the angular \(\ell\) modes below the top- \(\ell\) cutoff. More...
struct  RadialHalfPower
 Half of the exponent \(\sigma_r\) in the smooth exponential roll-off applied to the radial modal coefficients. More...
struct  Enable
 Enable (true) or disable (false) the filter. More...
struct  BlocksToFilter
 Which blocks the filter should be applied to. More...
struct  VolumeFilterOnSubstep
 Apply the volume filter inside every Runge-Kutta substep instead of only at whole-step boundaries. More...
struct  BoundaryCorrectionFilterOnSubstep
 Apply the boundary correction filter inside every Runge-Kutta substep instead of only at whole-step boundaries. More...
struct  VolumeFilterEveryNSteps
 Apply the volume filter once every N steps. None (std::nullopt) disables the every-N-steps trigger. More...
struct  BoundaryCorrectionFilterEveryNSteps
 Apply the boundary correction filter once every N steps. None (std::nullopt) disables the every-N-steps trigger. More...

Public Types

using options

Public Member Functions

 SphericalShell (size_t num_modes_to_kill, std::optional< size_t > angular_half_power, std::optional< size_t > radial_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< 3, TagList >), SphericalShell)
 SphericalShell (CkMigrateMessage *msg)
void pup (PUP::er &p) override
std::unique_ptr< Filter< 3, 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< 3 > &mesh) const override
std::string name () const override
 A human-readable name for the concrete filter type, used in diagnostics.
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< 3 > &mesh, const std::optional< InverseJacobian< DataVector, 3, Frame::Grid, Frame::Inertial > > &inv_jac_grid_to_inertial, const std::optional< Jacobian< DataVector, 3, Frame::Grid, Frame::Inertial > > &jac_grid_to_inertial) const override
void apply_on_boundary (gsl::not_null< Variables< TagList > * > vars, const Mesh< 2 > &mesh, const std::optional< InverseJacobian< DataVector, 3, Frame::Grid, Frame::Inertial > > &inv_jac_grid_to_inertial, const std::optional< Jacobian< DataVector, 3, Frame::Grid, Frame::Inertial > > &jac_grid_to_inertial) const override
bool is_equal (const Filter< 3, TagList > &other) const override
Public Member Functions inherited from Filters::Filter< 3, TagList >
 WRAPPED_PUPable_abstract (Filter)
virtual bool supports_mesh (const Mesh< Dim > &mesh) const=0
 Returns true if this filter can filter the mesh.
virtual bool is_equal (const Filter &other) const=0
 Returns true if other is the same concrete filter type and is equivalent to *this.
virtual 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=0
 Apply the filter in place to the volume vars on the Dim-dimensional mesh.
virtual 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=0
 Apply the filter in place to face vars on the Dim - 1 face mesh.

Static Public Attributes

static constexpr Options::String help

Friends

template<typename LocalTagList>
bool operator== (const SphericalShell< LocalTagList > &lhs, const SphericalShell< LocalTagList > &rhs)

Detailed Description

template<typename TagList>
class Filters::SphericalShell< TagList >

A modal filter for spherical-shell elements: a top- \(\ell\) Heaviside cutoff in the angular direction plus optional smooth exponential roll-offs in both the angular \(\ell\) direction and the radial direction.

Concrete implementation of Filters::Filter for spherical-shell 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 Spherepack-normalized angular modal coefficients \(c_{\ell'}\) as

\begin{align*} c_{\ell'} \to c_{\ell'} \exp\!\left[-36 \left(\frac{\ell'} {\ell^+_{\mathrm{cut}}+1}\right)^{2\sigma_a}\right], \end{align*}

where \(\ell^+_{\mathrm{cut}} = \ell_{\mathrm{max}} -\) NumModesToKill is the largest angular mode that is retained and \(\sigma_a\) is the AngularHalfPower option. With the fixed coefficient 36 and \(\sigma_a\) in the typical range 28-32 the angular filter is smooth below \(\ell^+_{\mathrm{cut}}\) and reduces to a sharp Heaviside cutoff as \(\sigma_a \to \infty\). When AngularHalfPower is None, only the Heaviside cutoff is applied. See ylm::TensorYlm for the derivation of the underlying angular filter.

When RadialHalfPower has a value \(\sigma_r\), an additional 1D exponential filter is applied independently along each radial column. The radial nodal coefficients \(c_i\) are rescaled in modal space as

\begin{align*} c_i \to c_i \exp\!\left[-36 \left(\frac{i}{N_r}\right)^{2\sigma_r}\right], \end{align*}

where \(N_r\) is the radial basis degree (radial extent minus one). When RadialHalfPower is None, the radial direction is left untouched.

Design decision:

  • The exponential coefficient is hardcoded to 36, matching the choice in Hypercube. SphericalShell is the Filters::Filter-based implementation that plugs into the filtering action and supports per-block selection together with independent volume- and boundary-filtering cadences. It is intended for spherical-shell blocks, which store Spherepack-normalized spherical-harmonic modes.

Member Typedef Documentation

◆ options

template<typename TagList>
using Filters::SphericalShell< TagList >::options
Initial value:
Which blocks and block groups the filter should be applied to.
Definition Hypercube.hpp:92
Apply the boundary correction filter once every N steps. None (std::nullopt) disables the every-N-ste...
Definition Hypercube.hpp:137
Apply the boundary correction filter inside every substep instead of only at step boundaries.
Definition Hypercube.hpp:111
Enable the filter.
Definition Hypercube.hpp:86
Apply the volume filter once every N steps. None (std::nullopt) disables the every-N-steps trigger.
Definition Hypercube.hpp:124
Apply the volume filter inside every substep instead of only at step boundaries.
Definition Hypercube.hpp:103
Half of the exponent in the smooth exponential roll-off applied to the angular modes below the top-...
Definition SphericalShell.hpp:102
The number of top modes to set to zero.
Definition SphericalShell.hpp:84
Half of the exponent in the smooth exponential roll-off applied to the radial modal coefficients.
Definition SphericalShell.hpp:120

Member Function Documentation

◆ apply_boundary_filter_on_substep()

template<typename TagList>
bool Filters::SphericalShell< TagList >::apply_boundary_filter_on_substep ( ) const
overridevirtual

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

Implements Filters::Filter< 3, TagList >.

◆ apply_boundary_filter_on_this_step()

template<typename TagList>
bool Filters::SphericalShell< 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.

Note
Currently the check for whether to filter on every N steps is done relative to the start of the current Slab. This means that for GTS, independent of the value of N for every N steps, every step has a filter applied since GTS has one step per slab.

Implements Filters::Filter< 3, TagList >.

◆ apply_volume_filter_on_substep()

template<typename TagList>
bool Filters::SphericalShell< TagList >::apply_volume_filter_on_substep ( ) const
overridevirtual

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

Implements Filters::Filter< 3, TagList >.

◆ apply_volume_filter_on_this_step()

template<typename TagList>
bool Filters::SphericalShell< 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.

Note
Currently the check for whether to filter on every N steps is done relative to the start of the current Slab. This means that for GTS, independent of the value of N for every N steps, every step has a filter applied since GTS has one step per slab.

Implements Filters::Filter< 3, TagList >.

◆ blocks_to_filter()

template<typename TagList>
const std::optional< std::vector< size_t > > & Filters::SphericalShell< 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< 3, TagList >.

◆ get_clone()

template<typename TagList>
std::unique_ptr< Filter< 3, TagList > > Filters::SphericalShell< TagList >::get_clone ( ) const
overridevirtual

Return a heap-allocated deep copy of this filter.

Implements Filters::Filter< 3, TagList >.

◆ name()

template<typename TagList>
std::string Filters::SphericalShell< TagList >::name ( ) const
inlineoverridevirtual

A human-readable name for the concrete filter type, used in diagnostics.

Implements Filters::Filter< 3, TagList >.

◆ need_jacobians()

template<typename TagList>
bool Filters::SphericalShell< 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< 3, TagList >.

◆ set_blocks_to_filter()

template<typename TagList>
void Filters::SphericalShell< 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< 3, TagList >.

Member Data Documentation

◆ help

template<typename TagList>
Options::String Filters::SphericalShell< TagList >::help
staticconstexpr
Initial value:
= {
"A spherical-shell filter applying a top-ell Heaviside cutoff in the "
"angular direction with optional smooth exponential roll-offs in both "
"the angular ell direction and the radial direction."}

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