Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <memory>
7 : #include <optional>
8 :
9 : #include "ControlSystem/ControlErrors/Size/State.hpp"
10 : #include "DataStructures/Tensor/TypeAliases.hpp"
11 : #include "Utilities/Gsl.hpp"
12 :
13 : /// \cond
14 : class DataVector;
15 : namespace ylm {
16 : template <typename Frame>
17 : class Strahlkorper;
18 : } // namespace ylm
19 : namespace domain::FunctionsOfTime {
20 : class FunctionOfTime;
21 : } // namespace domain::FunctionsOfTime
22 : namespace control_system::size {
23 : class Info;
24 : } // namespace control_system::size
25 : namespace intrp {
26 : class ZeroCrossingPredictor;
27 : } // namespace intrp
28 : /// \endcond
29 :
30 : namespace control_system::size {
31 : /*!
32 : * \brief A simple struct to hold diagnostic information about computing the
33 : * size control error.
34 : */
35 1 : struct ErrorDiagnostics {
36 0 : double control_error;
37 0 : size_t state_number;
38 0 : double min_delta_r;
39 0 : double min_relative_delta_r;
40 0 : double min_comoving_char_speed;
41 0 : double char_speed_crossing_time;
42 0 : double comoving_char_speed_crossing_time;
43 0 : double delta_r_crossing_time;
44 0 : double target_char_speed;
45 0 : double suggested_timescale;
46 0 : double damping_timescale;
47 0 : ControlErrorArgs control_error_args;
48 0 : std::string update_message;
49 0 : bool discontinuous_change_has_occurred;
50 : };
51 :
52 : /*!
53 : * \brief Computes the size control error, updating the stored info.
54 : *
55 : * \tparam Frame should be ::Frame::Distorted if ::Frame::Distorted exists.
56 : * \param info struct containing parameters that will be used/filled. Some of
57 : * the fields in info will guide the behavior of other control system
58 : * components like the averager and (possibly) the time step.
59 : * \param predictor_char_speed ZeroCrossingPredictor for the characteristic
60 : * speed.
61 : * \param predictor_comoving_char_speed ZeroCrossingPredictor for the
62 : * comoving characteristic speed.
63 : * \param predictor_delta_radius ZeroCrossingPredictor for the difference
64 : * in radius between the horizon and the excision boundary.
65 : * \param predictor_drift_limit_char_speed ZeroCrossingPredictor for the
66 : * difference between the characteristic speed and
67 : * min_allowed_char_speed.
68 : * \param predictor_drift_limit_delta_radius ZeroCrossingPredictor for the
69 : * difference between delta_radius and min_allowed_radial_distance.
70 : * \param time the current time.
71 : * \param control_error_delta_r the control error for the DeltaR state. This is
72 : * used in other states as well.
73 : * \param control_error_delta_r_outward the control error for the
74 : * DeltaRDriftOutward state. If std::nullopt, then DeltaRDriftOutward
75 : * will not be used.
76 : * \param max_allowed_radial_distance the maximum average radial distance
77 : * between the horizon and the excision boundary that is allowed without
78 : * triggering the DeltaRDriftOutward state. If std::nullopt, then
79 : * DeltaRDriftOutward will not be used.
80 : * \param inward_drift_velocity a velocity that determines how fast the
81 : * excision boundary drifts inward in state DeltaRDriftInward. If
82 : * std::nullopt, then DeltaRDriftInward will not be used.
83 : * \param min_allowed_radial_distance the minimum average radial distance
84 : * between the horizon and the excision boundary that is allowed without
85 : * triggering the DeltaRDriftInward state. If std::nullopt, then
86 : * DeltaRDriftInward will not be used.
87 : * \param min_allowed_char_speed the minimum characteristic speed on the
88 : * excision boundary that is allowed without triggering the
89 : * DeltaRDriftInward state. If std::nullopt, then
90 : * DeltaRDriftInward will not be used.
91 : * \param horizon_00 The l=0,m=0 component of the spherepack decomposition
92 : * of the apparent horizon. This is passed separately from the
93 : * full apparent_horizon below because horizon_00 is time-averaged.
94 : * \param dt_lambda_00 the time derivative of the map parameter lambda_00
95 : * \param apparent_horizon the current horizon in frame Frame.
96 : * \param excision_boundary a Strahlkorper representing the excision
97 : * boundary in frame Frame. Note that the excision boundary is assumed
98 : * to be a sphere in the grid frame.
99 : * \param lapse_on_excision_boundary Lapse on the excision boundary.
100 : * \param frame_components_of_grid_shift The quantity
101 : * \f$\beta^i \frac{\partial x^\hat{i}}{\partial x_i}\f$ (see below)
102 : * evaluated on the excision boundary. This is a tensor in frame
103 : * Frame.
104 : * \param spatial_metric_on_excision_boundary metric in frame Frame.
105 : * \param inverse_spatial_metric_on_excision_boundary metric in frame Frame.
106 : * \param deriv_comoving_char_speed the derivative of the comoving char
107 : * speed with respect to the map parameter lambda_00.
108 : * \return Returns an `ErrorDiagnostics` object which, in addition to the actual
109 : * control error, holds a lot of diagnostic information about how the
110 : * control error was calculated. This information could be used to print
111 : * to a file if desired.
112 : *
113 : * The characteristic speed that is needed here is
114 : * \f{align}
115 : * v &= -\alpha -n_i\beta^i \\
116 : * v &= -\alpha -n_\hat{i}\hat{\beta}^\hat{i}
117 : * - n_\hat{i}\frac{\partial x^\hat{i}}{\partial t} \\
118 : * v &= -\alpha -n_\bar{i}\bar{\beta}^\bar{i}
119 : * - n_\bar{i}\frac{\partial x^\bar{i}}{\partial t} \\
120 : * v &= -\alpha - n_\hat{i}
121 : * \frac{\partial x^\hat{i}}{\partial x^i} \beta^i,
122 : * \f}
123 : * where we have written many equivalent forms in terms of quantities
124 : * defined in different frames.
125 : *
126 : * Here \f$\alpha\f$ is the lapse, which is invariant under frame
127 : * transformations, \f$n_i\f$, \f$n_\hat{i}\f$, and \f$n_\bar{i}\f$
128 : * are the metric-normalized normal one-form to the Strahlkorper in the
129 : * grid, distorted, and inertial frames, and
130 : * \f$\beta^i\f$, \f$\hat{\beta}^\hat{i}\f$, and \f$\bar{\beta}^\bar{i}\f$
131 : * are the shift in the grid, distorted, and inertial frames.
132 : *
133 : * Note that we decorate the shift with hats and bars in addition to
134 : * decorating its index, because the shift transforms in a non-obvious
135 : * way under frame transformations so it is easy to make mistakes.
136 : * To be clear, these different shifts are defined by
137 : * \f{align}
138 : * \beta^i &= \alpha^2 g^{0i},\\
139 : * \hat{\beta}^\hat{i} &= \alpha^2 g^{\hat{0}\hat{i}},\\
140 : * \bar{\beta}^\bar{i} &= \alpha^2 g^{\bar{0}\bar{i}},
141 : * \f}
142 : * where \f$g^{ab}\f$ is the spacetime metric, and they transform like
143 : * \f{align}
144 : * \hat{\beta}^\hat{i} &= \beta^i \frac{\partial x^\hat{i}}{\partial x^i}-
145 : * \frac{\partial x^\hat{i}}{\partial t}.
146 : * \f}
147 : *
148 : * The quantity we pass as frame_components_of_grid_shift is
149 : * \f{align}
150 : * \beta^i \frac{\partial x^\hat{i}}{\partial x^i}
151 : * &= \hat{\beta}^\hat{i} + \frac{\partial x^\hat{i}}{\partial t} \\
152 : * &= \bar{\beta}^\bar{j}\frac{\partial x^\hat{i}}{\partial x^i}
153 : * \frac{\partial x^i}{\partial x^\bar{j}} +
154 : * \frac{\partial x^\hat{i}}{\partial x^\bar{j}}
155 : * \frac{\partial x^\bar{j}}{\partial t},
156 : * \f}
157 : * where we have listed several equivalent formulas that involve quantities
158 : * in different frames.
159 : */
160 : template <typename Frame>
161 1 : ErrorDiagnostics control_error(
162 : gsl::not_null<Info*> info,
163 : gsl::not_null<intrp::ZeroCrossingPredictor*> predictor_char_speed,
164 : gsl::not_null<intrp::ZeroCrossingPredictor*>
165 : predictor_comoving_char_speed,
166 : gsl::not_null<intrp::ZeroCrossingPredictor*> predictor_delta_radius,
167 : gsl::not_null<intrp::ZeroCrossingPredictor*>
168 : predictor_drift_limit_char_speed,
169 : gsl::not_null<intrp::ZeroCrossingPredictor*>
170 : predictor_drift_limit_delta_radius,
171 : double time, double control_error_delta_r,
172 : std::optional<double> control_error_delta_r_outward,
173 : std::optional<double> max_allowed_radial_distance,
174 : std::optional<double> inward_drift_velocity,
175 : std::optional<double> min_allowed_radial_distance,
176 : std::optional<double> min_allowed_char_speed, double horizon_00,
177 : double dt_lambda_00, const ylm::Strahlkorper<Frame>& apparent_horizon,
178 : const ylm::Strahlkorper<Frame>& excision_boundary,
179 : const Scalar<DataVector>& lapse_on_excision_boundary,
180 : const tnsr::I<DataVector, 3, Frame>& frame_components_of_grid_shift,
181 : const tnsr::ii<DataVector, 3, Frame>& spatial_metric_on_excision_boundary,
182 : const tnsr::II<DataVector, 3, Frame>&
183 : inverse_spatial_metric_on_excision_boundary,
184 : const Scalar<DataVector>& deriv_comoving_char_speed);
185 :
186 : } // namespace control_system::size
|