SpECTRE  v2024.04.12
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 >
 
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
 
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)
 
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)
 

Detailed Description

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.

Note
Kozlowski et al. [110] 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 Function Documentation

◆ get_clone()

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

Member Data Documentation

◆ help

constexpr 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: