# 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]