Surfaces

## Namespaces

StrahlkorperGr
Contains functions that depend both on a Strahlkorper and a metric.

StrahlkorperTags
Holds tags and ComputeItems associated with a Strahlkorper.

StrahlkorperGr::Tags
Holds tags and ComputeItems associated with a Strahlkorper that also need a metric.

## Classes

class  FastFlow
Fast flow method for finding apparent horizons. More...

class  Strahlkorper< Frame >
A star-shaped surface expanded in spherical harmonics. More...

struct  OptionTags::Strahlkorper< Frame >
The input file tag for a Strahlkorper. More...

## Functions

template<typename Frame >
tnsr::i< DataVector, 3, Frame > StrahlkorperGr::unit_normal_one_form (const tnsr::i< DataVector, 3, Frame > &normal_one_form, const DataVector &one_over_one_form_magnitude) noexcept
Computes normalized unit normal one-form to a Strahlkorper. More...

template<typename Frame >
tnsr::ii< DataVector, 3, Frame > StrahlkorperGr::grad_unit_normal_one_form (const tnsr::i< DataVector, 3, Frame > &r_hat, const DataVector &radius, const tnsr::i< DataVector, 3, Frame > &unit_normal_one_form, const tnsr::ii< DataVector, 3, Frame > &d2x_radius, const DataVector &one_over_one_form_magnitude, const tnsr::Ijj< DataVector, 3, Frame > &christoffel_2nd_kind) noexcept
Computes 3-covariant gradient $D_i S_j$ of a Strahlkorper's normal. More...

template<typename Frame >
tnsr::II< DataVector, 3, Frame > StrahlkorperGr::inverse_surface_metric (const tnsr::I< DataVector, 3, Frame > &unit_normal_vector, const tnsr::II< DataVector, 3, Frame > &upper_spatial_metric) noexcept
Computes inverse 2-metric $g^{ij}-S^i S^j$ of a Strahlkorper. More...

template<typename Frame >
Scalar< DataVectorStrahlkorperGr::expansion (const tnsr::ii< DataVector, 3, Frame > &grad_normal, const tnsr::II< DataVector, 3, Frame > &inverse_surface_metric, const tnsr::ii< DataVector, 3, Frame > &extrinsic_curvature) noexcept
Expansion of a Strahlkorper. Should be zero on apparent horizons. More...

template<typename Frame >
tnsr::ii< DataVector, 3, Frame > StrahlkorperGr::extrinsic_curvature (const tnsr::ii< DataVector, 3, Frame > &grad_normal, const tnsr::i< DataVector, 3, Frame > &unit_normal_one_form, const tnsr::I< DataVector, 3, Frame > &unit_normal_vector) noexcept
Extrinsic curvature of a 2D Strahlkorper embedded in a 3D space. More...

template<typename Frame >
Scalar< DataVectorStrahlkorperGr::ricci_scalar (const tnsr::ii< DataVector, 3, Frame > &spatial_ricci_tensor, const tnsr::I< DataVector, 3, Frame > &unit_normal_vector, const tnsr::ii< DataVector, 3, Frame > &extrinsic_curvature, const tnsr::II< DataVector, 3, Frame > &upper_spatial_metric) noexcept
Intrinsic Ricci scalar of a 2D Strahlkorper. More...

template<typename Frame >
Scalar< DataVectorStrahlkorperGr::area_element (const tnsr::ii< DataVector, 3, Frame > &spatial_metric, const StrahlkorperTags::aliases::Jacobian< Frame > &jacobian, const tnsr::i< DataVector, 3, Frame > &normal_one_form, const DataVector &radius, const tnsr::i< DataVector, 3, Frame > &r_hat) noexcept
Area element of a 2D Strahlkorper. More...

template<typename Frame >
double StrahlkorperGr::surface_integral_of_scalar (const Scalar< DataVector > &area_element, const Scalar< DataVector > &scalar, const Strahlkorper< Frame > &strahlkorper) noexcept
Surface integral of a scalar on a 2D Strahlkorper More...

