SpECTRE  v2024.05.11
Xcts::BoundaryConditions::Robin< EnabledEquations > Class Template Reference

Impose Robin boundary conditions at the outer boundary. More...

#include <Robin.hpp>

Public Types

using options = tmpl::list<>
 
using argument_tags = tmpl::list< domain::Tags::Coordinates< 3, Frame::Inertial >, domain::Tags::FaceNormal< 3, Frame::Inertial > >
 
using volume_tags = tmpl::list<>
 
using argument_tags_linearized = tmpl::list< domain::Tags::Coordinates< 3, Frame::Inertial >, domain::Tags::FaceNormal< 3, Frame::Inertial > >
 
using volume_tags_linearized = tmpl::list<>
 

Public Member Functions

 Robin (const Robin &)=default
 
Robinoperator= (const Robin &)=default
 
 Robin (Robin &&)=default
 
Robinoperator= (Robin &&)=default
 
std::unique_ptr< domain::BoundaryConditions::BoundaryConditionget_clone () const override
 
std::vector< elliptic::BoundaryConditionTypeboundary_condition_types () const override
 
void apply (gsl::not_null< Scalar< DataVector > * > conformal_factor_minus_one, gsl::not_null< Scalar< DataVector > * > n_dot_conformal_factor_gradient, const tnsr::i< DataVector, 3 > &deriv_conformal_factor, const tnsr::I< DataVector, 3 > &x, const tnsr::i< DataVector, 3 > &face_normal) const
 
void apply (gsl::not_null< Scalar< DataVector > * > conformal_factor_minus_one, gsl::not_null< Scalar< DataVector > * > lapse_times_conformal_factor_minus_one, gsl::not_null< Scalar< DataVector > * > n_dot_conformal_factor_gradient, gsl::not_null< Scalar< DataVector > * > n_dot_lapse_times_conformal_factor_gradient, const tnsr::i< DataVector, 3 > &deriv_conformal_factor, const tnsr::i< DataVector, 3 > &deriv_lapse_times_conformal_factor, const tnsr::I< DataVector, 3 > &x, const tnsr::i< DataVector, 3 > &face_normal) const
 
void apply (gsl::not_null< Scalar< DataVector > * > conformal_factor_minus_one, gsl::not_null< Scalar< DataVector > * > lapse_times_conformal_factor_minus_one, gsl::not_null< tnsr::I< DataVector, 3 > * > shift_excess, gsl::not_null< Scalar< DataVector > * > n_dot_conformal_factor_gradient, gsl::not_null< Scalar< DataVector > * > n_dot_lapse_times_conformal_factor_gradient, gsl::not_null< tnsr::I< DataVector, 3 > * > n_dot_longitudinal_shift_excess, const tnsr::i< DataVector, 3 > &deriv_conformal_factor, const tnsr::i< DataVector, 3 > &deriv_lapse_times_conformal_factor, const tnsr::iJ< DataVector, 3 > &deriv_shift_excess, const tnsr::I< DataVector, 3 > &x, const tnsr::i< DataVector, 3 > &face_normal) const
 
void apply_linearized (gsl::not_null< Scalar< DataVector > * > conformal_factor_correction, gsl::not_null< Scalar< DataVector > * > n_dot_conformal_factor_gradient_correction, const tnsr::i< DataVector, 3 > &deriv_conformal_factor_correction, const tnsr::I< DataVector, 3 > &x, const tnsr::i< DataVector, 3 > &face_normal) const
 
void apply_linearized (gsl::not_null< Scalar< DataVector > * > conformal_factor_correction, gsl::not_null< Scalar< DataVector > * > lapse_times_conformal_factor_correction, gsl::not_null< Scalar< DataVector > * > n_dot_conformal_factor_gradient_correction, gsl::not_null< Scalar< DataVector > * > n_dot_lapse_times_conformal_factor_gradient_correction, const tnsr::i< DataVector, 3 > &deriv_conformal_factor_correction, const tnsr::i< DataVector, 3 > &deriv_lapse_times_conformal_factor_correction, const tnsr::I< DataVector, 3 > &x, const tnsr::i< DataVector, 3 > &face_normal) const
 
