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/VariablesTag.hpp"
9 : #include "Evolution/Systems/Cce/Tags.hpp"
10 : #include "Utilities/TMPL.hpp"
11 :
12 : /*!
13 : * \ingroup EvolutionSystemsGroup
14 : * \brief The set of utilities for performing Cauchy characteristic evolution
15 : * and Cauchy characteristic matching.
16 : *
17 : * \details Cauchy characteristic evolution (CCE) is a secondary nonlinear GR
18 : * evolution system that covers the domain extending from a spherical boundary
19 : * away from the strong-field regime, and extending all the way to future null
20 : * infinity \f$\mathcal I^+\f$. The evolution system is governed by five
21 : * hypersurface equations that are integrated radially along future null slices,
22 : * and one evolution equation that governs the evolution of one hypersurface to
23 : * the next.
24 : *
25 : * The mathematics of CCE are intricate, and SpECTRE's version implements a
26 : * number of tricks and improvements that are not yet present in other contexts.
27 : * For introductions to CCE generally, see papers \cite Bishop1997ik,
28 : * \cite Bishop1998uk, and \cite Barkett2019uae. Here we do not present a full
29 : * description of all of the mathematics, but instead just provide a high-level
30 : * roadmap of the SpECTRE utilities and how they come together in the CCE
31 : * system. This is intended as a map for maintainers of the codebase.
32 : *
33 : * First, worldtube data from a completed or running Cauchy evolution of the
34 : * Einstein field equations (currently the only one implemented in SpECTRE is
35 : * Generalized Harmonic) must be translated to Bondi spin-weighted scalars at
36 : * the extraction sphere. Relevant utilities for this conversion are
37 : * `Cce::WorldtubeDataManager`, `Cce::create_bondi_boundary_data`. Relevant
38 : * parts of the parallel infrastructure are `Cce::H5WorldtubeBoundary`,
39 : * `Cce::Actions::BoundaryComputeAndSendToEvolution`,
40 : * `Cce::Actions::RequestBoundaryData`, and
41 : * `Cce::Actions::ReceiveWorldtubeData`.
42 : *
43 : * The first hypersurface must be initialized with some reasonable starting
44 : * value for the evolved Bondi quantity \f$J\f$. There isn't a universal perfect
45 : * prescription for this, as a complete description would require, like the
46 : * Cauchy initial data problem, knowledge of the system arbitrarily far in the
47 : * past. A utility for assigning the initial data is `Cce::InitializeJ`.
48 : *
49 : * SpECTRE CCE is currently unique in implementing an additional gauge transform
50 : * after the worldtube boundary data is derived. This is performed to obtain an
51 : * asymptotically well-behaved gauge that is guaranteed to avoid logarithmic
52 : * behavior that has plagued other CCE implementations, and so that the
53 : * asymptotic computations can be as simple, fast, and reliable as possible.
54 : * Relevant utilities for the gauge transformation are
55 : * `Cce::GaugeAdjustedBoundaryValue` (see template specializations),
56 : * `Cce::GaugeUpdateTimeDerivatives`, `Cce::GaugeUpdateAngularFromCartesian`,
57 : * `Cce::GaugeUpdateJacobianFromCoordinates`, `Cce::GaugeUpdateInterpolator`,
58 : * `Cce::GaugeUpdateOmega`, `Cce::GaugeUpdateInertialTimeDerivatives`, and
59 : * `Cce::InitializeGauge`.
60 : *
61 : * Next, the CCE system must evaluate the hypersurface differential equations.
62 : * There are five, in sequence, deriving \f$\beta, Q, U, W,\f$ and \f$H\f$. For
63 : * each of the five radial differential equations, first the products and
64 : * derivatives on the right-hand side must be evaluated, then the full
65 : * right-hand side of the equation must be computed, and finally the radial
66 : * differential equation is integrated. The equations have a hierarchical
67 : * structure, so the result for \f$\beta\f$ feeds into the radial differential
68 : * equation for \f$Q\f$, and both feed into \f$U\f$, and so on.
69 : *
70 : * Relevant utilities for computing the inputs to the hypersurface equations are
71 : * `Cce::PrecomputeCceDependencies` (see template specializations),
72 : * `Cce::mutate_all_precompute_cce_dependencies`, `Cce::PreSwshDerivatives` (see
73 : * template specializations), `Cce::mutate_all_pre_swsh_derivatives_for_tag`,
74 : * and `Cce::mutate_all_swsh_derivatives_for_tag`. There are a number of
75 : * typelists in `IntegrandInputSteps.hpp` that determine the set of quantities
76 : * to be evaluated in each of the five hypersurface steps.
77 : * Once the hypersurface equation inputs are computed, then a hypersurface
78 : * equation right-hand side can be evaluated via `Cce::ComputeBondiIntegrand`
79 : * (see template specializations). Then, the hypersurface equation may be
80 : * integrated via `Cce::RadialIntegrateBondi` (see template specializations).
81 : *
82 : * Relevant parts of the parallel infrastructure for performing the hypersurface
83 : * steps are: `Cce::CharacteristicEvolution`,
84 : * `Cce::Actions::CalculateIntegrandInputsForTag`, and
85 : * `Cce::Actions::PrecomputeGlobalCceDependencies`. Note that most of the
86 : * algorithmic steps are laid out in order in the phase-dependent action list of
87 : * `Cce::CharacteristicEvolution`.
88 : *
89 : * The time integration for the hyperbolic part of the CCE equations is
90 : * performed via \f$\partial_u J = H\f$, where \f$\partial_u\f$ represents
91 : * differentiation with respect to retarded time at fixed numerical radius
92 : * \f$y\f$.
93 : *
94 : * At this point, all of the Bondi quantities on a given hypersurface have been
95 : * evaluated, and we wish to output the relevant waveform quantities at
96 : * \f$\mathcal I^+\f$. This acts much like an additional step in the
97 : * hypersurface sequence, with inputs that need to be calculated before the
98 : * quantities of interest can be evaluated. The action
99 : * `Cce::Actions::CalculateScriInputs` performs the sequence of steps to obtain
100 : * those inputs, and the utilities `Cce::CalculateScriPlusValue` (see template
101 : * specializations) can be used to evaluate the desired outputs at
102 : * \f$\mathcal I^+\f$.
103 : *
104 : * Unfortunately, those quantities at \f$\mathcal I^+\f$ are not yet an
105 : * appropriate waveform output, because the time coordinate with which they are
106 : * evaluated is the simulation time, not an asymptotically inertial time. So,
107 : * instead of directly writing the waveform outputs, we must put them in a queue
108 : * to be interpolated once enough data points have been accumulated to perform a
109 : * reliable interpolation at a consistent cut of \f$\mathcal I^+\f$ at constant
110 : * inertial time. Utilities for calculating and evolving the asymptotic inertial
111 : * time are `Cce::InitializeScriPlusValue` and `Cce::CalculateScriPlusValue`
112 : * using arguments involving `Cce::Tags::InertialRetardedTime`. A utility for
113 : * managing the interpolation is `Cce::ScriPlusInterpolationManager`, and
114 : * relevant parts of the parallel infrastructure for manipulating the data into
115 : * the interpolator and writing the results to disk are
116 : * `Cce::Actions::InsertInterpolationScriData` and
117 : * `Cce::Actions::ScriObserveInterpolated`.
118 : *
119 : * The template parameter `EvolveCcm` will add an extra evolved variable to the
120 : * characteristic system, namely `Cce::Tags::PartiallyFlatCartesianCoords`.
121 : *
122 : */
123 : namespace Cce {
124 :
125 : template <bool EvolveCcm>
126 0 : struct System {
127 0 : static constexpr bool evolve_ccm = EvolveCcm;
128 0 : static constexpr size_t volume_dim = 3;
129 :
130 0 : using evolved_swsh_tag = ::Tags::Variables<tmpl::list<Cce::Tags::BondiJ>>;
131 0 : using evolved_coordinates_variables_tag = ::Tags::Variables<
132 : tmpl::conditional_t<EvolveCcm,
133 : tmpl::list<Cce::Tags::CauchyCartesianCoords,
134 : Cce::Tags::PartiallyFlatCartesianCoords,
135 : Cce::Tags::InertialRetardedTime>,
136 : tmpl::list<Cce::Tags::CauchyCartesianCoords,
137 : Cce::Tags::InertialRetardedTime>>>;
138 :
139 0 : using variables_tag =
140 : tmpl::list<evolved_swsh_tag, evolved_coordinates_variables_tag>;
141 :
142 0 : static constexpr bool has_primitive_and_conservative_vars = false;
143 : };
144 : } // namespace Cce
|