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/DataBox/Prefixes.hpp"
7 : #include "DataStructures/DataBox/Tag.hpp"
8 : #include "DataStructures/DataBox/TagName.hpp"
9 : #include "DataStructures/SpinWeighted.hpp"
10 : #include "DataStructures/Tensor/Tensor.hpp"
11 : #include "DataStructures/Tensor/TypeAliases.hpp"
12 : #include "Evolution/Systems/Cce/InterfaceManagers/GhInterfaceManager.hpp"
13 : #include "Evolution/Systems/Cce/InterfaceManagers/GhLockstep.hpp"
14 : #include "NumericalAlgorithms/SpinWeightedSphericalHarmonics/SwshTags.hpp"
15 :
16 : namespace Cce {
17 :
18 : /// \cond
19 : struct MetricWorldtubeDataManager;
20 : template <typename ToInterpolate, typename Tag>
21 : struct ScriPlusInterpolationManager;
22 : /// \endcond
23 :
24 : /// Tags for Cauchy Characteristic Extraction routines
25 : namespace Tags {
26 :
27 : // Bondi parameter tags
28 :
29 : /// Bondi parameter \f$\beta\f$
30 1 : struct BondiBeta : db::SimpleTag {
31 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
32 : };
33 :
34 : /// Bondi parameter \f$J\f$
35 1 : struct BondiJ : db::SimpleTag {
36 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 2>>;
37 0 : static std::string name() { return "J"; }
38 : };
39 :
40 : // The scalar field in scalar-tensor theory
41 0 : struct KleinGordonPsi : db::SimpleTag {
42 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
43 0 : static std::string name() { return "KGPsi"; }
44 : };
45 :
46 : } // namespace Tags
47 : } // namespace Cce
48 :
49 : namespace Tags {
50 : /// \cond
51 : template <>
52 : struct dt<Cce::Tags::BondiJ> : db::PrefixTag, db::SimpleTag {
53 : static std::string name() { return "H"; }
54 : using type = Scalar<::SpinWeighted<ComplexDataVector, 2>>;
55 : using tag = Cce::Tags::BondiJ;
56 : };
57 :
58 : template <>
59 : struct dt<Cce::Tags::KleinGordonPsi> : db::PrefixTag, db::SimpleTag {
60 : static std::string name() { return "KGPi"; }
61 : using type = Scalar<::SpinWeighted<ComplexDataVector, 0>>;
62 : using tag = Cce::Tags::KleinGordonPsi;
63 : };
64 : /// \endcond
65 : } // namespace Tags
66 :
67 : namespace Cce {
68 : namespace Tags {
69 : /// \brief Bondi parameter \f$H = \partial_u J\f$.
70 : /// \note The notation in the literature is not consistent regarding this
71 : /// quantity, or whether it is denoted by an \f$H\f$ at all. The SpECTRE CCE
72 : /// module consistently uses it to describe the (retarded) partial time
73 : /// derivative of \f$J\f$ at fixed compactified radius \f$y\f$ (to be contrasted
74 : /// with the physical Bondi radius, which is not directly used for numerical
75 : /// grids).
76 1 : using BondiH = ::Tags::dt<BondiJ>;
77 :
78 : /// \brief Klein-Gordon variable \f$\Pi = \partial_u \psi\f$.
79 1 : using KleinGordonPi = ::Tags::dt<KleinGordonPsi>;
80 :
81 : /// Bondi parameter \f$\bar{J}\f$
82 1 : struct BondiJbar : db::SimpleTag {
83 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -2>>;
84 0 : static std::string name() { return "Jbar"; }
85 : };
86 :
87 : /// Bondi parameter \f$K = \sqrt{1 + J \bar{J}}\f$
88 1 : struct BondiK : db::SimpleTag {
89 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
90 0 : static std::string name() { return "K"; }
91 : };
92 :
93 : /// Bondi parameter \f$Q\f$
94 1 : struct BondiQ : db::SimpleTag {
95 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 1>>;
96 0 : static std::string name() { return "Q"; }
97 : };
98 :
99 : /// Bondi parameter \f$\bar{Q}\f$
100 1 : struct BondiQbar : db::SimpleTag {
101 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -1>>;
102 0 : static std::string name() { return "Qbar"; }
103 : };
104 :
105 : /// Bondi parameter \f$U\f$
106 1 : struct BondiU : db::SimpleTag {
107 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 1>>;
108 0 : static std::string name() { return "U"; }
109 : };
110 :
111 : /// The surface quantity of Bondi \f$U\f$ evaluated at the null spacetime
112 : /// boundary \f$\mathcal I^+\f$
113 1 : struct BondiUAtScri : db::SimpleTag {
114 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 1>>;
115 : };
116 :
117 : /// Bondi parameter \f$\bar{U}\f$
118 1 : struct BondiUbar : db::SimpleTag {
119 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -1>>;
120 0 : static std::string name() { return "Ubar"; }
121 : };
122 :
123 : /// Bondi parameter \f$W\f$
124 1 : struct BondiW : db::SimpleTag {
125 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
126 0 : static std::string name() { return "W"; }
127 : };
128 :
129 : /// Bondi parameter \f$\bar{J}\f$ in the Cauchy frame
130 1 : struct BondiJCauchyView : db::SimpleTag {
131 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 2>>;
132 : };
133 :
134 : /// The derivative with respect to the numerical coordinate \f$y = 1 - 2R/r\f$,
135 : /// where \f$R(u, \theta, \phi)\f$ is Bondi radius of the worldtube.
136 : template <typename Tag>
137 1 : struct Dy : db::PrefixTag, db::SimpleTag {
138 0 : using type = Scalar<SpinWeighted<ComplexDataVector, Tag::type::type::spin>>;
139 0 : using tag = Tag;
140 0 : static const size_t dimension_to_differentiate = 2;
141 : };
142 :
143 : /// The derivative with respect to Bondi \f$r\f$
144 : template <typename Tag>
145 1 : struct Dr : db::PrefixTag, db::SimpleTag {
146 0 : using type = typename Tag::type;
147 0 : using tag = Tag;
148 : };
149 :
150 : /// The derivative with respect to \f$\lambda\f$,
151 : /// where \f$\lambda\f$ is an affine parameter along \f$l\f$, see
152 : /// Eq. (19a) of \cite Moxon2020gha.
153 : template <typename Tag>
154 1 : struct Dlambda : db::PrefixTag, db::SimpleTag {
155 0 : using type = typename Tag::type;
156 0 : using tag = Tag;
157 : };
158 :
159 : /// The derivative with respect to Bondi retarded time \f$u\f$.
160 : ///
161 : /// \note The worldtube boundary tag `Du<Dr<BondiJ>>` is the time derivative
162 : /// *following the worldtube* (at constant numerical coordinate
163 : /// \f$\breve y = -1\f$), i.e.
164 : /// \f$\partial_{\breve u}\partial_r J = \frac{d}{d u}(\partial_r J)\f$, not a
165 : /// derivative at constant Bondi \f$r\f$. See
166 : /// `BondiWorldtubeDataManager::populate_boundary_du_dr_j` and the fixed-\f$y\f$
167 : /// vs. fixed-\f$r\f$ notes in `BoundaryData.hpp`.
168 : template <typename Tag>
169 1 : struct Du : db::PrefixTag, db::SimpleTag {
170 0 : using type = Scalar<SpinWeighted<ComplexDataVector, Tag::type::type::spin>>;
171 0 : using tag = Tag;
172 : };
173 :
174 : /// The spin-weight 2 angular Jacobian factor in the partially flat Bondi-like
175 : /// coordinates, see Eq. (31a) of \cite Moxon2020gha
176 1 : struct PartiallyFlatGaugeC : db::SimpleTag {
177 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 2>>;
178 : };
179 :
180 : /// The spin-weight 0 angular Jacobian factor in the partially flat Bondi-like
181 : /// coordinates, see Eq. (31b) of \cite Moxon2020gha
182 1 : struct PartiallyFlatGaugeD : db::SimpleTag {
183 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
184 : };
185 :
186 : /// The spin-weight 2 angular Jacobian factor in the Cauchy coordinates, similar
187 : /// to Eq. (31a) of \cite Moxon2020gha, but without hat.
188 1 : struct CauchyGaugeC : db::SimpleTag {
189 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 2>>;
190 : };
191 :
192 : /// The spin-weight 0 angular Jacobian factor in the Cauchy coordinates, similar
193 : /// to Eq. (31b) of \cite Moxon2020gha, but without hat.
194 1 : struct CauchyGaugeD : db::SimpleTag {
195 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
196 : };
197 :
198 : /// The conformal factor in the partially flat Bondi-like coordinates,
199 : /// associated with an angular transformation, see Eq. (32) of
200 : /// \cite Moxon2020gha
201 1 : struct PartiallyFlatGaugeOmega : db::SimpleTag {
202 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
203 : };
204 :
205 : /// The conformal factor in the Cauchy coordinates, similar to Eq. (32) of
206 : /// \cite Moxon2020gha, but without hat.
207 1 : struct CauchyGaugeOmega : db::SimpleTag {
208 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
209 : };
210 :
211 0 : struct News : db::SimpleTag {
212 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -2>>;
213 : };
214 :
215 : // For expressing the Cauchy angular coordinates for the worldtube data in terms
216 : // of the evolution angular coordinates.
217 0 : struct CauchyAngularCoords : db::SimpleTag {
218 0 : using type = tnsr::i<DataVector, 2, ::Frame::Spherical<::Frame::Inertial>>;
219 : };
220 :
221 : /// The angular coordinates for the partially flat Bondi-like coordinates.
222 1 : struct PartiallyFlatAngularCoords : db::SimpleTag {
223 0 : using type = tnsr::i<DataVector, 2, ::Frame::Spherical<::Frame::Inertial>>;
224 : };
225 :
226 : // For expressing the Cauchy Cartesian coordinates for the worldtube data in
227 : // terms of the evolution angular coordinates.
228 0 : struct CauchyCartesianCoords : db::SimpleTag {
229 0 : using type = tnsr::i<DataVector, 3>;
230 : };
231 :
232 : /// The partially flat Bondi-like coordinates.
233 1 : struct PartiallyFlatCartesianCoords : db::SimpleTag {
234 0 : using type = tnsr::i<DataVector, 3>;
235 : };
236 :
237 : /// The asymptotically inertial retarded time in terms of the evolution time
238 : /// variable
239 1 : struct InertialRetardedTime : db::SimpleTag {
240 0 : using type = Scalar<DataVector>;
241 : };
242 :
243 : /// Represents \f$\eth u_{\rm inertial}\f$, which is a useful quantity for
244 : /// asymptotic coordinate transformations.
245 1 : struct EthInertialRetardedTime : db::SimpleTag {
246 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 1>>;
247 : };
248 :
249 : /// Complex storage form for the asymptotically inertial retarded time, for
250 : /// taking spin-weighted derivatives
251 1 : struct ComplexInertialRetardedTime : db::SimpleTag {
252 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
253 : };
254 :
255 : // prefix tags associated with the integrands which are used as input to solvers
256 : // for the CCE equations
257 :
258 : /// A prefix tag representing a quantity that will appear on the right-hand side
259 : /// of an explicitly regular differential equation
260 : template <typename Tag>
261 1 : struct Integrand : db::PrefixTag, db::SimpleTag {
262 0 : using type = Scalar<SpinWeighted<ComplexDataVector, Tag::type::type::spin>>;
263 0 : using tag = Tag;
264 : };
265 :
266 : /// A prefix tag representing the boundary data for a quantity on the extraction
267 : /// surface.
268 : template <typename Tag>
269 1 : struct BoundaryValue : db::PrefixTag, db::SimpleTag {
270 0 : using type = Scalar<SpinWeighted<ComplexDataVector, Tag::type::type::spin>>;
271 0 : using tag = Tag;
272 : };
273 :
274 : /// A prefix tag representing the gauge-transformed boundary data for a quantity
275 : /// on the extraction surface.
276 : template <typename Tag>
277 1 : struct EvolutionGaugeBoundaryValue : db::PrefixTag, db::SimpleTag {
278 0 : using type = Scalar<SpinWeighted<ComplexDataVector, Tag::type::type::spin>>;
279 0 : using tag = Tag;
280 : };
281 :
282 : /// A prefix tag representing the coefficient of a pole part of the right-hand
283 : /// side of a singular differential equation
284 : template <typename Tag>
285 1 : struct PoleOfIntegrand : db::PrefixTag, db::SimpleTag {
286 0 : using type = Scalar<SpinWeighted<ComplexDataVector, Tag::type::type::spin>>;
287 0 : using tag = Tag;
288 : };
289 :
290 : /// A prefix tag representing the regular part of the right-hand side of a
291 : /// regular differential equation
292 : template <typename Tag>
293 1 : struct RegularIntegrand : db::PrefixTag, db::SimpleTag {
294 0 : using type = Scalar<SpinWeighted<ComplexDataVector, Tag::type::type::spin>>;
295 0 : using tag = Tag;
296 : };
297 :
298 : /// A prefix tag representing a linear factor that acts on `Tag`. To determine
299 : /// the spin weight, It is assumed that the linear factor plays the role of
300 : /// \f$L\f$ in an equation of the form,
301 : /// \f$ (y - 1) \partial_y H + L H + L^\prime \bar{H} = A + (1 - y) B \f$
302 : template <typename Tag>
303 1 : struct LinearFactor : db::PrefixTag, db::SimpleTag {
304 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
305 0 : using tag = Tag;
306 : };
307 :
308 : /// A prefix tag representing a linear factor that acts on `Tag`. To determine
309 : /// the spin weight, it is assumed that the linear factor plays the role of
310 : /// \f$L^\prime\f$ in an equation of the form,
311 : /// \f$ (y - 1) \partial_y H + L H + L^\prime \bar{H} = A + (1 - y) B \f$
312 : template <typename Tag>
313 1 : struct LinearFactorForConjugate : db::PrefixTag, db::SimpleTag {
314 0 : using type =
315 : Scalar<SpinWeighted<ComplexDataVector, 2 * Tag::type::type::spin>>;
316 0 : using tag = Tag;
317 : };
318 :
319 : // Below are additional tags for values which are frequently used in CCE
320 : // calculations, and therefore worth caching
321 :
322 : /// Coordinate value \f$(1 - y)\f$, which will be cached and sent to the
323 : /// implementing functions
324 1 : struct OneMinusY : db::SimpleTag {
325 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
326 : };
327 :
328 : /// A tag for the first time derivative of the worldtube parameter
329 : /// \f$\partial_u R\f$, where \f$R(u, \theta, \phi)\f$ is Bondi
330 : /// radius of the worldtube.
331 1 : struct DuR : db::SimpleTag {
332 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
333 : };
334 :
335 : /// The value \f$\partial_u R / R\f$, where \f$R(u, \theta, \phi)\f$ is Bondi
336 : /// radius of the worldtube.
337 1 : struct DuRDividedByR : db::SimpleTag {
338 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
339 : };
340 :
341 : /// The value \f$\eth R / R\f$, where \f$R(u, \theta, \phi)\f$ is Bondi
342 : /// radius of the worldtube.
343 1 : struct EthRDividedByR : db::SimpleTag {
344 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 1>>;
345 0 : using derivative_kind = Spectral::Swsh::Tags::Eth;
346 0 : static constexpr int spin = 1;
347 : };
348 :
349 : /// The value \f$\eth \eth R / R\f$, where \f$R(u, \theta, \phi)\f$ is Bondi
350 : /// radius of the worldtube.
351 1 : struct EthEthRDividedByR : db::SimpleTag {
352 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 2>>;
353 0 : using derivative_kind = Spectral::Swsh::Tags::EthEth;
354 0 : static constexpr int spin = 2;
355 : };
356 :
357 : /// The value \f$\eth \bar{\eth} R / R\f$, where \f$R(u, \theta, \phi)\f$ is
358 : /// Bondi radius of the worldtube.
359 1 : struct EthEthbarRDividedByR : db::SimpleTag {
360 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
361 0 : using derivative_kind = Spectral::Swsh::Tags::EthEthbar;
362 0 : static constexpr int spin = 0;
363 : };
364 :
365 : /// The value \f$\exp(2\beta)\f$.
366 1 : struct Exp2Beta : db::SimpleTag {
367 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
368 : };
369 :
370 : /// The value \f$ \bar{J} (Q - 2 \eth \beta ) \f$.
371 1 : struct JbarQMinus2EthBeta : db::SimpleTag {
372 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -1>>;
373 : };
374 :
375 : /// The Bondi radius \f$R(u, \theta, \phi)\f$ is of the worldtube.
376 1 : struct BondiR : db::SimpleTag {
377 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
378 0 : static std::string name() { return "R"; }
379 : };
380 :
381 0 : struct EndTime : db::SimpleTag {
382 0 : using type = double;
383 : };
384 :
385 0 : struct StartTime : db::SimpleTag {
386 0 : using type = double;
387 : };
388 :
389 0 : using LMax = Spectral::Swsh::Tags::LMax;
390 0 : using NumberOfRadialPoints = Spectral::Swsh::Tags::NumberOfRadialPoints;
391 :
392 : /// The (adapted) Newman-Penrose spin coefficient $\alpha^{SW}$. See
393 : /// documentation of `newman_penrose_alpha()` for definition.
394 1 : struct NewmanPenroseAlpha : db::SimpleTag {
395 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -1>>;
396 : };
397 :
398 : /// The (adapted) Newman-Penrose spin coefficient $\beta_{NP}^{SW}$. See
399 : /// documentation of `newman_penrose_beta()` for definition.
400 1 : struct NewmanPenroseBeta : db::SimpleTag {
401 0 : using type = Scalar<SpinWeighted<ComplexDataVector, +1>>;
402 : };
403 :
404 : /// The (adapted) Newman-Penrose spin coefficient $\gamma^{SW}$. See
405 : /// documentation of `newman_penrose_gamma()` for definition.
406 1 : struct NewmanPenroseGamma : db::SimpleTag {
407 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
408 : };
409 :
410 : /// The (adapted) Newman-Penrose spin coefficient $\epsilon^{SW}$. See
411 : /// documentation of `newman_penrose_epsilon()` for definition.
412 1 : struct NewmanPenroseEpsilon : db::SimpleTag {
413 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
414 : };
415 :
416 : /// The Newman-Penrose spin coefficient $\kappa$. In the choice of tetrad of
417 : /// \cite Moxon2020gha, $\kappa=0$. Therefore, this tag should never actually be
418 : /// used. It is declared here so it does not seem like it is "missing", and to
419 : /// document that any calculation involving $\kappa$ should be simplified with
420 : /// $\kappa=0$.
421 1 : struct NewmanPenroseKappa : db::SimpleTag {
422 0 : using type = Scalar<SpinWeighted<ComplexDataVector, +1>>;
423 : };
424 :
425 : /// The Newman-Penrose spin coefficient $\tau$. See documentation of
426 : /// `newman_penrose_tau()` for definition.
427 1 : struct NewmanPenroseTau : db::SimpleTag {
428 0 : using type = Scalar<SpinWeighted<ComplexDataVector, +1>>;
429 : };
430 :
431 : /// The Newman-Penrose spin coefficient $\sigma$. See documentation of
432 : /// `newman_penrose_sigma()` for definition.
433 1 : struct NewmanPenroseSigma : db::SimpleTag {
434 0 : using type = Scalar<SpinWeighted<ComplexDataVector, +2>>;
435 : };
436 :
437 : /// The Newman-Penrose spin coefficient $\rho$. See documentation of
438 : /// `newman_penrose_rho()` for definition.
439 1 : struct NewmanPenroseRho : db::SimpleTag {
440 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
441 : };
442 :
443 : /// The Newman-Penrose spin coefficient $\pi$. See documentation of
444 : /// `newman_penrose_pi()` for definition.
445 1 : struct NewmanPenrosePi : db::SimpleTag {
446 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -1>>;
447 : };
448 :
449 : /// The Newman-Penrose spin coefficient $\nu$. See documentation of
450 : /// `newman_penrose_nu()` for definition.
451 1 : struct NewmanPenroseNu : db::SimpleTag {
452 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -1>>;
453 : };
454 :
455 : /// The Newman-Penrose spin coefficient $\mu$. See documentation of
456 : /// `newman_penrose_mu()` for definition.
457 1 : struct NewmanPenroseMu : db::SimpleTag {
458 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
459 : };
460 :
461 : /// The Newman-Penrose spin coefficient $\lambda$. See documentation of
462 : /// `newman_penrose_lambda()` for definition.
463 1 : struct NewmanPenroseLambda : db::SimpleTag {
464 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -2>>;
465 : };
466 :
467 : /// The Weyl scalar \f$\Psi_0\f$
468 1 : struct Psi0 : db::SimpleTag {
469 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 2>>;
470 : };
471 :
472 : /// The Weyl scalar \f$\Psi_0\f$ for matching (in the Cauchy frame)
473 1 : struct Psi0Match : db::SimpleTag {
474 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 2>>;
475 : };
476 : /// The Weyl scalar \f$\Psi_1\f$
477 1 : struct Psi1 : db::SimpleTag {
478 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 1>>;
479 : };
480 :
481 : /// The Weyl scalar \f$\Psi_2\f$
482 1 : struct Psi2 : db::SimpleTag {
483 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
484 : };
485 :
486 : /// The Weyl scalar \f$\Psi_3\f$
487 1 : struct Psi3 : db::SimpleTag {
488 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -1>>;
489 : };
490 :
491 : /// The Weyl scalar \f$\Psi_4\f$
492 1 : struct Psi4 : db::SimpleTag {
493 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -2>>;
494 : };
495 :
496 : /// The gravitational wave strain \f$h\f$
497 1 : struct Strain : db::SimpleTag {
498 0 : using type = Scalar<SpinWeighted<ComplexDataVector, -2>>;
499 : };
500 :
501 : /// A prefix tag representing the time integral of the value it prefixes
502 : template <typename Tag>
503 1 : struct TimeIntegral : db::PrefixTag, db::SimpleTag {
504 0 : using type = Scalar<SpinWeighted<ComplexDataVector, Tag::type::type::spin>>;
505 0 : using tag = Tag;
506 : };
507 :
508 : /// A prefix tag representing the value at \f$\mathcal I^+\f$
509 : template <typename Tag>
510 1 : struct ScriPlus : db::PrefixTag, db::SimpleTag {
511 0 : using type = Scalar<SpinWeighted<ComplexDataVector, Tag::type::type::spin>>;
512 0 : using tag = Tag;
513 : };
514 :
515 : /// A prefix tag representing an additional correction factor necessary to
516 : /// compute the quantity at \f$\mathcal I^+\f$
517 : template <typename Tag>
518 1 : struct ScriPlusFactor : db::PrefixTag, db::SimpleTag {
519 0 : using type = Scalar<SpinWeighted<ComplexDataVector, 0>>;
520 0 : using tag = Tag;
521 : };
522 :
523 : /// A prefix tag representing Klein-Gordon sources in Cce hypersurface equations
524 : template <typename Tag>
525 1 : struct KleinGordonSource : db::PrefixTag, db::SimpleTag {
526 0 : using type = Scalar<SpinWeighted<ComplexDataVector, Tag::type::type::spin>>;
527 0 : using tag = Tag;
528 : };
529 :
530 : template <typename ToInterpolate, typename ObservationTag>
531 0 : struct InterpolationManager : db::SimpleTag {
532 0 : using type = ScriPlusInterpolationManager<ToInterpolate, ObservationTag>;
533 0 : static std::string name() {
534 : return "InterpolationManager(" + db::tag_name<ObservationTag>() + ")";
535 : }
536 : };
537 :
538 : /// During self-start, we must be in lockstep with the GH system (if running
539 : /// concurrently), because the step size is unchangable during self-start.
540 1 : struct SelfStartGhInterfaceManager : db::SimpleTag {
541 0 : using type = InterfaceManagers::GhLockstep;
542 0 : using option_tags = tmpl::list<>;
543 :
544 0 : static constexpr bool pass_metavariables = false;
545 0 : static InterfaceManagers::GhLockstep create_from_options() {
546 : return Cce::InterfaceManagers::GhLockstep();
547 : }
548 : };
549 : } // namespace Tags
550 : } // namespace Cce
|