ferritin_core/info/
elements.rs

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