use super::PhysicalConstant;
pub const VACUUM_PERMITTIVITY: PhysicalConstant = PhysicalConstant {
value: 8.854_187_818_8e-12,
uncertainty: 1.4e-21,
unit: "F/m",
symbol: "\u{03B5}_0", name: "Vacuum electric permittivity",
};
pub const VACUUM_PERMEABILITY: PhysicalConstant = PhysicalConstant {
value: 1.256_637_062_12e-6,
uncertainty: 1.9e-16,
unit: "N/A^2",
symbol: "\u{03BC}_0", name: "Vacuum magnetic permeability",
};
pub const IMPEDANCE_OF_FREE_SPACE: PhysicalConstant = PhysicalConstant {
value: 376.730_313_412,
uncertainty: 5.9e-8,
unit: "\u{03A9}", symbol: "Z_0",
name: "Impedance of free space",
};
pub const COULOMB_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 8.987_551_792_3e9,
uncertainty: 1.4,
unit: "N m^2 C^-2",
symbol: "k_e",
name: "Coulomb constant",
};
pub const MAGNETIC_FLUX_QUANTUM: PhysicalConstant = PhysicalConstant {
value: 2.067_833_848_461_929_3e-15,
uncertainty: 0.0,
unit: "Wb",
symbol: "\u{03A6}_0", name: "Magnetic flux quantum",
};
pub const CONDUCTANCE_QUANTUM: PhysicalConstant = PhysicalConstant {
value: 7.748_091_729_863_649e-5,
uncertainty: 0.0,
unit: "S",
symbol: "G_0",
name: "Conductance quantum",
};
pub const JOSEPHSON_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 4.835_978_484_169_836_3e14,
uncertainty: 0.0,
unit: "Hz/V",
symbol: "K_J",
name: "Josephson constant",
};
pub const VON_KLITZING_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 25_812.807_459_304_513,
uncertainty: 0.0,
unit: "\u{03A9}", symbol: "R_K",
name: "Von Klitzing constant",
};
#[cfg(test)]
#[allow(clippy::assertions_on_constants)]
mod tests {
use super::*;
use crate::new_modules::constants::fundamental::{
ELEMENTARY_CHARGE, PLANCK_CONSTANT, SPEED_OF_LIGHT,
};
const REL_TOL: f64 = 1e-5;
#[test]
fn test_vacuum_permittivity_value() {
let expected = 8.854_187_818_8e-12;
assert!((VACUUM_PERMITTIVITY.value - expected).abs() < 1e-21);
}
#[test]
fn test_vacuum_permeability_value() {
let expected = 1.256_637_062_12e-6;
assert!((VACUUM_PERMEABILITY.value - expected).abs() < 1e-16);
}
#[test]
fn test_impedance_of_free_space_value() {
let expected = 376.730_313_412;
assert!((IMPEDANCE_OF_FREE_SPACE.value - expected).abs() < 1e-7);
}
#[test]
fn test_coulomb_constant_value() {
let expected = 8.987_551_792_3e9;
assert!((COULOMB_CONSTANT.value - expected).abs() < 1.0);
}
#[test]
fn test_magnetic_flux_quantum_value() {
let expected = 2.067_833_848_461_929_3e-15;
assert!((MAGNETIC_FLUX_QUANTUM.value - expected).abs() < 1e-28);
assert!(MAGNETIC_FLUX_QUANTUM.is_exact());
}
#[test]
fn test_conductance_quantum_value() {
let expected = 7.748_091_729_863_649e-5;
assert!((CONDUCTANCE_QUANTUM.value - expected).abs() < 1e-18);
assert!(CONDUCTANCE_QUANTUM.is_exact());
}
#[test]
fn test_josephson_constant_value() {
let expected = 4.835_978_484_169_836_3e14;
assert!((JOSEPHSON_CONSTANT.value - expected).abs() < 1e1);
assert!(JOSEPHSON_CONSTANT.is_exact());
}
#[test]
fn test_von_klitzing_constant_value() {
let expected = 25_812.807_459_304_513;
assert!((VON_KLITZING_CONSTANT.value - expected).abs() < 1e-6);
assert!(VON_KLITZING_CONSTANT.is_exact());
}
#[test]
fn test_epsilon0_mu0_c2_equals_one() {
let c = SPEED_OF_LIGHT.value;
let product = VACUUM_PERMITTIVITY.value * VACUUM_PERMEABILITY.value * c * c;
let relative_error = (product - 1.0).abs();
assert!(
relative_error < REL_TOL,
"epsilon_0 * mu_0 * c^2 = {} (expected 1.0, error: {})",
product,
relative_error
);
}
#[test]
fn test_impedance_derived_from_mu0_c() {
let expected = VACUUM_PERMEABILITY.value * SPEED_OF_LIGHT.value;
let relative_error = ((IMPEDANCE_OF_FREE_SPACE.value - expected) / expected).abs();
assert!(
relative_error < REL_TOL,
"Z_0 derivation error: {}",
relative_error
);
}
#[test]
fn test_coulomb_constant_derived() {
let expected = 1.0 / (4.0 * std::f64::consts::PI * VACUUM_PERMITTIVITY.value);
let relative_error = ((COULOMB_CONSTANT.value - expected) / expected).abs();
assert!(
relative_error < REL_TOL,
"Coulomb constant derivation error: {}",
relative_error
);
}
#[test]
fn test_magnetic_flux_quantum_derived() {
let expected = PLANCK_CONSTANT.value / (2.0 * ELEMENTARY_CHARGE.value);
let relative_error = ((MAGNETIC_FLUX_QUANTUM.value - expected) / expected).abs();
assert!(
relative_error < 1e-12,
"Phi_0 derivation error: {}",
relative_error
);
}
#[test]
fn test_conductance_quantum_derived() {
let e = ELEMENTARY_CHARGE.value;
let expected = 2.0 * e * e / PLANCK_CONSTANT.value;
let relative_error = ((CONDUCTANCE_QUANTUM.value - expected) / expected).abs();
assert!(
relative_error < 1e-12,
"G_0 derivation error: {}",
relative_error
);
}
#[test]
fn test_josephson_constant_derived() {
let expected = 2.0 * ELEMENTARY_CHARGE.value / PLANCK_CONSTANT.value;
let relative_error = ((JOSEPHSON_CONSTANT.value - expected) / expected).abs();
assert!(
relative_error < 1e-12,
"K_J derivation error: {}",
relative_error
);
}
#[test]
fn test_von_klitzing_constant_derived() {
let e = ELEMENTARY_CHARGE.value;
let expected = PLANCK_CONSTANT.value / (e * e);
let relative_error = ((VON_KLITZING_CONSTANT.value - expected) / expected).abs();
assert!(
relative_error < 1e-12,
"R_K derivation error: {}",
relative_error
);
}
#[test]
fn test_von_klitzing_conductance_quantum_reciprocal() {
let expected = 2.0 / CONDUCTANCE_QUANTUM.value;
let relative_error = ((VON_KLITZING_CONSTANT.value - expected) / expected).abs();
assert!(
relative_error < 1e-12,
"R_K vs 2/G_0 error: {}",
relative_error
);
}
#[test]
fn test_exact_em_constants() {
assert!(MAGNETIC_FLUX_QUANTUM.is_exact());
assert!(CONDUCTANCE_QUANTUM.is_exact());
assert!(JOSEPHSON_CONSTANT.is_exact());
assert!(VON_KLITZING_CONSTANT.is_exact());
}
#[test]
fn test_nonexact_em_constants() {
assert!(!VACUUM_PERMITTIVITY.is_exact());
assert!(!VACUUM_PERMEABILITY.is_exact());
assert!(!IMPEDANCE_OF_FREE_SPACE.is_exact());
assert!(!COULOMB_CONSTANT.is_exact());
}
#[test]
fn test_all_em_values_positive() {
assert!(VACUUM_PERMITTIVITY.value > 0.0);
assert!(VACUUM_PERMEABILITY.value > 0.0);
assert!(IMPEDANCE_OF_FREE_SPACE.value > 0.0);
assert!(COULOMB_CONSTANT.value > 0.0);
assert!(MAGNETIC_FLUX_QUANTUM.value > 0.0);
assert!(CONDUCTANCE_QUANTUM.value > 0.0);
assert!(JOSEPHSON_CONSTANT.value > 0.0);
assert!(VON_KLITZING_CONSTANT.value > 0.0);
}
}