22#include "hubbard_atom.hpp"
24using namespace nda::clef;
37namespace hubbard_atom {
39 typedef std::complex<double> val_t;
40 typedef gf<imfreq, tensor_valued<4>> temp_1d_t;
41 typedef gf<prod<imfreq, imfreq>, tensor_valued<4>> temp_2d_t;
43 g_iw_t single_particle_greens_function(
int nw,
double beta,
double U) {
44 g_iw_t g_iw{{beta, Fermion, nw}, {1, 1}};
45 g_iw[iw] << 1./(iw - U*U / (4 * iw) );
49 g2_iw_t chi_ph_magnetic(
int nw,
int nwf,
double beta,
double U) {
51 auto mb = mesh::imfreq{beta, Boson, nw};
52 auto mf = mesh::imfreq{beta, Fermion, nwf};
54 temp_1d_t C{mb, {1, 1, 1, 1}}, D{mb, {1, 1, 1, 1}};
55 temp_2d_t a0{{mb, mf}, {1, 1, 1, 1}}, b0{{mb, mf}, {1, 1, 1, 1}};
56 temp_2d_t b1{{mb, mf}, {1, 1, 1, 1}}, b2{{mb, mf}, {1, 1, 1, 1}};
57 g2_iw_t chi{{mb, mf, mf}, {1, 1, 1, 1}};
62 val_t B = I*U*0.5 * sqrt( abs(3. - exp(beta*U*0.5)) / (1 + exp(beta*U*0.5)) );
64 C[0] = -beta * U * 0.5 / (1 + exp(-beta * U * 0.5));
65 D(w) << U*U*0.25 * (1. + C(w))/(1. - C(w));
72 a0(w, n) << A0 * beta*0.5 * (-n*(n+w) - A*A) /
73 ( (-n*n + U*U*0.25) * (-(n+w)*(n+w) + U*U*0.25) );
75 b0(w, n) << B0 * beta*0.5 * (-n*(n+w) - B*B) /
76 ( (-n*n + U*U*0.25) * (-(n+w)*(n+w) + U*U*0.25) );
78 b1(w, n) << B1 * sqrt(U*(1-C(w))) * (-n*(n+w) - D(w)) /
79 ( (-n*n + U*U*0.25) * (-(n+w)*(n+w) + U*U*0.25) );
81 b2(w, n) << B2 * sqrt(U*U*U*0.25) * sqrt(U*U/(1-C(w)) - w*w) /
82 ( (-n*n + U*U*0.25) * (-(n+w)*(n+w) + U*U*0.25) );
84 chi(w, n1, n2) << kronecker(n1, n2) * (b0(w, n1) + a0(w, n1))
85 + kronecker(n1, -w - n2) * (b0(w, n1) - a0(w, n1))
86 + b1(w, n1) * b1(w, n2) + b2(w, n1) * b2(w, n2);
91 g2_iw_t gamma_ph_magnetic(
int nw,
int nwf,
double beta,
double U) {
93 auto mb = mesh::imfreq{beta, Boson, nw};
94 auto mf = mesh::imfreq{beta, Fermion, nwf};
96 temp_2d_t a0{{mb, mf}, {1, 1, 1, 1}}, b0{{mb, mf}, {1, 1, 1, 1}};
97 temp_1d_t D{mb, {1, 1, 1, 1}};
98 g2_iw_t gamma{{mb, mf, mf}, {1, 1, 1, 1}};
106 val_t B = I*U*0.5 * sqrt( abs(3. - exp(beta*U*0.5)) / (1 + exp(beta*U*0.5)) );
113 a0(w, n) << beta*0.5*A*A/A0 *
114 (-n*n+U*U*0.25)*(-(n+s*w)*(n+s*w)+U*U*0.25) /
115 ((-n*(n+s*w)-A*A)*(-n*(n+s*w)));
117 b0(w, n) << beta*0.5*B*B/B0 *
118 (-n*n+U*U*0.25)*(-(n+s*w)*(n+s*w)+U*U*0.25) /
119 ((-n*(n+s*w)-B*B)*(-n*(n+s*w)));
121 for(
auto const & w : mb ) {
122 val_t sqrtBBww = sqrt(4*B*B - w*w);
123 val_t powBBUU1 = std::pow(4.*B*B/(U*U) + 1., 2);
124 val_t UU4 = U*U*0.25;
127 D[w] = -U*abs(B1)*abs(B1)/(B0*B0) * UU4*(UU4*powBBUU1 - w*w) /
128 ( U*tan( beta*0.25*(sqrtBBww - I*w) ) / sqrtBBww - s );
138 gamma(w, n1, n2) << kronecker(n1, n2) * (b0(w, n1) + a0(w, n1))
139 + kronecker(n1, -w - n2) * (b0(w, n1) - a0(w, n1))
140 + D(w) / (-n1*(n1+s*w) - B*B) / (-n2*(n2+s*w) - B*B)
141 - B1*B1 / (B0*B0) * U;
143 gamma(w, n1, n2) << - 1/beta/beta * gamma(w, n1, n2);