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 : #include <optional>
8 : #include <tuple>
9 :
10 : #include "Evolution/Systems/CurvedScalarWave/Worldtube/Tags.hpp"
11 : #include "NumericalAlgorithms/SphericalHarmonics/Tags.hpp"
12 : #include "Parallel/AlgorithmExecution.hpp"
13 : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
14 : #include "Utilities/Gsl.hpp"
15 :
16 : namespace CurvedScalarWave::Worldtube {
17 :
18 : /*!
19 : * \brief Computes the next iteration of the acceleration due to scalar self
20 : * force from the current iteration of the regular field, as well as the
21 : * quantities required to compute the acceleration terms of the puncture field.
22 : *
23 : * \details Analytic expressions for the computed terms are given in Section V.B
24 : * of \cite Wittek:2024gxn.
25 : */
26 1 : struct IterateAccelerationTerms {
27 0 : static constexpr size_t Dim = 3;
28 0 : using simple_tags = tmpl::list<Tags::AccelerationTerms>;
29 0 : using return_tags = tmpl::list<Tags::AccelerationTerms>;
30 0 : using argument_tags = tmpl::list<
31 : Tags::ParticlePositionVelocity<Dim>, Tags::BackgroundQuantities<Dim>,
32 : Tags::GeodesicAcceleration<Dim>,
33 : Stf::Tags::StfTensor<Tags::PsiWorldtube, 0, Dim, Frame::Inertial>,
34 : Stf::Tags::StfTensor<::Tags::dt<Tags::PsiWorldtube>, 0, Dim,
35 : Frame::Inertial>,
36 : Stf::Tags::StfTensor<Tags::PsiWorldtube, 1, Dim, Frame::Inertial>,
37 : Stf::Tags::StfTensor<::Tags::dt<Tags::PsiWorldtube>, 1, Dim,
38 : Frame::Inertial>,
39 : Tags::Charge, Tags::Mass, ::Tags::Time, Tags::SelfForceTurnOnTime,
40 : Tags::SelfForceTurnOnInterval, Tags::CurrentIteration>;
41 0 : static void apply(
42 : gsl::not_null<Scalar<DataVector>*> acceleration_terms,
43 : const std::array<tnsr::I<double, Dim>, 2>& pos_vel,
44 : const tuples::TaggedTuple<
45 : gr::Tags::SpacetimeMetric<double, Dim>,
46 : gr::Tags::InverseSpacetimeMetric<double, Dim>,
47 : gr::Tags::SpacetimeChristoffelSecondKind<double, Dim>,
48 : gr::Tags::TraceSpacetimeChristoffelSecondKind<double, Dim>,
49 : Tags::TimeDilationFactor>& background,
50 : const tnsr::I<double, Dim, Frame::Inertial>& geodesic_acc,
51 : const Scalar<double>& psi_monopole, const Scalar<double>& dt_psi_monopole,
52 : const tnsr::i<double, Dim, Frame::Inertial>& psi_dipole,
53 : const tnsr::i<double, Dim, Frame::Inertial>& dt_psi_dipole, double charge,
54 : std::optional<double> mass, double time,
55 : std::optional<double> turn_on_time,
56 : std::optional<double> turn_on_interval, size_t iteration);
57 : };
58 :
59 : } // namespace CurvedScalarWave::Worldtube
|