cometsfactory 0.0.3

Comet factory — classify, build and catalogue comets of any type: short-period, long-period, Halley-type, sungrazer, interstellar, main-belt comet, centaur-transition, and extinct.
Documentation
use cometsfactory::physics::gravity;
use cometsfactory::physics::sublimation;
use cometsfactory::types::ShortPeriod;

fn main() {
    let comet = ShortPeriod::new(1000.0, 3.5, 0.7)
        .with_density(500.0)
        .with_albedo(0.04)
        .with_active_fraction(0.05);

    let mass = comet.mass();
    assert!(mass > 0.0);

    let be = gravity::binding_energy(mass, comet.nucleus_radius);
    assert!(be > 0.0);

    let tidal = gravity::solar_tidal_acceleration(comet.nucleus_radius, comet.perihelion());
    assert!(tidal > 0.0);

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

    let roche = gravity::roche_limit_solar(comet.density);
    assert!(roche > 1.0e9);

    let v_orb = gravity::orbital_velocity(comet.perihelion());
    assert!(v_orb > 20000.0);

    let energy = gravity::specific_orbital_energy(comet.semi_major_axis);
    assert!(energy < 0.0);

    let z = sublimation::sublimation_rate(comet.perihelion(), comet.albedo);
    assert!(z > 0.0);

    let q = sublimation::gas_production_rate(
        comet.nucleus_radius,
        comet.active_fraction,
        comet.perihelion(),
        comet.albedo,
    );
    assert!(q > 1.0e20);

    let dm = sublimation::mass_loss_rate(
        comet.nucleus_radius,
        comet.active_fraction,
        comet.perihelion(),
        comet.albedo,
    );
    assert!(dm > 0.0);

    let a_ng = sublimation::nongrav_acceleration(
        comet.nucleus_radius,
        comet.density,
        comet.active_fraction,
        comet.perihelion(),
        comet.albedo,
    );
    assert!(a_ng > 0.0);

    let v_gas = sublimation::thermal_gas_velocity(comet.perihelion(), comet.albedo);
    assert!(v_gas > 100.0);

    let tau = sublimation::sublimation_lifetime(
        comet.nucleus_radius,
        comet.density,
        comet.active_fraction,
        comet.perihelion(),
        comet.albedo,
    );
    assert!(tau > 0.0);
    assert!(tau.is_finite());

    let t_surf = sublimation::surface_temperature(comet.perihelion(), comet.albedo);
    assert!(t_surf > 100.0);
}