from __future__ import print_function, division
import numpy as np
from numpy import zeros_like, zeros
[docs]def eigenvalues2dos(ksn2e, zomegas, nkpoints=1):
""" Compute the Density of States using the eigenvalues """
dos = zeros(len(zomegas))
for iw,zw in enumerate(zomegas): dos[iw] = (1.0/(zw - ksn2e)).sum().imag
return -dos/np.pi/nkpoints
[docs]def system_vars_dos(sv, zomegas, nkpoints=1):
""" Compute the Density of States using the eigenvalues """
return eigenvalues2dos(sv.wfsx.ksn2e, zomegas, nkpoints)
[docs]def system_vars_pdos(sv, zomegas, nkpoints=1):
""" Compute the Partial Density of States (resolved in angular momentum of the orbitals) using the eigenvalues and eigenvectors in wfsx """
from timeit import default_timer as timer
jmx = sv.ao_log.jmx
jksn2w = zeros([jmx+1]+list(sv.wfsx.ksn2e.shape))
over = sv.hsx.s4_csr.toarray()
orb2j = sv.get_orb2j()
for j in range(jmx+1):
mask = (orb2j==j)
for k,kvec in enumerate(sv.wfsx.k2xyz):
for s in range(sv.nspin):
for n in range(sv.norbs):
jksn2w[j,k,s,n] = np.dot( np.dot(mask*sv.wfsx.x[k,s,n,:,0], over), sv.wfsx.x[k,s,n,:,0])
pdos = zeros((jmx+1,len(zomegas)))
for j in range(jmx+1):
for iw,zw in enumerate(zomegas):
pdos[j,iw] = (jksn2w[j,:,:,:]/(zw - sv.wfsx.ksn2e[:,:,:])).sum().imag
return -pdos/np.pi/nkpoints
[docs]def system_vars_ados(sv, zomegas, ls_atom_groups, nkpoints=1):
""" Compute a Partial Density of States (resolved in atomic indices) using the eigenvalues and eigenvectors in wfsx """
from timeit import default_timer as timer
iksn2w = zeros([2]+list(sv.wfsx.ksn2e.shape))
over = sv.hsx.s4_csr.toarray()
orb2id_group = sv.get_orb2j()
for id_group,group in enumerate(ls_atom_groups):
mask = (orb2group==id_group)
for k,kvec in enumerate(sv.wfsx.k2xyz):
for s in range(sv.nspin):
for n in range(sv.norbs):
jksn2w[j,k,s,n] = np.dot( np.dot(mask*sv.wfsx.x[k,s,n,:,0], over), sv.wfsx.x[k,s,n,:,0])
pdos = zeros((jmx+1,len(zomegas)))
for j in range(jmx+1):
for iw,zw in enumerate(zomegas):
pdos[j,iw] = (jksn2w[j,:,:,:]/(zw - sv.wfsx.ksn2e[:,:,:])).sum().imag
return -pdos/np.pi/nkpoints