solarsystems 0.0.1

N-body solar system engine — gravitational dynamics, orbital mechanics, perturbations, event detection, and full celestial orchestration
Documentation
use darkmatter::solar_system::local_density;
use darkmatter::solar_system::perturbations as dm_pert;

pub fn perihelion_precession_rate(orbital_radius: f64, orbital_velocity: f64) -> f64 {
    dm_pert::perihelion_precession_rate(
        local_density::RHO_LOCAL_KG_M3,
        orbital_radius,
        orbital_velocity,
    )
}

pub fn perihelion_precession_rate_custom(
    rho_dm: f64,
    orbital_radius: f64,
    orbital_velocity: f64,
) -> f64 {
    dm_pert::perihelion_precession_rate(rho_dm, orbital_radius, orbital_velocity)
}

pub fn orbital_velocity_correction(orbital_radius: f64, m_central: f64) -> f64 {
    dm_pert::orbital_velocity_correction(local_density::RHO_LOCAL_KG_M3, orbital_radius, m_central)
}

pub fn secular_eccentricity_change(a: f64, m_central: f64, e: f64, age_s: f64) -> f64 {
    dm_pert::secular_perturbation_eccentricity(
        local_density::RHO_LOCAL_KG_M3,
        a,
        m_central,
        e,
        age_s,
    )
}

pub fn dynamical_friction_on_planet(m_planet: f64, v_planet: f64) -> f64 {
    let ln_lambda = 20.0;
    dm_pert::dynamical_friction_on_planet(
        local_density::RHO_LOCAL_KG_M3,
        m_planet,
        v_planet,
        ln_lambda,
    )
}

pub fn orbital_decay_timescale(m_planet: f64, v_planet: f64) -> f64 {
    let ln_lambda = 20.0;
    dm_pert::orbital_decay_timescale(
        m_planet,
        v_planet,
        local_density::RHO_LOCAL_KG_M3,
        ln_lambda,
    )
}

pub fn dm_disk_surface_density_limit(
    period_change_frac: f64,
    m_central: f64,
    a: f64,
    observation_time: f64,
) -> f64 {
    dm_pert::dm_disk_surface_density_limit(period_change_frac, m_central, a, observation_time)
}

pub fn dm_enclosed_mass(r: f64) -> f64 {
    dm_pert::dm_enclosed_mass(local_density::RHO_LOCAL_KG_M3, r)
}

pub fn dm_acceleration_at(r: f64) -> f64 {
    let m_enc = dm_enclosed_mass(r);
    darkmatter::constants::physical::G * m_enc / (r * r)
}