6#include "post_process.hpp"
7#include <triqs/gfs.hpp>
8#include <triqs/mesh.hpp>
10namespace triqs_ctint {
12 chi4_iw_t G2_conn_from_M4(chi4_iw_t::const_view_type M4_iw, g_reg_iw_t::const_view_type M_iw, g_reg_iw_t::const_view_type G0_iw) {
14 chi4_iw_t G2_conn_iw = M4_iw;
16 double beta = M_iw[0].mesh().beta();
17 int n_blocks = M_iw.size();
20 chi4_iw_t M4_iw_conn = M4_iw;
22 for (
int bl1 : range(n_blocks))
23 for (
int bl2 : range(n_blocks))
24 M4_iw_conn(bl1, bl2)(iw1_, iw2_, iw3_)(i_, j_, k_, l_) << M4_iw(bl1, bl2)(iw1_, iw2_, iw3_)(i_, j_, k_, l_)
25 - beta * kronecker(iw1_, iw2_) * M_iw[bl1](iw1_)(j_, i_) * M_iw[bl2](iw3_)(l_, k_)
26 + beta * kronecker(bl1, bl2) * kronecker(iw2_, iw3_) * M_iw[bl1](iw1_)(l_, i_) * M_iw[bl2](iw3_)(j_, k_);
31 for (
int bl1 : range(n_blocks))
32 for (
int bl2 : range(n_blocks)) {
34 int bl1_size = M4_iw(bl1, bl2).target_shape()[0];
35 int bl2_size = M4_iw(bl1, bl2).target_shape()[2];
37 for (
int m : range(bl1_size))
38 for (
int n : range(bl1_size))
39 for (
int o : range(bl2_size))
40 for (
int p : range(bl2_size))
41 G2_conn_iw(bl1, bl2)(iw1_, iw2_, iw3_)(i_, j_, k_, l_) << G2_conn_iw(bl1, bl2)(iw1_, iw2_, iw3_)(i_, j_, k_, l_)
42 + G0_iw[bl1](iw2_)(j_, n) * G0_iw[bl2](iw1_ - iw2_ + iw3_)(l_, p) * M4_iw_conn(bl1, bl2)(iw1_, iw2_, iw3_)(m, n, o, p)
43 * G0_iw[bl1](iw1_)(m, i_) * G0_iw[bl2](iw3_)(o, k_);
49 chi4_iw_t G2pp_conn_from_M4pp(chi4_iw_t::const_view_type M4pp_iw, g_reg_iw_t::const_view_type M_iw, g_reg_iw_t::const_view_type G0_iw) {
51 chi4_iw_t G2pp_conn_iw = M4pp_iw;
53 double beta = M_iw[0].mesh().beta();
54 int n_blocks = M_iw.size();
57 chi4_iw_t M4pp_iw_conn = M4pp_iw;
59 for (
int bl1 : range(n_blocks))
60 for (
int bl2 : range(n_blocks))
61 M4pp_iw_conn(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_) << M4pp_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_)
62 - beta * kronecker(iw_, iW_ - iwp_) * M_iw[bl1](iw_)(j_, i_) * M_iw[bl2](iW_ - iw_)(l_, k_)
63 + beta * kronecker(bl1, bl2) * kronecker(iW_ - iwp_, iW_ - iw_) * M_iw[bl1](iw_)(l_, i_) * M_iw[bl2](iW_ - iw_)(j_, k_);
68 for (
int bl1 : range(n_blocks))
69 for (
int bl2 : range(n_blocks)) {
71 int bl1_size = M4pp_iw(bl1, bl2).target_shape()[0];
72 int bl2_size = M4pp_iw(bl1, bl2).target_shape()[2];
74 for (
int m : range(bl1_size))
75 for (
int n : range(bl1_size))
76 for (
int o : range(bl2_size))
77 for (
int p : range(bl2_size))
78 G2pp_conn_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_) << G2pp_conn_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_)
79 + G0_iw[bl1](iW_ - iwp_)(j_, n) * G0_iw[bl2](iwp_)(l_, p) * M4pp_iw_conn(bl1, bl2)(iW_, iw_, iwp_)(m, n, o, p)
80 * G0_iw[bl1](iw_)(m, i_) * G0_iw[bl2](iW_ - iw_)(o, k_);
86 chi4_iw_t G2ph_conn_from_M4ph(chi4_iw_t::const_view_type M4ph_iw, g_reg_iw_t::const_view_type M_iw, g_reg_iw_t::const_view_type G0_iw) {
88 chi4_iw_t G2ph_conn_iw = M4ph_iw;
90 double beta = M_iw[0].mesh().beta();
91 int n_blocks = M_iw.size();
94 chi4_iw_t M4ph_iw_conn = M4ph_iw;
96 for (
int bl1 : range(n_blocks))
97 for (
int bl2 : range(n_blocks))
98 M4ph_iw_conn(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_) << M4ph_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_)
99 - beta * kronecker(iw_, iW_ + iw_) * M_iw[bl1](iw_)(j_, i_) * M_iw[bl2](iW_ + iwp_)(l_, k_)
100 + beta * kronecker(bl1, bl2) * kronecker(iW_ + iw_, iW_ + iwp_) * M_iw[bl1](iw_)(l_, i_) * M_iw[bl2](iW_ + iwp_)(j_, k_);
105 for (
int bl1 : range(n_blocks))
106 for (
int bl2 : range(n_blocks)) {
108 int bl1_size = M4ph_iw(bl1, bl2).target_shape()[0];
109 int bl2_size = M4ph_iw(bl1, bl2).target_shape()[2];
111 for (
int m : range(bl1_size))
112 for (
int n : range(bl1_size))
113 for (
int o : range(bl2_size))
114 for (
int p : range(bl2_size))
115 G2ph_conn_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_) << G2ph_conn_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_)
116 + G0_iw[bl1](iW_ + iw_)(j_, n) * G0_iw[bl2](iwp_)(l_, p) * M4ph_iw_conn(bl1, bl2)(iW_, iw_, iwp_)(m, n, o, p)
117 * G0_iw[bl1](iw_)(m, i_) * G0_iw[bl2](iW_ + iwp_)(o, k_);
123 chi4_iw_t F_from_G2c(chi4_iw_t::const_view_type G2_conn_iw, g_reg_iw_t::const_view_type G_iw) {
125 int n_blocks = G_iw.size();
128 g_reg_iw_t Ginv = inverse(G_iw);
131 chi4_iw_t F_iw = G2_conn_iw;
134 for (
int bl1 : range(n_blocks))
135 for (
int bl2 : range(n_blocks)) {
137 int bl1_size = G2_conn_iw(bl1, bl2).target_shape()[0];
138 int bl2_size = G2_conn_iw(bl1, bl2).target_shape()[2];
140 for (
int m : range(bl1_size))
141 for (
int n : range(bl1_size))
142 for (
int o : range(bl2_size))
143 for (
int p : range(bl2_size))
144 F_iw(bl1, bl2)(iw1_, iw2_, iw3_)(i_, j_, k_, l_) << F_iw(bl1, bl2)(iw1_, iw2_, iw3_)(i_, j_, k_, l_)
145 + Ginv[bl1](iw2_)(j_, n) * Ginv[bl2](iw1_ - iw2_ + iw3_)(l_, p) * G2_conn_iw(bl1, bl2)(iw1_, iw2_, iw3_)(m, n, o, p)
146 * Ginv[bl1](iw1_)(m, i_) * Ginv[bl2](iw3_)(o, k_);
152 chi4_iw_t Fpp_from_G2pp_conn(chi4_iw_t::const_view_type G2pp_conn_iw, g_reg_iw_t::const_view_type G_iw) {
154 int n_blocks = G_iw.size();
157 g_reg_iw_t Ginv = inverse(G_iw);
160 chi4_iw_t Fpp_iw = G2pp_conn_iw;
163 for (
int bl1 : range(n_blocks))
164 for (
int bl2 : range(n_blocks)) {
166 int bl1_size = G2pp_conn_iw(bl1, bl2).target_shape()[0];
167 int bl2_size = G2pp_conn_iw(bl1, bl2).target_shape()[2];
169 for (
int m : range(bl1_size))
170 for (
int n : range(bl1_size))
171 for (
int o : range(bl2_size))
172 for (
int p : range(bl2_size))
173 Fpp_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_) << Fpp_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_)
174 + Ginv[bl1](iW_ - iwp_)(j_, n) * Ginv[bl2](iwp_)(l_, p) * G2pp_conn_iw(bl1, bl2)(iW_, iw_, iwp_)(m, n, o, p) * Ginv[bl1](iw_)(m, i_)
175 * Ginv[bl2](iW_ - iw_)(o, k_);
181 chi4_iw_t Fph_from_G2ph_conn(chi4_iw_t::const_view_type G2ph_conn_iw, g_reg_iw_t::const_view_type G_iw) {
183 int n_blocks = G_iw.size();
186 g_reg_iw_t Ginv = inverse(G_iw);
189 chi4_iw_t Fph_iw = G2ph_conn_iw;
192 for (
int bl1 : range(n_blocks))
193 for (
int bl2 : range(n_blocks)) {
195 int bl1_size = G2ph_conn_iw(bl1, bl2).target_shape()[0];
196 int bl2_size = G2ph_conn_iw(bl1, bl2).target_shape()[2];
198 for (
int m : range(bl1_size))
199 for (
int n : range(bl1_size))
200 for (
int o : range(bl2_size))
201 for (
int p : range(bl2_size))
202 Fph_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_) << Fph_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_)
203 + Ginv[bl1](iW_ + iw_)(j_, n) * Ginv[bl2](iwp_)(l_, p) * G2ph_conn_iw(bl1, bl2)(iW_, iw_, iwp_)(m, n, o, p) * Ginv[bl1](iw_)(m, i_)
204 * Ginv[bl2](iW_ + iwp_)(o, k_);
210 chi4_iw_t G2_from_G2c(chi4_iw_t::const_view_type G2_conn_iw, g_reg_iw_t::const_view_type G_iw) {
212 int n_blocks = G_iw.size();
213 double beta = G_iw[0].mesh().beta();
216 chi4_iw_t G2_iw = G2_conn_iw;
218 for (
int bl1 : range(n_blocks))
219 for (
int bl2 : range(n_blocks))
220 G2_iw(bl1, bl2)(iw1_, iw2_, iw3_)(i_, j_, k_, l_) << G2_conn_iw(bl1, bl2)(iw1_, iw2_, iw3_)(i_, j_, k_, l_)
221 + beta * kronecker(iw1_, iw2_) * G_iw[bl1](iw1_)(j_, i_) * G_iw[bl2](iw3_)(l_, k_)
222 - beta * kronecker(bl1, bl2) * kronecker(iw2_, iw3_) * G_iw[bl1](iw1_)(l_, i_) * G_iw[bl2](iw3_)(j_, k_);
227 chi4_iw_t G2pp_from_G2pp_conn(chi4_iw_t::const_view_type G2pp_conn_iw, g_reg_iw_t::const_view_type G_iw) {
229 int n_blocks = G_iw.size();
230 double beta = G_iw[0].mesh().beta();
233 chi4_iw_t G2pp_iw = G2pp_conn_iw;
235 for (
int bl1 : range(n_blocks))
236 for (
int bl2 : range(n_blocks))
237 G2pp_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_) << G2pp_conn_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_)
238 + beta * kronecker(iw_, iW_ - iwp_) * G_iw[bl1](iw_)(j_, i_) * G_iw[bl2](iW_ - iw_)(l_, k_)
239 - beta * kronecker(bl1, bl2) * kronecker(iW_ - iwp_, iW_ - iw_) * G_iw[bl1](iw_)(l_, i_) * G_iw[bl2](iW_ - iw_)(j_, k_);
244 chi4_iw_t G2ph_from_G2ph_conn(chi4_iw_t::const_view_type G2ph_conn_iw, g_reg_iw_t::const_view_type G_iw) {
246 int n_blocks = G_iw.size();
247 double beta = G_iw[0].mesh().beta();
250 chi4_iw_t G2ph_iw = G2ph_conn_iw;
252 for (
int bl1 : range(n_blocks))
253 for (
int bl2 : range(n_blocks))
254 G2ph_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_) << G2ph_conn_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_)
255 + beta * kronecker(iw_, iW_ + iw_) * G_iw[bl1](iw_)(j_, i_) * G_iw[bl2](iW_ + iwp_)(l_, k_)
256 - beta * kronecker(bl1, bl2) * kronecker(iW_ + iw_, iW_ + iwp_) * G_iw[bl1](iw_)(l_, i_) * G_iw[bl2](iW_ + iwp_)(j_, k_);
261 chi4_iw_t chi_tilde_ph_from_G2ph_conn(chi4_iw_t::const_view_type G2ph_conn_iw, g_reg_iw_cv_t G_iw) {
263 int n_blocks = G_iw.size();
264 double beta = G_iw[0].mesh().beta();
267 chi4_iw_t chi_tilde_ph = G2ph_conn_iw;
270 for (
int bl1 : range(n_blocks))
271 for (
int bl2 : range(n_blocks))
272 chi_tilde_ph(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_) << G2ph_conn_iw(bl1, bl2)(iW_, iw_, iwp_)(i_, j_, k_, l_)
273 - beta * kronecker(bl1, bl2) * kronecker(iw_, iwp_) * G_iw[bl1](iw_)(l_, i_) * G_iw[bl2](iwp_ + iW_)(j_, k_);