sciforge 0.0.3

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

pub fn gamma_factor(v: f64) -> f64 {
    let beta = v / C;
    1.0 / (1.0 - beta * beta).sqrt()
}

pub fn beta(v: f64) -> f64 {
    v / C
}

pub fn time_dilation(proper_time: f64, v: f64) -> f64 {
    proper_time * gamma_factor(v)
}

pub fn length_contraction(proper_length: f64, v: f64) -> f64 {
    proper_length / gamma_factor(v)
}

pub fn lorentz_transform(t: f64, x: f64, v: f64) -> (f64, f64) {
    let g = gamma_factor(v);
    let b = beta(v);
    let t_prime = g * (t - b * x / C);
    let x_prime = g * (x - v * t);
    (t_prime, x_prime)
}

pub fn inverse_lorentz_transform(t_prime: f64, x_prime: f64, v: f64) -> (f64, f64) {
    let g = gamma_factor(v);
    let b = beta(v);
    let t = g * (t_prime + b * x_prime / C);
    let x = g * (x_prime + v * t_prime);
    (t, x)
}

pub fn lorentz_transform_4(event: [f64; 4], v: [f64; 3]) -> [f64; 4] {
    let v_mag = (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]).sqrt();
    if v_mag < 1e-30 {
        return event;
    }
    let g = gamma_factor(v_mag);
    let bx = v[0] / C;
    let by = v[1] / C;
    let bz = v[2] / C;
    let b2 = (v_mag / C).powi(2);
    let (t, x, y, z) = (event[0], event[1], event[2], event[3]);
    let bdotr = bx * x + by * y + bz * z;

    let t_prime = g * (t - bdotr / C);
    let factor = (g - 1.0) * bdotr / b2 - g * t * v_mag / C;
    let x_prime = x + bx * factor / (v_mag / C);
    let y_prime = y + by * factor / (v_mag / C);
    let z_prime = z + bz * factor / (v_mag / C);
    [t_prime, x_prime, y_prime, z_prime]
}

pub fn boost_matrix(v: [f64; 3]) -> [[f64; 4]; 4] {
    let v_mag = (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]).sqrt();
    if v_mag < 1e-30 {
        return [
            [1.0, 0.0, 0.0, 0.0],
            [0.0, 1.0, 0.0, 0.0],
            [0.0, 0.0, 1.0, 0.0],
            [0.0, 0.0, 0.0, 1.0],
        ];
    }
    let g = gamma_factor(v_mag);
    let nx = v[0] / v_mag;
    let ny = v[1] / v_mag;
    let nz = v[2] / v_mag;
    let b = v_mag / C;

    [
        [g, -g * b * nx, -g * b * ny, -g * b * nz],
        [
            -g * b * nx,
            1.0 + (g - 1.0) * nx * nx,
            (g - 1.0) * nx * ny,
            (g - 1.0) * nx * nz,
        ],
        [
            -g * b * ny,
            (g - 1.0) * ny * nx,
            1.0 + (g - 1.0) * ny * ny,
            (g - 1.0) * ny * nz,
        ],
        [
            -g * b * nz,
            (g - 1.0) * nz * nx,
            (g - 1.0) * nz * ny,
            1.0 + (g - 1.0) * nz * nz,
        ],
    ]
}

pub fn rapidity(v: f64) -> f64 {
    (beta(v)).atanh()
}

pub fn velocity_from_rapidity(phi: f64) -> f64 {
    C * phi.tanh()
}