castep-cell-io 0.2.14

A crate helping to parse, edit and save `castep` input file format `.cell`
Documentation
use chemrust_core::data::atom::CoreAtomData;
use chemrust_core::data::lattice::CrystalModel;
use chemrust_core::data::lattice::UnitCellParameters;

use crate::{
    cell_document::{
        sections::lattice_parameters::LatticeParam, CellDocument, IonicPosition,
        IonicPositionBlock, LatticeParamBlock,
    },
    LengthUnit,
    PositionsKeywords::POSITIONS_FRAC,
};

use super::CellEssentials;
use super::LatticeCart;

pub fn to_cell_document<T: CrystalModel>(model: &T) -> CellDocument {
    let lattice_param_block = LatticeParamBlock::from(model.get_cell_parameters());
    let ionic_pos_block = IonicPositionBlock::from_atom_data(
        model.get_atom_data(),
        &model.get_cell_parameters().lattice_bases(),
    );
    let model_description = CellEssentials::new(lattice_param_block, ionic_pos_block);
    CellDocument::new(model_description)
}

impl<T> From<&T> for LatticeParamBlock
where
    T: UnitCellParameters,
{
    fn from(value: &T) -> Self {
        let lattice_bases = value.lattice_bases();
        let (a, b, c) = (
            lattice_bases.column(0).into(),
            lattice_bases.column(1).into(),
            lattice_bases.column(2).into(),
        );
        let lattice_cart = LatticeCart::new(a, b, c);
        let lattice_param = LatticeParam::LatticeCart(lattice_cart);
        LatticeParamBlock::new(LengthUnit::Ang, lattice_param)
    }
}