Source code for pyprocar.core.structure

# -*- coding: utf-8 -*-

# import spglib
import numpy as np
from . import elements

N_avogadro = 6.022140857e23


[docs]class Structure: def __init__(self, atoms=None, fractional_coordinates=None, lattice=None): """ Class to define a peridic crystal structure. Parameters ---------- atoms : list str A list of atomic symbols, with the same order as the ``fractional_coordinates``. fractional_coordinates : list (n,3) float. A (natom,3) list of fractional coordinatesd of atoms. lattice : list (3,3) float. A (3,3) matrix representing the lattice vectors. Returns ------- None. """ self.fractional_coordinates = fractional_coordinates self.atoms = atoms self.lattice = lattice @property def volume(self): """ Volume of the unit cell. Returns ------- float Volume of the unit cell(m). """ return abs(np.linalg.det(self.lattice)) * 1e-30 @property def masses(self): """ list of masses of each atom. Returns ------- list float Masses of each atom. """ return [elements.atomic_mass(x) * 1.0e-3 for x in self.atoms] @property def density(self): """ Density of the cell. Returns ------- float Density of the cell. """ return np.sum(self.masses) / (self.volume * N_avogadro) @property def species(self): """ list of different species present in the cell. Returns ------- list str List of different species present in the cell. """ return np.unique(self.atoms) @property def nspecies(self): """ Number of species present in the cell. Returns ------- int Number of species present in the cell. """ return len(self.species) @property def natoms(self): """ Number of atoms Returns ------- int Number of atoms. """ return len(self.atoms) @property def atomic_numbers(self): """ List of atomic numbers Returns ------- list List of atomic numbers. """ return [elements.atomic_number(x) for x in self.atoms]
# @property # def spglib_cell(self): # return (self.lattice, self.fractional_coordinates, self.atomic_numbers) # Question for uthpala: do you think we should include spglib? # def get_space_group_number(self, symprec=1e-5): # return spglib.get_symmetry_dataset(self.spglib_cell, symprec)["number"] # def get_space_group_international(self, symprec=1e-5): # return spglib.get_symmetry_dataset(self.spglib_cell, symprec)["international"] # def get_wyckoff_positions(self, symprec=1e-5): # return spglib.get_symmetry_dataset(self.spglib_cell, symprec)["wyckoffs"]