def raw_wignerseitz_LDOS(paw, a, spin): """Return a list of eigenvalues, and their weight on the specified atom""" wfs = paw.wfs assert wfs.dtype == float gd = wfs.gd atom_index = wignerseitz(gd, paw.atoms) w_k = wfs.kd.weight_k nk = len(w_k) nb = wfs.bd.nbands energies = np.empty(nb * nk) weights = np.empty(nb * nk) x = 0 for k, w in enumerate(w_k): u = spin * nk + k energies[x:x + nb] = wfs.collect_eigenvalues(k=k, s=spin) for n, psit_G in enumerate(wfs.kpt_u[u].psit_nG): P_i = wfs.kpt_u[u].P_ani[a][n] P_p = pack(np.outer(P_i, P_i)) Delta_p = sqrt(4 * pi) * wfs.setups[a].Delta_pL[:, 0] weights[x + n] = w * ( gd.integrate(abs(np.where(atom_index == a, psit_G, 0.0))**2) + np.dot(Delta_p, P_p)) x += nb return energies, weights
def raw_wignerseitz_LDOS(paw, a, spin): """Return a list of eigenvalues, and their weight on the specified atom""" wfs = paw.wfs assert wfs.dtype == float gd = wfs.gd atom_index = wignerseitz(gd, paw.atoms) w_k = wfs.weight_k nk = len(w_k) nb = wfs.bd.nbands energies = np.empty(nb * nk) weights = np.empty(nb * nk) x = 0 for k, w in enumerate(w_k): u = spin * nk + k energies[x:x + nb] = wfs.collect_eigenvalues(k=k, s=spin) for n, psit_G in enumerate(wfs.kpt_u[u].psit_nG): P_i = wfs.kpt_u[u].P_ani[a][n] P_p = pack(np.outer(P_i, P_i)) Delta_p = sqrt(4 * pi) * wfs.setups[a].Delta_pL[:, 0] weights[x + n] = w * (gd.integrate(abs( np.where(atom_index == a, psit_G, 0.0))**2) + np.dot(Delta_p, P_p)) x += nb return energies, weights
def get_wigner_seitz_densities(self, spin): """Get the weight of the spin-density in Wigner-Seitz cells around each atom. The density assigned to each atom is relative to the neutral atom, i.e. the density sums to zero. """ from gpaw.analyse.wignerseitz import wignerseitz atom_index = wignerseitz(self.wfs.gd, self.atoms) nt_G = self.density.nt_sG[spin] weight_a = np.empty(len(self.atoms)) for a in range(len(self.atoms)): # XXX Optimize! No need to integrate in zero-region smooth = self.wfs.gd.integrate(np.where(atom_index==a, nt_G, 0.0)) correction = self.density.get_correction(a, spin) weight_a[a] = smooth + correction return weight_a
def get_wigner_seitz_densities(self, spin): """Get the weight of the spin-density in Wigner-Seitz cells around each atom. The density assigned to each atom is relative to the neutral atom, i.e. the density sums to zero. """ from gpaw.analyse.wignerseitz import wignerseitz atom_index = wignerseitz(self.wfs.gd, self.atoms) nt_G = self.density.nt_sG[spin] weight_a = np.empty(len(self.atoms)) for a in range(len(self.atoms)): # XXX Optimize! No need to integrate in zero-region smooth = self.wfs.gd.integrate(np.where(atom_index == a, nt_G, 0.0)) correction = self.density.get_correction(a, spin) weight_a[a] = smooth + correction return weight_a