SpECTRE  v2024.05.11
Xcts::BoundaryConditions::ApparentHorizon< ConformalGeometry > Class Template Reference

Impose the surface is a quasi-equilibrium apparent horizon. More...

#include <ApparentHorizon.hpp>

Classes

struct  Center
 
struct  Lapse
 
struct  NegativeExpansion
 
struct  Rotation
 

Public Types

using options = tmpl::list< Center, Rotation, Lapse, NegativeExpansion >
 
using argument_tags = tmpl::flatten< tmpl::list< domain::Tags::FaceNormal< 3 >, ::Tags::deriv< domain::Tags::UnnormalizedFaceNormal< 3 >, tmpl::size_t< 3 >, Frame::Inertial >, domain::Tags::UnnormalizedFaceNormalMagnitude< 3 >, domain::Tags::Coordinates< 3, Frame::Inertial >, gr::Tags::TraceExtrinsicCurvature< DataVector >, Tags::ShiftBackground< DataVector, 3, Frame::Inertial >, Tags::LongitudinalShiftBackgroundMinusDtConformalMetric< DataVector, 3, Frame::Inertial >, tmpl::conditional_t< ConformalGeometry==Xcts::Geometry::Curved, tmpl::list< Tags::InverseConformalMetric< DataVector, 3, Frame::Inertial >, Tags::ConformalChristoffelSecondKind< DataVector, 3, Frame::Inertial > >, tmpl::list<> > > >
 
using volume_tags = tmpl::list<>
 
using argument_tags_linearized = tmpl::flatten< tmpl::list< ::Tags::Normalized< domain::Tags::UnnormalizedFaceNormal< 3, Frame::Inertial > >, ::Tags::deriv< domain::Tags::UnnormalizedFaceNormal< 3, Frame::Inertial >, tmpl::size_t< 3 >, Frame::Inertial >, ::Tags::Magnitude< domain::Tags::UnnormalizedFaceNormal< 3, Frame::Inertial > >, domain::Tags::Coordinates< 3, Frame::Inertial >, gr::Tags::TraceExtrinsicCurvature< DataVector >, Tags::LongitudinalShiftBackgroundMinusDtConformalMetric< DataVector, 3, Frame::Inertial >, Tags::ConformalFactorMinusOne< DataVector >, Tags::LapseTimesConformalFactorMinusOne< DataVector >, ::Tags::NormalDotFlux< Tags::ShiftExcess< DataVector, 3, Frame::Inertial > >, tmpl::conditional_t< ConformalGeometry==Xcts::Geometry::Curved, tmpl::list< Tags::InverseConformalMetric< DataVector, 3, Frame::Inertial >, Tags::ConformalChristoffelSecondKind< DataVector, 3, Frame::Inertial > >, tmpl::list<> > > >
 
using volume_tags_linearized = tmpl::list<>
 

Public Member Functions

 ApparentHorizon (const ApparentHorizon &)=delete
 
ApparentHorizonoperator= (const ApparentHorizon &)=delete
 
 ApparentHorizon (ApparentHorizon &&)=default
 
ApparentHorizonoperator= (ApparentHorizon &&)=default
 
std::unique_ptr< domain::BoundaryConditions::BoundaryConditionget_clone () const override
 
 ApparentHorizon (std::array< double, 3 > center, std::array< double, 3 > rotation, std::optional< std::unique_ptr< elliptic::analytic_data::AnalyticSolution > > solution_for_lapse, std::optional< std::unique_ptr< elliptic::analytic_data::AnalyticSolution > > solution_for_negative_expansion, const Options::Context &context={})
 
const std::array< double, 3 > & center () const
 
const std::array< double, 3 > & rotation () const
 
const std::optional< std::unique_ptr< elliptic::analytic_data::AnalyticSolution > > & solution_for_lapse () const
 
const std::optional< std::unique_ptr< elliptic::analytic_data::AnalyticSolution > > & solution_for_negative_expansion () const
 
std::vector< elliptic::BoundaryConditionTypeboundary_condition_types () const override
 
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 > &face_normal, const tnsr::ij< DataVector, 3 > &deriv_unnormalized_face_normal, const Scalar< DataVector > &face_normal_magnitude, const tnsr::I< DataVector, 3 > &x, const Scalar< DataVector > &extrinsic_curvature_trace, const tnsr::I< DataVector, 3 > &shift_background, const tnsr::II< DataVector, 3 > &longitudinal_shift_background) 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 > &face_normal, const tnsr::ij< DataVector, 3 > &deriv_unnormalized_face_normal, const Scalar< DataVector > &face_normal_magnitude, const tnsr::I< DataVector, 3 > &x, const Scalar< DataVector > &extrinsic_curvature_trace, const tnsr::I< DataVector, 3 > &shift_background, const tnsr::II< DataVector, 3 > &longitudinal_shift_background, const tnsr::II< DataVector, 3 > &inv_conformal_metric, const tnsr::Ijj< DataVector, 3 > &conformal_christoffel_second_kind) 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 > &face_normal, const tnsr::ij< DataVector, 3 > &deriv_unnormalized_face_normal, const Scalar< DataVector > &face_normal_magnitude, const tnsr::I< DataVector, 3 > &x, const Scalar< DataVector > &extrinsic_curvature_trace, const tnsr::II< DataVector, 3 > &longitudinal_shift_background, const Scalar< DataVector > &conformal_factor_minus_one, const Scalar< DataVector > &lapse_times_conformal_factor_minus_one, const tnsr::I< DataVector, 3 > &n_dot_longitudinal_shift_excess) 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 > &face_normal, const tnsr::ij< DataVector, 3 > &deriv_unnormalized_face_normal, const Scalar< DataVector > &face_normal_magnitude, const tnsr::I< DataVector, 3 > &x, const Scalar< DataVector > &extrinsic_curvature_trace, const tnsr::II< DataVector, 3 > &longitudinal_shift_background, const Scalar< DataVector > &conformal_factor_minus_one, const Scalar< DataVector > &lapse_times_conformal_factor_minus_one, const tnsr::I< DataVector, 3 > &n_dot_longitudinal_shift_excess, const tnsr::II< DataVector, 3 > &inv_conformal_metric, const tnsr::Ijj< DataVector, 3 > &conformal_christoffel_second_kind) const
 
