rpg_stat/
chemistry.rs

1/*!
2# 
3
4## Periodic
5
6```
7use rpg_stat::chemistry::Periodic;
8// 
9let periodic = Periodic::None;
10assert_eq!(periodic, Periodic::default());
11```
12
13*/
14use std::fmt;
15use crate::random::Random;
16use crate::stats::Stats;
17use crate::stats::Builder;
18use serde::{Deserialize, Serialize};
19#[cfg(feature = "fltkform")]
20use fltk::{prelude::*, *};
21#[cfg(feature = "fltkform")]
22use fltk_form_derive::*;
23#[cfg(feature = "fltkform")]
24use fltk_form::FltkForm;
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
26#[cfg_attr(feature = "fltkform", derive(FltkForm))]
27/*# Polarity
28
29*/
30pub enum Polarity {
31    /// Polar bonds generally occur when the difference in electronegativity between the two atoms is roughly between 0.5 and 2.0
32    Polar,
33    /// Ionic bonds generally occur when the difference in electronegativity between the two atoms is greater than 2.0
34    Ionic,
35    /// Nonpolar bonds generally occur when the difference in electronegativity between the two atoms is less than 0.5
36    None,
37}
38impl Default for Polarity {
39    fn default() -> Self {
40        Self::None
41    }
42}
43#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
44#[cfg_attr(feature = "fltkform", derive(FltkForm))]
45/*# Bonds
46
47*/ 
48pub enum Bonds {
49    Covalent,
50    Ionic,
51    Metallic,
52    CoordinateCovalent,
53    None,
54}
55impl Default for Bonds {
56    fn default() -> Self {
57        Self::None
58    }
59}
60/*# Molecule
61
62molecules held together by covalent bonds
63*/
64pub struct Molecule {
65    
66}
67
68#[derive(Debug, Clone, Default, PartialEq, Eq, Deserialize, Serialize)]
69#[cfg_attr(feature = "fltkform", derive(FltkForm))]
70/*# Compound
71
72A [chemical compound](https://en.wikipedia.org/wiki/Chemical_compound) is a chemical substance composed of many identical molecules (or molecular entities) composed of atoms from more than one element held together by chemical bonds. A molecule consisting of atoms of only one element is therefore not a compound.
73*/
74pub struct Compound {
75    // 
76    pub atoms:Vec<Periodic>,
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
80#[cfg_attr(feature = "fltkform", derive(FltkForm))]
81/*# Periodic
82
83*/
84pub enum Periodic {
85    /// 
86    Actinium,
87    /// 
88    Aluminum,
89    /// 
90    Americium,
91    /// 
92    Antimony,
93    /// 
94    Argon,
95    /// 
96    Arsenic,
97    /// 
98    Astatine,
99    /// 
100    Barium,
101    /// 
102    Berkelium,
103    /// 
104    Beryllium,
105    /// 
106    Bismuth,
107    /// 
108    Bohrium,
109    /// 
110    Boron,
111    /// 
112    Bromine,
113    /// 
114    Cadmium,
115    /// 
116    Calcium,
117    /// 
118    Californium,
119    /// 
120    Carbon,
121    /// 
122    Cerium,
123    /// 
124    Cesium,
125    /// 
126    Chlorine,
127    /// 
128    Chromium,
129    /// 
130    Cobalt,
131    /// 
132    Copernicium,
133    /// 
134    Copper,
135    /// 
136    Curium,
137    /// 
138    Darmstadtium,
139    /// 
140    Dubnium,
141    /// 
142    Dysprosium,
143    /// 
144    Einsteinium,
145    /// 
146    Erbium,
147    /// 
148    Europium,
149    /// 
150    Fermium,
151    /// 
152    Flerovium,
153    /// 
154    Fluorine,
155    /// 
156    Francium,
157    /// 
158    Gadolinium,
159    /// 
160    Gallium,
161    /// 
162    Germanium,
163    /// 
164    Gold,
165    /// 
166    Hafnium,
167    /// 
168    Hassium,
169    /// 
170    Helium,
171    /// 
172    Holmium,
173    /// 
174    Hydrogen,
175    /// 
176    Indium,
177    /// 
178    Iodine,
179    /// 
180    Iridium,
181    /// 
182    Iron,
183    /// 
184    Krypton,
185    /// 
186    Lanthanum,
187    /// 
188    Lawrencium,
189    /// 
190    Lead,
191    /// 
192    Lithium,
193    /// 
194    Livermorium,
195    /// 
196    Lutetium,
197    /// 
198    Magnesium,
199    /// 
200    Moscovium,
201    /// 
202    Manganese,
203    /// 
204    Meitnerium,
205    /// 
206    Mendelevium,
207    /// 
208    Mercury,
209    /// 
210    Molybdenum,
211    /// 
212    Neilsborium,
213    /// 
214    Neodymium,
215    /// 
216    Neon,
217    /// 
218    Neptunium,
219    /// 
220    Nihonium,
221    /// 
222    Nickel,
223    /// 
224    Niobium,
225    /// 
226    Nitrogen,
227    /// 
228    Nobelium,
229    /// 
230    Oganesson,
231    /// 
232    Osmium,
233    /// 
234    Oxygen,
235    /// 
236    Palladium,
237    /// 
238    Phosphorus,
239    /// 
240    Platinum,
241    /// 
242    Plutonium,
243    /// 
244    Polonium,
245    /// 
246    Praseodymium,
247    /// 
248    Potassium,
249    /// 
250    Promethium,
251    /// 
252    Protactinium,
253    /// 
254    Radium,
255    /// 
256    Radon,
257    /// 
258    Rhenium,
259    /// 
260    Rhodium,
261    /// 
262    Roentgenium,
263    /// 
264    Rubidium,
265    /// 
266    Ruthenium,
267    /// 
268    Rutherfordium,
269    /// 
270    Samarium,
271    /// 
272    Scandium,
273    /// 
274    Seaborgium,
275    /// 
276    Selenium,
277    /// 
278    Silicon,
279    /// 
280    Silver,
281    /// 
282    Sodium,
283    /// 
284    Strontium,
285    /// 
286    Sulfur,
287    /// 
288    Tantalum,
289    /// 
290    Technetium,
291    /// 
292    Tellurium,
293    /// 
294    Tennessine,
295    /// 
296    Terbium,
297    /// 
298    Thallium,
299    /// 
300    Thorium,
301    /// 
302    Thulium,
303    /// 
304    Tin,
305    /// 
306    Titanium,
307    /// 
308    Tungsten,
309    /// 
310    Uranium,
311    /// 
312    Vanadium,
313    /// 
314    Xenon,
315    /// 
316    Ytterbium,
317    /// 
318    Yttrium,
319    /// 
320    Zinc,
321    /// 
322    Zirconium,
323    /// Nothing
324    None,
325}
326impl Periodic {
327    /// A list of all items (except Periodic::None)
328    pub fn periodics() -> Vec<Periodic> {
329        vec![
330            Periodic::Actinium,
331            Periodic::Aluminum,
332            Periodic::Americium,
333            Periodic::Antimony,
334            Periodic::Argon,
335            Periodic::Arsenic,
336            Periodic::Astatine,
337            Periodic::Barium,
338            Periodic::Berkelium,
339            Periodic::Beryllium,
340            Periodic::Bismuth,
341            Periodic::Bohrium,
342            Periodic::Boron,
343            Periodic::Bromine,
344            Periodic::Cadmium,
345            Periodic::Calcium,
346            Periodic::Californium,
347            Periodic::Carbon,
348            Periodic::Cerium,
349            Periodic::Cesium,
350            Periodic::Chlorine,
351            Periodic::Chromium,
352            Periodic::Cobalt,
353            Periodic::Copernicium,
354            Periodic::Copper,
355            Periodic::Curium,
356            Periodic::Darmstadtium,
357            Periodic::Dubnium,
358            Periodic::Dysprosium,
359            Periodic::Einsteinium,
360            Periodic::Erbium,
361            Periodic::Europium,
362            Periodic::Fermium,
363            Periodic::Flerovium,
364            Periodic::Fluorine,
365            Periodic::Francium,
366            Periodic::Gadolinium,
367            Periodic::Gallium,
368            Periodic::Germanium,
369            Periodic::Gold,
370            Periodic::Hafnium,
371            Periodic::Hassium,
372            Periodic::Helium,
373            Periodic::Holmium,
374            Periodic::Hydrogen,
375            Periodic::Indium,
376            Periodic::Iodine,
377            Periodic::Iridium,
378            Periodic::Iron,
379            Periodic::Krypton,
380            Periodic::Lanthanum,
381            Periodic::Lawrencium,
382            Periodic::Lead,
383            Periodic::Lithium,
384            Periodic::Livermorium,
385            Periodic::Lutetium,
386            Periodic::Magnesium,
387            Periodic::Moscovium,
388            Periodic::Manganese,
389            Periodic::Meitnerium,
390            Periodic::Mendelevium,
391            Periodic::Mercury,
392            Periodic::Molybdenum,
393            Periodic::Neilsborium,
394            Periodic::Neodymium,
395            Periodic::Neon,
396            Periodic::Neptunium,
397            Periodic::Nihonium,
398            Periodic::Nickel,
399            Periodic::Niobium,
400            Periodic::Nitrogen,
401            Periodic::Nobelium,
402            Periodic::Oganesson,
403            Periodic::Osmium,
404            Periodic::Oxygen,
405            Periodic::Palladium,
406            Periodic::Phosphorus,
407            Periodic::Platinum,
408            Periodic::Plutonium,
409            Periodic::Polonium,
410            Periodic::Praseodymium,
411            Periodic::Potassium,
412            Periodic::Promethium,
413            Periodic::Protactinium,
414            Periodic::Radium,
415            Periodic::Radon,
416            Periodic::Rhenium,
417            Periodic::Rhodium,
418            Periodic::Roentgenium,
419            Periodic::Rubidium,
420            Periodic::Ruthenium,
421            Periodic::Rutherfordium,
422            Periodic::Samarium,
423            Periodic::Scandium,
424            Periodic::Seaborgium,
425            Periodic::Selenium,
426            Periodic::Silicon,
427            Periodic::Silver,
428            Periodic::Sodium,
429            Periodic::Strontium,
430            Periodic::Sulfur,
431            Periodic::Tantalum,
432            Periodic::Technetium,
433            Periodic::Tellurium,
434            Periodic::Tennessine,
435            Periodic::Terbium,
436            Periodic::Thallium,
437            Periodic::Thorium,
438            Periodic::Thulium,
439            Periodic::Tin,
440            Periodic::Titanium,
441            Periodic::Tungsten,
442            Periodic::Uranium,
443            Periodic::Vanadium,
444            Periodic::Xenon,
445            Periodic::Ytterbium,
446            Periodic::Yttrium,
447            Periodic::Zinc,
448            Periodic::Zirconium,
449            ]
450    }
451    /// Get the atomic number of some periodic element
452    pub fn get_atomic_number(periodic:Periodic) -> f64 {
453        periodic.atomic_number()
454    }
455    /// The atomic number of the periodic element
456    pub fn atomic_number(&self) -> f64 {
457        match *self {
458           Periodic::Actinium =>  89.0,
459           Periodic::Aluminum =>  13.0,
460           Periodic::Americium =>  95.0,
461           Periodic::Antimony =>  51.0,
462           Periodic::Argon =>  18.0,
463           Periodic::Arsenic =>  33.0,
464           Periodic::Astatine =>  85.0,
465           Periodic::Barium =>  56.0,
466           Periodic::Berkelium =>  97.0,
467           Periodic::Beryllium =>  4.0,
468           Periodic::Bismuth =>  83.0,
469           Periodic::Bohrium =>  107.0,
470           Periodic::Boron =>  5.0,
471           Periodic::Bromine =>  35.0,
472           Periodic::Cadmium =>  48.0,
473           Periodic::Calcium =>  20.0,
474           Periodic::Californium =>  98.0,
475           Periodic::Carbon =>  6.0,
476           Periodic::Cerium =>  58.0,
477           Periodic::Cesium =>  55.0,
478           Periodic::Chlorine =>  17.0,
479           Periodic::Chromium =>  24.0,
480           Periodic::Cobalt =>  27.0,
481           Periodic::Copernicium =>  112.0,
482           Periodic::Copper =>  29.0,
483           Periodic::Curium =>  96.0,
484           Periodic::Darmstadtium =>  110.0,
485           Periodic::Dubnium =>  105.0,
486           Periodic::Dysprosium =>  66.0,
487           Periodic::Einsteinium =>  99.0,
488           Periodic::Erbium =>  68.0,
489           Periodic::Europium =>  63.0,
490           Periodic::Fermium =>  100.0,
491           Periodic::Flerovium =>  114.0,
492           Periodic::Fluorine =>  9.0,
493           Periodic::Francium =>  87.0,
494           Periodic::Gadolinium =>  64.0,
495           Periodic::Gallium =>  31.0,
496           Periodic::Germanium =>  32.0,
497           Periodic::Gold =>  79.0,
498           Periodic::Hafnium =>  72.0,
499           Periodic::Hassium =>  108.0,
500           Periodic::Helium =>  2.0,
501           Periodic::Holmium =>  67.0,
502           Periodic::Hydrogen =>  1.0,
503           Periodic::Indium =>  49.0,
504           Periodic::Iodine =>  53.0,
505           Periodic::Iridium =>  77.0,
506           Periodic::Iron =>  26.0,
507           Periodic::Krypton =>  36.0,
508           Periodic::Lanthanum =>  57.0,
509           Periodic::Lawrencium =>  103.0,
510           Periodic::Lead =>  82.0,
511           Periodic::Lithium =>  3.0,
512           Periodic::Livermorium =>  116.0,
513           Periodic::Lutetium =>  71.0,
514           Periodic::Magnesium =>  12.0,
515           Periodic::Moscovium =>  115.0,
516           Periodic::Manganese =>  25.0,
517           Periodic::Meitnerium =>  109.0,
518           Periodic::Mendelevium =>  101.0,
519           Periodic::Mercury =>  80.0,
520           Periodic::Molybdenum =>  42.0,
521           Periodic::Neilsborium =>  107.0,
522           Periodic::Neodymium =>  60.0,
523           Periodic::Neon =>  10.0,
524           Periodic::Neptunium =>  93.0,
525           Periodic::Nihonium =>  113.0,
526           Periodic::Nickel =>  28.0,
527           Periodic::Niobium =>  41.0,
528           Periodic::Nitrogen =>  7.0,
529           Periodic::Nobelium =>  102.0,
530           Periodic::Oganesson =>  118.0,
531           Periodic::Osmium =>  76.0,
532           Periodic::Oxygen =>  8.0,
533           Periodic::Palladium =>  46.0,
534           Periodic::Phosphorus =>  15.0,
535           Periodic::Platinum =>  78.0,
536           Periodic::Plutonium =>  94.0,
537           Periodic::Polonium =>  84.0,
538           Periodic::Praseodymium =>  59.0,
539           Periodic::Potassium =>  19.0,
540           Periodic::Promethium =>  61.0,
541           Periodic::Protactinium =>  91.0,
542           Periodic::Radium =>  88.0,
543           Periodic::Radon =>  86.0,
544           Periodic::Rhenium =>  75.0,
545           Periodic::Rhodium =>  45.0,
546           Periodic::Roentgenium =>  111.0,
547           Periodic::Rubidium =>  37.0,
548           Periodic::Ruthenium =>  44.0,
549           Periodic::Rutherfordium =>  104.0,
550           Periodic::Samarium =>  62.0,
551           Periodic::Scandium =>  21.0,
552           Periodic::Seaborgium =>  106.0,
553           Periodic::Selenium =>  34.0,
554           Periodic::Silicon =>  14.0,
555           Periodic::Silver =>  47.0,
556           Periodic::Sodium =>  11.0,
557           Periodic::Strontium =>  38.0,
558           Periodic::Sulfur =>  16.0,
559           Periodic::Tantalum =>  73.0,
560           Periodic::Technetium =>  43.0,
561           Periodic::Tellurium =>  52.0,
562           Periodic::Tennessine =>  117.0,
563           Periodic::Terbium =>  65.0,
564           Periodic::Thallium =>  81.0,
565           Periodic::Thorium =>  90.0,
566           Periodic::Thulium =>  69.0,
567           Periodic::Tin =>  50.0,
568           Periodic::Titanium =>  22.0,
569           Periodic::Tungsten =>  74.0,
570           Periodic::Uranium =>  92.0,
571           Periodic::Vanadium =>  23.0,
572           Periodic::Xenon =>  54.0,
573           Periodic::Ytterbium =>  70.0,
574           Periodic::Yttrium =>  39.0,
575           Periodic::Zinc =>  30.0,
576           Periodic::Zirconium =>  40.0,
577           _=> 0.0,
578        }
579    }
580    pub fn abreviation(&self) -> &str {
581        match *self {
582           Periodic::Actinium =>  "Ac",
583           Periodic::Aluminum =>  "Al",
584           Periodic::Americium =>  "Am",
585           Periodic::Antimony =>  "Sb",
586           Periodic::Argon =>  "Ar",
587           Periodic::Arsenic =>  "As",
588           Periodic::Astatine =>  "At",
589           Periodic::Barium =>  "Ba",
590           Periodic::Berkelium =>  "Bk",
591           Periodic::Beryllium =>  "Be",
592           Periodic::Bismuth =>  "Bi",
593           Periodic::Bohrium =>  "Bh",
594           Periodic::Boron =>  "B",
595           Periodic::Bromine =>  "Br",
596           Periodic::Cadmium =>  "Cd",
597           Periodic::Calcium =>  "Ca",
598           Periodic::Californium =>  "Cf",
599           Periodic::Carbon =>  "C",
600           Periodic::Cerium =>  "Ce",
601           Periodic::Cesium =>  "Cs",
602           Periodic::Chlorine =>  "Cl",
603           Periodic::Chromium =>  "Cr",
604           Periodic::Cobalt =>  "Co",
605           Periodic::Copernicium =>  "Cn",
606           Periodic::Copper =>  "Cu",
607           Periodic::Curium =>  "Cm",
608           Periodic::Darmstadtium =>  "Ds",
609           Periodic::Dubnium =>  "Db",
610           Periodic::Dysprosium =>  "Dy",
611           Periodic::Einsteinium =>  "Es",
612           Periodic::Erbium =>  "Er",
613           Periodic::Europium =>  "Eu",
614           Periodic::Fermium =>  "Fm",
615           Periodic::Flerovium =>  "Fl",
616           Periodic::Fluorine =>  "F",
617           Periodic::Francium =>  "Fr",
618           Periodic::Gadolinium =>  "Gd",
619           Periodic::Gallium =>  "Ga",
620           Periodic::Germanium =>  "Ge",
621           Periodic::Gold =>  "Au",
622           Periodic::Hafnium =>  "Hf",
623           Periodic::Hassium =>  "Hs",
624           Periodic::Helium =>  "He",
625           Periodic::Holmium =>  "Ho",
626           Periodic::Hydrogen =>  "H",
627           Periodic::Indium =>  "In",
628           Periodic::Iodine =>  "I",
629           Periodic::Iridium =>  "Ir",
630           Periodic::Iron =>  "Fe",
631           Periodic::Krypton =>  "Kr",
632           Periodic::Lanthanum =>  "La",
633           Periodic::Lawrencium =>  "Lr",
634           Periodic::Lead =>  "Pb",
635           Periodic::Lithium =>  "Li",
636           Periodic::Livermorium =>  "Lv",
637           Periodic::Lutetium =>  "Lu",
638           Periodic::Magnesium =>  "Mg",
639           Periodic::Moscovium =>  "Mc",
640           Periodic::Manganese =>  "Mn",
641           Periodic::Meitnerium =>  "Mt",
642           Periodic::Mendelevium =>  "Md",
643           Periodic::Mercury =>  "Hg",
644           Periodic::Molybdenum =>  "Mo",
645           Periodic::Neilsborium =>  "Ns",
646           Periodic::Neodymium =>  "Nd",
647           Periodic::Neon =>  "Ne",
648           Periodic::Neptunium =>  "Np",
649           Periodic::Nihonium =>  "Nh",
650           Periodic::Nickel =>  "Ni",
651           Periodic::Niobium =>  "Nb",
652           Periodic::Nitrogen =>  "N",
653           Periodic::Nobelium =>  "No",
654           Periodic::Oganesson =>  "Og",
655           Periodic::Osmium =>  "Os",
656           Periodic::Oxygen =>  "O",
657           Periodic::Palladium =>  "Pd",
658           Periodic::Phosphorus =>  "P",
659           Periodic::Platinum =>  "Pt",
660           Periodic::Plutonium =>  "Pu",
661           Periodic::Polonium =>  "Po",
662           Periodic::Praseodymium =>  "Pr",
663           Periodic::Potassium =>  "K",
664           Periodic::Promethium =>  "Pm",
665           Periodic::Protactinium =>  "Pa",
666           Periodic::Radium =>  "Ra",
667           Periodic::Radon =>  "Rn",
668           Periodic::Rhenium =>  "Re",
669           Periodic::Rhodium =>  "Rh",
670           Periodic::Roentgenium =>  "Rg",
671           Periodic::Rubidium =>  "Rb",
672           Periodic::Ruthenium =>  "Ru",
673           Periodic::Rutherfordium =>  "Rf",
674           Periodic::Samarium =>  "Sm",
675           Periodic::Scandium =>  "Sc",
676           Periodic::Seaborgium =>  "Sg",
677           Periodic::Selenium =>  "Se",
678           Periodic::Silicon =>  "Si",
679           Periodic::Silver =>  "Ag",
680           Periodic::Sodium =>  "Na",
681           Periodic::Strontium =>  "Sr",
682           Periodic::Sulfur =>  "S",
683           Periodic::Tantalum =>  "Ta",
684           Periodic::Technetium =>  "Tc",
685           Periodic::Tellurium =>  "Te",
686           Periodic::Tennessine =>  "Ts",
687           Periodic::Terbium =>  "Tb",
688           Periodic::Thallium =>  "Tl",
689           Periodic::Thorium =>  "Th",
690           Periodic::Thulium =>  "Tm",
691           Periodic::Tin =>  "Sn",
692           Periodic::Titanium =>  "Ti",
693           Periodic::Tungsten =>  "W",
694           Periodic::Uranium =>  "U",
695           Periodic::Vanadium =>  "V",
696           Periodic::Xenon =>  "Xe",
697           Periodic::Ytterbium =>  "Yb",
698           Periodic::Yttrium =>  "Y",
699           Periodic::Zinc =>  "Zn",
700           Periodic::Zirconium =>  "Zr",
701           _=> "",
702        }
703    }
704}
705impl Default for Periodic {
706    fn default() -> Self {
707        Self::None
708    }
709}
710impl fmt::Display for Periodic {
711    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
712        let v:String;
713        match *self {
714            Periodic::Actinium => v = String::from("Actinium"),
715            Periodic::Aluminum => v = String::from("Aluminum"),
716            Periodic::Americium => v = String::from("Americium"),
717            Periodic::Antimony => v = String::from("Antimony"),
718            Periodic::Argon => v = String::from("Argon"),
719            Periodic::Arsenic => v = String::from("Arsenic"),
720            Periodic::Astatine => v = String::from("Astatine"),
721            Periodic::Barium => v = String::from("Barium"),
722            Periodic::Berkelium => v = String::from("Berkelium"),
723            Periodic::Beryllium => v = String::from("Beryllium"),
724            Periodic::Bismuth => v = String::from("Bismuth"),
725            Periodic::Bohrium => v = String::from("Bohrium"),
726            Periodic::Boron => v = String::from("Boron"),
727            Periodic::Bromine => v = String::from("Bromine"),
728            Periodic::Cadmium => v = String::from("Cadmium"),
729            Periodic::Calcium => v = String::from("Calcium"),
730            Periodic::Californium => v = String::from("Californium"),
731            Periodic::Carbon => v = String::from("Carbon"),
732            Periodic::Cerium => v = String::from("Cerium"),
733            Periodic::Cesium => v = String::from("Cesium"),
734            Periodic::Chlorine => v = String::from("Chlorine"),
735            Periodic::Chromium => v = String::from("Chromium"),
736            Periodic::Cobalt => v = String::from("Cobalt"),
737            Periodic::Copernicium => v = String::from("Copernicium"),
738            Periodic::Copper => v = String::from("Copper"),
739            Periodic::Curium => v = String::from("Curium"),
740            Periodic::Darmstadtium => v = String::from("Darmstadtium"),
741            Periodic::Dubnium => v = String::from("Dubnium"),
742            Periodic::Dysprosium => v = String::from("Dysprosium"),
743            Periodic::Einsteinium => v = String::from("Einsteinium"),
744            Periodic::Erbium => v = String::from("Erbium"),
745            Periodic::Europium => v = String::from("Europium"),
746            Periodic::Fermium => v = String::from("Fermium"),
747            Periodic::Flerovium => v = String::from("Flerovium"),
748            Periodic::Fluorine => v = String::from("Fluorine"),
749            Periodic::Francium => v = String::from("Francium"),
750            Periodic::Gadolinium => v = String::from("Gadolinium"),
751            Periodic::Gallium => v = String::from("Gallium"),
752            Periodic::Germanium => v = String::from("Germanium"),
753            Periodic::Gold => v = String::from("Gold"),
754            Periodic::Hafnium => v = String::from("Hafnium"),
755            Periodic::Hassium => v = String::from("Hassium"),
756            Periodic::Helium => v = String::from("Helium"),
757            Periodic::Holmium => v = String::from("Holmium"),
758            Periodic::Hydrogen => v = String::from("Hydrogen"),
759            Periodic::Indium => v = String::from("Indium"),
760            Periodic::Iodine => v = String::from("Iodine"),
761            Periodic::Iridium => v = String::from("Iridium"),
762            Periodic::Iron => v = String::from("Iron"),
763            Periodic::Krypton => v = String::from("Krypton"),
764            Periodic::Lanthanum => v = String::from("Lanthanum"),
765            Periodic::Lawrencium => v = String::from("Lawrencium"),
766            Periodic::Lead => v = String::from("Lead"),
767            Periodic::Lithium => v = String::from("Lithium"),
768            Periodic::Livermorium => v = String::from("Livermorium"),
769            Periodic::Lutetium => v = String::from("Lutetium"),
770            Periodic::Magnesium => v = String::from("Magnesium"),
771            Periodic::Moscovium => v = String::from("Moscovium"),
772            Periodic::Manganese => v = String::from("Manganese"),
773            Periodic::Meitnerium => v = String::from("Meitnerium"),
774            Periodic::Mendelevium => v = String::from("Mendelevium"),
775            Periodic::Mercury => v = String::from("Mercury"),
776            Periodic::Molybdenum => v = String::from("Molybdenum"),
777            Periodic::Neilsborium => v = String::from("Neilsborium"),
778            Periodic::Neodymium => v = String::from("Neodymium"),
779            Periodic::Neon => v = String::from("Neon"),
780            Periodic::Neptunium => v = String::from("Neptunium"),
781            Periodic::Nihonium => v = String::from("Nihonium"),
782            Periodic::Nickel => v = String::from("Nickel"),
783            Periodic::Niobium => v = String::from("Niobium"),
784            Periodic::Nitrogen => v = String::from("Nitrogen"),
785            Periodic::Nobelium => v = String::from("Nobelium"),
786            Periodic::Oganesson => v = String::from("Oganesson"),
787            Periodic::Osmium => v = String::from("Osmium"),
788            Periodic::Oxygen => v = String::from("Oxygen"),
789            Periodic::Palladium => v = String::from("Palladium"),
790            Periodic::Phosphorus => v = String::from("Phosphorus"),
791            Periodic::Platinum => v = String::from("Platinum"),
792            Periodic::Plutonium => v = String::from("Plutonium"),
793            Periodic::Polonium => v = String::from("Polonium"),
794            Periodic::Praseodymium => v = String::from("Praseodymium"),
795            Periodic::Potassium => v = String::from("Potassium"),
796            Periodic::Promethium => v = String::from("Promethium"),
797            Periodic::Protactinium => v = String::from("Protactinium"),
798            Periodic::Radium => v = String::from("Radium"),
799            Periodic::Radon => v = String::from("Radon"),
800            Periodic::Rhenium => v = String::from("Rhenium"),
801            Periodic::Rhodium => v = String::from("Rhodium"),
802            Periodic::Roentgenium => v = String::from("Roentgenium"),
803            Periodic::Rubidium => v = String::from("Rubidium"),
804            Periodic::Ruthenium => v = String::from("Ruthenium"),
805            Periodic::Rutherfordium => v = String::from("Rutherfordium"),
806            Periodic::Samarium => v = String::from("Samarium"),
807            Periodic::Scandium => v = String::from("Scandium"),
808            Periodic::Seaborgium => v = String::from("Seaborgium"),
809            Periodic::Selenium => v = String::from("Selenium"),
810            Periodic::Silicon => v = String::from("Silicon"),
811            Periodic::Silver => v = String::from("Silver"),
812            Periodic::Sodium => v = String::from("Sodium"),
813            Periodic::Strontium => v = String::from("Strontium"),
814            Periodic::Sulfur => v = String::from("Sulfur"),
815            Periodic::Tantalum => v = String::from("Tantalum"),
816            Periodic::Technetium => v = String::from("Technetium"),
817            Periodic::Tellurium => v = String::from("Tellurium"),
818            Periodic::Tennessine => v = String::from("Tennessine"),
819            Periodic::Terbium => v = String::from("Terbium"),
820            Periodic::Thallium => v = String::from("Thallium"),
821            Periodic::Thorium => v = String::from("Thorium"),
822            Periodic::Thulium => v = String::from("Thulium"),
823            Periodic::Tin => v = String::from("Tin"),
824            Periodic::Titanium => v = String::from("Titanium"),
825            Periodic::Tungsten => v = String::from("Tungsten"),
826            Periodic::Uranium => v = String::from("Uranium"),
827            Periodic::Vanadium => v = String::from("Vanadium"),
828            Periodic::Xenon => v = String::from("Xenon"),
829            Periodic::Ytterbium => v = String::from("Ytterbium"),
830            Periodic::Yttrium => v = String::from("Yttrium"),
831            Periodic::Zinc => v = String::from("Zinc"),
832            Periodic::Zirconium => v = String::from("Zirconium"),
833            _=> v = String::from("None"),
834        }
835        write!(f, "{}", v.as_str())
836    }
837}
838impl Random for Periodic {
839    type Type = Periodic;
840    fn random_type(&self) -> Self::Type {
841        let max = 119;
842        let val = self.random_rate(max);
843        match val {
844            0 => Periodic::Actinium,
845            1 => Periodic::Aluminum,
846            2 => Periodic::Americium,
847            3 => Periodic::Antimony,
848            4 => Periodic::Argon,
849            5 => Periodic::Arsenic,
850            6 => Periodic::Astatine,
851            7 => Periodic::Barium,
852            8 => Periodic::Berkelium,
853            9 => Periodic::Beryllium,
854            10 => Periodic::Bismuth,
855            11 => Periodic::Bohrium,
856            12 => Periodic::Boron,
857            13 => Periodic::Bromine,
858            14 => Periodic::Cadmium,
859            15 => Periodic::Calcium,
860            16 => Periodic::Californium,
861            17 => Periodic::Carbon,
862            18 => Periodic::Cerium,
863            19 => Periodic::Cesium,
864            20 => Periodic::Chlorine,
865            21 => Periodic::Chromium,
866            22 => Periodic::Cobalt,
867            23 => Periodic::Copernicium,
868            24 => Periodic::Copper,
869            25 => Periodic::Curium,
870            26 => Periodic::Darmstadtium,
871            27 => Periodic::Dubnium,
872            28 => Periodic::Dysprosium,
873            29 => Periodic::Einsteinium,
874            30 => Periodic::Erbium,
875            31 => Periodic::Europium,
876            32 => Periodic::Fermium,
877            33 => Periodic::Flerovium,
878            34 => Periodic::Fluorine,
879            35 => Periodic::Francium,
880            36 => Periodic::Gadolinium,
881            37 => Periodic::Gallium,
882            38 => Periodic::Germanium,
883            39 => Periodic::Gold,
884            40 => Periodic::Hafnium,
885            41 => Periodic::Hassium,
886            42 => Periodic::Helium,
887            43 => Periodic::Holmium,
888            44 => Periodic::Hydrogen,
889            45 => Periodic::Indium,
890            46 => Periodic::Iodine,
891            47 => Periodic::Iridium,
892            48 => Periodic::Iron,
893            49 => Periodic::Krypton,
894            50 => Periodic::Lanthanum,
895            51 => Periodic::Lawrencium,
896            52 => Periodic::Lead,
897            53 => Periodic::Lithium,
898            54 => Periodic::Livermorium,
899            55 => Periodic::Lutetium,
900            56 => Periodic::Magnesium,
901            57 => Periodic::Moscovium,
902            58 => Periodic::Manganese,
903            59 => Periodic::Meitnerium,
904            60 => Periodic::Mendelevium,
905            61 => Periodic::Mercury,
906            62 => Periodic::Molybdenum,
907            63 => Periodic::Neilsborium,
908            64 => Periodic::Neodymium,
909            65 => Periodic::Neon,
910            66 => Periodic::Neptunium,
911            67 => Periodic::Nihonium,
912            68 => Periodic::Nickel,
913            69 => Periodic::Niobium,
914            70 => Periodic::Nitrogen,
915            71 => Periodic::Nobelium,
916            72 => Periodic::Oganesson,
917            73 => Periodic::Osmium,
918            74 => Periodic::Oxygen,
919            75 => Periodic::Palladium,
920            76 => Periodic::Phosphorus,
921            77 => Periodic::Platinum,
922            78 => Periodic::Plutonium,
923            79 => Periodic::Polonium,
924            80 => Periodic::Praseodymium,
925            81 => Periodic::Potassium,
926            82 => Periodic::Promethium,
927            83 => Periodic::Protactinium,
928            84 => Periodic::Radium,
929            85 => Periodic::Radon,
930            86 => Periodic::Rhenium,
931            87 => Periodic::Rhodium,
932            88 => Periodic::Roentgenium,
933            89 => Periodic::Rubidium,
934            90 => Periodic::Ruthenium,
935            91 => Periodic::Rutherfordium,
936            92 => Periodic::Samarium,
937            93 => Periodic::Scandium,
938            94 => Periodic::Seaborgium,
939            95 => Periodic::Selenium,
940            96 => Periodic::Silicon,
941            97 => Periodic::Silver,
942            98 => Periodic::Sodium,
943            99 => Periodic::Strontium,
944            100 => Periodic::Sulfur,
945            101 => Periodic::Tantalum,
946            102 => Periodic::Technetium,
947            103 => Periodic::Tellurium,
948            104 => Periodic::Tennessine,
949            105 => Periodic::Terbium,
950            106 => Periodic::Thallium,
951            107 => Periodic::Thorium,
952            108 => Periodic::Thulium,
953            109 => Periodic::Tin,
954            110 => Periodic::Titanium,
955            111 => Periodic::Tungsten,
956            112 => Periodic::Uranium,
957            113 => Periodic::Vanadium,
958            114 => Periodic::Xenon,
959            115 => Periodic::Ytterbium,
960            116 => Periodic::Yttrium,
961            117 => Periodic::Zinc,
962            118 => Periodic::Zirconium,
963            _=> Periodic::None,
964        }
965    }
966    
967}
968#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
969#[cfg_attr(feature = "fltkform", derive(FltkForm))]
970/*
971# PeriodicTable
972
973This is a container for elements from the periodic table
974
975## What is a periodic table anyway??
976
977[The periodic table](https://en.wikipedia.org/wiki/Periodic_table), also known as the periodic table of (the) chemical elements, is a tabular display of the chemical elements. It is widely used in chemistry, physics, and other sciences, and is generally seen as an icon of chemistry. It is a graphic formulation of the periodic law, which states that the properties of the chemical elements exhibit a periodic dependence on their atomic numbers.
978
979The table is divided into four roughly rectangular areas called blocks. The rows of the table are called periods, and the columns are called groups. Elements from the same column group of the periodic table show similar chemical characteristics. Trends run through the periodic table, with nonmetallic character (keeping their own electrons) increasing from left to right across a period, and from down to up across a group, and metallic character (surrendering electrons to other atoms) increasing in the opposite direction. The underlying reason for these trends is electron configurations of atoms.
980
981The first periodic table to become generally accepted was that of the Russian chemist Dmitri Mendeleev in 1869: he formulated the periodic law as a dependence of chemical properties on atomic mass. Because not all elements were then known, there were gaps in his periodic table, and Mendeleev successfully used the periodic law to predict properties of some of the missing elements. The periodic law was recognized as a fundamental discovery in the late 19th century, and it was explained with the discovery of the atomic number and pioneering work in quantum mechanics of the early 20th century that illuminated the internal structure of the atom. With Glenn T. Seaborg's 1945 discovery that the actinides were in fact f-block rather than d-block elements, a recognisably modern form of the table was reached. The periodic table and law are now a central and indispensable part of modern chemistry.
982
983The periodic table continues to evolve with the progress of science. In nature, only elements up to atomic number 94 exist; to go further, it was necessary to synthesise new elements in the laboratory. Today, all the first 118 elements are known, completing the first seven rows of the table, but chemical characterisation is still needed for the heaviest elements to confirm that their properties match their positions. It is not yet known how far the table will stretch beyond these seven rows and whether the patterns of the known part of the table will continue into this unknown region. Some scientific discussion also continues regarding whether some elements are correctly positioned in today's table. Many alternative representations of the periodic law exist, and there is some discussion as to whether or not there is an optimal form of the periodic table.
984*/
985pub struct PeriodicTable {
986    /// Number of actinium periodic
987    pub actinium:u32,
988    /// Number of aluminum periodic
989    pub aluminum:u32,
990    /// Number of americium periodic
991    pub americium:u32,
992    /// Number of antimony periodic
993    pub antimony:u32,
994    /// Number of argon periodic
995    pub argon:u32,
996    /// Number of arsenic periodic
997    pub arsenic:u32,
998    /// Number of astatine periodic
999    pub astatine:u32,
1000    /// Number of barium periodic
1001    pub barium:u32,
1002    /// Number of berkelium periodic
1003    pub berkelium:u32,
1004    /// Number of beryllium periodic
1005    pub beryllium:u32,
1006    /// Number of bismuth periodic
1007    pub bismuth:u32,
1008    /// Number of bohrium periodic
1009    pub bohrium:u32,
1010    /// Number of boron periodic
1011    pub boron:u32,
1012    /// Number of bromine periodic
1013    pub bromine:u32,
1014    /// Number of cadmium periodic
1015    pub cadmium:u32,
1016    /// Number of calcium periodic
1017    pub calcium:u32,
1018    /// Number of californium periodic
1019    pub californium:u32,
1020    /// Number of carbon periodic
1021    pub carbon:u32,
1022    /// Number of cerium periodic
1023    pub cerium:u32,
1024    /// Number of cesium periodic
1025    pub cesium:u32,
1026    /// Number of chlorine periodic
1027    pub chlorine:u32,
1028    /// Number of chromium periodic
1029    pub chromium:u32,
1030    /// Number of cobalt periodic
1031    pub cobalt:u32,
1032    /// Number of copernicium periodic
1033    pub copernicium:u32,
1034    /// Number of copper periodic
1035    pub copper:u32,
1036    /// Number of curium periodic
1037    pub curium:u32,
1038    /// Number of darmstadtium periodic
1039    pub darmstadtium:u32,
1040    /// Number of dubnium periodic
1041    pub dubnium:u32,
1042    /// Number of dysprosium periodic
1043    pub dysprosium:u32,
1044    /// Number of einsteinium periodic
1045    pub einsteinium:u32,
1046    /// Number of erbium periodic
1047    pub erbium:u32,
1048    /// Number of europium periodic
1049    pub europium:u32,
1050    /// Number of fermium periodic
1051    pub fermium:u32,
1052    /// Number of flerovium periodic
1053    pub flerovium:u32,
1054    /// Number of fluorine periodic
1055    pub fluorine:u32,
1056    /// Number of francium periodic
1057    pub francium:u32,
1058    /// Number of gadolinium periodic
1059    pub gadolinium:u32,
1060    /// Number of gallium periodic
1061    pub gallium:u32,
1062    /// Number of germanium periodic
1063    pub germanium:u32,
1064    /// Number of gold periodic
1065    pub gold:u32,
1066    /// Number of hafnium periodic
1067    pub hafnium:u32,
1068    /// Number of hassium periodic
1069    pub hassium:u32,
1070    /// Number of helium periodic
1071    pub helium:u32,
1072    /// Number of holmium periodic
1073    pub holmium:u32,
1074    /// Number of hydrogen periodic
1075    pub hydrogen:u32,
1076    /// Number of indium periodic
1077    pub indium:u32,
1078    /// Number of iodine periodic
1079    pub iodine:u32,
1080    /// Number of iridium periodic
1081    pub iridium:u32,
1082    /// Number of iron periodic
1083    pub iron:u32,
1084    /// Number of krypton periodic
1085    pub krypton:u32,
1086    /// Number of lanthanum periodic
1087    pub lanthanum:u32,
1088    /// Number of lawrencium periodic
1089    pub lawrencium:u32,
1090    /// Number of lead periodic
1091    pub lead:u32,
1092    /// Number of lithium periodic
1093    pub lithium:u32,
1094    /// Number of livermorium periodic
1095    pub livermorium:u32,
1096    /// Number of lutetium periodic
1097    pub lutetium:u32,
1098    /// Number of magnesium periodic
1099    pub magnesium:u32,
1100    /// Number of moscovium periodic
1101    pub moscovium:u32,
1102    /// Number of manganese periodic
1103    pub manganese:u32,
1104    /// Number of meitnerium periodic
1105    pub meitnerium:u32,
1106    /// Number of mendelevium periodic
1107    pub mendelevium:u32,
1108    /// Number of mercury periodic
1109    pub mercury:u32,
1110    /// Number of molybdenum periodic
1111    pub molybdenum:u32,
1112    /// Number of neilsborium periodic
1113    pub neilsborium:u32,
1114    /// Number of neodymium periodic
1115    pub neodymium:u32,
1116    /// Number of neon periodic
1117    pub neon:u32,
1118    /// Number of neptunium periodic
1119    pub neptunium:u32,
1120    /// Number of nihonium periodic
1121    pub nihonium:u32,
1122    /// Number of nickel periodic
1123    pub nickel:u32,
1124    /// Number of niobium periodic
1125    pub niobium:u32,
1126    /// Number of nitrogen periodic
1127    pub nitrogen:u32,
1128    /// Number of nobelium periodic
1129    pub nobelium:u32,
1130    /// Number of oganesson periodic
1131    pub oganesson:u32,
1132    /// Number of osmium periodic
1133    pub osmium:u32,
1134    /// Number of oxygen periodic
1135    pub oxygen:u32,
1136    /// Number of palladium periodic
1137    pub palladium:u32,
1138    /// Number of phosphorus periodic
1139    pub phosphorus:u32,
1140    /// Number of platinum periodic
1141    pub platinum:u32,
1142    /// Number of plutonium periodic
1143    pub plutonium:u32,
1144    /// Number of polonium periodic
1145    pub polonium:u32,
1146    /// Number of praseodymium periodic
1147    pub praseodymium:u32,
1148    /// Number of potassium periodic
1149    pub potassium:u32,
1150    /// Number of promethium periodic
1151    pub promethium:u32,
1152    /// Number of protactinium periodic
1153    pub protactinium:u32,
1154    /// Number of radium periodic
1155    pub radium:u32,
1156    /// Number of radon periodic
1157    pub radon:u32,
1158    /// Number of rhenium periodic
1159    pub rhenium:u32,
1160    /// Number of rhodium periodic
1161    pub rhodium:u32,
1162    /// Number of roentgenium periodic
1163    pub roentgenium:u32,
1164    /// Number of rubidium periodic
1165    pub rubidium:u32,
1166    /// Number of ruthenium periodic
1167    pub ruthenium:u32,
1168    /// Number of rutherfordium periodic
1169    pub rutherfordium:u32,
1170    /// Number of samarium periodic
1171    pub samarium:u32,
1172    /// Number of scandium periodic
1173    pub scandium:u32,
1174    /// Number of seaborgium periodic
1175    pub seaborgium:u32,
1176    /// Number of selenium periodic
1177    pub selenium:u32,
1178    /// Number of silicon periodic
1179    pub silicon:u32,
1180    /// Number of silver periodic
1181    pub silver:u32,
1182    /// Number of sodium periodic
1183    pub sodium:u32,
1184    /// Number of strontium periodic
1185    pub strontium:u32,
1186    /// Number of sulfur periodic
1187    pub sulfur:u32,
1188    /// Number of tantalum periodic
1189    pub tantalum:u32,
1190    /// Number of technetium periodic
1191    pub technetium:u32,
1192    /// Number of tellurium periodic
1193    pub tellurium:u32,
1194    /// Number of tennessine periodic
1195    pub tennessine:u32,
1196    /// Number of terbium periodic
1197    pub terbium:u32,
1198    /// Number of thallium periodic
1199    pub thallium:u32,
1200    /// Number of thorium periodic
1201    pub thorium:u32,
1202    /// Number of thulium periodic
1203    pub thulium:u32,
1204    /// Number of tin periodic
1205    pub tin:u32,
1206    /// Number of titanium periodic
1207    pub titanium:u32,
1208    /// Number of tungsten periodic
1209    pub tungsten:u32,
1210    /// Number of uranium periodic
1211    pub uranium:u32,
1212    /// Number of vanadium periodic
1213    pub vanadium:u32,
1214    /// Number of xenon periodic
1215    pub xenon:u32,
1216    /// Number of ytterbium periodic
1217    pub ytterbium:u32,
1218    /// Number of yttrium periodic
1219    pub yttrium:u32,
1220    /// Number of zinc periodic
1221    pub zinc:u32,
1222    /// Number of zirconium periodic
1223    pub zirconium:u32,
1224}
1225impl PeriodicTable {
1226    pub fn new() -> Self {
1227            PeriodicTable {
1228            actinium:0,
1229            aluminum:0,
1230            americium:0,
1231            antimony:0,
1232            argon:0,
1233            arsenic:0,
1234            astatine:0,
1235            barium:0,
1236            berkelium:0,
1237            beryllium:0,
1238            bismuth:0,
1239            bohrium:0,
1240            boron:0,
1241            bromine:0,
1242            cadmium:0,
1243            calcium:0,
1244            californium:0,
1245            carbon:0,
1246            cerium:0,
1247            cesium:0,
1248            chlorine:0,
1249            chromium:0,
1250            cobalt:0,
1251            copernicium:0,
1252            copper:0,
1253            curium:0,
1254            darmstadtium:0,
1255            dubnium:0,
1256            dysprosium:0,
1257            einsteinium:0,
1258            erbium:0,
1259            europium:0,
1260            fermium:0,
1261            flerovium:0,
1262            fluorine:0,
1263            francium:0,
1264            gadolinium:0,
1265            gallium:0,
1266            germanium:0,
1267            gold:0,
1268            hafnium:0,
1269            hassium:0,
1270            helium:0,
1271            holmium:0,
1272            hydrogen:0,
1273            indium:0,
1274            iodine:0,
1275            iridium:0,
1276            iron:0,
1277            krypton:0,
1278            lanthanum:0,
1279            lawrencium:0,
1280            lead:0,
1281            lithium:0,
1282            livermorium:0,
1283            lutetium:0,
1284            magnesium:0,
1285            moscovium:0,
1286            manganese:0,
1287            meitnerium:0,
1288            mendelevium:0,
1289            mercury:0,
1290            molybdenum:0,
1291            neilsborium:0,
1292            neodymium:0,
1293            neon:0,
1294            neptunium:0,
1295            nihonium:0,
1296            nickel:0,
1297            niobium:0,
1298            nitrogen:0,
1299            nobelium:0,
1300            oganesson:0,
1301            osmium:0,
1302            oxygen:0,
1303            palladium:0,
1304            phosphorus:0,
1305            platinum:0,
1306            plutonium:0,
1307            polonium:0,
1308            praseodymium:0,
1309            potassium:0,
1310            promethium:0,
1311            protactinium:0,
1312            radium:0,
1313            radon:0,
1314            rhenium:0,
1315            rhodium:0,
1316            roentgenium:0,
1317            rubidium:0,
1318            ruthenium:0,
1319            rutherfordium:0,
1320            samarium:0,
1321            scandium:0,
1322            seaborgium:0,
1323            selenium:0,
1324            silicon:0,
1325            silver:0,
1326            sodium:0,
1327            strontium:0,
1328            sulfur:0,
1329            tantalum:0,
1330            technetium:0,
1331            tellurium:0,
1332            tennessine:0,
1333            terbium:0,
1334            thallium:0,
1335            thorium:0,
1336            thulium:0,
1337            tin:0,
1338            titanium:0,
1339            tungsten:0,
1340            uranium:0,
1341            vanadium:0,
1342            xenon:0,
1343            ytterbium:0,
1344            yttrium:0,
1345            zinc:0,
1346            zirconium:0,
1347        }
1348    }
1349}