planetsfactory 0.0.2

Planet factory — classify, build and catalogue planets for any star system: Solar System, TRAPPIST-1, Kepler-90, Proxima Centauri, or fully custom worlds.
Documentation
pub use sciforge::hub::prelude::constants::{C, G, H, HBAR, K_B, SIGMA_SB, SOLAR_MASS};

pub const AU: f64 = 1.495_978_707e11;
pub const EARTH_MASS: f64 = 5.972_17e24;
pub const JUPITER_MASS: f64 = 1.898_13e27;
pub const EARTH_RADIUS: f64 = 6.371e6;
pub const JUPITER_RADIUS: f64 = 7.149_2e7;
pub const SOLAR_RADIUS: f64 = 6.957e8;
pub const SOLAR_TEMPERATURE: f64 = 5778.0;
pub const SOLAR_LUMINOSITY: f64 = 3.828e26;
pub const DEG: f64 = std::f64::consts::PI / 180.0;
pub const YEAR: f64 = 365.25 * 86400.0;

pub const TERRESTRIAL_MAX_MASS: f64 = 2.0;
pub const SUPER_EARTH_MAX_MASS: f64 = 10.0;
pub const MINI_NEPTUNE_MAX_MASS: f64 = 20.0;
pub const ICE_GIANT_MAX_MASS: f64 = 50.0;
pub const GAS_GIANT_MAX_MASS: f64 = 4000.0;

pub fn surface_gravity(mass: f64, radius: f64) -> f64 {
    G * mass / (radius * radius)
}

pub fn escape_velocity(mass: f64, radius: f64) -> f64 {
    (2.0 * G * mass / radius).sqrt()
}

pub fn orbital_velocity(central_mass: f64, radius: f64) -> f64 {
    (G * central_mass / radius).sqrt()
}

pub fn orbital_period(semi_major: f64, central_mass: f64) -> f64 {
    2.0 * std::f64::consts::PI * (semi_major.powi(3) / (G * central_mass)).sqrt()
}

pub fn hill_radius(a: f64, m_planet: f64, m_star: f64) -> f64 {
    a * (m_planet / (3.0 * m_star)).cbrt()
}

pub fn roche_limit(r_primary: f64, rho_primary: f64, rho_secondary: f64) -> f64 {
    2.456 * r_primary * (rho_primary / rho_secondary).cbrt()
}

pub fn equilibrium_temperature(t_star: f64, r_star: f64, semi_major: f64) -> f64 {
    t_star * (r_star / (2.0 * semi_major)).sqrt()
}

pub fn equilibrium_temperature_albedo(
    t_star: f64,
    r_star: f64,
    semi_major: f64,
    albedo: f64,
) -> f64 {
    equilibrium_temperature(t_star, r_star, semi_major) * (1.0 - albedo).powf(0.25)
}

pub fn habitable_zone_au(luminosity_solar: f64) -> (f64, f64) {
    let inner = (luminosity_solar / 1.107).sqrt();
    let outer = (luminosity_solar / 0.356).sqrt();
    (inner, outer)
}

pub fn mean_density(mass: f64, radius: f64) -> f64 {
    mass / (4.0 / 3.0 * std::f64::consts::PI * radius.powi(3))
}

pub fn radius_from_mass(mass_kg: f64) -> f64 {
    let m = mass_kg / EARTH_MASS;
    let (c, gamma) = if m < 2.04 {
        (1.008, 0.279)
    } else if m < 131.6 {
        (0.808, 0.589)
    } else {
        (17.74, -0.044)
    };
    c * m.powf(gamma) * EARTH_RADIUS
}