SpECTRE  v2026.04.01
Loading...
Searching...
No Matches
gh::BoundaryCorrections::UpwindPenalty< Dim > Class Template Referencefinal

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

#include <UpwindPenalty.hpp>

Public Types

using options = tmpl::list<>
using dg_package_field_tags
using dg_package_data_temporary_tags
using dg_package_data_primitive_tags = tmpl::list<>
using dg_package_data_volume_tags = tmpl::list<>
using dg_boundary_terms_volume_tags = tmpl::list<>

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 > 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 evolution::BoundaryCorrection
 BoundaryCorrection (const BoundaryCorrection &)=default
BoundaryCorrectionoperator= (const BoundaryCorrection &)=default
 BoundaryCorrection (BoundaryCorrection &&)=default
BoundaryCorrectionoperator= (BoundaryCorrection &&)=default
 BoundaryCorrection (CkMigrateMessage *msg)

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_\beta\). The general form is given by:

\begin{align*} D_\beta = T_{\beta\hat{\beta}}^{\mathrm{ext}} \Lambda^{\mathrm{ext},-}_{\hat{\beta}\hat{\alpha}} v^{\mathrm{ext}}_{\hat{\alpha}} -T_{\beta\hat{\beta}}^{\mathrm{int}} \Lambda^{\mathrm{int},-}_{\hat{\beta}\hat{\alpha}} v^{\mathrm{int}}_{\hat{\alpha}}. \end{align*}

We denote the evolved fields by \(u_{\alpha}\), the characteristic fields by \(v_{\hat{\alpha}}\), and implicitly sum over reapeated indices. \(T_{\beta\hat{\beta}}\) transforms characteristic fields to evolved fields, while \(\Lambda_{\hat{\beta}\hat{\alpha}}^-\) 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 [200] 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:

\begin{align*} D_{g_{ab}} &= \lambda_{v^{g}}^{\mathrm{ext},-} v^{\mathrm{ext},g}_{ab} - \lambda_{v^{g}}^{\mathrm{int},-} v^{\mathrm{int},g}_{ab}, \\ D_{\Pi_{ab}} &= \frac{1}{2}\left(\lambda_{v^+}^{\mathrm{ext},-} v^{\mathrm{ext},+}_{ab} + \lambda_{v^-}^{\mathrm{ext},-} v^{\mathrm{ext},-}_{ab}\right) + \lambda_{v^g}^{\mathrm{ext},-}\gamma_2 v^{\mathrm{ext},g}_{ab} \notag \\ &-\frac{1}{2}\left(\lambda_{v^+}^{\mathrm{int},-} v^{\mathrm{int},+}_{ab} + \lambda_{v^-}^{\mathrm{int},-} v^{\mathrm{int},-}_{ab}\right) - \lambda_{v^g}^{\mathrm{int},-}\gamma_2 v^{\mathrm{int},g}_{ab} , \\ D_{\Phi_{iab}} &= \frac{1}{2}\left(\lambda_{v^+}^{\mathrm{ext},-} v^{\mathrm{ext},+}_{ab} - \lambda_{v^-}^{\mathrm{ext},-} v^{\mathrm{ext},-}_{ab}\right)n_i^{\mathrm{ext}} + \lambda_{v^0}^{\mathrm{ext},-} v^{\mathrm{ext},0}_{iab} \notag \\ &- \frac{1}{2}\left(\lambda_{v^+}^{\mathrm{int},-} v^{\mathrm{int},+}_{ab} - \lambda_{v^-}^{\mathrm{int},-} v^{\mathrm{int},-}_{ab}\right)n_i^{\mathrm{int}} - \lambda_{v^0}^{\mathrm{int},-} v^{\mathrm{int},0}_{iab}, \end{align*}

with characteristic fields

\begin{align*} v^{g}_{ab} &= g_{ab}, \\ v^{0}_{iab} &= (\delta^k_i-n^k n_i)\Phi_{kab}, \\ v^{\pm}_{ab} &= \Pi_{ab}\pm n^i\Phi_{iab} -\gamma_2 g_{ab}, \end{align*}

and characteristic speeds

\begin{align*} \lambda_{v^g} =& -(1+\gamma_1) (\beta^i n_i + v^i_g n_i), \\ \lambda_{v^0} =& -\beta^i n_i -v^i_g n_i, \\ \lambda_{v^\pm} =& \pm \alpha - \beta^i n_i - v^i_g n_i, \end{align*}

