pdbtbx/structs/
elements.rs

1use std::convert::TryInto;
2
3#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5/// All elements from the periodic system.
6#[allow(missing_docs)]
7pub enum Element {
8    /// Element Hydrogen (H) atomic number: 1
9    H = 1,
10    /// Element Helium (He) atomic number: 2
11    He,
12    /// Element Lithium (Li) atomic number: 3
13    Li,
14    /// Element Beryllium (Be) atomic number: 4
15    Be,
16    /// Element Boron (B) atomic number: 5
17    B,
18    /// Element Carbon (C) atomic number: 6
19    C,
20    /// Element Nitrogen (N) atomic number: 7
21    N,
22    /// Element Oxygen (O) atomic number: 8
23    O,
24    /// Element Fluorine (F) atomic number: 9
25    F,
26    /// Element Neon (Ne) atomic number: 10
27    Ne,
28    /// Element Sodium (Na) atomic number: 11
29    Na,
30    /// Element Magnesium (Mg) atomic number: 12
31    Mg,
32    /// Element Aluminium (Al) atomic number: 13
33    Al,
34    /// Element Silicon (Si) atomic number: 14
35    Si,
36    /// Element Phosphorus (P) atomic number: 15
37    P,
38    /// Element Sulfur (S) atomic number: 16
39    S,
40    /// Element Chlorine (Cl) atomic number: 17
41    Cl,
42    /// Element Argon (Ar) atomic number: 18
43    Ar,
44    /// Element Potassium (K) atomic number: 19
45    K,
46    /// Element Calcium (Ca) atomic number: 20
47    Ca,
48    /// Element Scandium (Sc) atomic number: 21
49    Sc,
50    /// Element Titanium (Ti) atomic number: 22
51    Ti,
52    /// Element Vanadium (V) atomic number: 23
53    V,
54    /// Element Chromium (Cr) atomic number: 24
55    Cr,
56    /// Element Manganese (Mn) atomic number: 25
57    Mn,
58    /// Element Iron (Fe) atomic number: 26
59    Fe,
60    /// Element Cobalt (Co) atomic number: 27
61    Co,
62    /// Element Nickel (Ni) atomic number: 28
63    Ni,
64    /// Element Copper (Cu) atomic number: 29
65    Cu,
66    /// Element Zinc (Zn) atomic number: 30
67    Zn,
68    /// Element Gallium (Ga) atomic number: 31
69    Ga,
70    /// Element Germanium (Ge) atomic number: 32
71    Ge,
72    /// Element Arsenic (As) atomic number: 33
73    As,
74    /// Element Selenium (Se) atomic number: 34
75    Se,
76    /// Element Bromine (Br) atomic number: 35
77    Br,
78    /// Element Krypton (Kr) atomic number: 36
79    Kr,
80    /// Element Rubidium (Rb) atomic number: 37
81    Rb,
82    /// Element Strontium (Sr) atomic number: 38
83    Sr,
84    /// Element Yttrium (Y) atomic number: 39
85    Y,
86    /// Element Zirconium (Zr) atomic number: 40
87    Zr,
88    /// Element Niobium (Nb) atomic number: 41
89    Nb,
90    /// Element Molybdenum (Mo) atomic number: 42
91    Mo,
92    /// Element Technetium (Tc) atomic number: 43
93    Tc,
94    /// Element Ruthenium (Ru) atomic number: 44
95    Ru,
96    /// Element Rhodium (Rh) atomic number: 45
97    Rh,
98    /// Element Palladium (Pd) atomic number: 46
99    Pd,
100    /// Element Silver (Ag) atomic number: 47
101    Ag,
102    /// Element Cadmium (Cd) atomic number: 48
103    Cd,
104    /// Element Indium (In) atomic number: 49
105    In,
106    /// Element Tin (Sn) atomic number: 50
107    Sn,
108    /// Element Antimony (Sb) atomic number: 51
109    Sb,
110    /// Element Tellurium (Te) atomic number: 52
111    Te,
112    /// Element Iodine (I) atomic number: 53
113    I,
114    /// Element Xenon (Xe) atomic number: 54
115    Xe,
116    /// Element Caesium (Cs) atomic number: 55
117    Cs,
118    /// Element Barium (Ba) atomic number: 56
119    Ba,
120    /// Element Lanthanum (La) atomic number: 57
121    La,
122    /// Element Cerium (Ce) atomic number: 58
123    Ce,
124    /// Element Praseodymium (Pr) atomic number: 59
125    Pr,
126    /// Element Neodymium (Nd) atomic number: 60
127    Nd,
128    /// Element Promethium (Pm) atomic number: 61
129    Pm,
130    /// Element Samarium (Sm) atomic number: 62
131    Sm,
132    /// Element Europium (Eu) atomic number: 63
133    Eu,
134    /// Element Gadolinium (Gd) atomic number: 64
135    Gd,
136    /// Element Terbium (Tb) atomic number: 65
137    Tb,
138    /// Element Dysprosium (Dy) atomic number: 66
139    Dy,
140    /// Element Holmium (Ho) atomic number: 67
141    Ho,
142    /// Element Erbium (Er) atomic number: 68
143    Er,
144    /// Element Thulium (Tm) atomic number: 69
145    Tm,
146    /// Element Ytterbium (Yb) atomic number: 70
147    Yb,
148    /// Element Lutetium (Lu) atomic number: 71
149    Lu,
150    /// Element Hafnium (Hf) atomic number: 72
151    Hf,
152    /// Element Tantalum (Ta) atomic number: 73
153    Ta,
154    /// Element Tungsten (W) atomic number: 74
155    W,
156    /// Element Rhenium (Re) atomic number: 75
157    Re,
158    /// Element Osmium (Os) atomic number: 76
159    Os,
160    /// Element Iridium (Ir) atomic number: 77
161    Ir,
162    /// Element Platinum (Pt) atomic number: 78
163    Pt,
164    /// Element Gold (Au) atomic number: 79
165    Au,
166    /// Element Mercury (Hg) atomic number: 80
167    Hg,
168    /// Element Thallium (Tl) atomic number: 81
169    Tl,
170    /// Element Lead (Pb) atomic number: 82
171    Pb,
172    /// Element Bismuth (Bi) atomic number: 83
173    Bi,
174    /// Element Polonium (Po) atomic number: 84
175    Po,
176    /// Element Astatine (At) atomic number: 85
177    At,
178    /// Element Radon (Rn) atomic number: 86
179    Rn,
180    /// Element Francium (Fr) atomic number: 87
181    Fr,
182    /// Element Radium (Ra) atomic number: 88
183    Ra,
184    /// Element Actinium (Ac) atomic number: 89
185    Ac,
186    /// Element Thorium (Th) atomic number: 90
187    Th,
188    /// Element Protactinium (Pa) atomic number: 91
189    Pa,
190    /// Element Uranium (U) atomic number: 92
191    U,
192    /// Element Neptunium (Np) atomic number: 93
193    Np,
194    /// Element Plutonium (Pu) atomic number: 94
195    Pu,
196    /// Element Americium (Am) atomic number: 95
197    Am,
198    /// Element Curium (Cm) atomic number: 96
199    Cm,
200    /// Element Berkelium (Bk) atomic number: 97
201    Bk,
202    /// Element Californium (Cf) atomic number: 98
203    Cf,
204    /// Element Einsteinium (Es) atomic number: 99
205    Es,
206    /// Element Fermium (Fm) atomic number: 100
207    Fm,
208    /// Element Mendelevium (Md) atomic number: 101
209    Md,
210    /// Element Nobelium (No) atomic number: 102
211    No,
212    /// Element Lawrencium (Lr) atomic number: 103
213    Lr,
214    /// Element Rutherfordium (Rf) atomic number: 104
215    Rf,
216    /// Element Dubnium (Db) atomic number: 105
217    Db,
218    /// Element Seaborgium (Sg) atomic number: 106
219    Sg,
220    /// Element Bohrium (Bh) atomic number: 107
221    Bh,
222    /// Element Hassium (Hs) atomic number: 108
223    Hs,
224    /// Element Meitnerium (Mt) atomic number: 109
225    Mt,
226    /// Element Darmstadtium (Ds) atomic number: 110
227    Ds,
228    /// Element Roentgenium (Rg) atomic number: 111
229    Rg,
230    /// Element Copernicium (Cn) atomic number: 112
231    Cn,
232    /// Element Nihonium (Nh) atomic number: 113
233    Nh,
234    /// Element Flerovium (Fl) atomic number: 114
235    Fl,
236    /// Element Moscovium (Mc) atomic number: 115
237    Mc,
238    /// Element Livermorium (Lv) atomic number: 116
239    Lv,
240    /// Element Tennessine (Ts) atomic number: 117
241    Ts,
242    /// Element Oganesson (Og) atomic number: 118
243    Og,
244}
245
246impl Element {
247    /// Get the number in the periodic system of the elements for this element.
248    pub const fn atomic_number(&self) -> usize {
249        *self as usize
250    }
251
252    /// Get an element based on the atomic number
253    pub const fn new(atomic_number: usize) -> Option<Element> {
254        match atomic_number {
255            1 => Some(Element::H),
256            2 => Some(Element::He),
257            3 => Some(Element::Li),
258            4 => Some(Element::Be),
259            5 => Some(Element::B),
260            6 => Some(Element::C),
261            7 => Some(Element::N),
262            8 => Some(Element::O),
263            9 => Some(Element::F),
264            10 => Some(Element::Ne),
265            11 => Some(Element::Na),
266            12 => Some(Element::Mg),
267            13 => Some(Element::Al),
268            14 => Some(Element::Si),
269            15 => Some(Element::P),
270            16 => Some(Element::S),
271            17 => Some(Element::Cl),
272            18 => Some(Element::Ar),
273            19 => Some(Element::K),
274            20 => Some(Element::Ca),
275            21 => Some(Element::Sc),
276            22 => Some(Element::Ti),
277            23 => Some(Element::V),
278            24 => Some(Element::Cr),
279            25 => Some(Element::Mn),
280            26 => Some(Element::Fe),
281            27 => Some(Element::Co),
282            28 => Some(Element::Ni),
283            29 => Some(Element::Cu),
284            30 => Some(Element::Zn),
285            31 => Some(Element::Ga),
286            32 => Some(Element::Ge),
287            33 => Some(Element::As),
288            34 => Some(Element::Se),
289            35 => Some(Element::Br),
290            36 => Some(Element::Kr),
291            37 => Some(Element::Rb),
292            38 => Some(Element::Sr),
293            39 => Some(Element::Y),
294            40 => Some(Element::Zr),
295            41 => Some(Element::Nb),
296            42 => Some(Element::Mo),
297            43 => Some(Element::Tc),
298            44 => Some(Element::Ru),
299            45 => Some(Element::Rh),
300            46 => Some(Element::Pd),
301            47 => Some(Element::Ag),
302            48 => Some(Element::Cd),
303            49 => Some(Element::In),
304            50 => Some(Element::Sn),
305            51 => Some(Element::Sb),
306            52 => Some(Element::Te),
307            53 => Some(Element::I),
308            54 => Some(Element::Xe),
309            55 => Some(Element::Cs),
310            56 => Some(Element::Ba),
311            57 => Some(Element::La),
312            58 => Some(Element::Ce),
313            59 => Some(Element::Pr),
314            60 => Some(Element::Nd),
315            61 => Some(Element::Pm),
316            62 => Some(Element::Sm),
317            63 => Some(Element::Eu),
318            64 => Some(Element::Gd),
319            65 => Some(Element::Tb),
320            66 => Some(Element::Dy),
321            67 => Some(Element::Ho),
322            68 => Some(Element::Er),
323            69 => Some(Element::Tm),
324            70 => Some(Element::Yb),
325            71 => Some(Element::Lu),
326            72 => Some(Element::Hf),
327            73 => Some(Element::Ta),
328            74 => Some(Element::W),
329            75 => Some(Element::Re),
330            76 => Some(Element::Os),
331            77 => Some(Element::Ir),
332            78 => Some(Element::Pt),
333            79 => Some(Element::Au),
334            80 => Some(Element::Hg),
335            81 => Some(Element::Tl),
336            82 => Some(Element::Pb),
337            83 => Some(Element::Bi),
338            84 => Some(Element::Po),
339            85 => Some(Element::At),
340            86 => Some(Element::Rn),
341            87 => Some(Element::Fr),
342            88 => Some(Element::Ra),
343            89 => Some(Element::Ac),
344            90 => Some(Element::Th),
345            91 => Some(Element::Pa),
346            92 => Some(Element::U),
347            93 => Some(Element::Np),
348            94 => Some(Element::Pu),
349            95 => Some(Element::Am),
350            96 => Some(Element::Cm),
351            97 => Some(Element::Bk),
352            98 => Some(Element::Cf),
353            99 => Some(Element::Es),
354            100 => Some(Element::Fm),
355            101 => Some(Element::Md),
356            102 => Some(Element::No),
357            103 => Some(Element::Lr),
358            104 => Some(Element::Rf),
359            105 => Some(Element::Db),
360            106 => Some(Element::Sg),
361            107 => Some(Element::Bh),
362            108 => Some(Element::Hs),
363            109 => Some(Element::Mt),
364            110 => Some(Element::Ds),
365            111 => Some(Element::Rg),
366            112 => Some(Element::Cn),
367            113 => Some(Element::Nh),
368            114 => Some(Element::Fl),
369            115 => Some(Element::Mc),
370            116 => Some(Element::Lv),
371            117 => Some(Element::Ts),
372            118 => Some(Element::Og),
373            _ => None,
374        }
375    }
376
377    /// Get an element based on the symbol, eg "He" for Helium
378    pub fn from_symbol(symbol: impl AsRef<str>) -> Option<Element> {
379        symbol.as_ref().try_into().ok()
380    }
381
382    /// Get the symbol for this element eg "He" for Helium
383    pub fn symbol(&self) -> &'static str {
384        ELEMENT_SYMBOLS[self.atomic_number() - 1]
385    }
386
387    /// Get the full name for an element, eg "Helium" for Element::He
388    pub const fn full_name(&self) -> &'static str {
389        ELEMENT_NAMES[self.atomic_number() - 1]
390    }
391
392    /// Get the [AtomicRadius] for this element, see the documentation for the struct to get more information.
393    pub const fn atomic_radius(&self) -> &'static AtomicRadius {
394        &ELEMENT_ATOMIC_RADII[self.atomic_number() - 1]
395    }
396
397    /// Get the atomic weight for the given element. Applicable for all normal materials.
398    /// The mean value is given for the uncertainty surrounding the values for all elements.
399    /// Source: CIAAW. Atomic weights of the elements 2020. Available online at <https://www.ciaaw.org/atomic-weights.htm>.
400    pub const fn weight(&self) -> Option<f64> {
401        ELEMENT_WEIGHT[self.atomic_number() - 1]
402    }
403
404    /// Get the Pauling electronegativity for the element.
405    /// Source: WM Haynes (ed), CRC Handbook of Chemistry and Physics, 95th Edition. CRC Press. Boca Raton, Florida, 2014-2015; Section 9, Molecular Structure and Spectroscopy; Electronegativity
406    pub const fn electro_negativity(&self) -> Option<f64> {
407        ELEMENT_ELECTRON_NEGATIVITY[self.atomic_number() - 1]
408    }
409}
410
411#[allow(clippy::use_debug)]
412impl std::fmt::Display for Element {
413    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
414        write!(f, "{self:?}")
415    }
416}
417
418impl std::convert::TryFrom<&str> for Element {
419    type Error = &'static str;
420
421    fn try_from(value: &str) -> Result<Self, Self::Error> {
422        let value = value.to_ascii_uppercase();
423        if let Some(element) = ELEMENT_SYMBOLS
424            .iter()
425            .position(|name| *name == value.as_str())
426            .and_then(|n| Element::new(n + 1))
427        {
428            Ok(element)
429        } else {
430            Err("Invalid element code")
431        }
432    }
433}
434
435#[cfg(test)]
436#[allow(clippy::unwrap_used)]
437mod tests {
438    use std::convert::TryInto;
439
440    use crate::Element;
441
442    #[test]
443    fn atomic_number() {
444        assert_eq!(Element::Og.atomic_number(), 118);
445        assert_eq!(Element::Og, Element::new(118).unwrap());
446    }
447
448    #[test]
449    fn display() {
450        assert_eq!(Element::Lv.to_string(), "Lv");
451        assert_eq!(Element::Cl.to_string(), "Cl");
452        let element: Element = "Cl".try_into().unwrap();
453        assert_eq!(Element::Cl.atomic_number(), element.atomic_number());
454    }
455}
456
457/// The symbols of the elements of the periodic table
458const ELEMENT_SYMBOLS: [&str; 118] = [
459    "H", "HE", "LI", "BE", "B", "C", "N", "O", "F", "NE", "NA", "MG", "AL", "SI", "P", "S", "CL",
460    "AR", "K", "CA", "SC", "TI", "V", "CR", "MN", "FE", "CO", "NI", "CU", "ZN", "GA", "GE", "AS",
461    "SE", "BR", "KR", "RB", "SR", "Y", "ZR", "NB", "MO", "TC", "RU", "RH", "PD", "AG", "CD", "IN",
462    "SN", "SB", "TE", "I", "XE", "CS", "BA", "LA", "CE", "PR", "ND", "PM", "SM", "EU", "GD", "TB",
463    "DY", "HO", "ER", "TM", "YB", "LU", "HF", "TA", "W", "RE", "OS", "IR", "PT", "AU", "HG", "TL",
464    "PB", "BI", "PO", "AT", "RN", "FR", "RA", "AC", "TH", "PA", "U", "NP", "PU", "AM", "CM", "BK",
465    "CF", "ES", "FM", "MD", "NO", "LR", "RF", "DB", "SG", "BH", "HS", "MT", "DS", "RG", "CN", "NH",
466    "FL", "MC", "LV", "TS", "OG",
467];
468
469/// The names of the elements of the periodic table
470const ELEMENT_NAMES: [&str; 118] = [
471    "Hydrogen",
472    "Helium",
473    "Lithium",
474    "Beryllium",
475    "Boron",
476    "Carbon",
477    "Nitrogen",
478    "Oxygen",
479    "Fluorine",
480    "Neon",
481    "Sodium",
482    "Magnesium",
483    "Aluminum",
484    "Silicon",
485    "Phosphorus",
486    "Sulfur",
487    "Chlorine",
488    "Argon",
489    "Potassium",
490    "Calcium",
491    "Scandium",
492    "Titanium",
493    "Vanadium",
494    "Chromium",
495    "Manganese",
496    "Iron",
497    "Cobalt",
498    "Nickel",
499    "Copper",
500    "Zinc",
501    "Gallium",
502    "Germanium",
503    "Arsenic",
504    "Selenium",
505    "Bromine",
506    "Krypton",
507    "Rubidium",
508    "Strontium",
509    "Yttrium",
510    "Zirconium",
511    "Niobium",
512    "Molybdenum",
513    "Technetium",
514    "Ruthenium",
515    "Rhodium",
516    "Palladium",
517    "Silver",
518    "Cadmium",
519    "Indium",
520    "Tin",
521    "Antimony",
522    "Tellurium",
523    "Iodine",
524    "Xenon",
525    "Cesium",
526    "Barium",
527    "Lanthanum",
528    "Cerium",
529    "Praseodymium",
530    "Neodymium",
531    "Promethium",
532    "Samarium",
533    "Europium",
534    "Gadolinium",
535    "Terbium",
536    "Dysprosium",
537    "Holmium",
538    "Erbium",
539    "Thulium",
540    "Ytterbium",
541    "Lutetium",
542    "Hafnium",
543    "Tantalum",
544    "Wolfram",
545    "Rhenium",
546    "Osmium",
547    "Iridium",
548    "Platinum",
549    "Gold",
550    "Mercury",
551    "Thallium",
552    "Lead",
553    "Bismuth",
554    "Polonium",
555    "Astatine",
556    "Radon",
557    "Francium",
558    "Radium",
559    "Actinium",
560    "Thorium",
561    "Protactinium",
562    "Uranium",
563    "Neptunium",
564    "Plutonium",
565    "Americium",
566    "Curium",
567    "Berkelium",
568    "Californium",
569    "Einsteinium",
570    "Fermium",
571    "Mendelevium",
572    "Nobelium",
573    "Lawrencium",
574    "Rutherfordium",
575    "Dubnium",
576    "Seaborgium",
577    "Bohrium",
578    "Hassium",
579    "Meitnerium",
580    "Darmstadtium ",
581    "Roentgenium ",
582    "Copernicium ",
583    "Nihonium",
584    "Flerovium",
585    "Moscovium",
586    "Livermorium",
587    "Tennessine",
588    "Oganesson",
589];
590
591/// Hold all atomic radii for a single element. So that in the code it is obvious which radius you use. All values are in AÌŠ (10e-10 m or 0.1 nm).
592#[derive(Debug)]
593pub struct AtomicRadius {
594    /// Gets the atomic radius (defined up until 'Cm' 96) in AÌŠ.
595    /// Source: Martin Rahm, Roald Hoffmann, and N. W. Ashcroft. Atomic and Ionic Radii of Elements 1-96. Chemistry - A European Journal, 22(41):14625–14632, oct 2016. <http://doi.org/10.1002/chem.201602949>.
596    /// Updated to the corrigendum: <https://doi.org/10.1002/chem.201700610>
597    pub unbound: Option<f64>,
598    /// Gets the van der Waals radius (defined up until 'Es' 99 excluding 62, 84-88) in AÌŠ.
599    /// Source: Alvarez, S. (2013). A cartography of the van der Waals territories. Dalton Transactions, 42(24), 8617. <https://doi.org/10.1039/c3dt50599e>
600    pub van_der_waals: Option<f64>,
601    /// Gets the single covalently bonded atom radius (defined for all elements (<=118)) in AÌŠ.
602    /// Source: P. Pyykkö; M. Atsumi (2009). "Molecular Single-Bond Covalent Radii for Elements 1-118". Chemistry: A European Journal. 15 (1): 186–197. <http://doi.org/10.1002/chem.200800987>
603    pub covalent_single: f64,
604    /// Gets the double covalently bonded atom radius (defined for the elements 3-112) in AÌŠ.
605    /// Source: P. Pyykkö; M. Atsumi (2009). "Molecular Double-Bond Covalent Radii for Elements Li–E112". Chemistry: A European Journal. 15 (46): 12770–12779. <http://doi.org/10.1002/chem.200901472>
606    pub covalent_double: Option<f64>,
607    /// Gets the double covalently bonded atom radius (defined for all applicable elements (<=112)) in AÌŠ.
608    /// Source: P. Pyykkö; S. Riedel; M. Patzschke (2005). "Triple-Bond Covalent Radii". Chemistry: A European Journal. 11 (12): 3511–3520. <http://doi.org/10.1002/chem.200401299>
609    pub covalent_triple: Option<f64>,
610}
611
612impl AtomicRadius {
613    const fn new(
614        unbound: Option<f64>,
615        van_der_waals: Option<f64>,
616        covalent_single: f64,
617        covalent_double: Option<f64>,
618        covalent_triple: Option<f64>,
619    ) -> Self {
620        Self {
621            unbound,
622            van_der_waals,
623            covalent_single,
624            covalent_double,
625            covalent_triple,
626        }
627    }
628}
629
630/// All atomic radii for all atoms
631const ELEMENT_ATOMIC_RADII: [AtomicRadius; 118] = [
632    AtomicRadius::new(Some(1.54), Some(1.2), 0.32, None, None),
633    AtomicRadius::new(Some(1.34), Some(1.43), 0.46, None, None),
634    AtomicRadius::new(Some(2.20), Some(2.12), 1.33, Some(1.24), None),
635    AtomicRadius::new(Some(2.19), Some(1.98), 1.02, Some(0.90), Some(0.85)),
636    AtomicRadius::new(Some(2.05), Some(1.91), 0.85, Some(0.78), Some(0.73)),
637    AtomicRadius::new(Some(1.90), Some(1.77), 0.75, Some(0.67), Some(0.60)),
638    AtomicRadius::new(Some(1.79), Some(1.66), 0.71, Some(0.60), Some(0.54)),
639    AtomicRadius::new(Some(1.71), Some(1.5), 0.63, Some(0.57), Some(0.53)),
640    AtomicRadius::new(Some(1.63), Some(1.46), 0.64, Some(0.59), Some(0.53)),
641    AtomicRadius::new(Some(1.56), Some(1.58), 0.67, Some(0.96), None),
642    AtomicRadius::new(Some(2.25), Some(2.5), 1.55, Some(1.60), None),
643    AtomicRadius::new(Some(2.40), Some(2.51), 1.39, Some(1.32), Some(1.27)),
644    AtomicRadius::new(Some(2.39), Some(2.25), 1.26, Some(1.13), Some(1.11)),
645    AtomicRadius::new(Some(2.32), Some(2.19), 1.16, Some(1.07), Some(1.02)),
646    AtomicRadius::new(Some(2.23), Some(1.9), 1.11, Some(1.02), Some(0.94)),
647    AtomicRadius::new(Some(2.14), Some(1.89), 1.03, Some(0.94), Some(0.95)),
648    AtomicRadius::new(Some(2.06), Some(1.82), 0.99, Some(0.95), Some(0.93)),
649    AtomicRadius::new(Some(1.97), Some(1.83), 0.96, Some(1.07), Some(0.96)),
650    AtomicRadius::new(Some(2.34), Some(2.73), 1.96, Some(1.93), None),
651    AtomicRadius::new(Some(2.70), Some(2.62), 1.71, Some(1.47), Some(1.33)),
652    AtomicRadius::new(Some(2.63), Some(2.58), 1.48, Some(1.16), Some(1.14)),
653    AtomicRadius::new(Some(2.57), Some(2.46), 1.36, Some(1.17), Some(1.08)),
654    AtomicRadius::new(Some(2.52), Some(2.42), 1.34, Some(1.12), Some(1.06)),
655    AtomicRadius::new(Some(2.33), Some(2.45), 1.22, Some(1.11), Some(1.03)),
656    AtomicRadius::new(Some(2.42), Some(2.45), 1.19, Some(1.05), Some(1.03)),
657    AtomicRadius::new(Some(2.37), Some(2.44), 1.16, Some(1.09), Some(1.02)),
658    AtomicRadius::new(Some(2.33), Some(2.4), 1.11, Some(1.03), Some(9.6)),
659    AtomicRadius::new(Some(2.29), Some(2.4), 1.10, Some(1.01), Some(1.01)),
660    AtomicRadius::new(Some(2.17), Some(2.38), 1.12, Some(1.15), Some(1.20)),
661    AtomicRadius::new(Some(2.22), Some(2.39), 1.18, Some(1.20), None),
662    AtomicRadius::new(Some(2.33), Some(2.32), 1.24, Some(1.17), Some(1.21)),
663    AtomicRadius::new(Some(2.34), Some(2.29), 1.21, Some(1.11), Some(1.14)),
664    AtomicRadius::new(Some(2.31), Some(1.88), 1.21, Some(1.14), Some(1.06)),
665    AtomicRadius::new(Some(2.24), Some(1.82), 1.16, Some(1.07), Some(1.07)),
666    AtomicRadius::new(Some(2.19), Some(1.86), 1.14, Some(1.09), Some(1.10)),
667    AtomicRadius::new(Some(2.12), Some(2.25), 1.17, Some(1.21), Some(1.08)),
668    AtomicRadius::new(Some(2.40), Some(3.21), 2.10, Some(2.02), None),
669    AtomicRadius::new(Some(2.79), Some(2.84), 1.85, Some(1.57), Some(1.39)),
670    AtomicRadius::new(Some(2.74), Some(2.75), 1.63, Some(1.30), Some(1.24)),
671    AtomicRadius::new(Some(2.69), Some(2.52), 1.54, Some(1.27), Some(1.21)),
672    AtomicRadius::new(Some(2.51), Some(2.56), 1.47, Some(1.25), Some(1.16)),
673    AtomicRadius::new(Some(2.44), Some(2.45), 1.38, Some(1.21), Some(1.13)),
674    AtomicRadius::new(Some(2.52), Some(2.44), 1.28, Some(1.20), Some(1.10)),
675    AtomicRadius::new(Some(2.37), Some(2.46), 1.25, Some(1.14), Some(1.03)),
676    AtomicRadius::new(Some(2.33), Some(2.44), 1.25, Some(1.10), Some(1.06)),
677    AtomicRadius::new(Some(2.15), Some(2.15), 1.20, Some(1.17), Some(1.12)),
678    AtomicRadius::new(Some(2.25), Some(2.53), 1.28, Some(1.39), Some(1.37)),
679    AtomicRadius::new(Some(2.38), Some(2.49), 1.36, Some(1.44), None),
680    AtomicRadius::new(Some(2.46), Some(2.43), 1.42, Some(1.36), Some(1.46)),
681    AtomicRadius::new(Some(2.48), Some(2.42), 1.40, Some(1.30), Some(1.32)),
682    AtomicRadius::new(Some(2.46), Some(2.47), 1.40, Some(1.33), Some(1.27)),
683    AtomicRadius::new(Some(2.42), Some(1.99), 1.36, Some(1.28), Some(1.21)),
684    AtomicRadius::new(Some(2.38), Some(2.04), 1.33, Some(1.29), Some(1.25)),
685    AtomicRadius::new(Some(2.32), Some(2.06), 1.31, Some(1.35), Some(1.22)),
686    AtomicRadius::new(Some(2.49), Some(3.48), 2.32, Some(2.09), None),
687    AtomicRadius::new(Some(2.93), Some(3.03), 1.96, Some(1.61), Some(1.49)),
688    AtomicRadius::new(Some(2.84), Some(2.98), 1.80, Some(1.39), Some(1.39)),
689    AtomicRadius::new(Some(2.82), Some(2.88), 1.63, Some(1.37), Some(1.31)),
690    AtomicRadius::new(Some(2.86), Some(2.92), 1.76, Some(1.38), Some(1.28)),
691    AtomicRadius::new(Some(2.84), Some(2.95), 1.74, Some(1.37), None),
692    AtomicRadius::new(Some(2.83), None, 1.73, Some(1.35), None),
693    AtomicRadius::new(Some(2.80), Some(2.9), 1.72, Some(1.34), None),
694    AtomicRadius::new(Some(2.80), Some(2.87), 1.68, Some(1.34), None),
695    AtomicRadius::new(Some(2.77), Some(2.83), 1.69, Some(1.35), Some(1.32)),
696    AtomicRadius::new(Some(2.76), Some(2.79), 1.68, Some(1.35), None),
697    AtomicRadius::new(Some(2.75), Some(2.87), 1.67, Some(1.33), None),
698    AtomicRadius::new(Some(2.73), Some(2.81), 1.66, Some(1.33), None),
699    AtomicRadius::new(Some(2.72), Some(2.83), 1.65, Some(1.33), None),
700    AtomicRadius::new(Some(2.71), Some(2.79), 1.64, Some(1.31), None),
701    AtomicRadius::new(Some(2.77), Some(2.8), 1.70, Some(1.29), None),
702    AtomicRadius::new(Some(2.70), Some(2.74), 1.62, Some(1.31), Some(1.31)),
703    AtomicRadius::new(Some(2.64), Some(2.63), 1.52, Some(1.28), Some(1.22)),
704    AtomicRadius::new(Some(2.58), Some(2.53), 1.46, Some(1.26), Some(1.19)),
705    AtomicRadius::new(Some(2.53), Some(2.57), 1.37, Some(1.20), Some(1.15)),
706    AtomicRadius::new(Some(2.49), Some(2.49), 1.31, Some(1.19), Some(1.10)),
707    AtomicRadius::new(Some(2.44), Some(2.48), 1.29, Some(1.16), Some(1.09)),
708    AtomicRadius::new(Some(2.40), Some(2.41), 1.22, Some(1.15), Some(1.07)),
709    AtomicRadius::new(Some(2.30), Some(2.29), 1.23, Some(1.12), Some(1.10)),
710    AtomicRadius::new(Some(2.26), Some(2.32), 1.24, Some(1.21), Some(1.23)),
711    AtomicRadius::new(Some(2.29), Some(2.45), 1.33, Some(1.42), None),
712    AtomicRadius::new(Some(2.42), Some(2.47), 1.44, Some(1.42), Some(1.50)),
713    AtomicRadius::new(Some(2.49), Some(2.6), 1.44, Some(1.35), Some(1.37)),
714    AtomicRadius::new(Some(2.50), Some(2.54), 1.51, Some(1.41), Some(1.35)),
715    AtomicRadius::new(Some(2.50), None, 1.45, Some(1.35), Some(1.29)),
716    AtomicRadius::new(Some(2.47), None, 1.47, Some(1.38), Some(1.38)),
717    AtomicRadius::new(Some(2.43), None, 1.42, Some(1.45), Some(1.33)),
718    AtomicRadius::new(Some(2.58), None, 2.23, Some(2.18), None),
719    AtomicRadius::new(Some(2.92), None, 2.01, Some(1.73), Some(1.59)),
720    AtomicRadius::new(Some(2.93), Some(2.8), 1.86, Some(1.53), Some(1.40)),
721    AtomicRadius::new(Some(2.88), Some(2.93), 1.75, Some(1.43), Some(1.36)),
722    AtomicRadius::new(Some(2.85), Some(2.88), 1.69, Some(1.38), Some(1.29)),
723    AtomicRadius::new(Some(2.83), Some(2.71), 1.70, Some(1.34), Some(1.18)),
724    AtomicRadius::new(Some(2.81), Some(2.82), 1.71, Some(1.36), Some(1.16)),
725    AtomicRadius::new(Some(2.78), Some(2.81), 1.72, Some(1.35), None),
726    AtomicRadius::new(Some(2.76), Some(2.83), 1.66, Some(1.35), None),
727    AtomicRadius::new(Some(2.64), Some(3.05), 1.66, Some(1.36), None),
728    AtomicRadius::new(None, Some(3.4), 1.68, Some(1.39), None),
729    AtomicRadius::new(None, Some(3.05), 1.68, Some(1.40), None),
730    AtomicRadius::new(None, Some(2.7), 1.65, Some(1.40), None),
731    AtomicRadius::new(None, None, 1.67, Some(1.67), Some(1.67)),
732    AtomicRadius::new(None, None, 1.73, Some(1.39), None),
733    AtomicRadius::new(None, None, 1.76, Some(1.76), Some(1.76)),
734    AtomicRadius::new(None, None, 1.61, Some(1.41), None),
735    AtomicRadius::new(None, None, 1.57, Some(1.40), Some(1.31)),
736    AtomicRadius::new(None, None, 1.49, Some(1.36), Some(1.26)),
737    AtomicRadius::new(None, None, 1.43, Some(1.28), Some(1.21)),
738    AtomicRadius::new(None, None, 1.41, Some(1.28), Some(1.19)),
739    AtomicRadius::new(None, None, 1.34, Some(1.25), Some(1.18)),
740    AtomicRadius::new(None, None, 1.29, Some(1.25), Some(1.13)),
741    AtomicRadius::new(None, None, 1.28, Some(1.16), Some(1.12)),
742    AtomicRadius::new(None, None, 1.21, Some(1.16), Some(1.18)),
743    AtomicRadius::new(None, None, 1.22, Some(1.37), Some(1.30)),
744    AtomicRadius::new(None, None, 1.36, None, None),
745    AtomicRadius::new(None, None, 1.43, None, None),
746    AtomicRadius::new(None, None, 1.62, None, None),
747    AtomicRadius::new(None, None, 1.75, None, None),
748    AtomicRadius::new(None, None, 1.65, None, None),
749    AtomicRadius::new(None, None, 1.57, None, None),
750];
751
752const ELEMENT_WEIGHT: [Option<f64>; 118] = [
753    Some(1.007975),
754    Some(4.002602),
755    Some(6.9675),
756    Some(9.0121831),
757    Some(10.8135),
758    Some(12.0106),
759    Some(14.006855),
760    Some(15.9994),
761    Some(18.998403163),
762    Some(20.1797),
763    Some(22.98976928),
764    Some(24.3055),
765    Some(26.9815384),
766    Some(28.085),
767    Some(30.973761998),
768    Some(32.0675),
769    Some(35.4515),
770    Some(39.8775),
771    Some(39.0983),
772    Some(40.078),
773    Some(44.955908),
774    Some(47.867),
775    Some(50.9415),
776    Some(51.9961),
777    Some(54.938043),
778    Some(55.845),
779    Some(58.933194),
780    Some(58.6934),
781    Some(63.546),
782    Some(65.38),
783    Some(69.723),
784    Some(72.630),
785    Some(74.921595),
786    Some(78.971),
787    Some(79.904),
788    Some(83.798),
789    Some(85.4678),
790    Some(87.62),
791    Some(88.90584),
792    Some(91.224),
793    Some(92.90637),
794    Some(95.95),
795    None,
796    Some(101.07),
797    Some(102.90549),
798    Some(106.42),
799    Some(107.8682),
800    Some(112.414),
801    Some(114.818),
802    Some(118.710),
803    Some(121.760),
804    Some(127.60),
805    Some(126.90447),
806    Some(131.293),
807    Some(132.90545196),
808    Some(137.327),
809    Some(138.90547),
810    Some(140.116),
811    Some(140.90766),
812    Some(144.242),
813    None,
814    Some(150.36),
815    Some(151.964),
816    Some(157.25),
817    Some(158.925354),
818    Some(162.500),
819    Some(164.930328),
820    Some(167.259),
821    Some(168.934218),
822    Some(173.045),
823    Some(174.9668),
824    Some(178.486),
825    Some(180.94788),
826    Some(183.84),
827    Some(186.207),
828    Some(190.23),
829    Some(192.217),
830    Some(195.084),
831    Some(196.966570),
832    Some(200.592),
833    Some(204.3835),
834    Some(207.04),
835    Some(208.98040),
836    None,
837    None,
838    None,
839    None,
840    None,
841    None,
842    Some(232.0377),
843    Some(231.03588),
844    Some(238.02891),
845    None,
846    None,
847    None,
848    None,
849    None,
850    None,
851    None,
852    None,
853    None,
854    None,
855    None,
856    None,
857    None,
858    None,
859    None,
860    None,
861    None,
862    None,
863    None,
864    None,
865    None,
866    None,
867    None,
868    None,
869    None,
870    None,
871];
872
873const ELEMENT_ELECTRON_NEGATIVITY: [Option<f64>; 118] = [
874    Some(2.20),
875    None,
876    Some(0.98),
877    Some(1.57),
878    Some(2.04),
879    Some(2.55),
880    Some(3.04),
881    Some(3.44),
882    Some(3.98),
883    None,
884    Some(0.93),
885    Some(1.31),
886    Some(1.61),
887    Some(1.90),
888    Some(2.19),
889    Some(2.58),
890    Some(3.16),
891    None,
892    Some(0.82),
893    Some(1.00),
894    Some(1.36),
895    Some(1.54),
896    Some(1.63),
897    Some(1.66),
898    Some(1.55),
899    Some(1.83),
900    Some(1.88),
901    Some(1.91),
902    Some(1.90),
903    Some(1.65),
904    Some(1.81),
905    Some(2.01),
906    Some(2.18),
907    Some(2.55),
908    Some(2.96),
909    None,
910    Some(0.82),
911    Some(0.95),
912    Some(1.22),
913    Some(1.33),
914    Some(1.6),
915    Some(2.16),
916    Some(2.10),
917    Some(2.2),
918    Some(2.28),
919    Some(2.20),
920    Some(1.93),
921    Some(1.69),
922    Some(1.78),
923    Some(1.96),
924    Some(2.05),
925    Some(2.1),
926    Some(2.66),
927    Some(2.60),
928    Some(0.79),
929    Some(0.89),
930    Some(1.10),
931    Some(1.12),
932    Some(1.13),
933    Some(1.14),
934    None,
935    Some(1.17),
936    None,
937    Some(1.20),
938    None,
939    Some(1.22),
940    Some(1.23),
941    Some(1.24),
942    Some(1.25),
943    None,
944    Some(1.0),
945    Some(1.3),
946    Some(1.5),
947    Some(1.7),
948    Some(1.9),
949    Some(2.2),
950    Some(2.2),
951    Some(2.2),
952    Some(2.4),
953    Some(1.9),
954    Some(1.8),
955    Some(1.8),
956    Some(1.9),
957    Some(2.0),
958    Some(2.2),
959    None,
960    Some(0.7),
961    Some(0.9),
962    Some(1.1),
963    Some(1.3),
964    Some(1.5),
965    Some(1.7),
966    Some(1.3),
967    Some(1.3),
968    None,
969    None,
970    None,
971    None,
972    None,
973    None,
974    None,
975    None,
976    None,
977    None,
978    None,
979    None,
980    None,
981    None,
982    None,
983    None,
984    None,
985    None,
986    None,
987    None,
988    None,
989    None,
990    None,
991    None,
992];