template<typename Frame >
Scalar< DataVectorStrahlkorperGr::spin_function (const StrahlkorperTags::aliases::Jacobian< Frame > &tangents, const YlmSpherepack &ylm, const tnsr::I< DataVector, 3, Frame > &unit_normal_vector, const Scalar< DataVector > &area_element, const tnsr::ii< DataVector, 3, Frame > &extrinsic_curvature) noexcept
Spin function of a 2D Strahlkorper. More...

template<typename Frame >
double StrahlkorperGr::dimensionful_spin_magnitude (const Scalar< DataVector > &ricci_scalar, const Scalar< DataVector > &spin_function, const tnsr::ii< DataVector, 3, Frame > &spatial_metric, const StrahlkorperTags::aliases::Jacobian< Frame > &tangents, const YlmSpherepack &ylm, const Scalar< DataVector > &area_element) noexcept
Spin magnitude measured on a 2D Strahlkorper. More...

template<typename Frame >
std::array< double, 3 > StrahlkorperGr::spin_vector (double spin_magnitude, const Scalar< DataVector > &area_element, const Scalar< DataVector > &radius, const tnsr::i< DataVector, 3, Frame > &r_hat, const Scalar< DataVector > &ricci_scalar, const Scalar< DataVector > &spin_function, const YlmSpherepack &ylm) noexcept
Spin vector of a 2D Strahlkorper. More...

double StrahlkorperGr::irreducible_mass (double area) noexcept
Irreducible mass of a 2D Strahlkorper. More...

## Detailed Description

Things related to surfaces.

## ◆ area_element()

template<typename Frame >
 Scalar StrahlkorperGr::area_element ( const tnsr::ii< DataVector, 3, Frame > & spatial_metric, const StrahlkorperTags::aliases::Jacobian< Frame > & jacobian, const tnsr::i< DataVector, 3, Frame > & normal_one_form, const DataVector & radius, const tnsr::i< DataVector, 3, Frame > & r_hat )
noexcept

Area element of a 2D Strahlkorper.

### Details

Implements Eq. (D.13), using Eqs. (D.4) and (D.5), of [2]. Specifically, computes $\sqrt{(\Theta^i\Theta_i)(\Phi^j\Phi_j)-(\Theta^i\Phi_i)^2}$, $\Theta^i=\left(n^i(n_j-s_j) r J^j_\theta + r J^i_\theta\right)$, $\Phi^i=\left(n^i(n_j-s_j)r J^j_\phi + r J^i_\phi\right)$, and $\Theta^i$ and $\Phi^i$ are lowered by the 3D spatial metric $g_{ij}$. Here $J^i_\alpha$, $s_j$, $r$, and $n^i=n_i$ correspond to the input arguments jacobian, normal_one_form, radius, and r_hat, respectively; these input arguments depend only on the Strahlkorper, not on the metric, and can be computed from a Strahlkorper using ComputeItems in StrahlkorperTags. Note that this does not include the factor of $\sin\theta$, i.e., this returns $r^2$ for flat space. This choice makes the area element returned here compatible with definite_integral defined in YlmSpherePack.hpp.

## ◆ dimensionful_spin_magnitude()

template<typename Frame >
 double StrahlkorperGr::dimensionful_spin_magnitude ( const Scalar< DataVector > & ricci_scalar, const Scalar< DataVector > & spin_function, const tnsr::ii< DataVector, 3, Frame > & spatial_metric, const StrahlkorperTags::aliases::Jacobian< Frame > & tangents, const YlmSpherepack & ylm, const Scalar< DataVector > & area_element )
noexcept

Spin magnitude measured on a 2D Strahlkorper.

### Details

