@@ -47,7 +47,7 @@ placeholder<1> inu;
47
47
chi0r_t chi0r_from_gr_PH(int nw, int nnu, gr_iw_vt gr) {
48
48
49
49
int nb = gr.target().shape()[0];
50
- auto clmesh = std::get<1>(gr.mesh());
50
+ auto & clmesh = std::get<1>(gr.mesh());
51
51
double beta = std::get<0>(gr.mesh()).domain().beta;
52
52
53
53
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) {
69
69
auto _ = all_t {};
70
70
71
71
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 ());
73
73
74
74
double beta = std::get<0 >(g_nr.mesh ()).domain ().beta ;
75
75
@@ -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) {
146
146
auto _ = all_t {};
147
147
148
148
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 ());
150
150
151
151
double beta = std::get<0 >(g_nr.mesh ()).domain ().beta ;
152
152
@@ -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) {
171
171
auto g_target = g_nr.target ();
172
172
173
173
auto arr = mpi_view (rmesh);
174
-
175
174
#pragma omp parallel for
176
175
for (unsigned int idx = 0 ; idx < arr.size (); idx++) {
177
176
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) {
212
211
auto _ = all_t {};
213
212
214
213
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 ());
216
215
217
216
double beta = std::get<0 >(g_nr.mesh ()).domain ().beta ;
218
217
@@ -276,7 +275,7 @@ CPP2PY_IGNORE
276
275
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) {
277
276
278
277
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 ());
280
279
281
280
double beta = fmesh.domain ().beta ;
282
281
@@ -347,7 +346,7 @@ gf<imfreq, tensor_valued<4>> chi0_n_from_e_k_sigma_w_PH(mesh_point<mesh::imfreq>
347
346
348
347
chi_wnk_t chi0q_from_g_wk_PH (int nw, int nn, g_wk_cvt g_wk) {
349
348
350
- auto kmesh = std::get<1 >(g_wk.mesh ());
349
+ auto & kmesh = std::get<1 >(g_wk.mesh ());
351
350
352
351
int nb = g_wk.target ().shape ()[0 ];
353
352
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) {
391
390
auto _ = all_t {};
392
391
auto target = chi_wnk.target ();
393
392
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 ());
398
397
auto rmesh = make_adjoint_mesh (kmesh);
399
398
400
399
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) {
405
404
gf_view (chi_wnr[w0, n0, _]));
406
405
407
406
auto arr = mpi_view (prod{bmesh, fmesh});
408
-
409
407
#pragma omp parallel for shared(kmesh, rmesh)
410
408
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);
414
410
415
411
auto chi_r = make_gf<cyclat>(rmesh, target);
416
412
auto chi_k = make_gf<brzone>(kmesh, target);
@@ -460,10 +456,10 @@ chi_wnk_t chi0q_from_chi0r(chi_wnr_cvt chi_wnr) {
460
456
auto _ = all_t {};
461
457
auto target = chi_wnr.target ();
462
458
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 ());
467
463
auto kmesh = make_adjoint_mesh (rmesh);
468
464
469
465
t_alloc.start ();
@@ -474,17 +470,14 @@ chi_wnk_t chi0q_from_chi0r(chi_wnr_cvt chi_wnr) {
474
470
auto p = _fourier_plan<0 >(gf_const_view (chi_wnr[w0, n0, _]),
475
471
gf_view (chi_wnk[w0, n0, _]));
476
472
477
- auto arr = mpi_view (prod{bmesh, fmesh});
478
-
479
473
t_alloc.stop ();
480
474
t_calc.start ();
481
-
475
+
476
+ auto arr = mpi_view (prod{bmesh, fmesh});
482
477
#pragma omp parallel for
483
478
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
+
488
481
auto chi_r = make_gf<cyclat>(rmesh, target);
489
482
auto chi_k = make_gf<brzone>(kmesh, target);
490
483
@@ -520,20 +513,22 @@ chi_wnk_t chi0q_from_chi0r(chi_wnr_cvt chi_wnr) {
520
513
521
514
chi_wk_t chi0q_sum_nu (chi_wnk_cvt chi_wnk) {
522
515
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
+
527
521
chi_wk_t chi_wk ({wmesh, kmesh}, chi_wnk.target_shape ());
528
522
chi_wk *= 0 .;
529
-
523
+
530
524
double beta = wmesh.domain ().beta ;
531
- auto arr = mpi_view (prod{wmesh, kmesh});
532
525
526
+ auto arr = mpi_view (chi_wk.mesh ());
533
527
#pragma omp parallel for
534
528
for (unsigned int idx = 0 ; idx < arr.size (); idx++) {
535
529
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];
537
532
chi_wk[w, k] /= beta * beta;
538
533
}
539
534
@@ -547,9 +542,12 @@ chi_wk_t chi0q_sum_nu(chi_wnk_cvt chi_wnk) {
547
542
548
543
chi_wk_t chi0q_sum_nu_tail_corr_PH (chi_wnk_cvt chi_wnk) {
549
544
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 ());
553
551
554
552
chi_wk_t chi_wk ({wmesh, qmesh}, chi_wnk.target_shape ());
555
553
@@ -561,16 +559,10 @@ chi_wk_t chi0q_sum_nu_tail_corr_PH(chi_wnk_cvt chi_wnk) {
561
559
// for (auto const &w : wmesh) {
562
560
// for (auto const &q : qmesh) {
563
561
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
567
563
#pragma omp parallel for
568
564
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);
574
566
575
567
auto chi = make_gf<imfreq>(nmesh, chi_target);
576
568
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) {
602
594
603
595
chi_w_t chi0q_sum_nu_q (chi_wnk_cvt chi_wnk) {
604
596
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 ();
608
598
609
599
chi_w_t chi_w (mesh_b, chi_wnk.target_shape ());
610
600
@@ -626,9 +616,7 @@ chiq_t chiq_from_chi0q_and_gamma_PH(chi0q_vt chi0q, g2_iw_vt gamma_ph) {
626
616
627
617
auto _ = all_t{};
628
618
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();
632
620
633
621
auto chiq = make_gf<chiq_t::mesh_t>({mbz, mb, mf, mf}, chi0q.target());
634
622
@@ -663,14 +651,12 @@ chi_kwnn_t chiq_from_chi0q_and_gamma_PH(chi_wnk_cvt chi0_wnk, chi_wnn_cvt gamma_
663
651
664
652
auto _ = all_t {};
665
653
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 ());
669
657
670
658
chi_kwnn_t chi_kwnn ({mbz, mb, mf, mf}, chi0_wnk.target_shape ());
671
659
672
- // for (auto const &k : mbz) {
673
-
674
660
#pragma omp parallel for
675
661
for (unsigned int idx = 0 ; idx < mbz.size (); idx++) {
676
662
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
710
696
mpi::communicator c;
711
697
712
698
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 ());
716
703
717
704
double beta = fmesh.domain ().beta ;
718
705
719
706
chi_kw_t chi_kw ({kmesh, bmesh}, target_shape);
720
707
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
724
709
std::cout << " BSE rank " << c.rank () << " of " << c.size () << " has "
725
710
<< arr.size () << " jobs." << std::endl;
726
711
@@ -729,9 +714,7 @@ chi_kw_t chiq_sum_nu_from_chi0q_and_gamma_PH(chi_wnk_cvt chi0_wnk, chi_wnn_cvt g
729
714
730
715
#pragma omp parallel for
731
716
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);
735
718
736
719
// triqs::utility::timer t_copy_1, t_chi0_nn, t_bse, t_chi_tr, t_copy_2;
737
720
@@ -834,9 +817,9 @@ chiq_sum_nu_from_g_wk_and_gamma_PH(gk_iw_t g_wk, g2_iw_vt gamma_ph_wnn,
834
817
auto _ = all_t {};
835
818
836
819
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 ());
840
823
841
824
double beta = fmesh.domain ().beta ;
842
825
@@ -863,7 +846,7 @@ chiq_sum_nu_from_g_wk_and_gamma_PH(gk_iw_t g_wk, g2_iw_vt gamma_ph_wnn,
863
846
array<std::complex<double >, 4 > tr_chi0 (gamma_ph_wnn.target_shape ());
864
847
array<std::complex<double >, 4 > tr_chi0_tail_corr (gamma_ph_wnn.target_shape ());
865
848
866
- for (auto const &[k, w] : mpi_view (prod{kmesh, bmesh} )) {
849
+ for (auto const &[k, w] : mpi_view (chi_kw. mesh () )) {
867
850
868
851
triqs::utility::timer t_chi0_n, t_chi0_tr, t_bse_1, t_bse_2, t_bse_3;
869
852
@@ -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,
959
942
auto target = gamma_ph_wnn.target ();
960
943
// auto [fmesh_large, kmesh] = g_wk.mesh();
961
944
962
- auto kmesh = e_k.mesh ();
963
- auto fmesh_large = sigma_w.mesh ();
945
+ auto &kmesh = e_k.mesh ();
964
946
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 ());
967
949
968
950
double beta = fmesh.domain ().beta ;
969
951
@@ -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,
990
972
array<std::complex<double >, 4 > tr_chi0 (gamma_ph_wnn.target_shape ());
991
973
array<std::complex<double >, 4 > tr_chi0_tail_corr (gamma_ph_wnn.target_shape ());
992
974
993
- for (auto const &[k, w] : mpi_view (prod{kmesh, bmesh} )) {
975
+ for (auto const &[k, w] : mpi_view (chi_kw. mesh () )) {
994
976
995
977
triqs::utility::timer t_chi0_n, t_chi0_tr, t_bse_1, t_bse_2, t_bse_3;
996
978
@@ -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,
1084
1066
gf<prod<brzone, imfreq>, tensor_valued<4 >>
1085
1067
chiq_sum_nu (chiq_t chiq) {
1086
1068
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 ());
1090
1072
auto chiq_w = make_gf<prod<brzone, imfreq>>(
1091
1073
{mesh_k, mesh_b}, chiq.target ());
1092
1074
@@ -1104,9 +1086,9 @@ chiq_sum_nu(chiq_t chiq) {
1104
1086
1105
1087
gf<imfreq, tensor_valued<4 >> chiq_sum_nu_q (chiq_t chiq) {
1106
1088
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 ());
1110
1092
auto chi_w = make_gf<imfreq>(mesh_b, chiq.target ());
1111
1093
1112
1094
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) {
1119
1101
return chi_w;
1120
1102
}
1121
1103
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
+
1122
1136
} // namespace triqs_tprf
0 commit comments