sciforge 0.0.3

A comprehensive scientific computing library in pure Rust with zero dependencies
Documentation
pub fn yield_offset_strain(total_strain: f64, offset: f64) -> f64 {
    total_strain - offset
}

pub fn ramberg_osgood(stress: f64, e: f64, k: f64, n: f64) -> f64 {
    stress / e + (stress / k).powf(1.0 / n)
}

pub fn true_stress(engineering_stress: f64, engineering_strain: f64) -> f64 {
    engineering_stress * (1.0 + engineering_strain)
}

pub fn true_strain(engineering_strain: f64) -> f64 {
    (1.0 + engineering_strain).ln()
}

pub fn hardening_power_law(k: f64, strain_plastic: f64, n: f64) -> f64 {
    k * strain_plastic.powf(n)
}

pub fn von_mises(s1: f64, s2: f64, s3: f64) -> f64 {
    (0.5 * ((s1 - s2).powi(2) + (s2 - s3).powi(2) + (s3 - s1).powi(2))).sqrt()
}

pub fn tresca(s1: f64, s2: f64, s3: f64) -> f64 {
    let max = s1.max(s2).max(s3);
    let min = s1.min(s2).min(s3);
    max - min
}

pub fn isotropic_hardening(yield_0: f64, h: f64, plastic_strain: f64) -> f64 {
    yield_0 + h * plastic_strain
}

pub fn bauschinger_effect(forward_yield: f64, reverse_yield: f64) -> f64 {
    (forward_yield - reverse_yield.abs()) / forward_yield
}

pub fn plastic_work(stress: &[f64], d_plastic_strain: &[f64]) -> f64 {
    stress
        .iter()
        .zip(d_plastic_strain.iter())
        .map(|(&s, &de)| s * de)
        .sum()
}

pub fn necking_criterion(n: f64) -> f64 {
    n
}

pub fn strain_rate_sensitivity(stress1: f64, stress2: f64, rate1: f64, rate2: f64) -> f64 {
    (stress2 / stress1).ln() / (rate2 / rate1).ln()
}