Measures the quasilocal spin magnitude of a Strahlkorper, by inserting $\alpha=1$ into Eq. (10) of [23] and dividing by $8\pi$ to yield the spin magnitude. The spin magnitude is a Euclidean norm of surface integrals over the horizon $S = \frac{1}{8\pi}\oint z \Omega dA$, where $\Omega$ is obtained via StrahlkorperGr::spin_function(), $dA$ is the area element, and $z$ (the "spin potential") is a solution of a generalized eigenproblem given by Eq. (9) of [23]. Specifically, $\nabla^4 z + \nabla \cdot (R\nabla z) = \lambda \nabla^2 z$, where $R$ is obtained via StrahlkorperGr::ricci_scalar(). The spin magnitude is the Euclidean norm of the three values of $S$ obtained from the eigenvectors $z$ with the 3 smallest-magnitude eigenvalues $\lambda$. Note that this formulation of the eigenproblem uses the "Owen" normalization, Eq. (A9) and surrounding discussion in [20]. The eigenvectors are normalized with the "Kerr normalization", Eq. (A22) of [20]. The argument spatial_metric is the metric of the 3D spatial slice evaluated on the Strahlkorper. The argument tangents can be obtained from the StrahlkorperDataBox using the StrahlkorperTags::Tangents tag, and the argument unit_normal_vector can be found by raising the index of the one-form returned by StrahlkorperGr::unit_normal_one_form. The argument ylm is the YlmSpherepack of the Strahlkorper. The argument area_element can be computed via StrahlkorperGr::area_element.

## ◆ expansion()

template<typename Frame >
 Scalar StrahlkorperGr::expansion ( const tnsr::ii< DataVector, 3, Frame > & grad_normal, const tnsr::II< DataVector, 3, Frame > & inverse_surface_metric, const tnsr::ii< DataVector, 3, Frame > & extrinsic_curvature )
noexcept

Expansion of a Strahlkorper. Should be zero on apparent horizons.

### Details

Implements Eq. (5) in [2]. The input argument grad_normal is the quantity returned by StrahlkorperGr::grad_unit_normal_one_form, and inverse_surface_metric is the quantity returned by StrahlkorperGr::inverse_surface_metric.

## ◆ extrinsic_curvature()

template<typename Frame >
 tnsr::ii StrahlkorperGr::extrinsic_curvature ( const tnsr::ii< DataVector, 3, Frame > & grad_normal, const tnsr::i< DataVector, 3, Frame > & unit_normal_one_form, const tnsr::I< DataVector, 3, Frame > & unit_normal_vector )
noexcept

Extrinsic curvature of a 2D Strahlkorper embedded in a 3D space.

### Details

Implements Eq. (D.43) of Carroll's Spacetime and Geometry text. Specifically, $K_{ij} = P^k_i P^l_j \nabla_{(k} S_{l)}$, where $P^k_i = \delta^k_i - S^k S_i$, grad_normal is the quantity $\nabla_k S_l$ returned by StrahlkorperGr::grad_unit_normal_one_form, and unit_normal_vector is $S^i = g^{ij} S_j$ where $S_j$ is the unit normal one form. Not to be confused with the extrinsic curvature of a 3D spatial slice embedded in 3+1 spacetime. Because StrahlkorperGr::grad_unit_normal_one_form is symmetric, this can be expanded into $K_{ij} = \nabla_{i}S_{j} - 2 S^k S_{(i}\nabla_{j)}S_k + S_i S_j S^k S^l \nabla_{k} n_{l}$.

template<typename Frame >
 tnsr::ii StrahlkorperGr::grad_unit_normal_one_form ( const tnsr::i< DataVector, 3, Frame > & r_hat, const DataVector & radius, const tnsr::i< DataVector, 3, Frame > & unit_normal_one_form, const tnsr::ii< DataVector, 3, Frame > & d2x_radius, const DataVector & one_over_one_form_magnitude, const tnsr::Ijj< DataVector, 3, Frame > & christoffel_2nd_kind )
noexcept

Computes 3-covariant gradient $D_i S_j$ of a Strahlkorper's normal.

### Details

See Eqs. (1–9) of [2]. Here $S_j$ is the (normalized) unit one-form to the surface, and $D_i$ is the spatial covariant derivative. Note that this object is symmetric, even though this is not obvious from the definition. The input arguments r_hat, radius, and d2x_radius depend on the Strahlkorper but not on the metric, and can be computed from a Strahlkorper using ComputeItems in StrahlkorperTags. The input argument one_over_one_form_magnitude is $1/\sqrt{g^{ij}n_i n_j}$, where $n_i$ is StrahlkorperTags::NormalOneForm (i.e. the unnormalized one-form to the Strahlkorper); it can be computed using (one over) the magnitude function. The input argument unit_normal_one_form is $S_j$,the normalized one-form.

