3
0
mirror of https://github.com/triqs/dft_tools synced 2024-09-12 05:38:31 +02:00

Ignore imaginary part of the density when calculating mu

This commit is contained in:
Hermann Schnait 2019-06-24 10:03:43 +02:00
parent 810b315c92
commit f695ccac7a

View File

@ -52,11 +52,11 @@ class SumkDFT(object):
hdf_file : string hdf_file : string
Name of hdf5 containing the data. Name of hdf5 containing the data.
h_field : scalar, optional h_field : scalar, optional
The value of magnetic field to add to the DFT Hamiltonian. The value of magnetic field to add to the DFT Hamiltonian.
The contribution -h_field*sigma is added to diagonal elements of the Hamiltonian. The contribution -h_field*sigma is added to diagonal elements of the Hamiltonian.
It cannot be used with the spin-orbit coupling on; namely h_field is set to 0 if self.SO=True. It cannot be used with the spin-orbit coupling on; namely h_field is set to 0 if self.SO=True.
use_dft_blocks : boolean, optional use_dft_blocks : boolean, optional
If True, the local Green's function matrix for each spin is divided into smaller blocks If True, the local Green's function matrix for each spin is divided into smaller blocks
with the block structure determined from the DFT density matrix of the corresponding correlated shell. with the block structure determined from the DFT density matrix of the corresponding correlated shell.
Alternatively and additionally, the block structure can be analysed using :meth:`analyse_block_structure <dft.sumk_dft.SumkDFT.analyse_block_structure>` Alternatively and additionally, the block structure can be analysed using :meth:`analyse_block_structure <dft.sumk_dft.SumkDFT.analyse_block_structure>`
@ -64,7 +64,7 @@ class SumkDFT(object):
dft_data : string, optional dft_data : string, optional
Name of hdf5 subgroup in which DFT data for projector and lattice Green's function construction are stored. Name of hdf5 subgroup in which DFT data for projector and lattice Green's function construction are stored.
symmcorr_data : string, optional symmcorr_data : string, optional
Name of hdf5 subgroup in which DFT data on symmetries of correlated shells Name of hdf5 subgroup in which DFT data on symmetries of correlated shells
(symmetry operations, permutaion matrices etc.) are stored. (symmetry operations, permutaion matrices etc.) are stored.
parproj_data : string, optional parproj_data : string, optional
Name of hdf5 subgroup in which DFT data on non-normalized projectors for non-correlated Name of hdf5 subgroup in which DFT data on non-normalized projectors for non-correlated
@ -291,10 +291,10 @@ class SumkDFT(object):
bname : string bname : string
Block name of the target block of the lattice Green's function. Block name of the target block of the lattice Green's function.
gf_to_downfold : Gf gf_to_downfold : Gf
Block of the Green's function that is to be downfolded. Block of the Green's function that is to be downfolded.
gf_inp : Gf gf_inp : Gf
FIXME FIXME
shells : string, optional shells : string, optional
- if shells='corr': orthonormalized projectors for correlated shells are used for the downfolding. - if shells='corr': orthonormalized projectors for correlated shells are used for the downfolding.
@ -343,10 +343,10 @@ class SumkDFT(object):
bname : string bname : string
Block name of the target block of the lattice Green's function. Block name of the target block of the lattice Green's function.
gf_to_upfold : Gf gf_to_upfold : Gf
Block of the Green's function that is to be upfolded. Block of the Green's function that is to be upfolded.
gf_inp : Gf gf_inp : Gf
FIXME FIXME
shells : string, optional shells : string, optional
- if shells='corr': orthonormalized projectors for correlated shells are used for the upfolding. - if shells='corr': orthonormalized projectors for correlated shells are used for the upfolding.
@ -391,10 +391,10 @@ class SumkDFT(object):
- if shells='corr': ish labels all correlated shells (equivalent or not) - if shells='corr': ish labels all correlated shells (equivalent or not)
- if shells='all': ish labels only representative (inequivalent) non-correlated shells - if shells='all': ish labels only representative (inequivalent) non-correlated shells
gf_to_rotate : Gf gf_to_rotate : Gf
Block of the Green's function that is to be rotated. Block of the Green's function that is to be rotated.
direction : string direction : string
The direction of rotation can be either The direction of rotation can be either
- 'toLocal' : global -> local transformation, - 'toLocal' : global -> local transformation,
- 'toGlobal' : local -> global transformation. - 'toGlobal' : local -> global transformation.
@ -444,7 +444,7 @@ class SumkDFT(object):
def lattice_gf(self, ik, mu=None, iw_or_w="iw", beta=40, broadening=None, mesh=None, with_Sigma=True, with_dc=True): def lattice_gf(self, ik, mu=None, iw_or_w="iw", beta=40, broadening=None, mesh=None, with_Sigma=True, with_dc=True):
r""" r"""
Calculates the lattice Green function for a given k-point from the DFT Hamiltonian and the self energy. Calculates the lattice Green function for a given k-point from the DFT Hamiltonian and the self energy.
Parameters Parameters
---------- ----------
@ -467,7 +467,7 @@ class SumkDFT(object):
Data defining mesh on which the real-axis GF will be calculated, given in the form Data defining mesh on which the real-axis GF will be calculated, given in the form
(om_min,om_max,n_points), where om_min is the minimum omega, om_max is the maximum omega and n_points is the number of points. (om_min,om_max,n_points), where om_min is the minimum omega, om_max is the maximum omega and n_points is the number of points.
with_Sigma : boolean, optional with_Sigma : boolean, optional
If True the GF will be calculated with the self-energy stored in self.Sigmaimp_(w/iw), for real/Matsubara GF, respectively. If True the GF will be calculated with the self-energy stored in self.Sigmaimp_(w/iw), for real/Matsubara GF, respectively.
In this case the mesh is taken from the self.Sigma_imp object. In this case the mesh is taken from the self.Sigma_imp object.
If with_Sigma=True but self.Sigmaimp_(w/iw) is not present, with_Sigma is reset to False. If with_Sigma=True but self.Sigmaimp_(w/iw) is not present, with_Sigma is reset to False.
with_dc : boolean, optional with_dc : boolean, optional
@ -667,7 +667,7 @@ class SumkDFT(object):
return Sigma_out return Sigma_out
def extract_G_loc(self, mu=None, iw_or_w='iw', with_Sigma=True, with_dc=True, broadening=None, def extract_G_loc(self, mu=None, iw_or_w='iw', with_Sigma=True, with_dc=True, broadening=None,
transform_to_solver_blocks=True): transform_to_solver_blocks=True, show_warnings=True):
r""" r"""
Extracts the local downfolded Green function by the Brillouin-zone integration of the lattice Green's function. Extracts the local downfolded Green function by the Brillouin-zone integration of the lattice Green's function.
@ -686,6 +686,9 @@ class SumkDFT(object):
transform_to_solver_blocks : bool, optional transform_to_solver_blocks : bool, optional
If True (default), the returned G_loc will be transformed to the block structure ``gf_struct_solver``, If True (default), the returned G_loc will be transformed to the block structure ``gf_struct_solver``,
else it will be in ``gf_struct_sumk``. else it will be in ``gf_struct_sumk``.
show_warnings : bool, optional
Displays warning messages during transformation
(Only effective if transform_to_solver_blocks = True
Returns Returns
------- -------
@ -753,11 +756,11 @@ class SumkDFT(object):
icrsh, gf, direction='toLocal') icrsh, gf, direction='toLocal')
if transform_to_solver_blocks: if transform_to_solver_blocks:
return self.transform_to_solver_blocks(G_loc) return self.transform_to_solver_blocks(G_loc, show_warnings=show_warnings)
return G_loc return G_loc
def transform_to_solver_blocks(self, G_loc, G_out=None): def transform_to_solver_blocks(self, G_loc, G_out=None, show_warnings = True):
""" transform G_loc from sumk to solver space """ transform G_loc from sumk to solver space
Parameters Parameters
@ -794,15 +797,16 @@ class SumkDFT(object):
ish_from=self.inequiv_to_corr[ish], ish_from=self.inequiv_to_corr[ish],
ish_to=ish, ish_to=ish,
space_from='sumk', space_from='sumk',
G_out=G_out[ish]) G_out=G_out[ish],
show_warnings = show_warnings)
# return only the inequivalent shells: # return only the inequivalent shells:
return G_out return G_out
def analyse_block_structure(self, threshold=0.00001, include_shells=None, dm=None, hloc=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 and the local Hamiltonian. The resulting block structures the corresponding density matrices and the local Hamiltonian. The resulting block structures
for correlated shells are stored in the :class:`SumkDFT.block_structure <dft.block_structure.BlockStructure>` attribute. for correlated shells are stored in the :class:`SumkDFT.block_structure <dft.block_structure.BlockStructure>` attribute.
Parameters Parameters
@ -965,7 +969,7 @@ class SumkDFT(object):
else: else:
return w-w0 return w-w0
gf = [BlockGf(name_block_generator = [(name, GfReFreq( gf = [BlockGf(name_block_generator = [(name, GfReFreq(
window=(-numpy.pi*(len(block.mesh)-1) / (len(block.mesh)*get_delta_from_mesh(block.mesh)), window=(-numpy.pi*(len(block.mesh)-1) / (len(block.mesh)*get_delta_from_mesh(block.mesh)),
numpy.pi*(len(block.mesh)-1) / (len(block.mesh)*get_delta_from_mesh(block.mesh))), numpy.pi*(len(block.mesh)-1) / (len(block.mesh)*get_delta_from_mesh(block.mesh))),
n_points=len(block.mesh), indices=block.indices)) for name, block in g_sh], make_copies=False) n_points=len(block.mesh), indices=block.indices)) for name, block in g_sh], make_copies=False)
for g_sh in G] for g_sh in G]
@ -1344,7 +1348,7 @@ class SumkDFT(object):
- if 'using_point_integration': Only works for diagonal hopping matrix (true in wien2k). - if 'using_point_integration': Only works for diagonal hopping matrix (true in wien2k).
beta : float, optional beta : float, optional
Inverse temperature. Inverse temperature.
Returns Returns
------- -------
@ -1752,7 +1756,7 @@ class SumkDFT(object):
def total_density(self, mu=None, iw_or_w="iw", with_Sigma=True, with_dc=True, broadening=None): def total_density(self, mu=None, iw_or_w="iw", with_Sigma=True, with_dc=True, broadening=None):
r""" r"""
Calculates the total charge within the energy window for a given chemical potential. Calculates the total charge within the energy window for a given chemical potential.
The chemical potential is either given by parameter `mu` or, if it is not specified, The chemical potential is either given by parameter `mu` or, if it is not specified,
taken from `self.chemical_potential`. taken from `self.chemical_potential`.
@ -1769,7 +1773,7 @@ class SumkDFT(object):
with with
.. math:: n(k) = Tr G_{\nu\nu'}(k, i\omega_{n}). .. math:: n(k) = Tr G_{\nu\nu'}(k, i\omega_{n}).
The calculation is done in the global coordinate system, if distinction is made between local/global. The calculation is done in the global coordinate system, if distinction is made between local/global.
@ -1808,8 +1812,10 @@ class SumkDFT(object):
# collect data from mpi: # collect data from mpi:
dens = mpi.all_reduce(mpi.world, dens, lambda x, y: x + y) dens = mpi.all_reduce(mpi.world, dens, lambda x, y: x + y)
mpi.barrier() mpi.barrier()
import numpy as np
return dens if np.abs(np.imag(dens)) > 1e-20:
mpi.report("Warning: Imaginary part in density will be ignored ({})".format(str(np.abs(np.imag(dens)))))
return np.real(dens)
def set_mu(self, mu): def set_mu(self, mu):
r""" r"""
@ -2060,7 +2066,7 @@ class SumkDFT(object):
return dc return dc
def check_projectors(self): def check_projectors(self):
"""Calculated the density matrix from projectors (DM = P Pdagger) to check that it is correct and """Calculated the density matrix from projectors (DM = P Pdagger) to check that it is correct and
specifically that it matches DFT.""" specifically that it matches DFT."""
dens_mat = [numpy.zeros([self.corr_shells[icrsh]['dim'], self.corr_shells[icrsh]['dim']], numpy.complex_) dens_mat = [numpy.zeros([self.corr_shells[icrsh]['dim'], self.corr_shells[icrsh]['dim']], numpy.complex_)
for icrsh in range(self.n_corr_shells)] for icrsh in range(self.n_corr_shells)]