planetsfactory 0.0.1

Planet factory — classify, build and catalogue planets for any star system: Solar System, TRAPPIST-1, Kepler-90, Proxima Centauri, or fully custom worlds.
Documentation
use planetsfactory::config::parameters::*;
use planetsfactory::engine::evolution::*;
use planetsfactory::engine::formation::*;
use planetsfactory::engine::generator::*;
use planetsfactory::engine::orbits::*;
use planetsfactory::observables::photometry::*;
use planetsfactory::observables::radial_velocity::*;
use planetsfactory::observables::transits::*;
use planetsfactory::presets::{kepler90, proxima_centauri, solar_system, trappist1};

#[test]
fn kepler_solver_circular() {
    let ea = solve_kepler(1.0, 0.0, 1e-14);
    assert!((ea - 1.0).abs() < 1e-12);
}

#[test]
fn kepler_solver_eccentric() {
    let ea = solve_kepler(1.0, 0.5, 1e-14);
    let check = ea - 0.5 * ea.sin();
    assert!((check - 1.0).abs() < 1e-12);
}

#[test]
fn true_anomaly_at_periapsis() {
    let nu = true_from_eccentric(0.0, 0.5);
    assert!(nu.abs() < 1e-12);
}

#[test]
fn elements_to_state_earth_distance() {
    let earth = OrbitalElements::from_au_deg(1.0, 0.0167, 0.0, 0.0, 0.0, 0.0);
    let (pos, _vel) = elements_to_state(&earth, SOLAR_MASS);
    let r = (pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2]).sqrt();
    assert!((r / AU - 1.0).abs() < 0.02);
}

#[test]
fn vis_viva_circular() {
    let v = vis_viva(G * SOLAR_MASS, AU, AU);
    let expected = (G * SOLAR_MASS / AU).sqrt();
    assert!((v - expected).abs() / expected < 1e-10);
}

#[test]
fn hohmann_delta_v_positive() {
    let (dv1, dv2) = hohmann_delta_v(G * SOLAR_MASS, AU, 1.524 * AU);
    assert!(dv1 > 0.0 && dv2 > 0.0);
}

#[test]
fn orbital_period_consistent() {
    let elem = OrbitalElements::from_au_deg(1.0, 0.0, 0.0, 0.0, 0.0, 0.0);
    let p = elem.period(G * SOLAR_MASS);
    assert!((p / YEAR - 1.0).abs() < 0.01);
}

#[test]
fn formation_isolation_mass_positive() {
    let f = FormationModel::solar_like();
    let m = f.isolation_mass(1.0);
    assert!(m > 0.0);
}

#[test]
fn formation_snow_line_in_au_range() {
    let f = FormationModel::solar_like();
    assert!(f.snow_line_au > 2.0 && f.snow_line_au < 4.0);
}

#[test]
fn formation_critical_core_mass() {
    let f = FormationModel::solar_like();
    assert!(f.critical_core_mass() > 5.0 * EARTH_MASS);
}

#[test]
fn formation_gas_accretion_zero_below_critical() {
    let f = FormationModel::solar_like();
    assert!(f.runaway_gas_accretion_rate(EARTH_MASS) == 0.0);
}

#[test]
fn formation_gas_accretion_positive_above_critical() {
    let f = FormationModel::solar_like();
    assert!(f.runaway_gas_accretion_rate(20.0 * EARTH_MASS) > 0.0);
}

#[test]
fn evolution_cooling_luminosity_positive() {
    let e = PlanetEvolution::new(JUPITER_MASS, JUPITER_RADIUS, 5.2 * AU, SOLAR_LUMINOSITY);
    assert!(e.cooling_luminosity() > 0.0);
}

#[test]
fn evolution_xuv_loss_positive() {
    let e = PlanetEvolution::new(EARTH_MASS, EARTH_RADIUS, AU, SOLAR_LUMINOSITY);
    assert!(e.xuv_mass_loss_rate(1e-3) > 0.0);
}

#[test]
fn evolution_impact_erosion_zero_below_escape() {
    let f = PlanetEvolution::impact_erosion_fraction(5e3, 1.1e4);
    assert!(f == 0.0);
}

#[test]
fn generator_solar_like_system() {
    let config = SystemGeneratorConfig::solar_like(8);
    let planets = generate_system(&config);
    assert!(planets.len() == 8);
}

#[test]
fn generator_m_dwarf_system() {
    let config = SystemGeneratorConfig::m_dwarf(5);
    let planets = generate_system(&config);
    assert!(planets.len() == 5);
}

#[test]
fn generator_single_planet() {
    let config = SystemGeneratorConfig::solar_like(1);
    let planets = generate_system(&config);
    assert!(planets.len() == 1);
}

#[test]
fn transit_depth_jupiter() {
    let d = transit_depth(JUPITER_RADIUS, SOLAR_RADIUS);
    assert!(d > 0.01 && d < 0.012);
}

#[test]
fn transit_probability_earth() {
    let p = transit_probability(SOLAR_RADIUS, AU);
    assert!(p > 0.004 && p < 0.005);
}

#[test]
fn rv_semi_amplitude_jupiter() {
    let k = rv_semi_amplitude(
        JUPITER_MASS,
        SOLAR_MASS,
        5.2 * AU,
        0.048,
        std::f64::consts::FRAC_PI_2,
    );
    assert!(k > 10.0 && k < 15.0);
}

#[test]
fn rv_minimum_mass_positive() {
    let m = minimum_mass(0.09, SOLAR_MASS, YEAR, 0.017);
    assert!(m > 0.0);
}

#[test]
fn photometry_flux_ratio_small() {
    let r = planet_flux_ratio(JUPITER_RADIUS, 5.2 * AU, 0.34);
    assert!(r > 0.0 && r < 1e-6);
}

#[test]
fn preset_solar_system_eight_planets() {
    assert!(solar_system::all().len() == 8);
}

#[test]
fn preset_solar_system_inner_four() {
    assert!(solar_system::inner().len() == 4);
}

#[test]
fn preset_solar_system_outer_four() {
    assert!(solar_system::outer().len() == 4);
}

#[test]
fn preset_trappist1_seven_planets() {
    assert!(trappist1::all().len() == 7);
}

#[test]
fn preset_kepler90_eight_planets() {
    assert!(kepler90::all().len() == 8);
}

#[test]
fn preset_proxima_two_planets() {
    assert!(proxima_centauri::all().len() == 2);
}