use crate::constants::physical::{C, G};
pub fn gravitational_acceleration(mass: f64, radius: f64) -> f64 {
G * mass / (radius * radius)
}
pub fn gravitational_potential(mass: f64, radius: f64) -> f64 {
-G * mass / radius
}
pub fn circular_velocity(enclosed_mass: f64, radius: f64) -> f64 {
(G * enclosed_mass / radius).sqrt()
}
pub fn escape_velocity(mass: f64, radius: f64) -> f64 {
(2.0 * G * mass / radius).sqrt()
}
pub fn dynamical_time(density: f64) -> f64 {
1.0 / (G * density).sqrt()
}
pub fn nfw_density(r: f64, rho_s: f64, r_s: f64) -> f64 {
crate::utils::math::nfw_density(r, rho_s, r_s)
}
pub fn nfw_enclosed_mass(r: f64, rho_s: f64, r_s: f64) -> f64 {
crate::utils::math::nfw_enclosed_mass(r, rho_s, r_s)
}
pub fn nfw_circular_velocity(r: f64, rho_s: f64, r_s: f64) -> f64 {
let m_enc = nfw_enclosed_mass(r, rho_s, r_s);
circular_velocity(m_enc, r)
}
pub fn isothermal_density(sigma_v: f64, r: f64) -> f64 {
sigma_v * sigma_v / (2.0 * std::f64::consts::PI * G * r * r)
}
pub fn isothermal_enclosed_mass(sigma_v: f64, r: f64) -> f64 {
2.0 * sigma_v * sigma_v * r / G
}
pub fn tidal_radius(m_sub: f64, m_host: f64, distance: f64) -> f64 {
distance * (m_sub / (3.0 * m_host)).powf(1.0 / 3.0)
}
pub fn gravitational_lensing_angle(mass: f64, impact_param: f64) -> f64 {
4.0 * G * mass / (C * C * impact_param)
}
pub fn einstein_radius(mass: f64, d_l: f64, d_s: f64) -> f64 {
let d_ls = d_s - d_l;
(4.0 * G * mass * d_ls / (C * C * d_l * d_s)).sqrt()
}
pub fn hernquist_density(r: f64, total_mass: f64, scale_radius: f64) -> f64 {
let a = scale_radius;
total_mass * a / (2.0 * std::f64::consts::PI * r * (r + a).powi(3))
}
pub fn burkert_density(r: f64, rho_0: f64, r_0: f64) -> f64 {
rho_0 / ((1.0 + r / r_0) * (1.0 + (r / r_0) * (r / r_0)))
}