Skip to main content

sciforge_lib/constants/physics/elements/
mod.rs

1use 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}