void pup (PUP::er &p) override
 
- 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::Geometry ConformalGeometry>
class Xcts::BoundaryConditions::ApparentHorizon< ConformalGeometry >

Impose the surface is a quasi-equilibrium apparent horizon.

These boundary conditions on the conformal factor \(\psi\), the lapse \(\alpha\) and the shift \(\beta^i\) impose the surface is an apparent horizon, i.e. that the expansion on the surface vanishes: \(\Theta=0\). Specifically, we impose:

\begin{align} \label{eq:ah_psi} \bar{s}^k\bar{D}_k\psi &= -\frac{\psi^3}{8\alpha}\bar{s}_i\bar{s}_j\left( (\bar{L}\beta)^{ij} - \bar{u}^{ij}\right) - \frac{\psi}{4}\bar{m}^{ij}\bar{\nabla}_i\bar{s}_j + \frac{1}{6}K\psi^3 \\ \label{eq:ah_beta} \beta_\mathrm{excess}^i &= \frac{\alpha}{\psi^2}\bar{s}^i + \epsilon_{ijk}\Omega^j x^k - \beta_\mathrm{background}^i \end{align}

following section 7.2 of [152], section 12.3.2 of [13] or section II.B.1 of [185]. In these equations \(\bar{s}_i\) is the conformal surface normal to the apparent horizon, \(\bar{m}^{ij}=\bar{\gamma}^{ij}-\bar{s}^i\bar{s}^j\) is the induced conformal surface metric (denoted \(\tilde{h}^{ij}\) in [152] and [185]) and \(\bar{D}\) is the covariant derivative w.r.t. to the conformal metric \(\bar{\gamma}_{ij}\). Note that e.g. in [185] Eq. (16) appears the surface-normal \(s^i\), not the conformal surface normal \(\bar{s}^i = \psi^2 s^i\). To incur a spin on the apparent horizon we can freely choose the rotational parameters \(\boldsymbol{\Omega}\). Note that for a Kerr solution with dimensionless spin \(\boldsymbol{\chi}\) the rotational parameters at the outer horizon are \(\boldsymbol{\Omega} = -\frac{\boldsymbol{\chi}}{2r_+}\), where \(r_+ / M = 1 + \sqrt{1 - \chi^2}\) (see e.g. Eq. (8) in [141]). \(\epsilon_{ijk}\) is the flat-space Levi-Civita symbol.

Note that the quasi-equilibrium conditions don't restrict the boundary condition for the lapse. The choice for the lapse boundary condition is made by the Lapse input-file options. Currently implemented choices are:

  • A zero von-Neumann boundary condition: \(\bar{s}^k\bar{D}_k(\alpha\psi) = 0\)
  • A Dirichlet boundary condition imposing the lapse of an analytic solution.
Negative-expansion boundary conditions:
This class also supports negative-expansion boundary conditions following section II.B.2 of [185] by taking a Kerr solution as additional parameter and computing its expansion at the excision surface. Choosing an excision surface within the apparent horizon of the Kerr solution will result in a negative expansion that is added to the boundary condition for the conformal factor. Therefore, the excision surface will lie within an apparent horizon. Specifically, we add the quantity \(\frac{\psi^3}{4}\Theta_\mathrm{Kerr}\) to ( \(\ref{eq:ah_psi}\)), where \(\Theta_\mathrm{Kerr}\) is the expansion of the specified Kerr solution at the excision surface, and we add the quantity \(\epsilon = s_i \beta_\mathrm{Kerr}^i - \alpha_\mathrm{Kerr}\) to the orthogonal part \(s_i\beta_\mathrm{excess}^i\) of ( \(\ref{eq:ah_beta}\)).
Note
When negative-expansion boundary conditions are selected, the Kerr solution gets evaluated at every boundary-condition application. This may turn out to incur a significant computational cost, in which case a future optimization might be to pre-compute the negative-expansion quantities at initialization time and store them in the DataBox.

Member Function Documentation

◆ boundary_condition_types()

template<Xcts::Geometry ConformalGeometry>
std::vector< elliptic::BoundaryConditionType > Xcts::BoundaryConditions::ApparentHorizon< ConformalGeometry >::boundary_condition_types ( ) const
inlineoverridevirtual

◆ get_clone()

template<Xcts::Geometry ConformalGeometry>
std::unique_ptr< domain::BoundaryConditions::BoundaryCondition > Xcts::BoundaryConditions::ApparentHorizon< ConformalGeometry >::get_clone ( ) const
inlineoverridevirtual

Member Data Documentation

◆ help

template<Xcts::Geometry ConformalGeometry>
constexpr Options::String Xcts::BoundaryConditions::ApparentHorizon< ConformalGeometry >::help
staticconstexpr
Initial value:
=
"Impose the boundary is a quasi-equilibrium apparent horizon."

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