feffit 0.1.0

Pure-Rust EXAFS toolkit — data reduction (pre-edge/normalize/AUTOBK), Fourier transforms, FEFF path fitting (feffit), and feff.inp build/run; a port of larch.xafs
//! Atomic masses (amu) by atomic number, generated by
//! `scripts/gen_atomic_mass.py` from xraydb's `atomic_mass`.
//!
//! larch builds each path atom's mass with `xraydb.atomic_mass(iz)`
//! (`larch/xafs/feffdat.py`); embedding the same table makes `rmass`,
//! `sigma2_eins`, and `sigma2_debye` reproduce larch bit-for-bit. Do not
//! edit by hand — regenerate with the script.

/// Atomic masses in amu, indexed by `Z - 1` (`Z` = 1..=118).
pub(crate) const ATOMIC_MASS: [f64; 118] = [
    1.0078,  //   1 H
    4.0026,  //   2 He
    6.94,    //   3 Li
    9.0122,  //   4 Be
    10.81,   //   5 B
    12.011,  //   6 C
    14.007,  //   7 N
    15.999,  //   8 O
    18.9984, //   9 F
    20.1797, //  10 Ne
    22.9898, //  11 Na
    24.305,  //  12 Mg
    26.9815, //  13 Al
    28.085,  //  14 Si
    30.9738, //  15 P
    32.06,   //  16 S
    35.453,  //  17 Cl
    39.948,  //  18 Ar
    39.0983, //  19 K
    40.078,  //  20 Ca
    44.9559, //  21 Sc
    47.867,  //  22 Ti
    50.9415, //  23 V
    51.996,  //  24 Cr
    54.938,  //  25 Mn
    55.845,  //  26 Fe
    58.9332, //  27 Co
    58.6934, //  28 Ni
    63.546,  //  29 Cu
    65.38,   //  30 Zn
    69.72,   //  31 Ga
    72.63,   //  32 Ge
    74.9216, //  33 As
    78.971,  //  34 Se
    79.904,  //  35 Br
    83.798,  //  36 Kr
    85.4678, //  37 Rb
    87.62,   //  38 Sr
    88.9058, //  39 Y
    91.224,  //  40 Zr
    92.9064, //  41 Nb
    95.95,   //  42 Mo
    97.907,  //  43 Tc
    101.07,  //  44 Ru
    102.906, //  45 Rh
    106.42,  //  46 Pd
    107.868, //  47 Ag
    112.414, //  48 Cd
    114.818, //  49 In
    118.71,  //  50 Sn
    121.76,  //  51 Sb
    127.6,   //  52 Te
    126.905, //  53 I
    131.293, //  54 Xe
    132.905, //  55 Cs
    137.327, //  56 Ba
    138.905, //  57 La
    140.116, //  58 Ce
    140.908, //  59 Pr
    144.242, //  60 Nd
    145.0,   //  61 Pm
    150.36,  //  62 Sm
    151.96,  //  63 Eu
    157.25,  //  64 Gd
    158.925, //  65 Tb
    162.5,   //  66 Dy
    164.93,  //  67 Ho
    167.259, //  68 Er
    168.934, //  69 Tm
    173.045, //  70 Yb
    174.967, //  71 Lu
    178.49,  //  72 Hf
    180.948, //  73 Ta
    183.84,  //  74 W
    186.207, //  75 Re
    190.23,  //  76 Os
    192.217, //  77 Ir
    195.084, //  78 Pt
    196.967, //  79 Au
    200.592, //  80 Hg
    204.383, //  81 Tl
    207.2,   //  82 Pb
    208.98,  //  83 Bi
    209.0,   //  84 Po
    210.0,   //  85 At
    222.0,   //  86 Rn
    223.0,   //  87 Fr
    226.0,   //  88 Ra
    227.0,   //  89 Ac
    232.038, //  90 Th
    231.036, //  91 Pa
    238.029, //  92 U
    237.048, //  93 Np
    239.052, //  94 Pu
    243.0,   //  95 Am
    247.0,   //  96 Cm
    247.0,   //  97 Bk
    251.0,   //  98 Cf
    252.0,   //  99 Es
    257.0,   // 100 Fm
    258.0,   // 101 Md
    259.0,   // 102 No
    266.0,   // 103 Lr
    267.0,   // 104 Rf
    268.0,   // 105 Db
    269.0,   // 106 Sg
    270.0,   // 107 Bh
    269.0,   // 108 Hs
    278.0,   // 109 Mt
    281.0,   // 110 Ds
    282.0,   // 111 Rg
    285.0,   // 112 Cn
    286.0,   // 113 Nh
    289.0,   // 114 Fl
    290.0,   // 115 Mc
    293.0,   // 116 Lv
    294.0,   // 117 Ts
    294.0,   // 118 Og
];

/// Atomic mass (amu) for atomic number `iz`, or `None` if out of range.
pub fn atomic_mass(iz: i64) -> Option<f64> {
    if iz >= 1 && iz as usize <= ATOMIC_MASS.len() {
        Some(ATOMIC_MASS[(iz - 1) as usize])
    } else {
        None
    }
}