sciforge 0.0.3

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

pub fn lever_rule(c0: f64, c_alpha: f64, c_beta: f64) -> (f64, f64) {
    let f_alpha = (c_beta - c0) / (c_beta - c_alpha);
    let f_beta = 1.0 - f_alpha;
    (f_alpha, f_beta)
}

pub fn gibbs_phase_rule(c: u32, p: u32) -> i32 {
    c as i32 - p as i32 + 2
}

pub fn clausius_clapeyron_slope(delta_h: f64, t: f64, delta_v: f64) -> f64 {
    delta_h / (t * delta_v)
}

pub fn regular_solution_gibbs(xa: f64, omega: f64, t: f64) -> f64 {
    let xb = 1.0 - xa;
    let mix_h = omega * xa * xb;
    let mix_s = -R_GAS * (xa * xa.max(1e-30).ln() + xb * xb.max(1e-30).ln());
    mix_h - t * mix_s
}

pub fn spinodal_temperature(omega: f64) -> f64 {
    omega / (2.0 * R_GAS)
}

pub fn nucleation_barrier(gamma: f64, delta_gv: f64) -> f64 {
    16.0 * std::f64::consts::PI * gamma.powi(3) / (3.0 * delta_gv * delta_gv)
}

pub fn critical_nucleus_radius(gamma: f64, delta_gv: f64) -> f64 {
    -2.0 * gamma / delta_gv
}

pub fn nucleation_rate(n0: f64, delta_g_star: f64, t: f64) -> f64 {
    n0 * (-delta_g_star / (K_B * t)).exp()
}

pub fn coarsening_rate(k: f64, t: f64, t0: f64) -> f64 {
    (k * (t - t0)).powf(1.0 / 3.0)
}

pub fn jmak(k: f64, t: f64, n: f64) -> f64 {
    1.0 - (-k * t.powf(n)).exp()
}

pub fn partition_coefficient(c_solid: f64, c_liquid: f64) -> f64 {
    c_solid / c_liquid.max(1e-30)
}

pub fn scheil_equation(c0: f64, k: f64, fs: f64) -> f64 {
    c0 * (1.0 - fs).powf(k - 1.0)
}