pub const SPITZER: f64 = 1.03e-4;
pub const PARALLEL_RATIO: f64 = 1.96;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Resistivity {
Perpendicular,
Parallel,
}
pub fn spitzer_eta(te: f64, z: f64, ln_lambda: f64, resistivity: Resistivity) -> f64 {
let across = SPITZER * z * ln_lambda * te.powf(-1.5);
match resistivity {
Resistivity::Perpendicular => across,
Resistivity::Parallel => across / PARALLEL_RATIO,
}
}
#[cfg(test)]
mod tests {
use super::*;
use core::f64::consts::PI;
use metrology::{E_CHARGE as E, EPS_0, M_E};
#[test]
fn the_coefficient_is_braginskii_rounded() {
let braginskii = 4.0 * (2.0 * PI).sqrt() * M_E.sqrt() * E * E / (3.0 * (4.0 * PI * EPS_0).powi(2) * E.powf(1.5));
assert!((braginskii / 1.031_362e-4 - 1.0).abs() < 1e-5, "{braginskii:e}");
assert!((braginskii / spitzer_eta(1.0, 1.0, 1.0, Resistivity::Perpendicular) - 1.0).abs() < 2e-3);
}
#[test]
fn scalings() {
let at = |te: f64, z: f64, r| spitzer_eta(te, z, 10.0, r);
assert!((at(1000.0, 1.0, Resistivity::Perpendicular) / 3.257_146e-8 - 1.0).abs() < 1e-6);
assert!((at(4000.0, 1.0, Resistivity::Perpendicular) / at(1000.0, 1.0, Resistivity::Perpendicular) - 0.125).abs() < 1e-12);
assert!((at(1000.0, 2.0, Resistivity::Perpendicular) / at(1000.0, 1.0, Resistivity::Perpendicular) - 2.0).abs() < 1e-12);
assert!((at(1000.0, 1.0, Resistivity::Perpendicular) / at(1000.0, 1.0, Resistivity::Parallel) - 1.96).abs() < 1e-12);
}
}