Skip to content

Commit 707a04f

Browse files
committed
Merge branch 'dev_gw' into unstable
2 parents 3c5e366 + 4d718f1 commit 707a04f

37 files changed

+2792
-831
lines changed

c++/triqs_tprf/lattice.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
#include "./lattice/gf.hpp"
2626
#include "./lattice/lindhard_chi00.hpp"
2727
#include "./lattice/rpa.hpp"
28+
#include "./lattice/lattice_utility.hpp"
2829
#include "./lattice/gw.hpp"
30+
#include "./lattice/dynamical_screened_interaction.hpp"
2931
#include "./lattice/eliashberg.hpp"
3032
#include "./lattice/fourier_interpolation.hpp"
3133

c++/triqs_tprf/lattice/chi_imfreq.cpp

Lines changed: 93 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ placeholder<1> inu;
4747
chi0r_t chi0r_from_gr_PH(int nw, int nnu, gr_iw_vt gr) {
4848
4949
int nb = gr.target().shape()[0];
50-
auto clmesh = std::get<1>(gr.mesh());
50+
auto &clmesh = std::get<1>(gr.mesh());
5151
double beta = std::get<0>(gr.mesh()).domain().beta;
5252
5353
chi0r_t chi0r{{{beta, Boson, nw}, {beta, Fermion, nnu}, clmesh},
@@ -69,7 +69,7 @@ chi_wnr_t chi0r_from_gr_PH(int nw, int nn, g_wr_cvt g_nr) {
6969
auto _ = all_t{};
7070

7171
int nb = g_nr.target().shape()[0];
72-
auto rmesh = std::get<1>(g_nr.mesh());
72+
auto &rmesh = std::get<1>(g_nr.mesh());
7373

7474
double beta = std::get<0>(g_nr.mesh()).domain().beta;
7575

@@ -146,7 +146,7 @@ chi_nr_t chi0_nr_from_gr_PH_at_specific_w(int nw_index, int nn, g_wr_cvt g_nr) {
146146
auto _ = all_t{};
147147

148148
int nb = g_nr.target().shape()[0];
149-
auto rmesh = std::get<1>(g_nr.mesh());
149+
auto &rmesh = std::get<1>(g_nr.mesh());
150150

151151
double beta = std::get<0>(g_nr.mesh()).domain().beta;
152152

@@ -171,7 +171,6 @@ chi_nr_t chi0_nr_from_gr_PH_at_specific_w(int nw_index, int nn, g_wr_cvt g_nr) {
171171
auto g_target = g_nr.target();
172172

173173
auto arr = mpi_view(rmesh);
174-
175174
#pragma omp parallel for
176175
for (unsigned int idx = 0; idx < arr.size(); idx++) {
177176
auto &r = arr(idx);
@@ -212,7 +211,7 @@ chi_wnr_t chi0r_from_gr_PH_nompi(int nw, int nn, g_wr_cvt g_nr) {
212211
auto _ = all_t{};
213212

214213
int nb = g_nr.target().shape()[0];
215-
auto rmesh = std::get<1>(g_nr.mesh());
214+
auto &rmesh = std::get<1>(g_nr.mesh());
216215

217216
double beta = std::get<0>(g_nr.mesh()).domain().beta;
218217

@@ -276,7 +275,7 @@ CPP2PY_IGNORE
276275
gf<imfreq, tensor_valued<4>> chi0_n_from_g_wk_PH(mesh_point<mesh::imfreq> w, mesh_point<cluster_mesh> q, mesh::imfreq fmesh, g_wk_cvt g_wk) {
277276

278277
int nb = g_wk.target().shape()[0];
279-
auto kmesh = std::get<1>(g_wk.mesh());
278+
auto &kmesh = std::get<1>(g_wk.mesh());
280279

281280
double beta = fmesh.domain().beta;
282281

@@ -347,7 +346,7 @@ gf<imfreq, tensor_valued<4>> chi0_n_from_e_k_sigma_w_PH(mesh_point<mesh::imfreq>
347346

348347
chi_wnk_t chi0q_from_g_wk_PH(int nw, int nn, g_wk_cvt g_wk) {
349348

350-
auto kmesh = std::get<1>(g_wk.mesh());
349+
auto &kmesh = std::get<1>(g_wk.mesh());
351350

352351
int nb = g_wk.target().shape()[0];
353352
double beta = std::get<0>(g_wk.mesh()).domain().beta;
@@ -391,10 +390,10 @@ chi_wnr_t chi0r_from_chi0q(chi_wnk_cvt chi_wnk) {
391390
auto _ = all_t{};
392391
auto target = chi_wnk.target();
393392

394-
//auto [bmesh, fmesh, kmesh] = chi0_wnk.mesh(); // clang+OpenMP can not handle this...
395-
auto bmesh = std::get<0>(chi_wnk.mesh());
396-
auto fmesh = std::get<1>(chi_wnk.mesh());
397-
auto kmesh = std::get<2>(chi_wnk.mesh());
393+
//auto &[bmesh, fmesh, kmesh] = chi0_wnk.mesh(); // clang+OpenMP can not handle this...
394+
auto &bmesh = std::get<0>(chi_wnk.mesh());
395+
auto &fmesh = std::get<1>(chi_wnk.mesh());
396+
auto &kmesh = std::get<2>(chi_wnk.mesh());
398397
auto rmesh = make_adjoint_mesh(kmesh);
399398

400399
chi_wnr_t chi_wnr({bmesh, fmesh, rmesh}, chi_wnk.target_shape());
@@ -405,12 +404,9 @@ chi_wnr_t chi0r_from_chi0q(chi_wnk_cvt chi_wnk) {
405404
gf_view(chi_wnr[w0, n0, _]));
406405

407406
auto arr = mpi_view(prod{bmesh, fmesh});
408-
409407
#pragma omp parallel for shared(kmesh, rmesh)
410408
for (unsigned int idx = 0; idx < arr.size(); idx++) {
411-
//auto &[w, n] = arr(idx);
412-
auto w = std::get<0>(arr(idx));
413-
auto n = std::get<1>(arr(idx));
409+
auto &[w, n] = arr(idx);
414410

415411
auto chi_r = make_gf<cyclat>(rmesh, target);
416412
auto chi_k = make_gf<brzone>(kmesh, target);
@@ -460,10 +456,10 @@ chi_wnk_t chi0q_from_chi0r(chi_wnr_cvt chi_wnr) {
460456
auto _ = all_t{};
461457
auto target = chi_wnr.target();
462458

463-
//auto [bmesh, fmesh, rmesh] = chi_wnr.mesh();
464-
auto bmesh = std::get<0>(chi_wnr.mesh());
465-
auto fmesh = std::get<1>(chi_wnr.mesh());
466-
auto rmesh = std::get<2>(chi_wnr.mesh());
459+
//auto &[bmesh, fmesh, rmesh] = chi_wnr.mesh();
460+
auto &bmesh = std::get<0>(chi_wnr.mesh());
461+
auto &fmesh = std::get<1>(chi_wnr.mesh());
462+
auto &rmesh = std::get<2>(chi_wnr.mesh());
467463
auto kmesh = make_adjoint_mesh(rmesh);
468464

469465
t_alloc.start();
@@ -474,17 +470,14 @@ chi_wnk_t chi0q_from_chi0r(chi_wnr_cvt chi_wnr) {
474470
auto p = _fourier_plan<0>(gf_const_view(chi_wnr[w0, n0, _]),
475471
gf_view(chi_wnk[w0, n0, _]));
476472

477-
auto arr = mpi_view(prod{bmesh, fmesh});
478-
479473
t_alloc.stop();
480474
t_calc.start();
481-
475+
476+
auto arr = mpi_view(prod{bmesh, fmesh});
482477
#pragma omp parallel for
483478
for (unsigned int idx = 0; idx < arr.size(); idx++) {
484-
//auto &[w, n] = arr(idx);
485-
auto w = std::get<0>(arr(idx));
486-
auto n = std::get<1>(arr(idx));
487-
479+
auto &[w, n] = arr(idx);
480+
488481
auto chi_r = make_gf<cyclat>(rmesh, target);
489482
auto chi_k = make_gf<brzone>(kmesh, target);
490483

@@ -520,20 +513,22 @@ chi_wnk_t chi0q_from_chi0r(chi_wnr_cvt chi_wnr) {
520513

521514
chi_wk_t chi0q_sum_nu(chi_wnk_cvt chi_wnk) {
522515

523-
auto wmesh = std::get<0>(chi_wnk.mesh());
524-
auto nmesh = std::get<1>(chi_wnk.mesh());
525-
auto kmesh = std::get<2>(chi_wnk.mesh());
526-
516+
//auto &[wmesh, nmesh, kmesh] = chi_wnk.mesh();
517+
auto &wmesh = std::get<0>(chi_wnk.mesh());
518+
auto &nmesh = std::get<1>(chi_wnk.mesh());
519+
auto &kmesh = std::get<2>(chi_wnk.mesh());
520+
527521
chi_wk_t chi_wk({wmesh, kmesh}, chi_wnk.target_shape());
528522
chi_wk *= 0.;
529-
523+
530524
double beta = wmesh.domain().beta;
531-
auto arr = mpi_view(prod{wmesh, kmesh});
532525

526+
auto arr = mpi_view(chi_wk.mesh());
533527
#pragma omp parallel for
534528
for (unsigned int idx = 0; idx < arr.size(); idx++) {
535529
auto &[w, k] = arr(idx);
536-
for( auto &n : nmesh) chi_wk[w, k] += chi_wnk[w, n, k];
530+
531+
for (auto &n : nmesh) chi_wk[w, k] += chi_wnk[w, n, k];
537532
chi_wk[w, k] /= beta * beta;
538533
}
539534

@@ -547,9 +542,12 @@ chi_wk_t chi0q_sum_nu(chi_wnk_cvt chi_wnk) {
547542

548543
chi_wk_t chi0q_sum_nu_tail_corr_PH(chi_wnk_cvt chi_wnk) {
549544

550-
auto wmesh = std::get<0>(chi_wnk.mesh());
551-
auto nmesh = std::get<1>(chi_wnk.mesh());
552-
auto qmesh = std::get<2>(chi_wnk.mesh());
545+
auto _ = all_t{};
546+
547+
//auto &[wmesh, nmesh, qmesh] = chi_wnk.mesh();
548+
auto &wmesh = std::get<0>(chi_wnk.mesh());
549+
auto &nmesh = std::get<1>(chi_wnk.mesh());
550+
auto &qmesh = std::get<2>(chi_wnk.mesh());
553551

554552
chi_wk_t chi_wk({wmesh, qmesh}, chi_wnk.target_shape());
555553

@@ -561,16 +559,10 @@ chi_wk_t chi0q_sum_nu_tail_corr_PH(chi_wnk_cvt chi_wnk) {
561559
// for (auto const &w : wmesh) {
562560
// for (auto const &q : qmesh) {
563561

564-
auto wq_mesh = prod{wmesh, qmesh};
565-
auto arr = mpi_view(wq_mesh); // FIXME Use library implementation
566-
562+
auto arr = mpi_view(chi_wk.mesh()); // FIXME Use library implementation
567563
#pragma omp parallel for
568564
for (unsigned int idx = 0; idx < arr.size(); idx++) {
569-
//auto &[w, q] = arr(idx);
570-
auto w = std::get<0>(arr(idx));
571-
auto q = std::get<1>(arr(idx));
572-
573-
auto _ = all_t{};
565+
auto &[w, q] = arr(idx);
574566

575567
auto chi = make_gf<imfreq>(nmesh, chi_target);
576568
array<std::complex<double>, 4> dens(nb, nb, nb, nb);
@@ -602,9 +594,7 @@ chi_wk_t chi0q_sum_nu_tail_corr_PH(chi_wnk_cvt chi_wnk) {
602594

603595
chi_w_t chi0q_sum_nu_q(chi_wnk_cvt chi_wnk) {
604596

605-
auto mesh_b = std::get<0>(chi_wnk.mesh());
606-
auto mesh_f = std::get<1>(chi_wnk.mesh());
607-
auto mesh_k = std::get<2>(chi_wnk.mesh());
597+
auto &[mesh_b, mesh_f, mesh_k] = chi_wnk.mesh();
608598

609599
chi_w_t chi_w(mesh_b, chi_wnk.target_shape());
610600

@@ -626,9 +616,7 @@ chiq_t chiq_from_chi0q_and_gamma_PH(chi0q_vt chi0q, g2_iw_vt gamma_ph) {
626616
627617
auto _ = all_t{};
628618
629-
auto mb = std::get<0>(chi0q.mesh());
630-
auto mf = std::get<1>(chi0q.mesh());
631-
auto mbz = std::get<2>(chi0q.mesh());
619+
auto &[mb, mf, mbz] = chi0q.mesh();
632620
633621
auto chiq = make_gf<chiq_t::mesh_t>({mbz, mb, mf, mf}, chi0q.target());
634622
@@ -663,14 +651,12 @@ chi_kwnn_t chiq_from_chi0q_and_gamma_PH(chi_wnk_cvt chi0_wnk, chi_wnn_cvt gamma_
663651

664652
auto _ = all_t{};
665653

666-
auto mb = std::get<0>(chi0_wnk.mesh());
667-
auto mf = std::get<1>(chi0_wnk.mesh());
668-
auto mbz = std::get<2>(chi0_wnk.mesh());
654+
auto &mb = std::get<0>(chi0_wnk.mesh());
655+
auto &mf = std::get<1>(chi0_wnk.mesh());
656+
auto &mbz = std::get<2>(chi0_wnk.mesh());
669657

670658
chi_kwnn_t chi_kwnn({mbz, mb, mf, mf}, chi0_wnk.target_shape());
671659

672-
// for (auto const &k : mbz) {
673-
674660
#pragma omp parallel for
675661
for (unsigned int idx = 0; idx < mbz.size(); idx++) {
676662
auto iter = mbz.begin();
@@ -710,17 +696,16 @@ chi_kw_t chiq_sum_nu_from_chi0q_and_gamma_PH(chi_wnk_cvt chi0_wnk, chi_wnn_cvt g
710696
mpi::communicator c;
711697

712698
auto target_shape = chi0_wnk.target_shape();
713-
auto bmesh = std::get<0>(chi0_wnk.mesh());
714-
auto fmesh = std::get<1>(chi0_wnk.mesh());
715-
auto kmesh = std::get<2>(chi0_wnk.mesh());
699+
// auto &[bmesh, fmesh, kmesh] = chi0_wnk.mesh();
700+
auto &bmesh = std::get<0>(chi0_wnk.mesh());
701+
auto &fmesh = std::get<1>(chi0_wnk.mesh());
702+
auto &kmesh = std::get<2>(chi0_wnk.mesh());
716703

717704
double beta = fmesh.domain().beta;
718705

719706
chi_kw_t chi_kw({kmesh, bmesh}, target_shape);
720707

721-
auto kb_mesh = prod{kmesh, bmesh};
722-
auto arr = mpi_view(kb_mesh); // FIXME Use library implementation
723-
708+
auto arr = mpi_view(chi_kw.mesh()); // FIXME Use library implementation
724709
std::cout << "BSE rank " << c.rank() << " of " << c.size() << " has "
725710
<< arr.size() << " jobs." << std::endl;
726711

@@ -729,9 +714,7 @@ chi_kw_t chiq_sum_nu_from_chi0q_and_gamma_PH(chi_wnk_cvt chi0_wnk, chi_wnn_cvt g
729714

730715
#pragma omp parallel for
731716
for (unsigned int idx = 0; idx < arr.size(); idx++) {
732-
//auto &[k, w] = arr(idx);
733-
auto k = std::get<0>(arr(idx));
734-
auto w = std::get<1>(arr(idx));
717+
auto &[k, w] = arr(idx);
735718

736719
//triqs::utility::timer t_copy_1, t_chi0_nn, t_bse, t_chi_tr, t_copy_2;
737720

@@ -834,9 +817,9 @@ chiq_sum_nu_from_g_wk_and_gamma_PH(gk_iw_t g_wk, g2_iw_vt gamma_ph_wnn,
834817
auto _ = all_t{};
835818

836819
auto target = gamma_ph_wnn.target();
837-
auto kmesh = std::get<1>(g_wk.mesh());
838-
auto bmesh = std::get<0>(gamma_ph_wnn.mesh());
839-
auto fmesh = std::get<1>(gamma_ph_wnn.mesh());
820+
auto &kmesh = std::get<1>(g_wk.mesh());
821+
auto &bmesh = std::get<0>(gamma_ph_wnn.mesh());
822+
auto &fmesh = std::get<1>(gamma_ph_wnn.mesh());
840823

841824
double beta = fmesh.domain().beta;
842825

@@ -863,7 +846,7 @@ chiq_sum_nu_from_g_wk_and_gamma_PH(gk_iw_t g_wk, g2_iw_vt gamma_ph_wnn,
863846
array<std::complex<double>, 4> tr_chi0(gamma_ph_wnn.target_shape());
864847
array<std::complex<double>, 4> tr_chi0_tail_corr(gamma_ph_wnn.target_shape());
865848

866-
for (auto const &[k, w] : mpi_view(prod{kmesh, bmesh})) {
849+
for (auto const &[k, w] : mpi_view(chi_kw.mesh())) {
867850

868851
triqs::utility::timer t_chi0_n, t_chi0_tr, t_bse_1, t_bse_2, t_bse_3;
869852

@@ -959,11 +942,10 @@ chiq_sum_nu_from_e_k_sigma_w_and_gamma_PH(double mu, ek_vt e_k, g_iw_vt sigma_w,
959942
auto target = gamma_ph_wnn.target();
960943
// auto [fmesh_large, kmesh] = g_wk.mesh();
961944

962-
auto kmesh = e_k.mesh();
963-
auto fmesh_large = sigma_w.mesh();
945+
auto &kmesh = e_k.mesh();
964946

965-
auto bmesh = std::get<0>(gamma_ph_wnn.mesh());
966-
auto fmesh = std::get<1>(gamma_ph_wnn.mesh());
947+
auto &bmesh = std::get<0>(gamma_ph_wnn.mesh());
948+
auto &fmesh = std::get<1>(gamma_ph_wnn.mesh());
967949

968950
double beta = fmesh.domain().beta;
969951

@@ -990,7 +972,7 @@ chiq_sum_nu_from_e_k_sigma_w_and_gamma_PH(double mu, ek_vt e_k, g_iw_vt sigma_w,
990972
array<std::complex<double>, 4> tr_chi0(gamma_ph_wnn.target_shape());
991973
array<std::complex<double>, 4> tr_chi0_tail_corr(gamma_ph_wnn.target_shape());
992974

993-
for (auto const &[k, w] : mpi_view(prod{kmesh, bmesh})) {
975+
for (auto const &[k, w] : mpi_view(chi_kw.mesh())) {
994976

995977
triqs::utility::timer t_chi0_n, t_chi0_tr, t_bse_1, t_bse_2, t_bse_3;
996978

@@ -1084,9 +1066,9 @@ chiq_sum_nu_from_e_k_sigma_w_and_gamma_PH(double mu, ek_vt e_k, g_iw_vt sigma_w,
10841066
gf<prod<brzone, imfreq>, tensor_valued<4>>
10851067
chiq_sum_nu(chiq_t chiq) {
10861068

1087-
auto mesh_k = std::get<0>(chiq.mesh());
1088-
auto mesh_b = std::get<1>(chiq.mesh());
1089-
auto mesh_f = std::get<2>(chiq.mesh());
1069+
auto &mesh_k = std::get<0>(chiq.mesh());
1070+
auto &mesh_b = std::get<1>(chiq.mesh());
1071+
auto &mesh_f = std::get<2>(chiq.mesh());
10901072
auto chiq_w = make_gf<prod<brzone, imfreq>>(
10911073
{mesh_k, mesh_b}, chiq.target());
10921074

@@ -1104,9 +1086,9 @@ chiq_sum_nu(chiq_t chiq) {
11041086

11051087
gf<imfreq, tensor_valued<4>> chiq_sum_nu_q(chiq_t chiq) {
11061088

1107-
auto mesh_k = std::get<0>(chiq.mesh());
1108-
auto mesh_b = std::get<1>(chiq.mesh());
1109-
auto mesh_f = std::get<2>(chiq.mesh());
1089+
auto &mesh_k = std::get<0>(chiq.mesh());
1090+
auto &mesh_b = std::get<1>(chiq.mesh());
1091+
auto &mesh_f = std::get<2>(chiq.mesh());
11101092
auto chi_w = make_gf<imfreq>(mesh_b, chiq.target());
11111093

11121094
for (auto const &[k, w, n1, n2] : chiq.mesh())
@@ -1119,4 +1101,36 @@ gf<imfreq, tensor_valued<4>> chiq_sum_nu_q(chiq_t chiq) {
11191101
return chi_w;
11201102
}
11211103

1104+
chi_wk_t attatch_tri_vert(chi_nn_cvt L_wn, chi_kwnn_cvt chi_kwnn) {
1105+
1106+
auto _ = all_t{};
1107+
1108+
auto &mesh_k = std::get<0>(chi_kwnn.mesh());
1109+
auto &mesh_b = std::get<1>(chi_kwnn.mesh());
1110+
1111+
auto chi_wk = make_gf<prod<imfreq, brzone>>({mesh_b, mesh_k}, chi_kwnn.target());
1112+
1113+
std::cout << "--> attatch_tri_vert: Hybrid parallell OpenMP+MPI\n";
1114+
1115+
auto arr = mpi_view(chi_wk.mesh());
1116+
#pragma omp parallel for
1117+
for (int idx = 0; idx < arr.size(); idx++) {
1118+
auto &[w, k] = arr(idx);
1119+
1120+
/*
1121+
//for (auto const &[k, w, n1, n2] : chi_kwnn.mesh()) {
1122+
for (auto [a, b, c, d] : chi_kwnn.target_indices())
1123+
for (auto [e, f, g, h] : chi_kwnn.target_indices())
1124+
chi_wk[w, k](a, b, g, h) +=
1125+
L_wn[w, n1](a, b, c, d) * chi_kwnn[k, w, n1, n2](c, d, e, f) * L_wn[w, n2](e, f, g, h);
1126+
*/
1127+
1128+
chi_wk[w, k] = scalar_product_PH(L_wn[w, _], chi_kwnn[k, w, _, _], L_wn[w, _]);
1129+
}
1130+
1131+
chi_wk = mpi::all_reduce(chi_wk);
1132+
1133+
return chi_wk;
1134+
}
1135+
11221136
} // namespace triqs_tprf

c++/triqs_tprf/lattice/chi_imfreq.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,6 @@ chiq_sum_nu(chiq_t chiq);
181181

182182
gf<imfreq, tensor_valued<4>> chiq_sum_nu_q(chiq_t chiq);
183183

184+
chi_wk_t attatch_tri_vert(chi_nn_cvt L_wn, chi_kwnn_cvt chi_kwnn);
185+
184186
} // namespace triqs_tprf

0 commit comments

Comments
 (0)