3
0
mirror of https://github.com/triqs/dft_tools synced 2024-12-27 14:53:39 +01:00

added Hloc check in analyse_block_structure

This commit is contained in:
Gernot J. Kraberger 2016-09-12 15:29:32 +02:00
parent 3430ba2231
commit d8483a0bb1

View File

@ -715,16 +715,16 @@ class SumkDFT:
# return only the inequivalent shells: # return only the inequivalent shells:
return G_loc_inequiv return G_loc_inequiv
def analyse_block_structure(self, threshold=0.00001, include_shells=None, dm=None): def analyse_block_structure(self, threshold=0.00001, include_shells=None, dm=None, hloc=None):
r""" r"""
Determines the block structure of local Green's functions by analysing the structure of Determines the block structure of local Green's functions by analysing the structure of
the corresponding density matrices. The resulting block structures for correlated shells the corresponding density matrices and the local Hamiltonian. The resulting block structures
are stored in self.gf_struct_solver list. for correlated shells are stored in self.gf_struct_solver list.
Parameters Parameters
---------- ----------
threshold : real, optional threshold : real, optional
If the difference between density matrix elements is below threshold, If the difference between density matrix / hloc elements is below threshold,
they are considered to be equal. they are considered to be equal.
include_shells : list of integers, optional include_shells : list of integers, optional
List of correlated shells to be analysed. List of correlated shells to be analysed.
@ -733,6 +733,10 @@ class SumkDFT:
List of density matrices from which block stuctures are to be analysed. List of density matrices from which block stuctures are to be analysed.
Each density matrix is a dict {block names: 2d numpy arrays}. Each density matrix is a dict {block names: 2d numpy arrays}.
If not provided, dm will be calculated from the DFT Hamiltonian by a simple-point BZ integration. If not provided, dm will be calculated from the DFT Hamiltonian by a simple-point BZ integration.
hloc : list of dict, optional
List of local Hamiltonian matrices from which block stuctures are to be analysed
Each Hamiltonian is a dict {block names: 2d numpy arrays}.
If not provided, it will be calculated using eff_atomic_levels.
""" """
self.gf_struct_solver = [{} for ish in range(self.n_inequiv_shells)] self.gf_struct_solver = [{} for ish in range(self.n_inequiv_shells)]
@ -745,6 +749,10 @@ class SumkDFT:
dm = self.density_matrix(method='using_point_integration') dm = self.density_matrix(method='using_point_integration')
dens_mat = [dm[self.inequiv_to_corr[ish]] dens_mat = [dm[self.inequiv_to_corr[ish]]
for ish in range(self.n_inequiv_shells)] for ish in range(self.n_inequiv_shells)]
if hloc is None:
hloc = self.eff_atomic_levels()
H_loc = [hloc[self.inequiv_to_corr[ish]]
for ish in range(self.n_inequiv_shells)]
if include_shells is None: if include_shells is None:
include_shells = range(self.n_inequiv_shells) include_shells = range(self.n_inequiv_shells)
@ -754,13 +762,14 @@ class SumkDFT:
n_orb = self.corr_shells[self.inequiv_to_corr[ish]]['dim'] n_orb = self.corr_shells[self.inequiv_to_corr[ish]]['dim']
# gives an index list of entries larger that threshold # gives an index list of entries larger that threshold
dmbool = (abs(dens_mat[ish][sp]) > threshold) dmbool = (abs(dens_mat[ish][sp]) > threshold)
hlocbool = (abs(H_loc[ish][sp]) > threshold)
# Determine off-diagonal entries in upper triangular part of # Determine off-diagonal entries in upper triangular part of
# density matrix # density matrix
offdiag = Set([]) offdiag = Set([])
for i in range(n_orb): for i in range(n_orb):
for j in range(i + 1, n_orb): for j in range(i + 1, n_orb):
if dmbool[i, j]: if dmbool[i, j] or hlocbool[i, j]:
offdiag.add((i, j)) offdiag.add((i, j))
# Determine the number of non-hybridising blocks in the gf # Determine the number of non-hybridising blocks in the gf