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 crate::config::parameters::G;
use std::f64::consts::PI;

pub fn transit_depth(planet_radius: f64, star_radius: f64) -> f64 {
    (planet_radius / star_radius).powi(2)
}

pub fn transit_duration(
    semi_major: f64,
    star_radius: f64,
    planet_radius: f64,
    inclination: f64,
    period: f64,
) -> f64 {
    let b = semi_major * inclination.cos() / star_radius;
    let chord = ((1.0 + planet_radius / star_radius).powi(2) - b * b)
        .max(0.0)
        .sqrt();
    period / PI * (chord * star_radius / semi_major).asin()
}

pub fn ingress_egress_duration(
    semi_major: f64,
    star_radius: f64,
    planet_radius: f64,
    inclination: f64,
    period: f64,
) -> f64 {
    let b = semi_major * inclination.cos() / star_radius;
    let outer = ((1.0 + planet_radius / star_radius).powi(2) - b * b)
        .max(0.0)
        .sqrt();
    let inner = ((1.0 - planet_radius / star_radius).powi(2) - b * b)
        .max(0.0)
        .sqrt();
    period / PI * ((outer - inner) * star_radius / semi_major).asin()
}

pub fn impact_parameter(semi_major: f64, inclination: f64, star_radius: f64) -> f64 {
    semi_major * inclination.cos() / star_radius
}

pub fn transit_probability(star_radius: f64, semi_major: f64) -> f64 {
    star_radius / semi_major
}

pub fn limb_darkening_correction(depth: f64, u1: f64, u2: f64) -> f64 {
    let c = 1.0 - u1 / 3.0 - u2 / 6.0;
    depth / c
}

pub fn secondary_eclipse_depth(
    planet_radius: f64,
    star_radius: f64,
    planet_temp: f64,
    star_temp: f64,
) -> f64 {
    (planet_radius / star_radius).powi(2) * (planet_temp / star_temp).powi(4)
}

pub fn transit_timing_variation(
    perturber_mass: f64,
    star_mass: f64,
    period: f64,
    resonance_ratio: f64,
) -> f64 {
    let mu = perturber_mass / star_mass;
    mu * period / (4.5 * PI) * (resonance_ratio - 1.0).abs().max(0.01).recip()
}

pub fn planet_mass_from_transit_and_rv(
    depth: f64,
    star_radius: f64,
    rv_semi_amplitude: f64,
    period: f64,
    star_mass: f64,
) -> f64 {
    let r_p = depth.sqrt() * star_radius;
    let _ = r_p;
    let a = (G * star_mass * (period / (2.0 * PI)).powi(2)).cbrt();
    rv_semi_amplitude * star_mass * (a / (G * star_mass)).sqrt()
}