SpECTRE Documentation Coverage Report
Current view: top level - PointwiseFunctions/AnalyticData/GrMhd - MagnetizedTovStar.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 8.0 % 25 2
Test Date: 2026-10-22 17:29:42
Legend: Lines:     hit not hit

            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 <limits>
       8              : 
       9              : #include "DataStructures/TaggedTuple.hpp"
      10              : #include "DataStructures/Tensor/TypeAliases.hpp"
      11              : #include "Options/String.hpp"
      12              : #include "PointwiseFunctions/AnalyticData/AnalyticData.hpp"
      13              : #include "PointwiseFunctions/AnalyticData/GrMhd/AnalyticData.hpp"
      14              : #include "PointwiseFunctions/AnalyticData/GrMhd/InitialMagneticFields/Factory.hpp"
      15              : #include "PointwiseFunctions/AnalyticData/GrMhd/InitialMagneticFields/InitialMagneticField.hpp"
      16              : #include "PointwiseFunctions/AnalyticSolutions/RelativisticEuler/TovStar.hpp"
      17              : #include "PointwiseFunctions/Hydro/EquationsOfState/Factory.hpp"
      18              : #include "PointwiseFunctions/Hydro/TagsDeclarations.hpp"
      19              : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp"
      20              : #include "Utilities/Serialization/CharmPupable.hpp"
      21              : #include "Utilities/TMPL.hpp"
      22              : 
      23              : /// \cond
      24              : namespace PUP {
      25              : class er;
      26              : }  // namespace PUP
      27              : /// \endcond
      28              : 
      29              : namespace grmhd::AnalyticData {
      30              : namespace magnetized_tov_detail {
      31              : 
      32              : using StarRegion = RelativisticEuler::Solutions::tov_detail::StarRegion;
      33              : 
      34              : template <typename DataType, StarRegion Region>
      35              : struct MagnetizedTovVariables
      36              :     : RelativisticEuler::Solutions::tov_detail::TovVariables<DataType, Region> {
      37              :   static constexpr size_t Dim = 3;
      38              :   using Base =
      39              :       RelativisticEuler::Solutions::tov_detail::TovVariables<DataType, Region>;
      40              :   using Cache = typename Base::Cache;
      41              :   using Base::operator();
      42              :   using Base::coords;
      43              :   using Base::eos;
      44              :   using Base::radial_solution;
      45              :   using Base::radius;
      46              : 
      47              :   const std::vector<std::unique_ptr<
      48              :       grmhd::AnalyticData::InitialMagneticFields::InitialMagneticField>>&
      49              :       magnetic_fields;
      50              : 
      51              :   MagnetizedTovVariables(
      52              :       const tnsr::I<DataType, 3>& local_x, const DataType& local_radius,
      53              :       const RelativisticEuler::Solutions::TovSolution& local_radial_solution,
      54              :       const EquationsOfState::EquationOfState<true, 1>& local_eos,
      55              :       const std::vector<std::unique_ptr<
      56              :           grmhd::AnalyticData::InitialMagneticFields::InitialMagneticField>>&
      57              :           mag_fields)
      58              :       : Base(local_x, local_radius, local_radial_solution, local_eos),
      59              :         magnetic_fields(mag_fields) {}
      60              : 
      61              :   void operator()(
      62              :       gsl::not_null<tnsr::I<DataType, 3>*> magnetic_field,
      63              :       gsl::not_null<Cache*> cache,
      64              :       hydro::Tags::MagneticField<DataType, 3> /*meta*/) const override;
      65              : };
      66              : 
      67              : }  // namespace magnetized_tov_detail
      68              : 
      69              : /*!
      70              :  * \brief Magnetized TOV star initial data, where metric terms only account for
      71              :  * the hydrodynamics not the magnetic fields.
      72              :  *
      73              :  * Superposes magnetic fields on top of a TOV solution. These can be any of
      74              :  * the classes derived from
      75              :  * grmhd::AnalyticData::InitialMagneticFields::InitialMagneticField
      76              :  *
      77              :  * ### Conversion to CGS units and values for poloidal magnetic field
      78              :  *
      79              :  * While the amplitude \f$A_b\f$ is specified in the code, it is more natural
      80              :  * to work with the magnetic field strength, which is given by \f$\sqrt{b^2}\f$
      81              :  * (where \f$b^a\f$ is the comoving magnetic field), and in CGS units is
      82              :  *
      83              :  * \f{align*}{
      84              :  *  |B_{\mathrm{CGS}}|&= \sqrt{4 \pi b^2}
      85              :  *   \left(\frac{c^2}{G M_\odot}\right) \left(\frac{c}{\sqrt{4 \pi \epsilon_0
      86              :  *    G}}\right) \\
      87              :  *   &= \sqrt{b^2} \times 8.352\times10^{19}\mathrm{G} \,.
      88              :  * \f}
      89              :  *
      90              :  * We now give values used for standard tests of magnetized stars with a
      91              :  * poloidal magnetic field.
      92              :  * - \f$\rho_c(0)=1.28\times10^{-3}\f$
      93              :  * - \f$K=100\f$
      94              :  * - \f$\Gamma=2\f$
      95              :  * - %Domain \f$[-20,20]^3\f$
      96              :  * - Units \f$M=M_\odot\f$
      97              :  * - A target final time 20ms means \f$20\times10^{-3}/(5\times10^{-6})=4000M\f$
      98              :  * - The mass of the star is \f$1.4M_{\odot}\f$
      99              :  *
     100              :  * Parameters for desired magnetic field strength:
     101              :  * - For \f$n_s=0\f$ and \f$p_{\mathrm{cut}}=0.04p_{\max}\f$ setting
     102              :  *   \f$A_b=6\times10^{-5}\f$ yields a maximum mganetic field strength of
     103              :  *   \f$1.002\times10^{16}G\f$.
     104              :  * - For \f$n_s=1\f$ and \f$p_{\mathrm{cut}}=0.04p_{\max}\f$ setting
     105              :  *   \f$A_b=0.4\f$ yields a maximum mganetic field strength of
     106              :  *   \f$1.05\times10^{16}G\f$.
     107              :  * - For \f$n_s=2\f$ and \f$p_{\mathrm{cut}}=0.04p_{\max}\f$ setting
     108              :  *   \f$A_b=2500\f$ yields a maximum mganetic field strength of
     109              :  *   \f$1.03\times10^{16}G\f$.
     110              :  * - For \f$n_s=3\f$ and \f$p_{\mathrm{cut}}=0.04p_{\max}\f$ setting
     111              :  *   \f$A_b=1.65\times10^{7}\f$ yields a maximum mganetic field strength of
     112              :  *   \f$1.07\times10^{16}G\f$.
     113              :  *
     114              :  * Note that the magnetic field strength goes as \f$A_b\f$ so any desired value
     115              :  * can be achieved by a linear scaling.
     116              :  */
     117            1 : class MagnetizedTovStar : public virtual evolution::initial_data::InitialData,
     118              :                           public MarkAsAnalyticData,
     119              :                           private RelativisticEuler::Solutions::TovStar {
     120              :  private:
     121            0 :   using tov_star = RelativisticEuler::Solutions::TovStar;
     122              : 
     123              :  public:
     124            0 :   struct MagneticFields {
     125            0 :     using type = std::vector<std::unique_ptr<
     126              :         grmhd::AnalyticData::InitialMagneticFields::InitialMagneticField>>;
     127            0 :     static constexpr Options::String help = {
     128              :         "Magnetic fields to superpose on the TOV solution."};
     129              :   };
     130              : 
     131            0 :   using options = tmpl::push_back<tov_star::options, MagneticFields>;
     132              : 
     133            0 :   static constexpr Options::String help = {"Magnetized TOV star."};
     134              : 
     135            0 :   static constexpr size_t volume_dim = 3_st;
     136              : 
     137              :   template <typename DataType>
     138            0 :   using tags = typename tov_star::template tags<DataType>;
     139              : 
     140            0 :   MagnetizedTovStar();
     141            0 :   MagnetizedTovStar(const MagnetizedTovStar& rhs);
     142            0 :   MagnetizedTovStar& operator=(const MagnetizedTovStar& rhs);
     143            0 :   MagnetizedTovStar(MagnetizedTovStar&& /*rhs*/);
     144            0 :   MagnetizedTovStar& operator=(MagnetizedTovStar&& /*rhs*/);
     145            0 :   ~MagnetizedTovStar() override;
     146              : 
     147            0 :   MagnetizedTovStar(
     148              :       double central_rest_mass_density,
     149              :       std::unique_ptr<EquationsOfState::EquationOfState<true, 1>>
     150              :           equation_of_state,
     151              :       RelativisticEuler::Solutions::TovCoordinates coordinate_system,
     152              :       std::vector<std::unique_ptr<
     153              :           grmhd::AnalyticData::InitialMagneticFields::InitialMagneticField>>
     154              :           magnetic_fields);
     155              : 
     156            0 :   auto get_clone() const
     157              :       -> std::unique_ptr<evolution::initial_data::InitialData> override;
     158              : 
     159              :   /// \cond
     160              :   explicit MagnetizedTovStar(CkMigrateMessage* msg);
     161              :   using PUP::able::register_constructor;
     162              :   WRAPPED_PUPable_decl_template(MagnetizedTovStar);
     163              :   /// \endcond
     164              : 
     165            0 :   using tov_star::equation_of_state;
     166            0 :   using tov_star::equation_of_state_type;
     167              : 
     168              :   /// Retrieve a collection of variables at `(x)`
     169              :   template <typename DataType, typename... Tags>
     170            1 :   tuples::TaggedTuple<Tags...> variables(const tnsr::I<DataType, 3>& x,
     171              :                                          tmpl::list<Tags...> /*meta*/) const {
     172              :     return variables_impl<magnetized_tov_detail::MagnetizedTovVariables>(
     173              :         x, tmpl::list<Tags...>{}, magnetic_fields_);
     174              :   }
     175              : 
     176              :   // NOLINTNEXTLINE(google-runtime-references)
     177            0 :   void pup(PUP::er& p) override;
     178              : 
     179              :  private:
     180            0 :   friend bool operator==(const MagnetizedTovStar& lhs,
     181              :                          const MagnetizedTovStar& rhs);
     182              : 
     183              :  protected:
     184              :   std::vector<std::unique_ptr<
     185              :       grmhd::AnalyticData::InitialMagneticFields::InitialMagneticField>>
     186            0 :       magnetic_fields_{};
     187              : };
     188              : 
     189            0 : bool operator!=(const MagnetizedTovStar& lhs, const MagnetizedTovStar& rhs);
     190              : }  // namespace grmhd::AnalyticData
        

Generated by: LCOV version 2.0-1