SpECTRE  v2026.04.01
Loading...
Searching...
No Matches
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  Noise
 The magnitude of noise added to pressure/energy of the Disk to drive MRI. 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
template<typename DataType>
using tags
Public Types inherited from RelativisticEuler::AnalyticSolution< 3 >
using tags

Public Member Functions

 FishboneMoncriefDisk (const FishboneMoncriefDisk &)=default
FishboneMoncriefDiskoperator= (const FishboneMoncriefDisk &)=default
 FishboneMoncriefDisk (FishboneMoncriefDisk &&)=default
FishboneMoncriefDiskoperator= (FishboneMoncriefDisk &&)=default
 FishboneMoncriefDisk (double bh_mass, double bh_dimless_spin, double inner_edge_radius, double max_pressure_radius, double polytropic_constant, double polytropic_exponent, double noise)
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)
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 > >

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()
double rho_max_ = std::numeric_limits<double>::signaling_NaN()
double noise_ = std::numeric_limits<double>::signaling_NaN()
EquationsOfState::PolytropicFluid< true > equation_of_state_ {}
gr::Solutions::SphericalKerrSchild background_spacetime_ {}
double background_density_ = 1.e-7
double background_temperature_ = 2.e-5
double background_pressure_ = std::numeric_limits<double>::signaling_NaN()
double background_specific_internal_energy_

Friends

class grmhd::AnalyticData::MagnetizedFmDisk
bool operator== (const FishboneMoncriefDisk &lhs, const FishboneMoncriefDisk &rhs)

Detailed Description

Fluid disk orbiting a Kerr black hole.

The Fishbone-Moncrief solution to the 3D relativistic Euler system [74], 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. [123] (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*}

Following [173], the rest mass density is normalized to be 1. at maximum.

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. [123] denote \(l_* = u_\phi u^t\) in order to distinguish this quantity from their own definition \(l = - u_\phi/u_t\).
When using Kerr-Schild coordinates, the horizon that is at constant \(r\) is not spherical, but instead spheroidal. This could make application of boundary condition and computing various fluxes across the horizon more complicated than they need to be. Thus, we use Spherical Kerr-Schild coordinates, see gr::Solutions::SphericalKerrSchild, in which constant \(r\) is spherical. Because we compute variables in Kerr-Schild coordinates, there is a necessary extra step of transforming them back to Spherical Kerr-Schild coordinates.

Member Typedef Documentation

◆ options

using RelativisticEuler::Solutions::FishboneMoncriefDisk::options
Initial value:
The radial coordinate of the inner edge of the disk, in units of .
Definition FishboneMoncriefDisk.hpp:194
The radial coordinate of the maximum pressure, in units of .
Definition FishboneMoncriefDisk.hpp:200
The magnitude of noise added to pressure/energy of the Disk to drive MRI.
Definition FishboneMoncriefDisk.hpp:221
The dimensionless black hole spin, .
Definition BondiHoyleAccretion.hpp:92
The mass of the black hole, .
Definition BondiHoyleAccretion.hpp:86
The polytropic constant of the fluid.
Definition BondiHoyleAccretion.hpp:119
The polytropic exponent of the fluid.
Definition BondiHoyleAccretion.hpp:126

◆ tags

template<typename DataType>
using RelativisticEuler::Solutions::FishboneMoncriefDisk::tags
Initial value:
tmpl::append<hydro::grmhd_tags<DataType>,
typename gr::Solutions::SphericalKerrSchild::tags<DataType>>

Member Function Documentation

◆ get_clone()

auto RelativisticEuler::Solutions::FishboneMoncriefDisk::get_clone ( ) const -> std::unique_ptr< evolution::initial_data::InitialData >
overridevirtual

Member Data Documentation

◆ background_specific_internal_energy_

double RelativisticEuler::Solutions::FishboneMoncriefDisk::background_specific_internal_energy_
protected

◆ help

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

The documentation for this class was generated from the following file:
  • src/PointwiseFunctions/AnalyticSolutions/RelativisticEuler/FishboneMoncriefDisk.hpp