1use strum_macros::EnumIter;
2
3#[derive(Debug, Clone, Copy, PartialEq, EnumIter)]
8pub enum GeometricCrystalClass {
9 C1, Ci, C2, C1h, C2h, D2, C2v, D2h, C4, S4, C4h, D4, C4v, D2d, D4h, C3, C3i, D3, C3v, D3d, C6, C3h, C6h, D6, C6v, D3h, D6h, T, Th, O, Td, Oh, }
49
50#[allow(clippy::to_string_trait_impl)]
51impl ToString for GeometricCrystalClass {
52 fn to_string(&self) -> String {
53 match self {
54 GeometricCrystalClass::C1 => "1".to_string(),
56 GeometricCrystalClass::Ci => "-1".to_string(),
57 GeometricCrystalClass::C2 => "2".to_string(),
59 GeometricCrystalClass::C1h => "m".to_string(),
60 GeometricCrystalClass::C2h => "2/m".to_string(),
61 GeometricCrystalClass::D2 => "222".to_string(),
63 GeometricCrystalClass::C2v => "mm2".to_string(),
64 GeometricCrystalClass::D2h => "mmm".to_string(),
65 GeometricCrystalClass::C4 => "4".to_string(),
67 GeometricCrystalClass::S4 => "-4".to_string(),
68 GeometricCrystalClass::C4h => "4/m".to_string(),
69 GeometricCrystalClass::D4 => "422".to_string(),
70 GeometricCrystalClass::C4v => "4mm".to_string(),
71 GeometricCrystalClass::D2d => "-42m".to_string(),
72 GeometricCrystalClass::D4h => "4/mmm".to_string(),
73 GeometricCrystalClass::C3 => "3".to_string(),
75 GeometricCrystalClass::C3i => "-3".to_string(),
76 GeometricCrystalClass::D3 => "32".to_string(),
77 GeometricCrystalClass::C3v => "3m".to_string(),
78 GeometricCrystalClass::D3d => "-3m".to_string(),
79 GeometricCrystalClass::C6 => "6".to_string(),
81 GeometricCrystalClass::C3h => "-6".to_string(),
82 GeometricCrystalClass::C6h => "6/m".to_string(),
83 GeometricCrystalClass::D6 => "622".to_string(),
84 GeometricCrystalClass::C6v => "6mm".to_string(),
85 GeometricCrystalClass::D3h => "-6m2".to_string(),
86 GeometricCrystalClass::D6h => "6/mmm".to_string(),
87 GeometricCrystalClass::T => "23".to_string(),
89 GeometricCrystalClass::Th => "m-3".to_string(),
90 GeometricCrystalClass::O => "432".to_string(),
91 GeometricCrystalClass::Td => "-43m".to_string(),
92 GeometricCrystalClass::Oh => "m-3m".to_string(),
93 }
94 }
95}
96
97#[derive(Debug, Clone, Copy, PartialEq, EnumIter)]
98pub enum LaueClass {
99 Ci, C2h, D2h, C4h, D4h, C3i, D3d, C6h, D6h, Th, Oh, }
111
112impl LaueClass {
113 #[allow(dead_code)]
114 pub fn from_geometric_crystal_class(geometric_crystal_class: GeometricCrystalClass) -> Self {
115 match geometric_crystal_class {
116 GeometricCrystalClass::C1 | GeometricCrystalClass::Ci => LaueClass::Ci,
117 GeometricCrystalClass::C2 | GeometricCrystalClass::C1h | GeometricCrystalClass::C2h => {
118 LaueClass::C2h
119 }
120 GeometricCrystalClass::D2 | GeometricCrystalClass::C2v | GeometricCrystalClass::D2h => {
121 LaueClass::D2h
122 }
123 GeometricCrystalClass::C4 | GeometricCrystalClass::S4 | GeometricCrystalClass::C4h => {
124 LaueClass::C4h
125 }
126 GeometricCrystalClass::D4
127 | GeometricCrystalClass::C4v
128 | GeometricCrystalClass::D2d
129 | GeometricCrystalClass::D4h => LaueClass::D4h,
130 GeometricCrystalClass::C3 | GeometricCrystalClass::C3i => LaueClass::C3i,
131 GeometricCrystalClass::D3 | GeometricCrystalClass::C3v | GeometricCrystalClass::D3d => {
132 LaueClass::D3d
133 }
134 GeometricCrystalClass::C6 | GeometricCrystalClass::C3h | GeometricCrystalClass::C6h => {
135 LaueClass::C6h
136 }
137 GeometricCrystalClass::D6
138 | GeometricCrystalClass::C6v
139 | GeometricCrystalClass::D3h
140 | GeometricCrystalClass::D6h => LaueClass::D6h,
141 GeometricCrystalClass::T | GeometricCrystalClass::Th => LaueClass::Th,
142 GeometricCrystalClass::O | GeometricCrystalClass::Td | GeometricCrystalClass::Oh => {
143 LaueClass::Oh
144 }
145 }
146 }
147}
148
149#[derive(Debug, Clone, Copy, PartialEq, EnumIter)]
150pub enum CrystalSystem {
151 Triclinic,
152 Monoclinic,
153 Orthorhombic,
154 Tetragonal,
155 Trigonal,
156 Hexagonal,
157 Cubic,
158}
159
160impl CrystalSystem {
161 pub fn from_geometric_crystal_class(geometric_crystal_class: GeometricCrystalClass) -> Self {
162 match geometric_crystal_class {
163 GeometricCrystalClass::C1 | GeometricCrystalClass::Ci => CrystalSystem::Triclinic,
165 GeometricCrystalClass::C2 | GeometricCrystalClass::C1h | GeometricCrystalClass::C2h => {
167 CrystalSystem::Monoclinic
168 }
169 GeometricCrystalClass::D2 | GeometricCrystalClass::C2v | GeometricCrystalClass::D2h => {
171 CrystalSystem::Orthorhombic
172 }
173 GeometricCrystalClass::C4
175 | GeometricCrystalClass::S4
176 | GeometricCrystalClass::C4h
177 | GeometricCrystalClass::D4
178 | GeometricCrystalClass::C4v
179 | GeometricCrystalClass::D2d
180 | GeometricCrystalClass::D4h => CrystalSystem::Tetragonal,
181 GeometricCrystalClass::C3
183 | GeometricCrystalClass::C3i
184 | GeometricCrystalClass::D3
185 | GeometricCrystalClass::C3v
186 | GeometricCrystalClass::D3d => CrystalSystem::Trigonal,
187 GeometricCrystalClass::C6
189 | GeometricCrystalClass::C3h
190 | GeometricCrystalClass::C6h
191 | GeometricCrystalClass::D6
192 | GeometricCrystalClass::C6v
193 | GeometricCrystalClass::D3h
194 | GeometricCrystalClass::D6h => CrystalSystem::Hexagonal,
195 GeometricCrystalClass::T
197 | GeometricCrystalClass::Th
198 | GeometricCrystalClass::O
199 | GeometricCrystalClass::Td
200 | GeometricCrystalClass::Oh => CrystalSystem::Cubic,
201 }
202 }
203}
204
205#[allow(clippy::to_string_trait_impl)]
206impl ToString for CrystalSystem {
207 fn to_string(&self) -> String {
208 match self {
209 CrystalSystem::Triclinic => "Triclinic".to_string(),
210 CrystalSystem::Monoclinic => "Monoclinic".to_string(),
211 CrystalSystem::Orthorhombic => "Orthorhombic".to_string(),
212 CrystalSystem::Tetragonal => "Tetragonal".to_string(),
213 CrystalSystem::Trigonal => "Trigonal".to_string(),
214 CrystalSystem::Hexagonal => "Hexagonal".to_string(),
215 CrystalSystem::Cubic => "Cubic".to_string(),
216 }
217 }
218}
219
220#[allow(non_camel_case_types)]
225#[derive(Debug, Clone, Copy, PartialEq, EnumIter)]
226pub enum BravaisClass {
227 aP,
229 mP,
231 mC,
232 oP,
234 oS,
235 oF,
236 oI,
237 tP,
239 tI,
240 hR,
242 hP,
244 cP,
246 cF,
247 cI,
248}
249
250#[allow(clippy::to_string_trait_impl)]
251impl ToString for BravaisClass {
252 fn to_string(&self) -> String {
253 match self {
254 BravaisClass::aP => "aP".to_string(),
256 BravaisClass::mP => "mP".to_string(),
258 BravaisClass::mC => "mC".to_string(),
259 BravaisClass::oP => "oP".to_string(),
261 BravaisClass::oS => "oS".to_string(),
262 BravaisClass::oF => "oF".to_string(),
263 BravaisClass::oI => "oI".to_string(),
264 BravaisClass::tP => "tP".to_string(),
266 BravaisClass::tI => "tI".to_string(),
267 BravaisClass::hR => "hR".to_string(),
269 BravaisClass::hP => "hP".to_string(),
271 BravaisClass::cP => "cP".to_string(),
273 BravaisClass::cF => "cF".to_string(),
274 BravaisClass::cI => "cI".to_string(),
275 }
276 }
277}
278
279#[derive(Debug, Clone, Copy, PartialEq, EnumIter)]
280pub enum LatticeSystem {
281 Triclinic, Monoclinic, Orthorhombic, Tetragonal, Rhombohedral, Hexagonal, Cubic, }
290
291impl LatticeSystem {
292 pub fn from_bravais_class(bravais_class: BravaisClass) -> Self {
293 match bravais_class {
294 BravaisClass::aP => LatticeSystem::Triclinic,
295 BravaisClass::mP | BravaisClass::mC => LatticeSystem::Monoclinic,
296 BravaisClass::oP | BravaisClass::oS | BravaisClass::oF | BravaisClass::oI => {
297 LatticeSystem::Orthorhombic
298 }
299 BravaisClass::tP | BravaisClass::tI => LatticeSystem::Tetragonal,
300 BravaisClass::hR => LatticeSystem::Rhombohedral,
301 BravaisClass::hP => LatticeSystem::Hexagonal,
302 BravaisClass::cP | BravaisClass::cF | BravaisClass::cI => LatticeSystem::Cubic,
303 }
304 }
305}
306
307#[allow(clippy::to_string_trait_impl)]
308impl ToString for LatticeSystem {
309 fn to_string(&self) -> String {
310 match self {
311 LatticeSystem::Triclinic => "Triclinic".to_string(),
312 LatticeSystem::Monoclinic => "Monoclinic".to_string(),
313 LatticeSystem::Orthorhombic => "Orthorhombic".to_string(),
314 LatticeSystem::Tetragonal => "Tetragonal".to_string(),
315 LatticeSystem::Rhombohedral => "Rhombohedral".to_string(),
316 LatticeSystem::Hexagonal => "Hexagonal".to_string(),
317 LatticeSystem::Cubic => "Cubic".to_string(),
318 }
319 }
320}
321
322#[derive(Debug, Clone, Copy, PartialEq, EnumIter)]
327pub enum CrystalFamily {
328 Triclinic,
329 Monoclinic,
330 Orthorhombic,
331 Tetragonal,
332 Hexagonal,
333 Cubic,
334}
335
336impl CrystalFamily {
337 #[allow(dead_code)]
338 pub fn from_crystal_system(crystal_system: CrystalSystem) -> Self {
339 match crystal_system {
340 CrystalSystem::Triclinic => CrystalFamily::Triclinic,
341 CrystalSystem::Monoclinic => CrystalFamily::Monoclinic,
342 CrystalSystem::Orthorhombic => CrystalFamily::Orthorhombic,
343 CrystalSystem::Tetragonal => CrystalFamily::Tetragonal,
344 CrystalSystem::Trigonal | CrystalSystem::Hexagonal => CrystalFamily::Hexagonal,
345 CrystalSystem::Cubic => CrystalFamily::Cubic,
346 }
347 }
348
349 #[allow(dead_code)]
350 pub fn from_lattice_system(lattice_system: LatticeSystem) -> Self {
351 match lattice_system {
352 LatticeSystem::Triclinic => CrystalFamily::Triclinic,
353 LatticeSystem::Monoclinic => CrystalFamily::Monoclinic,
354 LatticeSystem::Orthorhombic => CrystalFamily::Orthorhombic,
355 LatticeSystem::Tetragonal => CrystalFamily::Tetragonal,
356 LatticeSystem::Rhombohedral | LatticeSystem::Hexagonal => CrystalFamily::Hexagonal,
357 LatticeSystem::Cubic => CrystalFamily::Cubic,
358 }
359 }
360}
361
362#[allow(clippy::to_string_trait_impl)]
363impl ToString for CrystalFamily {
364 fn to_string(&self) -> String {
365 match self {
366 CrystalFamily::Triclinic => "Triclinic".to_string(),
367 CrystalFamily::Monoclinic => "Monoclinic".to_string(),
368 CrystalFamily::Orthorhombic => "Orthorhombic".to_string(),
369 CrystalFamily::Tetragonal => "Tetragonal".to_string(),
370 CrystalFamily::Hexagonal => "Hexagonal".to_string(),
371 CrystalFamily::Cubic => "Cubic".to_string(),
372 }
373 }
374}