castep_cell_io/cell_document/sections/
mod.rs1use std::fmt::Display;
2
3use castep_periodic_table::element::ElementSymbol;
4use chemrust_core::data::atom::CoreAtomData;
5use chemrust_core::data::geom::coordinates::CoordData;
6use chemrust_core::data::lattice::{CellConstants, UnitCellParameters};
7use nalgebra::{Matrix3, Point3};
8
9use crate::cell_document::{IonicPositionBlock, LatticeABC, LatticeParam, LatticeParamBlock};
10
11use self::constraints::{FixAllCell, FixAllIons, FixCom, IonicConstraintsBlock};
12use self::symmetry_ops::SymmetryOpsBlock;
13
14use super::{
15 ExtEFieldBlock, ExtPressureBlock, KpointSettings, NCKpointSettings, SpeciesLCAOStatesBlock,
16 SpeciesMassBlock, SpeciesPotBlock,
17};
18
19pub mod constraints;
20pub mod external_fields;
21pub mod ionic_positions;
22pub mod kpoint_settings;
23pub mod lattice_parameters;
24pub mod species_characters;
25pub mod symmetry_ops;
26
27#[derive(Debug, Clone)]
28pub struct CellEssentials {
29 lattice_block: LatticeParamBlock,
30 ionic_pos_block: IonicPositionBlock,
31}
32
33impl UnitCellParameters for LatticeParamBlock {
34 fn lattice_bases(&self) -> Matrix3<f64> {
35 match self.parameter() {
36 LatticeParam::LatticeCart(lat_cart) => {
37 Matrix3::from_column_slice(&[lat_cart.a(), lat_cart.b(), lat_cart.c()].concat())
38 }
39 LatticeParam::LatticeABC(lat_abc) => {
40 let LatticeABC {
41 a,
42 b,
43 c,
44 alpha,
45 beta,
46 gamma,
47 } = lat_abc;
48 CellConstants::new(a, b, c, alpha.value(), beta.value(), gamma.value())
49 .lattice_bases()
50 }
51 }
52 }
53}
54
55impl CellEssentials {
56 pub fn new(lattice_block: LatticeParamBlock, ionic_pos_block: IonicPositionBlock) -> Self {
57 Self {
58 lattice_block,
59 ionic_pos_block,
60 }
61 }
62
63 pub fn lattice_block(&self) -> &LatticeParamBlock {
64 &self.lattice_block
65 }
66
67 pub fn ionic_pos_block(&self) -> &IonicPositionBlock {
68 &self.ionic_pos_block
69 }
70
71 pub fn lattice_block_mut(&mut self) -> &mut LatticeParamBlock {
72 &mut self.lattice_block
73 }
74
75 pub fn ionic_pos_block_mut(&mut self) -> &mut IonicPositionBlock {
76 &mut self.ionic_pos_block
77 }
78}
79
80impl CoreAtomData for IonicPositionBlock {
81 fn indices_repr(&self) -> Vec<usize> {
82 (0..self.positions().len()).collect()
83 }
84
85 fn symbols_repr(&self) -> Vec<ElementSymbol> {
86 self.positions().iter().map(|pos| pos.symbol()).collect()
87 }
88
89 fn coords_repr(&self) -> Vec<CoordData> {
90 self.positions()
91 .iter()
92 .map(|pos| CoordData::Fractional(Point3::from_slice(&pos.coordinate())))
93 .collect()
94 }
95
96 fn labels_repr(&self) -> Vec<Option<String>> {
97 vec![None; self.positions().len()]
98 }
99}
100
101#[derive(Debug, Clone)]
102pub enum CellEntries {
103 KpointSettings(KpointSettings),
104 NCKpointSettings(NCKpointSettings),
105 FixAllCell(FixAllCell),
107 FixAllIons(FixAllIons),
108 FixCom(FixCom),
110 IonicConstraints(IonicConstraintsBlock),
111 ExtEfield(ExtEFieldBlock),
112 ExtPressure(ExtPressureBlock),
113 SpeciesMass(SpeciesMassBlock),
114 SpeciesPot(SpeciesPotBlock),
115 SpeciesLCAOStates(SpeciesLCAOStatesBlock),
116 SymmetryOps(SymmetryOpsBlock),
117}
118
119impl Display for CellEntries {
120 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
121 let content = match self {
122 CellEntries::KpointSettings(v) => format!("{v}"),
123 CellEntries::NCKpointSettings(v) => format!("{v}"),
124 CellEntries::FixAllCell(v) => format!("{v}"),
125 CellEntries::FixAllIons(v) => format!("{v}"),
126 CellEntries::FixCom(v) => format!("{v}"),
127 CellEntries::IonicConstraints(v) => format!("{v}"),
128 CellEntries::ExtEfield(v) => format!("{v}"),
129 CellEntries::ExtPressure(v) => format!("{v}"),
130 CellEntries::SpeciesMass(v) => format!("{v}"),
131 CellEntries::SpeciesPot(v) => format!("{v}"),
132 CellEntries::SpeciesLCAOStates(v) => format!("{v}"),
133 CellEntries::SymmetryOps(v) => format!("{v}"),
134 };
135 write!(f, "{content}")
136 }
137}