planetsfactory 0.0.3

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::physics::atmospheres::*;
use planetsfactory::physics::gravitation::{self, *};
use planetsfactory::physics::interiors::*;

#[test]
fn gravity_surface_acceleration_earth() {
    let g = PlanetaryGravity::new(EARTH_MASS, EARTH_RADIUS);
    let a = g.surface_acceleration();
    assert!(a > 9.7 && a < 9.9);
}

#[test]
fn gravity_escape_velocity_earth() {
    let g = PlanetaryGravity::new(EARTH_MASS, EARTH_RADIUS);
    let v = g.escape_velocity();
    assert!(v > 1.1e4 && v < 1.2e4);
}

#[test]
fn gravity_orbital_velocity() {
    let g = PlanetaryGravity::new(SOLAR_MASS, SOLAR_RADIUS);
    let v = g.orbital_velocity(AU);
    assert!(v > 2.9e4 && v < 3.1e4);
}

#[test]
fn gravity_orbital_period_earth() {
    let g = PlanetaryGravity::new(SOLAR_MASS, SOLAR_RADIUS);
    let p = g.orbital_period(AU);
    assert!((p / YEAR - 1.0).abs() < 0.01);
}

#[test]
fn gravity_tidal_acceleration_positive() {
    let g = PlanetaryGravity::new(EARTH_MASS, EARTH_RADIUS);
    assert!(g.tidal_acceleration(3.844e8, 6.371e6) > 0.0);
}

#[test]
fn gravity_synchronous_orbit() {
    let g = PlanetaryGravity::new(EARTH_MASS, EARTH_RADIUS);
    let r = g.synchronous_orbit_radius(86164.1);
    assert!(r > 4.2e7 && r < 4.3e7);
}

#[test]
fn two_body_force_positive() {
    let f = two_body_force(EARTH_MASS, SOLAR_MASS, AU);
    assert!(f > 3.5e22 && f < 3.6e22);
}

#[test]
fn hill_sphere_earth() {
    let r = hill_sphere(AU, EARTH_MASS, SOLAR_MASS);
    assert!(r > 1.4e9 && r < 1.6e9);
}

#[test]
fn roche_limit_positive() {
    let rl = gravitation::roche_limit(EARTH_RADIUS, 5515.0, 3346.0);
    assert!(rl > EARTH_RADIUS);
}

#[test]
fn tisserand_parameter_value() {
    let t = tisserand_parameter(2.5 * AU, 5.2 * AU, 0.1, 0.1);
    assert!(t > 2.0 && t < 4.0);
}

#[test]
fn atmosphere_new_scale_height_earth_like() {
    let a = Atmosphere::new(101325.0, 288.0, 4.81e-26, EARTH_MASS, EARTH_RADIUS);
    assert!(a.scale_height > 7000.0 && a.scale_height < 10000.0);
}

#[test]
fn atmosphere_venus_like_higher_pressure() {
    let v = Atmosphere::new(9.2e6, 737.0, 7.31e-26, 4.867_5e24, 6.051_8e6);
    let e = Atmosphere::new(101325.0, 288.0, 4.81e-26, EARTH_MASS, EARTH_RADIUS);
    assert!(v.surface_pressure > e.surface_pressure);
}

#[test]
fn atmosphere_mars_like_low_pressure() {
    let m = Atmosphere::new(636.0, 210.0, 7.31e-26, 6.417_1e23, 3.389_5e6);
    assert!(m.surface_pressure < 1000.0);
}

#[test]
fn atmosphere_pressure_decreases_with_altitude() {
    let a = Atmosphere::new(101325.0, 288.0, 4.81e-26, EARTH_MASS, EARTH_RADIUS);
    let p0 = a.pressure_at_altitude(0.0);
    let p10 = a.pressure_at_altitude(10000.0);
    assert!(p10 < p0);
}

#[test]
fn atmosphere_column_mass_positive() {
    let a = Atmosphere::new(101325.0, 288.0, 4.81e-26, EARTH_MASS, EARTH_RADIUS);
    let cm = a.column_mass(EARTH_MASS, EARTH_RADIUS);
    assert!(cm > 1e4);
}

#[test]
fn jeans_escape_parameter_earth_hydrogen() {
    let lambda = jeans_escape_parameter(EARTH_MASS, EARTH_RADIUS, 1000.0, 1.67e-27);
    assert!(lambda > 5.0);
}

#[test]
fn greenhouse_temperature_rise_increases() {
    let t1 = greenhouse_temperature_rise(1.0);
    let t2 = greenhouse_temperature_rise(10.0);
    assert!(t2 > t1);
}

#[test]
fn interior_core_radius_positive() {
    let i = PlanetaryInterior::new(EARTH_MASS, EARTH_RADIUS, 0.325, 12800.0, 4500.0);
    let rc = i.core_radius();
    assert!(rc > 3.0e6 && rc < 4.0e6);
}

#[test]
fn interior_central_pressure() {
    let i = PlanetaryInterior::new(EARTH_MASS, EARTH_RADIUS, 0.325, 12800.0, 4500.0);
    let p = i.central_pressure();
    assert!(p > 1e11);
}

#[test]
fn interior_moment_of_inertia() {
    let i = PlanetaryInterior::new(EARTH_MASS, EARTH_RADIUS, 0.325, 12800.0, 4500.0);
    let moi = i.moment_of_inertia_factor();
    assert!(moi > 0.3 && moi < 0.4);
}

#[test]
fn interior_binding_energy_positive() {
    let i = PlanetaryInterior::new(EARTH_MASS, EARTH_RADIUS, 0.325, 12800.0, 4500.0);
    assert!(i.gravitational_binding_energy() > 0.0);
}

#[test]
fn interior_small_planet_smaller_core() {
    let big = PlanetaryInterior::new(EARTH_MASS, EARTH_RADIUS, 0.325, 12800.0, 4500.0);
    let small = PlanetaryInterior::new(6.417_1e23, 3.389_5e6, 0.24, 6200.0, 3600.0);
    assert!(small.core_radius() < big.core_radius());
}

#[test]
fn adams_williamson_density_increases() {
    let rho_0 = 5000.0;
    let rho_deep = adams_williamson_density(rho_0, 1e6, 2e11, 10.0);
    assert!(rho_deep > rho_0);
}

#[test]
fn core_fraction_from_density_reasonable() {
    let f = core_mass_fraction_from_density(5515.0);
    assert!(f > 0.3 && f < 0.35);
}

#[test]
fn differentiation_energy_positive() {
    let e = differentiation_energy(EARTH_MASS, EARTH_RADIUS, 0.5);
    assert!(e > 0.0);
}