Source code for matador.orm.spectral.spectral

# coding: utf-8
# Distributed under the terms of the MIT License.

import numpy as np
from matador.utils.cell_utils import real2recip, frac2cart
from matador.orm.orm import DataContainer


[docs]class Spectral(DataContainer): """ Note: This class speaks of "k-points" as general reciprocal space points used to display the dispersion curves; these correspond to CASTEP's phonon_kpoints or spectral_kpoints, and not the k-points used to generate the underlying wavefunction or dynamical matrix. """ @property def eigs(self): """ Alias for the correct eigenvalue array. """ if 'Vibrational' in self.__class__.__name__: return self._data['eigs_q'] return self._data['eigs_s_k'] @property def lattice_cart(self): """ The Cartesian lattice vectors of the real space lattice. """ return self._data['lattice_cart'] @property def num_kpoints(self): """ Number of dispersion k-points sampled. """ return self._data['num_kpoints'] @property def num_qpoints(self): """ Alias for number of kpoints. """ return self.num_kpoints @property def projectors(self): """ Return list of projector labels in the format `(element, l-channel)`. """ return self._data.get('projectors') @property def num_modes(self): """ Number of eigenvalues per q/k-point. """ return self._data['num_modes'] @property def num_bands(self): """ Number of eigenvalues per q/k-point. """ if 'Vibrational' in self.__class__.__name__: return self._data['num_modes'] return self._data['num_bands'] @property def projector_weights(self): """ Return the array of projector weights per eigval, with shape (num_projectors, num_kpoints, num_bands). """ return self._data.get('projector_weights') @property def num_projectors(self): """ Return the number of projectors. """ if self.projectors is None: return 0 return len(self.projectors) @property def kpoint_branches(self): """ Return the k-point branches in the older format, which contained a list of lists of continous indices. """ if self._data.get('kpoint_branches') is None: self._data['kpoint_branches'] = self.find_full_kpt_branch() return self._data['kpoint_branches'] @property def kpoint_branch_start(self): """ Return the indices of the start of branches. """ if not self._data.get('kpoint_branch_start'): self.set_branches_and_spacing() return self._data['kpoint_branch_start'] @property def kpoint_path_spacing(self): """ An estimated kpoint spacing. """ if not self._data.get('kpoint_path_spacing'): self.set_branches_and_spacing() return self._data['kpoint_path_spacing'] @property def kpoint_path(self): """ The fractional sampling path in reciprocal space. """ return np.asarray(self._data['kpoint_path']) @property def kpoint_weights(self): if 'kpoint_weights' in self._data: return np.asarray(self._data['kpoint_weights']) return None @property def kpoint_path_cartesian(self): """ The reicprocal space sampling path in Cartesian coordinates. """ return np.asarray(frac2cart(real2recip(self.lattice_cart), self.kpoint_path)) @property def num_spins(self): """ Dummy number of spins. """ return 1 @property def spin_fermi_energy(self): """ Dummy Fermi energy per spin channel. """ return [0]