pub const PI: f64 = std::f64::consts::PI;
pub const TWO_PI: f64 = 2.0 * PI;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ConstantsVersion {
#[default]
Codata2018,
Codata2022,
Legacy1986,
}
pub mod codata2018 {
pub const ELEMENTARY_CHARGE: f64 = 1.602176634;
pub const SPEED_OF_LIGHT_CM_S: f64 = 2.99792458e10;
pub const PLANCK_CONSTANT_ERG_S: f64 = 6.62607015e-27;
pub const BOLTZMANN_CONSTANT_J_K: f64 = 1.380649e-23;
pub const AVOGADRO: f64 = 6.02214076e23;
pub const JOULES_PER_CALORIE: f64 = 4.184;
pub const GAS_CONSTANT_CAL: f64 = 1.987204258640832;
pub const BOHR_RADIUS_ANGSTROMS: f64 = 0.529177210903;
pub const HARTREE_TO_EV: f64 = 27.211386245988;
pub const EV_ANGSTROM_FACTOR: f64 = 14.399645478456;
pub const EV_TO_KCAL_MOL: f64 = 23.060_547_830_619_03;
}
pub mod codata2022 {
pub use super::codata2018::{
AVOGADRO, BOLTZMANN_CONSTANT_J_K, ELEMENTARY_CHARGE, JOULES_PER_CALORIE,
PLANCK_CONSTANT_ERG_S, SPEED_OF_LIGHT_CM_S,
};
pub const BOHR_RADIUS_ANGSTROMS: f64 = 0.529177210903;
pub const HARTREE_TO_EV: f64 = 27.211386245988;
pub const EV_ANGSTROM_FACTOR: f64 = 14.399645478456;
pub const EV_TO_KCAL_MOL: f64 = 23.060_547_830_619_03;
pub const GAS_CONSTANT_CAL: f64 = 1.987204258640832;
}
pub mod legacy1986 {
pub const BOHR_RADIUS_ANGSTROMS: f64 = 0.529167;
pub const HARTREE_TO_EV: f64 = 27.21;
pub const EV_ANGSTROM_FACTOR: f64 = 14.399;
pub const EV_TO_KCAL_MOL: f64 = 23.061;
pub const GAS_CONSTANT_CAL: f64 = 1.98726;
pub const AVOGADRO: f64 = 6.02205e23;
pub const SPEED_OF_LIGHT_CM_S: f64 = 2.99776e10;
pub const ELEMENTARY_CHARGE: f64 = 1.60217733;
pub const PLANCK_CONSTANT_ERG_S: f64 = 6.626e-27;
pub const BOLTZMANN_CONSTANT_J_K: f64 = 1.3807e-23;
}
#[inline(always)]
pub fn angstrom_to_bohr(r_angstrom: f64, version: ConstantsVersion) -> f64 {
let a0 = match version {
ConstantsVersion::Codata2018 => codata2018::BOHR_RADIUS_ANGSTROMS,
ConstantsVersion::Codata2022 => codata2022::BOHR_RADIUS_ANGSTROMS,
ConstantsVersion::Legacy1986 => legacy1986::BOHR_RADIUS_ANGSTROMS,
};
r_angstrom / a0
}
#[inline(always)]
pub fn bohr_to_angstrom(r_bohr: f64, version: ConstantsVersion) -> f64 {
let a0 = match version {
ConstantsVersion::Codata2018 => codata2018::BOHR_RADIUS_ANGSTROMS,
ConstantsVersion::Codata2022 => codata2022::BOHR_RADIUS_ANGSTROMS,
ConstantsVersion::Legacy1986 => legacy1986::BOHR_RADIUS_ANGSTROMS,
};
r_bohr * a0
}
#[inline(always)]
pub fn ev_to_kcal_mol(ev: f64, version: ConstantsVersion) -> f64 {
let factor = match version {
ConstantsVersion::Codata2018 => codata2018::EV_TO_KCAL_MOL,
ConstantsVersion::Codata2022 => codata2022::EV_TO_KCAL_MOL,
ConstantsVersion::Legacy1986 => legacy1986::EV_TO_KCAL_MOL,
};
ev * factor
}
pub const MOPAC_CANONICAL_ATOMIC_MASSES: [f64; 107] = [
1.00790, 4.00260, 6.94000, 9.01218, 10.81000, 12.01100, 14.00670, 15.99940, 18.99840, 20.17900,
22.98977, 24.30500, 26.98154, 28.08550, 30.97376, 32.06000, 35.45300, 39.94800, 39.09830,
40.08000, 44.95590, 47.90000, 50.94150, 51.99600, 54.93800, 55.84700, 58.93320, 58.71000,
63.54600, 65.38000, 69.73500, 72.59000, 74.92160, 78.96000, 79.90400, 83.80000, 85.46780,
87.62000, 88.90590, 91.22000, 92.90640, 95.94000, 98.90620, 101.0700, 102.9055, 106.4000,
107.8680, 112.4100, 114.8200, 118.6900, 121.7500, 127.6000, 126.9045, 131.3000, 132.9054,
137.3300, 138.9060, 140.1160, 140.9077, 144.2400, 145.0000, 150.3600, 151.9640, 157.2500,
158.9253, 162.5000, 164.9303, 167.2600, 168.9342, 173.0400, 174.9670, 178.4900, 180.9479,
183.8500, 186.2070, 190.2000, 192.2200, 195.0900, 196.9665, 200.5900, 204.3700, 207.2000,
208.9804, 209.0000, 210.0000, 222.0000, 223.0000, 226.0000, 227.0000, 232.0381, 231.0359,
238.0289, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00005, 0.0, 0.0, 0.0, 1.0079, 0.0, 0.0, 0.0, 0.0, 0.0,
];
#[inline(always)]
pub fn standard_atomic_mass(atomic_number: u8) -> f64 {
if atomic_number >= 1 && (atomic_number as usize) <= MOPAC_CANONICAL_ATOMIC_MASSES.len() {
MOPAC_CANONICAL_ATOMIC_MASSES[(atomic_number - 1) as usize]
} else {
0.0
}
}