3
0
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:
Oleg Peil 2015-03-02 21:29:54 +01:00 committed by Michel Ferrero
parent 6ab916d2d0
commit b78a06d36f
2 changed files with 58 additions and 6 deletions

View File

@ -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)

View File

@ -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")