1 #ifndef CNTR_HERM_MATRIX_TIMESTEP_IMPL_H 2 #define CNTR_HERM_MATRIX_TIMESTEP_IMPL_H 55 int len=((tstp+1)*2+(ntau+1))*size1*size1;
56 assert(size1>=0 && tstp>=-1 && ntau>=0);
59 data_ =
new cplx [len];
60 memset(data_, 0,
sizeof(
cplx)*len);
64 element_size_=size1*size1_;
96 int len=((tstp+1)*2+(ntau+1))*size1*size2;
97 assert(size1>=0 && tstp>=-1 && ntau>=0);
100 data_ =
new cplx [len];
101 memset(data_, 0,
sizeof(
cplx)*len);
105 element_size_=size1*size2;
134 int len=((tstp+1)*2+(ntau+1))*size1*size1;
135 assert(size1>=0 && tstp>=-1 && ntau>=0 && sig*sig==1);
138 data_ =
new cplx [len];
139 memset(data_, 0,
sizeof(
cplx)*len);
143 element_size_=size1*size1_;
167 template <
typename T>
173 element_size_ = size1_ * size1_;
174 total_size_ = g.total_size_;
175 if (total_size_ > 0) {
176 data_ =
new cplx[total_size_];
177 memcpy(data_, g.data_,
sizeof(
cplx) * total_size_);
183 template <
typename T>
188 if (total_size_ != g.total_size_) {
190 total_size_ = g.total_size_;
192 data_ =
new cplx[total_size_];
201 element_size_ = size1_ * size1_;
203 memcpy(data_, g.data_,
sizeof(
cplx) * total_size_);
206 #if __cplusplus >= 201103L 207 template <
typename T>
214 element_size_(g.element_size_),
215 total_size_(g.total_size_),
225 template <
typename T>
236 element_size_ = g.element_size_;
237 total_size_ = g.total_size_;
274 template <
typename T>
276 int len = ((tstp + 1) * 2 + (ntau + 1)) * size1 * size1;
277 assert(ntau >= 0 && tstp >= -1 && size1 >= 0);
282 data_ =
new cplx[len];
286 element_size_ = size1_ * size1_;
303 template <
typename T>
306 memset(data_, 0,
sizeof(
cplx) * total_size_);
328 template <
typename T>
330 assert(tstp == tstp_);
333 memset(matptr(0), 0,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
335 memset(retptr(0), 0,
sizeof(
cplx) * (tstp + 1) * element_size_);
336 memset(tvptr(0), 0,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
337 memset(lesptr(0), 0,
sizeof(
cplx) * (tstp + 1) * element_size_);
364 template <
typename T>
366 assert(tstp == tstp_);
367 assert(tstp >= -1 && tstp <= g1.
nt() &&
"tstp >= -1 && tstp <= g1.nt()");
368 assert(g1.
size1() == size1_ &&
"g1.size1() == size1_");
369 assert(g1.
ntau() == ntau_ &&
"g1.ntau() == ntau_");
371 memcpy(matptr(0), g1.matptr(0),
sizeof(
cplx) * (ntau_ + 1) * element_size_);
373 memcpy(retptr(0), g1.retptr(tstp, 0),
374 sizeof(
cplx) * (tstp + 1) * element_size_);
375 memcpy(tvptr(0), g1.tvptr(tstp, 0),
376 sizeof(
cplx) * (ntau_ + 1) * element_size_);
377 memcpy(lesptr(0), g1.lesptr(0, tstp),
378 sizeof(
cplx) * (tstp + 1) * element_size_);
404 template <
typename T>
406 assert(tstp == tstp_);
407 assert(tstp == g1.
tstp());
408 assert(tstp >= -1 && tstp <= g1.
tstp() &&
"tstp >= -1 && tstp <= g1.tstp()");
409 assert(g1.
size1() == size1_ &&
"g1.size1() == size1_");
410 assert(g1.
ntau() == ntau_ &&
"g1.ntau() == ntau_");
412 memcpy(matptr(0), g1.
matptr(0),
sizeof(
cplx) * (ntau_ + 1) * element_size_);
414 memcpy(retptr(0), g1.
retptr(0),
415 sizeof(
cplx) * (tstp + 1) * element_size_);
416 memcpy(tvptr(0), g1.
tvptr(0),
417 sizeof(
cplx) * (ntau_ + 1) * element_size_);
418 memcpy(lesptr(0), g1.
lesptr(0),
419 sizeof(
cplx) * (tstp + 1) * element_size_);
428 #define herm_matrix_READ_ELEMENT \ 430 int r, s, dim = size1_; \ 431 M.resize(dim, dim); \ 432 for (r = 0; r < dim; r++) \ 433 for (s = 0; s < dim; s++) \ 434 M(r, s) = x[r * dim + s]; \ 436 #define herm_matrix_READ_ELEMENT_MINUS_CONJ \ 439 int r, s, dim = size1_; \ 440 M.resize(dim, dim); \ 441 for (r = 0; r < dim; r++) \ 442 for (s = 0; s < dim; s++) { \ 443 w = x[s * dim + r]; \ 444 M(r, s) = std::complex<T>(-w.real(), w.imag()); \ 469 template <
typename T>
template <
class Matrix>
471 assert(j == tstp_ && i <= tstp_);
474 herm_matrix_READ_ELEMENT
498 template <
typename T>
499 template <
class Matrix>
500 void herm_matrix_timestep<T>::get_les_t_tstp(
int i, Matrix &M) {
503 herm_matrix_READ_ELEMENT
526 template <
typename T>
527 template <
class Matrix>
528 void herm_matrix_timestep<T>::get_les_tstp_t(
int i, Matrix &M) {
531 herm_matrix_READ_ELEMENT_MINUS_CONJ
556 template <
typename T>
557 template <
class Matrix>
558 void herm_matrix_timestep<T>::get_ret(
int i,
int j, Matrix &M) {
559 assert(i == tstp_ && j <= tstp_);
562 herm_matrix_READ_ELEMENT
587 template <
typename T>
588 template <
class Matrix>
589 void herm_matrix_timestep<T>::get_ret_tstp_t(
int j, Matrix &M) {
592 herm_matrix_READ_ELEMENT
615 template <
typename T>
616 template <
class Matrix>
617 void herm_matrix_timestep<T>::get_ret_t_tstp(
int i, Matrix &M) {
620 herm_matrix_READ_ELEMENT_MINUS_CONJ
644 template <
typename T>
645 template <
class Matrix>
646 void herm_matrix_timestep<T>::get_tv(
int i,
int j, Matrix &M) {
649 herm_matrix_READ_ELEMENT
673 template <
typename T>
674 template <
class Matrix>
675 void herm_matrix_timestep<T>::get_tv(
int j, Matrix &M) {
677 herm_matrix_READ_ELEMENT
702 template <
typename T>
703 template <
class Matrix>
704 void herm_matrix_timestep<T>::get_vt(
int i, Matrix &M,
int sig) {
705 cplx *x = tvptr(ntau_ - i);
706 herm_matrix_READ_ELEMENT_MINUS_CONJ
if (sig == -1) M = -M;
727 template <
typename T>
728 template <
class Matrix>
729 void herm_matrix_timestep<T>::get_mat(
int i, Matrix &M) {
731 herm_matrix_READ_ELEMENT
755 template <
typename T>
756 template <
class Matrix>
757 void herm_matrix_timestep<T>::get_matminus(
int i, Matrix &M,
int sig) {
758 cplx *x = matptr(ntau_ - i);
759 herm_matrix_READ_ELEMENT
if (sig == -1) M = -M;
784 template <
typename T>
785 template <
class Matrix>
786 void herm_matrix_timestep<T>::get_matminus(
int i, Matrix &M) {
787 cplx *x = matptr(ntau_ - i);
788 herm_matrix_READ_ELEMENT
if (sig_ == -1) M = -M;
809 template <
typename T>
810 template <
class Matrix>
811 void herm_matrix_timestep<T>::get_gtr_tstp_t(
int i, Matrix &M) {
813 get_ret_tstp_t(i, M);
814 get_les_tstp_t(i, M1);
836 template <
typename T>
837 template <
class Matrix>
838 void herm_matrix_timestep<T>::get_gtr_t_tstp(
int i, Matrix &M) {
840 get_ret_t_tstp(i, M);
841 get_les_t_tstp(i, M1);
877 template <
typename T>
878 inline void herm_matrix_timestep<T>::get_ret(
int i,
int j,
cplx &x) {
879 assert(i == tstp_ || j == tstp_);
915 template <
typename T>
916 inline void herm_matrix_timestep<T>::get_les(
int i,
int j,
cplx &x) {
917 assert(i == tstp_ || j == tstp_);
953 template <
typename T>
954 inline void herm_matrix_timestep<T>::get_tv(
int i,
int j,
cplx &x) {
985 template <
typename T>
986 inline void herm_matrix_timestep<T>::get_vt(
int i,
int j,
cplx &x) {
988 x = *tvptr(ntau_ - i);
1014 template <
typename T>
1015 inline void herm_matrix_timestep<T>::get_mat(
int i,
cplx &x) {
1016 assert(tstp_ == -1);
1039 template <
typename T>
1040 inline void herm_matrix_timestep<T>::get_matminus(
int i,
cplx &x) {
1041 assert(tstp_ == -1);
1042 x = *matptr(ntau_ - i);
1067 template <
typename T>
1069 assert(tstp_ == tstp);
1076 return std::complex<T>(0.0, sig_) * x1;
1101 template <
typename T>
1103 assert(tstp_ == tstp);
1110 rho = std::complex<T>(0.0, sig_) * x1;
1133 template<
typename T>
template<
class Matrix>
1140 get_les_tstp_t(tstp_,M);
1141 M *= std::complex<T>(0.0,1.0*sig_);
1166 template<
typename T>
template<
class Matrix>
1168 assert(tstp == tstp_);
1173 get_les_tstp_t(tstp_,M);
1174 M *= std::complex<T>(0.0,1.0*sig_);
1185 #define herm_matrix_SET_ELEMENT_MATRIX \ 1188 for (r = 0; r < size1_; r++) \ 1189 for (s = 0; s < size2_; s++) \ 1190 x[r * size2_ + s] = M(r, s); \ 1214 herm_matrix_SET_ELEMENT_MATRIX
1238 template<
typename T>
template <
class Matrix>
void herm_matrix_timestep<T>::set_ret(
int i,
int j,Matrix &M){
1242 herm_matrix_SET_ELEMENT_MATRIX
1266 template<
typename T>
inline void herm_matrix_timestep<T>::set_ret(
int i,
int j,
cplx &x){
1267 assert(i == tstp_ && j <= i);
1291 template<
typename T>
template <
class Matrix>
void herm_matrix_timestep<T>::set_les(
int j,Matrix &M){
1293 herm_matrix_SET_ELEMENT_MATRIX
1316 template<
typename T>
template <
class Matrix>
void herm_matrix_timestep<T>::set_les(
int i,
int j, Matrix &M){
1320 herm_matrix_SET_ELEMENT_MATRIX
1343 template<
typename T>
inline void herm_matrix_timestep<T>::set_les(
int i,
int j,
cplx &x){
1344 assert(j == tstp_ && i <= j);
1368 template<
typename T>
template <
class Matrix>
void herm_matrix_timestep<T>::set_tv(
int j,Matrix &M){
1370 herm_matrix_SET_ELEMENT_MATRIX
1394 template<
typename T>
template <
class Matrix>
void herm_matrix_timestep<T>::set_tv(
int i,
int j, Matrix &M){
1398 herm_matrix_SET_ELEMENT_MATRIX
1422 template<
typename T>
inline void herm_matrix_timestep<T>::set_tv(
int i,
int j,
cplx &x){
1447 template<
typename T>
template <
class Matrix>
void herm_matrix_timestep<T>::set_mat(
int i,Matrix &M){
1448 assert(i <= ntau_ );
1450 herm_matrix_SET_ELEMENT_MATRIX
1471 template<
typename T>
inline void herm_matrix_timestep<T>::set_mat(
int i,
cplx &x){
1472 assert(i <= ntau_ );
1512 template <
typename T>
1513 void herm_matrix_timestep<T>::left_multiply(std::complex<T> *f0,
1514 std::complex<T> *ft, T weight) {
1516 cplx *x0, *xtemp, *ftemp;
1517 xtemp =
new cplx[element_size_];
1520 for (m = 0; m <= ntau_; m++) {
1521 element_mult<T, LARGESIZE>(size1_, xtemp, f0,
1522 x0 + m * element_size_);
1523 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1524 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1527 ftemp = ft + tstp_ * element_size_;
1529 for (m = 0; m <= tstp_; m++) {
1530 element_mult<T, LARGESIZE>(size1_, xtemp, ftemp,
1531 x0 + m * element_size_);
1532 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1533 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1535 x0 = data_ + (tstp_ + 1) * element_size_;
1536 for (m = 0; m <= ntau_; m++) {
1537 element_mult<T, LARGESIZE>(size1_, xtemp, ftemp,
1538 x0 + m * element_size_);
1539 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1540 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1542 x0 = data_ + (tstp_ + 1 + ntau_ + 1) * element_size_;
1543 for (m = 0; m <= tstp_; m++) {
1544 element_mult<T, LARGESIZE>(size1_, xtemp, ft + m * element_size_,
1545 x0 + m * element_size_);
1546 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1547 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1571 template <
typename T>
1573 assert( ft.
nt() >= tstp_);
1575 this->left_multiply(ft.
ptr(-1), ft.
ptr(0), weight);
1598 template <
typename T>
1600 assert(tstp == tstp_);
1601 assert( ft.
nt() >= tstp_);
1603 this->left_multiply(ft.
ptr(-1), ft.
ptr(0), weight);
1629 template <
typename T>
1632 assert(tstp == tstp_);
1634 cplx *xtemp, *ftemp, *x0, *f0, *fcc;
1635 xtemp =
new cplx[element_size_];
1636 fcc =
new cplx[element_size_];
1637 assert(tstp >= -1 && ft.
nt() >= tstp &&
1638 ft.
size1() == size1_ && ft.
size2() == size2_ &&
1639 "tstp >= -1 && ft.nt() >= tstp && ft.size1() == size1_ && ft.size2() == size2_");
1642 element_conj<T, LARGESIZE>(size1_, fcc, f0);
1645 for (m = 0; m <= ntau_; m++) {
1646 element_mult<T, LARGESIZE>(size1_, xtemp, fcc,
1647 x0 + m * element_size_);
1648 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1649 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1652 ftemp = ft.
ptr(tstp);
1653 element_conj<T, LARGESIZE>(size1_, fcc, ftemp);
1655 for (m = 0; m <= tstp; m++) {
1656 element_mult<T, LARGESIZE>(size1_, xtemp, fcc,
1657 x0 + m * element_size_);
1658 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1659 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1661 x0 = data_ + (tstp_ + 1) * element_size_;
1662 for (m = 0; m <= ntau_; m++) {
1663 element_mult<T, LARGESIZE>(size1_, xtemp, fcc,
1664 x0 + m * element_size_);
1665 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1666 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1668 x0 = data_ + (tstp_ + 1 + ntau_ + 1) * element_size_;
1669 for (m = 0; m <= tstp; m++) {
1670 element_conj<T, LARGESIZE>(size1_, fcc, ft.
ptr(m));
1671 element_mult<T, LARGESIZE>(size1_, xtemp, fcc,
1672 x0 + m * element_size_);
1673 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1674 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1707 template <
typename T>
1709 std::complex<T> *ft, T weight) {
1711 cplx *xtemp, *ftemp, *x0;
1712 xtemp =
new cplx[element_size_];
1715 for (m = 0; m <= ntau_; m++) {
1716 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
1718 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1719 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1723 for (m = 0; m <= tstp_; m++) {
1724 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
1725 ft + m * element_size_);
1726 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1727 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1729 x0 = data_ + (tstp_ + 1) * element_size_;
1730 for (m = 0; m <= ntau_; m++) {
1731 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
1733 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1734 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1736 ftemp = ft + tstp_ * element_size_;
1737 x0 = data_ + (tstp_ + 1 + ntau_ + 1) * element_size_;
1738 for (m = 0; m <= tstp_; m++) {
1739 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
1741 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1742 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1766 template <
typename T>
1768 assert(ft.
nt() >= tstp_);
1770 this->right_multiply(ft.
ptr(-1), ft.
ptr(0), weight);
1794 template <
typename T>
1796 assert(tstp == tstp_);
1797 assert(ft.
nt() >= tstp_);
1799 this->right_multiply(ft.
ptr(-1), ft.
ptr(0), weight);
1827 template <
typename T>
1830 assert(tstp == tstp_);
1832 cplx *xtemp, *ftemp, *x0, *f0, *fcc;
1833 xtemp =
new cplx[element_size_];
1834 fcc =
new cplx[element_size_];
1835 assert(ft.
size1() == size1_ &&
"ft.size1() == size1_");
1836 assert(ft.
nt() >= tstp &&
"ft.nt() >= tstp");
1837 assert(tstp >= -1&&
"ft.nt() >= tstp");
1839 element_conj<T, LARGESIZE>(size1_, fcc, f0);
1842 for (m = 0; m <= ntau_; m++) {
1843 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
1845 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1846 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1850 for (m = 0; m <= tstp; m++) {
1851 element_conj<T, LARGESIZE>(size1_, fcc, ft.
ptr(m));
1852 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
1854 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1855 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1857 x0 = data_ + (tstp_ + 1) * element_size_;
1858 element_conj<T, LARGESIZE>(size1_, fcc, f0);
1859 for (m = 0; m <= ntau_; m++) {
1860 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
1862 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1863 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1865 ftemp = ft.
ptr(tstp);
1866 element_conj<T, LARGESIZE>(size1_, fcc, ftemp);
1867 x0 = data_ + (tstp_ + 1 + ntau_ + 1) * element_size_;
1868 for (m = 0; m <= tstp; m++) {
1869 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
1871 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
1872 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
1899 template <
typename T>
1902 assert(g1.size1_ == size1_ && g1.ntau_ == ntau_ && g1.tstp_ == tstp_);
1903 for (m = 0; m < total_size_; m++)
1904 data_[m] += weight * g1.data_[m];
1930 template <
typename T>
1932 assert(tstp == tstp_);
1933 assert(g1.size1_ == size1_ && g1.ntau_ == ntau_ && g1.tstp_ == tstp_);
1934 for (
int m = 0; m < total_size_; m++)
1935 data_[m] += weight * g1.data_[m];
1940 #define HERM_MATRIX_INCR_TSTP \ 1941 if (alpha == cplx(1.0, 0.0)) { \ 1942 for (i = 0; i < len; i++) \ 1945 for (i = 0; i < len; i++) \ 1946 x0[i] += alpha * x[i]; \ 1969 template <
typename T>
1973 assert(tstp_ <= g.
nt() && ntau_ == g.
ntau() && size1_ == g.
size1());
1975 len = (ntau_ + 1) * element_size_;
1978 HERM_MATRIX_INCR_TSTP
1980 len = (tstp_ + 1) * element_size_;
1981 x = g.retptr(tstp_, 0);
1983 HERM_MATRIX_INCR_TSTP
1984 len = (ntau_ + 1) * element_size_;
1985 x = g.tvptr(tstp_, 0);
1986 x0 = data_ + (tstp_ + 1) * element_size_;
1987 HERM_MATRIX_INCR_TSTP
1988 len = (tstp_ + 1) * element_size_;
1989 x = g.lesptr(0, tstp_);
1990 x0 = data_ + (tstp_ + 1 + ntau_ + 1) * element_size_;
1991 HERM_MATRIX_INCR_TSTP
2018 template <
typename T>
2020 assert(tstp == tstp_);
2021 assert(tstp_ <= g.
nt() && ntau_ == g.
ntau() && size1_ == g.
size1());
2025 len = (ntau_ + 1) * element_size_;
2028 HERM_MATRIX_INCR_TSTP
2030 len = (tstp_ + 1) * element_size_;
2031 x = g.retptr(tstp_, 0);
2033 HERM_MATRIX_INCR_TSTP
2034 len = (ntau_ + 1) * element_size_;
2035 x = g.tvptr(tstp_, 0);
2036 x0 = data_ + (tstp_ + 1) * element_size_;
2037 HERM_MATRIX_INCR_TSTP
2038 len = (tstp_ + 1) * element_size_;
2039 x = g.lesptr(0, tstp_);
2040 x0 = data_ + (tstp_ + 1 + ntau_ + 1) * element_size_;
2041 HERM_MATRIX_INCR_TSTP
2046 #undef HERM_MATRIX_INCR_TSTP 2067 template <
typename T>
2071 g_view.
smul(weight);
2098 template <
typename T>
2100 assert(tstp == tstp_);
2103 g_view.
smul(weight);
2135 template <
typename T>
2172 template <
typename T>
2175 assert(tstp == tstp_);
2209 template <
typename T>
2246 template <
typename T>
2281 template <
typename T>
2320 template <
typename T>
2324 assert(tstp == tstp_);
2360 std::vector<int> &i2,
herm_matrix<T> &g,std::vector<int> &j1,std::vector<int> &j2){
2361 assert(tstp == tstp_);
2362 assert(tstp <= g.
nt());
2363 assert(i1.size()==i2.size() && i1.size()==j1.size() && j1.size()==j2.size());
2364 assert(size1_*size2_==i1.size());
2365 for(
int k1=0;k1<i1.size();k1++){
2366 this->set_matrixelement(tstp,i1[k1],i2[k1],g,j1[k1],j2[k1]);
2402 assert(tstp == tstp_);
2403 assert(tstp == g.
tstp());
2404 assert(i1.size()==i2.size() && i1.size()==j1.size() && j1.size()==j2.size());
2405 assert(size1_*size2_==i1.size());
2406 for(
int k1=0;k1<i1.size();k1++){
2407 this->set_matrixelement(tstp,i1[k1],i2[k1],g,j1[k1],j2[k1]);
2418 #if CNTR_USE_MPI == 1 2437 template <
typename T>
2440 int len = 2 * (2 * (tstp_ + 1) + ntau_ + 1) * element_size_;
2441 MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
2442 if (
sizeof(T) ==
sizeof(
double)) {
2443 if (taskid == root) {
2444 MPI_Reduce(MPI_IN_PLACE, (
double *)this->data_, len, MPI_DOUBLE_PRECISION, MPI_SUM, root, MPI_COMM_WORLD);
2446 MPI_Reduce((
double *)this->data_,
2447 (
double *)this->data_, len, MPI_DOUBLE_PRECISION, MPI_SUM, root, MPI_COMM_WORLD);
2450 std::cerr <<
"herm_matrix_timestep<T>::MPI_Reduce only for double " 2475 template <
typename T>
2477 assert(tstp == tstp_);
2479 int len = 2 * (2 * (tstp_ + 1) + ntau_ + 1) * element_size_;
2480 MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
2481 if (
sizeof(T) ==
sizeof(
double)) {
2482 if (taskid == root) {
2483 MPI_Reduce(MPI_IN_PLACE, (
double *)this->data_, len,
2484 MPI_DOUBLE_PRECISION, MPI_SUM, root, MPI_COMM_WORLD);
2486 MPI_Reduce((
double *)this->data_,
2487 (
double *)this->data_, len, MPI_DOUBLE_PRECISION,
2488 MPI_SUM, root, MPI_COMM_WORLD);
2491 std::cerr <<
"herm_matrix_timestep<T>::MPI_Reduce only for double " 2525 template <
typename T>
2528 int numtasks,taskid;
2529 MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
2530 MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
2532 resize(tstp, ntau, size1);
2533 int len = (2 * (tstp_ + 1) + ntau_ + 1) * element_size_;
2535 assert(tstp == tstp_);
2536 assert(ntau == ntau_);
2537 assert(size1 == size1_);
2538 if (
sizeof(T) ==
sizeof(
double))
2539 MPI_Bcast(data_, len, MPI_DOUBLE_COMPLEX, root, MPI_COMM_WORLD);
2541 MPI_Bcast(data_, len, MPI_COMPLEX, root, MPI_COMM_WORLD);
2566 template <
typename T>
2568 int numtasks,taskid;
2569 MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
2570 MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
2572 resize(tstp, ntau_, size1_);
2573 int len = (2 * (tstp_ + 1) + ntau_ + 1) * element_size_;
2575 assert(tstp == tstp_);
2576 if (
sizeof(T) ==
sizeof(
double))
2577 MPI_Bcast(data_, len, MPI_DOUBLE_COMPLEX, root, MPI_COMM_WORLD);
2579 MPI_Bcast(data_, len, MPI_COMPLEX, root, MPI_COMM_WORLD);
2605 template <
typename T>
2607 int dest,
int tag) {
2609 MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
2610 int len = (2 * (tstp_ + 1) + ntau_ + 1) * element_size_;
2611 if (!(taskid == dest)) {
2612 assert(tstp == tstp_);
2613 assert(ntau == ntau_);
2614 assert(size1 == size1_);
2615 if (
sizeof(T) ==
sizeof(
double))
2616 MPI_Send(data_, len, MPI_DOUBLE_COMPLEX, dest, tag, MPI_COMM_WORLD);
2618 MPI_Send(data_, len, MPI_COMPLEX, dest, tag, MPI_COMM_WORLD);
2642 template <
typename T>
2645 MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
2646 int len = (2 * (tstp_ + 1) + ntau_ + 1) * element_size_;
2647 if (!(taskid == dest)) {
2648 assert(tstp == tstp_);
2649 if (
sizeof(T) ==
sizeof(
double))
2650 MPI_Send(data_, len, MPI_DOUBLE_COMPLEX, dest, tag, MPI_COMM_WORLD);
2652 MPI_Send(data_, len, MPI_COMPLEX, dest, tag, MPI_COMM_WORLD);
2680 template <
typename T>
2682 int root,
int tag) {
2684 MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
2685 if (!(taskid == root)) {
2686 resize(tstp, ntau, size1);
2687 int len = (2 * (tstp_ + 1) + ntau_ + 1) * element_size_;
2688 if (
sizeof(T) ==
sizeof(double))
2689 MPI_Recv(data_, len, MPI_DOUBLE_COMPLEX, root, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
2691 MPI_Recv(data_, len, MPI_COMPLEX, root, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
2715 template <
typename T>
2718 MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
2719 if (!(taskid == root)) {
2720 resize(tstp, ntau_, size1_);
2721 int len = (2 * (tstp_ + 1) + ntau_ + 1) * element_size_;
2722 if (
sizeof(T) ==
sizeof(double))
2723 MPI_Recv(data_, len, MPI_DOUBLE_COMPLEX, root, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
2725 MPI_Recv(data_, len, MPI_COMPLEX, root, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
2732 #undef herm_matrix_READ_ELEMENT 2733 #undef herm_matrix_READ_ELEMENT_MINUS_CONJ 2741 #if CNTR_USE_HDF5 == 1 2761 template <
typename T>
2787 template <
typename T>
2789 const char *groupname) {
2814 template <
typename T>
2816 const char *groupname) {
2839 template <
typename T>
2842 int tstp = read_primitive_type<int>(group_id,
"tstp");
2843 int ntau = read_primitive_type<int>(group_id,
"ntau");
2844 int sig = read_primitive_type<int>(group_id,
"sig");
2845 int size1 = read_primitive_type<int>(group_id,
"size1");
2847 this->resize(tstp, ntau, size1);
2872 template <
typename T>
2874 const char *groupname) {
2875 hid_t sub_group_id = open_group(group_id, groupname);
2876 this->read_from_hdf5(sub_group_id);
2877 close_group(sub_group_id);
2899 template <
typename T>
2901 const char *groupname) {
2902 hid_t file_id = read_hdf5_file(filename);
2903 this->read_from_hdf5(file_id, groupname);
2904 close_hdf5_file(file_id);
2910 #endif // CNTR_HERM_MATRIX_TIMESTEP_IMPL_H herm_matrix_timestep & operator=(const herm_matrix_timestep &g)
void smul(int tstp, T weight)
Multiply herm_matrix_timestep with scalar weight.
Class herm_matrix_timestep_view serves for interfacing with class herm_matrix_timestep without copyi...
void get_mat(const int m, std::complex< T > &G_mat, herm_matrix< T > &G, herm_matrix< T > &Gcc)
void density_matrix(int tstp, Matrix &M)
Returns the density matrix at given time step.
void Recv_timestep(int tstp, int root, int tag)
Recevies the herm_matrix at a given time step from a specific task.
Class herm_matrix_timestep deals with contour objects at a particular timestep .
void right_multiply_hermconj(int tstp, function< T > &ft, T weight=1.0)
Right-multiplies the herm_matrix_timestep with the hermitian conjugate of a contour function...
void smul(T alpha)
Multiply herm_matrix_timestep_view with scalar weight.
void set_timestep_zero(int tstp)
Sets all components at time step tstp to zero.
void resize(int nt, int ntau, int size1)
Resizes herm_matrix_timestep object with respect to the number of points on the Matsubara branch and...
std::complex< double > cplx
void set_matrixelement(int i1, int i2, herm_matrix_timestep_view< T > &g, int j1, int j2)
Set the matrix element of for each component from
void set_timestep(cyclic_timestep< T > ×tep, cyclic_timestep< T > ×tep_cc, int sig)
Class function for objects with time on real axis.
void Send_timestep(int tstp, int dest, int tag)
Sends the herm_matrix_timestep at a given time step to a specific task.
void write_to_hdf5(hid_t group_id)
Write herm_matrix_timestep to hdf5 group given by group_id
void read_from_hdf5(hid_t group_id, const char *groupname)
Read herm_matrix_timestep_view from hdf5 group given by group ID group_id and group name groupname...
void set_matrixelement(int i1, int i2, herm_matrix_timestep_view< T > &g, int j1, int j2)
Set the matrix element of for each component from
Class herm_matrix for two-time contour objects with hermitian symmetry.
void set_submatrix(int tstp, std::vector< int > &i1, std::vector< int > &i2, herm_matrix< T > &g, std::vector< int > &j1, std::vector< int > &j2)
Sets a (sub-) matrix of this contour object at a given time step to a (sub-) matrix of a given herm_...
void left_multiply_hermconj(int tstp, function< T > &ft, T weight=1.0)
Left-multiplies the herm_matrix_timestep with the hermitian conjugate of a contour function...
void write_to_hdf5(hid_t group_id)
Write herm_matrix_timestep_view to hdf5 group given by group_id.
void clear(void)
Sets all values to zero.
void Bcast_timestep(int tstp, int root)
Broadcasts the herm_matrix_timestep at a given time step to all ranks.
void read_from_hdf5(hid_t group_id, const char *groupname)
Read herm_matrix_timestep from hdf5 group given by group_id and group name groupname ...
void get_les(const int i, const int j, std::complex< T > &G_les, herm_matrix< T > &G, herm_matrix< T > &Gcc)
void incr_timestep(int tstp, herm_matrix_timestep< T > &g1, T weight)
Increase the value of the herm_matrix_timestep by weight
void Reduce_timestep(int tstp, int root)
MPI reduce for the herm_matrix_timestep
void incr(herm_matrix_timestep< T > &g1, T weight)
Increase the value of the herm_matrix_timestep by weight