SpECTRE  v2026.04.01
Loading...
Searching...
No Matches
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
using volume_tags = tmpl::list<>
using argument_tags_linearized
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::InitialGuess > > solution_for_lapse, std::optional< std::unique_ptr< elliptic::analytic_data::InitialGuess > > 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::InitialGuess > > & solution_for_lapse () const
const std::optional< std::unique_ptr< elliptic::analytic_data::InitialGuess > > & 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
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)

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 [172], section 12.3.2 of [14] or section II.B.1 of [208]. 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 [172] and [208]) and \(\bar{D}\) is the covariant derivative w.r.t. to the conformal metric \(\bar{\gamma}_{ij}\). Note that e.g. in [208] 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 [162]). \(\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 [208] 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 Typedef Documentation

◆ argument_tags

template<Xcts::Geometry ConformalGeometry>
using Xcts::BoundaryConditions::ApparentHorizon< ConformalGeometry >::argument_tags
Initial value:
tmpl::flatten<tmpl::list<
tmpl::conditional_t<ConformalGeometry == Xcts::Geometry::Curved,
tmpl::list<>>>>
Stores a collection of function values.
Definition DataVector.hpp:48
gr::Tags::Conformal< gr::Tags::InverseSpatialMetric< DataType, Dim, Frame >, 4 > InverseConformalMetric
The conformally scaled inverse spatial metric , where is the Xcts::Tags::ConformalFactor and is the...
Definition Tags.hpp:53
@ Curved
The conformal geometry is either curved or employs curved coordinates, so non-vanishing Christoffel s...
Definition Geometry.hpp:16
::Tags::Magnitude< Tags::UnnormalizedFaceNormal< Dim, LocalFrame > > UnnormalizedFaceNormalMagnitude
The magnitude of the unnormalized face normal, see unnormalized_face_normal
Definition FaceNormal.hpp:29
::Tags::Normalized< Tags::UnnormalizedFaceNormal< Dim, LocalFrame > > FaceNormal
The normalized face normal.
Definition FaceNormal.hpp:16
Definition IndexType.hpp:46
Prefix indicating spatial derivatives.
Definition Prefixes.hpp:46
The Christoffel symbols of the second kind related to the conformal metric .
Definition Tags.hpp:223
The conformal longitudinal operator applied to the background shift vector minus the time derivative ...
Definition Tags.hpp:169
The constant part of the shift .
Definition Tags.hpp:85
The coordinates in a given frame.
Definition Tags.hpp:85
Definition Tags.hpp:143

◆ argument_tags_linearized

template<Xcts::Geometry ConformalGeometry>
using Xcts::BoundaryConditions::ApparentHorizon< ConformalGeometry >::argument_tags_linearized
Initial value:
tmpl::flatten<tmpl::list<
tmpl::size_t<3>, Frame::Inertial>,
tmpl::conditional_t<ConformalGeometry == Xcts::Geometry::Curved,
tmpl::list<>>>>
The magnitude of a (co)vector.
Definition Magnitude.hpp:84
Prefix indicating a boundary unit normal vector dotted into the flux.
Definition Prefixes.hpp:168
The normalized (co)vector represented by Tag.
Definition Magnitude.hpp:123
The conformal factor minus one . Useful as dynamic variable in formulations of the XCTS equations bec...
Definition Tags.hpp:32
The lapse times the conformal factor minus one .
Definition Tags.hpp:74
The unnormalized face normal one form.
Definition FaceNormal.hpp:129

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>
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:
  • src/Elliptic/Systems/Xcts/BoundaryConditions/ApparentHorizon.hpp