SpECTRE
v2024.04.12
|
Fluid disk orbiting a Kerr black hole. More...
#include <FishboneMoncriefDisk.hpp>
Classes | |
struct | BhDimlessSpin |
The dimensionless black hole spin, \(\chi = a/M\). More... | |
struct | BhMass |
The mass of the black hole, \(M\). More... | |
struct | InnerEdgeRadius |
The radial coordinate of the inner edge of the disk, in units of \(M\). More... | |
struct | IntermediateVariables |
struct | MaxPressureRadius |
The radial coordinate of the maximum pressure, in units of \(M\). More... | |
struct | PolytropicConstant |
The polytropic constant of the fluid. More... | |
struct | PolytropicExponent |
The polytropic exponent of the fluid. More... | |
Public Types | |
using | equation_of_state_type = EquationsOfState::PolytropicFluid< true > |
using | options = tmpl::list< BhMass, BhDimlessSpin, InnerEdgeRadius, MaxPressureRadius, PolytropicConstant, PolytropicExponent > |
template<typename DataType > | |
using | tags = tmpl::append< hydro::grmhd_tags< DataType >, typename gr::Solutions::SphericalKerrSchild::tags< DataType > > |
Public Types inherited from RelativisticEuler::AnalyticSolution< 3 > | |
using | tags = tmpl::push_back< typename gr::AnalyticSolution< Dim >::template tags< DataType >, hydro::Tags::RestMassDensity< DataType >, hydro::Tags::ElectronFraction< DataType >, hydro::Tags::SpecificInternalEnergy< DataType >, hydro::Tags::Temperature< DataType >, hydro::Tags::Pressure< DataType >, hydro::Tags::SpatialVelocity< DataType, Dim >, hydro::Tags::MagneticField< DataType, Dim >, hydro::Tags::DivergenceCleaningField< DataType >, hydro::Tags::LorentzFactor< DataType >, hydro::Tags::SpecificEnthalpy< DataType > > |
Public Member Functions | |
FishboneMoncriefDisk (const FishboneMoncriefDisk &)=default | |
FishboneMoncriefDisk & | operator= (const FishboneMoncriefDisk &)=default |
FishboneMoncriefDisk (FishboneMoncriefDisk &&)=default | |
FishboneMoncriefDisk & | operator= (FishboneMoncriefDisk &&)=default |
FishboneMoncriefDisk (double bh_mass, double bh_dimless_spin, double inner_edge_radius, double max_pressure_radius, double polytropic_constant, double polytropic_exponent) | |
auto | get_clone () const -> std::unique_ptr< evolution::initial_data::InitialData > override |
template<typename DataType > | |
DataType | sigma (const DataType &r_sqrd, const DataType &sin_theta_sqrd) const |
template<typename DataType > | |
DataType | inv_ucase_a (const DataType &r_sqrd, const DataType &sin_theta_sqrd, const DataType &delta) const |
template<typename DataType > | |
DataType | four_velocity_t_sqrd (const DataType &r_sqrd, const DataType &sin_theta_sqrd) const |
template<typename DataType > | |
DataType | angular_velocity (const DataType &r_sqrd, const DataType &sin_theta_sqrd) const |
template<typename DataType > | |
DataType | potential (const DataType &r_sqrd, const DataType &sin_theta_sqrd) const |
void | pup (PUP::er &p) override |
const EquationsOfState::PolytropicFluid< true > & | equation_of_state () const |
template<typename DataType , typename... Tags> | |
tuples::TaggedTuple< Tags... > | variables (const tnsr::I< DataType, 3 > &x, const double, tmpl::list< Tags... >) const |
The variables in Cartesian Spherical-Kerr-Schild coordinates at (x, t) | |
template<typename DataType , typename Tag > | |
tuples::TaggedTuple< Tag > | variables (const tnsr::I< DataType, 3 > &x, const double, tmpl::list< Tag >) const |
The variables in Cartesian Spherical-Kerr-Schild coordinates at (x, t) | |
virtual auto | get_clone () const -> std::unique_ptr< InitialData >=0 |
Public Member Functions inherited from hydro::TemperatureInitialization< FishboneMoncriefDisk > | |
auto | variables (const tnsr::I< DataType, Dim > &x, tmpl::list< hydro::Tags::Temperature< DataType > >) const -> tuples::TaggedTuple< hydro::Tags::Temperature< DataType > > |
auto | variables (const tnsr::I< DataType, Dim > &x, const double t, tmpl::list< hydro::Tags::Temperature< DataType > >) const -> tuples::TaggedTuple< hydro::Tags::Temperature< DataType > > |
auto | variables (ExtraVars &extra_variables, const tnsr::I< DataType, Dim > &x, Args &... extra_args, tmpl::list< hydro::Tags::Temperature< DataType > >) const -> tuples::TaggedTuple< hydro::Tags::Temperature< DataType > > |
Static Public Attributes | |
static constexpr Options::String | help |
Static Public Attributes inherited from RelativisticEuler::AnalyticSolution< 3 > | |
static constexpr size_t | volume_dim |
Protected Member Functions | |
template<typename DataType > | |
auto | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::RestMassDensity< DataType > >, gsl::not_null< IntermediateVariables< DataType > * > vars) const -> tuples::TaggedTuple< hydro::Tags::RestMassDensity< DataType > > |
template<typename DataType > | |
auto | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::ElectronFraction< DataType > >, gsl::not_null< IntermediateVariables< DataType > * > vars) const -> tuples::TaggedTuple< hydro::Tags::ElectronFraction< DataType > > |
template<typename DataType > | |
auto | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::SpecificEnthalpy< DataType > >, gsl::not_null< IntermediateVariables< DataType > * > vars) const -> tuples::TaggedTuple< hydro::Tags::SpecificEnthalpy< DataType > > |
template<typename DataType > | |
auto | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::Pressure< DataType > >, gsl::not_null< IntermediateVariables< DataType > * > vars) const -> tuples::TaggedTuple< hydro::Tags::Pressure< DataType > > |
template<typename DataType > | |
auto | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::Temperature< DataType > >, gsl::not_null< IntermediateVariables< DataType > * > vars) const -> tuples::TaggedTuple< hydro::Tags::Temperature< DataType > > |
template<typename DataType > | |
auto | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::SpecificInternalEnergy< DataType > >, gsl::not_null< IntermediateVariables< DataType > * > vars) const -> tuples::TaggedTuple< hydro::Tags::SpecificInternalEnergy< DataType > > |
template<typename DataType > | |
auto | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::SpatialVelocity< DataType, 3 > >, gsl::not_null< IntermediateVariables< DataType > * > vars) const -> tuples::TaggedTuple< hydro::Tags::SpatialVelocity< DataType, 3 > > |
template<typename DataType > | |
auto | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::LorentzFactor< DataType > >, gsl::not_null< IntermediateVariables< DataType > * > vars) const -> tuples::TaggedTuple< hydro::Tags::LorentzFactor< DataType > > |
template<typename DataType > | |
auto | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::MagneticField< DataType, 3 > >, gsl::not_null< IntermediateVariables< DataType > * > vars) const -> tuples::TaggedTuple< hydro::Tags::MagneticField< DataType, 3 > > |
template<typename DataType > | |
auto | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::DivergenceCleaningField< DataType > >, gsl::not_null< IntermediateVariables< DataType > * > vars) const -> tuples::TaggedTuple< hydro::Tags::DivergenceCleaningField< DataType > > |
template<typename DataType , typename Tag , Requires< not tmpl::list_contains_v< tmpl::push_back< hydro::grmhd_tags< DataType >, hydro::Tags::SpecificEnthalpy< DataType >, hydro::Tags::SpatialVelocity< DataType, 3 >, hydro::Tags::LorentzFactor< DataType > >, Tag > > = nullptr> | |
tuples::TaggedTuple< Tag > | variables (const tnsr::I< DataType, 3 > &x, tmpl::list< Tag >, gsl::not_null< IntermediateVariables< DataType > * > vars) const |
template<typename DataType , typename Func > | |
void | variables_impl (gsl::not_null< IntermediateVariables< DataType > * > vars, Func f) const |
Protected Attributes | |
double | bh_mass_ = std::numeric_limits<double>::signaling_NaN() |
double | bh_spin_a_ = std::numeric_limits<double>::signaling_NaN() |
double | inner_edge_radius_ = std::numeric_limits<double>::signaling_NaN() |
double | max_pressure_radius_ = std::numeric_limits<double>::signaling_NaN() |
double | polytropic_constant_ = std::numeric_limits<double>::signaling_NaN() |
double | polytropic_exponent_ = std::numeric_limits<double>::signaling_NaN() |
double | angular_momentum_ = std::numeric_limits<double>::signaling_NaN() |
EquationsOfState::PolytropicFluid< true > | equation_of_state_ {} |
gr::Solutions::SphericalKerrSchild | background_spacetime_ {} |
Friends | |
class | grmhd::AnalyticData::MagnetizedFmDisk |
bool | operator== (const FishboneMoncriefDisk &lhs, const FishboneMoncriefDisk &rhs) |
Fluid disk orbiting a Kerr black hole.
The Fishbone-Moncrief solution to the 3D relativistic Euler system [64], representing the isentropic flow of a thick fluid disk orbiting a Kerr black hole. In Boyer-Lindquist coordinates \((t, r, \theta, \phi)\), the flow is assumed to be purely toroidal,
\begin{align*} u^\mu = (u^t, 0, 0, u^\phi), \end{align*}
where \(u^\mu\) is the 4-velocity. Then, all the fluid quantities are assumed to share the same symmetries as those of the background spacetime, namely they are stationary (independent of \(t\)), and axially symmetric (independent of \(\phi\)).
Self-gravity is neglected, so that the fluid variables are determined as functions of the metric. Following the treatment by Kozlowski et al. [110] (but using signature +2) the solution is expressed in terms of the quantities
\begin{align*} \Omega &= \dfrac{u^\phi}{u^t},\\ W &= W_\text{in} - \int_{p_\text{in}}^p\frac{dp}{e + p}, \end{align*}
where \(\Omega\) is the angular velocity, \(p\) is the fluid pressure, \(e\) is the energy density, and \(W\) is an auxiliary quantity interpreted in the Newtonian limit as the total (gravitational + centrifugal) potential. \(W_\text{in}\) and \(p_\text{in}\) are the potential and the pressure at the radius of the inner edge, i.e. the closest edge to the black hole. Here we assume \(p_\text{in} = 0.\) The solution to the Euler equation is then
\begin{align*} (u^t)^2 &= \frac{A}{2\Delta\Sigma}\left(1 + \sqrt{1 + \frac{4l^2\Delta \Sigma^2}{A^2\sin^2\theta}}\right)\\ \Omega &= \frac{\Sigma}{A (u^t)^2}\frac{l}{\sin^2\theta} + \frac{2Mra}{A}\\ u^\phi &= \Omega u^t\\ W &= l\Omega - \ln u^t, \end{align*}
where
\begin{align*} \Sigma = r^2 + a^2\cos^2\theta\qquad \Delta = r^2 - 2Mr + a^2\qquad A = (r^2 + a^2)^2 - \Delta a^2 \sin^2\theta \end{align*}
and \(l = u_\phi u^t\) is the so-called angular momentum per unit intertial mass, which is a parameter defining an individual disk. In deriving the solution, an integration constant has been chosen so that \( W\longrightarrow 0\) as \(r\longrightarrow \infty\), in accordance with the Newtonian limit. Note that, from its definition, equipotential contours coincide with isobaric contours. Physically, the matter can fill each of the closed surfaces \(W = \text{const}\), giving rise to an orbiting thick disk. For \(W > 0\), all equipotentials are open, whereas for \(W < 0\), some of them will be closed. Should a disk exist, the pressure reaches a maximum value on the equator at a coordinate radius \(r_\text{max}\) that is related to the angular momentum per unit inertial mass via
\begin{align*} l = \dfrac{M^{1/2}(r_\text{max}^{3/2} + aM^{1/2})(a^2 - 2aM^{1/2} r_\text{max}^{1/2} + r_\text{max}^2)}{2aM^{1/2}r_\text{max}^{3/2} + (r_\text{max} - 3M)r_\text{max}^2}. \end{align*}
Once \(W\) is determined, an equation of state is required in order to obtain the thermodynamic variables. If the flow is isentropic, the specific enthalpy can readily be obtained from the first and second laws of thermodynamics: one has
\begin{align*} \frac{dp}{e + p} = \frac{dh}{h} \end{align*}
so that
\begin{align*} h = h_\text{in}\exp(W_\text{in} - W), \end{align*}
and the pressure can be obtained from a thermodynamic relation of the form \(h = h(p)\). Here we assume a polytropic relation
\begin{align*} p = K\rho^\gamma. \end{align*}
Once all the variables are known in Boyer-Lindquist (or Kerr) coordinates, it is straightforward to write them in Cartesian Kerr-Schild coordinates. The coordinate transformation in gr::KerrSchildCoords helps read the Jacobian matrix, which, applied to the azimuthal flow of the disk, gives
\begin{align*} u_\text{KS}^\mu = u^t(1, -y\Omega, x\Omega, 0), \end{align*}
where \(u^t\) and \(\Omega\) are now understood as functions of the Kerr-Schild coordinates. Finally, the spatial velocity can be readily obtained from its definition,
\begin{align*} \alpha v^i = \frac{u^i}{u^t} + \beta^i, \end{align*}
where \(\alpha\) and \(\beta^i\) are the lapse and the shift, respectively.
|
overridevirtual |
Implements evolution::initial_data::InitialData.
|
staticconstexpr |