def get_orbital_ldos(self, a, spin=0, angular='spdf', npts=201, width=None): """The Local Density of States, using atomic orbital basis functions. Project wave functions onto an atom orbital at atom ``a``, and use this as weight when summing the eigenvalues. The atomic orbital has angular momentum ``angular``, which can be 's', 'p', 'd', 'f', or any combination (e.g. 'sdf'). An integer value for ``angular`` can also be used to specify a specific projector function to project onto. """ if width is None: width = self.get_electronic_temperature() if width == 0.0: width = 0.1 from gpaw.utilities.dos import raw_orbital_LDOS, fold energies, weights = raw_orbital_LDOS(self, a, spin, angular) return fold(energies * Hartree, weights, npts, width)
def get_lcao_dos(self, atom_indices=None, basis_indices=None, npts=201, width=None): """Get density of states projected onto orbitals in LCAO mode. basis_indices is a list of indices of basis functions on which to project. To specify all basis functions on a set of atoms, you can supply atom_indices instead. Both cannot be given simultaneously.""" both_none = atom_indices is None and basis_indices is None neither_none = atom_indices is not None and basis_indices is not None if both_none or neither_none: raise ValueError('Please give either atom_indices or ' 'basis_indices but not both') if width is None: width = 0.1 if self.wfs.S_qMM is None: from gpaw.utilities.dos import RestartLCAODOS lcaodos = RestartLCAODOS(self) else: from gpaw.utilities.dos import LCAODOS lcaodos = LCAODOS(self) if atom_indices is not None: basis_indices = lcaodos.get_atom_indices(atom_indices) eps_n, w_n = lcaodos.get_subspace_pdos(basis_indices) from gpaw.utilities.dos import fold return fold(eps_n * Ha, w_n, npts, width)
def get_dos(self, spin=0, npts=201, width=None): """The total DOS. Fold eigenvalues with Gaussians, and put on an energy grid. returns an (energies, dos) tuple, where energies are relative to the vacuum level for non-periodic systems, and the average potential for periodic systems. """ if width is None: width = self.get_electronic_temperature() if width == 0: width = 0.1 w_k = self.wfs.weight_k Nb = self.wfs.nbands energies = np.empty(len(w_k) * Nb) weights = np.empty(len(w_k) * Nb) x = 0 for k, w in enumerate(w_k): energies[x:x + Nb] = self.get_eigenvalues(k, spin) weights[x:x + Nb] = w x += Nb from gpaw.utilities.dos import fold return fold(energies, weights, npts, width)
def get_orbital_ldos(self, a, spin=0, angular='spdf', npts=201, width=None, nbands=None, spinorbit=False): """The Local Density of States, using atomic orbital basis functions. Project wave functions onto an atom orbital at atom ``a``, and use this as weight when summing the eigenvalues. The atomic orbital has angular momentum ``angular``, which can be 's', 'p', 'd', 'f', or any combination (e.g. 'sdf'). An integer value for ``angular`` can also be used to specify a specific projector function to project onto. Setting nbands limits the number of bands included. This speeds up the calculation if one has many bands in the calculator but is only interested in the DOS at low energies. """ from gpaw.utilities.dos import (raw_orbital_LDOS, raw_spinorbit_orbital_LDOS, fold) if width is None: width = 0.1 if not spinorbit: energies, weights = raw_orbital_LDOS(self, a, spin, angular, nbands) else: energies, weights = raw_spinorbit_orbital_LDOS( self, a, spin, angular) return fold(energies * Ha, weights, npts, width)
def get_wigner_seitz_ldos(self, a, spin=0, npts=201, width=None): """The Local Density of States, using a Wigner-Seitz basis function. Project wave functions onto a Wigner-Seitz box at atom ``a``, and use this as weight when summing the eigenvalues.""" if width is None: width = 0.1 from gpaw.utilities.dos import raw_wignerseitz_LDOS, fold energies, weights = raw_wignerseitz_LDOS(self, a, spin) return fold(energies * Ha, weights, npts, width)
def get_wigner_seitz_ldos(self, a, spin=0, npts=201, width=None): """The Local Density of States, using a Wigner-Seitz basis function. Project wave functions onto a Wigner-Seitz box at atom ``a``, and use this as weight when summing the eigenvalues.""" if width is None: width = self.get_electronic_temperature() if width == 0: width = 0.1 from gpaw.utilities.dos import raw_wignerseitz_LDOS, fold energies, weights = raw_wignerseitz_LDOS(self, a, spin) return fold(energies * Hartree, weights, npts, width)
def get_all_electron_ldos(self, mol, spin=0, npts=201, width=None, wf_k=None, P_aui=None, lc=None, raw=False): """The Projected Density of States, using all-electron wavefunctions. Projects onto a pseudo_wavefunctions (wf_k) corresponding to some band n and uses P_aui ([paw.nuclei[a].P_uni[:,n,:] for a in atoms]) to obtain the all-electron overlaps. Instead of projecting onto a wavefunction, a molecular orbital can be specified by a linear combination of weights (lc) """ from gpaw.utilities.dos import all_electron_LDOS, fold if raw: return all_electron_LDOS(self, mol, spin, lc=lc, wf_k=wf_k, P_aui=P_aui) if width is None: width = 0.1 energies, weights = all_electron_LDOS(self, mol, spin, lc=lc, wf_k=wf_k, P_aui=P_aui) return fold(energies * Ha, weights, npts, width)
def get_all_electron_ldos(self, mol, spin=0, npts=201, width=None, wf_k=None, P_aui=None, lc=None, raw=False): """The Projected Density of States, using all-electron wavefunctions. Projects onto a pseudo_wavefunctions (wf_k) corresponding to some band n and uses P_aui ([paw.nuclei[a].P_uni[:,n,:] for a in atoms]) to obtain the all-electron overlaps. Instead of projecting onto a wavefunctions a molecular orbital can be specified by a linear combination of weights (lc) """ from gpaw.utilities.dos import all_electron_LDOS, fold if raw: return all_electron_LDOS(self, mol, spin, lc=lc, wf_k=wf_k, P_aui=P_aui) if width is None: width = self.get_electronic_temperature() if width == 0.0: width = 0.1 energies, weights = all_electron_LDOS(self, mol, spin, lc=lc, wf_k=wf_k, P_aui=P_aui) return fold(energies * Hartree, weights, npts, width)
import matplotlib.pyplot as plt import numpy as np from ase.io import read from ase.units import Hartree from gpaw import GPAW from gpaw.utilities.dos import RestartLCAODOS, fold name = 'HfS2' calc = GPAW(name + '.gpw', txt=None) atoms = read(name + '.gpw') ef = calc.get_fermi_level() dos = RestartLCAODOS(calc) energies, weights = dos.get_subspace_pdos(range(51)) e, w = fold(energies * Hartree, weights, 2000, 0.1) e, m_s_pdos = dos.get_subspace_pdos([0, 1]) e, m_s_pdos = fold(e * Hartree, m_s_pdos, 2000, 0.1) e, m_p_pdos = dos.get_subspace_pdos([2, 3, 4]) e, m_p_pdos = fold(e * Hartree, m_p_pdos, 2000, 0.1) e, m_d_pdos = dos.get_subspace_pdos([5, 6, 7, 8, 9]) e, m_d_pdos = fold(e * Hartree, m_d_pdos, 2000, 0.1) e, x_s_pdos = dos.get_subspace_pdos([25]) e, x_s_pdos = fold(e * Hartree, x_s_pdos, 2000, 0.1) e, x_p_pdos = dos.get_subspace_pdos([26, 27, 28]) e, x_p_pdos = fold(e * Hartree, x_p_pdos, 2000, 0.1) w_max = [] for i in range(len(e)):
from ase.units import Hartree from gpaw import GPAW from gpaw.utilities.dos import fold import pickle import matplotlib.pyplot as plt e_f = GPAW('top.gpw').get_fermi_level() e_n, P_n = pickle.load(open('top.pickle', 'rb')) for n in range(2, 7): e, ldos = fold(e_n[n] * Hartree, P_n[n], npts=2001, width=0.2) plt.plot(e - e_f, ldos, label='Band: ' + str(n)) plt.legend() plt.axis([-15, 10, None, None]) plt.xlabel('Energy [eV]') plt.ylabel('PDOS') plt.show()