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