Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <boost/preprocessor/arithmetic/dec.hpp> 7 : #include <boost/preprocessor/arithmetic/inc.hpp> 8 : #include <boost/preprocessor/control/expr_iif.hpp> 9 : #include <boost/preprocessor/list/adt.hpp> 10 : #include <boost/preprocessor/repetition/for.hpp> 11 : #include <boost/preprocessor/repetition/repeat.hpp> 12 : #include <boost/preprocessor/tuple/to_list.hpp> 13 : #include <limits> 14 : #include <pup.h> 15 : 16 : #include "DataStructures/Tensor/TypeAliases.hpp" 17 : #include "Options/String.hpp" 18 : #include "PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp" 19 : #include "PointwiseFunctions/Hydro/Units.hpp" 20 : #include "Utilities/Serialization/CharmPupable.hpp" 21 : #include "Utilities/TMPL.hpp" 22 : 23 : /// \cond 24 : class DataVector; 25 : /// \endcond 26 : 27 : namespace EquationsOfState { 28 : /*! 29 : * \ingroup EquationsOfStateGroup 30 : * \brief Equation of state for a piecewise polytropic fluid 31 : * 32 : * A piecewise polytropic equation of state \f$p=K_i\rho^{\Gamma_i}\f$ where 33 : * \f$K_i\f$ is the polytropic constant and \f$\Gamma_i\f$ is the polytropic 34 : * exponent. Here the subscript \f$i\f$ indicates two pairs of constants and 35 : * exponents which characterize `the stiffness' of the matter at low and high 36 : * densities. For a given density, the polytropic exponent is related to the 37 : * polytropic index \f$N_p\f$ by \f$N_p=1/(\Gamma-1)\f$. For posterity, 38 : * this two piece polytrope has been used in toy models of CCSNe (e.g., 39 : * \cite Dimmelmeier2001 ) and could be extended to a general "M" number of 40 : * parts for simplified equations of state for neutron stars (e.g., 41 : * \cite OBoyle2020 ). For a reference to a general piecewise polytrope, see 42 : * Section 2.4.7 of \cite RezzollaBook. 43 : */ 44 : template <bool IsRelativistic> 45 1 : class PiecewisePolytropicFluid : public EquationOfState<IsRelativistic, 1> { 46 : public: 47 0 : static constexpr size_t thermodynamic_dim = 1; 48 0 : static constexpr bool is_relativistic = IsRelativistic; 49 : 50 : /// The density demarcating the high and low density descriptions of the 51 : /// fluid. 52 1 : struct PiecewisePolytropicTransitionDensity { 53 0 : using type = double; 54 0 : static constexpr Options::String help = { 55 : "Density below (above) which, the matter is described by a low (high) " 56 : "density polytropic fluid."}; 57 0 : static double lower_bound() { return 0.0; } 58 : }; 59 : 60 : /// The constant \f$K\f$ scaling the low density material 61 : /// \f$p=K\rho^{\Gamma}\f$. 62 : /// 63 : /// Note, by enforcing pressure continuity at the transition density 64 : /// \f$\bar{\rho}\f$, the high density constant \f$K_{high}\f$ is given 65 : /// as \f$K_{high} = K_{low} (\bar{\rho})^{\Gamma_{low} - \Gamma_{high}}\f$. 66 1 : struct PolytropicConstantLow { 67 0 : using type = double; 68 0 : static constexpr Options::String help = { 69 : "Polytropic constant K for lower" 70 : " density material"}; 71 0 : static double lower_bound() { return 0.0; } 72 : }; 73 : 74 : /// The exponent \f$\Gamma\f$, scaling the low density material 75 : /// \f$p=K\rho^{\Gamma}\f$. 76 1 : struct PolytropicExponentLow { 77 0 : using type = double; 78 0 : static constexpr Options::String help = { 79 : "Polytropic exponent for lower" 80 : " density material."}; 81 0 : static double lower_bound() { return 1.0; } 82 : }; 83 : 84 : /// The exponent \f$\Gamma\f$, scaling the high density material 85 : /// \f$p=K\rho^{\Gamma}\f$. 86 1 : struct PolytropicExponentHigh { 87 0 : using type = double; 88 0 : static constexpr Options::String help = { 89 : "Polytropic exponent for higher" 90 : " density material."}; 91 0 : static double lower_bound() { return 1.0; } 92 : }; 93 : 94 0 : static constexpr Options::String help = { 95 : "A piecewise polytropic fluid equation of state.\n" 96 : "The pressure is related to the rest mass density by p = K_i rho ^ " 97 : "Gamma_i, " 98 : "where p is the pressure, rho is the rest mass density, K_i is the " 99 : "polytropic constant either describing the low or high density material, " 100 : "and Gamma_i is the polytropic exponent for the low or high density " 101 : "material. The polytropic index N_i is defined as Gamma_i = 1 + 1 / N_i." 102 : " The subscript `i' refers to different pairs of Gamma and K that can" 103 : " describe either low or high density material."}; 104 : 105 0 : using options = 106 : tmpl::list<PiecewisePolytropicTransitionDensity, PolytropicConstantLow, 107 : PolytropicExponentLow, PolytropicExponentHigh>; 108 : 109 0 : PiecewisePolytropicFluid() = default; 110 0 : PiecewisePolytropicFluid(const PiecewisePolytropicFluid&) = default; 111 0 : PiecewisePolytropicFluid& operator=(const PiecewisePolytropicFluid&) = 112 : default; 113 0 : PiecewisePolytropicFluid(PiecewisePolytropicFluid&&) = default; 114 0 : PiecewisePolytropicFluid& operator=(PiecewisePolytropicFluid&&) = default; 115 0 : ~PiecewisePolytropicFluid() override = default; 116 : 117 0 : PiecewisePolytropicFluid(double transition_density, 118 : double polytropic_constant_lo, 119 : double polytropic_exponent_lo, 120 : double polytropic_exponent_hi); 121 : 122 0 : std::unique_ptr<EquationOfState<IsRelativistic, 1>> get_clone() 123 : const override; 124 : 125 1 : std::unique_ptr<EquationOfState<IsRelativistic, 3>> promote_to_3d_eos() 126 : const override; 127 : 128 1 : std::unique_ptr<EquationOfState<IsRelativistic, 2>> promote_to_2d_eos() 129 : const override; 130 : 131 0 : bool is_equal(const EquationOfState<IsRelativistic, 1>& rhs) const override; 132 : 133 0 : bool operator==(const PiecewisePolytropicFluid<IsRelativistic>& rhs) const; 134 : 135 0 : bool operator!=(const PiecewisePolytropicFluid<IsRelativistic>& rhs) const; 136 : 137 : EQUATION_OF_STATE_FORWARD_DECLARE_MEMBERS(PiecewisePolytropicFluid, 1) 138 : 139 0 : WRAPPED_PUPable_decl_base_template( // NOLINT 140 : SINGLE_ARG(EquationOfState<IsRelativistic, 1>), PiecewisePolytropicFluid); 141 : 142 : /// The lower bound of the rest mass density that is valid for this EOS 143 1 : double rest_mass_density_lower_bound() const override { return 0.0; } 144 : 145 : /// The upper bound of the rest mass density that is valid for this EOS 146 1 : double rest_mass_density_upper_bound() const override; 147 : 148 : /// The lower bound of the specific enthalpy that is valid for this EOS 149 1 : double specific_enthalpy_lower_bound() const override { 150 : return IsRelativistic ? 1.0 : 0.0; 151 : } 152 : 153 : /// The lower bound of the specific internal energy that is valid for this EOS 154 1 : double specific_internal_energy_lower_bound() const override { return 0.0; } 155 : 156 : /// The upper bound of the specific internal energy that is valid for this EOS 157 1 : double specific_internal_energy_upper_bound() const override; 158 : 159 : /// The vacuum baryon mass for this EoS 160 1 : double baryon_mass() const override { 161 : return hydro::units::geometric::default_baryon_mass; 162 : } 163 : 164 : private: 165 : EQUATION_OF_STATE_FORWARD_DECLARE_MEMBER_IMPLS(1) 166 : 167 0 : double transition_density_ = std::numeric_limits<double>::signaling_NaN(); 168 0 : double transition_pressure_ = std::numeric_limits<double>::signaling_NaN(); 169 0 : double transition_spec_eint_ = std::numeric_limits<double>::signaling_NaN(); 170 0 : double polytropic_constant_lo_ = std::numeric_limits<double>::signaling_NaN(); 171 0 : double polytropic_exponent_lo_ = std::numeric_limits<double>::signaling_NaN(); 172 0 : double polytropic_constant_hi_ = std::numeric_limits<double>::signaling_NaN(); 173 0 : double polytropic_exponent_hi_ = std::numeric_limits<double>::signaling_NaN(); 174 : }; 175 : 176 : /// \cond 177 : template <bool IsRelativistic> 178 : PUP::able::PUP_ID 179 : EquationsOfState::PiecewisePolytropicFluid<IsRelativistic>::my_PUP_ID = 0; 180 : /// \endcond 181 : } // namespace EquationsOfState