SpECTRE Documentation Coverage Report
Current view: top level - PointwiseFunctions/Hydro - Units.hpp Hit Total Coverage
Commit: 361cb8d8406bb752684a5f31c27320ec444a50e3 Lines: 28 31 90.3 %
Date: 2025-11-09 02:02:04
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 <cmath>
       7             : 
       8             : #include "Utilities/ConstantExpressions.hpp"
       9             : 
      10             : namespace hydro {
      11             : /*!
      12             :  * \brief Functions, constants, and classes for converting between different
      13             :  * units.
      14             :  *
      15             :  * In SpECTRE we prefer to use geometric units where \f$G=c=M_{\odot}=1\f$, as
      16             :  * is standard in numerical relativity. However, in order to interface with
      17             :  * other codes, we need to sometimes convert units. This namespace is designed
      18             :  * to hold the various conversion factors and functions. A unit library/system
      19             :  * would be nice, but is a non-trivial amount of work.
      20             :  */
      21           1 : namespace units {
      22             : /*!
      23             :  * \brief Entities for converting between geometric units where
      24             :  * \f$G=c=M_{\odot}=1\f$ and CGS units.
      25             :  *
      26             :  */
      27           1 : namespace cgs {
      28             : 
      29             : /// The speed of light in cm/s (This is exact)
      30           1 : constexpr double speed_of_light = 29979245800.0;
      31             : /// Newton's gravitational constant as given by
      32             : /// https://journals.aps.org/rmp/abstract/10.1103/RevModPhys.93.025010.
      33             : /// G is likely to vary between sources, even beyond the reported uncertainty
      34           1 : constexpr double G_Newton = 6.67430e-8;
      35             : /// Note G*M_Sun = 1.32712440042x10^26 +/- 1e16 [1/cm]
      36             : /// G*M_Sun factor from https://doi.org/10.1063/1.4921980
      37           1 : static constexpr double G_Newton_times_m_sun = 1.32712440042e26;
      38             : /// k_B factor in erg/K from
      39             : /// https://journals.aps.org/rmp/pdf/10.1103/RevModPhys.93.025010.
      40             : /// (This is exact)
      41           1 : static constexpr double k_Boltzmann = 1.380649e-16;
      42             : 
      43             : /// `mass_cgs = mass_geometric * mass_unit`
      44             : /// Heuristically the mass of the sun in grams
      45           1 : constexpr double mass_unit = G_Newton_times_m_sun / G_Newton;
      46             : /// `length_cgs = length_geometric * length_unit`
      47             : /// Heuristically, half the schwarzschild radius of the sun
      48             : /// in cm
      49           1 : constexpr double length_unit = G_Newton_times_m_sun / square(speed_of_light);
      50             : /// `time_cgs = time_geometric * time_unit`
      51             : /// Heuristically, half the light crossing time of a
      52             : /// solar schwarzschild radius in seconds
      53           1 : constexpr double time_unit = length_unit / speed_of_light;
      54             : /// `rho_cgs = rho_geometric * rho_unit`
      55             : /// Heuristically, the density in g/cm^3 of matter ~2200 times the density of
      56             : /// atomic nuclei.  Note this is much larger than any density realized in the
      57             : /// universe.
      58           1 : constexpr double rest_mass_density_unit =
      59             :     mass_unit / (length_unit * length_unit * length_unit);
      60             : /// `pressure_cgs = pressure_geometric * pressure_unit`
      61             : /// Heuristically, the quantity above but times the speed of light squared in
      62             : /// cgs
      63           1 : constexpr double pressure_unit =
      64             :     mass_unit / (length_unit * time_unit * time_unit);
      65             : 
      66             : // Extra constants, which are known to greatest precision in SI / (equvialently
      67             : // CGS)
      68             : /// The accepted value for the atomic mass unit in g, uncertainty +-30e-10
      69           1 : constexpr double atomic_mass_unit = 1.66053906660e-24;
      70             : /// The neutron mass, given in grams, uncertainty at 5.7 x 10^-10 level
      71           1 : constexpr double neutron_mass = 1.67492749804e-24;
      72             : /// The proton mass, given in grams. Uncertainty at 2e-8 level
      73           1 : constexpr double proton_mass = 1.672621898e-24;
      74             : /// The electron-volt (eV) given in ergs, which is known exactly in SI/cgs
      75           1 : constexpr double electron_volt = 1.602176634e-12;
      76             : 
      77             : /*!
      78             :  * \brief CGS unit of Gauss.
      79             :  *
      80             :  * Equals `mass_unit^(1/2) * length_unit^(-1/2) * time_unit^(-1)`.
      81             :  *
      82             :  * Conversion rule for electromagnetic fields is
      83             :  * ```
      84             :  * magnetic_field_cgs = magnetic_field_geometric * gauss_unit
      85             :  * ```
      86             :  * or
      87             :  * ```
      88             :  * electric_field_cgs = electric_field_geometric * gauss_unit
      89             :  * ```
      90             :  *
      91             :  * \warning Before changing units using this value, make sure the unit systems
      92             :  * you are converting values between are using the same unit convention for
      93             :  * electromagnetic variables as well. Gaussian and Heaviside-Lorentz unit
      94             :  * convention (in electromagnetism) have a factor of \f$\sqrt{4\pi}\f$
      95             :  * difference in variables. See
      96             :  * <a href="https://en.wikipedia.org/wiki/Heaviside%E2%80%93Lorentz_units">this
      97             :  * Wikipedia page</a> for how to convert between different unit systems in
      98             :  * electromagnetism.
      99             :  *
     100             :  * Note that ForceFree and grmhd::ValenciaDivClean evolution systems are
     101             :  * adopting the geometrized Heaviside-Lorentz unit for magnetic fields.
     102             :  *
     103             :  * e.g. Suppose magnetic field has value \f$10^{-5}\f$ with the code unit in the
     104             :  * ValenciaDivClean evolution system. This corresponds to
     105             :  * ```
     106             :  * 10^(-5) * gauss_unit = 2.3558985e+14 Gauss
     107             :  * ```
     108             :  * in the CGS Heaviside-Lorentz unit.
     109             :  *
     110             :  * If one wants to convert it to the usual CGS Gaussian unit, extra factor of
     111             :  * \f$\sqrt{4\pi}\f$ needs to be multiplied:
     112             :  * ```
     113             :  * 10^(-5) * gauss_unit * sqrt(4pi) = 8.35144274e+14 Gauss
     114             :  * ```
     115             :  */
     116           1 : constexpr double gauss_unit = 2.3558985e+19;
     117             : }  // namespace cgs
     118             : 
     119             : /*!
     120             :  * \brief The defining quantities of the nuclear fm-MeV/c^2-fm/c unit system
     121             :  *
     122             :  * Constants are defined in terms of cgs units where possible, which are, in
     123             :  * many cases known exactly due to their relation to SI.
     124             :  */
     125           1 : namespace nuclear {
     126             : /// `mass_nuclear = mass_unit * mass_geometric`
     127             : /// Heuristically a solar mass in MeV/c^2
     128           1 : constexpr double mass_unit =
     129             :      cgs::mass_unit /
     130             :     (1.0e6 * cgs::electron_volt / square(cgs::speed_of_light));
     131             : /// `length_nuclear = length_unit * length_geometric`
     132             : /// Heuristically GM_sun/c^2 in fm
     133           1 : constexpr double length_unit =  cgs::length_unit / (1.0e-13);
     134             : /// `time_nuclear = time_unit * time_geometric`
     135             : /// Heuristically GM_sun/c^3 in fm/c
     136           1 : constexpr double time_unit =
     137             :      cgs::time_unit / (1.0e-13 / cgs::speed_of_light);
     138             : /// `pressure_nuclear = pressure_geometric * pressure_geometric`
     139             : /// Heuristically the rest-mass energy density of
     140             : /// ~2200 the density of atomic nucli expressed in MeV/fm^3
     141           1 : constexpr double pressure_unit = mass_unit / (length_unit * square(time_unit));
     142             : /// `rest_mass_density_nuclear = rest_mass_density_geometric *
     143             : /// rest_mass_density_geometric` Heuristically ~2200 the density of atomic nucli
     144             : /// expressed in MeV/c^2/fm^3
     145           1 : constexpr double rest_mass_density_unit = mass_unit / cube(length_unit);
     146           0 : constexpr double neutron_mass =
     147             :     cgs::neutron_mass /
     148             :     (1.0e6 * cgs::electron_volt / square(cgs::speed_of_light));
     149           0 : constexpr double atomic_mass_unit =
     150             :     cgs::atomic_mass_unit /
     151             :     (1.0e6 * cgs::electron_volt / square(cgs::speed_of_light));
     152             : /// The proton mass in MeV, uncertainty at 5.8eV.
     153           1 : constexpr double proton_mass =
     154             :     cgs::proton_mass /
     155             :     (1.0e6 * cgs::electron_volt / square(cgs::speed_of_light));
     156             : 
     157             : /// The saturation number density of baryons in nuclear matter, in
     158             : /// units of 1/fm^3.  This is a standard value, consistent with  e.g.
     159             : /// https://journals.aps.org/prc/abstract/10.1103/PhysRevC.102.044321
     160           1 : constexpr double saturation_number_density = 0.16;
     161             : 
     162             : }  // namespace nuclear
     163             : /*!
     164             :  * \brief Quantities given in terms of geometric units G = c = M_odot =
     165             :  * 1
     166             :  *
     167             :  * All quantities are given in terms of unit systems which are related exactly
     168             :  * to SI units.  The limiting factor in conversions is the poorly known value
     169             :  * of G; which leads to large uncertainties in the relative value of SI-derived
     170             :  * masses to the solar mass.  For this reason, it is best to avoid using
     171             :  * geometric units in calculations except where conversion is explicitly needed.
     172             :  */
     173           1 : namespace geometric {
     174             : /// Neutron mass in G = c = M_sun = 1.0 units
     175           1 : constexpr double neutron_mass = cgs::neutron_mass / cgs::mass_unit;
     176             : /// The rest mass density of matter at the saturation point
     177           1 : constexpr double default_saturation_rest_mass_density =
     178             :     1 / nuclear::rest_mass_density_unit *
     179             :     (nuclear::saturation_number_density * nuclear::atomic_mass_unit);
     180             : /// The default baryon mass in geometric units.
     181             : /// Accepted value of atomic mass unit as expressed in
     182             : /// solar masses
     183             : /// Limited by precision of knowledge of solar mass.
     184           1 : constexpr double default_baryon_mass = cgs::atomic_mass_unit / cgs::mass_unit;
     185             : }  // namespace geometric
     186             : 
     187             : }  // namespace units
     188             : }  // namespace hydro

Generated by: LCOV version 1.14