use super::PhysicalConstant;
pub const BOHR_RADIUS: PhysicalConstant = PhysicalConstant {
value: 5.291_772_105_44e-11,
uncertainty: 8.2e-21,
unit: "m",
symbol: "a_0",
name: "Bohr radius",
};
pub const RYDBERG_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 10_973_731.568_157,
uncertainty: 1.2e-5,
unit: "m^-1",
symbol: "R_inf",
name: "Rydberg constant",
};
pub const HARTREE_ENERGY: PhysicalConstant = PhysicalConstant {
value: 4.359_744_722_206_0e-18,
uncertainty: 4.8e-30,
unit: "J",
symbol: "E_h",
name: "Hartree energy",
};
pub const CLASSICAL_ELECTRON_RADIUS: PhysicalConstant = PhysicalConstant {
value: 2.817_940_320_5e-15,
uncertainty: 1.3e-24,
unit: "m",
symbol: "r_e",
name: "Classical electron radius",
};
pub const COMPTON_WAVELENGTH: PhysicalConstant = PhysicalConstant {
value: 2.426_310_235_38e-12,
uncertainty: 7.6e-22,
unit: "m",
symbol: "\u{03BB}_C", name: "Compton wavelength",
};
pub const BOHR_MAGNETON: PhysicalConstant = PhysicalConstant {
value: 9.274_010_065_7e-24,
uncertainty: 2.9e-33,
unit: "J T^-1",
symbol: "\u{03BC}_B", name: "Bohr magneton",
};
pub const NUCLEAR_MAGNETON: PhysicalConstant = PhysicalConstant {
value: 5.050_783_739_3e-27,
uncertainty: 1.6e-36,
unit: "J T^-1",
symbol: "\u{03BC}_N", name: "Nuclear magneton",
};
pub const PROTON_MAGNETIC_MOMENT: PhysicalConstant = PhysicalConstant {
value: 1.410_606_797_36e-26,
uncertainty: 6.0e-36,
unit: "J T^-1",
symbol: "\u{03BC}_p", name: "Proton magnetic moment",
};
pub const ELECTRON_G_FACTOR: PhysicalConstant = PhysicalConstant {
value: -2.002_319_304_362_56,
uncertainty: 3.5e-13,
unit: "",
symbol: "g_e",
name: "Electron g-factor",
};
#[cfg(test)]
#[allow(clippy::assertions_on_constants)]
mod tests {
use super::*;
use crate::new_modules::constants::fundamental::{
ELECTRON_MASS, ELEMENTARY_CHARGE, FINE_STRUCTURE_CONSTANT, PLANCK_CONSTANT,
REDUCED_PLANCK_CONSTANT, SPEED_OF_LIGHT,
};
const REL_TOL: f64 = 1e-5;
#[test]
fn test_bohr_radius_value() {
let expected = 5.291_772_105_44e-11;
assert!((BOHR_RADIUS.value - expected).abs() < 1e-20);
}
#[test]
fn test_rydberg_constant_value() {
let expected = 10_973_731.568_157;
assert!((RYDBERG_CONSTANT.value - expected).abs() < 1e-5);
}
#[test]
fn test_hartree_energy_value() {
let expected = 4.359_744_722_206_0e-18;
assert!((HARTREE_ENERGY.value - expected).abs() < 1e-29);
}
#[test]
fn test_classical_electron_radius_value() {
let expected = 2.817_940_320_5e-15;
assert!((CLASSICAL_ELECTRON_RADIUS.value - expected).abs() < 1e-24);
}
#[test]
fn test_compton_wavelength_value() {
let expected = 2.426_310_235_38e-12;
assert!((COMPTON_WAVELENGTH.value - expected).abs() < 1e-21);
}
#[test]
fn test_bohr_magneton_value() {
let expected = 9.274_010_065_7e-24;
assert!((BOHR_MAGNETON.value - expected).abs() < 1e-33);
}
#[test]
fn test_nuclear_magneton_value() {
let expected = 5.050_783_739_3e-27;
assert!((NUCLEAR_MAGNETON.value - expected).abs() < 1e-36);
}
#[test]
fn test_proton_magnetic_moment_value() {
let expected = 1.410_606_797_36e-26;
assert!((PROTON_MAGNETIC_MOMENT.value - expected).abs() < 1e-35);
}
#[test]
fn test_electron_g_factor_value() {
let expected = -2.002_319_304_362_56;
assert!((ELECTRON_G_FACTOR.value - expected).abs() < 1e-12);
}
#[test]
fn test_electron_g_factor_close_to_minus_two() {
assert!((ELECTRON_G_FACTOR.value + 2.0).abs() < 0.003);
}
#[test]
fn test_compton_wavelength_derived() {
let expected = PLANCK_CONSTANT.value / (ELECTRON_MASS.value * SPEED_OF_LIGHT.value);
let relative_error = ((COMPTON_WAVELENGTH.value - expected) / expected).abs();
assert!(
relative_error < REL_TOL,
"Compton wavelength derivation error: {}",
relative_error
);
}
#[test]
fn test_bohr_magneton_derived() {
let expected =
ELEMENTARY_CHARGE.value * REDUCED_PLANCK_CONSTANT.value / (2.0 * ELECTRON_MASS.value);
let relative_error = ((BOHR_MAGNETON.value - expected) / expected).abs();
assert!(
relative_error < REL_TOL,
"Bohr magneton derivation error: {}",
relative_error
);
}
#[test]
fn test_nuclear_magneton_ratio() {
let magneton_ratio = NUCLEAR_MAGNETON.value / BOHR_MAGNETON.value;
let mass_ratio =
ELECTRON_MASS.value / crate::new_modules::constants::fundamental::PROTON_MASS.value;
let relative_error = ((magneton_ratio - mass_ratio) / mass_ratio).abs();
assert!(
relative_error < REL_TOL,
"Nuclear/Bohr magneton ratio error: {}",
relative_error
);
}
#[test]
fn test_proton_magnetic_moment_in_nuclear_magnetons() {
let ratio = PROTON_MAGNETIC_MOMENT.value / NUCLEAR_MAGNETON.value;
assert!(
(ratio - 2.793).abs() < 0.001,
"mu_p/mu_N = {} (expected ~2.793)",
ratio
);
}
#[test]
fn test_bohr_radius_derived() {
let expected = REDUCED_PLANCK_CONSTANT.value
/ (ELECTRON_MASS.value * SPEED_OF_LIGHT.value * FINE_STRUCTURE_CONSTANT.value);
let relative_error = ((BOHR_RADIUS.value - expected) / expected).abs();
assert!(
relative_error < REL_TOL,
"Bohr radius derivation error: {}",
relative_error
);
}
#[test]
fn test_hartree_energy_derived() {
let alpha = FINE_STRUCTURE_CONSTANT.value;
let expected =
alpha * alpha * ELECTRON_MASS.value * SPEED_OF_LIGHT.value * SPEED_OF_LIGHT.value;
let relative_error = ((HARTREE_ENERGY.value - expected) / expected).abs();
assert!(
relative_error < REL_TOL,
"Hartree energy derivation error: {}",
relative_error
);
}
#[test]
fn test_all_atomic_constants_positive_except_g_factor() {
assert!(BOHR_RADIUS.value > 0.0);
assert!(RYDBERG_CONSTANT.value > 0.0);
assert!(HARTREE_ENERGY.value > 0.0);
assert!(CLASSICAL_ELECTRON_RADIUS.value > 0.0);
assert!(COMPTON_WAVELENGTH.value > 0.0);
assert!(BOHR_MAGNETON.value > 0.0);
assert!(NUCLEAR_MAGNETON.value > 0.0);
assert!(PROTON_MAGNETIC_MOMENT.value > 0.0);
assert!(ELECTRON_G_FACTOR.value < 0.0);
}
#[test]
fn test_all_atomic_uncertainties_positive() {
let constants = [
&BOHR_RADIUS,
&RYDBERG_CONSTANT,
&HARTREE_ENERGY,
&CLASSICAL_ELECTRON_RADIUS,
&COMPTON_WAVELENGTH,
&BOHR_MAGNETON,
&NUCLEAR_MAGNETON,
&PROTON_MAGNETIC_MOMENT,
&ELECTRON_G_FACTOR,
];
for c in &constants {
assert!(
c.uncertainty > 0.0,
"{} should have positive uncertainty",
c.name
);
}
}
#[test]
fn test_rydberg_derived() {
let alpha = FINE_STRUCTURE_CONSTANT.value;
let expected = alpha * alpha * ELECTRON_MASS.value * SPEED_OF_LIGHT.value
/ (2.0 * PLANCK_CONSTANT.value);
let relative_error = ((RYDBERG_CONSTANT.value - expected) / expected).abs();
assert!(
relative_error < REL_TOL,
"Rydberg constant derivation error: {}",
relative_error
);
}
}