where \(v_g^i\) is the mesh velocity and \(n_i\) is the outward directed unit normal covector to the interface. We have also defined

\begin{align} \lambda^{\pm}_{\hat{\alpha}} = \left\{ \begin{array}{ll} \lambda_{\hat{\alpha}} & \mathrm{if}\;\pm\lambda_{\hat{\alpha}}> 0 \\ 0 & \mathrm{otherwise} \end{array}\right. \end{align}

In the implementation we store the speeds in a rank-4 tensor with the zeroth component being \(\lambda_{v^\Psi}\), the first being \(\lambda_{v^0}\), the second being \(\lambda_{v^+}\), and the third being \(\lambda_{v^-}\).

Note that we have assumed \(n_i^{\mathrm{ext}}\) points in the same direction as \(n_i^{\mathrm{int}}\), but in the code they point in opposite directions. If \(n_i^{\mathrm{ext}}\) points in the opposite direction the external speeds have their sign flipped and the \(\pm\) fields and their speeds reverse roles (i.e. the \(v^{\mathrm{ext},+}\) field is now flowing into the element, while \(v^{\mathrm{ext},-}\) flows out). In our implementation this reversal actually cancels out, and we have the following equations:

\begin{align*} D_{g_{ab}} &= -\lambda_{v^{g}}^{\mathrm{ext},+} v^{\mathrm{ext},g}_{ab} - \lambda_{v^{g}}^{\mathrm{int},-} v^{\mathrm{int},g}_{ab}, \\ D_{\Pi_{ab}} &= \frac{1}{2}\left(-\lambda_{v^+}^{\mathrm{ext},+} v^{\mathrm{ext},+}_{ab} - \lambda_{v^-}^{\mathrm{ext},+} v^{\mathrm{ext},-}_{ab}\right) - \lambda_{v^g}^{\mathrm{ext},+}\gamma_2 v^{\mathrm{ext},g}_{ab} \notag \\ &-\frac{1}{2}\left(\lambda_{v^+}^{\mathrm{int},-} v^{\mathrm{int},+}_{ab} + \lambda_{v^-}^{\mathrm{int},-} v^{\mathrm{int},-}_{ab}\right) - \lambda_{v^g}^{\mathrm{int},-}\gamma_2 v^{\mathrm{int},g}_{ab} , \\ D_{\Phi_{iab}} &= \frac{1}{2}\left(-\lambda_{v^+}^{\mathrm{ext},+} v^{\mathrm{ext},+}_{ab} + \lambda_{v^-}^{\mathrm{ext},+} v^{\mathrm{ext},-}_{ab}\right)n_i^{\mathrm{ext}} - \lambda_{v^0}^{\mathrm{ext},+} v^{\mathrm{ext},0}_{iab} \\ &- \frac{1}{2}\left(\lambda_{v^+}^{\mathrm{int},-} v^{\mathrm{int},+}_{ab} - \lambda_{v^-}^{\mathrm{int},-} v^{\mathrm{int},-}_{ab}\right)n_i^{\mathrm{int}} - \lambda_{v^0}^{\mathrm{int},-} v^{\mathrm{int},0}_{iab}, \end{align*}

Member Typedef Documentation

◆ dg_package_data_temporary_tags

template<size_t Dim>
using gh::BoundaryCorrections::UpwindPenalty< Dim >::dg_package_data_temporary_tags
Initial value:
Constraint dammping parameter for the generalized harmonic system (cf. lindblom2005qh).
Definition ConstraintDampingTags.hpp:62
Constraint dammping parameter for the generalized harmonic system (cf. lindblom2005qh).
Definition ConstraintDampingTags.hpp:70
Definition Tags.hpp:65
Definition Tags.hpp:61

◆ dg_package_field_tags

template<size_t Dim>
using gh::BoundaryCorrections::UpwindPenalty< Dim >::dg_package_field_tags
Initial value:
tmpl::list<Tags::VSpacetimeMetric<DataVector, Dim>,
Tags::VMinus<DataVector, Dim>, NormalTimesVPlus,
NormalTimesVMinus, Gamma2VSpacetimeMetric, CharSpeedsTensor>
Definition Tags.hpp:118
Definition Tags.hpp:114
Definition Tags.hpp:110

Member Function Documentation

◆ get_clone()

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

Member Data Documentation

◆ help

template<size_t Dim>
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:
  • src/Evolution/Systems/GeneralizedHarmonic/BoundaryCorrections/UpwindPenalty.hpp