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::SIGMA_SB;
use std::f64::consts::PI;

pub fn geometric_albedo_to_bond(geometric: f64, phase_integral: f64) -> f64 {
    geometric * phase_integral
}

pub fn lambertian_phase(alpha: f64) -> f64 {
    (PI - alpha) * alpha.cos() + alpha.sin()
}

pub fn planet_flux_ratio(planet_radius: f64, semi_major: f64, albedo: f64) -> f64 {
    albedo * (planet_radius / (2.0 * semi_major)).powi(2)
}

pub fn thermal_flux(planet_radius: f64, temperature: f64, distance: f64) -> f64 {
    let luminosity = 4.0 * PI * planet_radius * planet_radius * SIGMA_SB * temperature.powi(4);
    luminosity / (4.0 * PI * distance * distance)
}

pub fn equilibrium_temperature(stellar_luminosity: f64, semi_major: f64, albedo: f64) -> f64 {
    let flux = stellar_luminosity / (4.0 * PI * semi_major * semi_major);
    ((1.0 - albedo) * flux / (4.0 * SIGMA_SB)).powf(0.25)
}

pub fn day_night_contrast(albedo: f64, redistribution: f64) -> f64 {
    let f = redistribution.clamp(0.0, 1.0);
    (1.0 - albedo) * (1.0 - f)
}

pub fn bolometric_magnitude_planet(reflected_flux: f64, stellar_flux: f64) -> f64 {
    -2.5 * (reflected_flux / stellar_flux).max(1e-30).log10()
}

pub fn planet_effective_temperature(
    star_temp: f64,
    star_radius: f64,
    semi_major: f64,
    albedo: f64,
) -> f64 {
    star_temp
        * ((1.0 - albedo) * star_radius * star_radius / (4.0 * semi_major * semi_major)).powf(0.25)
}