3
0
mirror of https://github.com/triqs/dft_tools synced 2024-06-29 08:24:54 +02:00

sumk_dft: split transform_to_solver_blocks from extract_G_loc

this is done in a backward-compatible manner
This commit is contained in:
Gernot J. Kraberger 2018-08-30 20:49:12 +02:00
parent d0f0c20865
commit ef979199af
2 changed files with 83 additions and 21 deletions

View File

@ -1,3 +1,28 @@
##########################################################################
#
# TRIQS: a Toolbox for Research in Interacting Quantum Systems
#
# Copyright (C) 2018 by G. J. Kraberger
# Copyright (C) 2018 by Simons Foundation
# Authors: G. J. Kraberger, O. Parcollet
#
# TRIQS is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# TRIQS. If not, see <http://www.gnu.org/licenses/>.
#
##########################################################################
import copy import copy
import numpy as np import numpy as np
from pytriqs.gf import GfImFreq, BlockGf from pytriqs.gf import GfImFreq, BlockGf
@ -417,6 +442,9 @@ class BlockStructure(object):
if float, set the threshold for the magnitude of an element if float, set the threshold for the magnitude of an element
about to be thrown away to trigger a warning about to be thrown away to trigger a warning
(default: 1.e-10) (default: 1.e-10)
G_out : BlockGf
the output Green's function (if not given, a new one is
created)
**kwargs : **kwargs :
options passed to the constructor for the new Gf options passed to the constructor for the new Gf
""" """

View File

@ -3,6 +3,7 @@
# #
# TRIQS: a Toolbox for Research in Interacting Quantum Systems # TRIQS: a Toolbox for Research in Interacting Quantum Systems
# #
# Copyright (C) 2018 by G. J. Kraberger
# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola # Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola
# #
# TRIQS is free software: you can redistribute it and/or modify it under the # TRIQS is free software: you can redistribute it and/or modify it under the
@ -631,29 +632,34 @@ class SumkDFT(object):
for bname, gf in SK_Sigma_imp[icrsh]: for bname, gf in SK_Sigma_imp[icrsh]:
gf << self.rotloc(icrsh, gf, direction='toGlobal') gf << self.rotloc(icrsh, gf, direction='toGlobal')
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):
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.
Parameters Parameters
---------- ----------
mu : real, optional mu : real, optional
Input chemical potential. If not provided the value of self.chemical_potential is used as mu. Input chemical potential. If not provided the value of self.chemical_potential is used as mu.
with_Sigma : boolean, optional with_Sigma : boolean, optional
If True then the local GF is calculated with the self-energy self.Sigma_imp. If True then the local GF is calculated with the self-energy self.Sigma_imp.
with_dc : boolean, optional with_dc : boolean, optional
If True then the double-counting correction is subtracted from the self-energy in calculating the GF. If True then the double-counting correction is subtracted from the self-energy in calculating the GF.
broadening : float, optional broadening : float, optional
Imaginary shift for the axis along which the real-axis GF is calculated. Imaginary shift for the axis along which the real-axis GF is calculated.
If not provided, broadening will be set to double of the distance between mesh points in 'mesh'. If not provided, broadening will be set to double of the distance between mesh points in 'mesh'.
Only relevant for real-frequency GF. Only relevant for real-frequency GF.
transform_to_solver_blocks : bool, optional
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``.
Returns Returns
------- -------
G_loc_inequiv : list of BlockGf (Green's function) objects G_loc : list of BlockGf (Green's function) objects
List of the local Green's functions for all inequivalent correlated shells, List of the local Green's functions for all (inequivalent) correlated shells,
rotated into the corresponding local frames. rotated into the corresponding local frames.
If ``transform_to_solver_blocks`` is True, it will be one per correlated shell, else one per
inequivalent correlated shell.
""" """
if mu is None: if mu is None:
@ -712,20 +718,48 @@ class SumkDFT(object):
G_loc[icrsh][bname] << self.rotloc( G_loc[icrsh][bname] << self.rotloc(
icrsh, gf, direction='toLocal') icrsh, gf, direction='toLocal')
if transform_to_solver_blocks:
return self.transform_to_solver_blocks(G_loc)
return G_loc
def transform_to_solver_blocks(self, G_loc, G_out=None):
""" transform G_loc from sumk to solver space
Parameters
----------
G_loc : list of BlockGf
a list of one BlockGf per correlated shell with a structure
according to ``gf_struct_sumk``, e.g. as returned by
:py:meth:`.extract_G_loc` with ``transform_to_solver_blocks=False``.
G_out : list of BlockGf
a list of one BlockGf per *inequivalent* correlated shell
with a structure according to ``gf_struct_solver``.
The output Green's function (if not given, a new one is
created)
Returns
-------
G_out
"""
if G_out is None:
G_out = [BlockGf(mesh=G_loc[0].mesh,
gf_struct=[(k, v) for k, v in self.gf_struct_solver[ish].iteritems()])
for ish in range(self.n_inequiv_shells)]
else:
for ish in range(self.n_inequiv_shells):
self.block_structure.check_gf(G_out, ish=ish)
# transform to CTQMC blocks: # transform to CTQMC blocks:
for ish in range(self.n_inequiv_shells): for ish in range(self.n_inequiv_shells):
for block, inner in self.gf_struct_solver[ish].iteritems(): self.block_structure.convert_gf(
for ind1 in inner: G=G_loc[self.inequiv_to_corr[ish]],
for ind2 in inner: G_struct='sumk',
block_sumk, ind1_sumk = self.solver_to_sumk[ ish=ish,
ish][(block, ind1)] G_out=G_out[ish])
block_sumk, ind2_sumk = self.solver_to_sumk[
ish][(block, ind2)]
G_loc_inequiv[ish][block][ind1, ind2] << G_loc[
self.inequiv_to_corr[ish]][block_sumk][ind1_sumk, ind2_sumk]
# return only the inequivalent shells: # return only the inequivalent shells:
return G_loc_inequiv 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"""