SpECTRE  v2024.04.12
grmhd::Solutions::BondiMichel Class Reference

Bondi-Michel accretion [127] with superposed magnetic field in Schwarzschild spacetime in Cartesian Kerr-Schild coordinates. More...

#include <BondiMichel.hpp>

Classes

struct  IntermediateVars
 
struct  MagFieldStrength
 The strength of the radial magnetic field. More...
 
struct  Mass
 The mass of the black hole. More...
 
struct  PolytropicExponent
 The polytropic exponent for the polytropic fluid. More...
 
struct  SonicDensity
 The rest mass density of the fluid at the sonic radius. More...
 
struct  SonicRadius
 The radius at which the fluid becomes supersonic. More...
 

Public Types

using equation_of_state_type = EquationsOfState::PolytropicFluid< true >
 
using options = tmpl::list< Mass, SonicRadius, SonicDensity, PolytropicExponent, MagFieldStrength >
 
- Public Types inherited from grmhd::AnalyticSolution
template<typename DataType >
using tags = tmpl::push_back< typename gr::AnalyticSolution< 3 >::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, 3 >, hydro::Tags::MagneticField< DataType, 3 >, hydro::Tags::DivergenceCleaningField< DataType >, hydro::Tags::LorentzFactor< DataType >, hydro::Tags::SpecificEnthalpy< DataType > >
 

Public Member Functions

 BondiMichel (const BondiMichel &)=default
 
BondiMicheloperator= (const BondiMichel &)=default
 
 BondiMichel (BondiMichel &&)=default
 
BondiMicheloperator= (BondiMichel &&)=default
 
 BondiMichel (double mass, double sonic_radius, double sonic_density, double polytropic_exponent, double mag_field_strength)
 
auto get_clone () const -> std::unique_ptr< evolution::initial_data::InitialData > override
 
template<typename DataType , typename... Tags>
tuples::TaggedTuple< Tags... > variables (const tnsr::I< DataType, 3 > &x, const double, tmpl::list< Tags... >) const
 Retrieve a collection of hydro variables at (x, t)
 
template<typename DataType , typename Tag >
tuples::TaggedTuple< Tag > variables (const tnsr::I< DataType, 3 > &x, const double, tmpl::list< Tag >) const
 
void pup (PUP::er &) override
 
const EquationsOfState::PolytropicFluid< true > & equation_of_state () const
 
virtual auto get_clone () const -> std::unique_ptr< InitialData >=0
 

Static Public Attributes

static constexpr Options::String help
 
- Static Public Attributes inherited from grmhd::AnalyticSolution
static constexpr size_t volume_dim = 3_st
 

Protected Member Functions

template<typename DataType >
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::RestMassDensity< DataType > >, const IntermediateVars< 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 > >, const IntermediateVars< DataType > &vars) const -> tuples::TaggedTuple< hydro::Tags::ElectronFraction< DataType > >
 
template<typename DataType >
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::SpecificInternalEnergy< DataType > >, const IntermediateVars< DataType > &vars) const -> tuples::TaggedTuple< hydro::Tags::SpecificInternalEnergy< DataType > >
 
template<typename DataType >
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::Pressure< DataType > >, const IntermediateVars< 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 > >, const IntermediateVars< DataType > &vars) const -> tuples::TaggedTuple< hydro::Tags::Temperature< DataType > >
 
template<typename DataType >
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::SpatialVelocity< DataType, 3 > >, const IntermediateVars< 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::MagneticField< DataType, 3 > >, const IntermediateVars< 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 > >, const IntermediateVars< DataType > &vars) const -> tuples::TaggedTuple< hydro::Tags::DivergenceCleaningField< DataType > >
 
template<typename DataType >
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::LorentzFactor< DataType > >, const IntermediateVars< DataType > &vars) const -> tuples::TaggedTuple< hydro::Tags::LorentzFactor< DataType > >
 
template<typename DataType >
auto variables (const tnsr::I< DataType, 3 > &x, tmpl::list< hydro::Tags::SpecificEnthalpy< DataType > >, const IntermediateVars< DataType > &vars) const -> tuples::TaggedTuple< hydro::Tags::SpecificEnthalpy< DataType > >
 
