|
| ApparentHorizon (const ApparentHorizon &)=delete |
|
ApparentHorizon & | operator= (const ApparentHorizon &)=delete |
|
| ApparentHorizon (ApparentHorizon &&)=default |
|
ApparentHorizon & | operator= (ApparentHorizon &&)=default |
|
std::unique_ptr< domain::BoundaryConditions::BoundaryCondition > | get_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::BoundaryConditionType > | boundary_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 |
|
| BoundaryCondition (const BoundaryCondition &)=default |
|
| BoundaryCondition (BoundaryCondition &&)=default |
|
BoundaryCondition & | operator= (const BoundaryCondition &)=default |
|
BoundaryCondition & | operator= (BoundaryCondition &&)=default |
|
virtual std::vector< elliptic::BoundaryConditionType > | boundary_condition_types () const=0 |
|
Public Member Functions inherited from domain::BoundaryConditions::BoundaryCondition |
| BoundaryCondition (BoundaryCondition &&)=default |
|
BoundaryCondition & | operator= (BoundaryCondition &&)=default |
|
| BoundaryCondition (const BoundaryCondition &)=default |
|
BoundaryCondition & | operator= (const BoundaryCondition &)=default |
|
| BoundaryCondition (CkMigrateMessage *const msg) |
|
| WRAPPED_PUPable_abstract (BoundaryCondition) |
|
virtual auto | get_clone () const -> std::unique_ptr< BoundaryCondition >=0 |
|
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 [162], section 12.3.2 of [14] or section II.B.1 of [197]. 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 [162] and [197]) and \(\bar{D}\) is the covariant derivative w.r.t. to the conformal metric \(\bar{\gamma}_{ij}\). Note that e.g. in [197] 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 [151]). \(\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 [197] 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.