planetsfactory 0.0.4

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 std::process;

use planetsfactory::config::parameters::*;
use planetsfactory::engine::generator::{
    SystemGeneratorConfig, generate_rogue_planets, generate_system,
};
use planetsfactory::engine::orbits::{OrbitalElements, elements_to_state};
use planetsfactory::observables::radial_velocity::rv_semi_amplitude;
use planetsfactory::observables::transits::transit_depth;
use planetsfactory::physics::atmospheres::Atmosphere;
use planetsfactory::physics::gravitation::PlanetaryGravity;
use planetsfactory::physics::interiors::PlanetaryInterior;
use planetsfactory::types::gas_giant::GasGiant;
use planetsfactory::types::ice_giant::IceGiant;
use planetsfactory::types::lava_world::LavaWorld;
use planetsfactory::types::ocean_world::OceanWorld;
use planetsfactory::types::rogue::RoguePlanet;
use planetsfactory::types::sub_neptune::SubNeptune;
use planetsfactory::types::super_earth::SuperEarth;
use planetsfactory::types::terrestrial::TerrestrialPlanet;

fn main() {
    let orbit_1au = OrbitalElements::from_au_deg(1.0, 0.017, 0.0, 0.0, 0.0, 0.0);
    let earth_like = TerrestrialPlanet::new(
        "T1",
        "Star",
        EARTH_MASS,
        EARTH_RADIUS,
        1e-3,
        0.4,
        orbit_1au.clone(),
    );
    let jupiter_like = GasGiant::new(
        "G1",
        "Star",
        JUPITER_MASS,
        JUPITER_RADIUS,
        1.5e-2,
        0.05,
        OrbitalElements::from_au_deg(5.2, 0.05, 1.3, 0.0, 0.0, 0.0),
    );
    let saturn_like = GasGiant::new(
        "G2",
        "Star",
        5.683_4e26,
        6.026_8e7,
        1.63e-2,
        0.47,
        OrbitalElements::from_au_deg(9.5, 0.06, 2.5, 0.0, 0.0, 0.0),
    )
    .with_details(0.34, 6.63e7, 1.365e8, 0.45);
    let uranus_like = IceGiant::new(
        "I1",
        "Star",
        14.5 * EARTH_MASS,
        2.556e7,
        3.3e-3,
        1.71,
        OrbitalElements::from_au_deg(19.2, 0.05, 0.8, 0.0, 0.0, 0.0),
    );
    let neptune_like = IceGiant::new(
        "I2",
        "Star",
        17.1 * EARTH_MASS,
        2.476e7,
        3.4e-3,
        0.49,
        OrbitalElements::from_au_deg(30.1, 0.01, 1.8, 0.0, 0.0, 0.0),
    );
    let super_e = SuperEarth::new(
        "SE1",
        "Star",
        5.0 * EARTH_MASS,
        radius_from_mass(5.0 * EARTH_MASS),
        1e-3,
        0.3,
        OrbitalElements::from_au_deg(0.8, 0.03, 1.0, 0.0, 0.0, 0.0),
    );
    let sub_nep = SubNeptune::new(
        "SN1",
        "Star",
        8.0 * EARTH_MASS,
        radius_from_mass(8.0 * EARTH_MASS),
        2e-3,
        0.2,
        OrbitalElements::from_au_deg(0.5, 0.02, 0.5, 0.0, 0.0, 0.0),
    );
    let lava = LavaWorld::new(
        "LW1",
        "Star",
        2.0 * EARTH_MASS,
        radius_from_mass(2.0 * EARTH_MASS),
        1e-3,
        0.0,
        OrbitalElements::from_au_deg(0.02, 0.01, 0.0, 0.0, 0.0, 0.0),
    );
    let ocean = OceanWorld::new(
        "OW1",
        "Star",
        3.0 * EARTH_MASS,
        radius_from_mass(3.0 * EARTH_MASS),
        1e-3,
        0.3,
        OrbitalElements::from_au_deg(1.2, 0.02, 0.5, 0.0, 0.0, 0.0),
    );
    let rogue = RoguePlanet::new("R1", EARTH_MASS, EARTH_RADIUS, 4.5e9 * YEAR);

    let earth_grav = PlanetaryGravity::new(EARTH_MASS, EARTH_RADIUS);
    let atm = Atmosphere::new(101325.0, 288.0, 4.81e-26, EARTH_MASS, EARTH_RADIUS);
    let interior = PlanetaryInterior::new(EARTH_MASS, EARTH_RADIUS, 0.325, 12800.0, 4500.0);

    let (pos, _vel) = elements_to_state(&orbit_1au, SOLAR_MASS + EARTH_MASS);
    let r = (pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2]).sqrt();

    let depth = transit_depth(JUPITER_RADIUS, SOLAR_RADIUS);
    let rv = rv_semi_amplitude(
        EARTH_MASS,
        SOLAR_MASS,
        AU,
        0.017,
        std::f64::consts::FRAC_PI_2,
    );

    let config = SystemGeneratorConfig::solar_like(6);
    let generated = generate_system(&config);
    let rogues = generate_rogue_planets(3, 42);

    let types_ok = (earth_like.mass_earth() - 1.0).abs() < 0.01
        && earth_like.surface_gravity() > 9.0
        && earth_like.escape_velocity() > 1e4
        && earth_like.mean_density() > 5000.0
        && (jupiter_like.mass_jupiter() - 1.0).abs() < 0.01
        && jupiter_like.surface_gravity() > 20.0
        && saturn_like.ring_roche_limit(900.0) > 0.0
        && uranus_like.ice_mass_fraction > 0.5
        && neptune_like.wind_speed_estimate() > 200.0
        && super_e.mass_earth() > 4.0
        && sub_nep.envelope_mass() > 0.0
        && lava.dayside_temperature > 2000.0
        && ocean.water_mass() > 0.0
        && rogue.surface_temperature() > 0.0;

    let physics_ok = earth_grav.sphere_of_influence(AU, SOLAR_MASS) > 0.0
        && atm.scale_height > 7000.0
        && atm.scale_height < 10000.0
        && interior.moment_of_inertia_factor() > 0.3
        && interior.moment_of_inertia_factor() < 0.4;

    let obs_ok = depth > 0.0 && depth < 0.02 && rv > 0.0;

    let gen_ok = generated.len() == 6 && rogues.len() == 3;

    let orbit_ok = r > 1.4e11 && r < 1.6e11;

    let all_ok = types_ok && physics_ok && obs_ok && gen_ok && orbit_ok;

    if all_ok {
        process::exit(0);
    } else {
        process::exit(1);
    }
}