mirror of
https://github.com/triqs/dft_tools
synced 2024-12-23 12:55:17 +01:00
plovasp: vasp_converter can now deal with H(k) and uncorrelated shells. Removed correleated shells and irrep from H(k) header.
This commit is contained in:
parent
3666518bdf
commit
e9fd33dffb
@ -409,16 +409,14 @@ def hk_output(conf_pars, el_struct, pgroups):
|
|||||||
Filename is defined by <basename> that is passed from config-file.
|
Filename is defined by <basename> that is passed from config-file.
|
||||||
|
|
||||||
The Hk for each groups is stored in a '<basename>.hk<Ng>' file. The format is
|
The Hk for each groups is stored in a '<basename>.hk<Ng>' file. The format is
|
||||||
as defined in the Hk dft_tools format
|
similar as defined in the Hk dft_tools format, but does not store info
|
||||||
|
about correlated shells and irreps
|
||||||
|
|
||||||
nk # number of k-points
|
nk # number of k-points
|
||||||
n_el # electron density
|
n_el # electron density
|
||||||
n_sh # number of total atomic shells
|
n_sh # number of total atomic shells
|
||||||
at sort l dim # atom, sort, l, dim
|
at sort l dim # atom, sort, l, dim
|
||||||
at sort l dim # atom, sort, l, dim
|
at sort l dim # atom, sort, l, dim
|
||||||
n_cr_sh # number of correlated shells
|
|
||||||
at sort l dim SO irep # atom, sort, l, dim, SO, irep
|
|
||||||
n_irrep dim_irrep # number of ireps, dim of irep
|
|
||||||
|
|
||||||
After these header lines, the file has to contain the Hamiltonian matrix
|
After these header lines, the file has to contain the Hamiltonian matrix
|
||||||
in orbital space. The standard convention is that you give for each k-point
|
in orbital space. The standard convention is that you give for each k-point
|
||||||
@ -433,7 +431,6 @@ def hk_output(conf_pars, el_struct, pgroups):
|
|||||||
hk_fname = conf_pars.general['basename'] + '.hk%i'%(ig + 1)
|
hk_fname = conf_pars.general['basename'] + '.hk%i'%(ig + 1)
|
||||||
print " Storing HK-group file '%s'..."%(hk_fname)
|
print " Storing HK-group file '%s'..."%(hk_fname)
|
||||||
|
|
||||||
head_corr_shells = []
|
|
||||||
head_shells = []
|
head_shells = []
|
||||||
for ish in pgroup.ishells:
|
for ish in pgroup.ishells:
|
||||||
|
|
||||||
@ -452,8 +449,6 @@ def hk_output(conf_pars, el_struct, pgroups):
|
|||||||
|
|
||||||
|
|
||||||
head_shells.append(sh_dict)
|
head_shells.append(sh_dict)
|
||||||
if shell.corr:
|
|
||||||
head_corr_shells.append(sh_dict)
|
|
||||||
|
|
||||||
|
|
||||||
with open(hk_fname, 'wt') as f:
|
with open(hk_fname, 'wt') as f:
|
||||||
@ -464,10 +459,7 @@ def hk_output(conf_pars, el_struct, pgroups):
|
|||||||
f.write('%i # number of shells\n'%len(head_shells))
|
f.write('%i # number of shells\n'%len(head_shells))
|
||||||
for head in head_shells:
|
for head in head_shells:
|
||||||
f.write('%i %i %i %i # atom sort l dim\n'%(head['ion_list'][0],head['ion_sort'][0],head['lorb'],head['ndim']))
|
f.write('%i %i %i %i # atom sort l dim\n'%(head['ion_list'][0],head['ion_sort'][0],head['lorb'],head['ndim']))
|
||||||
f.write('%i # number of correlated shells\n'%len(head_corr_shells))
|
|
||||||
for head in head_corr_shells:
|
|
||||||
f.write('%i %i %i %i 0 0 # atom sort l dim SO irrep\n'%(head['ion_list'][0],head['ion_sort'][0],head['lorb'],head['ndim']))
|
|
||||||
f.write('1 5 # number of ireps, dim of irep\n')
|
|
||||||
norbs = pgroup.hk.shape[2]
|
norbs = pgroup.hk.shape[2]
|
||||||
for isp in xrange(ns_band):
|
for isp in xrange(ns_band):
|
||||||
for ik in xrange(nk):
|
for ik in xrange(nk):
|
||||||
|
@ -43,7 +43,8 @@ class VaspConverter(ConverterTools):
|
|||||||
dft_subgrp = 'dft_input', symmcorr_subgrp = 'dft_symmcorr_input',
|
dft_subgrp = 'dft_input', symmcorr_subgrp = 'dft_symmcorr_input',
|
||||||
parproj_subgrp='dft_parproj_input', symmpar_subgrp='dft_symmpar_input',
|
parproj_subgrp='dft_parproj_input', symmpar_subgrp='dft_symmpar_input',
|
||||||
bands_subgrp = 'dft_bands_input', misc_subgrp = 'dft_misc_input',
|
bands_subgrp = 'dft_bands_input', misc_subgrp = 'dft_misc_input',
|
||||||
transp_subgrp = 'dft_transp_input', repacking = False):
|
transp_subgrp = 'dft_transp_input', repacking = False,
|
||||||
|
proj_or_hk='proj'):
|
||||||
"""
|
"""
|
||||||
Init of the class. Variable filename gives the root of all filenames, e.g. case.ctqmcout, case.h5, and so on.
|
Init of the class. Variable filename gives the root of all filenames, e.g. case.ctqmcout, case.h5, and so on.
|
||||||
"""
|
"""
|
||||||
@ -61,6 +62,8 @@ class VaspConverter(ConverterTools):
|
|||||||
self.bands_subgrp = bands_subgrp
|
self.bands_subgrp = bands_subgrp
|
||||||
self.misc_subgrp = misc_subgrp
|
self.misc_subgrp = misc_subgrp
|
||||||
self.transp_subgrp = transp_subgrp
|
self.transp_subgrp = transp_subgrp
|
||||||
|
assert (proj_or_hk == 'proj') or (proj_or_hk == 'hk'), "proj_or_hk has to be 'proj' of 'hk'"
|
||||||
|
self.proj_or_hk = proj_or_hk
|
||||||
|
|
||||||
# Checks if h5 file is there and repacks it if wanted:
|
# Checks if h5 file is there and repacks it if wanted:
|
||||||
if (os.path.exists(self.hdf_file) and repacking):
|
if (os.path.exists(self.hdf_file) and repacking):
|
||||||
@ -148,6 +151,7 @@ class VaspConverter(ConverterTools):
|
|||||||
jheader, rf = self.read_header_and_data(gr_file)
|
jheader, rf = self.read_header_and_data(gr_file)
|
||||||
gr_head = json.loads(jheader)
|
gr_head = json.loads(jheader)
|
||||||
|
|
||||||
|
|
||||||
e_win = gr_head['ewindow']
|
e_win = gr_head['ewindow']
|
||||||
nb_max = gr_head['nb_max']
|
nb_max = gr_head['nb_max']
|
||||||
p_shells = gr_head['shells']
|
p_shells = gr_head['shells']
|
||||||
@ -192,7 +196,7 @@ class VaspConverter(ConverterTools):
|
|||||||
n_corr_shells = len(corr_shells)
|
n_corr_shells = len(corr_shells)
|
||||||
#n_shells = n_corr_shells # No non-correlated shells at the moment
|
#n_shells = n_corr_shells # No non-correlated shells at the moment
|
||||||
#shells = corr_shells
|
#shells = corr_shells
|
||||||
|
n_orbs = sum([sh['dim'] for sh in shells])
|
||||||
# FIXME: atomic sorts in Wien2K are not the same as in VASP.
|
# FIXME: atomic sorts in Wien2K are not the same as in VASP.
|
||||||
# A symmetry analysis from OUTCAR or symmetry file should be used
|
# A symmetry analysis from OUTCAR or symmetry file should be used
|
||||||
# to define equivalence classes of sites.
|
# to define equivalence classes of sites.
|
||||||
@ -231,6 +235,7 @@ class VaspConverter(ConverterTools):
|
|||||||
band_window = [numpy.zeros((n_k, 2), dtype=int) for isp in xrange(n_spin_blocs)]
|
band_window = [numpy.zeros((n_k, 2), dtype=int) for isp in xrange(n_spin_blocs)]
|
||||||
n_orbitals = numpy.zeros([n_k, n_spin_blocs], numpy.int)
|
n_orbitals = numpy.zeros([n_k, n_spin_blocs], numpy.int)
|
||||||
|
|
||||||
|
|
||||||
for isp in xrange(n_spin_blocs):
|
for isp in xrange(n_spin_blocs):
|
||||||
for ik in xrange(n_k):
|
for ik in xrange(n_k):
|
||||||
ib1, ib2 = int(rf.next()), int(rf.next())
|
ib1, ib2 = int(rf.next()), int(rf.next())
|
||||||
@ -241,6 +246,27 @@ class VaspConverter(ConverterTools):
|
|||||||
hopping[ik, isp, ib, ib] = rf.next()
|
hopping[ik, isp, ib, ib] = rf.next()
|
||||||
f_weights[ik, isp, ib] = rf.next()
|
f_weights[ik, isp, ib] = rf.next()
|
||||||
|
|
||||||
|
if self.proj_or_hk == 'hk':
|
||||||
|
hopping = numpy.zeros([n_k, n_spin_blocs, n_orbs, n_orbs], numpy.complex_)
|
||||||
|
# skip header lines
|
||||||
|
hk_file = self.basename + '.hk%i'%(ig + 1)
|
||||||
|
f_hk = open(hk_file, 'rt')
|
||||||
|
# skip the header (1 line for n_kpoints, n_electrons, n_shells)
|
||||||
|
# and one line per shell
|
||||||
|
count = 0
|
||||||
|
while count < 3 + n_shells:
|
||||||
|
f_hk.readline()
|
||||||
|
count += 1
|
||||||
|
rf_hk = self.read_data(f_hk)
|
||||||
|
for isp in xrange(n_spin_blocs):
|
||||||
|
for ik in xrange(n_k):
|
||||||
|
for ib in xrange(n_orbs):
|
||||||
|
for jb in xrange(n_orbs):
|
||||||
|
hopping[ik, isp, ib, jb] = rf_hk.next()
|
||||||
|
for ib in xrange(n_orbs):
|
||||||
|
for jb in xrange(n_orbs):
|
||||||
|
hopping[ik, isp, ib, jb] += 1j*rf_hk.next()
|
||||||
|
|
||||||
# Projectors
|
# Projectors
|
||||||
# print n_orbitals
|
# print n_orbitals
|
||||||
# print [crsh['dim'] for crsh in corr_shells]
|
# print [crsh['dim'] for crsh in corr_shells]
|
||||||
@ -273,9 +299,9 @@ class VaspConverter(ConverterTools):
|
|||||||
|
|
||||||
# now save only projectors with flag 'corr' to proj_mat
|
# now save only projectors with flag 'corr' to proj_mat
|
||||||
proj_mat = numpy.zeros([n_k, n_spin_blocs, n_corr_shells, sum([crsh['dim'] for crsh in corr_shells]), numpy.max(n_orbitals)], numpy.complex_)
|
proj_mat = numpy.zeros([n_k, n_spin_blocs, n_corr_shells, sum([crsh['dim'] for crsh in corr_shells]), numpy.max(n_orbitals)], numpy.complex_)
|
||||||
|
if self.proj_or_hk == 'proj':
|
||||||
addIndex = 0
|
addIndex = 0
|
||||||
for ish, corr_shell in enumerate(corr_shells):
|
for ish, corr_shell in enumerate(corr_shells):
|
||||||
if True:
|
|
||||||
for isp in xrange(n_spin_blocs):
|
for isp in xrange(n_spin_blocs):
|
||||||
for ik in xrange(n_k):
|
for ik in xrange(n_k):
|
||||||
for ion in xrange(len(corr_shell['ion_list'])):
|
for ion in xrange(len(corr_shell['ion_list'])):
|
||||||
@ -285,6 +311,18 @@ class VaspConverter(ConverterTools):
|
|||||||
for ib in xrange(n_orbitals[ik, isp]):
|
for ib in xrange(n_orbitals[ik, isp]):
|
||||||
proj_mat[ik,isp,icsh,iclm+addIndex,ib] = proj_mat_all[ik,isp,icsh,ilm,ib]
|
proj_mat[ik,isp,icsh,iclm+addIndex,ib] = proj_mat_all[ik,isp,icsh,ilm,ib]
|
||||||
addIndex += corr_shell['dim']
|
addIndex += corr_shell['dim']
|
||||||
|
elif self.proj_or_hk == 'hk':
|
||||||
|
addIndex = 0
|
||||||
|
for ish, corr_shell in enumerate(corr_shells):
|
||||||
|
for isp in xrange(n_spin_blocs):
|
||||||
|
for ik in xrange(n_k):
|
||||||
|
for ion in xrange(len(corr_shell['ion_list'])):
|
||||||
|
icsh = shion_to_shell[ish][ion]
|
||||||
|
|
||||||
|
for iclm,ilm in enumerate(xrange(crshorbs_to_globalorbs[ish][0],crshorbs_to_globalorbs[ish][1])):
|
||||||
|
proj_mat[ik,isp,icsh,iclm+addIndex,ilm] = 1.0
|
||||||
|
addIndex += corr_shell['dim']
|
||||||
|
|
||||||
things_to_set = ['n_shells','shells','n_corr_shells','corr_shells','n_spin_blocs','n_orbitals','n_k','SO','SP','energy_unit']
|
things_to_set = ['n_shells','shells','n_corr_shells','corr_shells','n_spin_blocs','n_orbitals','n_k','SO','SP','energy_unit']
|
||||||
for it in things_to_set:
|
for it in things_to_set:
|
||||||
# print "%s:"%(it), locals()[it]
|
# print "%s:"%(it), locals()[it]
|
||||||
@ -302,7 +340,9 @@ class VaspConverter(ConverterTools):
|
|||||||
# The subgroup containing the data. If it does not exist, it is created. If it exists, the data is overwritten!
|
# The subgroup containing the data. If it does not exist, it is created. If it exists, the data is overwritten!
|
||||||
things_to_save = ['energy_unit','n_k','k_dep_projection','SP','SO','charge_below','density_required',
|
things_to_save = ['energy_unit','n_k','k_dep_projection','SP','SO','charge_below','density_required',
|
||||||
'symm_op','n_shells','shells','n_corr_shells','corr_shells','use_rotations','rot_mat',
|
'symm_op','n_shells','shells','n_corr_shells','corr_shells','use_rotations','rot_mat',
|
||||||
'rot_mat_time_inv','n_reps','dim_reps','T','n_orbitals','proj_mat','proj_mat_all','bz_weights','hopping',
|
'rot_mat_time_inv','n_reps','dim_reps','T','n_orbitals','proj_mat',
|
||||||
|
# 'proj_mat_all',
|
||||||
|
'bz_weights','hopping',
|
||||||
'n_inequiv_shells', 'corr_to_inequiv', 'inequiv_to_corr']
|
'n_inequiv_shells', 'corr_to_inequiv', 'inequiv_to_corr']
|
||||||
for it in things_to_save: ar[self.dft_subgrp][it] = locals()[it]
|
for it in things_to_save: ar[self.dft_subgrp][it] = locals()[it]
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user