8 #include "DataStructures/ComplexDataVector.hpp"
10 #include "DataStructures/DataVector.hpp"
11 #include "DataStructures/SpinWeighted.hpp"
12 #include "DataStructures/Tags/TempTensor.hpp"
16 #include "Evolution/Systems/Cce/BoundaryData.hpp"
17 #include "Evolution/Systems/Cce/BoundaryDataTags.hpp"
18 #include "Evolution/Systems/Cce/Tags.hpp"
19 #include "NumericalAlgorithms/Spectral/SwshCollocation.hpp"
20 #include "NumericalAlgorithms/Spectral/SwshDerivatives.hpp"
21 #include "PointwiseFunctions/GeneralRelativity/GeneralizedHarmonic/Phi.hpp"
22 #include "PointwiseFunctions/GeneralRelativity/SpacetimeMetric.hpp"
23 #include "PointwiseFunctions/GeneralRelativity/TimeDerivativeOfSpacetimeMetric.hpp"
36 void cartesian_spatial_metric_and_derivatives_from_unnormalized_spec_modes(
37 gsl::not_null<tnsr::ii<DataVector, 3>*> cartesian_spatial_metric,
38 gsl::not_null<tnsr::II<DataVector, 3>*> inverse_cartesian_spatial_metric,
39 gsl::not_null<tnsr::ijj<DataVector, 3>*> d_cartesian_spatial_metric,
40 gsl::not_null<tnsr::ii<DataVector, 3>*> dt_cartesian_spatial_metric,
42 interpolation_modal_buffer,
47 const tnsr::ii<ComplexModalVector, 3>& spatial_metric_coefficients,
48 const tnsr::ii<ComplexModalVector, 3>& dr_spatial_metric_coefficients,
49 const tnsr::ii<ComplexModalVector, 3>& dt_spatial_metric_coefficients,
50 const CartesianiSphericalJ& inverse_cartesian_to_spherical_jacobian,
51 const tnsr::I<DataVector, 3>& unit_cartesian_coords,
size_t l_max) noexcept;
61 void cartesian_shift_and_derivatives_from_unnormalized_spec_modes(
66 interpolation_modal_buffer,
70 const tnsr::I<ComplexModalVector, 3>& shift_coefficients,
71 const tnsr::I<ComplexModalVector, 3>& dr_shift_coefficients,
72 const tnsr::I<ComplexModalVector, 3>& dt_shift_coefficients,
73 const CartesianiSphericalJ& inverse_cartesian_to_spherical_jacobian,
75 size_t l_max) noexcept;
85 void cartesian_lapse_and_derivatives_from_unnormalized_spec_modes(
90 interpolation_modal_buffer,
97 const CartesianiSphericalJ& inverse_cartesian_to_spherical_jacobian,
99 size_t l_max) noexcept;
155 template <
typename TagList>
157 const gsl::not_null<Variables<TagList>*> bondi_boundary_data,
158 const tnsr::ii<ComplexModalVector, 3>& spatial_metric_coefficients,
159 const tnsr::ii<ComplexModalVector, 3>& dt_spatial_metric_coefficients,
160 const tnsr::ii<ComplexModalVector, 3>& dr_spatial_metric_coefficients,
161 const tnsr::I<ComplexModalVector, 3>& shift_coefficients,
162 const tnsr::I<ComplexModalVector, 3>& dt_shift_coefficients,
163 const tnsr::I<ComplexModalVector, 3>& dr_shift_coefficients,
167 const double extraction_radius,
const size_t l_max) noexcept {
177 Variables<tmpl::list<
178 Tags::detail::CosPhi, Tags::detail::CosTheta, Tags::detail::SinPhi,
179 Tags::detail::SinTheta, Tags::detail::CartesianCoordinates,
180 Tags::detail::CartesianToSphericalJacobian,
181 Tags::detail::InverseCartesianToSphericalJacobian,
204 Tags::detail::AngularDNullL,
205 Tags::detail::DLambda<
207 Tags::detail::DLambda<
211 Tags::detail::DLambda<Tags::detail::DLambda<Tags::detail::RealBondiR>>,
215 computation_variables{size};
218 tmpl::list<::Tags::SpinWeighted<::Tags::TempScalar<0, ComplexDataVector>,
222 derivative_buffers{size};
223 auto& cos_phi = get<Tags::detail::CosPhi>(computation_variables);
224 auto& cos_theta = get<Tags::detail::CosTheta>(computation_variables);
225 auto& sin_phi = get<Tags::detail::SinPhi>(computation_variables);
226 auto& sin_theta = get<Tags::detail::SinTheta>(computation_variables);
227 trigonometric_functions_on_swsh_collocation(
238 auto& cartesian_coords =
239 get<Tags::detail::CartesianCoordinates>(computation_variables);
240 auto& cartesian_to_spherical_jacobian =
241 get<Tags::detail::CartesianToSphericalJacobian>(computation_variables);
242 auto& inverse_cartesian_to_spherical_jacobian =
243 get<Tags::detail::InverseCartesianToSphericalJacobian>(
244 computation_variables);
245 cartesian_to_spherical_coordinates_and_jacobians(
248 make_not_null(&inverse_cartesian_to_spherical_jacobian), cos_phi,
249 cos_theta, sin_phi, sin_theta, extraction_radius);
251 auto& cartesian_spatial_metric =
252 get<gr::Tags::SpatialMetric<3, ::Frame::Inertial, DataVector>>(
253 computation_variables);
254 auto& inverse_spatial_metric =
255 get<gr::Tags::InverseSpatialMetric<3, ::Frame::Inertial, DataVector>>(
256 computation_variables);
257 auto& d_cartesian_spatial_metric =
get<
260 auto& dt_cartesian_spatial_metric =
get<
262 computation_variables);
263 auto& interpolation_buffer =
264 get<::Tags::SpinWeighted<::Tags::TempScalar<0, ComplexDataVector>,
269 get<::Tags::SpinWeighted<::Tags::TempScalar<0, ComplexDataVector>,
272 auto& radial_correction_factor =
273 get<::Tags::TempScalar<0, DataVector>>(computation_variables);
274 cartesian_spatial_metric_and_derivatives_from_unnormalized_spec_modes(
281 make_not_null(&radial_correction_factor), spatial_metric_coefficients,
282 dr_spatial_metric_coefficients, dt_spatial_metric_coefficients,
283 inverse_cartesian_to_spherical_jacobian, cartesian_coords, l_max);
285 auto& cartesian_shift =
286 get<gr::Tags::Shift<3, ::Frame::Inertial, DataVector>>(
287 computation_variables);
288 auto& d_cartesian_shift =
289 get<::Tags::deriv<gr::Tags::Shift<3, ::Frame::Inertial, DataVector>,
291 computation_variables);
292 auto& dt_cartesian_shift =
293 get<::Tags::dt<gr::Tags::Shift<3, ::Frame::Inertial, DataVector>>>(
294 computation_variables);
296 cartesian_shift_and_derivatives_from_unnormalized_spec_modes(
301 shift_coefficients, dr_shift_coefficients, dt_shift_coefficients,
302 inverse_cartesian_to_spherical_jacobian, radial_correction_factor, l_max);
304 auto& cartesian_lapse =
305 get<gr::Tags::Lapse<DataVector>>(computation_variables);
306 auto& d_cartesian_lapse =
307 get<::Tags::deriv<gr::Tags::Lapse<DataVector>, tmpl::size_t<3>,
309 auto& dt_cartesian_lapse =
310 get<::Tags::dt<gr::Tags::Lapse<DataVector>>>(computation_variables);
311 cartesian_lapse_and_derivatives_from_unnormalized_spec_modes(
316 lapse_coefficients, dr_lapse_coefficients, dt_lapse_coefficients,
317 inverse_cartesian_to_spherical_jacobian, radial_correction_factor, l_max);
319 auto&
phi = get<GeneralizedHarmonic::Tags::Phi<3, ::Frame::Inertial>>(
320 computation_variables);
321 auto& dt_spacetime_metric =
get<
323 computation_variables);
325 get<gr::Tags::SpacetimeMetric<3, ::Frame::Inertial, DataVector>>(
326 computation_variables);
329 d_cartesian_shift, cartesian_spatial_metric, d_cartesian_spatial_metric);
331 make_not_null(&dt_spacetime_metric), cartesian_lapse, dt_cartesian_lapse,
332 cartesian_shift, dt_cartesian_shift, cartesian_spatial_metric,
333 dt_cartesian_spatial_metric);
335 cartesian_shift, cartesian_spatial_metric);
337 auto& dt_worldtube_normal =
338 get<::Tags::dt<Tags::detail::WorldtubeNormal>>(computation_variables);
339 auto& worldtube_normal =
340 get<Tags::detail::WorldtubeNormal>(computation_variables);
341 worldtube_normal_and_derivatives(
344 sin_theta, inverse_spatial_metric);
346 auto& du_null_l = get<::Tags::dt<Tags::detail::NullL>>(computation_variables);
347 auto& null_l = get<Tags::detail::NullL>(computation_variables);
348 null_vector_l_and_derivatives(
350 dt_cartesian_lapse, dt_spacetime_metric, dt_cartesian_shift,
355 detail::create_bondi_boundary_data(
359 l_max, extraction_radius);