dwarfplanetsfactory 0.0.1

Dwarf planet factory — classify, build and catalogue dwarf planets of any type: Kuiper belt, scattered disk, plutino, cold classical, detached, binary, Ceres-type, and sednoid.
Documentation
use dwarfplanetsfactory::physics::gravity;
use dwarfplanetsfactory::physics::thermal;
use dwarfplanetsfactory::types::KuiperBelt;
use dwarfplanetsfactory::types::Sednoid;

fn main() {
    // Gravity calculations on a Pluto-like KBO
    let kb = KuiperBelt::new(5.88e5, 39.5, 0.25);
    let mass = kb.mass();

    let e_bind = gravity::binding_energy(mass, kb.radius);
    assert!(e_bind > 0.0);

    let tidal_sun = gravity::solar_tidal_acceleration(kb.radius, kb.semi_major_axis);
    assert!(tidal_sun > 0.0);

    let tidal_nep = gravity::neptune_tidal_acceleration(kb.radius, 9.5);
    assert!(tidal_nep > 0.0);

    let rh = gravity::hill_radius(kb.semi_major_axis, mass);
    assert!(rh > 0.0);

    let roche = gravity::roche_limit(6.96e8, 1408.0, kb.density);
    assert!(roche > 0.0);

    let soe = gravity::specific_orbital_energy(kb.semi_major_axis);
    assert!(soe < 0.0);

    let v_peri = gravity::orbital_velocity(
        kb.semi_major_axis * (1.0 - kb.eccentricity),
        kb.semi_major_axis,
    );
    let v_aph = gravity::orbital_velocity(
        kb.semi_major_axis * (1.0 + kb.eccentricity),
        kb.semi_major_axis,
    );
    assert!(v_peri > v_aph);

    let ang_mom = gravity::specific_angular_momentum(kb.semi_major_axis, kb.eccentricity);
    assert!(ang_mom > 0.0);

    // Thermal calculations
    let t_eq = thermal::equilibrium_temp(39.5, 0.1);
    assert!(t_eq > 30.0 && t_eq < 80.0);

    let t_peri = thermal::temp_at_perihelion(39.5, 0.25, 0.1);
    let t_aph = thermal::temp_at_aphelion(39.5, 0.25, 0.1);
    assert!(t_peri > t_aph);

    let n2_rate = thermal::n2_sublimation_rate(t_eq);
    assert!(n2_rate >= 0.0);

    let co_rate = thermal::co_sublimation_rate(t_eq);
    assert!(co_rate >= 0.0);

    // Sednoid at extreme distance
    let sed = Sednoid::new(5.0e5, 500.0, 0.85);
    let t_sed = thermal::equilibrium_temp(sed.semi_major_axis, sed.albedo);
    assert!(t_sed < t_eq); // Much colder at 500 AU

    let grav_sed = sed.surface_gravity();
    let esc_sed = sed.escape_velocity();
    assert!(grav_sed > 0.0);
    assert!(esc_sed > 0.0);
}