moyo/data/
classification.rs

1use strum_macros::EnumIter;
2
3/// ===========================================================================
4/// Classification based on point group
5/// ===========================================================================
6/// c.f. Table 3.2.3.2 of ITA(6th)
7#[derive(Debug, Clone, Copy, PartialEq, EnumIter)]
8pub enum GeometricCrystalClass {
9    // Triclinic
10    C1, // 1
11    Ci, // -1
12    // Monoclinic
13    C2,  // 2
14    C1h, // m
15    C2h, // 2/m
16    // Orthorhombic
17    D2,  // 222
18    C2v, // mm2
19    D2h, // mmm
20    // Tetragonal
21    C4,  // 4
22    S4,  // -4
23    C4h, // 4/m
24    D4,  // 422
25    C4v, // 4mm
26    D2d, // -42m
27    D4h, // 4/mmm
28    // Trigonal
29    C3,  // 3
30    C3i, // -3
31    D3,  // 32
32    C3v, // 3m
33    D3d, // -3m
34    // Hexagonal
35    C6,  // 6
36    C3h, // -6
37    C6h, // 6/m
38    D6,  // 622
39    C6v, // 6mm
40    D3h, // -6m2
41    D6h, // 6/mmm
42    // Cubic
43    T,  // 23
44    Th, // m-3
45    O,  // 432
46    Td, // -43m
47    Oh, // m-3m
48}
49
50#[allow(clippy::to_string_trait_impl)]
51impl ToString for GeometricCrystalClass {
52    fn to_string(&self) -> String {
53        match self {
54            // Triclinic
55            GeometricCrystalClass::C1 => "1".to_string(),
56            GeometricCrystalClass::Ci => "-1".to_string(),
57            // Monoclinic
58            GeometricCrystalClass::C2 => "2".to_string(),
59            GeometricCrystalClass::C1h => "m".to_string(),
60            GeometricCrystalClass::C2h => "2/m".to_string(),
61            // Orthorhombic
62            GeometricCrystalClass::D2 => "222".to_string(),
63            GeometricCrystalClass::C2v => "mm2".to_string(),
64            GeometricCrystalClass::D2h => "mmm".to_string(),
65            // Tetragonal
66            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            // Trigonal
74            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            // Hexagonal
80            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            // Cubic
88            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,  // -1
100    C2h, // 2/m,
101    D2h, // mmm
102    C4h, // 4/m
103    D4h, // 4/mmm
104    C3i, // -3
105    D3d, // -3m
106    C6h, // 6/m
107    D6h, // 6/mmm
108    Th,  // m-3
109    Oh,  // m-3m
110}
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            // Triclinic
164            GeometricCrystalClass::C1 | GeometricCrystalClass::Ci => CrystalSystem::Triclinic,
165            // Monoclinic
166            GeometricCrystalClass::C2 | GeometricCrystalClass::C1h | GeometricCrystalClass::C2h => {
167                CrystalSystem::Monoclinic
168            }
169            // Orthorhombic
170            GeometricCrystalClass::D2 | GeometricCrystalClass::C2v | GeometricCrystalClass::D2h => {
171                CrystalSystem::Orthorhombic
172            }
173            // Tetragonal
174            GeometricCrystalClass::C4
175            | GeometricCrystalClass::S4
176            | GeometricCrystalClass::C4h
177            | GeometricCrystalClass::D4
178            | GeometricCrystalClass::C4v
179            | GeometricCrystalClass::D2d
180            | GeometricCrystalClass::D4h => CrystalSystem::Tetragonal,
181            // Trigonal
182            GeometricCrystalClass::C3
183            | GeometricCrystalClass::C3i
184            | GeometricCrystalClass::D3
185            | GeometricCrystalClass::C3v
186            | GeometricCrystalClass::D3d => CrystalSystem::Trigonal,
187            // Hexagonal
188            GeometricCrystalClass::C6
189            | GeometricCrystalClass::C3h
190            | GeometricCrystalClass::C6h
191            | GeometricCrystalClass::D6
192            | GeometricCrystalClass::C6v
193            | GeometricCrystalClass::D3h
194            | GeometricCrystalClass::D6h => CrystalSystem::Hexagonal,
195            // Cubic
196            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/// ===========================================================================
221/// Classification based on lattice
222/// ===========================================================================
223/// Reuse notations for Bravais type of lattices
224#[allow(non_camel_case_types)]
225#[derive(Debug, Clone, Copy, PartialEq, EnumIter)]
226pub enum BravaisClass {
227    // Triclinic
228    aP,
229    // Monoclinic
230    mP,
231    mC,
232    // Orthorhombic
233    oP,
234    oS,
235    oF,
236    oI,
237    // Tetragonal
238    tP,
239    tI,
240    // Rhombohedral
241    hR,
242    // Hexagonal
243    hP,
244    // Cubic
245    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            // Triclinic
255            BravaisClass::aP => "aP".to_string(),
256            // Monoclinic
257            BravaisClass::mP => "mP".to_string(),
258            BravaisClass::mC => "mC".to_string(),
259            // Orthorhombic
260            BravaisClass::oP => "oP".to_string(),
261            BravaisClass::oS => "oS".to_string(),
262            BravaisClass::oF => "oF".to_string(),
263            BravaisClass::oI => "oI".to_string(),
264            // Tetragonal
265            BravaisClass::tP => "tP".to_string(),
266            BravaisClass::tI => "tI".to_string(),
267            // Rhombohedral
268            BravaisClass::hR => "hR".to_string(),
269            // Hexagonal
270            BravaisClass::hP => "hP".to_string(),
271            // Cubic
272            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    // (lattice system, holohedry)
282    Triclinic,    // -1
283    Monoclinic,   // 2/m
284    Orthorhombic, // mmm
285    Tetragonal,   // 4/mmm
286    Rhombohedral, // -3m
287    Hexagonal,    // 6/mmm
288    Cubic,        // m-3m
289}
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/// ===========================================================================
323/// Other classification
324/// ===========================================================================
325
326#[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}