Lattice Bethe-Salpeter Equation (BSE)
First we setup a dispersion for the lattice.
This can be done using a tight-binding Hamiltonian, see the square lattice guide.
Here we will keep thing simple and perform a calculation using the self energy and the local vertex of the Hubbard atom. This example can be adapted to use the result of a general impurity problem, e.g. from triqs/cthyb
.
[2]:
from triqs_tprf.analytic_hubbard_atom import analytic_hubbard_atom
p = analytic_hubbard_atom(
beta = 1.234,
U = 5.0,
nw = 1,
nwf = 248,
nwf_gf = 2 * 248,
)
[3]:
from triqs.lattice import BrillouinZone, BravaisLattice
bl = BravaisLattice([(1,0,0), (0,1,0)])
bz = BrillouinZone(bl)
from triqs.gf import MeshBrZone
bzmesh = MeshBrZone(bz, n_k=1) # only one k-point
from triqs.gf import Gf
e_k = Gf(mesh=bzmesh, target_shape=[1, 1])
e_k *= 0.
For the Hubbard atom we can compute the local self energy \(\Sigma(i\omega_n)\)
[4]:
Sigma_iw = p.G_iw.copy()
G0_iw = p.G_iw.copy()
from triqs.gf import inverse, iOmega_n
G0_iw << inverse(iOmega_n + 0.5*p.U)
Sigma_iw << inverse(G0_iw) - inverse(p.G_iw)
[4]:
Green Function G_dn with mesh Matsubara Freq Mesh of size 992, Domain: Matsubara domain with beta = 1.234, statistic = Fermion, positive_only : 0 and target_rank 2:
By using the atomic self energy we can compute the lattice Green’s function (in the Hubbard I approximation)
[5]:
from triqs_tprf.lattice import lattice_dyson_g_wk
g_wk = lattice_dyson_g_wk(mu=0.5*p.U, e_k=e_k, sigma_w=Sigma_iw)
from triqs_tprf.lattice import fourier_wk_to_wr
g_wr = fourier_wk_to_wr(g_wk)
With the Green’s function we can construct the lattice bare susceptbility by making the product in imaginary time and real space using triqs_tprf.lattice.chi0r_from_gr_PH
and triqs_tprf.lattice.chi0q_from_chi0r
[6]:
from triqs_tprf.lattice import chi0r_from_gr_PH
chi0_wr = chi0r_from_gr_PH(nw=p.nw, nn=p.nwf, g_nr=g_wr)
from triqs_tprf.lattice import chi0q_from_chi0r
chi0_wk = chi0q_from_chi0r(chi0_wr)
With \(\chi_0\) and a local vertex from an impurity calculation (here we use the analytic Hubbard atom vertex) we can solve the Bethe-Salpeter equation on the lattice using triqs_tprf.lattice.chiq_from_chi0q_and_gamma_PH
[7]:
from triqs_tprf.lattice import chiq_from_chi0q_and_gamma_PH
chi_wk = chiq_from_chi0q_and_gamma_PH(chi0_wk, p.gamma_m)
[8]:
num = np.squeeze(chi_wk.data.real)
ref = np.squeeze(p.chi_m.data.real)
diff = np.max(np.abs(num - ref))
print('diff =', diff)
diff = 0.5861047169392135
There are also helper functions to sum over fermionic freqiencies in order to obtain the one frequency dependent generalized susceptibility
[9]:
from triqs_tprf.lattice import chiq_sum_nu, chiq_sum_nu_q
p.chi_w = chiq_sum_nu_q(chi_wk) # static suscept
p.chi_wk = chiq_sum_nu(chi_wk) # static suscept