mirror of
https://github.com/triqs/dft_tools
synced 2024-12-22 12:23:41 +01:00
Added output of PLO groups
Output of PLO groups into a text file is added to 'plo_output()'. The file format is provisional and can change in future versions. Also, an attribute 'nelect' providing the number of electrons in the selected energy window is added to ProjectorGroup.
This commit is contained in:
parent
6ab916d2d0
commit
b78a06d36f
@ -3,7 +3,7 @@ import sys
|
|||||||
import vaspio
|
import vaspio
|
||||||
from inpconf import ConfigParameters
|
from inpconf import ConfigParameters
|
||||||
from elstruct import ElectronicStructure
|
from elstruct import ElectronicStructure
|
||||||
from plotools import generate_ortho_plos
|
from plotools import generate_ortho_plos, plo_output
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
narg = len(sys.argv)
|
narg = len(sys.argv)
|
||||||
@ -24,4 +24,4 @@ if __name__ == '__main__':
|
|||||||
vasp_data = vaspio.VaspData(vasp_dir)
|
vasp_data = vaspio.VaspData(vasp_dir)
|
||||||
el_struct = ElectronicStructure(vasp_data)
|
el_struct = ElectronicStructure(vasp_data)
|
||||||
pshells, pgroups = generate_ortho_plos(pars, el_struct)
|
pshells, pgroups = generate_ortho_plos(pars, el_struct)
|
||||||
plo_output(pars, pshells, pgroups)
|
plo_output(pars, pshells, pgroups, el_struct)
|
||||||
|
@ -148,7 +148,7 @@ class ProjectorGroup:
|
|||||||
- eigvals (numpy.array) : array of KS eigenvalues
|
- eigvals (numpy.array) : array of KS eigenvalues
|
||||||
|
|
||||||
"""
|
"""
|
||||||
def __init__(self, gr_pars, shells, eigvals):
|
def __init__(self, gr_pars, shells, eigvals, ferw):
|
||||||
"""
|
"""
|
||||||
Constructor
|
Constructor
|
||||||
"""
|
"""
|
||||||
@ -166,11 +166,19 @@ class ProjectorGroup:
|
|||||||
self.nb_min = nb_min
|
self.nb_min = nb_min
|
||||||
self.nb_max = nb_max
|
self.nb_max = nb_max
|
||||||
|
|
||||||
|
# Determine the total number of electrons within the window
|
||||||
|
self.nelect = 0
|
||||||
|
nk, ns_band, _ = ib_win.shape
|
||||||
|
for isp in xrange(ns_band):
|
||||||
|
for ik in xrange(nk):
|
||||||
|
self.nelect += ferw[isp, ik, self.nb_min:self.nb_max+1].sum()
|
||||||
|
|
||||||
# Select projectors within the energy window
|
# Select projectors within the energy window
|
||||||
for ish in self.ishells:
|
for ish in self.ishells:
|
||||||
shell = self.shells[ish]
|
shell = self.shells[ish]
|
||||||
shell.select_projectors(ib_win, nb_min, nb_max)
|
shell.select_projectors(ib_win, nb_min, nb_max)
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# orthogonalize
|
# orthogonalize
|
||||||
@ -247,6 +255,7 @@ class ProjectorShell:
|
|||||||
def __init__(self, sh_pars, proj_raw):
|
def __init__(self, sh_pars, proj_raw):
|
||||||
self.lorb = sh_pars['lshell']
|
self.lorb = sh_pars['lshell']
|
||||||
self.ion_list = sh_pars['ion_list']
|
self.ion_list = sh_pars['ion_list']
|
||||||
|
self.user_index = sh_pars['user_index']
|
||||||
try:
|
try:
|
||||||
self.tmatrix = sh_pars['tmatrix']
|
self.tmatrix = sh_pars['tmatrix']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@ -254,6 +263,7 @@ class ProjectorShell:
|
|||||||
|
|
||||||
self.lm1 = self.lorb**2
|
self.lm1 = self.lorb**2
|
||||||
self.lm2 = (self.lorb+1)**2
|
self.lm2 = (self.lorb+1)**2
|
||||||
|
self.ndim = self.lm2 - self.lm1
|
||||||
|
|
||||||
# Pre-select a subset of projectors (this should be an array view => no memory is wasted)
|
# Pre-select a subset of projectors (this should be an array view => no memory is wasted)
|
||||||
# !!! This sucks but I have to change the order of 'ib' and 'ilm' indices here
|
# !!! This sucks but I have to change the order of 'ib' and 'ilm' indices here
|
||||||
@ -356,7 +366,7 @@ def generate_ortho_plos(conf_pars, el_struct):
|
|||||||
|
|
||||||
pgroups = []
|
pgroups = []
|
||||||
for gr_par in conf_pars.groups:
|
for gr_par in conf_pars.groups:
|
||||||
pgroup = ProjectorGroup(gr_par, pshells, eigvals)
|
pgroup = ProjectorGroup(gr_par, pshells, eigvals, el_struct.ferw)
|
||||||
pgroup.orthogonalize()
|
pgroup.orthogonalize()
|
||||||
pgroups.append(pgroup)
|
pgroups.append(pgroup)
|
||||||
|
|
||||||
@ -369,7 +379,7 @@ def generate_ortho_plos(conf_pars, el_struct):
|
|||||||
#
|
#
|
||||||
################################################################################
|
################################################################################
|
||||||
# TODO: k-points with weights should be stored once and for all
|
# TODO: k-points with weights should be stored once and for all
|
||||||
def plo_output(conf_pars, pshells, pgroups):
|
def plo_output(conf_pars, pshells, pgroups, el_struct):
|
||||||
"""
|
"""
|
||||||
Outputs PLO groups into text files.
|
Outputs PLO groups into text files.
|
||||||
|
|
||||||
@ -381,8 +391,9 @@ def plo_output(conf_pars, pshells, pgroups):
|
|||||||
|
|
||||||
# Energy window: emin, emax
|
# Energy window: emin, emax
|
||||||
ib_min, ib_max
|
ib_min, ib_max
|
||||||
|
nelect
|
||||||
# Eigenvalues
|
# Eigenvalues
|
||||||
ik1, kx, ky, kz, kweight
|
isp, ik1, kx, ky, kz, kweight
|
||||||
ib1, ib2
|
ib1, ib2
|
||||||
eig1
|
eig1
|
||||||
eig2
|
eig2
|
||||||
@ -406,4 +417,45 @@ def plo_output(conf_pars, pshells, pgroups):
|
|||||||
# TODO: add BASENAME option to config parameters.
|
# TODO: add BASENAME option to config parameters.
|
||||||
basename = 'vasp'
|
basename = 'vasp'
|
||||||
|
|
||||||
|
for ig, gr in enumerate(pgroups):
|
||||||
|
fname = basename + '.plog%i'%(ig+1)
|
||||||
|
with open(fname, 'wt') as f:
|
||||||
|
f.write("# Energy window: emin, emax\n")
|
||||||
|
f.write("%i %i\n"%(gr.emin, gr.emax))
|
||||||
|
f.write("# Number of electrons within the window\n")
|
||||||
|
f.write("%s\n"%(gr.nelect))
|
||||||
|
f.write("# Eigenvalues: is, ik, ib1, ib2 then list of values\n")
|
||||||
|
|
||||||
|
nk, ns_band, _ = gr.ib_win.shape
|
||||||
|
for isp in xrange(ns_band):
|
||||||
|
for ik in xrange(nk):
|
||||||
|
ib1 = gr.ib_win[ik, isp, 0]
|
||||||
|
ib2 = gr.ib_win[ik, isp, 1]
|
||||||
|
f.write("%i %i %i %i\n"%(isp+1, ik+1, ib1+1, ib2+1))
|
||||||
|
for ib in xrange(ib1, ib2+1):
|
||||||
|
f.write("%s\n"%(el_struct.eigvals[ik, ib, isp]))
|
||||||
|
|
||||||
|
f.write("\nProjected shells: nshells\n")
|
||||||
|
f.write("%i\n"%(len(gr.ishells)))
|
||||||
|
f.write("Shells: <shell indices>\n")
|
||||||
|
f.write(' '.join(map(lambda ish: "{0:d}".format(pshells[ish].user_index), gr.ishells)) + '\n')
|
||||||
|
for ish in gr.ishells:
|
||||||
|
shell = pshells[ish]
|
||||||
|
f.write("Orbital dimension: ndim\n")
|
||||||
|
f.write("%i\n"%(shell.ndim))
|
||||||
|
|
||||||
|
nion, ns, nk, ndim, _ = shell.proj_win.shape
|
||||||
|
f.write("# Blocks [isp, ion, ndim, nb], 'nb' fastest index\n")
|
||||||
|
for ik in xrange(nk):
|
||||||
|
for isp in xrange(ns):
|
||||||
|
# TODO: fix this for non-collinear case (ns != ns_band)
|
||||||
|
ib1 = gr.ib_win[ik, isp, 0] - gr.nb_min
|
||||||
|
ib2 = gr.ib_win[ik, isp, 1] - gr.nb_min
|
||||||
|
for ion in xrange(nion):
|
||||||
|
f.write("# ik = %i, is = %i, ion = %i\n"%(ik+1, isp+1, ion+1))
|
||||||
|
for iorb in xrange(ndim):
|
||||||
|
for ib in xrange(ib1, ib2+1):
|
||||||
|
plo = shell.proj_win[ion, isp, ik, iorb, ib]
|
||||||
|
f.write("%20.10f %20.10f\n"%(plo.real, plo.imag))
|
||||||
|
f.write("\n")
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user