earths 0.0.4

High-fidelity Earth simulation engine — orbit, atmosphere, geology, hydrology, biosphere, terrain, lighting, rendering, satellites, and temporal systems with full scientific coupling
Documentation
use sciforge::hub::prelude::constants::{EARTH_MASS, EARTH_RADIUS, G};
pub const OMEGAEARTH: f64 = crate::OMEGAEARTH;
pub fn coriolisparameter(latitudedeg: f64) -> f64 {
    let latrad = latitudedeg.to_radians();
    2.0 * OMEGAEARTH * latrad.sin()
}
pub fn geostrophicwindspeed(pressuregradientpaperm: f64, latitudedeg: f64, airdensity: f64) -> f64 {
    let f = coriolisparameter(latitudedeg);
    if f.abs() < 1e-10 {
        return f64::INFINITY;
    }
    pressuregradientpaperm / (airdensity * f.abs())
}
pub fn gradientwindspeed(
    pressuregradient: f64,
    radiusm: f64,
    latitudedeg: f64,
    airdensity: f64,
) -> f64 {
    let f = coriolisparameter(latitudedeg);
    let term = f * f * radiusm * radiusm / 4.0 + radiusm * pressuregradient / airdensity;
    if term < 0.0 {
        return 0.0;
    }
    -f * radiusm / 2.0 + term.sqrt()
}
pub fn thermalwindshear(
    tempgradientkperm: f64,
    meantempk: f64,
    latitudedeg: f64,
    deltap: f64,
    meanp: f64,
) -> f64 {
    let g0 = G * EARTH_MASS / (EARTH_RADIUS * EARTH_RADIUS);
    let f = coriolisparameter(latitudedeg);
    if f.abs() < 1e-10 {
        return 0.0;
    }
    if meantempk.abs() < 1e-10 || meanp.abs() < 1e-10 {
        return 0.0;
    }
    -(g0 / (f * meantempk)) * tempgradientkperm * deltap / meanp
}
pub fn ekmanspiraldepth(eddyviscosity: f64, latitudedeg: f64) -> f64 {
    let f = coriolisparameter(latitudedeg);
    if f.abs() < 1e-10 {
        return f64::INFINITY;
    }
    std::f64::consts::PI * (2.0 * eddyviscosity / f.abs()).sqrt()
}
pub fn beauforttoms(beaufort: u8) -> f64 {
    0.836 * (beaufort as f64).powf(1.5)
}
pub fn windchilltemperature(tempc: f64, windspeedkmh: f64) -> f64 {
    13.12 + 0.6215 * tempc - 11.37 * windspeedkmh.powf(0.16)
        + 0.3965 * tempc * windspeedkmh.powf(0.16)
}