darkmatter 0.0.2

Dark matter simulation engine — gravitational fields, particle dynamics, halo stability, and cosmological constants
Documentation
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)))
}