sciforge_lib/constants/physics/elements/
mod.rs1use std::sync::OnceLock;
2
3#[derive(Clone, Debug)]
4pub struct DecayMode {
5 pub mode: &'static str,
6 pub branching_ratio: f64,
7 pub daughter: Option<&'static str>,
8}
9
10#[derive(Clone, Debug)]
11pub struct Isotope {
12 pub name: &'static str,
13 pub symbol: &'static str,
14 pub mass_number: u32,
15 pub neutrons: u32,
16 pub atomic_mass: f64,
17 pub half_life: Option<f64>,
18 pub half_life_unit: Option<&'static str>,
19 pub stable: bool,
20 pub decay_modes: Vec<DecayMode>,
21 pub natural_abundance: f64,
22 pub nuclear_spin: Option<&'static str>,
23}
24
25#[derive(Clone, Debug)]
26pub struct Element {
27 pub symbol: &'static str,
28 pub name: &'static str,
29 pub atomic_number: u32,
30 pub atomic_mass: f64,
31 pub electronegativity: Option<f64>,
32 pub group: Option<u32>,
33 pub period: u32,
34 pub category: &'static str,
35 pub electron_configuration: &'static str,
36 pub isotopes: Vec<Isotope>,
37}
38
39mod actinides;
40mod alkali_metals;
41mod alkaline_earth_metals;
42mod halogens;
43mod lanthanides;
44mod metalloids;
45mod noble_gases;
46mod nonmetals;
47mod post_transition_metals;
48mod superheavy_elements;
49mod transition_metals;
50
51fn init_elements() -> Vec<Element> {
52 vec![
53 nonmetals::hydrogen::element(),
54 noble_gases::helium::element(),
55 alkali_metals::lithium::element(),
56 alkaline_earth_metals::beryllium::element(),
57 metalloids::boron::element(),
58 nonmetals::carbon::element(),
59 nonmetals::nitrogen::element(),
60 nonmetals::oxygen::element(),
61 halogens::fluorine::element(),
62 noble_gases::neon::element(),
63 alkali_metals::sodium::element(),
64 alkaline_earth_metals::magnesium::element(),
65 post_transition_metals::aluminium::element(),
66 metalloids::silicon::element(),
67 nonmetals::phosphorus::element(),
68 nonmetals::sulfur::element(),
69 halogens::chlorine::element(),
70 noble_gases::argon::element(),
71 alkali_metals::potassium::element(),
72 alkaline_earth_metals::calcium::element(),
73 transition_metals::scandium::element(),
74 transition_metals::titanium::element(),
75 transition_metals::vanadium::element(),
76 transition_metals::chromium::element(),
77 transition_metals::manganese::element(),
78 transition_metals::iron::element(),
79 transition_metals::cobalt::element(),
80 transition_metals::nickel::element(),
81 transition_metals::copper::element(),
82 transition_metals::zinc::element(),
83 post_transition_metals::gallium::element(),
84 metalloids::germanium::element(),
85 metalloids::arsenic::element(),
86 nonmetals::selenium::element(),
87 halogens::bromine::element(),
88 noble_gases::krypton::element(),
89 alkali_metals::rubidium::element(),
90 alkaline_earth_metals::strontium::element(),
91 transition_metals::yttrium::element(),
92 transition_metals::zirconium::element(),
93 transition_metals::niobium::element(),
94 transition_metals::molybdenum::element(),
95 transition_metals::technetium::element(),
96 transition_metals::ruthenium::element(),
97 transition_metals::rhodium::element(),
98 transition_metals::palladium::element(),
99 transition_metals::silver::element(),
100 transition_metals::cadmium::element(),
101 post_transition_metals::indium::element(),
102 post_transition_metals::tin::element(),
103 metalloids::antimony::element(),
104 metalloids::tellurium::element(),
105 halogens::iodine::element(),
106 noble_gases::xenon::element(),
107 alkali_metals::cesium::element(),
108 alkaline_earth_metals::barium::element(),
109 lanthanides::lanthanum::element(),
110 lanthanides::cerium::element(),
111 lanthanides::praseodymium::element(),
112 lanthanides::neodymium::element(),
113 lanthanides::promethium::element(),
114 lanthanides::samarium::element(),
115 lanthanides::europium::element(),
116 lanthanides::gadolinium::element(),
117 lanthanides::terbium::element(),
118 lanthanides::dysprosium::element(),
119 lanthanides::holmium::element(),
120 lanthanides::erbium::element(),
121 lanthanides::thulium::element(),
122 lanthanides::ytterbium::element(),
123 lanthanides::lutetium::element(),
124 transition_metals::hafnium::element(),
125 transition_metals::tantalum::element(),
126 transition_metals::tungsten::element(),
127 transition_metals::rhenium::element(),
128 transition_metals::osmium::element(),
129 transition_metals::iridium::element(),
130 transition_metals::platinum::element(),
131 transition_metals::gold::element(),
132 transition_metals::mercury::element(),
133 post_transition_metals::thallium::element(),
134 post_transition_metals::lead::element(),
135 post_transition_metals::bismuth::element(),
136 post_transition_metals::polonium::element(),
137 halogens::astatine::element(),
138 noble_gases::radon::element(),
139 alkali_metals::francium::element(),
140 alkaline_earth_metals::radium::element(),
141 actinides::actinium::element(),
142 actinides::thorium::element(),
143 actinides::protactinium::element(),
144 actinides::uranium::element(),
145 actinides::neptunium::element(),
146 actinides::plutonium::element(),
147 actinides::americium::element(),
148 actinides::curium::element(),
149 actinides::berkelium::element(),
150 actinides::californium::element(),
151 actinides::einsteinium::element(),
152 actinides::fermium::element(),
153 actinides::mendelevium::element(),
154 actinides::nobelium::element(),
155 actinides::lawrencium::element(),
156 superheavy_elements::rutherfordium::element(),
157 superheavy_elements::dubnium::element(),
158 superheavy_elements::seaborgium::element(),
159 superheavy_elements::bohrium::element(),
160 superheavy_elements::hassium::element(),
161 superheavy_elements::meitnerium::element(),
162 superheavy_elements::darmstadtium::element(),
163 superheavy_elements::roentgenium::element(),
164 superheavy_elements::copernicium::element(),
165 superheavy_elements::nihonium::element(),
166 superheavy_elements::flerovium::element(),
167 superheavy_elements::moscovium::element(),
168 superheavy_elements::livermorium::element(),
169 halogens::tennessine::element(),
170 noble_gases::oganesson::element(),
171 ]
172}
173
174fn elements() -> &'static Vec<Element> {
175 static ELEMENTS: OnceLock<Vec<Element>> = OnceLock::new();
176 ELEMENTS.get_or_init(init_elements)
177}
178
179pub fn by_atomic_number(z: u32) -> Option<&'static Element> {
180 if (1..=118).contains(&z) {
181 Some(&elements()[(z - 1) as usize])
182 } else {
183 None
184 }
185}
186
187pub fn all() -> &'static [Element] {
188 elements()
189}
190
191pub fn by_symbol(sym: &str) -> Option<&'static Element> {
192 elements().iter().find(|e| e.symbol == sym)
193}
194
195pub fn atomic_mass(z: u32) -> f64 {
196 by_atomic_number(z).map_or(0.0, |e| e.atomic_mass)
197}
198
199pub fn electronegativity(z: u32) -> Option<f64> {
200 by_atomic_number(z).and_then(|e| e.electronegativity)
201}