SpECTRE  v2025.03.17
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
gh::BoundaryCorrections::UpwindPenalty< Dim > Class Template Referencefinal

Computes the generalized harmonic upwind multipenalty boundary correction. More...

#include <UpwindPenalty.hpp>

Public Types

using options = implementation defined
 
using dg_package_field_tags = implementation defined
 
using dg_package_data_temporary_tags = implementation defined
 
using dg_package_data_primitive_tags = implementation defined
 
using dg_package_data_volume_tags = implementation defined
 
using dg_boundary_terms_volume_tags = implementation defined
 
- Public Types inherited from gh::BoundaryCorrections::BoundaryCorrection< Dim >
using creatable_classes = implementation defined
 

Public Member Functions

 UpwindPenalty (const UpwindPenalty &)=default
 
UpwindPenaltyoperator= (const UpwindPenalty &)=default
 
 UpwindPenalty (UpwindPenalty &&)=default
 
UpwindPenaltyoperator= (UpwindPenalty &&)=default
 
void pup (PUP::er &p) override
 
std::unique_ptr< BoundaryCorrection< Dim > > get_clone () const override
 
double dg_package_data (gsl::not_null< tnsr::aa< DataVector, Dim, Frame::Inertial > * > packaged_char_speed_v_spacetime_metric, gsl::not_null< tnsr::iaa< DataVector, Dim, Frame::Inertial > * > packaged_char_speed_v_zero, gsl::not_null< tnsr::aa< DataVector, Dim, Frame::Inertial > * > packaged_char_speed_v_plus, gsl::not_null< tnsr::aa< DataVector, Dim, Frame::Inertial > * > packaged_char_speed_v_minus, gsl::not_null< tnsr::iaa< DataVector, Dim, Frame::Inertial > * > packaged_char_speed_n_times_v_plus, gsl::not_null< tnsr::iaa< DataVector, Dim, Frame::Inertial > * > packaged_char_speed_n_times_v_minus, gsl::not_null< tnsr::aa< DataVector, Dim, Frame::Inertial > * > packaged_char_speed_gamma2_v_spacetime_metric, gsl::not_null< tnsr::a< DataVector, 3, Frame::Inertial > * > packaged_char_speeds, const tnsr::aa< DataVector, Dim, Frame::Inertial > &spacetime_metric, const tnsr::aa< DataVector, Dim, Frame::Inertial > &pi, const tnsr::iaa< DataVector, Dim, Frame::Inertial > &phi, const Scalar< DataVector > &constraint_gamma1, const Scalar< DataVector > &constraint_gamma2, const Scalar< DataVector > &lapse, const tnsr::I< DataVector, Dim, Frame::Inertial > &shift, const tnsr::i< DataVector, Dim, Frame::Inertial > &normal_covector, const tnsr::I< DataVector, Dim, Frame::Inertial > &normal_vector, const std::optional< tnsr::I< DataVector, Dim, Frame::Inertial > > &, const std::optional< Scalar< DataVector > > &normal_dot_mesh_velocity) const
 
void dg_boundary_terms (gsl::not_null< tnsr::aa< DataVector, Dim, Frame::Inertial > * > boundary_correction_spacetime_metric, gsl::not_null< tnsr::aa< DataVector, Dim, Frame::Inertial > * > boundary_correction_pi, gsl::not_null< tnsr::iaa< DataVector, Dim, Frame::Inertial > * > boundary_correction_phi, const tnsr::aa< DataVector, Dim, Frame::Inertial > &char_speed_v_spacetime_metric_int, const tnsr::iaa< DataVector, Dim, Frame::Inertial > &char_speed_v_zero_int, const tnsr::aa< DataVector, Dim, Frame::Inertial > &char_speed_v_plus_int, const tnsr::aa< DataVector, Dim, Frame::Inertial > &char_speed_v_minus_int, const tnsr::iaa< DataVector, Dim, Frame::Inertial > &char_speed_normal_times_v_plus_int, const tnsr::iaa< DataVector, Dim, Frame::Inertial > &char_speed_normal_times_v_minus_int, const tnsr::aa< DataVector, Dim, Frame::Inertial > &char_speed_constraint_gamma2_v_spacetime_metric_int, const tnsr::a< DataVector, 3, Frame::Inertial > &char_speeds_int, const tnsr::aa< DataVector, Dim, Frame::Inertial > &char_speed_v_spacetime_metric_ext, const tnsr::iaa< DataVector, Dim, Frame::Inertial > &char_speed_v_zero_ext, const tnsr::aa< DataVector, Dim, Frame::Inertial > &char_speed_v_plus_ext, const tnsr::aa< DataVector, Dim, Frame::Inertial > &char_speed_v_minus_ext, const tnsr::iaa< DataVector, Dim, Frame::Inertial > &char_speed_normal_times_v_plus_ext, const tnsr::iaa< DataVector, Dim, Frame::Inertial > &char_speed_normal_times_v_minus_ext, const tnsr::aa< DataVector, Dim, Frame::Inertial > &char_speed_constraint_gamma2_v_spacetime_metric_ext, const tnsr::a< DataVector, 3, Frame::Inertial > &char_speeds_ext, dg::Formulation) const
 