template<typename DataType , typename Tag , Requires< not tmpl::list_contains_v< tmpl::push_back< hydro::grmhd_tags< DataType >, hydro::Tags::SpecificEnthalpy< DataType > >, Tag > > = nullptr>
tuples::TaggedTuple< Tag > variables (const tnsr::I< DataType, 3 > &, tmpl::list< Tag >, const IntermediateVars< DataType > &vars) const
 

Protected Attributes

double mass_ = std::numeric_limits<double>::signaling_NaN()
 
double sonic_radius_ = std::numeric_limits<double>::signaling_NaN()
 
double sonic_density_ = std::numeric_limits<double>::signaling_NaN()
 
double polytropic_exponent_ = std::numeric_limits<double>::signaling_NaN()
 
double mag_field_strength_ = std::numeric_limits<double>::signaling_NaN()
 
double sonic_fluid_speed_squared_
 
double sonic_sound_speed_squared_
 
double polytropic_constant_ = std::numeric_limits<double>::signaling_NaN()
 
double mass_accretion_rate_over_four_pi_
 
double bernoulli_constant_squared_minus_one_
 
double rest_mass_density_at_infinity_
 
EquationsOfState::PolytropicFluid< true > equation_of_state_ {}
 
gr::Solutions::KerrSchild background_spacetime_ {}
 

Friends

bool operator== (const BondiMichel &lhs, const BondiMichel &rhs)
 

Detailed Description

Bondi-Michel accretion [127] with superposed magnetic field in Schwarzschild spacetime in Cartesian Kerr-Schild coordinates.

An analytic solution to the 3-D GRMHD system. The user specifies the sonic radius \(r_c\) and sonic rest mass density \(\rho_c\), which are the radius and rest mass density at the sonic point, the radius at which the fluid's Eulerian velocity as seen by a distant observer overtakes the local sound speed \(c_{s,c}\). With a specified polytropic exponent \(\gamma\), these quantities can be related to the sound speed at infinity \(c_{s,\infty}\) using the following relations:

\begin{align*} c_{s,c}^2 &= \frac{M}{2r_c - 3M} \\ c_{s,\infty}^2 &= \gamma - 1 + (c_{s,c}^2 - \gamma + 1)\sqrt{1 + 3c_{s,c}^2} \end{align*}

In the case of the interstellar medium, the sound speed is \(\approx 10^{-4}\), which results in a sonic radius of \(\approx 10^8 M\) for \(\gamma \neq 5/3\) [157].

The density is found via root-finding, through the Bernoulli equation. As one approaches the sonic radius, a second root makes an appearance and one must take care to bracket the correct root. This is done by using the upper bound \(\frac{\dot{M}}{4\pi}\sqrt{\frac{2}{Mr^3}}\).

Additionally specified by the user are the polytropic exponent \(\gamma\), and the strength parameter of the magnetic field \(B_0\). In Cartesian Kerr-Schild coordinates \((x, y, z)\), where \( r = \sqrt{x^2 + y^2 + z^2}\), the superposed magnetic field is [61]

\begin{align*} B^i(\vec{x},t) = \frac{B_0 M^2}{r^3 \sqrt{\gamma}}x^i =\frac{B_0 M^2}{r^3 \sqrt{1 + 2M/r}}x^i. \end{align*}

The accretion rate is

\begin{align*} \dot{M}=4\pi r^2\rho u^r, \end{align*}

and at the sonic radius

\begin{align*} \dot{M}_c=\sqrt{8}\pi \sqrt{M}r_c^{3/2}\rho_c. \end{align*}

The polytropic constant is given by

\begin{align*} K=\frac{1}{\gamma\rho_c^{\gamma-1}} \left[\frac{M(\gamma-1)}{(2r_c-3M)(\gamma-1)-M}\right]. \end{align*}

The density as a function of the sound speed is

\begin{align*} \rho^{\gamma-1}=\frac{(\gamma-1)c_s^2}{\gamma K(\gamma-1-c_s^2)}. \end{align*}

