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)
}