## ◆ inverse_surface_metric()

template<typename Frame >
 tnsr::II StrahlkorperGr::inverse_surface_metric ( const tnsr::I< DataVector, 3, Frame > & unit_normal_vector, const tnsr::II< DataVector, 3, Frame > & upper_spatial_metric )
noexcept

Computes inverse 2-metric $g^{ij}-S^i S^j$ of a Strahlkorper.

### Details

See Eqs. (1–9) of [2]. Here $S^i$ is the (normalized) unit vector to the surface, and $g^{ij}$ is the 3-metric. This object is expressed in the usual 3-d Cartesian basis, so it is written as a 3-dimensional tensor. But because it is orthogonal to $S_i$, it has only 3 independent degrees of freedom, and could be expressed as a 2-d tensor with an appropriate choice of basis. The input argument unit_normal_vector is $S^i = g^{ij} S_j$, where $S_j$ is the unit normal one form.

## ◆ irreducible_mass()

 double StrahlkorperGr::irreducible_mass ( double area )
noexcept

Irreducible mass of a 2D Strahlkorper.

### Details

See Eqs. (15.38) [10]. This function computes the irreducible mass from the area of a horizon. Specifically, computes $M_\mathrm{irr}=\sqrt{\frac{A}{16\pi}}$.

## ◆ ricci_scalar()

template<typename Frame >
 Scalar StrahlkorperGr::ricci_scalar ( const tnsr::ii< DataVector, 3, Frame > & spatial_ricci_tensor, const tnsr::I< DataVector, 3, Frame > & unit_normal_vector, const tnsr::ii< DataVector, 3, Frame > & extrinsic_curvature, const tnsr::II< DataVector, 3, Frame > & upper_spatial_metric )
noexcept

Intrinsic Ricci scalar of a 2D Strahlkorper.

### Details

Implements Eq. (D.51) of Sean Carroll's Spacetime and Geometry textbook (except correcting sign errors: both extrinsic curvature terms are off by a minus sign in Carroll's text but correct in Carroll's errata). $\hat{R}=R - 2 R_{ij} S^i S^j + K^2-K^{ij}K_{ij}.$ Here $\hat{R}$ is the intrinsic Ricci scalar curvature of the Strahlkorper, $R$ and $R_{ij}$ are the Ricci scalar and Ricci tensor of the 3D space that contains the Strahlkorper, $K_{ij}$ the output of StrahlkorperGr::extrinsic_curvature, $K$ is the trace of $K_{ij}$, and unit_normal_vector is $S^i = g^{ij} S_j$ where $S_j$ is the unit normal one form.

## ◆ spin_function()

template<typename Frame >
 Scalar StrahlkorperGr::spin_function ( const StrahlkorperTags::aliases::Jacobian< Frame > & tangents, const YlmSpherepack & ylm, const tnsr::I< DataVector, 3, Frame > & unit_normal_vector, const Scalar< DataVector > & area_element, const tnsr::ii< DataVector, 3, Frame > & extrinsic_curvature )
noexcept

Spin function of a 2D Strahlkorper.

### Details

