Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include "DataStructures/DataVector.hpp"
7 : #include "DataStructures/Tensor/Tensor.hpp"
8 : #include "Utilities/Gsl.hpp"
9 :
10 : namespace Xcts {
11 :
12 : /// @{
13 : /*!
14 : * \brief Surface integrand for the center of mass calculation.
15 : *
16 : * We define the center of mass integral as
17 : *
18 : * \begin{equation}
19 : * C_\text{CoM}^i = \frac{3}{8 \pi M_\text{ADM}} \oint_{S_\infty} \Big[
20 : * (\psi - 1)^4 + 4 (\psi - 1)^3
21 : * + 6 (\psi - 1)^2 + 4 (\psi - 1)
22 : * \Big] n^i \, dA,
23 : * \end{equation}
24 : *
25 : * where $n^i = x^i / r$ and $r = \sqrt{x^2 + y^2 + z^2}$. We use $\psi-1$
26 : * instead of $\psi$ because it is the variable solved for in the XCTS system.
27 : * Expanding the integrand, we see that this is identical to
28 : *
29 : * \begin{equation}
30 : * C_\text{CoM}^i = \frac{3}{8 \pi M_\text{ADM}}
31 : * \oint_{S_\infty} (\psi^4 - 1) n^i \, dA,
32 : * \end{equation}
33 : *
34 : * Analytically, this is equivalent to the definition in Eq. (25) of
35 : * \cite Ossokine2015yla because
36 : * \begin{equation}
37 : * \oint_{S_\infty} n^i \, dA = 0.
38 : * \end{equation}
39 : * Numerically, we have found that subtracting $1$ from $\psi^4$ results in less
40 : * round-off errors, leading to a more accurate center of mass.
41 : *
42 : * One way to interpret this integral is that we are summing over the unit
43 : * vectors $n^i$, rescaled by $\psi^4$, in all directions. If $\psi(\vec r)$ is
44 : * constant, no rescaling happens and all the unit vectors cancel out. If
45 : * $\psi(\vec r)$ is not constant, then $\vec C_\text{CoM}$ will emerge from the
46 : * difference of large numbers (sum of rescaled $n^i$ in each subdomain). With
47 : * larger and larger numbers being involved in this cancellation (i.e. with
48 : * increasing radius of $S_\infty$), we loose numerical accuracy. In other
49 : * words, we are seeking the subdominant terms. Since $\psi^4 \to 1$ in
50 : * conformal flatness, subtracting $1$ from it in the integrand makes the
51 : * numbers involved in this cancellation smaller, reducing this issue.
52 : *
53 : * \note We don't include the ADM mass $M_{ADM}$ in this integrand. After
54 : * integrating the result of this function, you have to divide by $M_{ADM}$.
55 : *
56 : * \note For consistency with `center_of_mass_volume_integrand`, this
57 : * integrand needs to be integrated with the Euclidean area element.
58 : *
59 : * \see `Xcts::adm_mass_surface_integrand`
60 : *
61 : * \warning This integral assumes that the conformal metric falls off to
62 : * flatness faster than $1/r^2$. That means that it cannot be directly used
63 : * with the Kerr-Schild metric, which falls off as $1/r$. This is not a problem
64 : * for XCTS with Superposed Kerr-Schild (SKS) because of the exponential
65 : * fall-off terms.
66 : *
67 : * \param result output pointer
68 : * \param conformal_factor_minus_one the conformal factor $\psi - 1$
69 : * \param coords the inertial coordinates $x^i$
70 : */
71 1 : void center_of_mass_surface_integrand(
72 : gsl::not_null<tnsr::I<DataVector, 3>*> result,
73 : const Scalar<DataVector>& conformal_factor_minus_one,
74 : const tnsr::I<DataVector, 3>& coords);
75 :
76 : /// Return-by-value overload
77 1 : tnsr::I<DataVector, 3> center_of_mass_surface_integrand(
78 : const Scalar<DataVector>& conformal_factor_minus_one,
79 : const tnsr::I<DataVector, 3>& coords);
80 : /// @}
81 :
82 : /// @{
83 : /*!
84 : * \brief Volume integrand for the center of mass calculation.
85 : *
86 : * We cast the center of mass as an infinite volume integral by applying Gauss'
87 : * law on the surface integral defined in `center_of_mass_surface_integrand`:
88 : *
89 : * \begin{equation}
90 : * C_\text{CoM}^i = \frac{3}{8 \pi M_\text{ADM}}
91 : * \int_{V_\infty} \Big(
92 : * 4 \psi^3 \partial_j \psi n^i n^j
93 : * + \frac{2}{r} \psi^4 n^i
94 : * \Big) dV
95 : * = \frac{3}{4 \pi M_\text{ADM}}
96 : * \int_{V_\infty} \frac{1}{r^2} \Big(
97 : * 2 \psi^3 \partial_j \psi x^i x^j
98 : * + \psi^4 x^i
99 : * \Big) dV,
100 : * \end{equation}
101 : *
102 : * where $n^i = x^i / r$ and $r = \sqrt{x^2 + y^2 + z^2}$.
103 : *
104 : * \note For consistency with `center_of_mass_surface_integrand`, this
105 : * integrand needs to be integrated with the Euclidean volume element.
106 : *
107 : * \see `center_of_mass_surface_integrand`
108 : *
109 : * \warning This integral currently suffers from significant round-off errors.
110 : * It is recommended to use only the surface integral if possible.
111 : *
112 : * \param result output pointer
113 : * \param conformal_factor the conformal factor $\psi$
114 : * \param deriv_conformal_factor the gradient of the conformal factor
115 : * $\partial_i \psi$
116 : * \param coords the inertial coordinates $x^i$
117 : */
118 1 : void center_of_mass_volume_integrand(
119 : gsl::not_null<tnsr::I<DataVector, 3>*> result,
120 : const Scalar<DataVector>& conformal_factor,
121 : const tnsr::i<DataVector, 3, Frame::Inertial>& deriv_conformal_factor,
122 : const tnsr::I<DataVector, 3>& coords);
123 :
124 : /// Return-by-value overload
125 1 : tnsr::I<DataVector, 3> center_of_mass_volume_integrand(
126 : const Scalar<DataVector>& conformal_factor,
127 : const tnsr::i<DataVector, 3, Frame::Inertial>& deriv_conformal_factor,
128 : const tnsr::I<DataVector, 3>& coords);
129 : /// @}
130 :
131 : } // namespace Xcts
|