Source code for triqs_tprf.gw

################################################################################
#
# TPRF: Two-Particle Response Function (TPRF) Toolbox for TRIQS
#
# Copyright (C) 2019 by The Simons Foundation
# Author: H. U.R. Strand
#
# TPRF 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.
#
# TPRF 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
# TPRF. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################

import itertools
import numpy as np

# ----------------------------------------------------------------------

import pytriqs.utility.mpi as mpi

# ----------------------------------------------------------------------

from triqs_tprf.lattice import fourier_wk_to_wr
from triqs_tprf.lattice import fourier_wr_to_wk
from triqs_tprf.lattice import fourier_wr_to_tr
from triqs_tprf.lattice import fourier_tr_to_wr

from triqs_tprf.lattice import chi_wr_from_chi_tr
from triqs_tprf.lattice import chi_tr_from_chi_wr
from triqs_tprf.lattice import chi_wk_from_chi_wr
from triqs_tprf.lattice import chi_wr_from_chi_wk

from triqs_tprf.lattice import chi0_tr_from_grt_PH

from triqs_tprf.lattice import dynamical_screened_interaction_W_wk as cpp_dynamical_screened_interaction_W_wk
from triqs_tprf.lattice import \
    dynamical_screened_interaction_W_wk_from_generalized_susceptibility \
    as cpp_dynamical_screened_interaction_W_wk_from_generalized_susceptibility

from triqs_tprf.lattice import gw_sigma_wk_serial_fft as cpp_gw_sigma_wk_serial_fft
from triqs_tprf.lattice import gw_sigma_tr as cpp_gw_sigma_tr

# ----------------------------------------------------------------------
[docs]def bubble_PI_wk(g_wk): r""" Compute the particle-hole bubble from the single particle lattice Green's function .. math:: \Pi_{abcd}(i\omega_n, k) = - \mathcal{F}_{\tau, \mathbf{r} \rightarrow i\omega_n, \mathbf{k}} \left\{ G_{d\bar{a}}(\tau, \mathbf{r}) G_{b\bar{c}}(-\tau, -\mathbf{r}) \right\} Parameters ---------- g_wk : TRIQS Green's function (rank 2) on Matsubara and Brillouinzone meshes Single particle lattice Green's function. Returns ------- PI_wk : TRIQS Green's function (rank 4) on Matsubara and Brillouinzone meshes Particle hole bubble. """ nw = len(g_wk.mesh.components[0]) / 2 g_wr = fourier_wk_to_wr(g_wk) g_tr = fourier_wr_to_tr(g_wr) del g_wr PI_tr = chi0_tr_from_grt_PH(g_tr) del g_tr PI_wr = chi_wr_from_chi_tr(PI_tr, nw=nw) del PI_tr PI_wk = chi_wk_from_chi_wr(PI_wr) del PI_wr return PI_wk
# ---------------------------------------------------------------------- def dynamical_screened_interaction_W_wk(PI_wk, V_k): return cpp_dynamical_screened_interaction_W_wk(PI_wk, V_k) # ---------------------------------------------------------------------- def dynamical_screened_interaction_W_wk_from_generalized_susceptibility(chi_wk, V_k): return cpp_dynamical_screened_interaction_W_wk_from_generalized_susceptibility(chi_wk, V_k) # ----------------------------------------------------------------------
[docs]def gw_sigma_wk(Wr_wk, g_wk, fft_flag=False): r""" GW self energy :math:`\Sigma(i\omega_n, \mathbf{k})` calculator Fourier transforms the screened interaction and the single-particle Green's function to imagiary time and real space. .. math:: G_{ab}(\tau, \mathbf{r}) = \mathcal{F}^{-1} \left\{ G_{ab}(i\omega_n, \mathbf{k}) \right\} .. math:: W^{(r)}_{abcd}(\tau, \mathbf{r}) = \mathcal{F}^{-1} \left\{ W^{(r)}_{abcd}(i\omega_n, \mathbf{k}) \right\} computes the GW self-energy as the product .. math:: \Sigma_{ab}(\tau, \mathbf{r}) = \sum_{cd} W^{(r)}_{abcd}(\tau, \mathbf{r}) G_{cd}(\tau, \mathbf{r}) and transforms back to frequency and momentum .. math:: \Sigma_{ab}(i\omega_n, \mathbf{k}) = \mathcal{F} \left\{ \Sigma_{ab}(\tau, \mathbf{r}) \right\} Parameters ---------- V_k : TRIQS Green's function (rank 4) on a Brillouinzone mesh static bare interaction :math:`V_{abcd}(\mathbf{k})` Wr_wk : TRIQS Green's function (rank 4) on Matsubara and Brillouinzone meshes retarded screened interaction :math:`W^{(r)}_{abcd}(i\omega_n, \mathbf{k})` g_wk : TRIQS Green's function (rank 2) on Matsubara and Brillouinzone meshes single particle Green's function :math:`G_{ab}(i\omega_n, \mathbf{k})` Returns ------- sigma_wk : TRIQS Green's function (rank 2) on Matsubara and Brillouinzone meshes GW self-energy :math:`\Sigma_{ab}(i\omega_n, \mathbf{k})` """ if fft_flag: nw = len(g_wk.mesh.components[0]) / 2 ntau = nw * 6 + 1 mpi.report('g wk -> wr') g_wr = fourier_wk_to_wr(g_wk) mpi.report('g wr -> tr') g_tr = fourier_wr_to_tr(g_wr, nt=ntau) del g_wr mpi.report('W wk -> wr') Wr_wr = chi_wr_from_chi_wk(Wr_wk) mpi.report('W wr -> tr') Wr_tr = chi_tr_from_chi_wr(Wr_wr, ntau=ntau) del Wr_wr mpi.report('sigma tr') sigma_tr = cpp_gw_sigma_tr(Wr_tr, g_tr) del Wr_tr del g_tr mpi.report('sigma tr -> wr') sigma_wr = fourier_tr_to_wr(sigma_tr, nw=nw) del sigma_tr mpi.report('sigma wr -> wk') sigma_wk = fourier_wr_to_wk(sigma_wr) del sigma_wr else: sigma_wk = cpp_gw_sigma_wk_serial_fft(Wr_wk, g_wk) return sigma_wk