See Eqs. (2) and (10) of [22]. This function computes the "spin function," which is an ingredient for horizon surface integrals that measure quasilocal spin. This function is proportional to the imaginary part of the horizon's complex scalar curvature. For Kerr black holes, the spin function is proportional to the horizon vorticity. It is also useful for visualizing the direction of a black hole's spin. Specifically, this function computes $\Omega = \epsilon^{AB}\nabla_A\omega_B$, where capital indices index the tangent bundle of the surface and where $\omega_\mu=(K_{\rho\nu}-K g_{\rho\nu})h_\mu^\rho s^\nu$ is the curl of the angular momentum density of the surface, $h^\rho_\mu = \delta_\mu^\rho + u_\mu u^\rho - s_\mu s^\rho$ is the projector tangent to the 2-surface, $g_{\rho\nu} = \psi_{\rho\nu} + u_\rho u_\nu$ is the spatial metric of the spatial slice, $u^\rho$ is the unit normal to the spatial slice, and $s^\nu$ is the unit normal vector to the surface. Because the tangent basis vectors $e_A^\mu$ are orthogonal to both $u^\mu$ and $s^\mu$, it is straightforward to show that $\Omega = \epsilon^{AB} \nabla_A K_{B\mu}s^\mu$. This function uses the tangent vectors of the Strahlkorper to compute $K_{B\mu}s^\mu$ and then numerically computes the components of its gradient. The argument area_element can be computed via StrahlkorperGr::area_element. The argument unit_normal_vector can be found by raising the index of the one-form returned by StrahlkorperGr::unit_normal_oneform. The argument tangents is a Tangents that can be obtained from the StrahlkorperDataBox using the StrahlkorperTags::Tangents tag.

## ◆ spin_vector()

template<typename Frame >
 std::array StrahlkorperGr::spin_vector ( double spin_magnitude, const Scalar< DataVector > & area_element, const Scalar< DataVector > & radius, const tnsr::i< DataVector, 3, Frame > & r_hat, const Scalar< DataVector > & ricci_scalar, const Scalar< DataVector > & spin_function, const YlmSpherepack & ylm )
noexcept

Spin vector of a 2D Strahlkorper.

### Details

Computes the spin vector of a Strahlkorper in a Frame, such as Frame::Inertial. The result is a std::array<double, 3> containing the Cartesian components of the spin vector, whose magnitude is spin_magnitude. This function will return the dimensionless spin components if spin_magnitude is the dimensionless spin magnitude, and it will return the dimensionful spin components if spin_magnitude is the dimensionful spin magnitude. The spin vector is given by a surface integral over the horizon $\mathcal{H}$ [Eq. (25) of [22]]: $S^i = \frac{S}{N} \oint_\mathcal{H} dA \Omega (x^i - x^i_0 - x^i_R)$, where $S$ is the spin magnitude, $N$ is a normalization factor enforcing $\delta_{ij}S^iS^j = S$, $dA$ is the area element (via StrahlkorperGr::area_element), $\Omega$ is the "spin function" (via StrahlkorperGr::spin_function), $x^i$ are the Frame coordinates of points on the Strahlkorper, $x^i_0$ are the Frame coordinates of the center of the Strahlkorper, $x^i_R = \frac{1}{8\pi}\oint_\mathcal{H} dA (x^i - x^i_0) R$, and $R$ is the intrinsic Ricci scalar of the Strahlkorper (via StrahlkorperGr::ricci_scalar). Note that measuring positions on the horizon relative to $x^i_0 + x^i_R$ instead of $x^i_0$ ensures that the mass dipole moment vanishes. Also note that $x^i - x^i_0$ is is the product of StrahlkorperTags::Rhat and StrahlkorperTags::Radius.

## ◆ surface_integral_of_scalar()

template<typename Frame >
 double StrahlkorperGr::surface_integral_of_scalar ( const Scalar< DataVector > & area_element, const Scalar< DataVector > & scalar, const Strahlkorper< Frame > & strahlkorper )
noexcept

Surface integral of a scalar on a 2D Strahlkorper

### Details

Computes the surface integral $\oint dA f$ for a scalar $f$ on a Strahlkorper with area element $dA$. The area element can be computed via StrahlkorperGr::area_element().

## ◆ unit_normal_one_form()

template<typename Frame >
 tnsr::i StrahlkorperGr::unit_normal_one_form ( const tnsr::i< DataVector, 3, Frame > & normal_one_form, const DataVector & one_over_one_form_magnitude )
noexcept

Computes normalized unit normal one-form to a Strahlkorper.

### Details

The input argument normal_one_form $n_i$ is the unnormalized surface one-form; it depends on a Strahlkorper but not on a metric. The input argument one_over_one_form_magnitude is $1/\sqrt{g^{ij}n_i n_j}$, which can be computed using (one over) the magnitude function.