- Public Member Functions inherited from gh::BoundaryCorrections::BoundaryCorrection< Dim >
 BoundaryCorrection (const BoundaryCorrection &)=default
 
BoundaryCorrectionoperator= (const BoundaryCorrection &)=default
 
 BoundaryCorrection (BoundaryCorrection &&)=default
 
BoundaryCorrectionoperator= (BoundaryCorrection &&)=default
 
virtual std::unique_ptr< BoundaryCorrection< Dim > > get_clone () const =0
 

Static Public Attributes

static constexpr Options::String help
 

Detailed Description

template<size_t Dim>
class gh::BoundaryCorrections::UpwindPenalty< Dim >

Computes the generalized harmonic upwind multipenalty boundary correction.

This implements the upwind multipenalty boundary correction term Dβ. The general form is given by:

Dβ=Tββ^extΛβ^α^ext,vα^extTββ^intΛβ^α^int,vα^int.

We denote the evolved fields by uα, the characteristic fields by vα^, and implicitly sum over reapeated indices. Tββ^ transforms characteristic fields to evolved fields, while Λβ^α^ is a diagonal matrix with only the negative characteristic speeds, and has zeros on the diagonal for all other entries. The int and ext superscripts denote quantities on the internal and external side of the mortar. Note that Eq. (6.3) of is not exactly what's implemented since that boundary term does not consistently treat both sides of the interface on the same footing.

For the first-order generalized harmonic system the correction is:

Dgab=λvgext,vabext,gλvgint,vabint,g,DΠab=12(λv+ext,vabext,++λvext,vabext,)+λvgext,γ2vabext,g12(λv+int,vabint,++λvint,vabint,)λvgint,γ2vabint,g,DΦiab=12(λv+ext,vabext,+λvext,vabext,)niext+λv0ext,viabext,012(λv+int,vabint,+λvint,vabint,)niintλv0int,viabint,0,

with characteristic fields

vabg=gab,viab0=(δiknkni)Φkab,vab±=Πab±niΦiabγ2gab,

and characteristic speeds

λvg=(1+γ1)βinivgini,λv0=βinivgini,λv±=±αβinivgini,

where vgi is the mesh velocity and ni is the outward directed unit normal covector to the interface. We have also defined

(1)λα^±={λα^if±λα^>00otherwise

In the implementation we store the speeds in a rank-4 tensor with the zeroth component being λvΨ, the first being λv0, the second being λv+, and the third being λv.

Note that we have assumed niext points in the same direction as niint, but in the code they point in opposite directions. If niext points in the opposite direction the external speeds have their sign flipped and the ± fields and their speeds reverse roles (i.e. the vext,+ field is now flowing into the element, while vext, flows out). In our implementation this reversal actually cancels out, and we have the following equations:

Dgab=λvgext,+vabext,gλvgint,vabint,g,DΠab=12(λv+ext,+vabext,+λvext,+vabext,)λvgext,+γ2vabext,g12(λv+int,vabint,++λvint,vabint,)λvgint,γ2vabint,g,DΦiab=12(λv+ext,+vabext,++λvext,+vabext,)niextλv0ext,+viabext,012(λv+int,vabint,+λvint,vabint,)niintλv0int,viabint,0,

Member Function Documentation

◆ get_clone()

template<size_t Dim>
std::unique_ptr< BoundaryCorrection< Dim > > gh::BoundaryCorrections::UpwindPenalty< Dim >::get_clone ( ) const
overridevirtual

Member Data Documentation

◆ help

template<size_t Dim>
constexpr Options::String gh::BoundaryCorrections::UpwindPenalty< Dim >::help
staticconstexpr
Initial value:
= {
"Computes the UpwindPenalty boundary correction term for the generalized "
"harmonic system."}

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