Radiative models

Radiative models are represented by types that contain all the information necessary to calculate the radiation emitted by a source. The key functions defining these models include rest_frame_four_velocity!, rest_frame_bolometric_intensity, and rest_frame_specific_intensity. These functions compute the four-velocity of the local rest frame, as well as the bolometric and specific intensity in that frame within the emission region.

Examples

The following example demonstrates how to compute these quantities for a Novikov-Thorne accretion disk in Kerr spacetime at a given position. First, create a Kerr spacetime with mass M = 1.0 and spin a = 0.5, and obtain its coordinates topology

spacetime = KerrSpacetimeBoyerLindquistCoordinates(M=1.0, a=0.5)
coords_top = coordinates_topology(spacetime)

Set the position at t = 0.0, r = 3.0, θ = π/2 and φ = 0.0, and calculate the metric

position = [0.0, 5.0, π/2, 0.0]  #t=0.0, r = 3.0, θ = π/2, φ = 0.0
g = zeros(4,4)
metric!(g, position, spacetime)

Create a Novikov-Thorne disk with the inner radius at the ISCO of the spacetime, and an outer radius of $1000$. Assume the unit mass is $10^{7}$ solar masses, and the accretion rate is $10\%$ of the Eddington accretion rate with a radiative efficiency of $10\%$:

disk = NovikovThorneDisk(inner_radius=isco_radius(spacetime, ProgradeRotation()), 
    outer_radius = 1000.0, 
    M1 = 1e7, 
    Mdot_to_MEdd = 0.1, 
    η = 0.1)

Compute the disk four-velocity at the position:

u = zeros(4)
rest_frame_four_velocity!(u, position, spacetime, disk, coords_top)

Since the emission in the local rest frame is isotropic, use a random photon momentum

momentum = rand(4) 

Compute the bolometric intensity and the specific intensity at an energy of $10^{-4}$ erg in the local rest frame:

Ibol = rest_frame_bolometric_intensity(position, momentum, u, g, spacetime, disk, coords_top)
energy = 1e-4
Ispec = rest_frame_specific_intensity(position, momentum, energy, u, g, spacetime, disk, coords_top)

For certain models, more specialized functions are available. For models with thermal emission, obtain the temperature at a given position with the temperature function:

T = temperature(position, spacetime, disk)

For line emission models, calculate the emissivity profile with the line_emission_profile function

disk = AccretionDiskWithFlatLamppostProfile(inner_radius=isco_radius(spacetime, ProgradeRotation()), 
    outer_radius = 1000.0,
    corona_height = 10.0)
ϵ = line_emission_profile(position, momentum, u, g, spacetime, disk, coords_top)

For models involving more complex calculations, cache objects are required to store intermediate results. Construct these caches with the allocate_cache function.

spacetime_cache = allocate_cache(spacetime)
model_cache = allocate_cache(disk)
rest_frame_four_velocity!(u, position, spacetime, disk, coords_top, spacetime_cache, model_cache)
Ibol = rest_frame_bolometric_intensity(position, momentum, u, g, spacetime, disk, coords_top, model_cache)
Ispec = rest_frame_specific_intensity(position, momentum, energy, u, g, spacetime, disk, coords_top, model_cache)

Catalogue

The currently available radiative models are as follows:

Geometrically thin, optically thick accretion disks

These accretion disk models are hydrostationary, geometrically thin, and optically thick, assuming the disk is in the equatorial plane of the spacetime and occupying a finite radial range. The disk particles follow circular geodesics, requiring circular_geodesic_angular_speed to be implemented for the chosen spacetime.

Thermal radiation

These models assume the disk emits as a blackbody with a position-dependent temperature.

Skylight.ShakuraSunyaevDiskType
ShakuraSunyaevDisk <: AbstractAccretionDisk

Shakura & Sunyaev geometrically thin, optically thick accretion disk model.

Fields

  • inner_radius::Float64: The inner of the accretion disk. Must be larger than or equal to zero.
  • outer_radius::Float64: The outer radius of the accretion disk. Must be larger than or equal to inner_radius.
  • M1::Float64: The unitary mass in solar masses. Must be positive.
  • Mdot_to_MEdd::Float64: The accretion rate in units of the Eddington accretion rate. Must be positive.
  • η::Float64: The radiative efficiency of the disk, which must be in the range (0, 1].
  • rotation_sense::AbstractRotationSense: The sense of rotation of the disk, which can be either ProgradeRotation() or RetrogradeRotation(). Default is ProgradeRotation().

