Equations.hpp
1 // Distributed under the MIT License.
2 // See LICENSE.txt for details.
3 
4 #pragma once
5 
6 #include <type_traits>
7 
8 #include "DataStructures/SpinWeighted.hpp" // IWYU pragma: keep
9 #include "DataStructures/Tags.hpp"
12 #include "Evolution/Systems/Cce/Tags.hpp" // IWYU pragma: keep
13 #include "NumericalAlgorithms/Spectral/SwshTags.hpp"
14 #include "Utilities/Gsl.hpp"
15 #include "Utilities/TMPL.hpp"
16 
17 // IWYU pragma: no_forward_declare Cce::Tags::BondiBeta
18 // IWYU pragma: no_forward_declare Cce::Tags::DuRDividedByR
19 // IWYU pragma: no_forward_declare Cce::Tags::EthRDividedByR
20 // IWYU pragma: no_forward_declare Cce::Tags::Exp2Beta
21 // IWYU pragma: no_forward_declare Cce::Tags::BondiH
22 // IWYU pragma: no_forward_declare Cce::Tags::BondiJ
23 // IWYU pragma: no_forward_declare Cce::Tags::BondiJbar
24 // IWYU pragma: no_forward_declare Cce::Tags::JbarQMinus2EthBeta
25 // IWYU pragma: no_forward_declare Cce::Tags::BondiK
26 // IWYU pragma: no_forward_declare Cce::Tags::OneMinusY
27 // IWYU pragma: no_forward_declare Cce::Tags::BondiQ
28 // IWYU pragma: no_forward_declare Cce::Tags::BondiR
29 // IWYU pragma: no_forward_declare Cce::Tags::BondiU
30 // IWYU pragma: no_forward_declare Cce::Tags::BondiUbar
31 // IWYU pragma: no_forward_declare Cce::Tags::BondiW
32 // IWYU pragma: no_forward_declare ::Tags::Multiplies
33 // IWYU pragma: no_forward_declare Cce::Tags::Dy
34 // IWYU pragma: no_forward_declare Cce::Tags::Integrand
35 // IWYU pragma: no_forward_declare Cce::Tags::LinearFactor
36 // IWYU pragma: no_forward_declare Cce::Tags::LinearFactorForConjugate
37 // IWYU pragma: no_forward_declare Cce::Tags::PoleOfIntegrand
38 // IWYU pragma: no_forward_declare Cce::Tags::RegularIntegrand
39 // IWYU pragma: no_forward_declare Spectral::Swsh::Tags::Eth
40 // IWYU pragma: no_forward_declare Spectral::Swsh::Tags::EthEth
41 // IWYU pragma: no_forward_declare Spectral::Swsh::Tags::EthEthbar
42 // IWYU pragma: no_forward_declare Spectral::Swsh::Tags::Ethbar
43 // IWYU pragma: no_forward_declare Spectral::Swsh::Tags::EthbarEthbar
44 // IWYU pragma: no_forward_declare Spectral::Swsh::Tags::Derivative
45 // IWYU pragma: no_forward_declare Tags::TempTensor
46 // IWYU pragma: no_forward_declare Tags::SpinWeighted
47 // IWYU pragma: no_forward_declare SpinWeighted
48 // IWYU pragma: no_forward_declare Tensor
49 
50 /// \cond
51 class ComplexDataVector;
52 /// \endcond
53 
54 /// Contains functionality for Cauchy Characteristic Extraction
55 namespace Cce {
56 
57 namespace detail {
58 template <typename BondiVariable>
59 struct integrand_terms_to_compute_for_bondi_variable_impl;
60 
61 // template specializations for the individual tags
62 template <>
63 struct integrand_terms_to_compute_for_bondi_variable_impl<Tags::BondiBeta> {
64  using type = tmpl::list<Tags::Integrand<Tags::BondiBeta>>;
65 };
66 template <>
67 struct integrand_terms_to_compute_for_bondi_variable_impl<Tags::BondiQ> {
68  using type = tmpl::list<Tags::PoleOfIntegrand<Tags::BondiQ>,
69  Tags::RegularIntegrand<Tags::BondiQ>>;
70 };
71 template <>
72 struct integrand_terms_to_compute_for_bondi_variable_impl<Tags::BondiU> {
73  using type = tmpl::list<Tags::Integrand<Tags::BondiU>>;
74 };
75 template <>
76 struct integrand_terms_to_compute_for_bondi_variable_impl<Tags::BondiW> {
77  using type = tmpl::list<Tags::PoleOfIntegrand<Tags::BondiW>,
78  Tags::RegularIntegrand<Tags::BondiW>>;
79 };
80 template <>
81 struct integrand_terms_to_compute_for_bondi_variable_impl<Tags::BondiH> {
82  using type = tmpl::list<Tags::PoleOfIntegrand<Tags::BondiH>,
83  Tags::RegularIntegrand<Tags::BondiH>,
84  Tags::LinearFactor<Tags::BondiH>,
85  Tags::LinearFactorForConjugate<Tags::BondiH>>;
86 };
87 } // namespace detail
88 
89 /// \brief A struct for providing a `tmpl::list` of integrand tags that need to
90 /// be computed before integration can proceed for a given Bondi variable tag.
91 template <typename BondiVariable>
93  typename detail::integrand_terms_to_compute_for_bondi_variable_impl<
94  BondiVariable>::type;
95 
96 /*!
97  * \brief Computes one of the inputs for the integration of one of the
98  * Characteristic hypersurface equations.
99  *
100  * \details The template argument must be one of the integrand-related prefix
101  * tags templated on a Bondi quantity tag for which that integrand is required.
102  * The relevant prefix tags are `Tags::Integrand`, `Tags::PoleOfIntegrand`,
103  * `Tags::RegularIntegrand`, `Tags::LinearFactor`, and
104  * `Tags::LinearFactorForConjugate`. The Bondi quantity tags that these tags may
105  * wrap are `Tags::BondiBeta`, `Tags::BondiQ`, `Tags::BondiU`, `Tags::BondiW`,
106  * and `Tags::BondiH`.
107  *
108  * The integrand terms which may be computed for a given Bondi variable are
109  * enumerated in the type alias `integrand_terms_to_compute_for_bondi_variable`,
110  * which takes as a single template argument the tag for which integrand terms
111  * would be computed, and is a `tmpl::list` of the integrand terms needed.
112  *
113  * The resulting quantity is returned by `not_null` pointer, and the required
114  * argument tags are given in `return_tags` and `argument_tags` type aliases,
115  * where the `return_tags` are passed by `not_null` pointer (so include
116  * temporary buffers) and the `argument_tags` are passed by const reference.
117  *
118  * Additional mathematical details for each of the computations can be found in
119  * the template specializations of this struct. All of the specializations have
120  * a static `apply` function which takes as arguments
121  * `SpinWeighted<ComplexDataVector, N>`s for each of the Bondi arguments.
122  */
123 template <typename IntegrandTag>
125 
126 /*!
127  * \brief Computes the integrand (right-hand side) of the equation which
128  * determines the radial (y) dependence of the Bondi quantity \f$\beta\f$.
129  *
130  * \details The quantity \f$\beta\f$ is defined via the Bondi form of the
131  * metric:
132  * \f[
133  * ds^2 = - \left(e^{2 \beta} (1 + r W) - r^2 h_{AB} U^A U^B\right) du^2 - 2
134  * e^{2 \beta} du dr - 2 r^2 h_{AB} U^B du dx^A + r^2 h_{A B} dx^A dx^B. \f]
135  * Additional quantities \f$J\f$ and \f$K\f$ are defined using a spherical
136  * angular dyad \f$q^A\f$:
137  * \f[ J \equiv h_{A B} q^A q^B, K \equiv h_{A B} q^A
138  * \bar{q}^B.\f]
139  * See \cite Bishop1997ik \cite Handmer2014qha for full details.
140  *
141  * We write the equations of motion in the compactified coordinate \f$ y \equiv
142  * 1 - 2 R/ r\f$, where \f$r(u, \theta, \phi)\f$ is the Bondi radius of the
143  * \f$y=\f$ constant surface and \f$R(u,\theta,\phi)\f$ is the Bondi radius of
144  * the worldtube. The equation which determines \f$\beta\f$ on a surface of
145  * constant \f$u\f$ given \f$J\f$ on the same surface is
146  * \f[\partial_y (\beta) =
147  * \frac{1}{8} (-1 + y) \left(\partial_y (J) \partial_y(\bar{J})
148  * - \frac{(\partial_y (J \bar{J}))^2}{4 K^2}\right). \f]
149  */
150 template <>
151 struct ComputeBondiIntegrand<Tags::Integrand<Tags::BondiBeta>> {
152  public:
153  using pre_swsh_derivative_tags =
154  tmpl::list<Tags::Dy<Tags::BondiJ>, Tags::BondiJ>;
155  using swsh_derivative_tags = tmpl::list<>;
156  using integration_independent_tags = tmpl::list<Tags::OneMinusY>;
157  using temporary_tags = tmpl::list<>;
158 
159  using return_tags = tmpl::append<tmpl::list<Tags::Integrand<Tags::BondiBeta>>,
160  temporary_tags>;
161  using argument_tags =
162  tmpl::append<pre_swsh_derivative_tags, swsh_derivative_tags,
163  integration_independent_tags>;
164 
165  template <typename... Args>
166  static void apply(
168  integrand_for_beta,
169  const Args&... args) noexcept {
170  apply_impl(make_not_null(&get(*integrand_for_beta)), get(args)...);
171  }
172 
173  private:
174  static void apply_impl(
178  const SpinWeighted<ComplexDataVector, 0>& one_minus_y) noexcept;
179 };
180 
181 /*!
182  * \brief Computes the pole part of the integrand (right-hand side) of the
183  * equation which determines the radial (y) dependence of the Bondi quantity
184  * \f$Q\f$.
185  *
186  * \details The quantity \f$Q\f$ is defined via the Bondi form of the metric:
187  * \f[ds^2 = - \left(e^{2 \beta} (1 + r W) - r^2 h_{AB} U^A U^B\right) du^2 - 2
188  * e^{2 \beta} du dr - 2 r^2 h_{AB} U^B du dx^A + r^2 h_{A B} dx^A dx^B. \f]
189  * Additional quantities \f$J\f$ and \f$K\f$ are defined using a spherical
190  * angular dyad \f$q^A\f$:
191  * \f[ J \equiv h_{A B} q^A q^B, K \equiv h_{A B} q^A \bar{q}^B,\f]
192  * and \f$Q\f$ is defined as a supplemental variable for radial integration of
193  * \f$U\f$:
194  * \f[ Q_A = r^2 e^{-2\beta} h_{AB} \partial_r U^B\f]
195  * and \f$Q = Q_A q^A\f$. See \cite Bishop1997ik \cite Handmer2014qha for full
196  * details.
197  *
198  * We write the equations of motion in the compactified coordinate \f$ y \equiv
199  * 1 - 2 R/ r\f$, where \f$r(u, \theta, \phi)\f$ is the Bondi radius of the
200  * \f$y=\f$ constant surface and \f$R(u,\theta,\phi)\f$ is the Bondi radius of
201  * the worldtube. The equation which determines \f$Q\f$ on a surface of constant
202  * \f$u\f$ given \f$J\f$ and \f$\beta\f$ on the same surface is written as
203  * \f[(1 - y) \partial_y Q + 2 Q = A_Q + (1 - y) B_Q.\f]
204  * We refer to \f$A_Q\f$ as the "pole part" of the integrand and \f$B_Q\f$
205  * as the "regular part". The pole part is computed by this function, and has
206  * the expression
207  * \f[A_Q = -4 \eth \beta.\f]
208  */
209 template <>
210 struct ComputeBondiIntegrand<Tags::PoleOfIntegrand<Tags::BondiQ>> {
211  public:
212  using pre_swsh_derivative_tags = tmpl::list<>;
213  using swsh_derivative_tags =
216  using integration_independent_tags = tmpl::list<>;
217  using temporary_tags = tmpl::list<>;
218 
219  using return_tags =
220  tmpl::append<tmpl::list<Tags::PoleOfIntegrand<Tags::BondiQ>>,
221  temporary_tags>;
222  using argument_tags =
223  tmpl::append<pre_swsh_derivative_tags, swsh_derivative_tags,
224  integration_independent_tags>;
225 
226  template <typename... Args>
227  static void apply(
229  pole_of_integrand_for_q,
230  const Args&... args) noexcept {
231  apply_impl(make_not_null(&get(*pole_of_integrand_for_q)), get(args)...);
232  }
233 
234  private:
235  static void apply_impl(
237  pole_of_integrand_for_q,
238  const SpinWeighted<ComplexDataVector, 1>& eth_beta) noexcept;
239 };
240 
241 /*!
242  * \brief Computes the regular part of the integrand (right-hand side) of the
243  * equation which determines the radial (y) dependence of the Bondi quantity
244  * \f$Q\f$.
245  *
246  * \details The quantity \f$Q\f$ is defined via the Bondi form of the metric:
247  * \f[ds^2 = - \left(e^{2 \beta} (1 + r W) - r^2 h_{AB} U^A U^B\right) du^2 - 2
248  * e^{2 \beta} du dr - 2 r^2 h_{AB} U^B du dx^A + r^2 h_{A B} dx^A dx^B. \f]
249  * Additional quantities \f$J\f$ and \f$K\f$ are defined using a spherical
250  * angular dyad \f$q^A\f$:
251  * \f[ J \equiv h_{A B} q^A q^B, K \equiv h_{A B} q^A \bar{q}^B,\f]
252  * and \f$Q\f$ is defined as a supplemental variable for radial integration of
253  * \f$U\f$:
254  * \f[ Q_A = r^2 e^{-2\beta} h_{AB} \partial_r U^B\f]
255  * and \f$Q = Q_A q^A\f$. See \cite Bishop1997ik \cite Handmer2014qha for
256  * full details.
257  *
258  * We write the equations of motion in the compactified coordinate \f$ y \equiv
259  * 1 - 2 R/ r\f$, where \f$r(u, \theta, \phi)\f$ is the Bondi radius of the
260  * \f$y=\f$ constant surface and \f$R(u,\theta,\phi)\f$ is the Bondi radius of
261  * the worldtube. The equation which determines \f$Q\f$ on a surface of constant
262  * \f$u\f$ given \f$J\f$ and \f$\beta\f$ on the same surface is written as
263  * \f[(1 - y) \partial_y Q + 2 Q = A_Q + (1 - y) B_Q. \f]
264  * We refer to \f$A_Q\f$ as the "pole part" of the integrand and \f$B_Q\f$ as
265  * the "regular part". The regular part is computed by this function, and has
266  * the expression
267  * \f[ B_Q = - \left(2 \mathcal{A}_Q + \frac{2
268  * \bar{\mathcal{A}_Q} J}{K} - 2 \partial_y (\eth (\beta)) +
269  * \frac{\partial_y (\bar{\eth} (J))}{K}\right), \f]
270  * where
271  * \f[ \mathcal{A}_Q = - \tfrac{1}{4} \eth (\bar{J} \partial_y (J)) +
272  * \tfrac{1}{4} J \partial_y (\eth (\bar{J})) - \tfrac{1}{4} \eth (\bar{J})
273  * \partial_y (J) + \frac{\eth (J \bar{J}) \partial_y (J \bar{J})}{8 K^2} -
274  * \frac{\bar{J} \eth (R) \partial_y (J)}{4 R}. \f].
275  */
276 template <>
277 struct ComputeBondiIntegrand<Tags::RegularIntegrand<Tags::BondiQ>> {
278  public:
279  using pre_swsh_derivative_tags =
280  tmpl::list<Tags::Dy<Tags::BondiBeta>, Tags::Dy<Tags::BondiJ>,
281  Tags::BondiJ>;
282  using swsh_derivative_tags = tmpl::list<
287  Spectral::Swsh::Tags::Eth>,
290  Spectral::Swsh::Tags::Eth>,
294  Spectral::Swsh::Tags::Ethbar>>;
295  using integration_independent_tags =
296  tmpl::list<Tags::EthRDividedByR, Tags::BondiK>;
297  using temporary_tags =
298  tmpl::list<::Tags::SpinWeighted<::Tags::TempScalar<0, ComplexDataVector>,
300 
301  using return_tags =
302  tmpl::append<tmpl::list<Tags::RegularIntegrand<Tags::BondiQ>>,
303  temporary_tags>;
304  using argument_tags =
305  tmpl::append<pre_swsh_derivative_tags, swsh_derivative_tags,
306  integration_independent_tags>;
307 
308  template <typename... Args>
309  static void apply(
311  regular_integrand_for_q,
313  script_aq,
314  const Args&... args) noexcept {
315  apply_impl(make_not_null(&get(*regular_integrand_for_q)),
316  make_not_null(&get(*script_aq)), get(args)...);
317  }
318 
319  private:
320  static void apply_impl(
322  regular_integrand_for_q,
324  const SpinWeighted<ComplexDataVector, 0>& dy_beta,
327  const SpinWeighted<ComplexDataVector, 1>& eth_dy_beta,
328  const SpinWeighted<ComplexDataVector, 1>& eth_j_jbar,
329  const SpinWeighted<ComplexDataVector, 1>& eth_jbar_dy_j,
330  const SpinWeighted<ComplexDataVector, 1>& ethbar_dy_j,
331  const SpinWeighted<ComplexDataVector, 1>& ethbar_j,
332  const SpinWeighted<ComplexDataVector, 1>& eth_r_divided_by_r,
333  const SpinWeighted<ComplexDataVector, 0>& k) noexcept;
334 };
335 
336 /*!
337  * \brief Computes the integrand (right-hand side) of the equation which
338  * determines the radial (y) dependence of the Bondi quantity \f$U\f$.
339  *
340  * \details The quantity \f$U\f$ is defined via the Bondi form of the metric:
341  * \f[ds^2 = - \left(e^{2 \beta} (1 + r W) - r^2 h_{AB} U^A U^B\right) du^2 - 2
342  * e^{2 \beta} du dr - 2 r^2 h_{AB} U^B du dx^A + r^2 h_{A B} dx^A dx^B. \f]
343  * Additional quantities \f$J\f$ and \f$K\f$ are defined using a spherical
344  * angular dyad \f$q^A\f$:
345  * \f[ J \equiv h_{A B} q^A q^B, K \equiv h_{A B} q^A \bar{q}^B,\f]
346  * and \f$Q\f$ is defined as a supplemental variable for radial integration of
347  * \f$U\f$:
348  * \f[ Q_A = r^2 e^{-2\beta} h_{AB} \partial_r U^B\f]
349  * and \f$U = U_A q^A\f$. See \cite Bishop1997ik \cite Handmer2014qha for full
350  * details.
351  *
352  * We write the equations of motion in the compactified coordinate \f$ y \equiv
353  * 1 - 2 R/ r\f$, where \f$r(u, \theta, \phi)\f$ is the Bondi radius of the
354  * \f$y=\f$ constant surface and \f$R(u,\theta,\phi)\f$ is the Bondi radius of
355  * the worldtube. The equation which determines \f$U\f$ on a surface of constant
356  * \f$u\f$ given \f$J\f$, \f$\beta\f$, and \f$Q\f$ on the same surface is
357  * written as
358  * \f[\partial_y U = \frac{e^{2\beta}}{2 R} (K Q - J \bar{Q}). \f]
359  */
360 template <>
361 struct ComputeBondiIntegrand<Tags::Integrand<Tags::BondiU>> {
362  public:
363  using pre_swsh_derivative_tags =
364  tmpl::list<Tags::Exp2Beta, Tags::BondiJ, Tags::BondiQ>;
365  using swsh_derivative_tags = tmpl::list<>;
366  using integration_independent_tags = tmpl::list<Tags::BondiK, Tags::BondiR>;
367  using temporary_tags = tmpl::list<>;
368 
369  using return_tags =
370  tmpl::append<tmpl::list<Tags::Integrand<Tags::BondiU>>, temporary_tags>;
371  using argument_tags =
372  tmpl::append<pre_swsh_derivative_tags, swsh_derivative_tags,
373  integration_independent_tags>;
374 
375  template <typename... Args>
376  static void apply(
378  regular_integrand_for_u,
379  const Args&... args) noexcept {
380  apply_impl(make_not_null(&get(*regular_integrand_for_u)), get(args)...);
381  }
382 
383  private:
384  static void apply_impl(gsl::not_null<SpinWeighted<ComplexDataVector, 1>*>
385  regular_integrand_for_u,
386  const SpinWeighted<ComplexDataVector, 0>& exp_2_beta,
390  const SpinWeighted<ComplexDataVector, 0>& r) noexcept;
391 };
392 
393 /*!
394  * \brief Computes the pole part of the integrand (right-hand side) of the
395  * equation which determines the radial (y) dependence of the Bondi quantity
396  * \f$W\f$.
397  *
398  * \details The quantity \f$W\f$ is defined via the Bondi form of the metric:
399  * \f[ds^2 = - \left(e^{2 \beta} (1 + r W) - r^2 h_{AB} U^A U^B\right) du^2 - 2
400  * e^{2 \beta} du dr - 2 r^2 h_{AB} U^B du dx^A + r^2 h_{A B} dx^A dx^B. \f]
401  * Additional quantities \f$J\f$ and \f$K\f$ are defined using a spherical
402  * angular dyad \f$q^A\f$:
403  * \f[ J \equiv h_{A B} q^A q^B, K \equiv h_{A B} q^A \bar{q}^B.\f]
404  * See \cite Bishop1997ik \cite Handmer2014qha for full details.
405  *
406  * We write the equations of motion in the compactified coordinate \f$ y \equiv
407  * 1 - 2 R/ r\f$, where \f$r(u, \theta, \phi)\f$ is the Bondi radius of the
408  * \f$y=\f$ constant surface and \f$R(u,\theta,\phi)\f$ is the Bondi radius of
409  * the worldtube. The equation which determines \f$W\f$ on a surface of constant
410  * \f$u\f$ given \f$J\f$,\f$\beta\f$, \f$Q\f$, and \f$U\f$ on the same surface
411  * is written as
412  * \f[(1 - y) \partial_y W + 2 W = A_W + (1 - y) B_W.\f] We refer
413  * to \f$A_W\f$ as the "pole part" of the integrand and \f$B_W\f$ as the
414  * "regular part". The pole part is computed by this function, and has the
415  * expression
416  * \f[A_W = \eth (\bar{U}) + \bar{\eth} (U).\f]
417  */
418 template <>
419 struct ComputeBondiIntegrand<Tags::PoleOfIntegrand<Tags::BondiW>> {
420  public:
421  using pre_swsh_derivative_tags = tmpl::list<>;
422  using swsh_derivative_tags = tmpl::list<Spectral::Swsh::Tags::Derivative<
424  using integration_independent_tags = tmpl::list<>;
425  using temporary_tags = tmpl::list<>;
426 
427  using return_tags =
428  tmpl::append<tmpl::list<Tags::PoleOfIntegrand<Tags::BondiW>>,
429  temporary_tags>;
430  using argument_tags =
431  tmpl::append<pre_swsh_derivative_tags, swsh_derivative_tags,
432  integration_independent_tags>;
433 
434  template <typename... Args>
435  static void apply(
437  pole_of_integrand_for_w,
438  const Args&... args) noexcept {
439  apply_impl(make_not_null(&get(*pole_of_integrand_for_w)), get(args)...);
440  }
441 
442  private:
443  static void apply_impl(
445  pole_of_integrand_for_w,
446  const SpinWeighted<ComplexDataVector, 0>& ethbar_u) noexcept;
447 };
448 
449 /*!
450  * \brief Computes the regular part of the integrand (right-hand side) of the
451  * equation which determines the radial (y) dependence of the Bondi quantity
452  * \f$W\f$.
453  *
454  * \details The quantity \f$W\f$ is defined via the Bondi form of the metric:
455  * \f[ds^2 = - \left(e^{2 \beta} (1 + r W) - r^2 h_{AB} U^A U^B\right) du^2 - 2
456  * e^{2 \beta} du dr - 2 r^2 h_{AB} U^B du dx^A + r^2 h_{A B} dx^A dx^B. \f]
457  * Additional quantities \f$J\f$ and \f$K\f$ are defined using a spherical
458  * angular dyad \f$q^A\f$:
459  * \f[ J \equiv h_{A B} q^A q^B, K \equiv h_{A B} q^A \bar{q}^B,\f]
460  * See \cite Bishop1997ik \cite Handmer2014qha for full details.
461  *
462  * We write the equations of motion in the compactified coordinate \f$ y \equiv
463  * 1 - 2 R/ r\f$, where \f$r(u, \theta, \phi)\f$ is the Bondi radius of the
464  * \f$y=\f$ constant surface and \f$R(u,\theta,\phi)\f$ is the Bondi radius of
465  * the worldtube. The equation which determines \f$W\f$ on a surface of constant
466  * \f$u\f$ given \f$J\f$, \f$\beta\f$, \f$Q\f$, \f$U\f$ on the same surface is
467  * written as
468  * \f[(1 - y) \partial_y W + 2 W = A_W + (1 - y) B_W. \f]
469  * We refer to \f$A_W\f$ as the "pole part" of the integrand and \f$B_W\f$ as
470  * the "regular part". The regular part is computed by this function, and has
471  * the expression
472  * \f[ B_W = \tfrac{1}{4} \partial_y (\eth (\bar{U})) + \tfrac{1}{4} \partial_y
473  * (\bar{\eth} (U)) - \frac{1}{2 R} + \frac{e^{2 \beta} (\mathcal{A}_W +
474  * \bar{\mathcal{A}_W})}{4 R}, \f]
475  * where
476  * \f{align*}
477  * \mathcal{A}_W =& - \eth (\beta) \eth (\bar{J}) + \tfrac{1}{2} \bar{\eth}
478  * (\bar{\eth} (J)) + 2 \bar{\eth} (\beta) \bar{\eth} (J) + (\bar{\eth}
479  * (\beta))^2 J + \bar{\eth}
480  * (\bar{\eth} (\beta)) J + \frac{\eth (J \bar{J}) \bar{\eth} (J \bar{J})}{8
481  * K^3} + \frac{1}{2 K} - \frac{\eth (\bar{\eth} (J \bar{J}))}{8 K} -
482  * \frac{\eth (J
483  * \bar{J}) \bar{\eth} (\beta)}{2 K} \nonumber \\
484  * &- \frac{\eth (\bar{J}) \bar{\eth} (J)}{4 K} - \frac{\eth (\bar{\eth} (J))
485  * \bar{J}}{4 K} + \tfrac{1}{2} K - \eth (\bar{\eth} (\beta)) K - \eth
486  * (\beta) \bar{\eth} (\beta) K + \tfrac{1}{4} (- K Q \bar{Q} + J \bar{Q}^2).
487  * \f}
488  */
489 template <>
490 struct ComputeBondiIntegrand<Tags::RegularIntegrand<Tags::BondiW>> {
491  public:
492  using pre_swsh_derivative_tags =
493  tmpl::list<Tags::Dy<Tags::BondiU>, Tags::Exp2Beta, Tags::BondiJ,
494  Tags::BondiQ>;
495  using swsh_derivative_tags = tmpl::list<
498  Spectral::Swsh::Tags::Derivative<Tags::BondiBeta,
500  Spectral::Swsh::Tags::Derivative<Tags::BondiBeta,
505  Spectral::Swsh::Tags::Eth>,
508  Spectral::Swsh::Tags::EthEthbar>,
510  ::Tags::Multiplies<Tags::BondiJ, Tags::BondiJbar>,
511  Spectral::Swsh::Tags::Eth>,
513  Spectral::Swsh::Tags::Ethbar>,
517  Spectral::Swsh::Tags::Ethbar>>;
518  using integration_independent_tags =
519  tmpl::list<Tags::EthRDividedByR, Tags::BondiK, Tags::BondiR>;
520  using temporary_tags =
521  tmpl::list<::Tags::SpinWeighted<::Tags::TempScalar<0, ComplexDataVector>,
523 
524  using return_tags =
525  tmpl::append<tmpl::list<Tags::RegularIntegrand<Tags::BondiW>>,
526  temporary_tags>;
527  using argument_tags =
528  tmpl::append<pre_swsh_derivative_tags, swsh_derivative_tags,
529  integration_independent_tags>;
530 
531  template <typename... Args>
532  static void apply(
534  regular_integrand_for_w,
536  script_av,
537  const Args&... args) noexcept {
538  apply_impl(make_not_null(&get(*regular_integrand_for_w)),
539  make_not_null(&get(*script_av)), get(args)...);
540  }
541 
542  private:
543  static void apply_impl(
545  regular_integrand_for_w,
548  const SpinWeighted<ComplexDataVector, 0>& exp_2_beta,
551  const SpinWeighted<ComplexDataVector, 1>& eth_beta,
552  const SpinWeighted<ComplexDataVector, 2>& eth_eth_beta,
553  const SpinWeighted<ComplexDataVector, 0>& eth_ethbar_beta,
554  const SpinWeighted<ComplexDataVector, 2>& eth_ethbar_j,
555  const SpinWeighted<ComplexDataVector, 0>& eth_ethbar_j_jbar,
556  const SpinWeighted<ComplexDataVector, 1>& eth_j_jbar,
557  const SpinWeighted<ComplexDataVector, 0>& ethbar_dy_u,
558  const SpinWeighted<ComplexDataVector, 0>& ethbar_ethbar_j,
559  const SpinWeighted<ComplexDataVector, 1>& ethbar_j,
560  const SpinWeighted<ComplexDataVector, 1>& eth_r_divided_by_r,
562  const SpinWeighted<ComplexDataVector, 0>& r) noexcept;
563 };
564 
565 /*!
566  * \brief Computes the pole part of the integrand (right-hand side) of the
567  * equation which determines the radial (y) dependence of the Bondi quantity
568  * \f$H\f$.
569  *
570  * \details The quantity \f$H \equiv \partial_u J\f$ (evaluated at constant y)
571  * is defined via the Bondi form of the metric:
572  * \f[ds^2 = - \left(e^{2 \beta} (1 + r W) - r^2 h_{AB} U^A U^B\right) du^2 - 2
573  * e^{2 \beta} du dr - 2 r^2 h_{AB} U^B du dx^A + r^2 h_{A B} dx^A dx^B. \f]
574  * Additional quantities \f$J\f$ and \f$K\f$ are defined using a spherical
575  * angular dyad \f$q^A\f$:
576  * \f[ J \equiv h_{A B} q^A q^B, K \equiv h_{A B} q^A \bar{q}^B.\f]
577  * See \cite Bishop1997ik \cite Handmer2014qha for full details.
578  *
579  * We write the equations of motion in the compactified coordinate \f$ y \equiv
580  * 1 - 2 R/ r\f$, where \f$r(u, \theta, \phi)\f$ is the Bondi radius of the
581  * \f$y=\f$ constant surface and \f$R(u,\theta,\phi)\f$ is the Bondi radius of
582  * the worldtube. The equation which determines \f$W\f$ on a surface of constant
583  * \f$u\f$ given \f$J\f$,\f$\beta\f$, \f$Q\f$, \f$U\f$, and \f$W\f$ on the same
584  * surface is written as
585  * \f[(1 - y) \partial_y H + H + (1 - y)(\mathcal{D}_J H
586  * + \bar{\mathcal{D}}_J \bar{H}) = A_J + (1 - y) B_J.\f]
587  *
588  * We refer to \f$A_J\f$ as the "pole part" of the integrand
589  * and \f$B_J\f$ as the "regular part". The pole part is computed by this
590  * function, and has the expression
591  * \f{align*}
592  * A_J =& - \tfrac{1}{2} \eth (J \bar{U}) - \eth (\bar{U}) J - \tfrac{1}{2}
593  * \bar{\eth} (U) J - \eth (U) K - \tfrac{1}{2} (\bar{\eth} (J) U) + 2 J W
594  * \f}
595  */
596 template <>
597 struct ComputeBondiIntegrand<Tags::PoleOfIntegrand<Tags::BondiH>> {
598  public:
599  using pre_swsh_derivative_tags =
600  tmpl::list<Tags::BondiJ, Tags::BondiU, Tags::BondiW>;
601  using swsh_derivative_tags = tmpl::list<
607  Spectral::Swsh::Tags::Ethbar>,
609  Spectral::Swsh::Tags::Ethbar>>;
610  using integration_independent_tags = tmpl::list<Tags::BondiK>;
611  using temporary_tags = tmpl::list<>;
612 
613  using return_tags =
614  tmpl::append<tmpl::list<Tags::PoleOfIntegrand<Tags::BondiH>>,
615  temporary_tags>;
616  using argument_tags =
617  tmpl::append<pre_swsh_derivative_tags, swsh_derivative_tags,
618  integration_independent_tags>;
619 
620  template <typename... Args>
621  static void apply(
623  pole_of_integrand_for_h,
624  const Args&... args) noexcept {
625  apply_impl(make_not_null(&get(*pole_of_integrand_for_h)), get(args)...);
626  }
627 
628  private:
629  static void apply_impl(
631  pole_of_integrand_for_h,
636  const SpinWeighted<ComplexDataVector, 1>& ethbar_j,
637  const SpinWeighted<ComplexDataVector, -2>& ethbar_jbar_u,
638  const SpinWeighted<ComplexDataVector, 0>& ethbar_u,
639  const SpinWeighted<ComplexDataVector, 0>& k) noexcept;
640 };
641 
642 /*!
643  * \brief Computes the pole part of the integrand (right-hand side) of the
644  * equation which determines the radial (y) dependence of the Bondi quantity
645  * \f$H\f$.
646  *
647  * \details The quantity \f$H \equiv \partial_u J\f$ (evaluated at constant y)
648  * is defined via the Bondi form of the metric:
649  * \f[ds^2 = - \left(e^{2 \beta} (1 + r W) - r^2 h_{AB} U^A U^B\right) du^2 - 2
650  * e^{2 \beta} du dr - 2 r^2 h_{AB} U^B du dx^A + r^2 h_{A B} dx^A dx^B. \f]
651  * Additional quantities \f$J\f$ and \f$K\f$ are defined using a spherical
652  * angular dyad \f$q^A\f$:
653  * \f[ J \equiv h_{A B} q^A q^B, K \equiv h_{A B} q^A \bar{q}^B.\f]
654  * See \cite Bishop1997ik \cite Handmer2014qha for full details.
655  *
656  * We write the equations of motion in the compactified coordinate \f$ y \equiv
657  * 1 - 2 R/ r\f$, where \f$r(u, \theta, \phi)\f$ is the Bondi radius of the
658  * \f$y=\f$ constant surface and \f$R(u,\theta,\phi)\f$ is the Bondi radius of
659  * the worldtube. The equation which determines \f$H\f$ on a surface of constant
660  * \f$u\f$ given \f$J\f$,\f$\beta\f$, \f$Q\f$, \f$U\f$, and \f$W\f$ on the same
661  * surface is written as
662  * \f[(1 - y) \partial_y H + H + (1 - y)(\mathcal{D}_J H + \bar{\mathcal{D}}_J
663  * \bar{H}) = A_J + (1 - y) B_J.\f]
664  * We refer to \f$A_J\f$ as the "pole part" of the integrand
665  * and \f$B_J\f$ as the "regular part". The pole part is computed by this
666  * function, and has the expression
667  * \f{align*}
668  * B_J =& -\tfrac{1}{2} \left(\eth(\partial_y (J) \bar{U}) + \partial_y
669  * (\bar{\eth} (J)) U \right) + J (\mathcal{B}_J + \bar{\mathcal{B}}_J) \notag\\
670  * &+ \frac{e^{2 \beta}}{2 R} \left(\mathcal{C}_J + \eth (\eth (\beta)) -
671  * \tfrac{1}{2} \eth (Q) - (\mathcal{A}_J + \bar{\mathcal{A}_J}) J +
672  * \frac{\bar{\mathcal{C}_J} J^2}{K^2} + \frac{\eth (J (-2 \bar{\eth} (\beta) +
673  * \bar{Q}))}{4 K} - \frac{\eth (\bar{Q}) J}{4 K} + (\eth (\beta) -
674  * \tfrac{1}{2} Q)^2\right) \notag\\
675  * &- \partial_y (J) \left(\frac{\eth (U) \bar{J}}{2 K} - \tfrac{1}{2}
676  * \bar{\eth} (\bar{U}) J K + \tfrac{1}{4} (\eth (\bar{U}) - \bar{\eth} (U))
677  * K^2 + \frac{1}{2} \frac{\eth (R) \bar{U}}{R} - \frac{1}{2}
678  * W\right)\notag\\
679  * &+ \partial_y (\bar{J}) \left(- \tfrac{1}{4} (- \eth (\bar{U}) + \bar{\eth}
680  * (U)) J^2 + \eth (U) J \left(- \frac{1}{2 K} + \tfrac{1}{2}
681  * K\right)\right)\notag\\
682  * &+ (1 - y) \bigg[\frac{1}{2} \left(- \frac{\partial_y (J)}{R} + \frac{2
683  * \partial_{u} (R) \partial_y (\partial_y (J))}{R} + \partial_y
684  * (\partial_y (J)) W\right) + \partial_y (J) \left(\tfrac{1}{2} \partial_y (W)
685  * + \frac{1}{2 R}\right)\bigg]\notag\\
686  * &+ (1 - y)^2 \bigg[ \frac{\partial_y (\partial_y (J)) }{4 R} \bigg],
687  * \f}
688  * where
689  * \f{align*}
690  * \mathcal{A}_J =& \tfrac{1}{4} \eth (\eth (\bar{J})) - \frac{1}{4 K^3} -
691  * \frac{\eth (\bar{\eth} (J \bar{J})) - (\eth (\bar{\eth} (\bar{J})) - 4
692  \bar{J})
693  * J}{16 K^3} + \frac{3}{4 K} - \frac{\eth (\bar{\eth} (\beta))}{4 K} \notag\\
694  * &- \frac{\eth (\bar{\eth} (J)) \bar{J} (1 - \frac{1}{4 K^2})}{4 K} +
695  * \tfrac{1}{2} \eth (\bar{J}) \left(\eth (\beta) + \frac{\bar{\eth} (J \bar{J})
696  * J}{4 K^3} - \frac{\bar{\eth} (J) (-1 + 2 K^2)}{4 K^3} - \tfrac{1}{2}
697  * Q\right)\\
698  * \mathcal{B}_J =& - \frac{\eth (U) \bar{J} \partial_y (J \bar{J})}{4 K} +
699  * \tfrac{1}{2} \partial_y (W) + \frac{1}{4 R} + \tfrac{1}{4} \bar{\eth} (J)
700  * \partial_y (\bar{J}) U - \frac{\bar{\eth} (J \bar{J}) \partial_y (J \bar{J})
701  * U}{8 K^2} \notag\\&- \tfrac{1}{4} J \partial_y (\eth (\bar{J})) \bar{U} +
702  * \tfrac{1}{4} (\eth (J \partial_y (\bar{J})) + \frac{J \eth (R)
703  * \partial_y(\bar{J})}{R}) \bar{U} \\
704  * &+ (1 - y) \bigg[ \frac{\mathcal{D}_J \partial_{u} (R)
705  * \partial_y (J)}{R} - \tfrac{1}{4} \partial_y (J) \partial_y (\bar{J}) W +
706  * \frac{(\partial_y (J \bar{J}))^2 W}{16 K^2} \bigg] \\
707  * &+ (1 - y)^2 \bigg[ - \frac{\partial_y (J) \partial_y (\bar{J})}{8 R} +
708  * \frac{(\partial_y (J \bar{J}))^2}{32 K^2 R} \bigg]\\
709  * \mathcal{C}_J =& \tfrac{1}{2} \bar{\eth} (J) K (\eth (\beta) - \tfrac{1}{2}
710  * Q)\\ \mathcal{D}_J =& \tfrac{1}{4} \left(-2 \partial_y (\bar{J}) +
711  * \frac{\bar{J} \partial_y (J \bar{J})}{K^2}\right)
712  * \f}
713  */
714 template <>
715 struct ComputeBondiIntegrand<Tags::RegularIntegrand<Tags::BondiH>> {
716  public:
717  using pre_swsh_derivative_tags =
718  tmpl::list<Tags::Dy<Tags::Dy<Tags::BondiJ>>, Tags::Dy<Tags::BondiJ>,
721  using swsh_derivative_tags = tmpl::list<
724  Spectral::Swsh::Tags::Derivative<Tags::BondiBeta,
726  Spectral::Swsh::Tags::Derivative<Tags::BondiBeta,
731  Spectral::Swsh::Tags::Eth>,
734  Spectral::Swsh::Tags::EthEthbar>,
736  ::Tags::Multiplies<Tags::BondiJ, Tags::BondiJbar>,
737  Spectral::Swsh::Tags::Eth>,
742  Spectral::Swsh::Tags::Eth>,
744  Spectral::Swsh::Tags::Ethbar>,
748  Spectral::Swsh::Tags::Ethbar>,
751  Spectral::Swsh::Tags::Ethbar>,
753  Spectral::Swsh::Tags::Ethbar>,
755  Spectral::Swsh::Tags::Ethbar>,
757  Spectral::Swsh::Tags::Ethbar>>;
758  using integration_independent_tags =
761  using temporary_tags =
762  tmpl::list<::Tags::SpinWeighted<::Tags::TempScalar<0, ComplexDataVector>,
765  std::integral_constant<int, 0>>,
768 
769  using return_tags =
770  tmpl::append<tmpl::list<Tags::RegularIntegrand<Tags::BondiH>>,
771  temporary_tags>;
772  using argument_tags =
773  tmpl::append<pre_swsh_derivative_tags, swsh_derivative_tags,
774  integration_independent_tags>;
775 
776  template <typename... Args>
777  static void apply(
779  regular_integrand_for_h,
781  script_aj,
783  script_bj,
785  script_cj,
786  const Args&... args) noexcept {
787  apply_impl(make_not_null(&get(*regular_integrand_for_h)),
788  make_not_null(&get(*script_aj)), make_not_null(&get(*script_bj)),
789  make_not_null(&get(*script_cj)), get(args)...);
790  }
791 
792  private:
793  static void apply_impl(
795  regular_integrand_for_h,
799  const SpinWeighted<ComplexDataVector, 2>& dy_dy_j,
802  const SpinWeighted<ComplexDataVector, 0>& exp_2_beta,
807  const SpinWeighted<ComplexDataVector, 1>& eth_beta,
808  const SpinWeighted<ComplexDataVector, 2>& eth_eth_beta,
809  const SpinWeighted<ComplexDataVector, 0>& eth_ethbar_beta,
810  const SpinWeighted<ComplexDataVector, 2>& eth_ethbar_j,
811  const SpinWeighted<ComplexDataVector, 0>& eth_ethbar_j_jbar,
812  const SpinWeighted<ComplexDataVector, 1>& eth_j_jbar,
815  const SpinWeighted<ComplexDataVector, 2>& eth_ubar_dy_j,
816  const SpinWeighted<ComplexDataVector, 1>& ethbar_dy_j,
817  const SpinWeighted<ComplexDataVector, 0>& ethbar_ethbar_j,
818  const SpinWeighted<ComplexDataVector, 1>& ethbar_j,
819  const SpinWeighted<ComplexDataVector, -1>& ethbar_jbar_dy_j,
820  const SpinWeighted<ComplexDataVector, -2>& ethbar_jbar_q_minus_2_eth_beta,
821  const SpinWeighted<ComplexDataVector, 0>& ethbar_q,
822  const SpinWeighted<ComplexDataVector, 0>& ethbar_u,
823  const SpinWeighted<ComplexDataVector, 0>& du_r_divided_by_r,
824  const SpinWeighted<ComplexDataVector, 1>& eth_r_divided_by_r,
826  const SpinWeighted<ComplexDataVector, 0>& one_minus_y,
827  const SpinWeighted<ComplexDataVector, 0>& r) noexcept;
828 };
829 
830 /*!
831  * \brief Computes the linear factor which multiplies \f$H\f$ in the
832  * equation which determines the radial (y) dependence of the Bondi quantity
833  * \f$H\f$.
834  *
835  * \details The quantity \f$H \equiv \partial_u J\f$ (evaluated at constant y)
836  * is defined via the Bondi form of the metric:
837  * \f[ds^2 = - \left(e^{2 \beta} (1 + r W) - r^2 h_{AB} U^A U^B\right) du^2 - 2
838  * e^{2 \beta} du dr - 2 r^2 h_{AB} U^B du dx^A + r^2 h_{A B} dx^A dx^B. \f]
839  * Additional quantities \f$J\f$ and \f$K\f$ are defined using a spherical
840  * angular dyad \f$q^A\f$:
841  * \f[ J \equiv h_{A B} q^A q^B, K \equiv h_{A B} q^A \bar{q}^B.\f]
842  * See \cite Bishop1997ik \cite Handmer2014qha for full details.
843  *
844  * We write the equations of motion in the compactified coordinate \f$ y \equiv
845  * 1 - 2 R/ r\f$, where \f$r(u, \theta, \phi)\f$ is the Bondi radius of the
846  * \f$y=\f$ constant surface and \f$R(u,\theta,\phi)\f$ is the Bondi radius of
847  * the worldtube. The equation which determines \f$H\f$ on a surface of constant
848  * \f$u\f$ given \f$J\f$,\f$\beta\f$, \f$Q\f$, \f$U\f$, and \f$W\f$ on the same
849  * surface is written as
850  * \f[(1 - y) \partial_y H + H + (1 - y) J (\mathcal{D}_J
851  * H + \bar{\mathcal{D}}_J \bar{H}) = A_J + (1 - y) B_J.\f]
852  * The quantity \f$1 +(1 - y) J \mathcal{D}_J\f$ is the linear factor
853  * for the non-conjugated \f$H\f$, and is computed from the equation:
854  * \f[\mathcal{D}_J = \frac{1}{4}(-2 \partial_y \bar{J} + \frac{\bar{J}
855  * \partial_y (J \bar{J})}{K^2})\f]
856  */
857 template <>
858 struct ComputeBondiIntegrand<Tags::LinearFactor<Tags::BondiH>> {
859  public:
860  using pre_swsh_derivative_tags =
861  tmpl::list<Tags::Dy<Tags::BondiJ>, Tags::BondiJ>;
862  using swsh_derivative_tags = tmpl::list<>;
863  using integration_independent_tags = tmpl::list<Tags::OneMinusY>;
864  using temporary_tags =
865  tmpl::list<::Tags::SpinWeighted<::Tags::TempScalar<0, ComplexDataVector>,
867 
868  using return_tags = tmpl::append<tmpl::list<Tags::LinearFactor<Tags::BondiH>>,
869  temporary_tags>;
870  using argument_tags =
871  tmpl::append<pre_swsh_derivative_tags, swsh_derivative_tags,
872  integration_independent_tags>;
873 
874  template <typename... Args>
875  static void apply(
877  linear_factor_for_h,
879  script_djbar,
880  const Args&... args) noexcept {
881  apply_impl(make_not_null(&get(*linear_factor_for_h)),
882  make_not_null(&get(*script_djbar)), get(args)...);
883  }
884 
885  private:
886  static void apply_impl(
891  const SpinWeighted<ComplexDataVector, 0>& one_minus_y) noexcept;
892 };
893 
894 /*!
895  * \brief Computes the linear factor which multiplies \f$\bar{H}\f$ in the
896  * equation which determines the radial (y) dependence of the Bondi quantity
897  * \f$H\f$.
898  *
899  * \details The quantity \f$H \equiv \partial_u J\f$ (evaluated at constant y)
900  * is defined via the Bondi form of the metric:
901  * \f[ds^2 = - \left(e^{2 \beta} (1 + r W) - r^2 h_{AB} U^A U^B\right) du^2 - 2
902  * e^{2 \beta} du dr - 2 r^2 h_{AB} U^B du dx^A + r^2 h_{A B} dx^A dx^B. \f]
903  * Additional quantities \f$J\f$ and \f$K\f$ are defined using a spherical
904  * angular dyad \f$q^A\f$:
905  * \f[ J \equiv h_{A B} q^A q^B, K \equiv h_{A B} q^A \bar{q}^B.\f]
906  * See \cite Bishop1997ik \cite Handmer2014qha for full details.
907  *
908  * We write the equations of motion in the compactified coordinate \f$ y \equiv
909  * 1 - 2 R/ r\f$, where \f$r(u, \theta, \phi)\f$ is the Bondi radius of the
910  * \f$y=\f$ constant surface and \f$R(u,\theta,\phi)\f$ is the Bondi radius of
911  * the worldtube. The equation which determines \f$H\f$ on a surface of constant
912  * \f$u\f$ given \f$J\f$,\f$\beta\f$, \f$Q\f$, \f$U\f$, and \f$W\f$ on the same
913  * surface is written as
914  * \f[(1 - y) \partial_y H + H + (1 - y) J (\mathcal{D}_J H +
915  * \bar{\mathcal{D}}_J \bar{H}) = A_J + (1 - y) B_J.\f]
916  * The quantity \f$ (1 - y) J \bar{\mathcal{D}}_J\f$ is the linear factor
917  * for the non-conjugated \f$H\f$, and is computed from the equation:
918  * \f[\mathcal{D}_J = \frac{1}{4}(-2 \partial_y \bar{J} + \frac{\bar{J}
919  * \partial_y (J \bar{J})}{K^2})\f]
920  */
921 template <>
922 struct ComputeBondiIntegrand<Tags::LinearFactorForConjugate<Tags::BondiH>> {
923  public:
924  using pre_swsh_derivative_tags =
925  tmpl::list<Tags::Dy<Tags::BondiJ>, Tags::BondiJ>;
926  using swsh_derivative_tags = tmpl::list<>;
927  using integration_independent_tags = tmpl::list<Tags::OneMinusY>;
928  using temporary_tags =
929  tmpl::list<::Tags::SpinWeighted<::Tags::TempScalar<0, ComplexDataVector>,
931 
932  using return_tags =
933  tmpl::append<tmpl::list<Tags::LinearFactorForConjugate<Tags::BondiH>>,
934  temporary_tags>;
935  using argument_tags =
936  tmpl::append<pre_swsh_derivative_tags, swsh_derivative_tags,
937  integration_independent_tags>;
938 
939  template <typename... Args>
940  static void apply(
942  linear_factor_for_conjugate_h,
944  script_djbar,
945  const Args&... args) noexcept {
946  apply_impl(make_not_null(&get(*linear_factor_for_conjugate_h)),
947  make_not_null(&get(*script_djbar)), get(args)...);
948  }
949 
950  private:
951  static void apply_impl(
953  linear_factor_for_conjugate_h,
957  const SpinWeighted<ComplexDataVector, 0>& one_minus_y) noexcept;
958 };
959 } // namespace Cce
A prefix tag representing the product of two other tags. Note that if non-spin-weighted types are nee...
Definition: Tags.hpp:85
Bondi parameter .
Definition: Tags.hpp:56
Contains functionality for Cauchy Characteristic Extraction.
Definition: Equations.cpp:25
Bondi parameter .
Definition: Tags.hpp:20
Struct for labeling the spin-weighted derivative in tags.
Definition: SwshTags.hpp:44
The value .
Definition: Tags.hpp:236
Bondi parameter .
Definition: Tags.hpp:38
typename detail::integrand_terms_to_compute_for_bondi_variable_impl< BondiVariable >::type integrand_terms_to_compute_for_bondi_variable
A struct for providing a tmpl::list of integrand tags that need to be computed before integration can...
Definition: Equations.hpp:94
The Bondi radius is of the worldtube.
Definition: Tags.hpp:242
Prefix tag representing the spin-weighted derivative of a spin-weighted scalar.
Definition: SwshTags.hpp:130
Computes one of the inputs for the integration of one of the Characteristic hypersurface equations...
Definition: Equations.hpp:124
Coordinate value , which will be cached and sent to the implementing functions.
Definition: Tags.hpp:182
The value , where is Bondi radius of the worldtube.
Definition: Tags.hpp:197
Definition: Determinant.hpp:11
Given a Tag with a type of Tensor<VectorType, ...>, acts as a new version of the tag with type of Ten...
Definition: Tags.hpp:58
Make a spin-weighted type T with spin-weight Spin. Mathematical operators are restricted to addition...
Definition: SpinWeighted.hpp:25
Bondi parameter .
Definition: Tags.hpp:68
The value , where is Bondi radius of the worldtube.
Definition: Tags.hpp:204
Stores a collection of complex function values.
Definition: ComplexDataVector.hpp:47
The value .
Definition: Tags.hpp:230
Defines class Variables.
Definition: DataBoxTag.hpp:29
The derivative with respect to the numerical coordinate , where is Bondi radius of the worldtube...
Definition: Tags.hpp:88
Defines classes for Tensor.
constexpr auto apply(F &&f, const DataBox< BoxTags > &box, Args &&... args) noexcept
Apply the invokable f with argument Tags TagsList from DataBox box
Definition: DataBox.hpp:1623
Struct for labeling the spin-weighted derivative in tags.
Definition: SwshTags.hpp:25
Wraps the template metaprogramming library used (brigand)
Defines functions and classes from the GSL.
Struct for labeling the spin-weighted derivative in tags.
Definition: SwshTags.hpp:32
gsl::not_null< T * > make_not_null(T *ptr) noexcept
Construct a not_null from a pointer. Often this will be done as an implicit conversion, but it may be necessary to perform the conversion explicitly when type deduction is desired.
Definition: Gsl.hpp:879
Struct for labeling the spin-weighted derivative in tags.
Definition: SwshTags.hpp:40
Tensor< T, Symmetry<>, index_list<> > Scalar
Scalar type.
Definition: TypeAliases.hpp:21
Struct for labeling the spin-weighted derivative in tags.
Definition: SwshTags.hpp:29
Bondi parameter .
Definition: Tags.hpp:80
Require a pointer to not be a nullptr
Definition: ConservativeFromPrimitive.hpp:12
Bondi parameter .
Definition: Tags.hpp:50