sciforge 0.0.3

A comprehensive scientific computing library in pure Rust with zero dependencies
Documentation
use crate::constants::R_GAS;

pub fn cipw_quartz_norm(sio2: f64, feldspars: f64, mafics: f64) -> f64 {
    (sio2 - feldspars - mafics).max(0.0)
}

pub fn mg_number(mgo: f64, feo: f64) -> f64 {
    let mg = mgo / 40.3;
    let fe = feo / 71.85;
    mg / (mg + fe) * 100.0
}

pub fn differentiation_index(q: f64, or_val: f64, ab: f64, ne: f64) -> f64 {
    q + or_val + ab + ne
}

pub fn total_alkali_silica(na2o: f64, k2o: f64) -> f64 {
    na2o + k2o
}

pub fn alumina_saturation_index(al2o3: f64, cao: f64, na2o: f64, k2o: f64) -> f64 {
    let al = al2o3 / 102.0;
    let ca = cao / 56.0;
    let na = na2o / 62.0;
    let k = k2o / 94.0;
    al / (ca + na + k)
}

pub fn color_index(mafic_minerals: &[f64]) -> f64 {
    mafic_minerals.iter().sum()
}

pub fn liquidus_temperature(composition: f64, t_melt_a: f64, t_melt_b: f64) -> f64 {
    t_melt_a * composition + t_melt_b * (1.0 - composition)
}

pub fn solidus_depression(water_content: f64, base_solidus: f64, k: f64) -> f64 {
    base_solidus - k * water_content.powf(0.6)
}

pub fn crystal_settling_velocity(delta_rho: f64, g: f64, r: f64, mu: f64) -> f64 {
    2.0 * delta_rho * g * r * r / (9.0 * mu)
}

pub fn viscosity_arrhenius(a: f64, ea: f64, t: f64) -> f64 {
    a * (ea / (R_GAS * t)).exp()
}