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

pub fn rv_semi_amplitude(
    planet_mass: f64,
    star_mass: f64,
    semi_major: f64,
    eccentricity: f64,
    inclination: f64,
) -> f64 {
    let n = (G * (star_mass + planet_mass) / semi_major.powi(3)).sqrt();
    planet_mass * n * semi_major * inclination.sin()
        / ((star_mass + planet_mass) * (1.0 - eccentricity * eccentricity).sqrt())
}

pub fn minimum_mass(rv_semi_amplitude: f64, star_mass: f64, period: f64, eccentricity: f64) -> f64 {
    let factor = (period / (2.0 * PI * G)).cbrt()
        * star_mass.powf(2.0 / 3.0)
        * (1.0 - eccentricity * eccentricity).sqrt();
    rv_semi_amplitude * factor
}

pub fn rossiter_mclaughlin_amplitude(
    planet_radius: f64,
    star_radius: f64,
    v_sin_i: f64,
    obliquity: f64,
) -> f64 {
    let depth = (planet_radius / star_radius).powi(2);
    depth * v_sin_i * obliquity.sin()
}

pub fn rv_jitter_from_activity(log_r_hk: f64) -> f64 {
    10.0_f64.powf(0.8 * log_r_hk + 5.0)
}

pub fn astrometric_wobble(planet_mass: f64, star_mass: f64, semi_major: f64, distance: f64) -> f64 {
    let theta = (planet_mass / star_mass) * (semi_major / distance);
    theta * 206265.0 * 1e6
}

pub fn binary_star_rv_offset(companion_mass: f64, primary_mass: f64, separation: f64) -> f64 {
    let v = (G * (primary_mass + companion_mass) / separation).sqrt();
    companion_mass / (primary_mass + companion_mass) * v
}