Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <complex> 7 : #include <cstddef> 8 : #include <limits> 9 : #include <memory> 10 : #include <vector> 11 : 12 : #include "DataStructures/SpinWeighted.hpp" 13 : #include "Evolution/Systems/Cce/AnalyticSolutions/SphericalMetricData.hpp" 14 : #include "Evolution/Systems/Cce/AnalyticSolutions/WorldtubeData.hpp" 15 : #include "Evolution/Systems/Cce/Tags.hpp" 16 : #include "Options/String.hpp" 17 : #include "Utilities/Gsl.hpp" 18 : #include "Utilities/Literals.hpp" 19 : #include "Utilities/Serialization/CharmPupable.hpp" 20 : #include "Utilities/TMPL.hpp" 21 : 22 : /// \cond 23 : class DataVector; 24 : class ComplexDataVector; 25 : /// \endcond 26 : 27 : namespace Cce::Solutions { 28 : 29 : /*! 30 : * \brief Computes the analytic data for the rotating Schwarzschild solution 31 : * described in \cite Barkett2019uae, section VI.C. 32 : * 33 : * \details This is a comparatively simple test which simply determines the 34 : * Schwarzschild metric in transformed coordinates given by \f$\phi\rightarrow 35 : * \phi + \omega u\f$, where \f$u\f$ is the retarded time. 36 : */ 37 1 : struct RotatingSchwarzschild : public SphericalMetricData { 38 0 : struct ExtractionRadius { 39 0 : using type = double; 40 0 : static constexpr Options::String help{ 41 : "The extraction radius of the spherical solution"}; 42 0 : static type lower_bound() { return 0.0; } 43 : }; 44 0 : struct Mass { 45 0 : using type = double; 46 0 : static constexpr Options::String help{ 47 : "The mass of the Schwarzschild black hole"}; 48 0 : static type lower_bound() { return 0.0; } 49 : }; 50 0 : struct Frequency { 51 0 : using type = double; 52 0 : static constexpr Options::String help{ 53 : "The frequency of the coordinate rotation."}; 54 0 : static type lower_bound() { return 0.0; } 55 : }; 56 : 57 0 : using options = tmpl::list<ExtractionRadius, Mass, Frequency>; 58 : 59 0 : static constexpr Options::String help = { 60 : "Analytic solution representing a Schwarzschild black hole in a rotating " 61 : "frame"}; 62 : 63 0 : WRAPPED_PUPable_decl_template(RotatingSchwarzschild); // NOLINT 64 : 65 0 : explicit RotatingSchwarzschild(CkMigrateMessage* msg) 66 : : SphericalMetricData(msg) {} 67 : 68 : // clang doesn't manage to use = default correctly in this case 69 : // NOLINTNEXTLINE(modernize-use-equals-default) 70 0 : RotatingSchwarzschild() {} 71 : 72 0 : RotatingSchwarzschild(double extraction_radius, double mass, 73 : double frequency); 74 : 75 0 : ~RotatingSchwarzschild() override = default; 76 : 77 0 : std::unique_ptr<WorldtubeData> get_clone() const override; 78 : 79 0 : void pup(PUP::er& p) override; 80 : 81 : protected: 82 : /// A no-op as the rotating Schwarzschild solution does not have substantial 83 : /// shared computation to prepare before the separate component calculations. 84 1 : void prepare_solution(const size_t /*output_l_max*/, 85 : const double /*time*/) const override {} 86 : 87 : /*! 88 : * \brief Compute the spherical coordinate metric from the closed-form 89 : * rotating Schwarzschild metric. 90 : * 91 : * \details The rotating Schwarzschild takes the coordinate form 92 : * \cite Barkett2019uae, 93 : * 94 : * \f{align}{ 95 : * ds^2 = -\left(1 - \frac{2 M}{r} - \omega^2 r^2 \sin^2 \theta\right) dt^2 96 : * + \frac{1}{1 - \frac{2 M}{r}} dr^2 97 : * + 2 \omega r^2 \sin^2 \theta dt d\phi + r^2 d\Omega^2 98 : * \f} 99 : */ 100 1 : void spherical_metric( 101 : gsl::not_null< 102 : tnsr::aa<DataVector, 3, ::Frame::Spherical<::Frame::Inertial>>*> 103 : spherical_metric, 104 : size_t l_max, double time) const override; 105 : 106 : /*! 107 : * \brief Compute the radial derivative of the spherical coordinate metric 108 : * from the closed-form rotating Schwarzschild metric. 109 : * 110 : * \details The rotating Schwarzschild takes the coordinate form 111 : * \cite Barkett2019uae, 112 : * 113 : * \f{align}{ 114 : * \partial_r g_{a b} dx^a dx^b =& -\left(\frac{2 M}{r^2} - 2 \omega^2 r 115 : * \sin^2 \theta\right) dt^2 - \frac{2 M}{(r - 2 M)^2} dr^2 116 : * + 4 \omega r \sin^2 \theta dt d\phi + 2 r d\Omega^2 117 : * \f} 118 : */ 119 1 : void dr_spherical_metric( 120 : gsl::not_null< 121 : tnsr::aa<DataVector, 3, ::Frame::Spherical<::Frame::Inertial>>*> 122 : dr_spherical_metric, 123 : size_t l_max, double time) const override; 124 : 125 : /*! 126 : * \brief The time derivative of the spherical coordinate metric in the 127 : * rotating Schwarzschild metric vanishes. 128 : */ 129 1 : void dt_spherical_metric( 130 : gsl::not_null< 131 : tnsr::aa<DataVector, 3, ::Frame::Spherical<::Frame::Inertial>>*> 132 : dt_spherical_metric, 133 : size_t l_max, double time) const override; 134 : 135 0 : using WorldtubeData::variables_impl; 136 : 137 1 : using SphericalMetricData::variables_impl; 138 : 139 : /// The News vanishes in the rotating Schwarzschild metric 140 1 : void variables_impl( 141 : gsl::not_null<Scalar<SpinWeighted<ComplexDataVector, -2>>*> news, 142 : size_t l_max, double time, 143 : tmpl::type_<Tags::News> /*meta*/) const override; 144 : 145 0 : double frequency_ = std::numeric_limits<double>::signaling_NaN(); 146 0 : double mass_ = std::numeric_limits<double>::signaling_NaN(); 147 : }; 148 : } // namespace Cce::Solutions