1 #ifndef CNTR_UTILITIES_IMPL_H 2 #define CNTR_UTILITIES_IMPL_H 21 template <
typename T,
class GG,
int SIZE1>
22 void extrapolate_timestep_dispatch(
int n, GG &G,
24 typedef std::complex<T>
cplx;
26 cplx z1, *gtemp, *gtemp1;
27 int m, l, j, ntau, nt, n1, k, sg, size1 = G.size1();
32 sg = G.element_size();
34 gtemp1 =
new cplx[sg];
35 if (n1 > nt || n < k) {
36 std::cerr <<
" k= " << k <<
" n= " << n <<
" nt= " << nt << std::endl;
37 std::cerr <<
"extrapolate_tstep: n out of range" << std::endl;
41 for (m = 0; m <= ntau; m++)
42 element_set<T, SIZE1>(size1, G.tvptr(n1, m), G.tvptr(n, m));
43 for (j = 0; j <= n; j++)
44 element_set<T, SIZE1>(size1, G.retptr(n1, n1 - j),
46 element_set<T, SIZE1>(size1, G.retptr(n1, 0), G.retptr(n, 0));
47 for (j = 1; j <= n1; j++)
48 element_set<T, SIZE1>(size1, G.lesptr(j, n1), G.lesptr(j - 1, n));
49 element_set<T, SIZE1>(size1, G.lesptr(0, n1), G.lesptr(0, n));
52 for (m = 0; m <= k; m++) {
54 for (l = 0; l <= k; l++)
55 p1[m] += (1 - 2 * (l % 2)) *
I.poly_interpolation(l, m);
58 for (m = 0; m <= ntau; m++) {
59 element_set_zero<T, SIZE1>(size1, gtemp);
60 for (l = 0; l <= k; l++)
61 element_incr<T, SIZE1>(size1, gtemp, p1[l],
63 element_set<T, SIZE1>(size1, G.tvptr(n1, m), gtemp);
66 for (j = 0; j <= n - k; j++) {
67 element_set_zero<T, SIZE1>(size1, gtemp);
68 for (l = 0; l <= k; l++)
69 element_incr<T, SIZE1>(size1, gtemp, p1[l],
70 G.retptr(n - l, n - l - j));
71 element_set<T, SIZE1>(size1, G.retptr(n1, n1 - j), gtemp);
73 for (j = 0; j <= k; j++) {
74 element_set_zero<T, SIZE1>(size1, gtemp);
75 for (l = 0; l <= k; l++) {
77 element_set<T, SIZE1>(size1, gtemp1, G.retptr(j, n - l));
78 element_conj<T, SIZE1>(size1, gtemp1);
79 element_smul<T, SIZE1>(size1, gtemp1, -1);
81 element_set<T, SIZE1>(size1, gtemp1, G.retptr(n - l, j));
83 element_incr<T, SIZE1>(size1, gtemp, p1[l], gtemp1);
85 element_set<T, SIZE1>(size1, G.retptr(n1, j), gtemp);
88 for (j = 0; j <= k; j++) {
89 element_set_zero<T, SIZE1>(size1, gtemp);
90 for (l = 0; l <= k; l++) {
92 element_set<T, SIZE1>(size1, gtemp1, G.lesptr(n - l, j));
93 element_conj<T, SIZE1>(size1, gtemp1);
94 element_smul<T, SIZE1>(size1, gtemp1, -1);
96 element_set<T, SIZE1>(size1, gtemp1, G.lesptr(j, n - l));
98 element_incr<T, SIZE1>(size1, gtemp, p1[l], gtemp1);
100 element_set<T, SIZE1>(size1, G.lesptr(j, n1), gtemp);
102 for (j = k + 1; j <= n1; j++) {
103 element_set_zero<T, SIZE1>(size1, gtemp);
104 for (l = 0; l <= k; l++)
105 element_incr<T, SIZE1>(size1, gtemp, p1[l],
106 G.lesptr(j - l - 1, n - l));
107 element_set<T, SIZE1>(size1, G.lesptr(j, n1), gtemp);
134 template <
typename T>
135 void extrapolate_timestep(
int n, herm_matrix<T> &G,
138 extrapolate_timestep_dispatch<T, herm_matrix<T>, 1>(n, G,
I);
140 extrapolate_timestep_dispatch<T, herm_matrix<T>, LARGESIZE>(n, G,
I);
163 template <
typename T>
166 extrapolate_timestep_dispatch<T,
herm_matrix<T>, 1>(n, G, integration::I<T>(SolveOrder));
168 extrapolate_timestep_dispatch<T, herm_matrix<T>, LARGESIZE>(n, G, integration::I<T>(SolveOrder));
173 template <
typename T>
174 void extrapolate_timestep(
int n, herm_pseudo<T> &G,
177 extrapolate_timestep_dispatch<T, herm_pseudo<T>, 1>(n, G,
I);
179 extrapolate_timestep_dispatch<T, herm_pseudo<T>, LARGESIZE>(n, G,
I);
186 template <
typename T,
int SIZE1>
190 typedef std::complex<T>
cplx;
197 cdmatrix value(size1,size2),output(size1,size2);
205 std::vector<double> weight(kt+1);
207 for(
int m=0; m<=kt; m++){
209 for(
int l=0; l <=kt;l++){
210 weight[m] += (1 - 2 * (l % 2))*
I.poly_interpolation(l, m);
213 for(
int l=0;l<= kt;l++){
216 output+=weight[l]*value;
242 template <
typename T>
243 void extrapolate_timestep(
int n, function<T> &f,
246 extrapolate_timestep_dispatch<T, 1>(n, f,
I);
248 extrapolate_timestep_dispatch<T, LARGESIZE>(n, f,
I);
269 template <
typename T>
270 void extrapolate_timestep(
int n,
function<T> &f,
int ExtrapolationOrder) {
272 extrapolate_timestep_dispatch<T, 1>(n, f, integration::I<T>(ExtrapolationOrder));
274 extrapolate_timestep_dispatch<T, LARGESIZE>(n, f, integration::I<T>(ExtrapolationOrder));
284 template <
typename T,
int SIZE1>
287 typedef std::complex<T>
cplx;
290 cdmatrix output(size,size),tmp(size,size);
292 double t0=float(tstp-kt);
299 for(
int l=0;l<=kt;l++){
301 double weight =
I.poly_interpolation(0,l);
303 for(
int p=1;p<=kt;p++){
305 weight +=t1 *
I.poly_interpolation(p,l);
336 template <
typename T>
337 cdmatrix interpolation(
int tstp,
double tinter,function<T> &f,
342 assert(tinter<=tstp);
343 assert(tinter>=(tstp-kt));
346 return interpolation_dispatch<T, 1>(tstp,tinter, f,
I);
348 return interpolation_dispatch<T, LARGESIZE>(tstp,tinter, f,
I);
373 template <
typename T>
375 int InterpolationOrder) {
377 assert(tstp>=InterpolationOrder);
378 assert(tinter<=tstp);
379 assert(tinter>=(tstp-InterpolationOrder));
382 return interpolation_dispatch<T, 1>(tstp,tinter, f, integration::I<T>(InterpolationOrder));
384 return interpolation_dispatch<T, LARGESIZE>(tstp,tinter, f, integration::I<T>(InterpolationOrder));
399 template <
typename T>
401 int m, ntau = G.
ntau(), size1 = G.
size1();
402 for (m = 0; m <= ntau; m++) {
403 element_set<T, LARGESIZE>(size1, G.tvptr(0, m), G.matptr(ntau - m));
404 element_smul<T, LARGESIZE>(size1, G.tvptr(0, m),
405 std::complex<T>(0, G.
sig()));
407 element_set<T, LARGESIZE>(size1, G.lesptr(0, 0), G.tvptr(0, 0));
408 element_set<T, LARGESIZE>(size1, G.retptr(0, 0), G.matptr(0));
409 element_smul<T, LARGESIZE>(size1, G.retptr(0, 0), std::complex<T>(0, 1));
410 element_incr<T, LARGESIZE>(size1, G.retptr(0, 0), -1, G.lesptr(0, 0));
432 template <
typename T>
436 for(m=0;m<=ntau;m++){
437 element_set<T,LARGESIZE>(size1,G.tvptr(n,m),G.matptr(ntau-m));
438 element_smul<T,LARGESIZE>(size1,G.tvptr(n,m),std::complex<T>(0,G.
sig()));
440 element_set<T,LARGESIZE>(size1,G.lesptr(n,n),G.tvptr(0,0));
441 element_set<T,LARGESIZE>(size1,G.retptr(n,n),G.matptr(0));
442 element_smul<T,LARGESIZE>(size1,G.retptr(n,n),std::complex<T>(0,1));
443 element_incr<T,LARGESIZE>(size1,G.retptr(n,n),-1,G.lesptr(0,0));
448 template <
typename T>
450 int m, ntau = G.ntau(), size1 = G.size1();
451 for (m = 0; m <= ntau; m++) {
452 element_set<T, LARGESIZE>(size1, G.tvptr(0, m), G.matptr(ntau - m));
453 element_smul<T, LARGESIZE>(size1, G.tvptr(0, m),
454 std::complex<T>(0, G.sig()));
456 element_set<T, LARGESIZE>(size1, G.lesptr(0, 0), G.tvptr(0, 0));
457 element_set<T, LARGESIZE>(size1, G.retptr(0, 0), G.matptr(0));
458 element_smul<T, LARGESIZE>(size1, G.retptr(0, 0), std::complex<T>(0, 1));
489 template <
typename T>
493 std::complex<T> trGxSGM;
494 std::complex<T> *GxSGM =
new std::complex<T>[size1*size1];
496 convolution_density_matrix<T,herm_matrix<T>>(tstp, GxSGM, Sigma, G,
I, beta, h);
498 for(
int i=0; i< size1; i++){
499 trGxSGM += GxSGM[i*size1 + i];
502 return 0.5*trGxSGM.real();
532 template <
typename T>
534 T beta, T h,
int SolveOrder){
536 std::complex<T> trGxSGM;
537 std::complex<T> *GxSGM =
new std::complex<T>[size1*size1];
539 convolution_density_matrix<T,herm_matrix<T>>(tstp, GxSGM, Sigma, G, integration::I<T>(SolveOrder), beta, h);
541 for(
int i=0; i< size1; i++){
542 trGxSGM += GxSGM[i*size1 + i];
544 return 0.5*trGxSGM.real();
551 template <
typename T,
class GG,
int SIZE1>
552 T distance_norm2_ret_dispatch(
int tstp, GG &g1, GG &g2) {
553 int size1 = g1.size1(), i;
555 std::complex<T> *temp =
new std::complex<T>[size1 * size1];
556 assert(tstp>=-1 && g1.nt()>=tstp && g2.nt()>=tstp && g1.size1() == g2.size1());
560 for (i = 0; i <= tstp; i++) {
561 element_set<T, SIZE1>(size1, temp, g1.retptr(tstp, i));
562 element_incr<T, SIZE1>(size1, temp, -1.0, g2.retptr(tstp, i));
563 err += element_norm2<T, SIZE1>(size1, temp);
569 template <
typename T,
class GG,
int SIZE1>
570 T distance_norm2_tv_dispatch(
int tstp, GG &g1, GG &g2) {
571 int size1 = g1.size1(), ntau = g1.ntau(), i;
573 std::complex<T> *temp =
new std::complex<T>[size1 * size1];
574 assert(tstp>=-1 && g1.nt()>=tstp && g2.nt() >= tstp);
575 assert(g1.ntau()==g2.ntau() && g1.size1()==g2.size1());
578 for (i = 0; i <= ntau; i++) {
579 element_set<T, SIZE1>(size1, temp, g1.tvptr(tstp, i));
580 element_incr<T, SIZE1>(size1, temp, -1.0, g2.tvptr(tstp, i));
581 err += element_norm2<T, SIZE1>(size1, temp);
587 template <
typename T,
class GG,
int SIZE1>
588 T distance_norm2_les_dispatch(
int tstp, GG &g1, GG &g2) {
589 int size1 = g1.size1(), i;
591 std::complex<T> *temp =
new std::complex<T>[size1 * size1];
593 assert(tstp>=-1 && g1.nt() >= tstp && g2.nt() >= tstp && g1.size1() == g2.size1());
596 for (i = 0; i <= tstp; i++) {
597 element_set<T, SIZE1>(size1, temp, g1.lesptr(i, tstp));
598 element_incr<T, SIZE1>(size1, temp, -1.0, g2.lesptr(i, tstp));
599 err += element_norm2<T, SIZE1>(size1, temp);
606 template <
typename T,
class GG,
int SIZE1>
607 T distance_norm2_dispatch(
int tstp, GG &g1, GG &g2) {
608 int size1 = g1.size1(), ntau = g1.ntau(), i;
610 std::complex<T> *temp =
new std::complex<T>[size1 * size1];
612 assert(tstp >= -1 && g1.nt() >= tstp && g2.nt() >= tstp);
613 assert(g1.ntau() == g2.ntau());
614 assert(g1.size1() == g2.size1());
617 for (i = 0; i <= ntau; i++) {
618 element_set<T, SIZE1>(size1, temp, g1.matptr(i));
619 element_incr<T, SIZE1>(size1, temp, -1.0, g2.matptr(i));
620 err += element_norm2<T, SIZE1>(size1, temp);
623 for (i = 0; i <= tstp; i++) {
624 element_set<T, SIZE1>(size1, temp, g1.retptr(tstp, i));
625 element_incr<T, SIZE1>(size1, temp, -1.0, g2.retptr(tstp, i));
626 err += element_norm2<T, SIZE1>(size1, temp);
628 for (i = 0; i <= ntau; i++) {
629 element_set<T, SIZE1>(size1, temp, g1.tvptr(tstp, i));
630 element_incr<T, SIZE1>(size1, temp, -1.0, g2.tvptr(tstp, i));
631 err += element_norm2<T, SIZE1>(size1, temp);
633 for (i = 0; i <= tstp; i++) {
634 element_set<T, SIZE1>(size1, temp, g1.lesptr(i, tstp));
635 element_incr<T, SIZE1>(size1, temp, -1.0, g2.lesptr(i, tstp));
636 err += element_norm2<T, SIZE1>(size1, temp);
651 template <
typename T,
int SIZE1>
652 T distance_norm2_ret_dispatch(
int tstp, herm_matrix_timestep_view<T> &g1, herm_matrix_timestep_view<T> &g2) {
653 int size1 = g1.size1();
654 int s1 = size1*size1;
656 std::complex<T> *temp =
new std::complex<T>[size1 * size1];
660 for (
int i = 0; i <= tstp; i++) {
661 element_set<T, SIZE1>(size1, temp, g1.ret_ + i * s1);
662 element_incr<T, SIZE1>(size1, temp, -1.0, g2.ret_ + i * s1);
663 err += element_norm2<T, SIZE1>(size1, temp);
669 template <
typename T,
int SIZE1>
670 T distance_norm2_tv_dispatch(
int tstp, herm_matrix_timestep_view<T> &g1, herm_matrix_timestep_view<T> &g2) {
671 int size1 = g1.size1(), ntau = g1.ntau();
672 int s1 = size1*size1;
674 std::complex<T> *temp =
new std::complex<T>[size1 * size1];
678 for (
int i = 0; i <= ntau; i++) {
679 element_set<T, SIZE1>(size1, temp, g1.tv_ + i * s1);
680 element_incr<T, SIZE1>(size1, temp, -1.0, g2.tv_ + i * s1);
681 err += element_norm2<T, SIZE1>(size1, temp);
687 template <
typename T,
int SIZE1>
688 T distance_norm2_les_dispatch(
int tstp, herm_matrix_timestep_view<T> &g1, herm_matrix_timestep_view<T> &g2) {
689 int size1 = g1.size1();
690 int s1 = size1*size1;
692 std::complex<T> *temp =
new std::complex<T>[size1 * size1];
696 for (
int i = 0; i <= tstp; i++) {
697 element_set<T, SIZE1>(size1, temp, g1.les_ + i * s1);
698 element_incr<T, SIZE1>(size1, temp, -1.0, g2.les_ + i * s1);
699 err += element_norm2<T, SIZE1>(size1, temp);
706 template <
typename T,
int SIZE1>
707 T distance_norm2_dispatch(
int tstp, herm_matrix_timestep_view<T> &g1, herm_matrix_timestep_view<T> &g2) {
708 int size1 = g1.size1(), ntau = g1.ntau();
709 int s1 = size1*size1;
711 std::complex<T> *temp =
new std::complex<T>[size1 * size1];
714 for (
int i = 0; i <= ntau; i++) {
715 element_set<T, SIZE1>(size1, temp, g1.mat_ + i * s1);
716 element_incr<T, SIZE1>(size1, temp, -1.0, g2.mat_ + i * s1);
717 err += element_norm2<T, SIZE1>(size1, temp);
720 for (
int i = 0; i <= tstp; i++) {
721 element_set<T, SIZE1>(size1, temp, g1.ret_ + i * s1);
722 element_incr<T, SIZE1>(size1, temp, -1.0, g2.ret_ + i * s1);
723 err += element_norm2<T, SIZE1>(size1, temp);
725 for (
int i = 0; i <= ntau; i++) {
726 element_set<T, SIZE1>(size1, temp, g1.tv_ + i * s1);
727 element_incr<T, SIZE1>(size1, temp, -1.0, g2.tv_ + i * s1);
728 err += element_norm2<T, SIZE1>(size1, temp);
730 for (
int i = 0; i <= tstp; i++) {
731 element_set<T, SIZE1>(size1, temp, g1.les_ + i * s1);
732 element_incr<T, SIZE1>(size1, temp, -1.0, g2.les_ + i * s1);
733 err += element_norm2<T, SIZE1>(size1, temp);
759 template <
typename T>
763 assert(g1.
nt() >= tstp);
764 assert(g2.
nt() >= tstp);
766 return distance_norm2_ret_dispatch<T,
herm_matrix<T>, 1>(tstp, g1,
769 return distance_norm2_ret_dispatch<T, herm_matrix<T>, LARGESIZE>(
791 template <
typename T>
795 assert(g1.
tstp() == tstp);
796 assert(g2.
nt() >= tstp);
800 return distance_norm2_ret_dispatch<T, 1>(tstp, g1_view, g2_view);
802 return distance_norm2_ret_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
823 template <
typename T>
827 assert(g1.
nt() >= tstp);
828 assert(g2.
tstp() == tstp);
832 return distance_norm2_ret_dispatch<T, 1>(tstp, g1_view, g2_view);
834 return distance_norm2_ret_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
856 template <
typename T>
860 assert(g1.
tstp() == tstp);
861 assert(g2.
tstp() == tstp);
865 return distance_norm2_ret_dispatch<T, 1>(tstp, g1_view, g2_view);
867 return distance_norm2_ret_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
888 template <
typename T>
892 assert(g1.
tstp() == tstp);
893 assert(g2.
nt() >= tstp);
896 return distance_norm2_ret_dispatch<T, 1>(tstp, g1, g2_view);
898 return distance_norm2_ret_dispatch<T, LARGESIZE>(tstp, g1, g2_view);
919 template <
typename T>
923 assert(g1.
nt() >= tstp);
924 assert(g2.
tstp() == tstp);
927 return distance_norm2_ret_dispatch<T, 1>(tstp, g1_view, g2);
929 return distance_norm2_ret_dispatch<T, LARGESIZE>(tstp, g1_view, g2);
951 template <
typename T>
955 assert(g1.
tstp() == tstp);
956 assert(g2.
tstp() == tstp);
959 return distance_norm2_ret_dispatch<T, 1>(tstp, g1_view, g2);
961 return distance_norm2_ret_dispatch<T, LARGESIZE>(tstp, g1_view, g2);
982 template <
typename T>
986 assert(g1.
tstp() == tstp);
987 assert(g2.
tstp() == tstp);
990 return distance_norm2_ret_dispatch<T, 1>(tstp, g1, g2_view);
992 return distance_norm2_ret_dispatch<T, LARGESIZE>(tstp, g1, g2_view);
1014 template <
typename T>
1018 assert(g1.
tstp() == tstp);
1019 assert(g2.
tstp() == tstp);
1020 if (g1.
size1() == 1)
1021 return distance_norm2_ret_dispatch<T, 1>(tstp, g1, g2);
1023 return distance_norm2_ret_dispatch<T, LARGESIZE>(tstp, g1, g2);
1046 template <
typename T>
1050 assert(g1.
nt() >= tstp);
1051 assert(g2.
nt() >= tstp);
1052 if (g1.
size1() == 1)
1053 return distance_norm2_tv_dispatch<T,
herm_matrix<T>, 1>(tstp, g1, g2);
1055 return distance_norm2_tv_dispatch<T, herm_matrix<T>, LARGESIZE>(
1077 template <
typename T>
1081 assert(g1.
tstp() == tstp);
1082 assert(g2.
nt() >= tstp);
1085 if (g1.
size1() == 1)
1086 return distance_norm2_tv_dispatch<T, 1>(tstp, g1_view, g2_view);
1088 return distance_norm2_tv_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
1109 template <
typename T>
1113 assert(g1.
nt() >= tstp);
1114 assert(g2.
tstp() == tstp);
1117 if (g1.
size1() == 1)
1118 return distance_norm2_tv_dispatch<T, 1>(tstp, g1_view, g2_view);
1120 return distance_norm2_tv_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
1142 template <
typename T>
1146 assert(g1.
tstp() == tstp);
1147 assert(g2.
tstp() == tstp);
1150 if (g1.
size1() == 1)
1151 return distance_norm2_tv_dispatch<T, 1>(tstp, g1_view, g2_view);
1153 return distance_norm2_tv_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
1174 template <
typename T>
1178 assert(g1.
tstp() == tstp);
1179 assert(g2.
nt() >= tstp);
1181 if (g1.
size1() == 1)
1182 return distance_norm2_tv_dispatch<T, 1>(tstp, g1, g2_view);
1184 return distance_norm2_tv_dispatch<T, LARGESIZE>(tstp, g1, g2_view);
1205 template <
typename T>
1209 assert(g1.
nt() >= tstp);
1210 assert(g2.
tstp() == tstp);
1212 if (g1.
size1() == 1)
1213 return distance_norm2_tv_dispatch<T, 1>(tstp, g1_view, g2);
1215 return distance_norm2_tv_dispatch<T, LARGESIZE>(tstp, g1_view, g2);
1237 template <
typename T>
1241 assert(g1.
tstp() == tstp);
1242 assert(g2.
tstp() == tstp);
1244 if (g1.
size1() == 1)
1245 return distance_norm2_tv_dispatch<T, 1>(tstp, g1_view, g2);
1247 return distance_norm2_tv_dispatch<T, LARGESIZE>(tstp, g1_view, g2);
1268 template <
typename T>
1272 assert(g1.
tstp() == tstp);
1273 assert(g2.
tstp() == tstp);
1275 if (g1.
size1() == 1)
1276 return distance_norm2_tv_dispatch<T, 1>(tstp, g1, g2_view);
1278 return distance_norm2_tv_dispatch<T, LARGESIZE>(tstp, g1, g2_view);
1300 template <
typename T>
1304 assert(g1.
tstp() == tstp);
1305 assert(g2.
tstp() == tstp);
1306 if (g1.
size1() == 1)
1307 return distance_norm2_tv_dispatch<T, 1>(tstp, g1, g2);
1309 return distance_norm2_tv_dispatch<T, LARGESIZE>(tstp, g1, g2);
1331 template <
typename T>
1335 assert(g1.
nt() >= tstp);
1336 assert(g2.
nt() >= tstp);
1337 if (g1.
size1() == 1)
1338 return distance_norm2_les_dispatch<T,
herm_matrix<T>, 1>(tstp, g1,
1341 return distance_norm2_les_dispatch<T, herm_matrix<T>, LARGESIZE>(
1365 template <
typename T>
1369 assert(g1.
tstp() == tstp);
1370 assert(g2.
nt() >= tstp);
1373 if (g1.
size1() == 1)
1374 return distance_norm2_les_dispatch<T, 1>(tstp, g1_view, g2_view);
1376 return distance_norm2_les_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
1397 template <
typename T>
1401 assert(g1.
nt() >= tstp);
1402 assert(g2.
tstp() == tstp);
1405 if (g1.
size1() == 1)
1406 return distance_norm2_les_dispatch<T, 1>(tstp, g1_view, g2_view);
1408 return distance_norm2_les_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
1430 template <
typename T>
1434 assert(g1.
tstp() == tstp);
1435 assert(g2.
tstp() == tstp);
1438 if (g1.
size1() == 1)
1439 return distance_norm2_les_dispatch<T, 1>(tstp, g1_view, g2_view);
1441 return distance_norm2_les_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
1462 template <
typename T>
1466 assert(g1.
tstp() == tstp);
1467 assert(g2.
nt() >= tstp);
1469 if (g1.
size1() == 1)
1470 return distance_norm2_les_dispatch<T, 1>(tstp, g1, g2_view);
1472 return distance_norm2_les_dispatch<T, LARGESIZE>(tstp, g1, g2_view);
1493 template <
typename T>
1497 assert(g1.
nt() >= tstp);
1498 assert(g2.
tstp() == tstp);
1500 if (g1.
size1() == 1)
1501 return distance_norm2_les_dispatch<T, 1>(tstp, g1_view, g2);
1503 return distance_norm2_les_dispatch<T, LARGESIZE>(tstp, g1_view, g2);
1525 template <
typename T>
1529 assert(g1.
tstp() == tstp);
1530 assert(g2.
tstp() == tstp);
1532 if (g1.
size1() == 1)
1533 return distance_norm2_les_dispatch<T, 1>(tstp, g1_view, g2);
1535 return distance_norm2_les_dispatch<T, LARGESIZE>(tstp, g1_view, g2);
1556 template <
typename T>
1560 assert(g1.
tstp() == tstp);
1561 assert(g2.
tstp() == tstp);
1563 if (g1.
size1() == 1)
1564 return distance_norm2_les_dispatch<T, 1>(tstp, g1, g2_view);
1566 return distance_norm2_les_dispatch<T, LARGESIZE>(tstp, g1, g2_view);
1587 template <
typename T>
1591 assert(g1.
tstp() == tstp);
1592 assert(g2.
tstp() == tstp);
1593 if (g1.
size1() == 1)
1594 return distance_norm2_les_dispatch<T, 1>(tstp, g1, g2);
1596 return distance_norm2_les_dispatch<T, LARGESIZE>(tstp, g1, g2);
1620 template <
typename T>
1624 assert(g1.
nt() >= tstp);
1625 assert(g2.
nt() >= tstp);
1626 if (g1.
size1() == 1)
1627 return distance_norm2_dispatch<T,
herm_matrix<T>, 1>(tstp, g1, g2);
1629 return distance_norm2_dispatch<T, herm_matrix<T>, LARGESIZE>(tstp, g1,
1652 template <
typename T>
1656 assert(g1.
tstp() == tstp);
1657 assert(g2.
nt() >= tstp);
1660 if (g1.
size1() == 1)
1661 return distance_norm2_dispatch<T, 1>(tstp, g1_view, g2_view);
1663 return distance_norm2_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
1684 template <
typename T>
1688 assert(g1.
nt() >= tstp);
1689 assert(g2.
tstp() == tstp);
1692 if (g1.
size1() == 1)
1693 return distance_norm2_dispatch<T, 1>(tstp, g1_view, g2_view);
1695 return distance_norm2_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
1717 template <
typename T>
1721 assert(g1.
tstp() == tstp);
1722 assert(g2.
tstp() == tstp);
1725 if (g1.
size1() == 1)
1726 return distance_norm2_dispatch<T, 1>(tstp, g1_view, g2_view);
1728 return distance_norm2_dispatch<T, LARGESIZE>(tstp, g1_view, g2_view);
1733 template <
typename T>
1740 if (g1.
size1() == 1)
1741 return distance_norm2_dispatch<T, 1>(g1.
tstp(), g1_view, g2_view);
1743 return distance_norm2_dispatch<T, LARGESIZE>(g1.
tstp(), g1_view, g2_view);
1747 template <
typename T>
1753 if (g1.
size1() == 1)
1754 return distance_norm2_dispatch<T, 1>(g1.
tstp(), g1, g2_view);
1756 return distance_norm2_dispatch<T, LARGESIZE>(g1.
tstp(), g1, g2_view);
1777 template <
typename T>
1781 assert(g1.
tstp() == tstp);
1782 assert(g2.
nt() >= tstp);
1784 if (g1.
size1() == 1)
1785 return distance_norm2_dispatch<T, 1>(tstp, g1, g2_view);
1787 return distance_norm2_dispatch<T, LARGESIZE>(tstp, g1, g2_view);
1808 template <
typename T>
1812 assert(g1.
nt() >= tstp);
1813 assert(g2.
tstp() == tstp);
1815 if (g1.
size1() == 1)
1816 return distance_norm2_dispatch<T, 1>(tstp, g1_view, g2);
1818 return distance_norm2_dispatch<T, LARGESIZE>(tstp, g1_view, g2);
1840 template <
typename T>
1844 assert(g1.
tstp() == tstp);
1845 assert(g2.
tstp() == tstp);
1847 if (g1.
size1() == 1)
1848 return distance_norm2_dispatch<T, 1>(tstp, g1_view, g2);
1850 return distance_norm2_dispatch<T, LARGESIZE>(tstp, g1_view, g2);
1871 template <
typename T>
1875 assert(g1.
tstp() == tstp);
1876 assert(g2.
tstp() == tstp);
1878 if (g1.
size1() == 1)
1879 return distance_norm2_dispatch<T, 1>(tstp, g1, g2_view);
1881 return distance_norm2_dispatch<T, LARGESIZE>(tstp, g1, g2_view);
1903 template <
typename T>
1907 assert(g1.
tstp() == tstp);
1908 assert(g2.
tstp() == tstp);
1909 if (g1.
size1() == 1)
1910 return distance_norm2_dispatch<T, 1>(tstp, g1, g2);
1912 return distance_norm2_dispatch<T, LARGESIZE>(tstp, g1, g2);
1930 template <
typename T>
1932 if (g1.size1() == 1)
1933 return distance_norm2_dispatch<T, herm_pseudo<T>, 1>(tstp, g1, g2);
1935 return distance_norm2_dispatch<T, herm_pseudo<T>, LARGESIZE>(tstp, g1,
1959 template <
typename T>
1964 assert(g1.tstp_==tstp && g1.tstp_<=g2.
nt());
1965 assert(g1.ntau_==g2.
ntau() && g1.size1_==g2.
size1() && g1.size2_==g2.
size2() );
1966 cdmatrix matg1(size1,size2);
1967 cdmatrix matg2(size1,size2);
1970 for(
int i=0;i<=ntau;i++){
1971 g1.get_mat(i,matg1);
1972 g2.get_mat(i,matg2);
1973 err+=(matg1-matg2).norm();
1977 for(
int i=0;i<=tstp;i++){
1978 g1.get_ret_tstp_t(i,matg1);
1979 g2.get_ret(tstp,i,matg2);
1980 err+=(matg1-matg2).norm();
1983 for(
int i=0;i<=ntau;i++){
1985 g2.get_tv(tstp,i,matg2);
1986 err+=(matg1-matg2).norm();
1989 for(
int i=0;i<=tstp;i++){
1990 g1.get_les_t_tstp(i,matg1);
1991 g2.get_les(i,tstp,matg2);
1992 err+=(matg1-matg2).norm();
2014 template <
typename T>
2016 size_t mem = ((nt + 1) * (nt + 2) + (nt + 2) * (ntau + 1)) * size * size *
2017 sizeof(std::complex<T>);
2037 template <
typename T>
2039 size_t mem = ((tstp + 2) + (ntau + 1)) * size * size *
2040 sizeof(std::complex<T>);
2058 template <
typename T>
2060 size_t mem = (nt + 2) * size * size *
sizeof(std::complex<T>);
2076 template <
typename T>
2078 int ntau = G.
ntau(), m, s1 = G.
size1(), p1, p2;
2079 cdmatrix Gmat,Gmat_herm;
2080 for (m = 0; m <= ntau; m++) {
2082 Gmat_herm = 0.5*(Gmat + Gmat.adjoint());
2083 G.set_mat(m,Gmat_herm);
2101 int ntau = G.ntau(), m, s1 = G.size1(), p1, p2;
2102 cdmatrix Gmat,Gmat_herm;
2103 for (m = 0; m <= ntau; m++) {
2105 Gmat_herm = 0.5*(Gmat + Gmat.adjoint());
2106 G.set_mat(m,Gmat_herm);
2112 #endif // CNTR_UTILITIES_IMPL_H Class herm_matrix_timestep_view serves for interfacing with class herm_matrix_timestep without copyi...
int size2_
Number of the rows in the Matrix form.
Class Integrator contains all kinds of weights for integration and differentiation of a function at ...
T correlation_energy(int tstp, herm_matrix< T > &G, herm_matrix< T > &Sigma, T beta, T h, int SolveOrder=MAX_SOLVE_ORDER)
Returns the result of the correlation energy at a given time-step from the time-diagonal convolution...
void force_matsubara_hermitian(herm_matrix< T > &G)
Force the Matsubara component of herm_matrix to be a hermitian matrix at each . ...
Class herm_matrix_timestep deals with contour objects at a particular timestep .
size_t mem_herm_matrix(int nt, int ntau, int size)
Evaluate the memory necessary for a herm_matrix.
std::complex< double > cplx
Integrator< T > & I(int k)
T distance_norm2_ret(int tstp, herm_matrix< T > &g1, herm_matrix< T > &g2)
Evaluate the Euclidean norm between the retarded components of two herm_matrix at a given time step...
int size1_
Number of the colums in the Matrix form.
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
T distance_norm2_eigen(int tstp, herm_matrix_timestep< T > &g1, herm_matrix< T > &g2)
Evaluate the Euclidean norm between 'herm_matrix_timestep' and 'herm_matrix' at a given time step...
T distance_norm2(int tstp, herm_matrix< T > &g1, herm_matrix< T > &g2)
Evaluate the Euclidean norm between two herm_matrix at a given time step.
T distance_norm2_tv(int tstp, herm_matrix< T > &g1, herm_matrix< T > &g2)
Evaluate the Euclidean norm between the left-mixing components of two herm_matrces at a given time s...
void set_tk_from_mat(herm_matrix< T > &G, int SolveOrder)
Set components of herm_matrix at t=0,1,..kt from the Matsubara component.
void set_t0_from_mat(herm_matrix< T > &G)
Set t=0 components of the two-time contour object from the Matsubara component. ...
Class herm_matrix for two-time contour objects with hermitian symmetry.
T distance_norm2_les(int tstp, herm_matrix< T > &g1, herm_matrix< T > &g2)
Evaluate the Euclidean norm between the lesser components of two herm_matrces at a given time step...
size_t mem_function(int nt, int size)
Evaluate the memory necessary for a contour function.
int nt_
Maximum number of the time steps.
void set_value(int tstp, EigenMatrix &M)
Set matrix value at a specific time point
size_t mem_herm_matrix_timestep(int tstp, int ntau, int size)
Evaluate the memory necessary for a herm_matrix_timestep.