1 #ifndef CNTR_VIE2_IMPL_H 2 #define CNTR_VIE2_IMPL_H 14 #define CPLX std::complex<T> 59 template <
typename T,
class GG,
int SIZE1>
62 typedef std::complex<T>
cplx;
63 int k =
I.get_k(), k1 = k + 1, k2 = 2 * k1;
64 int ss, sg, n1, l, j, i, p, q, m, j1, j2, size1 = G.size1();
65 cplx *gret, *gtemp, *mm, *qq, *qqj, *stemp, *one, cplx_i, cweight, *diffw;
70 ss = F.element_size();
71 sg = G.element_size();
72 gtemp =
new cplx[k * sg];
73 diffw =
new cplx[k1 + 1];
74 qq =
new cplx[(n + 1) * sg];
76 mm =
new cplx[k * k * sg];
78 element_set<T, SIZE1>(size1, one, 1);
83 assert(G.sig() == F.sig());
85 gret = G.retptr(n, 0);
87 for (i = 0; i < n1; i++)
90 element_set<T, SIZE1>(size1, G.retptr(n, n), Q.retptr(n, n));
92 for (i = 0; i < k * k * sg; i++)
94 for (i = 0; i < k * sg; i++)
96 for (j = 1; j <= k; j++) {
98 element_incr<T, SIZE1>(size1, qq + p * sg, Q.retptr(n, n - j));
99 element_incr<T, SIZE1>(size1, mm + sg * (p + k * p), one);
101 for (l = 0; l <= k; l++) {
102 weight = -h *
I.gregory_weights(j, l);
103 if (n - l >= n - j) {
104 element_set<T, SIZE1>(
105 size1, stemp, F.retptr(n - l, n - j));
107 element_set<T, SIZE1>(size1, stemp, Fcc.retptr(n - j, n - l));
108 element_conj<T, SIZE1>(size1, stemp);
112 element_incr<T, SIZE1>(size1, qq + p * sg, weight, G.retptr(n, n), stemp);
115 element_incr<T, SIZE1>(size1, mm + sg * (p * k + q), -weight, stemp);
119 element_linsolve_left<T, SIZE1>(size1, k, gtemp, mm, qq);
120 for (j = 1; j <= k; j++)
121 element_set<T, SIZE1>(size1, G.retptr(n, n - j), gtemp + (j - 1) * sg);
124 for (i = 0; i < sg * (n + 1); i++)
126 for (m = n - k; m <= n; m++) {
127 weight = -
I.gregory_omega(n - m);
128 gret = G.retptr(n, m);
129 sret = F.retptr(m, 0);
130 for (j = 0; j <= n - k2; j++) {
131 element_incr<T, SIZE1>(size1, qq + j * sg, -
I.gregory_weights(n - j, n - m),
132 gret, F.retptr(m, j));
135 j1 = (n - k2 + 1 < 0 ? 0 : n - k2 + 1);
136 for (j = j1; j < n - k; j++) {
137 weight =
I.gregory_weights(n - j, n - m);
138 element_incr<T, SIZE1>(size1, qq + j * sg, -
I.gregory_weights(n - j, n - m),
139 gret, F.retptr(m, j));
144 w0 = -h *
I.gregory_omega(0);
145 for (l = k + 1; l <= n; l++) {
149 for (i = 0; i < sg; i++) {
152 element_set<T, SIZE1>(size1, stemp, F.retptr(j, j));
153 for (i = 0; i < sg; i++)
154 mm[i] = one[i] - w0 * stemp[i];
155 element_incr<T, SIZE1>(size1, qqj, Q.retptr(n, j));
156 element_linsolve_left<T, SIZE1>(size1, G.retptr(n, j), mm, qqj);
159 gret = G.retptr(n, j);
160 sret = F.retptr(j, 0);
161 for (j2 = 0; j2 < j - k; j2++) {
162 element_incr<T, SIZE1>(size1, qq + j2 * sg, -
I.gregory_weights(n - j2, n - j),
166 j1 = (j - k < 0 ? 0 : j - k);
167 for (j2 = j1; j2 < j; j2++) {
168 weight = -
I.gregory_omega(j - j2);
169 element_incr<T, SIZE1>(size1, qq + j2 * sg, -
I.gregory_weights(n - j2, n - j),
214 template <
typename T,
class GG,
int SIZE1>
216 typedef std::complex<T>
cplx;
217 int k =
I.get_k(), k1 = k + 1;
218 int sg, l, n, j, p, q, i, dim, size1 = G.size1();
219 cplx ih, *gtemp, *mm, *qq, *stemp, minusi, *one;
222 sg = G.element_size();
225 assert(G.sig() == F.sig());
228 qq =
new cplx[k1 * sg];
229 mm =
new cplx[k1 * k1 * sg];
231 gtemp =
new cplx[k1 * sg];
232 stemp =
new cplx[sg];
234 element_set<T, SIZE1>(size1, one, 1.0);
235 minusi =
cplx(0, -1);
238 for (n = 0; n <= k; n++)
239 element_set<T, SIZE1>(size1, G.retptr(n, n), Q.retptr(n, n));
241 for (j = 0; j < k; j++) {
243 for (i = 0; i < k * sg; i++)
245 for (i = 0; i < k * k * sg; i++)
248 for (n = j + 1; n <= k; n++) {
250 element_incr<T, SIZE1>(size1, qq + p * sg, Q.retptr(n, j));
251 for (l = 0; l <= k; l++) {
254 element_conj<T, SIZE1>(size1, gtemp, G.retptr(j, l));
255 element_smul<T, SIZE1>(size1, gtemp, -1);
256 element_set_zero<T, SIZE1>(size1, stemp);
257 element_incr<T, SIZE1>(size1, stemp, F.retptr(n, l), gtemp);
258 for (i = 0; i < sg; i++)
259 qq[p * sg + i] += -h *
I.poly_integration(j, n, l) * stemp[i];
261 for (i = 0; i < sg; i++)
262 mm[sg * (p * dim + q) + i] = 0.0;
264 for (i = 0; i < sg; i++) {
265 mm[sg * (p * dim + q) + i] += one[i];
268 weight = -h *
I.poly_integration(j, n, l);
270 element_set<T, SIZE1>(size1, stemp, F.retptr(n, l));
272 element_set<T, SIZE1>(size1, stemp, Fcc.retptr(l, n));
273 element_conj<T, SIZE1>(size1, stemp);
276 for (i = 0; i < sg; i++)
277 mm[sg * (p * dim + q) + i] -= weight * stemp[i];
281 element_linsolve_right<T, SIZE1>(size1, dim, gtemp, mm, qq);
282 for (n = j + 1; n <= k; n++) {
284 element_set<T, SIZE1>(size1, G.retptr(n, j), gtemp + p * sg);
304 template <
typename T,
class GG,
int SIZE1>
305 void vie2_mat_fourier_dispatch(GG &G, GG &F, GG &Fcc, GG &Q, T beta,
int pcf = 20,
int order = 3) {
306 typedef std::complex<T>
cplx;
307 cplx *fmdft, *fiomn, *qiomn, *qiomn1, *qmdft, *qmasy, *z1, *z2, *z3, *zinv, *one;
309 int ntau, m, r, p, m2, sig, size1 = G.size1(), l, sg, ss, matsub_one;
313 assert(G.ntau() == F.ntau());
315 assert(sig == -1 || sig == 1);
316 assert(G.sig() == F.sig());
317 sg = G.element_size();
318 ss = F.element_size();
322 matsub_one = (sig == -1 ? 1.0 : 0.0);
326 std::cerr <<
"matsubara_inverse: ntau odd" << std::endl;
330 xmat =
new cplx[(ntau + 1) * sg];
331 fmdft =
new cplx[(ntau + 1) * sg];
332 qmdft =
new cplx[(ntau + 1) * sg];
333 expfac =
new cplx[ntau + 1];
334 qmasy =
new cplx[sg];
339 fiomn =
new cplx[sg];
340 qiomn =
new cplx[sg];
341 qiomn1 =
new cplx[sg];
343 element_set<T, SIZE1>(size1, one, 1.0);
350 element_set<T, SIZE1>(size1, qmasy, Q.matptr(0));
351 element_smul<T, SIZE1>(size1, qmasy, -1.0);
352 element_set<T, SIZE1>(size1, z1, Q.matptr(ntau));
353 element_smul<T, SIZE1>(size1, z1, sig);
354 element_incr<T, SIZE1>(size1, qmasy, z1);
361 set_first_order_tail<T, SIZE1>(xmat, qmasy, beta, sg, ntau, sig, size1);
366 matsubara_dft<T, GG, SIZE1>(fmdft, F, sig);
367 matsubara_dft<T, GG, SIZE1>(qmdft, Q, sig);
371 for (p = -pcf; p <= pcf; p++) {
375 int m_low = 0, m_high = 0;
377 m_high = (p < 0 ? 0 : 1);
378 m_low = (p > 0 ? -1 : 0);
382 for (m = -m2 - m_low; m <= m2 - 1 + m_high; m++) {
385 omn = (2 * (m + p * ntau) + matsub_one) * PI /
388 matsubara_ft<T, GG, SIZE1>(fiomn, m + p * ntau, F, fmdft, sig, beta, order);
389 matsubara_ft<T, GG, SIZE1>(qiomn, m + p * ntau, Q, qmdft, sig, beta, order);
393 element_set<T, SIZE1>(size1, z3, qmasy);
396 if (sig == 1 && m + p * ntau == 0)
397 element_smul<T, SIZE1>(size1, z3,
cplx(0.0, 0.0));
399 element_smul<T, SIZE1>(size1, z3,
cplx(0.0, -1.0 / omn));
402 for (l = 0; l < sg; l++)
403 qiomn1[l] = qiomn[l] - z3[l];
406 for (l = 0; l < sg; l++)
407 z1[l] = fiomn[l] + one[l];
409 element_mult<T, SIZE1>(size1, z2, fiomn, z3);
413 for (l = 0; l < sg; l++)
414 z2[l] = qiomn1[l] - z2[l];
417 element_inverse<T, SIZE1>(size1, zinv, z1);
418 element_mult<T, SIZE1>(size1, z1, zinv, z2);
419 element_smul<T, SIZE1>(size1, z1, 1.0 / beta);
427 for (r = 0; r <= ntau; r++) {
429 double arg = omn * r * dtau;
430 std::complex<double> expfactor =
cplx(cos(arg), -sin(arg));
431 element_set<T, SIZE1>(size1, z2, z1);
432 element_smul<T, SIZE1>(size1, z2, expfactor);
433 element_incr<T, SIZE1>(size1, xmat + r * sg, z2);
439 for (r = 0; r <= ntau; r++)
440 element_set<T, SIZE1>(size1, G.matptr(r), xmat + r * sg);
459 template <
typename T,
class GG,
int SIZE1>
460 void vie2_mat_fixpoint_dispatch(GG &G, GG &F, GG &Fcc, GG &Q, T beta,
463 int fixpoint, ntau = G.ntau(), size1 = G.size1(), r;
465 vie2_mat_fourier_dispatch<T, GG, SIZE1>(G, F, Fcc, Q, beta, pcf, order);
468 GG Qn(-1, ntau, size1, Q.sig()), dG(-1, ntau, size1, G.sig());
469 for (fixpoint = 0; fixpoint < nfixpoint; fixpoint++) {
470 convolution_matsubara(Qn, F, G,
I, beta);
471 for (r = 0; r <= ntau; r++) {
472 element_incr<T, SIZE1>(size1, Qn.matptr(r), G.matptr(r));
473 element_incr<T, SIZE1>(size1, Qn.matptr(r), -1.0, Q.matptr(r));
475 vie2_mat_fourier_dispatch<T, GG, SIZE1>(dG, F, Fcc, Qn, beta, pcf, order);
476 for (r = 0; r <= ntau; r++) {
477 element_incr<T, SIZE1>(size1, G.matptr(r), -1.0, dG.matptr(r));
485 template <
typename T,
class GG,
int SIZE1>
486 void vie2_mat_steep_dispatch(GG &G, GG &F, GG &Fcc, GG &Q, T beta,
489 int iter, ntau = G.ntau(), size1 = G.size1(), r;
490 std::complex<T> *temp =
new std::complex<T>[size1 * size1];
491 std::complex<T> *Rcc =
new std::complex<T>[size1 * size1];
492 std::complex<T> *Pcc =
new std::complex<T>[size1 * size1];
494 vie2_mat_fourier_dispatch<T, GG, SIZE1>(G, F, Fcc, Q, beta, pcf, order);
497 double alpha,c1,c2,err,rsold,rsnew,weight;
498 GG R(-1, ntau, size1, Q.sig()), AR(-1, ntau, size1, Q.sig());
499 GG P(-1, ntau, size1, Q.sig()), AP(-1, ntau, size1, Q.sig());
500 GG C1(-1, ntau, size1, Q.sig());
501 GG C2(-1, ntau, size1, Q.sig());
504 convolution_matsubara(C1, F, G,
I, beta);
505 convolution_matsubara(C2, G, Fcc,
I, beta);
506 for (r = 0; r <= ntau; r++) {
507 element_set<T, SIZE1>(size1, R.matptr(r), C1.matptr(r));
508 element_incr<T, SIZE1>(size1, R.matptr(r), 1.0, C2.matptr(r));
509 element_smul<T, SIZE1>(size1, R.matptr(r), 0.5);
510 element_incr<T, SIZE1>(size1, R.matptr(r), 1.0, G.matptr(r));
511 element_incr<T, SIZE1>(size1, R.matptr(r), -1.0, Q.matptr(r));
514 for (r=0; r <= ntau; r++)
515 element_set<T, SIZE1>(size1, P.matptr(r), R.matptr(r));
520 for (r = 0; r <= ntau; r++) {
522 weight =
I.gregory_omega(r);
523 }
else if(r >= ntau -
I.get_k()) {
524 weight =
I.gregory_omega(ntau-r);
528 element_conj<T, SIZE1>(size1, Rcc, R.matptr(r));
529 element_mult<T, SIZE1>(size1, temp, Rcc, R.matptr(r));
530 for(
int s=0; s<size1*size1; s++)
531 rsold += weight * (temp[s]).real();
536 for (iter = 0; iter < maxiter; iter++) {
539 convolution_matsubara(C1, F, P,
I, beta);
540 convolution_matsubara(C2, P, Fcc,
I, beta);
541 for (r = 0; r <= ntau; r++) {
542 element_set<T, SIZE1>(size1, AP.matptr(r), C1.matptr(r));
543 element_incr<T, SIZE1>(size1, AP.matptr(r), 1.0, C2.matptr(r));
544 element_smul<T, SIZE1>(size1, AP.matptr(r), 0.5);
545 element_incr<T, SIZE1>(size1, AP.matptr(r), 1.0, P.matptr(r));
550 for (r = 0; r <= ntau; r++) {
552 weight =
I.gregory_omega(r);
553 }
else if(r >= ntau -
I.get_k()) {
554 weight =
I.gregory_omega(ntau-r);
558 element_conj<T, SIZE1>(size1, Pcc, P.matptr(r));
559 element_mult<T, SIZE1>(size1, temp, Pcc, AP.matptr(r));
560 for(
int s=0; s<size1*size1; s++)
561 c2 += weight * (temp[s]).real();
566 for (r = 0; r <= ntau; r++) {
567 element_incr<T, SIZE1>(size1, G.matptr(r), alpha, P.matptr(r));
568 element_incr<T, SIZE1>(size1, R.matptr(r), -alpha, AP.matptr(r));
572 for (r = 0; r <= ntau; r++) {
574 weight =
I.gregory_omega(r);
575 }
else if(r >= ntau -
I.get_k()) {
576 weight =
I.gregory_omega(ntau-r);
580 element_conj<T, SIZE1>(size1, Rcc, R.matptr(r));
581 element_mult<T, SIZE1>(size1, temp, Rcc, R.matptr(r));
582 for(
int s=0; s<size1*size1; s++)
583 rsnew += weight * (temp[s]).real();
586 for (r = 0; r <= ntau; r++) {
587 element_set<T, SIZE1>(size1, temp, R.matptr(r));
588 element_incr<T, SIZE1>(size1, temp, rsnew/rsold, P.matptr(r));
589 element_set<T, SIZE1>(size1, P.matptr(r), temp);
594 if (sqrt(rsold) < maxerr)
break;
644 template <
typename T,
class GG,
int SIZE1>
647 typedef std::complex<T>
cplx;
649 int sg, n1, l, j, ntau, size1 = G.size1();
650 cplx *gtv, cweight, ih, *mm, *qq, *stemp, minusi, *one;
653 sg = G.element_size();
659 assert(G.sig() == F.sig());
664 stemp =
new cplx[sg];
665 element_set<T, SIZE1>(size1, one, 1.0);
668 n1 = (ntau + 1) * sg;
669 for (l = 0; l < n1; l++)
672 convolution_timestep_tv<T, herm_matrix<T>, SIZE1>(n, G, F, Fcc, G, G,
I, beta,
677 element_set<T, SIZE1>(size1, stemp, F.retptr(n, n));
678 weight = h *
I.gregory_weights(n, 0);
679 for (l = 0; l < sg; l++)
680 mm[l] = one[l] + weight * stemp[l];
681 for (j = 0; j <= ntau; j++) {
682 for (l = 0; l < sg; l++)
683 qq[l] = -G.tvptr(n, j)[l] + Q.tvptr(n, j)[l];
684 element_linsolve_right<T, SIZE1>(size1, G.tvptr(n, j), mm, qq);
726 template <
typename T,
class GG,
int SIZE1>
729 typedef std::complex<T>
cplx;
730 int k =
I.get_k(), k1 = k + 1;
731 int sg, l, m, j, ntau, p, q, n, sig, size1 = G.size1();
732 cplx cweight, *mm, *qq, *stemp, *one, *gtemp;
735 sg = G.element_size();
742 assert(F.ntau() == ntau);
743 assert(G.sig() == F.sig());
746 qq =
new cplx[k1 * sg];
747 mm =
new cplx[k1 * k1 * sg];
748 stemp =
new cplx[sg];
749 gtemp =
new cplx[k1 * sg];
750 element_set<T, SIZE1>(size1, one, 1.0);
753 for (n = 0; n <= k; n++) {
754 for (m = 0; m <= ntau; m++) {
755 matsubara_integral_2<T, SIZE1>(size1, m, ntau, gtemp, F.tvptr(n, 0), G.matptr(0),
757 for (l = 0; l < sg; l++)
758 G.tvptr(n, m)[l] = -dtau * gtemp[l];
762 for (m = 0; m <= ntau; m++) {
763 for (l = 0; l < k1 * k1 * sg; l++)
765 for (l = 0; l < k1 * sg; l++)
770 for (n = 0; n <= k; n++) {
772 element_incr<T, SIZE1>(size1, mm + sg * (n * k1 + n), one);
774 for (j = 0; j <= k; j++) {
775 cweight = h *
I.gregory_weights(n, j);
777 element_set<T, SIZE1>(size1, stemp, F.retptr(n, j));
779 element_set<T, SIZE1>(size1, stemp, Fcc.retptr(j, n));
780 element_conj<T, SIZE1>(size1, stemp);
781 element_smul<T, SIZE1>(size1, stemp, -1);
783 for (l = 0; l < sg; l++)
784 mm[sg * (n * k1 + j) + l] += cweight * stemp[l];
787 element_incr<T, SIZE1>(size1, qq + n * sg, G.tvptr(n, m));
788 element_incr<T, SIZE1>(size1, qq + n * sg, Q.tvptr(n, m));
790 element_linsolve_right<T, SIZE1>(size1, k1, gtemp, mm,
793 for (n = 0; n <= k; n++)
794 element_set<T, SIZE1>(size1, G.tvptr(n, m), gtemp + n * sg);
846 template <
typename T,
class GG,
int SIZE1>
849 typedef std::complex<T>
cplx;
850 int k =
I.get_k(), k1 = k + 1;
851 int sg, n1, l, m, j, ntau, p, q, sig, size1 = G.size1();
852 cplx *gles, cweight, ih, *mm, *qq, *stemp, cplx_i =
cplx(0, 1), *one, *gtemp, *qtemp;
854 n1 = (n > k ? n : k);
855 sg = G.element_size();
859 assert(F.nt() >= n1);
860 assert(G.nt() >= n1);
861 assert(G.sig() == F.sig());
864 qq =
new cplx[k1 * sg];
865 mm =
new cplx[k1 * k1 * sg];
866 gtemp =
new cplx[sg];
867 qtemp =
new cplx[sg];
868 stemp =
new cplx[sg];
869 gles =
new cplx[(n1 + 1) * sg];
870 for (j = 0; j <= n1; j++)
871 element_set_zero<T, SIZE1>(size1, gles + j * sg);
872 element_set<T, SIZE1>(size1, one, 1.0);
877 convolution_timestep_les_tvvt<T, GG, SIZE1>(n, gles, G, F, Fcc, G, G,
I, beta,
879 convolution_timestep_les_lesadv<T, GG, SIZE1>(n, gles, G, F, Fcc, G, G,
I, beta, h);
880 for (j = 0; j <= n1; j++)
881 element_smul<T, SIZE1>(size1, gles + j * sg, -1.0);
888 for (l = 0; l < k1 * k1 * sg; l++)
890 for (l = 0; l < k1 * sg; l++)
892 for (j = 0; j <= k; j++) {
895 element_incr<T, SIZE1>(size1, qq + p * sg, Q.lesptr(j, n));
897 element_conj<T, SIZE1>(size1, qtemp, Q.lesptr(n, j));
898 element_smul<T, SIZE1>(size1, qtemp, -1.0);
899 element_incr<T, SIZE1>(size1, qq + p * sg, qtemp);
903 element_incr<T, SIZE1>(size1, qq + p * sg, gles + j * sg);
905 element_incr<T, SIZE1>(size1, mm + sg * (p * k1 + p), one);
907 for (m = 0; m <= k; m++) {
908 cweight = -h *
I.gregory_weights(j, m);
910 element_incr<T, SIZE1>(size1, qq + p * sg, cweight, F.retptr(j, 0),
916 element_set<T, SIZE1>(size1, stemp, F.retptr(j, m));
918 element_set<T, SIZE1>(size1, stemp, Fcc.retptr(m, j));
919 element_conj<T, SIZE1>(size1, stemp);
920 element_smul<T, SIZE1>(size1, stemp, -1);
922 for (l = 0; l < sg; l++)
923 mm[sg * (p * k1 + q) + l] += -cweight * stemp[l];
927 element_linsolve_right<T, SIZE1>(size1, k1, gles, mm,
930 for (j = k + 1; j <= n; j++) {
931 element_set_zero<T, SIZE1>(size1, mm);
933 element_set<T, SIZE1>(size1, qq, gles + j * sg);
934 element_incr<T, SIZE1>(size1, qq, Q.lesptr(j, n));
935 element_incr<T, SIZE1>(size1, mm, one);
937 element_set<T, SIZE1>(size1, stemp, F.retptr(j, j));
938 for (l = 0; l < sg; l++)
939 mm[l] += h * stemp[l] *
I.gregory_weights(j, j);
940 for (m = 0; m < j; m++) {
941 cweight = -h *
I.gregory_weights(j, m);
942 element_incr<T, SIZE1>(size1, qq, cweight, F.retptr(j, m), gles + m * sg);
944 element_linsolve_right<T, SIZE1>(size1, gles + j * sg, mm, qq);
947 for (j = 0; j <= n; j++)
948 element_set<T, SIZE1>(size1, G.lesptr(j, n), gles + j * sg);
992 template <
typename T,
class GG,
int SIZE1>
995 int k =
I.get_k(), n;
996 for (n = 0; n <= k; n++)
997 vie2_timestep_les<T, GG, SIZE1>(n, G, F, Fcc, Q,
I, beta, h);
1029 template <
typename T>
1030 void vie2_mat_fourier(herm_matrix<T> &G, herm_matrix<T> &F, herm_matrix<T> &Fcc, herm_matrix<T> &Q,
1031 T beta,
int order) {
1032 int size1 = G.size1(), pcf = 20;
1033 assert(G.size1() == F.size1());
1034 assert(G.ntau() == F.ntau());
1037 vie2_mat_fourier_dispatch<T, herm_matrix<T>, 1>(G, F, Fcc, Q, beta, pcf, order);
1040 vie2_mat_fourier_dispatch<T, herm_matrix<T>, 2>(G, F, Fcc, Q, beta, pcf, order);
1043 vie2_mat_fourier_dispatch<T, herm_matrix<T>, 3>(G, F, Fcc, Q, beta, pcf, order);
1046 vie2_mat_fourier_dispatch<T, herm_matrix<T>, 4>(G, F, Fcc, Q, beta, pcf, order);
1049 vie2_mat_fourier_dispatch<T, herm_matrix<T>, 5>(G, F, Fcc, Q, beta, pcf, order);
1052 vie2_mat_fourier_dispatch<T, herm_matrix<T>, 8>(G, F, Fcc, Q, beta, pcf, order);
1055 vie2_mat_fourier_dispatch<T, herm_matrix<T>, LARGESIZE>(G, F, Fcc, Q, beta, pcf, order);
1090 template <
typename T>
1091 void vie2_mat_fixpoint(herm_matrix<T> &G, herm_matrix<T> &F, herm_matrix<T> &Fcc,
1093 int size1 = G.size1(), pcf = 5, order = 3;
1094 assert(G.size1() == F.size1());
1095 assert(G.ntau() == F.ntau());
1098 vie2_mat_fixpoint_dispatch<T, herm_matrix<T>, 1>(G, F, Fcc, Q, beta,
I, nfixpoint, pcf,
1102 vie2_mat_fixpoint_dispatch<T, herm_matrix<T>, 2>(G, F, Fcc, Q, beta,
I, nfixpoint, pcf,
1106 vie2_mat_fixpoint_dispatch<T, herm_matrix<T>, 3>(G, F, Fcc, Q, beta,
I, nfixpoint, pcf,
1110 vie2_mat_fixpoint_dispatch<T, herm_matrix<T>, 4>(G, F, Fcc, Q, beta,
I, nfixpoint, pcf,
1114 vie2_mat_fixpoint_dispatch<T, herm_matrix<T>, 5>(G, F, Fcc, Q, beta,
I, nfixpoint, pcf,
1118 vie2_mat_fixpoint_dispatch<T, herm_matrix<T>, 8>(G, F, Fcc, Q, beta,
I, nfixpoint, pcf,
1122 vie2_mat_fixpoint_dispatch<T, herm_matrix<T>, LARGESIZE>(G, F, Fcc, Q, beta,
I, nfixpoint,
1160 template <
typename T>
1161 void vie2_mat_steep(herm_matrix<T> &G, herm_matrix<T> &F, herm_matrix<T> &Fcc,
1163 int size1 = G.size1(), pcf = 3, order = 3;
1164 assert(G.size1() == F.size1());
1165 assert(G.ntau() == F.ntau());
1168 vie2_mat_steep_dispatch<T, herm_matrix<T>, 1>(G, F, Fcc, Q, beta,
I, maxiter, tol, pcf,
1172 vie2_mat_steep_dispatch<T, herm_matrix<T>, 2>(G, F, Fcc, Q, beta,
I, maxiter, tol, pcf,
1176 vie2_mat_steep_dispatch<T, herm_matrix<T>, 3>(G, F, Fcc, Q, beta,
I, maxiter, tol, pcf,
1180 vie2_mat_steep_dispatch<T, herm_matrix<T>, 4>(G, F, Fcc, Q, beta,
I, maxiter, tol, pcf,
1184 vie2_mat_steep_dispatch<T, herm_matrix<T>, 5>(G, F, Fcc, Q, beta,
I, maxiter, tol, pcf,
1188 vie2_mat_steep_dispatch<T, herm_matrix<T>, 8>(G, F, Fcc, Q, beta,
I, maxiter, tol, pcf,
1192 vie2_mat_steep_dispatch<T, herm_matrix<T>, LARGESIZE>(G, F, Fcc, Q, beta,
I, maxiter, tol,
1228 template <
typename T>
1229 void vie2_mat(herm_matrix<T> &G, herm_matrix<T> &F, herm_matrix<T> &Fcc,
1232 const int fourier_order=3;
1237 case CNTR_MAT_FOURIER:
1238 vie2_mat_fourier(G, F, Fcc, Q, beta, fourier_order);
1242 vie2_mat_steep(G, F, Fcc, Q, beta,
I, maxiter, tol);
1246 vie2_mat_fixpoint(G, F, Fcc, Q, beta,
I, maxiter);
1282 template <
typename T>
1284 herm_matrix<T> &Q, T beta,
const int SolveOrder,
const int method){
1286 const int fourier_order=3;
1291 case CNTR_MAT_FOURIER:
1292 vie2_mat_fourier(G, F, Fcc, Q, beta, fourier_order);
1296 vie2_mat_steep(G, F, Fcc, Q, beta, integration::I<T>(SolveOrder), maxiter, tol);
1300 vie2_mat_fixpoint(G, F, Fcc, Q, beta, integration::I<T>(SolveOrder), maxiter);
1337 template <
typename T>
1338 void vie2_start(herm_matrix<T> &G, herm_matrix<T> &F, herm_matrix<T> &Fcc, herm_matrix<T> &Q,
1340 int size1 = G.size1(), k =
I.k();
1341 assert(G.size1() == F.size1());
1342 assert(G.ntau() == F.ntau());
1343 assert(G.nt() >= k);
1344 assert(F.nt() >= k);
1345 assert(G.size1() == Fcc.size1());
1346 assert(G.ntau() == Fcc.ntau());
1347 assert(Fcc.nt() >= k);
1351 vie2_start_ret<T, herm_matrix<T>, 1>(G, F, Fcc, Q,
I, h);
1352 vie2_start_tv<T, herm_matrix<T>, 1>(G, F, Fcc, Q,
I, beta, h);
1353 vie2_start_les<T, herm_matrix<T>, 1>(G, F, Fcc, Q,
I, beta, h);
1356 vie2_start_ret<T, herm_matrix<T>, 2>(G, F, Fcc, Q,
I, h);
1357 vie2_start_tv<T, herm_matrix<T>, 2>(G, F, Fcc, Q,
I, beta, h);
1358 vie2_start_les<T, herm_matrix<T>, 2>(G, F, Fcc, Q,
I, beta, h);
1361 vie2_start_ret<T, herm_matrix<T>, 3>(G, F, Fcc, Q,
I, h);
1362 vie2_start_tv<T, herm_matrix<T>, 3>(G, F, Fcc, Q,
I, beta, h);
1363 vie2_start_les<T, herm_matrix<T>, 3>(G, F, Fcc, Q,
I, beta, h);
1366 vie2_start_ret<T, herm_matrix<T>, 4>(G, F, Fcc, Q,
I, h);
1367 vie2_start_tv<T, herm_matrix<T>, 4>(G, F, Fcc, Q,
I, beta, h);
1368 vie2_start_les<T, herm_matrix<T>, 4>(G, F, Fcc, Q,
I, beta, h);
1371 vie2_start_ret<T, herm_matrix<T>, 5>(G, F, Fcc, Q,
I, h);
1372 vie2_start_tv<T, herm_matrix<T>, 5>(G, F, Fcc, Q,
I, beta, h);
1373 vie2_start_les<T, herm_matrix<T>, 5>(G, F, Fcc, Q,
I, beta, h);
1376 vie2_start_ret<T, herm_matrix<T>, 8>(G, F, Fcc, Q,
I, h);
1377 vie2_start_tv<T, herm_matrix<T>, 8>(G, F, Fcc, Q,
I, beta, h);
1378 vie2_start_les<T, herm_matrix<T>, 8>(G, F, Fcc, Q,
I, beta, h);
1381 vie2_start_ret<T, herm_matrix<T>, LARGESIZE>(G, F, Fcc, Q,
I, h);
1382 vie2_start_tv<T, herm_matrix<T>, LARGESIZE>(G, F, Fcc, Q,
I, beta, h);
1383 vie2_start_les<T, herm_matrix<T>, LARGESIZE>(G, F, Fcc, Q,
I, beta, h);
1419 template <
typename T>
1421 T beta, T h,
const int SolveOrder) {
1422 int size1 = G.
size1();
1425 assert(G.
nt() >= SolveOrder);
1426 assert(F.
nt() >= SolveOrder);
1429 assert(Fcc.
nt() >= SolveOrder);
1433 vie2_start_ret<T, herm_matrix<T>, 1>(G, F, Fcc, Q, integration::I<T>(SolveOrder), h);
1434 vie2_start_tv<T, herm_matrix<T>, 1>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1435 vie2_start_les<T, herm_matrix<T>, 1>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1438 vie2_start_ret<T, herm_matrix<T>, 2>(G, F, Fcc, Q, integration::I<T>(SolveOrder), h);
1439 vie2_start_tv<T, herm_matrix<T>, 2>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1440 vie2_start_les<T, herm_matrix<T>, 2>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1443 vie2_start_ret<T, herm_matrix<T>, 3>(G, F, Fcc, Q, integration::I<T>(SolveOrder), h);
1444 vie2_start_tv<T, herm_matrix<T>, 3>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1445 vie2_start_les<T, herm_matrix<T>, 3>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1448 vie2_start_ret<T, herm_matrix<T>, 4>(G, F, Fcc, Q, integration::I<T>(SolveOrder), h);
1449 vie2_start_tv<T, herm_matrix<T>, 4>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1450 vie2_start_les<T, herm_matrix<T>, 4>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1453 vie2_start_ret<T, herm_matrix<T>, 5>(G, F, Fcc, Q, integration::I<T>(SolveOrder), h);
1454 vie2_start_tv<T, herm_matrix<T>, 5>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1455 vie2_start_les<T, herm_matrix<T>, 5>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1458 vie2_start_ret<T, herm_matrix<T>, 8>(G, F, Fcc, Q, integration::I<T>(SolveOrder), h);
1459 vie2_start_tv<T, herm_matrix<T>, 8>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1460 vie2_start_les<T, herm_matrix<T>, 8>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1463 vie2_start_ret<T, herm_matrix<T>, LARGESIZE>(G, F, Fcc, Q, integration::I<T>(SolveOrder), h);
1464 vie2_start_tv<T, herm_matrix<T>, LARGESIZE>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1465 vie2_start_les<T, herm_matrix<T>, LARGESIZE>(G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1504 template <
typename T>
1505 void vie2_timestep(
int n, herm_matrix<T> &G, herm_matrix<T> &F, herm_matrix<T> &Fcc,
1507 int size1 = G.size1(), k =
I.k();
1508 assert(G.size1() == F.size1());
1509 assert(G.size1() == Fcc.size1());
1510 assert(G.ntau() == F.ntau());
1511 assert(G.ntau() == Fcc.ntau());
1512 assert(G.nt() >= n);
1513 assert(F.nt() >= n);
1514 assert(Fcc.nt() >= n);
1517 vie2_mat(G, F, Fcc, Q, beta,
I, matsubara_method);
1519 vie2_start(G,F,Fcc,Q,integration::I<T>(n),beta,h);
1523 vie2_timestep_ret<T, herm_matrix<T>, 1>(n, G, Fcc, F, Q,
I, h);
1524 vie2_timestep_tv<T, herm_matrix<T>, 1>(n, G, F, Fcc, Q,
I, beta, h);
1525 vie2_timestep_les<T, herm_matrix<T>, 1>(n, G, F, Fcc, Q,
I, beta, h);
1528 vie2_timestep_ret<T, herm_matrix<T>, 2>(n, G, Fcc, F, Q,
I, h);
1529 vie2_timestep_tv<T, herm_matrix<T>, 2>(n, G, F, Fcc, Q,
I, beta, h);
1530 vie2_timestep_les<T, herm_matrix<T>, 2>(n, G, F, Fcc, Q,
I, beta, h);
1533 vie2_timestep_ret<T, herm_matrix<T>, 3>(n, G, Fcc, F, Q,
I, h);
1534 vie2_timestep_tv<T, herm_matrix<T>, 3>(n, G, F, Fcc, Q,
I, beta, h);
1535 vie2_timestep_les<T, herm_matrix<T>, 3>(n, G, F, Fcc, Q,
I, beta, h);
1538 vie2_timestep_ret<T, herm_matrix<T>, 4>(n, G, Fcc, F, Q,
I, h);
1539 vie2_timestep_tv<T, herm_matrix<T>, 4>(n, G, F, Fcc, Q,
I, beta, h);
1540 vie2_timestep_les<T, herm_matrix<T>, 4>(n, G, F, Fcc, Q,
I, beta, h);
1543 vie2_timestep_ret<T, herm_matrix<T>, 5>(n, G, Fcc, F, Q,
I, h);
1544 vie2_timestep_tv<T, herm_matrix<T>, 5>(n, G, F, Fcc, Q,
I, beta, h);
1545 vie2_timestep_les<T, herm_matrix<T>, 5>(n, G, F, Fcc, Q,
I, beta, h);
1548 vie2_timestep_ret<T, herm_matrix<T>, 8>(n, G, Fcc, F, Q,
I, h);
1549 vie2_timestep_tv<T, herm_matrix<T>, 8>(n, G, F, Fcc, Q,
I, beta, h);
1550 vie2_timestep_les<T, herm_matrix<T>, 8>(n, G, F, Fcc, Q,
I, beta, h);
1553 vie2_timestep_ret<T, herm_matrix<T>, LARGESIZE>(n, G, Fcc, F, Q,
I, h);
1554 vie2_timestep_tv<T, herm_matrix<T>, LARGESIZE>(n, G, F, Fcc, Q,
I, beta, h);
1555 vie2_timestep_les<T, herm_matrix<T>, LARGESIZE>(n, G, F, Fcc, Q,
I, beta, h);
1596 template <
typename T>
1598 herm_matrix<T> &Q, T beta, T h,
const int SolveOrder,
const int matsubara_method) {
1599 int size1 = G.
size1();
1604 assert(G.
nt() >= n);
1605 assert(F.
nt() >= n);
1606 assert(Fcc.
nt() >= n);
1609 vie2_mat(G, F, Fcc, Q, beta, integration::I<T>(SolveOrder), matsubara_method);
1610 }
else if(n<=SolveOrder){
1611 vie2_start(G,F,Fcc,Q,integration::I<T>(n),beta,h);
1615 vie2_timestep_ret<T, herm_matrix<T>, 1>(n, G, Fcc, F, Q, integration::I<T>(SolveOrder), h);
1616 vie2_timestep_tv<T, herm_matrix<T>, 1>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1617 vie2_timestep_les<T, herm_matrix<T>, 1>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1620 vie2_timestep_ret<T, herm_matrix<T>, 2>(n, G, Fcc, F, Q, integration::I<T>(SolveOrder), h);
1621 vie2_timestep_tv<T, herm_matrix<T>, 2>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1622 vie2_timestep_les<T, herm_matrix<T>, 2>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1625 vie2_timestep_ret<T, herm_matrix<T>, 3>(n, G, Fcc, F, Q, integration::I<T>(SolveOrder), h);
1626 vie2_timestep_tv<T, herm_matrix<T>, 3>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1627 vie2_timestep_les<T, herm_matrix<T>, 3>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1630 vie2_timestep_ret<T, herm_matrix<T>, 4>(n, G, Fcc, F, Q, integration::I<T>(SolveOrder), h);
1631 vie2_timestep_tv<T, herm_matrix<T>, 4>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1632 vie2_timestep_les<T, herm_matrix<T>, 4>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1635 vie2_timestep_ret<T, herm_matrix<T>, 5>(n, G, Fcc, F, Q, integration::I<T>(SolveOrder), h);
1636 vie2_timestep_tv<T, herm_matrix<T>, 5>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1637 vie2_timestep_les<T, herm_matrix<T>, 5>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1640 vie2_timestep_ret<T, herm_matrix<T>, 8>(n, G, Fcc, F, Q, integration::I<T>(SolveOrder), h);
1641 vie2_timestep_tv<T, herm_matrix<T>, 8>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1642 vie2_timestep_les<T, herm_matrix<T>, 8>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1645 vie2_timestep_ret<T, herm_matrix<T>, LARGESIZE>(n, G, Fcc, F, Q, integration::I<T>(SolveOrder), h);
1646 vie2_timestep_tv<T, herm_matrix<T>, LARGESIZE>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1647 vie2_timestep_les<T, herm_matrix<T>, LARGESIZE>(n, G, F, Fcc, Q, integration::I<T>(SolveOrder), beta, h);
1685 template <
typename T>
1686 void vie2(herm_matrix<T> &G, herm_matrix<T> &F, herm_matrix<T> &Fcc, herm_matrix<T> &Q,
1688 int tstp, k =
I.k();
1689 vie2_mat(G, F, Fcc, Q, beta,
I, matsubara_method);
1691 vie2_start(G, F, Fcc, Q,
I, beta, h);
1692 for (tstp = k + 1; tstp <= G.nt(); tstp++)
1693 vie2_timestep(tstp, G, F, Fcc, Q,
I, beta, h);
1728 template <
typename T>
1730 T beta, T h,
const int SolveOrder,
const int matsubara_method) {
1732 vie2_mat(G, F, Fcc, Q, beta, SolveOrder, matsubara_method);
1734 vie2_start(G, F, Fcc, Q, beta, h, SolveOrder);
1735 for (tstp = SolveOrder + 1; tstp <= G.
nt(); tstp++)
1736 vie2_timestep(tstp, G, F, Fcc, Q, beta, h, SolveOrder);
1778 template <
typename T>
1779 void vie2_timestep_sin(
int n,
herm_matrix<T> &G,
function<T> &Gsin,
herm_matrix<T> &F,
herm_matrix<T> &Fcc,
function<T> &Fsin ,
herm_matrix<T> &Q,
function<T> &Qsin,T beta,T h,
int SolveOrder){
1781 int n1=(n<=SolveOrder && n>=0 ? 0 : n);
1782 int n2=(n<=SolveOrder && n>=0 ? SolveOrder : n);
1787 assert(SolveOrder > 0 && SolveOrder <= 5);
1788 assert(SolveOrder <= 2 * ntau + 2);
1789 assert(ntau == Fcc.
ntau());
1790 assert(ntau == F.
ntau());
1791 assert(ntau == Q.
ntau());
1792 assert(F.
sig()== G.
sig());
1793 assert(Fcc.
sig()== G.
sig());
1794 assert(Q.
sig()== G.
sig());
1795 assert(F.
size1()== size1);
1796 assert(F.
size2()== size1);
1797 assert(Fcc.
size1()== size1);
1798 assert(Fcc.
size2()== size1);
1799 assert(Q.
size1()== size1);
1800 assert(Q.
size2()== size1);
1801 assert(n1 <= F.
nt());
1802 assert(n1 <= Fcc.
nt());
1803 assert(n1 <= G.
nt());
1804 assert(n1 <= Q.
nt());
1808 cntr::herm_matrix<T> tmpF(nt,ntau,size1,sig),tmpFcc(nt,ntau,size1,sig),tmpF1(nt,ntau,size1,sig),tmpQ(nt,ntau,size1,sig);
1809 cdmatrix cdF,cdFinv,cdQ,cdG;
1811 assert(G.
sig()==F.
sig());
1812 assert(G.
nt()==F.
nt());
1813 assert(G.
nt()==Q.
nt());
1815 for(
int n=-1;n<=n2;n++){
1818 cdF=cdF+cdmatrix::Identity(size1,size1);
1819 cdFinv=cdF.inverse();
1821 funFinv.set_value(n,cdFinv);
1830 for(
int n=-1;n<=n2;n++){
1831 tmpF.left_multiply(n,funFinv,1.0);
1832 tmpFcc.right_multiply(n,funFinv,1.0);
1833 tmpQ.left_multiply(n,funFinv,1.0);
1837 for(
int n=-1;n<=n2;n++){
1838 tmpF1.right_multiply(n,Gsin,1.0);
1840 for(
int i=-1;i<=n2;i++){
1843 vie2_timestep(n,G,tmpF,tmpFcc,tmpQ,integration::I<T>(SolveOrder),beta,h);
1849 #if CNTR_USE_OMP == 1 1850 template <
typename T,
class GG,
int SIZE1>
1851 void vie2_timestep_omp_dispatch(
int omp_num_threads,
int tstp, GG &B, CPLX alpha, GG &A,
1852 GG &Acc, CPLX *f0, CPLX *ft, GG &Q,
1855 int ntau = A.ntau();
1856 int size1 = A.size1();
1857 int sc = size1 * size1;
1858 bool func = (ft == NULL ? false :
true);
1859 int n1 = (tstp == -1 || tstp > kt ? tstp : kt);
1861 herm_matrix_timestep<T> Qtstp(tstp, ntau, size1);
1863 Q.get_timestep(tstp, Qtstp);
1864 B.set_timestep_zero(tstp);
1866 ftcc =
new CPLX[sc * n1];
1867 f0cc =
new CPLX[sc];
1868 element_conj<T, SIZE1>(size1, f0cc, f0);
1869 for (
int n = 0; n <= n1; n++)
1870 element_conj<T, SIZE1>(size1, ftcc + n * sc, ft + n * sc);
1876 CPLX *mtemp =
new CPLX[sc];
1877 CPLX *one =
new CPLX[sc];
1880 element_mult<T, SIZE1>(size1, mtemp, A.retptr(tstp, tstp), ft + sc * tstp);
1881 element_smul<T, SIZE1>(size1, mtemp, h * alpha);
1883 element_set<T, SIZE1>(size1, mtemp, A.retptr(tstp, tstp));
1884 element_smul<T, SIZE1>(size1, mtemp, h * alpha);
1887 element_set<T, SIZE1>(size1, one, CPLX(1, 0));
1888 #pragma omp parallel num_threads(omp_num_threads) 1890 int nomp = omp_get_num_threads();
1891 int tid = omp_get_thread_num();
1893 CPLX *mm =
new CPLX[sc];
1895 std::vector<bool> mask_tv, mask_les, mask_ret;
1896 mask_tv = std::vector<bool>(ntau + 1,
false);
1897 mask_ret = std::vector<bool>(tstp + 1,
false);
1898 mask_les = std::vector<bool>(tstp + 1,
false);
1899 for (i = 0; i <= ntau; i++)
1900 if (i % nomp == tid)
1902 for (i = 0; i <= tstp; i++)
1903 if (i % nomp == tid)
1905 for (
int i = 0; i <= tstp; i++)
1907 mask_les[tstp - i] =
true;
1908 mask_les[tstp] =
false;
1911 incr_convolution_ret<T, GG, SIZE1>(tstp, mask_ret, -alpha, Q, A, Acc, ft, B, B,
1913 for (n = 0; n <= tstp; n++) {
1915 wt = (tstp < kt ?
I.poly_integration(n, tstp, tstp)
1916 :
I.gregory_weights(tstp - n, 0));
1917 element_set<T, SIZE1>(size1, mm, one);
1918 element_incr<T, SIZE1>(size1, mm, wt, mtemp);
1919 element_linsolve_right<T, SIZE1>(size1, 1, B.retptr(tstp, n), mm,
1925 incr_convolution_tv<T, GG, SIZE1>(tstp, mask_tv, -alpha, Q, A, Acc, f0, ft, B, B,
1927 for (m = 0; m <= ntau; m++) {
1929 wt =
I.gregory_weights(tstp, tstp);
1930 element_set<T, SIZE1>(size1, mm, one);
1931 element_incr<T, SIZE1>(size1, mm, wt, mtemp);
1932 element_linsolve_right<T, SIZE1>(size1, 1, B.tvptr(tstp, m), mm,
1939 mask_les[tstp] =
false;
1940 incr_convolution_les<T, GG, SIZE1>(tstp, mask_les, -conj(alpha), Q, B, B, f0cc,
1941 ftcc, Acc, A,
I, beta, h);
1942 for (n = 0; n < tstp; n++) {
1944 wt =
I.gregory_weights(tstp, tstp);
1945 element_set<T, SIZE1>(size1, mm, one);
1946 element_incr<T, SIZE1>(size1, mm, wt, mtemp);
1947 element_conj<T, SIZE1>(size1, mm);
1948 element_linsolve_left<T, SIZE1>(size1, 1, B.lesptr(n, tstp), mm,
1956 CPLX *mm =
new CPLX[sc];
1957 std::vector<bool> mask_les;
1960 mask_les = std::vector<bool>(tstp + 1,
false);
1962 incr_convolution_les<T, GG, SIZE1>(tstp, mask_les, -conj(alpha), Q, B, B, f0cc,
1963 ftcc, Acc, A,
I, beta, h);
1964 wt =
I.gregory_weights(tstp, tstp);
1965 element_set<T, SIZE1>(size1, mm, one);
1966 element_incr<T, SIZE1>(size1, mm, wt, mtemp);
1967 element_conj<T, SIZE1>(size1, mm);
1968 element_linsolve_left<T, SIZE1>(size1, 1, B.lesptr(n, tstp), mm,
1979 Q.set_timestep(tstp, Qtstp);
2021 template <
typename T>
2022 void vie2_timestep_omp(
int omp_num_threads,
int tstp, herm_matrix<T> &G, herm_matrix<T> &F,
2024 T beta, T h,
const int matsubara_method) {
2025 int ntau = G.ntau();
2026 int size1 = G.size1(), kt =
I.k();
2027 int n1 = (tstp >= kt ? tstp : kt);
2031 assert(kt > 0 && kt <= 5);
2032 assert(kt <= 2 * ntau + 2);
2033 assert(ntau == Fcc.ntau());
2034 assert(ntau == F.ntau());
2035 assert(ntau == Q.ntau());
2036 assert(F.sig()== G.sig());
2037 assert(Fcc.sig()== G.sig());
2038 assert(Q.sig()== G.sig());
2039 assert(F.size1()== size1);
2040 assert(F.size2()== size1);
2041 assert(Fcc.size1()== size1);
2042 assert(Fcc.size2()== size1);
2043 assert(Q.size1()== size1);
2044 assert(Q.size2()== size1);
2045 assert(n1 <= F.nt());
2046 assert(n1 <= Fcc.nt());
2047 assert(n1 <= G.nt());
2048 assert(n1 <= Q.nt());
2051 vie2_mat(G, F, Fcc, Q, beta,
I, matsubara_method);
2057 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 1>(
2058 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q,
I, beta, h);
2061 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 2>(
2062 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q,
I, beta, h);
2065 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 3>(
2066 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q,
I, beta, h);
2069 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 4>(
2070 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q,
I, beta, h);
2073 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 5>(
2074 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q,
I, beta, h);
2077 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 8>(
2078 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q,
I, beta, h);
2125 template <
typename T>
2128 T beta, T h,
const int SolveOrder,
const int matsubara_method) {
2129 int ntau = G.
ntau();
2130 int size1 = G.
size1();
2131 int n1 = (tstp >= SolveOrder ? tstp : SolveOrder);
2135 assert(SolveOrder > 0 && SolveOrder <= 5);
2136 assert(SolveOrder <= 2 * ntau + 2);
2137 assert(ntau == Fcc.
ntau());
2138 assert(ntau == F.
ntau());
2139 assert(ntau == Q.
ntau());
2140 assert(F.
sig()== G.
sig());
2141 assert(Fcc.
sig()== G.
sig());
2142 assert(Q.
sig()== G.
sig());
2143 assert(F.
size1()== size1);
2144 assert(F.
size2()== size1);
2145 assert(Fcc.
size1()== size1);
2146 assert(Fcc.
size2()== size1);
2147 assert(Q.
size1()== size1);
2148 assert(Q.
size2()== size1);
2149 assert(n1 <= F.
nt());
2150 assert(n1 <= Fcc.
nt());
2151 assert(n1 <= G.
nt());
2152 assert(n1 <= Q.
nt());
2155 vie2_mat(G, F, Fcc, Q, beta, integration::I<T>(SolveOrder), matsubara_method);
2156 }
else if(tstp<=SolveOrder){
2161 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 1>(
2162 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q, integration::I<T>(SolveOrder), beta, h);
2165 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 2>(
2166 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q, integration::I<T>(SolveOrder), beta, h);
2169 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 3>(
2170 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q, integration::I<T>(SolveOrder), beta, h);
2173 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 4>(
2174 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q, integration::I<T>(SolveOrder), beta, h);
2177 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 5>(
2178 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q, integration::I<T>(SolveOrder), beta, h);
2181 vie2_timestep_omp_dispatch<T, herm_matrix<T>, 8>(
2182 omp_num_threads, tstp, G, CPLX(1, 0), F, Fcc, NULL, NULL, Q, integration::I<T>(SolveOrder), beta, h);
2234 template <
typename T>
2236 herm_matrix<T> &F,herm_matrix<T> &Fcc, function<T> &Fsin ,
2240 int n1=(tstp<=kt && tstp>=0 ? 0 : tstp);
2241 int n2=(tstp<=kt && tstp>=0 ? kt : tstp);
2242 int nt=F.nt(),ntau=F.ntau(),size1=F.size1(),sig=F.sig();
2246 assert(kt > 0 && kt <= 5);
2247 assert(kt <= 2 * ntau + 2);
2248 assert(ntau == Fcc.ntau());
2249 assert(ntau == F.ntau());
2250 assert(ntau == Q.ntau());
2251 assert(F.sig()== G.sig());
2252 assert(Fcc.sig()== G.sig());
2253 assert(Q.sig()== G.sig());
2254 assert(F.size1()== size1);
2255 assert(F.size2()== size1);
2256 assert(Fcc.size1()== size1);
2257 assert(Fcc.size2()== size1);
2258 assert(Q.size1()== size1);
2259 assert(Q.size2()== size1);
2260 assert(n1 <= F.nt());
2261 assert(n1 <= Fcc.nt());
2262 assert(n1 <= G.nt());
2263 assert(n1 <= Q.nt());
2265 function<T> funFinv(n2,size1);
2267 cntr::herm_matrix<T> tmpF(nt,ntau,size1,sig),tmpFcc(nt,ntau,size1,sig),tmpF1(nt,ntau,size1,sig),tmpQ(nt,ntau,size1,sig);
2268 cdmatrix cdF,cdFinv,cdQ,cdG;
2270 assert(G.sig()==F.sig());
2271 assert(G.nt()==F.nt());
2272 assert(G.nt()==Q.nt());
2274 for(
int n=-1;n<=n2;n++){
2275 Fsin.get_value(n,cdF);
2276 Qsin.get_value(n,cdQ);
2277 cdF=cdF+cdmatrix::Identity(size1,size1);
2278 cdFinv=cdF.inverse();
2280 funFinv.set_value(n,cdFinv);
2281 Gsin.set_value(n,cdG);
2289 for(
int n=-1;n<=n2;n++){
2290 tmpF.left_multiply(n,funFinv,1.0);
2291 tmpFcc.right_multiply(n,funFinv,1.0);
2292 tmpQ.left_multiply(n,funFinv,1.0);
2296 for(
int n=-1;n<=n2;n++){
2297 tmpF1.right_multiply(n,Gsin,1.0);
2299 for(
int i=-1;i<=n2;i++){
2300 tmpQ.incr_timestep(i,tmpF1,-1.0);
2303 vie2_timestep_omp(omp_num_threads,tstp,G,tmpF,tmpFcc,tmpQ,
I,beta,h);
2351 template <
typename T>
2356 int n1=(tstp<=SolveOrder && tstp>=0 ? 0 : tstp);
2357 int n2=(tstp<=SolveOrder && tstp>=0 ? SolveOrder : tstp);
2362 assert(SolveOrder > 0 && SolveOrder <= 5);
2363 assert(SolveOrder <= 2 * ntau + 2);
2364 assert(ntau == Fcc.
ntau());
2365 assert(ntau == F.
ntau());
2366 assert(ntau == Q.
ntau());
2367 assert(F.
sig()== G.
sig());
2368 assert(Fcc.
sig()== G.
sig());
2369 assert(Q.
sig()== G.
sig());
2370 assert(F.
size1()== size1);
2371 assert(F.
size2()== size1);
2372 assert(Fcc.
size1()== size1);
2373 assert(Fcc.
size2()== size1);
2374 assert(Q.
size1()== size1);
2375 assert(Q.
size2()== size1);
2376 assert(n1 <= F.
nt());
2377 assert(n1 <= Fcc.
nt());
2378 assert(n1 <= G.
nt());
2379 assert(n1 <= Q.
nt());
2383 cntr::herm_matrix<T> tmpF(nt,ntau,size1,sig),tmpFcc(nt,ntau,size1,sig),tmpF1(nt,ntau,size1,sig),tmpQ(nt,ntau,size1,sig);
2384 cdmatrix cdF,cdFinv,cdQ,cdG;
2386 assert(G.
sig()==F.
sig());
2387 assert(G.
nt()==F.
nt());
2388 assert(G.
nt()==Q.
nt());
2390 for(
int n=-1;n<=n2;n++){
2393 cdF=cdF+cdmatrix::Identity(size1,size1);
2394 cdFinv=cdF.inverse();
2396 funFinv.set_value(n,cdFinv);
2405 for(
int n=-1;n<=n2;n++){
2406 tmpF.left_multiply(n,funFinv,1.0);
2407 tmpFcc.right_multiply(n,funFinv,1.0);
2408 tmpQ.left_multiply(n,funFinv,1.0);
2412 for(
int n=-1;n<=n2;n++){
2413 tmpF1.right_multiply(n,Gsin,1.0);
2415 for(
int i=-1;i<=n2;i++){
2419 vie2_timestep_omp(omp_num_threads,tstp,G,tmpF,tmpFcc,tmpQ,beta,h,SolveOrder);
2458 template <
typename T>
2459 void vie2_omp(
int omp_num_threads, herm_matrix<T> &G, herm_matrix<T> &F, herm_matrix<T> &Fcc,
2461 int tstp, k =
I.k();
2462 vie2_mat(G, F, Fcc, Q, beta,
I, matsubara_method);
2465 vie2_start(G, F, Fcc, Q,
I, beta, h);
2466 for (tstp = k + 1; tstp <= G.nt(); tstp++)
2467 vie2_timestep_omp(omp_num_threads, tstp, G, F, Fcc, Q,
I, beta, h);
2507 template <
typename T>
2509 herm_matrix<T> &Q, T beta, T h,
const int SolveOrder,
const int matsubara_method) {
2511 vie2_mat(G, F, Fcc, Q, beta, SolveOrder, matsubara_method);
2513 vie2_start(G, F, Fcc, Q, beta, h, SolveOrder);
2514 for (tstp = SolveOrder + 1; tstp <= G.
nt(); tstp++)
2515 vie2_timestep_omp(omp_num_threads, tstp, G, F, Fcc, Q, beta, h, SolveOrder);
2518 #endif // CNTR_USE_OMP 2524 #endif // CNTR_VIE2_IMPL_H Class Integrator contains all kinds of weights for integration and differentiation of a function at ...
void vie2_timestep_sin(int n, herm_matrix< T > &G, function< T > &Gsin, herm_matrix< T > &F, herm_matrix< T > &Fcc, function< T > &Fsin, herm_matrix< T > &Q, function< T > &Qsin, T beta, T h, int SolveOrder=MAX_SOLVE_ORDER)
One step VIE solver for Green's function with instantaneous contributions for given integration ord...
std::complex< double > cplx
void incr_timestep(int tstp, herm_matrix_timestep< T > ×tep, cplx alpha)
Adds a herm_matrix_timestep with given weight to the herm_matrix.
Integrator< T > & I(int k)
Class function for objects with time on real axis.
void get_value(int tstp, EigenMatrix &M) const
Get matrix value of this function object at a specific time point
Class herm_matrix for two-time contour objects with hermitian symmetry.
void vie2_timestep_sin_omp(int omp_num_threads, int tstp, herm_matrix< T > &G, function< T > &Gsin, herm_matrix< T > &F, herm_matrix< T > &Fcc, function< T > &Fsin, herm_matrix< T > &Q, function< T > &Qsin, T beta, T h, const int SolveOrder=MAX_SOLVE_ORDER)
One step VIE solver for Green's function with instantaneous contributions for given integration ord...
void vie2_start(herm_matrix< T > &G, herm_matrix< T > &F, herm_matrix< T > &Fcc, herm_matrix< T > &Q, T beta, T h, const int SolveOrder=MAX_SOLVE_ORDER)
VIE solver for a Green's function for the first k timesteps
void set_value(int tstp, EigenMatrix &M)
Set matrix value at a specific time point
template Integrator< double > & I< double >(int k)