Horizon quantities, \f$\gamma\ne5/3\f$

The density at the horizon is given by:

\begin{align*} \rho_h\simeq\frac{1}{16} \left(\frac{5-3\gamma}{2}\right)^{(3\gamma-5)/[2(\gamma-1)]} \frac{\rho_\infty}{c_{s,\infty}^3}. \end{align*}

Using the Lorentz invariance of \(b^2\) we evaluate:

\begin{align*} b^2=\frac{B^2}{W^2}+(B^i v_i)^2= B^r B^r(1-\gamma_{rr}v^r v^r)+B^r B^r v^r v^r =B^r B^r = \frac{B_0^2 M^4}{r^4}, \end{align*}

where \(r\) is the Cartesian Kerr-Schild radius, which is equal to the areal radius for a non-spinning black hole. At the horizon we get

\begin{align*} b^2_h=\frac{B^2_0}{16}. \end{align*}

Finally, we get

\begin{align*} B_0 = 4 \sqrt{b^2_h} = 4\sqrt{\rho_h} \sqrt{\frac{b^2_h}{\rho_h}}, \end{align*}

where the last equality is useful for comparison to papers that give \(b^2_h/\rho_h\).

To help with comparing to other codes the following script can be used to compute \(b^2_h/\rho_h\):

#!/bin/env python
import numpy as np
# Input parameters
B_0 = 18
r_c = 8
rho_c = 1 / 16
gamma = 4 / 3
mass = 1
K = 1 / (gamma * rho_c**(gamma - 1)) * ((gamma - 1) * mass) / (
(2 * r_c - 3 * mass) * (gamma - 1) - mass)
c_s_c = mass / (2 * r_c - 3 * mass)
c_inf = gamma - 1 + (c_s_c - gamma + 1) * np.sqrt(1. + 3. * c_s_c)
rho_inf = ((gamma - 1) * c_inf / (gamma * K *
(gamma - 1 - c_inf)))**(1. / (gamma - 1.))
rho_h = 1. / 16. * (2.5 - 1.5 * gamma)**(
(3 * gamma - 5) / (2 * (gamma - 1))) * rho_inf / (c_inf**1.5)
print("B_0", B_0)
print("r_c: ", r_c)
print("rho_c", rho_c)
print("b_h^2/rho_h: ", B_0**2 / (16. * rho_h))
print("gamma: ", gamma)

Horizon quantities, \f$\gamma=5/3\f$

The density at the horizon is given by:

\begin{align*} \rho_h\simeq \frac{1}{16}\frac{\rho_\infty}{u_h c_{s,\infty}^3}, \end{align*}

which gives [157]

\begin{align*} \rho_h\simeq 0.08\frac{\rho_\infty}{c_{s,\infty}^3}. \end{align*}

The magnetic field \(b^2\) is the same as the \(\gamma\ne5/3\).

Member Function Documentation

◆ get_clone()

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

Member Data Documentation

◆ bernoulli_constant_squared_minus_one_

double grmhd::Solutions::BondiMichel::bernoulli_constant_squared_minus_one_
protected

◆ help

constexpr Options::String grmhd::Solutions::BondiMichel::help
staticconstexpr
Initial value:
= {
"Bondi-Michel solution with a radial magnetic field using \n"
"the Schwarzschild coordinate system. Quantities prefixed with \n"
"`sonic` refer to field quantities evaluated at the radius \n"
"where the fluid speed overtakes the sound speed."}

◆ mass_accretion_rate_over_four_pi_

double grmhd::Solutions::BondiMichel::mass_accretion_rate_over_four_pi_
protected

◆ rest_mass_density_at_infinity_

double grmhd::Solutions::BondiMichel::rest_mass_density_at_infinity_
protected

◆ sonic_fluid_speed_squared_

double grmhd::Solutions::BondiMichel::sonic_fluid_speed_squared_
protected

◆ sonic_sound_speed_squared_

double grmhd::Solutions::BondiMichel::sonic_sound_speed_squared_
protected

The documentation for this class was generated from the following file: