# -*- coding: utf-8 -*-
import spglib
import numpy as np
from ..utils import elements
from ..utils.constants import N_avogadro
[docs]class Structure:
def __init__(
self, atoms, fractional_coordinates, lattice,
):
self.fractional_coordinates = np.array(fractional_coordinates)
self.atoms = np.array(atoms)
self.lattice = np.array(lattice)
@property
def volume(self):
return abs(np.linalg.det(self.lattice)) * 1e-30
@property
def masses(self):
return [elements.atomic_mass(x) * 1.0e-3 for x in self.atoms]
@property
def density(self):
return np.sum(self.masses) / (self.volume * N_avogadro)
@property
def species(self):
return np.unique(self.atoms).tolist()
@property
def nspecies(self):
return len(self.species)
@property
def natoms(self):
return len(self.atoms)
@property
def atomic_numbers(self):
return [elements.atomic_number(x) for x in self.atoms]
@property
def spglib_cell(self):
return (self.lattice, self.fractional_coordinates, self.atomic_numbers)
[docs] def get_space_group_number(self, symprec=1e-5):
return spglib.get_symmetry_dataset(self.spglib_cell, symprec)["number"]
[docs] def get_space_group_international(self, symprec=1e-5):
return spglib.get_symmetry_dataset(self.spglib_cell, symprec)["international"]
[docs] def get_wyckoff_positions(self, symprec=1e-5):
return spglib.get_symmetry_dataset(self.spglib_cell, symprec)["wyckoffs"]
[docs] def to_dict(self, symprec=1e-5):
return {'atomic_numbers':self.atomic_numbers,
'atoms':self.atoms.tolist(),
'density':self.density,
'fractional_coordinates':self.fractional_coordinates.tolist(),
'space_group_international':self.get_space_group_international(symprec),
'space_group_number':self.get_space_group_number(symprec),
'wyckoff_positions':self.get_wyckoff_positions(symprec),
'lattice':self.lattice.tolist(),
'masses':self.masses,
'natoms':self.natoms,
'nspecies':self.nspecies,
'species':self.species,
'volume':self.volume,
}