Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 :
8 : #include "DataStructures/Tensor/TypeAliases.hpp"
9 : #include "Utilities/Gsl.hpp"
10 :
11 : namespace gr {
12 :
13 : /*!
14 : * \brief First-order formulation of the geodesic equation for null geodesics
15 : * that is suitable for ray tracing.
16 : *
17 : * This is the formulation of the geodesic equation that is originally used for
18 : * ray tracing in \cite Bohn:2014xxa (Eq. (4)) and \cite Bohn:2016afc (Eq. (6)).
19 : *
20 : * For null rays with position $x^\mu$, proper time (or affine geodesic
21 : * parameter) $\tau$, and four-momentum $p^\mu = dx^\mu / d\tau$, we first
22 : * define the momentum variable
23 : * \begin{equation}
24 : * \Pi_i = \frac{p_i}{\alpha p^0} = \frac{p_i}{\sqrt{\gamma^{jk} p_j p_k}}
25 : * \text{.}
26 : * \end{equation}
27 : * Here we work in a 3+1 decomposition of spacetime with time coordinate $t$,
28 : * lapse $\alpha$, shift $\beta^i$, spatial metric $\gamma_{ij}$, and
29 : * extrinsic curvature $K_{ij}$.
30 : * Then, the geodesic equation is given by
31 : * \begin{align}
32 : * \frac{d \Pi_i}{d t} &= -\partial_i \alpha + (\Pi^j \partial_j \alpha
33 : * -\alpha K_{jk}\Pi^j\Pi^k) \Pi_i) + \Pi_k \partial_i \beta^k
34 : * - \frac{1}{2} \alpha \Pi_j\Pi_k \partial_i \gamma^{jk} \\
35 : * \frac{d x^i}{d t} &= \alpha \Pi^i - \beta^i
36 : * \text{.}
37 : * \end{align}
38 : *
39 : * This function also computes the evolution of the additional redshift variable
40 : * $\ln(\alpha p^0)$ (Eq. (5) in \cite Bohn:2014xxa) as
41 : * \begin{equation}
42 : * \frac{d \ln(\alpha p^0)}{d t} = -\Pi^i \partial_i \alpha
43 : * + \alpha K_{ij} \Pi^i \Pi^j
44 : * \text{.}
45 : * \end{equation}
46 : */
47 : template <typename DataType, size_t Dim, typename Frame>
48 1 : void geodesic_equation(
49 : // Output time derivs
50 : gsl::not_null<tnsr::I<DataType, Dim, Frame>*> dt_x,
51 : gsl::not_null<tnsr::i<DataType, Dim, Frame>*> dt_pi,
52 : gsl::not_null<Scalar<DataType>*> dt_lnp0,
53 : // Current state
54 : const tnsr::I<DataType, Dim, Frame>& x,
55 : const tnsr::i<DataType, Dim, Frame>& pi, const Scalar<DataType>& lnp0,
56 : // Background spacetime
57 : const Scalar<DataType>& lapse,
58 : const tnsr::i<DataType, Dim, Frame>& deriv_lapse,
59 : const tnsr::I<DataType, Dim, Frame>& shift,
60 : const tnsr::iJ<DataType, Dim, Frame>& deriv_shift,
61 : const tnsr::II<DataType, Dim, Frame>& inv_spatial_metric,
62 : const tnsr::iJJ<DataType, Dim, Frame>& deriv_inv_spatial_metric,
63 : const tnsr::ii<DataType, Dim, Frame>& extrinsic_curvature);
64 :
65 : } // namespace gr
|