mirror of
https://github.com/triqs/dft_tools
synced 2024-08-29 23:33:43 +02:00
Consolidate downfold and downfold_pc
This commit is contained in:
parent
59837c68b2
commit
aaa97f3d26
@ -170,28 +170,38 @@ class SumkDFT:
|
|||||||
# CORE FUNCTIONS
|
# CORE FUNCTIONS
|
||||||
################
|
################
|
||||||
|
|
||||||
def downfold(self,ik,icrsh,bname,gf_to_downfold,gf_inp):
|
def downfold(self,ik,ish,bname,gf_to_downfold,gf_inp,shells='corr',ir=None):
|
||||||
"""Downfolding a block of the Greens function"""
|
"""Downfolding a block of the Greens function"""
|
||||||
|
|
||||||
gf_downfolded = gf_inp.copy()
|
gf_downfolded = gf_inp.copy()
|
||||||
isp = self.spin_names_to_ind[self.SO][bname] # get spin index for proj. matrices
|
isp = self.spin_names_to_ind[self.SO][bname] # get spin index for proj. matrices
|
||||||
dim = self.corr_shells[icrsh]['dim']
|
|
||||||
n_orb = self.n_orbitals[ik,isp]
|
n_orb = self.n_orbitals[ik,isp]
|
||||||
projmat = self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb]
|
if shells == 'corr':
|
||||||
|
dim = self.corr_shells[ish]['dim']
|
||||||
|
projmat = self.proj_mat[ik,isp,ish,0:dim,0:n_orb]
|
||||||
|
elif shells == 'all':
|
||||||
|
if ir is None: raise ValueError, "downfold: provide ir if treating all shells."
|
||||||
|
dim = self.shells[ish]['dim']
|
||||||
|
projmat = self.proj_mat_pc[ik,isp,ish,ir,0:dim,0:n_orb]
|
||||||
|
|
||||||
gf_downfolded.from_L_G_R(projmat,gf_to_downfold,projmat.conjugate().transpose())
|
gf_downfolded.from_L_G_R(projmat,gf_to_downfold,projmat.conjugate().transpose())
|
||||||
|
|
||||||
return gf_downfolded
|
return gf_downfolded
|
||||||
|
|
||||||
|
|
||||||
def upfold(self,ik,icrsh,bname,gf_to_upfold,gf_inp):
|
def upfold(self,ik,ish,bname,gf_to_upfold,gf_inp,shells='corr',ir=None):
|
||||||
"""Upfolding a block of the Greens function"""
|
"""Upfolding a block of the Greens function"""
|
||||||
|
|
||||||
gf_upfolded = gf_inp.copy()
|
gf_upfolded = gf_inp.copy()
|
||||||
isp = self.spin_names_to_ind[self.SO][bname] # get spin index for proj. matrices
|
isp = self.spin_names_to_ind[self.SO][bname] # get spin index for proj. matrices
|
||||||
dim = self.corr_shells[icrsh]['dim']
|
|
||||||
n_orb = self.n_orbitals[ik,isp]
|
n_orb = self.n_orbitals[ik,isp]
|
||||||
projmat = self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb]
|
if shells == 'corr':
|
||||||
|
dim = self.corr_shells[ish]['dim']
|
||||||
|
projmat = self.proj_mat[ik,isp,ish,0:dim,0:n_orb]
|
||||||
|
elif shells == 'all':
|
||||||
|
if ir is None: raise ValueError, "upfold: provide ir if treating all shells."
|
||||||
|
dim = self.shells[ish]['dim']
|
||||||
|
projmat = self.proj_mat_pc[ik,isp,ish,ir,0:dim,0:n_orb]
|
||||||
|
|
||||||
gf_upfolded.from_L_G_R(projmat.conjugate().transpose(),gf_to_upfold,projmat)
|
gf_upfolded.from_L_G_R(projmat.conjugate().transpose(),gf_to_upfold,projmat)
|
||||||
|
|
||||||
|
@ -40,20 +40,6 @@ class SumkDFTTools(SumkDFT):
|
|||||||
symmpar_data=symmpar_data, bands_data=bands_data, transp_data=transp_data)
|
symmpar_data=symmpar_data, bands_data=bands_data, transp_data=transp_data)
|
||||||
|
|
||||||
|
|
||||||
def downfold_pc(self,ik,ir,ish,bname,gf_to_downfold,gf_inp):
|
|
||||||
"""Downfolding a block of the Greens function"""
|
|
||||||
|
|
||||||
gf_downfolded = gf_inp.copy()
|
|
||||||
isp = self.spin_names_to_ind[self.SO][bname] # get spin index for proj. matrices
|
|
||||||
dim = self.shells[ish]['dim']
|
|
||||||
n_orb = self.n_orbitals[ik,isp]
|
|
||||||
L=self.proj_mat_pc[ik,isp,ish,ir,0:dim,0:n_orb]
|
|
||||||
R=self.proj_mat_pc[ik,isp,ish,ir,0:dim,0:n_orb].conjugate().transpose()
|
|
||||||
gf_downfolded.from_L_G_R(L,gf_to_downfold,R)
|
|
||||||
|
|
||||||
return gf_downfolded
|
|
||||||
|
|
||||||
|
|
||||||
def rotloc_all(self,ish,gf_to_rotate,direction):
|
def rotloc_all(self,ish,gf_to_rotate,direction):
|
||||||
"""Local <-> Global rotation of a GF block.
|
"""Local <-> Global rotation of a GF block.
|
||||||
direction: 'toLocal' / 'toGlobal' """
|
direction: 'toLocal' / 'toGlobal' """
|
||||||
@ -217,7 +203,7 @@ class SumkDFTTools(SumkDFT):
|
|||||||
for ish in range(self.n_shells):
|
for ish in range(self.n_shells):
|
||||||
tmp = Gproj[ish].copy()
|
tmp = Gproj[ish].copy()
|
||||||
for ir in range(self.n_parproj[ish]):
|
for ir in range(self.n_parproj[ish]):
|
||||||
for bname,gf in tmp: tmp[bname] << self.downfold_pc(ik,ir,ish,bname,G_latt_w[bname],gf)
|
for bname,gf in tmp: tmp[bname] << self.downfold(ik,ish,bname,G_latt_w[bname],gf,shells='all',ir=ir)
|
||||||
Gproj[ish] += tmp
|
Gproj[ish] += tmp
|
||||||
|
|
||||||
# collect data from mpi:
|
# collect data from mpi:
|
||||||
@ -352,7 +338,7 @@ class SumkDFTTools(SumkDFT):
|
|||||||
Gproj.zero()
|
Gproj.zero()
|
||||||
tmp = Gproj.copy()
|
tmp = Gproj.copy()
|
||||||
for ir in range(self.n_parproj[ishell]):
|
for ir in range(self.n_parproj[ishell]):
|
||||||
for bname,gf in tmp: tmp[bname] << self.downfold_pc(ik,ir,ishell,bname,G_latt_w[bname],gf)
|
for bname,gf in tmp: tmp[bname] << self.downfold(ik,ishell,bname,G_latt_w[bname],gf,shells='all',ir=ir)
|
||||||
Gproj += tmp
|
Gproj += tmp
|
||||||
|
|
||||||
# FIXME NEED TO READ IN ROTMAT_ALL FROM PARPROJ SUBGROUP, REPLACE ROTLOC WITH ROTLOC_ALL
|
# FIXME NEED TO READ IN ROTMAT_ALL FROM PARPROJ SUBGROUP, REPLACE ROTLOC WITH ROTLOC_ALL
|
||||||
@ -465,7 +451,7 @@ class SumkDFTTools(SumkDFT):
|
|||||||
for ish in range(self.n_shells):
|
for ish in range(self.n_shells):
|
||||||
tmp = Gproj[ish].copy()
|
tmp = Gproj[ish].copy()
|
||||||
for ir in range(self.n_parproj[ish]):
|
for ir in range(self.n_parproj[ish]):
|
||||||
for bname,gf in tmp: tmp[bname] << self.downfold_pc(ik,ir,ish,bname,G_latt_iw[bname],gf)
|
for bname,gf in tmp: tmp[bname] << self.downfold(ik,ish,bname,G_latt_iw[bname],gf,shells='all',ir=ir)
|
||||||
Gproj[ish] += tmp
|
Gproj[ish] += tmp
|
||||||
|
|
||||||
#collect data from mpi:
|
#collect data from mpi:
|
||||||
|
Loading…
Reference in New Issue
Block a user