castep_cell_io/cell_document/sections/
mod.rs

1use 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    /// This keyword controls whether or not all of the lattice parameters remain fixed during relaxation or molecular dynamics.
106    FixAllCell(FixAllCell),
107    FixAllIons(FixAllIons),
108    /// This keyword controls whether or not the center of mass of the ions remains fixed during relaxation or molecular dynamics.
109    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}