dwarfplanetsfactory 0.0.3

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::types::*;
use dwarfplanetsfactory::utils::io;

fn main() {
    // KuiperBelt
    let kb = KuiperBelt::new(6.0e5, 43.0, 0.05)
        .with_density(1800.0)
        .with_albedo(0.12)
        .with_rotation_period(8.0 * 3600.0);
    let kb_mass = kb.mass();
    let kb_q = kb.perihelion();
    let kb_big_q = kb.aphelion();
    let kb_hill = kb.hill_radius();
    let summary_kb = io::summary_kuiper_belt(&kb);
    assert!(kb_mass > 0.0);
    assert!(kb_q < kb_big_q);
    assert!(kb_hill > 0.0);
    assert!(!summary_kb.is_empty());

    // ScatteredDisk
    let sd = ScatteredDisk::new(4.0e5, 80.0, 0.6).with_density(1600.0);
    let sd_mass = sd.mass();
    let sd_scattered = sd.is_actively_scattered();
    let sd_centaur = sd.could_become_centaur();
    let summary_sd = io::summary_scattered_disk(&sd);
    assert!(sd_mass > 0.0);
    let sd_flags = sd_scattered as u8 + sd_centaur as u8;
    assert!(sd_flags <= 2);
    assert!(!summary_sd.is_empty());

    // Plutino
    let pl = Plutino::new(5.8e5, 0.25)
        .with_density(1900.0)
        .with_inclination(17.0);
    let pl_ratio = pl.resonance_ratio();
    let pl_crossing = pl.is_neptune_crossing();
    let summary_pl = io::summary_plutino(&pl);
    assert!((pl_ratio - 1.5).abs() < 0.05);
    let pl_flags = pl_crossing as u8;
    assert!(pl_flags <= 1);
    assert!(!summary_pl.is_empty());

    // ColdClassical
    let cc = ColdClassical::new(3.0e5, 44.0).with_binary_fraction(0.3);
    let cc_pristine = cc.is_pristine();
    let summary_cc = io::summary_cold_classical(&cc);
    assert!(cc_pristine);
    assert!(!summary_cc.is_empty());

    // Detached
    let det = Detached::new(5.0e5, 200.0, 0.7);
    let det_detached = det.is_truly_detached();
    let det_p9 = det.planet_nine_candidate();
    let summary_det = io::summary_detached(&det);
    let det_flags = det_detached as u8 + det_p9 as u8;
    assert!(det_flags <= 2);
    assert!(!summary_det.is_empty());

    // BinaryDwarf
    let bd = BinaryDwarf::new(6.0e5, 3.0e5, 39.5, 0.25).with_mutual_separation(2.0e4);
    let bd_ratio = bd.mass_ratio();
    let bd_period = bd.mutual_orbital_period();
    let bd_bary = bd.barycenter_offset();
    let summary_bd = io::summary_binary_dwarf(&bd);
    assert!(bd_ratio > 0.0 && bd_ratio <= 1.0);
    assert!(bd_period > 0.0);
    assert!(bd_bary > 0.0);
    assert!(!summary_bd.is_empty());

    // CeresType
    let cer = CeresType::new(4.7e5, 2.77, 0.076)
        .with_density(2162.0)
        .with_ice_mantle_fraction(0.25)
        .with_cryovolcanism(true);
    let cer_tj = cer.tisserand_jupiter();
    let cer_ice = cer.ice_mass();
    let summary_cer = io::summary_ceres_type(&cer);
    assert!(cer_tj > 3.0);
    assert!(cer_ice > 0.0);
    assert!(!summary_cer.is_empty());

    // Sednoid
    let sed = Sednoid::new(5.0e5, 506.0, 0.85).with_inclination(12.0);
    let sed_true = sed.is_true_sednoid();
    let sed_oort = sed.is_inner_oort_candidate();
    let sed_score = sed.planet_nine_alignment_score();
    let sed_temp = sed.equilibrium_temp();
    let summary_sed = io::summary_sednoid(&sed);
    let sed_flags = sed_true as u8 + sed_oort as u8;
    assert!(sed_flags <= 2);
    assert!((0.0..=1.0).contains(&sed_score));
    assert!(sed_temp > 0.0);
    assert!(!summary_sed.is_empty());
}