Examples

spacetime = KerrSpacetimeBoyerLindquistCoordinates(M=1.0, a=0.5)
risco = isco_radius(spacetime, ProgradeRotation())
disk = ShakuraSunyaevDisk(inner_radius = risco, outer_radius=1000.0, M1=1e7, Mdot_to_MEdd=0.1, η=0.1)
source
Skylight.NovikovThorneDiskType
NovikovThorneDisk <: AbstractAccretionDisk

Novikov & Thorne geometrically thin, optically thick accretion disk model around a Schwarzschild/Kerr black hole.

Fields

  • inner_radius::Float64: The inner radius of the accretion disk. Must be larger than or equal to zero.
  • outer_radius::Float64: The outer radius of the accretion disk. Must be larger than or equal to inner_radius.
  • M1::Float64: The unitary mass in solar masses. Must be positive. Default is 1.0.
  • Mdot_to_MEdd::Float64: The accretion rate in units of the Eddington accretion rate. Must be positive. Default is 0.1.
  • η::Float64: The radiative efficiency of the disk, which must be in the range (0, 1]. Default is 0.1.
  • rotation_sense::AbstractRotationSense: The sense of rotation of the disk, which can be either ProgradeRotation() or RetrogradeRotation(). Default is ProgradeRotation().

Examples

spacetime = KerrSpacetimeBoyerLindquistCoordinates(M=1.0, a=0.5)
risco = isco_radius(spacetime, ProgradeRotation())
disk = NovikovThorneDisk(inner_radius = risco, outer_radius=1000.0, M1=1e7, Mdot_to_MEdd=0.1, η=0.1)
source
Skylight.AccretionDiskWithTabulatedTemperatureType
AccretionDiskWithTabulatedTemperature <: AbstractAccretionDisk

Geometrically thin, optically thick axisymmetric accretion disk model with tabulated temperature.

Fields

  • inner_radius::Float64: The inner of the accretion disk. Must be larger than or equal to zero.
  • outer_radius::Float64: The outer radius of the accretion disk. Must be larger than or equal to inner_radius.
  • rotation_sense::AbstractRotationSense: The sense of rotation of the disk, which can be either ProgradeRotation() or RetrogradeRotation(). Default is ProgradeRotation().
  • filename::String: The name of a two-column file containing the temperature profile as radius vs. temperature.

Examples

disk = AccretionDiskWithTabulatedTemperature(inner_radius=6.0, outer_radius=1000.0, filename="temperature.txt")
source
Skylight.RARDiskType
RARDisk <: AbstractAccretionDisk

RAR extension of the Shakura & Sunyaev geometrically thin, optically thick accretion disk model (Millauro et al. 2024).

Fields

  • inner_radius::Float64: The inner of the accretion disk. Must be larger than or equal to zero.
  • outer_radius::Float64: The outer radius of the accretion disk. Must be larger than or equal to inner_radius.
  • M1::Float64: The unitary mass in solar masses. Must be positive.
  • Mdot_to_MEdd::Float64: The accretion rate in units of the Eddington accretion rate. Must be positive.
  • η::Float64: The radiative efficiency of the disk, which must be in the range (0, 1].
  • rotation_sense::AbstractRotationSense: The sense of rotation of the disk, which can be either ProgradeRotation() or RetrogradeRotation(). Default is ProgradeRotation().

Examples

disk = RARDisk(inner_radius=0.0, outer_radius=1000.0, M1=1e7, Mdot_to_MEdd=0.1, η=0.1)
source

Line emission

In these models, the radiation corresponds to line emission from the accretion disk.

Skylight.AccretionDiskWithFlatLamppostProfileType
AccretionDiskWithFlatLamppostProfile <: AbstractAccretionDisk

Geometrically thin, optically thick accretion disk model with lamppost corona line emissivity profile as in flat spacetime:

$\epsilon \propto \frac{h}{(r^2+h^2)^{3/2}}$

where h is the height of the corona above the disk plane.

Fields

  • inner_radius::Float64: The inner of the accretion disk. Must be larger than or equal to zero.
  • outer_radius::Float64: The outer radius of the accretion disk. Must be larger than or equal to inner_radius.
  • rotation_sense::AbstractRotationSense: The sense of rotation of the disk, which can be either ProgradeRotation() or RetrogradeRotation(). Default is ProgradeRotation().
  • corona_height::String: The height of the corona above the disk plane.

Examples

