Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <array>
7 : #include <cstddef>
8 : #include <string>
9 : #include <vector>
10 :
11 : #include "DataStructures/DataVector.hpp"
12 :
13 : /*!
14 : * \brief Functionality for evolving a ringdown following a compact-binary
15 : * merger.
16 : */
17 : namespace evolution::Ringdown {
18 : /*!
19 : * \brief This function is used to transition from inspiral to ringdown. It
20 : * reads inertial frame common horizon Strahlkorper coefs from a file and
21 : * returns the Strahlkorper's temporary frame coefs and the inertial frame
22 : * geometric centers at multiple times which will be used to initialize the
23 : * shape and translation function of time for the ringdown.
24 : *
25 : * \details Reads common horizon Strahlkorpers (assumed to be in the inertial
26 : * frame) from a file, then transforms them to a temporary ringdown domain
27 : * defined by the expansion, rotation, and translation maps from the inspiral
28 : * specified by `exp_func_and_2_derivs`, `exp_outer_bdry_func_and_2_derivs`,
29 : * `rot_func_and_2_derivs`, and `trans_func_and_2_derivs`. The expansion and
30 : * rotation functions of time from the inspiral are the same as the ringdown
31 : * frame's expansion and rotation maps at the given `match_time`, but later
32 : * settle to constant values by the given `settling_timescale`. The translation
33 : * function of time supplied from the inspiral is not the translation map we'll
34 : * use in the final ringdown, it is only used to correctly map the common
35 : * horizon's geometric center so that we can make the corrected translation map
36 : * for the final ringdown. How to correct the translation map is explained in
37 : * detail below. A shape map is not specified, because we do not yet know the
38 : * shape coefficients of the common horizon for the ringdown. There are 4 frames
39 : * we transition between to find the shape coefficients and correct the
40 : * translation map. The frames are as follows:
41 : *
42 : * $\textbf{Inertial frame}$: This is the same for ringdown and inspiral, by
43 : * definition. It's the frame where we measure the waveforms, and it's the frame
44 : * in which we define the tensor components (e.g. the 'x' and 'y' in 'g_xy').
45 : *
46 : * $\textbf{Ringdown Grid Frame}$: This is the frame where the ringdown excision
47 : * boundary is spherical and where the ringdown grid lives.
48 : *
49 : * $\textbf{Temporary frame}$: The inertial frame pushed through the inverse
50 : * translation-rotation-expansion map, where "translation" is the inspiral's
51 : * translation map, and "rotation" and "expansion" are new rotation and
52 : * expansion maps that match the inspiral's rotation and expansion at the outer
53 : * boundary at the match time, have some smooth falloff in the interior, and
54 : * have a "settle to constant" time dependence. This frame is almost the
55 : * ringdown distorted frame, except for an uncorrected translation map which is
56 : * explained in detail below.
57 : *
58 : * $\textbf{Ringdown distorted frame}$: This is the ringdown grid frame pushed
59 : * through the (final) forward distortion map. Or equivalently, this is the
60 : * inertial frame pushed through the inverse translation-rotation-expansion map,
61 : * where here "translation" means the final corrected translation map, not the
62 : * inspiral's translation map, and "rotation" and "expansion" are the same as in
63 : * the temporary frame.
64 : *
65 : * We get the shape coefficients by transforming the common horizon to the
66 : * temporary frame which is almost the ringdown distorted frame except for the
67 : * uncorrected translation map. The translation map is corrected by transforming
68 : * the common horizon from the temporary frame to the inertial frame and saving
69 : * the geometric center points at multiple times. We then take those geometric
70 : * center points and build the corrected translation function of time. This is
71 : * done because the center of the Strahlkorper in this temporary frame is NOT
72 : * the origin (this is the case whether or not you say Recenter=true when
73 : * transforming the Strahlkorper), but the distortion map does its distortion
74 : * about the origin.
75 : * Possible ways to account for this:
76 : *
77 : * 1) Put a translation map before the distortion map.
78 : *
79 : * 2) Change the center of the distortion map. (then we need to live with
80 : * this during the ringdown).
81 : *
82 : * 3) Correct the current translation map so that the excision boundary maps to
83 : * the correct place.
84 : *
85 : * We choose 3). Section 6 of \cite Hemberger2012jz explains in more
86 : * detail of how we initialize the shape/translation map, but idea is that in
87 : * Eq. (104), the horizon can be written as
88 : * \f{equation}{
89 : * x^{\bar{i}}_{AH} = x^{\bar{i}}_{AHc} + n^{\bar{i}} \sum_{lm}S_{lm}
90 : * Y_{lm}(\theta,\phi)
91 : * \f}
92 : * where $x^{\bar{i}}_{AH}$ is the common horizon Strahklorper in the temporary
93 : * frame, $x^{\bar{i}}_{AHc}$ is the expansion center of the Strahlkorper in the
94 : * temporary frame, which is time-dependent and not zero, $n^{\bar{i}}$ is the
95 : * direction unit vector in the ($\theta,\phi$) direction relative to
96 : * $x^{\bar{i}}_{AHc}$, $\bar{i}$ is the index corresponding to the
97 : * temporary frame, and $S_{lm}$ are the Strahlkorper coefficients.
98 : * Now,
99 : * \f{equation}{
100 : * x^i = T0^i + M^i_{\bar{i}} x^{\bar{i}}
101 : * \f}
102 : * where $T0^i$ is the inspiral translation map, and $M^i_{\bar{i}}$ is
103 : * scaling+rotation. Thus,
104 : * \f{equation}{
105 : * x^i_AH = T0^i + M^i_{\bar{i}} x^{\bar{i}}_{AH}
106 : * = T0^i + M^i_{\bar{i}} x^{\bar{i}}_{AHc} + M^i_{\bar{i}} n^{\bar{i}}
107 : * \sum_{lm} S_{lm} Y_{lm}
108 : * \f}
109 : * Therefore if you define a new translation map $T^i$ as in Eq. (107)
110 : * (corrected translation map that will be used in the final ringdown)
111 : * $T^i = T0^i + M^i_{\bar{i}} x^{\bar{i}}_{AHc}$ (that is, you define $T^i$ to
112 : * be the same as $x^i_{AHc}$), then you can rewrite the relationship as
113 : * \f{equation}{
114 : * x^{i}_{AH} = T^i + M^i_{\bar{i}} \sum_{lm} S_{lm} Y_{lm} n^{\bar{i}}
115 : * \f}
116 : * Therefore we use a new map $x^i = T^i + M^i_{\bar{i}} x^{\tilde{i}}$ where
117 : * $\tilde{i}$ refers to the final ringdown distorted frame, $x^{\tilde{i}}$ is
118 : * a new coordinate where $x^{\tilde{i}}_{AHc} = 0$ and the coefficients of the
119 : * AH in the $x^{\tilde{i}}$ frame can be used unchanged (except for a minus
120 : * sign) in the distortion map that connects $x^{i_{grid}}$ and $x^{\tilde{i}}$.
121 : * This new map for $x^i$ ensures that the excision boundary is mapped to the
122 : * correct position.
123 : * \note Only temporary frame common horizon coefs and inertial frame geometric
124 : * center points within `requested_number_of_times_from_end` times from the
125 : * final time are returned. The functions of time are computed by
126 : * ComputeRingdownShapeAndTranslationFoT.py using the output from this function
127 : */
128 : std::pair<std::vector<DataVector>, std::vector<std::array<double, 3>>>
129 1 : strahlkorper_coefs_and_centers(
130 : const std::string& path_to_volume_data,
131 : const std::string& volume_subfile_name,
132 : const std::string& path_to_horizons_h5,
133 : const std::string& surface_subfile_name,
134 : size_t requested_number_of_times_from_end, double match_time,
135 : double settling_timescale,
136 : const std::optional<std::array<double, 3>>& exp_func_and_2_derivs =
137 : std::nullopt,
138 : const std::optional<std::array<double, 3>>&
139 : exp_outer_bdry_func_and_2_derivs = std::nullopt,
140 : const std::optional<std::vector<std::array<double, 4>>>&
141 : rot_func_and_2_derivs = std::nullopt,
142 : const std::optional<std::array<std::array<double, 3>, 3>>&
143 : trans_func_and_2_derivs = std::nullopt);
144 :
145 : // Hardcoded value used in SpEC
146 0 : constexpr double expansion_center_tolerance = 1e-8;
147 : } // namespace evolution::Ringdown
|