SpECTRE  2021.08.02
RelativisticEuler::Solutions::FishboneMoncriefDisk Class Reference

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 >
 
- 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::SpecificInternalEnergy< 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 &)=delete
 
FishboneMoncriefDiskoperator= (const FishboneMoncriefDisk &)=delete
 
 FishboneMoncriefDisk (FishboneMoncriefDisk &&) noexcept=default
 
FishboneMoncriefDiskoperator= (FishboneMoncriefDisk &&) noexcept=default
 
 FishboneMoncriefDisk (double bh_mass, double bh_dimless_spin, double inner_edge_radius, double max_pressure_radius, double polytropic_constant, double polytropic_exponent) noexcept
 
template<typename DataType >
DataType sigma (const DataType &r_sqrd, const DataType &sin_theta_sqrd) const noexcept
 
template<typename DataType >
DataType inv_ucase_a (const DataType &r_sqrd, const DataType &sin_theta_sqrd, const DataType &delta) const noexcept
 
template<typename DataType >
DataType four_velocity_t_sqrd (const DataType &r_sqrd, const DataType &sin_theta_sqrd) const noexcept
 
template<typename DataType >
DataType angular_velocity (const DataType &r_sqrd, const DataType &sin_theta_sqrd) const noexcept
 
template<typename DataType >
DataType potential (const DataType &r_sqrd, const DataType &sin_theta_sqrd) const noexcept
 
template<typename T >
size_t index_helper (T) const noexcept
 
void pup (PUP::er &) noexcept
 
const EquationsOfState::PolytropicFluid< true > & equation_of_state () const noexcept
 
template<typename DataType , typename... Tags>
tuples::TaggedTuple< Tags... > variables (const tnsr::I< DataType, 3 > &x, const double t, tmpl::list< Tags... >) const noexcept
 The fluid variables in Cartesian Kerr-Schild coordinates at (x, t) More...
 
template<typename DataType , typename Tag >
tuples::TaggedTuple< Tag > variables (const tnsr::I< DataType, 3 > &x, const double t, tmpl::list< Tag >) const noexcept
 The fluid variables in Cartesian Kerr-Schild coordinates at (x, t) More...
 

Static Public Member Functions

static size_t index_helper (tmpl::no_such_type_) noexcept
 

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 , bool NeedSpacetime>
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::RestMassDensity< DataType > >, const IntermediateVariables< DataType, NeedSpacetime > &vars, size_t index) const noexcept -> tuples::TaggedTuple< hydro::Tags::RestMassDensity< DataType > >
 
template<typename DataType , bool NeedSpacetime>
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::SpecificEnthalpy< DataType > >, const IntermediateVariables< DataType, NeedSpacetime > &vars, size_t index) const noexcept -> tuples::TaggedTuple< hydro::Tags::SpecificEnthalpy< DataType > >
 
template<typename DataType , bool NeedSpacetime>
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::Pressure< DataType > >, const IntermediateVariables< DataType, NeedSpacetime > &vars, size_t index) const noexcept -> tuples::TaggedTuple< hydro::Tags::Pressure< DataType > >
 
template<typename DataType , bool NeedSpacetime>
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::SpecificInternalEnergy< DataType > >, const IntermediateVariables< DataType, NeedSpacetime > &vars, size_t index) const noexcept -> tuples::TaggedTuple< hydro::Tags::SpecificInternalEnergy< DataType > >
 
template<typename DataType >
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::SpatialVelocity< DataType, 3 > >, const IntermediateVariables< DataType, true > &vars, size_t index) const noexcept -> tuples::TaggedTuple< hydro::Tags::SpatialVelocity< DataType, 3 > >
 
template<typename DataType >
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::LorentzFactor< DataType > >, const IntermediateVariables< DataType, true > &vars, size_t index) const noexcept -> tuples::TaggedTuple< hydro::Tags::LorentzFactor< DataType > >
 
template<typename DataType , bool NeedSpacetime>
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::MagneticField< DataType, 3 > >, const IntermediateVariables< DataType, NeedSpacetime > &vars, size_t index) const noexcept -> tuples::TaggedTuple< hydro::Tags::MagneticField< DataType, 3 > >
 
template<typename DataType , bool NeedSpacetime>
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::DivergenceCleaningField< DataType > >, const IntermediateVariables< DataType, NeedSpacetime > &vars, size_t index) const noexcept -> tuples::TaggedTuple< hydro::Tags::DivergenceCleaningField< DataType > >
 
template<typename DataType , typename Tag , Requires< not tmpl::list_contains_v< hydro::grmhd_tags< DataType >, Tag > > = nullptr>
tuples::TaggedTuple< Tag > variables (const tnsr::I< DataType, 3 > &, tmpl::list< Tag >, IntermediateVariables< DataType, true > &vars, const size_t index) const noexcept
 
template<typename DataType , bool NeedSpacetime, typename Func >
void variables_impl (const IntermediateVariables< DataType, NeedSpacetime > &vars, Func f) const noexcept
 

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::KerrSchild background_spacetime_ {}
 

Friends

bool operator== (const FishboneMoncriefDisk &lhs, const FishboneMoncriefDisk &rhs) noexcept
 

Detailed Description

Fluid disk orbiting a Kerr black hole.

The Fishbone-Moncrief solution to the 3D relativistic Euler system [42], 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\)). Note that \(r\) and \(\theta\) can also be interpreted as Kerr (a.k.a. "spherical" Kerr-Schild) coordinates (see gr::KerrSchildCoords), and that the symmetries of the equilibrium ensure that \(u^\mu\) as defined above is also the 4-velocity in Kerr coordinates.

Self-gravity is neglected, so that the fluid variables are determined as functions of the metric. Following the treatment by Kozlowski et al. [67] (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.

Note
Kozlowski et al. [67] denote \(l_* = u_\phi u^t\) in order to distinguish this quantity from their own definition \(l = - u_\phi/u_t\).

Member Function Documentation

◆ variables() [1/2]

template<typename DataType , typename Tag >
tuples::TaggedTuple< Tag > RelativisticEuler::Solutions::FishboneMoncriefDisk::variables ( const tnsr::I< DataType, 3 > &  x,
const double  t,
tmpl::list< Tag >   
) const
inlinenoexcept

The fluid variables in Cartesian Kerr-Schild coordinates at (x, t)

Note
The functions are optimized for retrieving the hydro variables before the metric variables.

◆ variables() [2/2]

template<typename DataType , typename... Tags>
tuples::TaggedTuple< Tags... > RelativisticEuler::Solutions::FishboneMoncriefDisk::variables ( const tnsr::I< DataType, 3 > &  x,
const double  t,
tmpl::list< Tags... >   
) const
inlinenoexcept

The fluid variables in Cartesian Kerr-Schild coordinates at (x, t)

Note
The functions are optimized for retrieving the hydro variables before the metric variables.

Member Data Documentation

◆ help

constexpr Options::String RelativisticEuler::Solutions::FishboneMoncriefDisk::help
staticconstexpr
Initial value:
= {
"Fluid disk orbiting a Kerr black hole."}