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
}