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 polytropic fluid
31 : *
32 : * A polytropic equation of state \f$p=K\rho^{\Gamma}\f$ where \f$K\f$ is the
33 : * polytropic constant and \f$\Gamma\f$ is the polytropic exponent. The
34 : * polytropic exponent is related to the polytropic index \f$N_p\f$ by
35 : * \f$N_p=1/(\Gamma-1)\f$.
36 : *
37 : * We also have
38 : *
39 : * \f{align}{
40 : * \epsilon&=\frac{K\rho^{\Gamma-1}}{\Gamma-1}\\
41 : * h&=1+\epsilon+\frac{p}{\rho}=1+\frac{K\Gamma}{\Gamma-1}\rho^{\Gamma-1} \\
42 : * T&=0 \\
43 : * c_s^2&=\frac{\Gamma p}{\rho h}
44 : * =\frac{\Gamma(\Gamma-1)p}{\rho(\Gamma-1)+\Gamma p}
45 : * =\left(\frac{1}{\Gamma K\rho^{\Gamma-1}}+\frac{1}{\Gamma-1}\right)^{-1}
46 : * \f}
47 : */
48 : template <bool IsRelativistic>
49 1 : class PolytropicFluid : public EquationOfState<IsRelativistic, 1> {
50 : public:
51 0 : static constexpr size_t thermodynamic_dim = 1;
52 0 : static constexpr bool is_relativistic = IsRelativistic;
53 :
54 0 : struct PolytropicConstant {
55 0 : using type = double;
56 0 : static constexpr Options::String help = {"Polytropic constant K"};
57 0 : static double lower_bound() { return 0.0; }
58 : };
59 :
60 0 : struct PolytropicExponent {
61 0 : using type = double;
62 0 : static constexpr Options::String help = {"Polytropic exponent Gamma"};
63 0 : static double lower_bound() { return 1.0; }
64 : };
65 :
66 0 : static constexpr Options::String help = {
67 : "A polytropic fluid equation of state.\n"
68 : "The pressure is related to the rest mass density by p = K rho ^ Gamma, "
69 : "where p is the pressure, rho is the rest mass density, K is the "
70 : "polytropic constant, and Gamma is the polytropic exponent. The "
71 : "polytropic index N is defined as Gamma = 1 + 1 / N."};
72 :
73 0 : using options = tmpl::list<PolytropicConstant, PolytropicExponent>;
74 :
75 0 : PolytropicFluid() = default;
76 0 : PolytropicFluid(const PolytropicFluid&) = default;
77 0 : PolytropicFluid& operator=(const PolytropicFluid&) = default;
78 0 : PolytropicFluid(PolytropicFluid&&) = default;
79 0 : PolytropicFluid& operator=(PolytropicFluid&&) = default;
80 0 : ~PolytropicFluid() override = default;
81 :
82 0 : PolytropicFluid(double polytropic_constant, double polytropic_exponent);
83 :
84 0 : std::unique_ptr<EquationOfState<IsRelativistic, 1>> get_clone()
85 : const override;
86 :
87 1 : std::unique_ptr<EquationOfState<IsRelativistic, 3>> promote_to_3d_eos()
88 : const override;
89 :
90 1 : std::unique_ptr<EquationOfState<IsRelativistic, 2>> promote_to_2d_eos()
91 : const override;
92 :
93 0 : bool is_equal(const EquationOfState<IsRelativistic, 1>& rhs) const override;
94 :
95 0 : bool operator==(const PolytropicFluid<IsRelativistic>& rhs) const;
96 :
97 0 : bool operator!=(const PolytropicFluid<IsRelativistic>& rhs) const;
98 :
99 : EQUATION_OF_STATE_FORWARD_DECLARE_MEMBERS(PolytropicFluid, 1)
100 :
101 0 : WRAPPED_PUPable_decl_base_template( // NOLINT
102 : SINGLE_ARG(EquationOfState<IsRelativistic, 1>), PolytropicFluid);
103 :
104 : /// The lower bound of the rest mass density that is valid for this EOS
105 1 : double rest_mass_density_lower_bound() const override { return 0.0; }
106 :
107 : /// The upper bound of the rest mass density that is valid for this EOS
108 1 : double rest_mass_density_upper_bound() const override;
109 :
110 : /// The lower bound of the specific enthalpy that is valid for this EOS
111 1 : double specific_enthalpy_lower_bound() const override {
112 : return IsRelativistic ? 1.0 : 0.0;
113 : }
114 :
115 : /// The lower bound of the specific internal energy that is valid for this EOS
116 1 : double specific_internal_energy_lower_bound() const override { return 0.0; }
117 :
118 : /// The upper bound of the specific internal energy that is valid for this EOS
119 1 : double specific_internal_energy_upper_bound() const override;
120 :
121 : /// The vacuum baryon mass for this EoS
122 1 : double baryon_mass() const override {
123 : return hydro::units::geometric::default_baryon_mass;
124 : }
125 :
126 : private:
127 : EQUATION_OF_STATE_FORWARD_DECLARE_MEMBER_IMPLS(1)
128 :
129 0 : double polytropic_constant_ = std::numeric_limits<double>::signaling_NaN();
130 0 : double polytropic_exponent_ = std::numeric_limits<double>::signaling_NaN();
131 : };
132 :
133 : /// \cond
134 : template <bool IsRelativistic>
135 : PUP::able::PUP_ID EquationsOfState::PolytropicFluid<IsRelativistic>::my_PUP_ID =
136 : 0;
137 : /// \endcond
138 : } // namespace EquationsOfState
|