asteroidsfactory 0.0.3

Asteroid factory — classify, build and catalogue asteroids of any type: near-Earth, main belt, trojan, centaur, binary, rubble pile, metallic, and potentially hazardous.
Documentation
use crate::config::parameters::*;

pub fn lightcurve_amplitude(axis_ratio_a_b: f64) -> f64 {
    2.5 * axis_ratio_a_b.log10()
}

pub fn rotation_period_from_lightcurve(frequency_hz: f64) -> f64 {
    if frequency_hz < 1.0e-30 {
        return f64::INFINITY;
    }
    0.5 / frequency_hz
}

pub fn spin_barrier_period(density: f64) -> f64 {
    (3.0 * PI / (G * density)).sqrt()
}

pub fn tumbling_damping_timescale(
    radius: f64,
    density: f64,
    rotation_period: f64,
    rigidity: f64,
) -> f64 {
    let mu = rigidity;
    let r_km = radius / 1000.0;
    let p_hr = rotation_period / 3600.0;
    let k3 = 17.0;
    mu / (density * k3) * p_hr.powi(3) / (r_km * r_km) * 1.0e9 * YEAR
}

pub fn binary_eclipse_depth(
    radius_primary: f64,
    radius_secondary: f64,
    albedo_primary: f64,
    albedo_secondary: f64,
) -> f64 {
    let area_p = PI * radius_primary * radius_primary * albedo_primary;
    let area_s = PI * radius_secondary * radius_secondary * albedo_secondary;
    let total = area_p + area_s;
    if total < 1.0e-30 {
        return 0.0;
    }
    let smaller = area_p.min(area_s);
    smaller / total
}

pub fn phase_angle_from_geometry(
    distance_sun_body: f64,
    distance_body_obs: f64,
    distance_sun_obs: f64,
) -> f64 {
    let cos_phase = (distance_sun_body * distance_sun_body + distance_body_obs * distance_body_obs
        - distance_sun_obs * distance_sun_obs)
        / (2.0 * distance_sun_body * distance_body_obs);
    cos_phase.clamp(-1.0, 1.0).acos()
}