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