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.ShakuraSunyaevDisk
— TypeShakuraSunyaevDisk <: 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 toinner_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 eitherProgradeRotation()
orRetrogradeRotation()
. Default isProgradeRotation()
.
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)
Skylight.NovikovThorneDisk
— TypeNovikovThorneDisk <: 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 toinner_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 eitherProgradeRotation()
orRetrogradeRotation()
. Default isProgradeRotation()
.
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)
Skylight.AccretionDiskWithTabulatedTemperature
— TypeAccretionDiskWithTabulatedTemperature <: 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 toinner_radius
.rotation_sense::AbstractRotationSense
: The sense of rotation of the disk, which can be eitherProgradeRotation()
orRetrogradeRotation()
. Default isProgradeRotation()
.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")
Skylight.RARDisk
— TypeRARDisk <: 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 toinner_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 eitherProgradeRotation()
orRetrogradeRotation()
. Default isProgradeRotation()
.
Examples
disk = RARDisk(inner_radius=0.0, outer_radius=1000.0, M1=1e7, Mdot_to_MEdd=0.1, η=0.1)
Line emission
In these models, the radiation corresponds to line emission from the accretion disk.
Skylight.AccretionDiskWithFlatLamppostProfile
— TypeAccretionDiskWithFlatLamppostProfile <: 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 toinner_radius
.rotation_sense::AbstractRotationSense
: The sense of rotation of the disk, which can be eitherProgradeRotation()
orRetrogradeRotation()
. Default isProgradeRotation()
.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)
Skylight.AccretionDiskWithTabulatedProfile
— TypeAccretionDiskWithTabulatedProfile <: 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 toinner_radius
.rotation_sense::AbstractRotationSense
: The sense of rotation of the disk, which can be eitherProgradeRotation()
orRetrogradeRotation()
. Default isProgradeRotation()
.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")
Geometrically thick, optically thin accretion disks
Skylight.IonTorus
— TypeIonTorus <: 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 CGSn::Float64
: Polytropic indexTec::Float64
: Central electron temperature in Kelvinξ::Float64
: Electron to proton temperature ratio at the centerβ::Float64
: Equipartition factorH_abundance::Float64
: Hydrogen abundanceHe_abundance::Float64
: Helium abundancerotation_sense::R
: Sense of rotation of the torus, which can be eitherProgradeRotation()
orRetrogradeRotation()
radiative_process::P
: Radiative process, which can be eitherBremsstrahlung()
,Synchrotron()
orSynchrotronAndBremsstrahlung()
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.
Others
Skylight.CircularHotSpot
— TypeCircularHotSpot <: 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
)
Skylight.LamppostCorona
— TypeLamppostCorona <: 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 is2.0
.theta_offset::Float64
: The offset of the lamppost corona in the polar angle. Default is1e-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)
Skylight.StarAcrossWormhole
— TypeStarAcrossWormhole <: 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)