Source code for pynao.scf_dos

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 scf_dos(scf, zomegas, nkpoints=1): """ Compute the Density of States using the eigenvalues """ return eigenvalues2dos(scf.mo_energy, zomegas, 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 """ 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