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]