22#include <nda/linalg.hpp>
33 using namespace fourier;
40template<
typename g_t,
typename mesh_t>
41g_t lattice_dyson_g0_Xk(
double mu, e_k_cvt e_k, mesh_t mesh) {
43 auto I = nda::eye<ek_vt::scalar_t>(e_k.target_shape()[0]);
44 g_t g0_wk({mesh, e_k.mesh()}, e_k.target_shape());
47 auto arr = mpi_view(g0_wk.mesh());
49#pragma omp parallel for
50 for (
unsigned int idx = 0; idx < arr.size(); idx++) {
51 auto &[w, k] = arr[idx];
52 g0_wk[w, k] = nda::linalg::inv((w + mu)*I - e_k[k]);
55 g0_wk = mpi::all_reduce(g0_wk);
59g_wk_t lattice_dyson_g0_wk(
double mu, e_k_cvt e_k, mesh::imfreq mesh) {
60 return lattice_dyson_g0_Xk<g_wk_t, mesh::imfreq>(mu, e_k, mesh);
63g_Dwk_t lattice_dyson_g0_wk(
double mu, e_k_cvt e_k, mesh::dlr_imfreq mesh) {
64 return lattice_dyson_g0_Xk<g_Dwk_t, mesh::dlr_imfreq>(mu, e_k, mesh);
70g_fk_t lattice_dyson_g0_fk(
double mu, e_k_cvt e_k, mesh::refreq mesh,
double delta) {
72 auto I = nda::eye<ek_vt::scalar_t>(e_k.target_shape()[0]);
73 g_fk_t g0_fk({mesh, e_k.mesh()}, e_k.target_shape());
75 std::complex<double> idelta(0.0, delta);
77 auto arr = mpi_view(g0_fk.mesh());
78#pragma omp parallel for
79 for (
int idx = 0; idx < arr.size(); idx++) {
80 auto &[f, k] = arr[idx];
81 g0_fk[f, k] = nda::linalg::inv((f + idelta + mu) * I - e_k[k]);
84 g0_fk = mpi::all_reduce(g0_fk);
90template<
typename g_t,
typename sigma_t>
91g_t lattice_dyson_g_Xk(
double mu, e_k_cvt e_k, sigma_t sigma,
double delta=0.){
93 auto const &freqmesh = [&sigma]() ->
auto & {
94 if constexpr (sigma_t::arity == 1)
97 return std::get<0>(sigma.mesh());
100 using scalar_t = e_k_cvt::scalar_t;
101 auto I = nda::eye<scalar_t>(e_k.target_shape()[0]);
103 std::complex<double> idelta(0.0, delta);
105 g_t g_wk({freqmesh, e_k.mesh()}, e_k.target_shape());
108 auto arr = mpi_view(g_wk.mesh());
109#pragma omp parallel for
110 for (
unsigned int idx = 0; idx < arr.size(); idx++) {
111 auto &[w, k] = arr[idx];
113 array<scalar_t, 2> sigmaterm;
114 if constexpr (sigma_t::arity == 1) sigmaterm = sigma[w];
115 else sigmaterm = sigma[w, k];
117 g_wk[w, k] = nda::linalg::inv((w + idelta + mu)*I - e_k[k] - sigmaterm);
120 g_wk = mpi::all_reduce(g_wk);
125g_wk_t lattice_dyson_g_wk(
double mu, e_k_cvt e_k, g_wk_cvt sigma_wk) {
126 return lattice_dyson_g_Xk<g_wk_t, g_wk_cvt>(mu, e_k, sigma_wk);
129g_wk_t lattice_dyson_g_wk(
double mu, e_k_cvt e_k, g_w_cvt sigma_w) {
130 return lattice_dyson_g_Xk<g_wk_t, g_w_cvt>(mu, e_k, sigma_w);
133g_Dwk_t lattice_dyson_g_wk(
double mu, e_k_cvt e_k, g_Dwk_cvt sigma_wk) {
134 return lattice_dyson_g_Xk<g_Dwk_t, g_Dwk_cvt>(mu, e_k, sigma_wk);
137g_Dwk_t lattice_dyson_g_wk(
double mu, e_k_cvt e_k, g_Dw_cvt sigma_w) {
138 return lattice_dyson_g_Xk<g_Dwk_t, g_Dw_cvt>(mu, e_k, sigma_w);
141g_fk_t lattice_dyson_g_fk(
double mu, e_k_cvt e_k, g_fk_cvt sigma_fk,
double delta) {
142 return lattice_dyson_g_Xk<g_fk_t, g_fk_cvt>(mu, e_k, sigma_fk, delta);
145g_fk_t lattice_dyson_g_fk(
double mu, e_k_cvt e_k, g_f_cvt sigma_f,
double delta) {
146 return lattice_dyson_g_Xk<g_fk_t, g_f_cvt>(mu, e_k, sigma_f, delta);
151template<
typename g_t,
typename g_kt,
typename sigma_t>
152g_t lattice_dyson_g_X(
double mu, e_k_cvt e_k, sigma_t sigma,
double delta=0.){
154 auto const &freqmesh = [&sigma]() ->
auto & {
155 if constexpr (sigma_t::arity == 1)
158 return std::get<0>(sigma.mesh());
161 using scalar_t = e_k_cvt::scalar_t;
162 auto I = nda::eye<scalar_t>(e_k.target_shape()[0]);
164 std::complex<double> idelta(0.0, delta);
166 g_t g_w(freqmesh, e_k.target_shape());
172 auto arr = mpi_view(e_k.mesh());
173 for (
unsigned int idx = 0; idx < arr.size(); idx++) {
176#pragma omp parallel for
177 for (
unsigned int widx = 0; widx < freqmesh.size(); widx++) {
178 auto w = *std::next(freqmesh.begin(), widx);
180 array<scalar_t, 2> sigmaterm;
181 if constexpr (sigma_t::arity == 1) sigmaterm = sigma[w];
182 else sigmaterm = sigma[w, k];
184 g_w[w] += nda::linalg::inv((w + idelta + mu)*I - e_k[k] - sigmaterm);
188 g_w = mpi::all_reduce(g_w);
189 g_w /= e_k.mesh().size();
193g_w_t lattice_dyson_g_w(
double mu, e_k_cvt e_k, g_w_cvt sigma_w) {
194 return lattice_dyson_g_X<g_w_t, g_wk_t, g_w_cvt>(mu, e_k, sigma_w);
197g_Dw_t lattice_dyson_g_w(
double mu, e_k_cvt e_k, g_Dw_cvt sigma_w) {
198 return lattice_dyson_g_X<g_Dw_t, g_Dwk_t, g_Dw_cvt>(mu, e_k, sigma_w);
201g_f_t lattice_dyson_g_f(
double mu, e_k_cvt e_k, g_f_cvt sigma_f,
double delta) {
202 return lattice_dyson_g_X<g_f_t, g_fk_t, g_f_cvt>(mu, e_k, sigma_f, delta);
208g_wr_t fourier_wk_to_wr(g_wk_cvt g_wk) {
209 auto g_wr = fourier_wk_to_wr_general_target(g_wk);
213g_wk_t fourier_wr_to_wk(g_wr_cvt g_wr) {
214 auto g_wk = fourier_wr_to_wk_general_target(g_wr);
218g_Dwr_t fourier_wk_to_wr(g_Dwk_cvt g_wk) {
219 auto g_wr = fourier_wk_to_wr_general_target(g_wk);
223g_Dwk_t fourier_wr_to_wk(g_Dwr_cvt g_wr) {
224 auto g_wk = fourier_wr_to_wk_general_target(g_wr);
228g_fr_t fourier_fk_to_fr(g_fk_cvt g_fk) {
229 auto g_fr = fourier_wk_to_wr_general_target(g_fk);
233g_fk_t fourier_fr_to_fk(g_fr_cvt g_fr) {
234 auto g_fk = fourier_wr_to_wk_general_target(g_fr);
238g_Tr_t fourier_Tk_to_Tr(g_Tk_cvt g_Tk) {
239 auto g_Tr = fourier_wk_to_wr_general_target(g_Tk);
243g_Tk_t fourier_Tr_to_Tk(g_Tr_cvt g_Tr) {
244 auto g_Tk = fourier_wr_to_wk_general_target(g_Tr);
248chi_wk_t fourier_wr_to_wk(chi_wr_cvt chi_wr) {
249 auto chi_wk = fourier_wr_to_wk_general_target(chi_wr);
253chi_wr_t fourier_wk_to_wr(chi_wk_cvt chi_wk) {
254 auto chi_wr = fourier_wk_to_wr_general_target(chi_wk);
258chi_Dwk_t fourier_wr_to_wk(chi_Dwr_cvt chi_Dwr) {
259 auto chi_Dwk = fourier_wr_to_wk_general_target(chi_Dwr);
263chi_Dwr_t fourier_wk_to_wr(chi_Dwk_cvt chi_Dwk) {
264 auto chi_Dwr = fourier_wk_to_wr_general_target(chi_Dwk);
268chi_Tr_t fourier_Tr_to_Tk(chi_Tk_cvt chi_Tk) {
269 auto chi_Tr = fourier_wk_to_wr_general_target(chi_Tk);
273 chi_Tk_t fourier_Tr_to_Tk(chi_Tr_cvt chi_Tr) {
274 auto chi_Tk = fourier_wr_to_wk_general_target(chi_Tr);
281g_wr_t fourier_tr_to_wr(g_tr_cvt g_tr,
int nw) {
282 auto g_wr = fourier_tr_to_wr_general_target(g_tr, nw);
286g_tr_t fourier_wr_to_tr(g_wr_cvt g_wr,
int nt) {
287 auto g_tr = fourier_wr_to_tr_general_target(g_wr, nt);
291g_Dwr_t fourier_tr_to_wr(g_Dtr_cvt g_tr,
int ) {
292 auto g_wr = fourier_Dtr_to_Dwr_general_target(g_tr);
296g_Dtr_t fourier_wr_to_tr(g_Dwr_cvt g_wr,
int ) {
297 auto g_tr = fourier_Dwr_to_Dtr_general_target(g_wr);
301chi_wr_t fourier_tr_to_wr(chi_tr_cvt chi_tr,
int nw) {
302 auto chi_wr = fourier_tr_to_wr_general_target(chi_tr, nw);
306chi_tr_t fourier_wr_to_tr(chi_wr_cvt chi_wr,
int nt) {
307 auto chi_tr = fourier_wr_to_tr_general_target(chi_wr, nt);
311chi_Dwr_t fourier_tr_to_wr(chi_Dtr_cvt chi_Dtr,
int ) {
312 auto chi_Dwr = fourier_Dtr_to_Dwr_general_target(chi_Dtr);
316chi_Dtr_t fourier_wr_to_tr(chi_Dwr_cvt chi_Dwr,
int ) {
317 auto chi_Dtr = fourier_Dwr_to_Dtr_general_target(chi_Dwr);