void apply_linearized (gsl::not_null< Scalar< DataVector > * > conformal_factor_correction, gsl::not_null< Scalar< DataVector > * > lapse_times_conformal_factor_correction, gsl::not_null< tnsr::I< DataVector, 3 > * > shift_excess_correction, gsl::not_null< Scalar< DataVector > * > n_dot_conformal_factor_gradient_correction, gsl::not_null< Scalar< DataVector > * > n_dot_lapse_times_conformal_factor_gradient_correction, gsl::not_null< tnsr::I< DataVector, 3 > * > n_dot_longitudinal_shift_excess_correction, const tnsr::i< DataVector, 3 > &deriv_conformal_factor_correction, const tnsr::i< DataVector, 3 > &deriv_lapse_times_conformal_factor_correction, const tnsr::iJ< DataVector, 3 > &deriv_shift_excess_correction, const tnsr::I< DataVector, 3 > &x, const tnsr::i< DataVector, 3 > &face_normal) const
 
- Public Member Functions inherited from elliptic::BoundaryConditions::BoundaryCondition< 3 >
 BoundaryCondition (const BoundaryCondition &)=default
 
 BoundaryCondition (BoundaryCondition &&)=default
 
BoundaryConditionoperator= (const BoundaryCondition &)=default
 
BoundaryConditionoperator= (BoundaryCondition &&)=default
 
virtual std::vector< elliptic::BoundaryConditionTypeboundary_condition_types () const=0
 
- Public Member Functions inherited from domain::BoundaryConditions::BoundaryCondition
 BoundaryCondition (BoundaryCondition &&)=default
 
BoundaryConditionoperator= (BoundaryCondition &&)=default
 
 BoundaryCondition (const BoundaryCondition &)=default
 
BoundaryConditionoperator= (const BoundaryCondition &)=default
 
 BoundaryCondition (CkMigrateMessage *const msg)
 
 WRAPPED_PUPable_abstract (BoundaryCondition)
 
virtual auto get_clone () const -> std::unique_ptr< BoundaryCondition >=0
 

Static Public Attributes

static constexpr Options::String help
 
- Static Public Attributes inherited from elliptic::BoundaryConditions::BoundaryCondition< 3 >
static constexpr size_t volume_dim
 

Detailed Description

template<Xcts::Equations EnabledEquations>
class Xcts::BoundaryConditions::Robin< EnabledEquations >

Impose Robin boundary conditions at the outer boundary.

Impose \(\partial_r(r\psi)=0\), \(\partial_r(\alpha\psi)=0\), and \(\partial_r(r\beta_\mathrm{excess}^j)=0\) on the boundary. These Robin boundary conditions incur an error of order \(1/R^2\), where \(R\) is the outer radius of the domain. This allows to place the outer boundary much closer to the center than for Dirichlet boundary conditions (Xcts::BoundaryConditions::Flatness), which incur an error of order \(1/R\).

The Robin boundary conditions are imposed as Neumann-type as follows:

\begin{align*} (n^i \partial_i \psi)_N &= -\frac{\psi}{r}, \\ (n^i \partial_i (\alpha\psi))_N &= -\frac{\alpha\psi}{r}, \\ (n^i (L\beta)^{ij})_N = n^i (L\beta)^{ij} - \left[ \frac{\beta_\mathrm{excess}^j}{r} + \frac{1}{3} n^j \frac{n^i \beta_\mathrm{excess}^i}{r} + n^i \partial_i \beta_\mathrm{excess}^j + \frac{1}{3} n^j n^i n_k \partial_i \beta_\mathrm{excess}^k \right] \end{align*}

Here, the condition on the longitudinal shift is derived by imposing the Robin boundary condition \(n^i\partial_i\beta_\mathrm{excess}^j=-\beta_\mathrm{excess}^j/r\) only on the normal component of the shift gradient. To do this we can use the projection operator \(P_{ij}=\delta_{ij}-n_i n_j\) to set the shift gradient to \(\partial_i\beta_\mathrm{excess}^j=P_{ik}\partial_k\beta_\mathrm{excess}^j -n_i \beta_\mathrm{excess}^j/r\) and then apply the longitudinal operator.

Template Parameters
EnabledEquationsThe subset of XCTS equations that are being solved

Member Function Documentation

◆ boundary_condition_types()

template<Xcts::Equations EnabledEquations>
std::vector< elliptic::BoundaryConditionType > Xcts::BoundaryConditions::Robin< EnabledEquations >::boundary_condition_types ( ) const
overridevirtual

◆ get_clone()

template<Xcts::Equations EnabledEquations>
std::unique_ptr< domain::BoundaryConditions::BoundaryCondition > Xcts::BoundaryConditions::Robin< EnabledEquations >::get_clone ( ) const
overridevirtual

Member Data Documentation

◆ help

template<Xcts::Equations EnabledEquations>
constexpr Options::String Xcts::BoundaryConditions::Robin< EnabledEquations >::help
staticconstexpr
Initial value:
=
"Impose Robin boundary conditions at the outer boundary. "
"They incur an error of order 1/R^2, where R is the outer radius."

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