Source code for wannierberri.data_K.data_K_k

import numpy as np
from .data_K import Data_K


[docs] class Data_K_k(Data_K): """ The Data_K class for systems defined by k-dependent Hamiltonians (kp)""" @property def HH_K(self): return np.array([self.system.Ham(k) for k in self.kpoints_all])
[docs] def Xbar(self, name, der=0): key = (name, der) if name != 'Ham': raise ValueError(f'quantity {name} is not defined for a kp model') if key not in self._bar_quantities: if der == 0: raise RuntimeError("Why is `Ham` called through Xbar, are you sure?") X = self.HH_K else: if der == 1: fun = self.system.derHam elif der == 2: fun = self.system.der2Ham elif der == 3: fun = self.system.der3Ham X = np.array([fun(k) for k in self.kpoints_all]) self._bar_quantities[key] = self._rotate(X)[self.select_K] return self._bar_quantities[key]
[docs] def E_K_corners_tetra(self): vertices = self.Kpoint.vertices_fullBZ _Ecorners = np.zeros((self.nk, 4, self.num_wann), dtype=float) for iv, v in enumerate(vertices): _HH_K = np.array([self.system.Ham(k + v) for k in self.kpoints_all]) _Ecorners[:, iv, :] = np.array(self.poolmap(np.linalg.eigvalsh, _HH_K)) self.select_bands(_Ecorners) Ecorners = np.zeros((self.nk_selected, 4, self.nb_selected), dtype=float) for iv, v in enumerate(vertices): Ecorners[:, iv, :] = _Ecorners[:, iv, :][self.select_K, :][:, self.select_B] Ecorners = self.phonon_freq_from_square(Ecorners) return Ecorners
[docs] def E_K_corners_parallel(self): dK = self.Kpoint.dK_fullBZ Ecorners = np.zeros((self.nk_selected, 2, 2, 2, self.nb_selected), dtype=float) for ix in 0, 1: for iy in 0, 1: for iz in 0, 1: v = (np.array([ix, iy, iz]) - 0.5) * dK _HH_K = np.array([self.system.Ham(k + v) for k in self.kpoints_all]) E = np.array(self.poolmap(np.linalg.eigvalsh, _HH_K)) Ecorners[:, ix, iy, iz, :] = E[self.select_K, :][:, self.select_B] Ecorners = self.phonon_freq_from_square(Ecorners) return Ecorners