disk = AccretionDiskWithFlatLamppostProfile(inner_radius=6.0, outer_radius=1000.0, corona_height=5.0)
source
Skylight.AccretionDiskWithTabulatedProfileType
AccretionDiskWithTabulatedProfile <: AbstractAccretionDisk

Geometrically thin, optically thick axisymmetric accretion disk model with tabulated line emission radial profile. This is useful, for example, for incorporating the emissivity profiles calculated using a corona model as LamppostCorona.

Fields

  • inner_radius::Float64: The inner of the accretion disk. Must be larger than or equal to zero.
  • outer_radius::Float64: The outer radius of the accretion disk. Must be larger than or equal to inner_radius.
  • rotation_sense::AbstractRotationSense: The sense of rotation of the disk, which can be either ProgradeRotation() or RetrogradeRotation(). Default is ProgradeRotation().
  • filename::String: The name of a two-column file containing the line emission radial profile as radius vs. profile.

Examples

disk = AccretionDiskWithTabulatedProfile(inner_radius=6.0, outer_radius=1000.0, filename="emissivity.txt")
source

Geometrically thick, optically thin accretion disks

Skylight.IonTorusType
IonTorus <: AbstractRadiativeModel

Geometrically thick, optically thin ion torus model with synchrotron and bremsstahlung emission (Straub et al. 2012).

Fields

  • λ::Float64: Specific angular momentum dimensionless parameter
  • ϵc::Float64: Central energy density in CGS
  • n::Float64: Polytropic index
  • Tec::Float64: Central electron temperature in Kelvin
  • ξ::Float64: Electron to proton temperature ratio at the center
  • β::Float64: Equipartition factor
  • H_abundance::Float64: Hydrogen abundance
  • He_abundance::Float64: Helium abundance
  • rotation_sense::R: Sense of rotation of the torus, which can be either ProgradeRotation() or RetrogradeRotation()
  • radiative_process::P: Radiative process, which can be either Bremsstrahlung(), Synchrotron() or SynchrotronAndBremsstrahlung()

Constructor

spacetime = KerrSpacetimeBoyerLindquistCoordinates(M = 1.0, a = 0.7)
IonTorus = IonTorus(spacetime; 
    λ = 0.3, 
    ϵc = 1e-17, 
    n = 3 / 2, 
    Tec = 2e9, 
    ξ = 0.1, 
    β = 0.1, 
    H_abundance = 0.75, 
    He_abundance = 0.25, 
    rotation_sense = ProgradeRotation(), 
    radiative_process = Bremsstrahlung())

Note

Synchrotron self-absorption is not implemented yet.

source

Others

Skylight.CircularHotSpotType
CircularHotSpot <: AbstractSurfaceEmissionModel

Circular hot spot on the surface of a neutron star as in Bogdanov et al. (2019).

Fields

  • star_radius_in_km::Float64: The radius of the star in km. Must be positive.
  • spin_frequency_in_Hz::Float64: The spin frequency of the star in Hz. Must be non-zero.
  • center_colatitude_in_degrees::Float64: The colatitude of the spot center in degrees. Must be in the range [0, 90].
  • angular_radius_in_radians::Float64: The angular radius of the polar cap, in radians. Must be positive.
  • temperature_in_keV::Float64: The temperature of the polar cap. Must be positive.

Examples

hot_spot = CircularHotSpot(
    star_radius_in_km = 12.0,
    spin_frequency_in_Hz = 200,
    center_colatitude_in_degrees = 30.0,
    angular_radius_in_radians = 1.0,
    temperature_in_keV = 0.35
    M1 = 1.4
)
source
Skylight.LamppostCoronaType
LamppostCorona <: AbstractCorona

Lamppost corona model as described in Dauser et al. (2013).

Fields

  • height::Float64: The height of the lamppost corona.
  • spectral_index::Float64: The spectral index of the power-law photon emission. Default is 2.0.
  • theta_offset::Float64: The offset of the lamppost corona in the polar angle. Default is 1e-8. Must be small but nonzero to avoid the coordinate singularity at the polar axis.

Examples

corona = LamppostCorona(height=2.5, spectral_index = 2.0)
source
Skylight.StarAcrossWormholeType
StarAcrossWormhole <: AbstractSurfaceEmissionModel

Uniform temperature star accross a traversable wormhole (ChargedWormholeSpacetimeRegularCoordinates).

Fields

  • l_center::Float64: The center of the star in the regular radial coordinate.
  • star_radius::Float64: The radius of the star.

Examples

star = StarAcrossWormhole(l_center=5.0, star_radius=1.0)
source