From fb38ec0bb637b59c2405ca5e83ead56028dabfce Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Tue, 18 Jun 2024 16:46:25 -0400 Subject: [PATCH 1/2] Add is_equilibrium and is_barotropic tests to EOSes --- .../Hydro/EquationsOfState/Barotropic3D.hpp | 3 +++ .../Hydro/EquationsOfState/EquationOfState.hpp | 8 ++++++++ .../Hydro/EquationsOfState/Equilibrium3D.hpp | 3 +++ .../Hydro/EquationsOfState/Tabulated3d.hpp | 3 +++ .../Hydro/EquationsOfState/Test_Barotropic2D.cpp | 2 ++ .../Hydro/EquationsOfState/Test_Barotropic3D.cpp | 2 ++ .../Hydro/EquationsOfState/Test_DarkEnergyFluid.cpp | 1 + .../Hydro/EquationsOfState/Test_Enthalpy.cpp | 1 + .../Hydro/EquationsOfState/Test_Equilibrium3D.cpp | 2 ++ .../Hydro/EquationsOfState/Test_HybridEos.cpp | 1 + .../Hydro/EquationsOfState/Test_IdealFluid.cpp | 2 ++ .../EquationsOfState/Test_PiecewisePolytropicFluid.cpp | 2 ++ .../Hydro/EquationsOfState/Test_PolytropicFluid.cpp | 1 + .../Hydro/EquationsOfState/Test_SpectralEoS.cpp | 1 + .../Hydro/EquationsOfState/Test_Tabulated3D.cpp | 2 ++ 15 files changed, 34 insertions(+) diff --git a/src/PointwiseFunctions/Hydro/EquationsOfState/Barotropic3D.hpp b/src/PointwiseFunctions/Hydro/EquationsOfState/Barotropic3D.hpp index c8941ac7706b..6651ea0efb86 100644 --- a/src/PointwiseFunctions/Hydro/EquationsOfState/Barotropic3D.hpp +++ b/src/PointwiseFunctions/Hydro/EquationsOfState/Barotropic3D.hpp @@ -86,6 +86,9 @@ class Barotropic3D : public EquationOfState { /// \brief Returns `true` if the EOS is barotropic bool is_barotropic() const override { return true; } + /// \brief Returns `true` if the EOS is in beta-equilibrium + bool is_equilibrium() const override { return false; } + bool operator==(const Barotropic3D& rhs) const; bool operator!=(const Barotropic3D& rhs) const; diff --git a/src/PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp b/src/PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp index 22106ff9eeb8..e2f7703837c1 100644 --- a/src/PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp +++ b/src/PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp @@ -371,6 +371,11 @@ class EquationOfState : public PUP::able { /// \brief Returns `true` if the EOS is barotropic virtual bool is_barotropic() const = 0; + /// \brief Returns `true` if the EOS is in beta-equilibrium + virtual bool is_equilibrium() const { + return true; + } + /// @{ /*! * Computes the electron fraction in beta-equilibrium \f$Y_e^{\rm eq}\f$ from @@ -571,6 +576,9 @@ class EquationOfState : public PUP::able { /// \brief Returns `true` if the EOS is barotropic virtual bool is_barotropic() const = 0; + /// \brief Returns `true` if the EOS is in beta-equilibrium + virtual bool is_equilibrium() const = 0; + /// @{ /*! * Computes the pressure \f$p\f$ from the rest mass density \f$\rho\f$, the diff --git a/src/PointwiseFunctions/Hydro/EquationsOfState/Equilibrium3D.hpp b/src/PointwiseFunctions/Hydro/EquationsOfState/Equilibrium3D.hpp index debd414410aa..51910294076f 100644 --- a/src/PointwiseFunctions/Hydro/EquationsOfState/Equilibrium3D.hpp +++ b/src/PointwiseFunctions/Hydro/EquationsOfState/Equilibrium3D.hpp @@ -85,6 +85,9 @@ class Equilibrium3D : public EquationOfState { /// \brief Returns `true` if the EOS is barotropic bool is_barotropic() const override { return false; } + /// \brief Returns `true` if the EOS is in beta-equilibrium + bool is_equilibrium() const override { return true; } + bool operator==(const Equilibrium3D& rhs) const; bool operator!=(const Equilibrium3D& rhs) const; diff --git a/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.hpp b/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.hpp index 1829f58e715c..e51f0b83b33a 100644 --- a/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.hpp +++ b/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.hpp @@ -129,6 +129,9 @@ class Tabulated3D : public EquationOfState { /// \brief Returns `true` if the EOS is barotropic bool is_barotropic() const override { return false; } + /// \breif Returns `true` if the EOS is in beta-equilibrium + bool is_equilibrium() const override { return false; } + bool operator==(const Tabulated3D& rhs) const; bool operator!=(const Tabulated3D& rhs) const; diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Barotropic2D.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Barotropic2D.cpp index 158d9d105a06..339c528f2af2 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Barotropic2D.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Barotropic2D.cpp @@ -30,6 +30,8 @@ SPECTRE_TEST_CASE("Unit.PointwiseFunctions.EquationsOfState.Barotropic2D", CHECK(eos.electron_fraction_upper_bound() == 1.0); CHECK(eos.temperature_lower_bound() == 0.0); CHECK(eos.temperature_upper_bound() == std::numeric_limits::max()); + CHECK(eos.is_barotropic()); + CHECK(eos.is_equilibrium()); { // DataVector functions const Scalar rest_mass_density{ diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Barotropic3D.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Barotropic3D.cpp index 422ae495aaf4..dc9894bc1c24 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Barotropic3D.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Barotropic3D.cpp @@ -31,6 +31,8 @@ SPECTRE_TEST_CASE("Unit.PointwiseFunctions.EquationsOfState.Barotropic3D", CHECK(eos.electron_fraction_upper_bound() == 1.0); CHECK(eos.temperature_lower_bound() == 0.0); CHECK(eos.temperature_upper_bound() == std::numeric_limits::max()); + CHECK(eos.is_barotropic()); + CHECK(not eos.is_equilibrium()); { // DataVector functions const Scalar rest_mass_density{ diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_DarkEnergyFluid.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_DarkEnergyFluid.cpp index 2dac495ae6b1..0b19d0455cc6 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_DarkEnergyFluid.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_DarkEnergyFluid.cpp @@ -29,6 +29,7 @@ void check_bounds() { CHECK(max_double == eos.specific_internal_energy_upper_bound(1.0)); CHECK(eos.baryon_mass() == approx(hydro::units::geometric::default_baryon_mass)); + CHECK(not eos.is_barotropic()); } } // namespace diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Enthalpy.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Enthalpy.cpp index 56bf91e87d13..2004a4964a3d 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Enthalpy.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Enthalpy.cpp @@ -91,6 +91,7 @@ void check_exact() { CHECK(*eos.promote_to_2d_eos() == Barotropic2D>(eos)); CHECK(eos.baryon_mass() == approx(hydro::units::geometric::default_baryon_mass)); + CHECK(eos.is_barotropic()); } // Test DataVector functions { diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Equilibrium3D.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Equilibrium3D.cpp index 59c064a64b3b..9002b05c4fd6 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Equilibrium3D.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Equilibrium3D.cpp @@ -42,6 +42,8 @@ SPECTRE_TEST_CASE("Unit.PointwiseFunctions.EquationsOfState.Equilibrium3D", CHECK(eos.electron_fraction_upper_bound() == 1.0); CHECK(eos.specific_enthalpy_lower_bound() == underlying_eos.specific_enthalpy_lower_bound()); + CHECK(not eos.is_barotropic()); + CHECK(eos.is_equilibrium()); { const double rest_mass_density = 1e-3; diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_HybridEos.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_HybridEos.cpp index bafe7697fabc..1d1207659ecb 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_HybridEos.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_HybridEos.cpp @@ -92,6 +92,7 @@ void check_exact_polytrope() { const auto p_kappa_over_rho_sq = eos.kappa_times_p_over_rho_squared_from_density_and_energy(rho, eps); CHECK(get(p_kappa_over_rho_sq) == 4.25); + CHECK(not eos.is_barotropic()); } template diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_IdealFluid.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_IdealFluid.cpp index 70957518e79b..191966cbc313 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_IdealFluid.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_IdealFluid.cpp @@ -81,6 +81,8 @@ SPECTRE_TEST_CASE("Unit.PointwiseFunctions.EquationsOfState.IdealFluid", CHECK(eos != other_type_eos); CHECK(*eos.promote_to_3d_eos() == EoS::Equilibrium3D>(eos)); + CHECK(not eos.is_barotropic()); + CHECK(not other_eos.is_barotropic()); TestHelpers::EquationsOfState::check(EoS::IdealFluid{5.0 / 3.0}, "IdealFluid", "ideal_fluid", d_for_size, diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_PiecewisePolytropicFluid.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_PiecewisePolytropicFluid.cpp index b55143f06ae1..e34f7a261ade 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_PiecewisePolytropicFluid.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_PiecewisePolytropicFluid.cpp @@ -355,6 +355,8 @@ SPECTRE_TEST_CASE( const double poly_exponent_lo = 1.5; const double poly_constant_lo = 10.0; const double poly_exponent_hi = 2.0; + //Check if barotropic + CHECK(eos.is_barotropic()); // Relativistic checks TestHelpers::EquationsOfState::check( diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_PolytropicFluid.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_PolytropicFluid.cpp index 894030789e68..3b6cc0b0ecdb 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_PolytropicFluid.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_PolytropicFluid.cpp @@ -83,6 +83,7 @@ SPECTRE_TEST_CASE("Unit.PointwiseFunctions.EquationsOfState.PolytropicFluid", EoS::Barotropic3D>(eos)); CHECK(*eos.promote_to_2d_eos() == EoS::Barotropic2D>(eos)); + CHECK(eos.is_barotropic()); const double d_for_size = std::numeric_limits::signaling_NaN(); const DataVector dv_for_size(5); TestHelpers::EquationsOfState::check(EoS::PolytropicFluid{100.0, 2.0}, diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_SpectralEoS.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_SpectralEoS.cpp index 793de13c07f8..7acb30697daf 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_SpectralEoS.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_SpectralEoS.cpp @@ -46,6 +46,7 @@ void check_exact() { EquationsOfState::Barotropic3D(eos)); CHECK(*eos.promote_to_2d_eos() == EquationsOfState::Barotropic2D(eos)); + CHECK(eos.is_barotropic()); // Test DataVector functions { const Scalar rho{DataVector{ diff --git a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Tabulated3D.cpp b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Tabulated3D.cpp index 07791d3eaae8..7f922413e5e2 100644 --- a/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Tabulated3D.cpp +++ b/tests/Unit/PointwiseFunctions/Hydro/EquationsOfState/Test_Tabulated3D.cpp @@ -194,6 +194,8 @@ SPECTRE_TEST_CASE("Unit.PointwiseFunctions.EquationsOfState.Tabulated3D", get(eos.sound_speed_squared_from_density_and_temperature( state[1], state[0], state[2])) < 1.e-12); + CHECK(not eos.is_barotropic()); + CHECK(not eos.is_equilibrium()); const auto eps_interp = eos.specific_internal_energy_from_density_and_temperature( From 85dc042ec7fa729469a70ecb3c69a1a3633628de Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Thu, 20 Jun 2024 15:35:27 -0400 Subject: [PATCH 2/2] Add equilibrium_electron_fraction_from_density_temperature to 3D EOS --- .../Hydro/EquationsOfState/Barotropic3D.hpp | 5 +++-- .../Hydro/EquationsOfState/EquationOfState.hpp | 15 +++++++++++++++ .../Hydro/EquationsOfState/Equilibrium3D.hpp | 5 +++-- .../Hydro/EquationsOfState/Tabulated3d.cpp | 9 +++++++++ .../Hydro/EquationsOfState/Tabulated3d.hpp | 7 ++++--- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/PointwiseFunctions/Hydro/EquationsOfState/Barotropic3D.hpp b/src/PointwiseFunctions/Hydro/EquationsOfState/Barotropic3D.hpp index 6651ea0efb86..a1004b402f67 100644 --- a/src/PointwiseFunctions/Hydro/EquationsOfState/Barotropic3D.hpp +++ b/src/PointwiseFunctions/Hydro/EquationsOfState/Barotropic3D.hpp @@ -15,6 +15,7 @@ #include #include +#include "DataStructures/Tensor/Tensor.hpp" #include "DataStructures/Tensor/TypeAliases.hpp" #include "Options/String.hpp" #include "PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp" @@ -99,7 +100,7 @@ class Barotropic3D : public EquationOfState { */ Scalar equilibrium_electron_fraction_from_density_temperature( const Scalar& rest_mass_density, - const Scalar& temperature) const { + const Scalar& temperature) const override { return underlying_eos_ .equilibrium_electron_fraction_from_density_temperature( rest_mass_density, temperature); @@ -107,7 +108,7 @@ class Barotropic3D : public EquationOfState { Scalar equilibrium_electron_fraction_from_density_temperature( const Scalar& rest_mass_density, - const Scalar& temperature) const { + const Scalar& temperature) const override { return underlying_eos_ .equilibrium_electron_fraction_from_density_temperature( rest_mass_density, temperature); diff --git a/src/PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp b/src/PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp index e2f7703837c1..2b90097f45af 100644 --- a/src/PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp +++ b/src/PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp @@ -579,6 +579,21 @@ class EquationOfState : public PUP::able { /// \brief Returns `true` if the EOS is in beta-equilibrium virtual bool is_equilibrium() const = 0; + /// @{ + /*! + * Computes the electron fraction in beta-equilibrium \f$Y_e^{\rm eq}\f$ from + * the rest mass density \f$\rho\f$ and the temperature \f$T\f$. + */ + virtual Scalar equilibrium_electron_fraction_from_density_temperature( + const Scalar& /*rest_mass_density*/, + const Scalar& /*temperature*/) const = 0; + + virtual Scalar + equilibrium_electron_fraction_from_density_temperature( + const Scalar& /*rest_mass_density*/, + const Scalar& /*temperature*/) const = 0; + /// @} + /// @{ /*! * Computes the pressure \f$p\f$ from the rest mass density \f$\rho\f$, the diff --git a/src/PointwiseFunctions/Hydro/EquationsOfState/Equilibrium3D.hpp b/src/PointwiseFunctions/Hydro/EquationsOfState/Equilibrium3D.hpp index 51910294076f..b161ebb2e2ed 100644 --- a/src/PointwiseFunctions/Hydro/EquationsOfState/Equilibrium3D.hpp +++ b/src/PointwiseFunctions/Hydro/EquationsOfState/Equilibrium3D.hpp @@ -15,6 +15,7 @@ #include #include +#include "DataStructures/Tensor/Tensor.hpp" #include "DataStructures/Tensor/TypeAliases.hpp" #include "Options/String.hpp" #include "PointwiseFunctions/Hydro/EquationsOfState/EquationOfState.hpp" @@ -98,7 +99,7 @@ class Equilibrium3D : public EquationOfState { */ Scalar equilibrium_electron_fraction_from_density_temperature( const Scalar& rest_mass_density, - const Scalar& temperature) const { + const Scalar& temperature) const override{ return underlying_eos_ .equilibrium_electron_fraction_from_density_temperature( rest_mass_density, temperature); @@ -106,7 +107,7 @@ class Equilibrium3D : public EquationOfState { Scalar equilibrium_electron_fraction_from_density_temperature( const Scalar& rest_mass_density, - const Scalar& temperature) const { + const Scalar& temperature) const override { return underlying_eos_ .equilibrium_electron_fraction_from_density_temperature( rest_mass_density, temperature); diff --git a/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.cpp b/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.cpp index 94f00b314a48..9273167bfab3 100644 --- a/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.cpp +++ b/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.cpp @@ -660,3 +660,12 @@ Tabulated3D::Tabulated3D(const std::string& filename, template class EquationsOfState::Tabulated3D; template class EquationsOfState::Tabulated3D; + +template Scalar EquationsOfState::Tabulated3D:: + equilibrium_electron_fraction_from_density_temperature_impl( + Tensor, brigand::list<>> const&, + Tensor, brigand::list<>> const&) const; +template Scalar EquationsOfState::Tabulated3D:: + equilibrium_electron_fraction_from_density_temperature_impl( + Tensor, brigand::list<>> const&, + Tensor, brigand::list<>> const&) const; diff --git a/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.hpp b/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.hpp index e51f0b83b33a..06829fe871c8 100644 --- a/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.hpp +++ b/src/PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.hpp @@ -13,6 +13,7 @@ #include #include +#include "DataStructures/Tensor/Tensor.hpp" #include "DataStructures/Tensor/TypeAliases.hpp" #include "IO/H5/EosTable.hpp" #include "IO/H5/File.hpp" @@ -129,7 +130,7 @@ class Tabulated3D : public EquationOfState { /// \brief Returns `true` if the EOS is barotropic bool is_barotropic() const override { return false; } - /// \breif Returns `true` if the EOS is in beta-equilibrium + /// \brief Returns `true` if the EOS is in beta-equilibrium bool is_equilibrium() const override { return false; } bool operator==(const Tabulated3D& rhs) const; @@ -148,14 +149,14 @@ class Tabulated3D : public EquationOfState { */ Scalar equilibrium_electron_fraction_from_density_temperature( const Scalar& rest_mass_density, - const Scalar& temperature) const { + const Scalar& temperature) const override { return equilibrium_electron_fraction_from_density_temperature_impl( rest_mass_density, temperature); } Scalar equilibrium_electron_fraction_from_density_temperature( const Scalar& rest_mass_density, - const Scalar& temperature) const { + const Scalar& temperature) const override { return equilibrium_electron_fraction_from_density_temperature_impl< DataVector>(rest_mass_density, temperature); }