sagittariusas 0.0.3

Simulation engine for Sagittarius A* — Kerr spacetime, accretion, jets, lensing, and shadow observables
Documentation
use std::f64::consts::PI;

pub use sciforge::hub::prelude::constants::{C, G, H, HBAR, K_B, SIGMA_SB};
pub use sciforge::hub::prelude::constants::{LIGHT_YEAR, PARSEC, SOLAR_MASS};

pub const SGR_A_MASS_SOLAR: f64 = 4.0e6;
pub const SGR_A_MASS: f64 = SGR_A_MASS_SOLAR * SOLAR_MASS;
pub const SGR_A_DISTANCE_PC: f64 = 8_178.0;
pub const SGR_A_DISTANCE: f64 = SGR_A_DISTANCE_PC * PARSEC;
pub const SGR_A_SPIN: f64 = 0.9;

pub fn schwarzschild_radius(mass: f64) -> f64 {
    sciforge::hub::prelude::astronomy::stellar::schwarzschild_radius(mass)
}

pub fn sgr_a_schwarzschild_radius() -> f64 {
    schwarzschild_radius(SGR_A_MASS)
}

pub fn isco_radius(mass: f64, spin: f64) -> f64 {
    let rs = schwarzschild_radius(mass);
    let rg = rs / 2.0;
    if spin.abs() < 1e-12 {
        return 6.0 * rg;
    }
    let a = spin.clamp(-1.0, 1.0);
    let z1 = 1.0
        + (1.0 - a * a).powf(1.0 / 3.0) * ((1.0 + a).powf(1.0 / 3.0) + (1.0 - a).powf(1.0 / 3.0));
    let z2 = (3.0 * a * a + z1 * z1).sqrt();
    if a >= 0.0 {
        rg * (3.0 + z2 - ((3.0 - z1) * (3.0 + z1 + 2.0 * z2)).sqrt())
    } else {
        rg * (3.0 + z2 + ((3.0 - z1) * (3.0 + z1 + 2.0 * z2)).sqrt())
    }
}

pub fn photon_sphere_radius(mass: f64) -> f64 {
    1.5 * schwarzschild_radius(mass)
}

pub fn gravitational_radius(mass: f64) -> f64 {
    G * mass / (C * C)
}

pub fn eddington_luminosity(mass: f64) -> f64 {
    sciforge::hub::prelude::astronomy::stellar::eddington_luminosity(mass)
}

pub fn hawking_temperature(mass: f64) -> f64 {
    HBAR * C * C * C / (8.0 * PI * G * mass * K_B)
}