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 <cstddef>
14 : #include <limits>
15 : #include <memory>
16 : #include <pup.h>
17 :
18 : #include "DataStructures/Tensor/TypeAliases.hpp"
19 : #include "Options/String.hpp"
20 : #include "PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp"
21 : #include "PointwiseFunctions/Hydro/Units.hpp"
22 : #include "Utilities/Serialization/CharmPupable.hpp"
23 : #include "Utilities/TMPL.hpp"
24 :
25 1 : namespace EquationsOfState {
26 : /*!
27 : * \ingroup EquationsOfStateGroup
28 : * \brief A 2D equation of state representing a barotropic fluid.
29 : *
30 : *
31 : * The equation of state takes the form
32 : *
33 : * \f[
34 : * p = p (\rho , T, Y_e) = p(\rho, 0, Y_e= Y_{e, \beta})
35 : * \f]
36 : *
37 : * where \f$\rho\f$ is the rest mass density, \f$T\f$ the
38 : * temperature , and \f$Y_e\f$ the electron fraction. The temperature and
39 : * electron fraction are not used, so evaluating this EoS at any arbtirary
40 : * temeperature or electron fraction is equivalent to evaluating it at
41 : * zero temperature and in beta equalibrium.
42 : */
43 : template <typename ColdEos>
44 1 : class Barotropic2D : public EquationOfState<ColdEos::is_relativistic, 2> {
45 : public:
46 0 : static constexpr size_t thermodynamic_dim = 2;
47 0 : static constexpr bool is_relativistic = ColdEos::is_relativistic;
48 :
49 0 : static std::string name() {
50 : return "Barotropic2D(" + pretty_type::name<ColdEos>() + ")";
51 : }
52 0 : static constexpr Options::String help = {
53 : "A 2D EoS which is independent of electron fraction and temperature. "
54 : "Contains an underlying 1D EoS which is dependent only "
55 : "on rest mass density."};
56 0 : struct UnderlyingEos {
57 0 : using type = ColdEos;
58 0 : static std::string name() { return pretty_type::short_name<ColdEos>(); }
59 0 : static constexpr Options::String help{
60 : "The underlying EoS which is being represented as a 2D EoS. Must be a "
61 : "1D EoS"};
62 : };
63 :
64 0 : using options = tmpl::list<UnderlyingEos>;
65 :
66 0 : Barotropic2D() = default;
67 0 : Barotropic2D(const Barotropic2D&) = default;
68 0 : Barotropic2D& operator=(const Barotropic2D&) = default;
69 0 : Barotropic2D(Barotropic2D&&) = default;
70 0 : Barotropic2D& operator=(Barotropic2D&&) = default;
71 0 : ~Barotropic2D() override = default;
72 :
73 0 : explicit Barotropic2D(const ColdEos& underlying_eos)
74 : : underlying_eos_(underlying_eos){};
75 :
76 : EQUATION_OF_STATE_FORWARD_DECLARE_MEMBERS(Barotropic2D, 2)
77 :
78 0 : std::unique_ptr<EquationOfState<ColdEos::is_relativistic, 2>> get_clone()
79 : const override;
80 :
81 : std::unique_ptr<EquationOfState<ColdEos::is_relativistic, 3>>
82 0 : promote_to_3d_eos() const override;
83 :
84 0 : bool is_equal(
85 : const EquationOfState<ColdEos::is_relativistic, 2>& rhs) const override;
86 :
87 : /// \brief Returns `true` if the EOS is barotropic
88 1 : bool is_barotropic() const override { return true; }
89 :
90 0 : bool operator==(const Barotropic2D<ColdEos>& rhs) const;
91 :
92 0 : bool operator!=(const Barotropic2D<ColdEos>& rhs) const;
93 : /// @{
94 : /*!
95 : * Computes the electron fraction in beta-equilibrium \f$Y_e^{\rm eq}\f$ from
96 : * the rest mass density \f$\rho\f$ and the temperature \f$T\f$.
97 : */
98 1 : Scalar<double> equilibrium_electron_fraction_from_density_temperature(
99 : const Scalar<double>& rest_mass_density,
100 : const Scalar<double>& temperature) const override {
101 : return underlying_eos_
102 : .equilibrium_electron_fraction_from_density_temperature(
103 : rest_mass_density, temperature);
104 : }
105 :
106 1 : Scalar<DataVector> equilibrium_electron_fraction_from_density_temperature(
107 : const Scalar<DataVector>& rest_mass_density,
108 : const Scalar<DataVector>& temperature) const override {
109 : return underlying_eos_
110 : .equilibrium_electron_fraction_from_density_temperature(
111 : rest_mass_density, temperature);
112 : }
113 : /// @}
114 :
115 0 : WRAPPED_PUPable_decl_base_template( // NOLINT
116 : SINGLE_ARG(EquationOfState<ColdEos::is_relativistic, 2>), Barotropic2D);
117 :
118 : /// The lower bound of the electron fraction that is valid for this EOS
119 1 : double electron_fraction_lower_bound() const override { return 0.0; }
120 :
121 : /// The upper bound of the electron fraction that is valid for this EOS
122 1 : double electron_fraction_upper_bound() const override { return 1.0; }
123 :
124 : /// The lower bound of the rest mass density that is valid for this EOS
125 1 : double rest_mass_density_lower_bound() const override {
126 : return underlying_eos_.rest_mass_density_lower_bound();
127 : }
128 :
129 : /// The upper bound of the rest mass density that is valid for this EOS
130 1 : double rest_mass_density_upper_bound() const override {
131 : return underlying_eos_.rest_mass_density_upper_bound();
132 : }
133 :
134 : /// The lower bound of the temperature that is valid for this EOS
135 1 : double temperature_lower_bound() const override { return 0.0; }
136 :
137 : /// The upper bound of the temperature that is valid for this EOS
138 1 : double temperature_upper_bound() const override {
139 : return std::numeric_limits<double>::max();
140 : }
141 :
142 : /// The lower bound of the specific internal energy that is valid for this EOS
143 : /// at the given rest mass density \f$\rho\f$ and electron fraction \f$Y_e\f$
144 1 : double specific_internal_energy_lower_bound(
145 : const double /*rest_mass_density*/) const override {
146 : return underlying_eos_.specific_internal_energy_lower_bound();
147 : }
148 :
149 : /// The upper bound of the specific internal energy that is valid for this EOS
150 : /// at the given rest mass density \f$\rho\f$
151 1 : double specific_internal_energy_upper_bound(
152 : const double /*rest_mass_density*/) const override {
153 : return underlying_eos_.specific_internal_energy_upper_bound();
154 : }
155 :
156 : /// The lower bound of the specific enthalpy that is valid for this EOS
157 1 : double specific_enthalpy_lower_bound() const override {
158 : return underlying_eos_.specific_enthalpy_lower_bound();
159 : }
160 :
161 : /// The baryon mass for this EoS
162 1 : double baryon_mass() const override { return underlying_eos_.baryon_mass(); }
163 :
164 : private:
165 : EQUATION_OF_STATE_FORWARD_DECLARE_MEMBER_IMPLS(2)
166 0 : ColdEos underlying_eos_;
167 : };
168 : /// \cond
169 : template <typename ColdEos>
170 : // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
171 : PUP::able::PUP_ID EquationsOfState::Barotropic2D<ColdEos>::my_PUP_ID = 0;
172 : /// \endcond
173 : } // namespace EquationsOfState
|