1 #ifndef CNTR_HERM_PSEUDO_IMPL_H 2 #define CNTR_HERM_PSEUDO_IMPL_H 18 template <
typename T> herm_pseudo<T>::herm_pseudo() {
31 template <
typename T> herm_pseudo<T>::~herm_pseudo() {
38 template <
typename T> herm_pseudo<T>::herm_pseudo(
int nt,
int ntau,
int size1,
int sig) {
39 assert(size1 >= 0 && nt >= -1 && sig * sig == 1 && ntau >= 0);
45 element_size_ = size1 * size1;
47 mat_ =
new cplx[(ntau_ + 1) * element_size_];
48 memset(mat_, 0,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
52 if (nt >= 0 && size1 > 0) {
53 les_ =
new cplx[((nt_ + 1) * (nt_ + 2)) / 2 * element_size_];
54 ret_ =
new cplx[((nt_ + 1) * (nt_ + 2)) / 2 * element_size_];
55 tv_ =
new cplx[(nt_ + 1) * (ntau_ + 1) * element_size_];
56 memset(les_, 0,
sizeof(
cplx) * ((nt_ + 1) * (nt_ + 2)) / 2 * element_size_);
57 memset(ret_, 0,
sizeof(
cplx) * ((nt_ + 1) * (nt_ + 2)) / 2 * element_size_);
58 memset(tv_, 0,
sizeof(
cplx) * (nt_ + 1) * (ntau_ + 1) * element_size_);
66 template <
typename T>
unsigned long RAM_herm_pseudo(
int nt,
int ntau,
int dim) {
67 int element_size = dim * dim;
78 template <
typename T> herm_pseudo<T>::herm_pseudo(
const herm_pseudo &g) {
84 element_size_ = size1_ * size1_;
86 mat_ =
new cplx[(ntau_ + 1) * element_size_];
87 memcpy(mat_, g.mat_,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
91 if (nt_ >= 0 && size1_ > 0) {
92 les_ =
new cplx[((nt_ + 1) * (nt_ + 2)) / 2 * element_size_];
93 ret_ =
new cplx[((nt_ + 1) * (nt_ + 2)) / 2 * element_size_];
94 tv_ =
new cplx[(nt_ + 1) * (ntau_ + 1) * element_size_];
95 memcpy(les_, g.les_,
sizeof(
cplx) * ((nt_ + 1) * (nt_ + 2)) / 2 * element_size_);
96 memcpy(ret_, g.ret_,
sizeof(
cplx) * ((nt_ + 1) * (nt_ + 2)) / 2 * element_size_);
97 memcpy(tv_, g.tv_,
sizeof(
cplx) * (nt_ + 1) * (ntau_ + 1) * element_size_);
104 template <
typename T> herm_pseudo<T> &herm_pseudo<T>::operator=(
const herm_pseudo &g) {
108 if (nt_ != g.nt_ || ntau_ != g.ntau_ || size1_ != g.size1_) {
117 element_size_ = size1_ * size1_;
119 mat_ =
new cplx[(ntau_ + 1) * element_size_];
123 if (size1_ > 0 && nt_ >= 0) {
124 les_ =
new cplx[((nt_ + 1) * (nt_ + 2)) / 2 * element_size_];
125 ret_ =
new cplx[((nt_ + 1) * (nt_ + 2)) / 2 * element_size_];
126 tv_ =
new cplx[(nt_ + 1) * (ntau_ + 1) * element_size_];
134 memcpy(mat_, g.mat_,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
136 memcpy(les_, g.les_,
sizeof(
cplx) * ((nt_ + 1) * (nt_ + 2)) / 2 * element_size_);
137 memcpy(ret_, g.ret_,
sizeof(
cplx) * ((nt_ + 1) * (nt_ + 2)) / 2 * element_size_);
138 memcpy(tv_, g.tv_,
sizeof(
cplx) * (nt_ + 1) * (ntau_ + 1) * element_size_);
149 template <
typename T>
void herm_pseudo<T>::resize_discard(
int nt,
int ntau,
int size1) {
150 assert(ntau >= 0 && nt >= -1 && size1 >= 0);
159 element_size_ = size1 * size1;
161 mat_ =
new cplx[(ntau_ + 1) * element_size_];
162 memset(mat_, 0,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
166 if (nt_ >= 0 && size1_ > 0) {
167 les_ =
new cplx[((nt_ + 1) * (nt_ + 2)) / 2 * element_size_];
168 ret_ =
new cplx[((nt_ + 1) * (nt_ + 2)) / 2 * element_size_];
169 tv_ =
new cplx[(nt_ + 1) * (ntau_ + 1) * element_size_];
170 memset(les_, 0,
sizeof(
cplx) * ((nt_ + 1) * (nt_ + 2)) / 2 * element_size_);
171 memset(ret_, 0,
sizeof(
cplx) * ((nt_ + 1) * (nt_ + 2)) / 2 * element_size_);
172 memset(tv_, 0,
sizeof(
cplx) * (nt_ + 1) * (ntau_ + 1) * element_size_);
180 template <
typename T>
void herm_pseudo<T>::resize_nt(
int nt) {
181 int nt1 = (nt_ > nt ? nt : nt_);
182 cplx *ret, *les, *tv;
188 les =
new cplx[((nt_ + 1) * (nt_ + 2)) / 2 * element_size_];
189 ret =
new cplx[((nt_ + 1) * (nt_ + 2)) / 2 * element_size_];
190 tv =
new cplx[(nt_ + 1) * (ntau_ + 1) * element_size_];
191 memset(les, 0,
sizeof(
cplx) * ((nt_ + 1) * (nt_ + 2)) / 2 * element_size_);
192 memset(ret, 0,
sizeof(
cplx) * ((nt_ + 1) * (nt_ + 2)) / 2 * element_size_);
193 memset(tv, 0,
sizeof(
cplx) * (nt_ + 1) * (ntau_ + 1) * element_size_);
195 memcpy(les, les_,
sizeof(
cplx) * ((nt1 + 1) * (nt1 + 2)) / 2 * element_size_);
196 memcpy(ret, ret_,
sizeof(
cplx) * ((nt1 + 1) * (nt1 + 2)) / 2 * element_size_);
197 memcpy(tv, tv_,
sizeof(
cplx) * (nt1 + 1) * (ntau_ + 1) * element_size_);
212 template <
typename T>
void herm_pseudo<T>::resize(
int nt,
int ntau,
int size1) {
215 if (ntau == ntau_ && size1_ == size1)
218 resize_discard(nt, ntau, size1);
221 template <
typename T>
void herm_pseudo<T>::clear(
void) {
224 memset(mat_, 0,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
226 memset(les_, 0,
sizeof(
cplx) * ((nt_ + 2) * (nt_ + 1)) / 2 * element_size_);
227 memset(ret_, 0,
sizeof(
cplx) * ((nt_ + 2) * (nt_ + 1)) / 2 * element_size_);
228 memset(tv_, 0,
sizeof(
cplx) * (nt_ + 1) * (ntau_ + 1) * element_size_);
237 template <
typename T>
inline std::complex<T> *herm_pseudo<T>::lesptr(
int t,
int t1) {
238 assert(t >= 0 && t1 >= 0 && t <= t1 && t1 <= nt_);
239 return les_ + ((t1 * (t1 + 1)) / 2 + t) * element_size_;
242 template <
typename T>
inline std::complex<T> *herm_pseudo<T>::retptr(
int t,
int t1) {
243 assert(t >= 0 && t1 >= 0 && t <= nt_ && t1 <= t);
244 return ret_ + ((t * (t + 1)) / 2 + t1) * element_size_;
247 template <
typename T>
inline std::complex<T> *herm_pseudo<T>::tvptr(
int t,
int tau) {
248 assert(t >= 0 && tau >= 0 && t <= nt_ && tau <= ntau_);
249 return tv_ + (t * (ntau_ + 1) + tau) * element_size_;
252 template <
typename T>
inline std::complex<T> *herm_pseudo<T>::matptr(
int tau) {
253 assert(tau >= 0 && tau <= ntau_);
254 return mat_ + tau * element_size_;
264 #define herm_pseudo_READ_ELEMENT \ 266 int r, s, dim = size1_; \ 267 M.resize(dim, dim); \ 268 for (r = 0; r < dim; r++) \ 269 for (s = 0; s < dim; s++) \ 270 M(r, s) = x[r * dim + s]; \ 272 #define herm_pseudo_READ_ELEMENT_MINUS_CONJ \ 276 int r, s, dim = size1_; \ 277 M.resize(dim, dim); \ 278 for (r = 0; r < dim; r++) \ 279 for (s = 0; s < dim; s++) { \ 280 w = x[s * dim + r]; \ 281 M(r, s) = std::complex<T>(-w.real(), w.imag()); \ 284 template <
typename T>
286 template <
class Matrix>
291 herm_pseudo_READ_ELEMENT
294 herm_pseudo_READ_ELEMENT_MINUS_CONJ
298 template <
typename T>
299 template <
class Matrix>
304 herm_pseudo_READ_ELEMENT
307 herm_pseudo_READ_ELEMENT_MINUS_CONJ
311 template <
typename T>
312 template <
class Matrix>
314 cplx *x = tvptr(i, j);
315 herm_pseudo_READ_ELEMENT
318 template <
typename T>
319 template <
class Matrix>
321 cplx *x = tvptr(j, ntau_ - i);
322 herm_pseudo_READ_ELEMENT_MINUS_CONJ
if (sig_ == -1) M = -M;
325 template <
typename T>
326 template <
class Matrix>
329 herm_pseudo_READ_ELEMENT
332 template <
typename T>
333 template <
class Matrix>
334 void herm_pseudo<T>::get_matminus(
int i, Matrix &M) {
335 cplx *x = matptr(ntau_ - i);
336 herm_pseudo_READ_ELEMENT
if (sig_ == -1) M = -M;
339 template <
typename T>
340 template <
class Matrix>
368 x = *tvptr(j, ntau_ - i);
377 template <
typename T>
inline void herm_pseudo<T>::get_matminus(
int i,
cplx &x) {
378 x = *matptr(ntau_ - i);
393 #define herm_pseudo_SET_ELEMENT_MATRIX \ 395 int r, s, dim = size1_; \ 396 assert(M.rows() == dim && M.cols() == dim); \ 397 for (r = 0; r < dim; r++) \ 398 for (s = 0; s < dim; s++) \ 399 x[r * dim + s] = M(r, s); \ 401 template <
typename T>
403 template <
class Matrix>
404 void herm_pseudo<T>::set_ret(
int i,
int j, Matrix &M) {
405 cplx *x = retptr(i, j);
406 herm_pseudo_SET_ELEMENT_MATRIX
409 template <
typename T>
410 template <
class Matrix>
411 void herm_pseudo<T>::set_les(
int i,
int j, Matrix &M) {
412 cplx *x = lesptr(i, j);
413 herm_pseudo_SET_ELEMENT_MATRIX
416 template <
typename T>
417 template <
class Matrix>
418 void herm_pseudo<T>::set_tv(
int i,
int j, Matrix &M) {
419 cplx *x = tvptr(i, j);
420 herm_pseudo_SET_ELEMENT_MATRIX
423 template <
typename T>
424 template <
class Matrix>
425 void herm_pseudo<T>::set_mat(
int i, Matrix &M) {
427 herm_pseudo_SET_ELEMENT_MATRIX
430 template <
typename T>
inline void herm_pseudo<T>::set_les(
int i,
int j,
cplx x) {
434 template <
typename T>
inline void herm_pseudo<T>::set_ret(
int i,
int j,
cplx x) {
438 template <
typename T>
inline void herm_pseudo<T>::set_tv(
int i,
int j,
cplx x) {
442 template <
typename T>
inline void herm_pseudo<T>::set_mat(
int i,
cplx x) { *matptr(i) = x; }
444 template <
typename T> std::complex<T> herm_pseudo<T>::density_matrix(
int tstp) {
451 return std::complex<T>(0.0, sig_) * x1;
457 template <
typename T>
458 template <
class Matrix>
459 void herm_pseudo<T>::density_matrix(
int tstp, Matrix &M) {
465 M *= std::complex<T>(0.0, 1.0 * sig_);
475 template <
typename T>
void herm_pseudo<T>::print_to_file(
const char *file,
int precision) {
476 int i, j, l, sg = element_size_;
478 out.open(file, std::ios::out);
479 out.precision(precision);
480 out <<
"# " << nt_ <<
" " << ntau_ <<
" " << size1_ <<
" " 481 <<
" " << sig_ << std::endl;
482 for (j = 0; j <= ntau_; j++) {
484 for (l = 0; l < sg; l++)
485 out <<
" " << matptr(j)[l].real() <<
" " << matptr(j)[l].imag();
490 for (i = 0; i <= nt_; i++) {
491 for (j = 0; j <= i; j++) {
492 out <<
"ret: " << i <<
" " << j;
493 for (l = 0; l < sg; l++)
494 out <<
" " << retptr(i, j)[l].real() <<
" " << retptr(i, j)[l].imag();
500 for (i = 0; i <= nt_; i++) {
501 for (j = 0; j <= ntau_; j++) {
502 out <<
"tv: " << i <<
" " << j;
503 for (l = 0; l < sg; l++)
504 out <<
" " << tvptr(i, j)[l].real() <<
" " << tvptr(i, j)[l].imag();
510 for (j = 0; j <= nt_; j++) {
511 for (i = 0; i <= j; i++) {
512 out <<
"les: " << i <<
" " << j;
513 for (l = 0; l < sg; l++)
514 out <<
" " << lesptr(i, j)[l].real() <<
" " << lesptr(i, j)[l].imag();
524 template <
typename T>
void herm_pseudo<T>::read_from_file(
const char *file) {
525 int i, n, m, j, l, size1, sg, sig;
529 out.open(file, std::ios::in);
530 if (!(out >> s >> n >> m >> size1 >> sig)) {
531 std::cerr <<
"read G from file " << file <<
" error in file" << std::endl;
534 if (n > nt_ || m != ntau_ || size1 != size1_)
538 for (j = 0; j <= ntau_; j++) {
540 for (l = 0; l < sg; l++) {
541 if (!(out >> real >> imag)) {
542 std::cerr <<
"read G from file " << file <<
" error at mat (" << j <<
")" 546 matptr(j)[l] = std::complex<T>(real, imag);
550 for (i = 0; i <= n; i++) {
551 for (j = 0; j <= i; j++) {
553 for (l = 0; l < sg; l++) {
554 if (!(out >> real >> imag)) {
555 std::cerr <<
"read G from file " << file <<
" error at ret (" << i
556 <<
"," << j <<
")" << std::endl;
559 retptr(i, j)[l] = std::complex<T>(real, imag);
563 for (i = 0; i <= n; i++) {
564 for (j = 0; j <= ntau_; j++) {
566 for (l = 0; l < sg; l++) {
567 if (!(out >> real >> imag)) {
568 std::cerr <<
"read G from file " << file <<
" error at tv (" << i
569 <<
"," << j <<
")" << std::endl;
572 tvptr(i, j)[l] = std::complex<T>(real, imag);
576 for (j = 0; j <= n; j++) {
577 for (i = 0; i <= j; i++) {
579 for (l = 0; l < sg; l++) {
580 if (!(out >> real >> imag)) {
581 std::cerr <<
"read G from file " << file <<
" error at les (" << i
582 <<
"," << j <<
")" << std::endl;
585 lesptr(i, j)[l] = std::complex<T>(real, imag);
592 #if CNTR_USE_HDF5 == 1 595 template <
typename T>
void herm_pseudo<T>::write_to_hdf5(hid_t group_id) {
596 store_int_attribute_to_hid(group_id, std::string(
"ntau"), ntau_);
597 store_int_attribute_to_hid(group_id, std::string(
"nt"), nt_);
598 store_int_attribute_to_hid(group_id, std::string(
"sig"), sig_);
599 store_int_attribute_to_hid(group_id, std::string(
"size1"), size1_);
600 store_int_attribute_to_hid(group_id, std::string(
"size2"), size2_);
601 store_int_attribute_to_hid(group_id, std::string(
"element_size"), element_size_);
602 hsize_t len_shape = 3, shape[3];
606 shape[0] = ntau_ + 1;
607 store_cplx_array_to_hid(group_id, std::string(
"mat"), matptr(0), shape, len_shape);
610 shape[0] = ((nt_ + 1) * (nt_ + 2)) / 2;
612 store_cplx_array_to_hid(group_id, std::string(
"ret"), retptr(0, 0), shape,
614 store_cplx_array_to_hid(group_id, std::string(
"les"), lesptr(0, 0), shape,
616 shape[0] = (nt_ + 1) * (ntau_ + 1);
617 store_cplx_array_to_hid(group_id, std::string(
"tv"), tvptr(0, 0), shape, len_shape);
621 template <
typename T>
622 void herm_pseudo<T>::write_to_hdf5(hid_t group_id,
const char *groupname) {
623 hid_t sub_group_id = create_group(group_id, groupname);
624 this->write_to_hdf5(sub_group_id);
625 close_group(sub_group_id);
628 template <
typename T>
629 void herm_pseudo<T>::write_to_hdf5(
const char *filename,
const char *groupname) {
630 hid_t file_id = open_hdf5_file(filename);
631 this->write_to_hdf5(file_id, groupname);
632 close_hdf5_file(file_id);
635 template <
typename T>
void herm_pseudo<T>::read_from_hdf5(hid_t group_id) {
637 int nt = read_primitive_type<int>(group_id,
"nt");
638 int ntau = read_primitive_type<int>(group_id,
"ntau");
639 int sig = read_primitive_type<int>(group_id,
"sig");
640 int size1 = read_primitive_type<int>(group_id,
"size1");
642 this->resize(nt, ntau, size1);
645 hsize_t mat_size = (ntau + 1) * element_size_;
646 read_primitive_type_array(group_id,
"mat", mat_size, matptr(0));
649 hsize_t ret_size = ((nt + 1) * (nt + 2)) / 2 * element_size_;
650 hsize_t les_size = ((nt + 1) * (nt + 2)) / 2 * element_size_;
651 hsize_t tv_size = ((nt + 1) * (ntau + 1)) * element_size_;
652 read_primitive_type_array(group_id,
"ret", ret_size, retptr(0, 0));
653 read_primitive_type_array(group_id,
"les", les_size, lesptr(0, 0));
654 read_primitive_type_array(group_id,
"tv", tv_size, tvptr(0, 0));
658 template <
typename T>
659 void herm_pseudo<T>::read_from_hdf5(hid_t group_id,
const char *groupname) {
660 hid_t sub_group_id = open_group(group_id, groupname);
661 this->read_from_hdf5(sub_group_id);
662 close_group(sub_group_id);
665 template <
typename T>
666 void herm_pseudo<T>::read_from_hdf5(
const char *filename,
const char *groupname) {
667 hid_t file_id = read_hdf5_file(filename);
668 this->read_from_hdf5(file_id, groupname);
669 close_hdf5_file(file_id);
672 template <
typename T>
void herm_pseudo<T>::read_from_hdf5(
int nt1, hid_t group_id) {
674 gtmp.read_from_hdf5(group_id);
675 assert(nt1 >= -1 && nt1 <= gtmp.nt());
676 assert(nt1 >= -1 && nt1 <= nt_);
677 assert(gtmp.size1() == size1_);
678 assert(gtmp.element_size() == element_size_);
679 assert(gtmp.ntau() == ntau_);
681 for (
int n = -1; n <= nt1; n++)
685 template <
typename T>
686 void herm_pseudo<T>::read_from_hdf5(
int nt1, hid_t group_id,
const char *groupname) {
687 hid_t sub_group_id = open_group(group_id, groupname);
688 this->read_from_hdf5(nt1, sub_group_id);
689 close_group(sub_group_id);
692 template <
typename T>
693 void herm_pseudo<T>::read_from_hdf5(
int nt1,
const char *filename,
const char *groupname) {
694 hid_t file_id = read_hdf5_file(filename);
695 this->read_from_hdf5(nt1, file_id, groupname);
696 close_hdf5_file(file_id);
707 template <
typename T>
void herm_pseudo<T>::set_timestep_zero(
int tstp) {
708 assert(tstp >= -1 && tstp <= nt_);
710 memset(matptr(0), 0,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
712 memset(retptr(tstp, 0), 0,
sizeof(
cplx) * (tstp + 1) * element_size_);
713 memset(tvptr(tstp, 0), 0,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
714 memset(lesptr(0, tstp), 0,
sizeof(
cplx) * (tstp + 1) * element_size_);
719 assert(tstp >= -1 && tstp <= nt_ && tstp <= g1.nt());
720 assert(g1.size1() == size1_);
721 assert(g1.ntau() == ntau_);
723 memcpy(mat_, g1.mat_,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
725 memcpy(retptr(tstp, 0), g1.retptr(tstp, 0),
726 sizeof(
cplx) * (tstp + 1) * element_size_);
727 memcpy(tvptr(tstp, 0), g1.tvptr(tstp, 0),
728 sizeof(
cplx) * (ntau_ + 1) * element_size_);
729 memcpy(lesptr(0, tstp), g1.lesptr(0, tstp),
730 sizeof(
cplx) * (tstp + 1) * element_size_);
734 template <
typename T>
736 cplx *x = timestep.data_;
737 assert(tstp >= -1 && tstp <= nt_);
738 assert(timestep.tstp_ == tstp && timestep.ntau_ == ntau_ && timestep.size1_ == size1_);
740 memcpy(mat_, x,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
742 memcpy(retptr(tstp, 0), x,
sizeof(
cplx) * (tstp + 1) * element_size_);
743 memcpy(tvptr(tstp, 0), x + (tstp + 1) * element_size_,
744 sizeof(
cplx) * (ntau_ + 1) * element_size_);
745 memcpy(lesptr(0, tstp), x + (tstp + 1 + ntau_ + 1) * element_size_,
746 sizeof(
cplx) * (tstp + 1) * element_size_);
750 template <
typename T>
752 int len = (2 * (tstp + 1) + ntau_ + 1) * element_size_;
754 assert(tstp >= -1 && tstp <= nt_);
755 if (timestep.total_size_ < len)
756 timestep.resize(tstp, ntau_, size1_);
758 timestep.tstp_ = tstp;
759 timestep.ntau_ = ntau_;
760 timestep.size1_ = size1_;
762 memcpy(x, mat_,
sizeof(
cplx) * (ntau_ + 1) * element_size_);
764 memcpy(x, retptr(tstp, 0),
sizeof(
cplx) * (tstp + 1) * element_size_);
765 memcpy(x + (tstp + 1) * element_size_, tvptr(tstp, 0),
766 sizeof(
cplx) * (ntau_ + 1) * element_size_);
767 memcpy(x + (tstp + 1 + ntau_ + 1) * element_size_, lesptr(0, tstp),
768 sizeof(
cplx) * (tstp + 1) * element_size_);
772 #define herm_pseudo_INCR_TSTP \ 773 if (alpha == cplx(1.0, 0.0)) { \ 774 for (i = 0; i < len; i++) \ 777 for (i = 0; i < len; i++) \ 778 x0[i] += alpha * x[i]; \ 780 template <
typename T>
782 void herm_pseudo<T>::incr_timestep(
int tstp, herm_matrix_timestep<T> ×tep,
783 std::complex<T> alpha) {
786 assert(tstp >= -1 && tstp <= nt_);
787 assert(timestep.tstp_ == tstp && timestep.ntau_ == ntau_ && timestep.size1_ == size1_);
789 len = (ntau_ + 1) * element_size_;
792 herm_pseudo_INCR_TSTP
794 len = (tstp + 1) * element_size_;
795 x0 = retptr(tstp, 0);
797 herm_pseudo_INCR_TSTP len = (ntau_ + 1) * element_size_;
799 x = timestep.data_ + (tstp + 1) * element_size_;
800 herm_pseudo_INCR_TSTP len = (tstp + 1) * element_size_;
801 x0 = lesptr(0, tstp);
802 x = timestep.data_ + (tstp + 1 + ntau_ + 1) * element_size_;
803 herm_pseudo_INCR_TSTP
806 #undef herm_pseudo_INCR_TSTP 807 template <
typename T>
void herm_pseudo<T>::smul(
int tstp, T weight) {
811 assert(tstp >= -1 && tstp <= nt_);
814 for (m = 0; m <= ntau_; m++) {
815 element_smul<T, LARGESIZE>(size1_, x0 + m * element_size_, weight);
818 x0 = retptr(tstp, 0);
819 for (m = 0; m <= tstp; m++) {
820 element_smul<T, LARGESIZE>(size1_, x0 + m * element_size_, weight);
823 for (m = 0; m <= ntau_; m++) {
824 element_smul<T, LARGESIZE>(size1_, x0 + m * element_size_, weight);
826 x0 = lesptr(0, tstp);
827 for (m = 0; m <= tstp; m++) {
828 element_smul<T, LARGESIZE>(size1_, x0 + m * element_size_, weight);
833 template <
typename T>
void herm_pseudo<T>::smul(
int tstp, std::complex<T> weight) {
836 assert(tstp >= -1 && tstp <= nt_);
839 for (m = 0; m <= ntau_; m++) {
840 element_smul<T, LARGESIZE>(size1_, x0 + m * element_size_, weight);
843 x0 = retptr(tstp, 0);
844 for (m = 0; m <= tstp; m++) {
845 element_smul<T, LARGESIZE>(size1_, x0 + m * element_size_, weight);
848 for (m = 0; m <= ntau_; m++) {
849 element_smul<T, LARGESIZE>(size1_, x0 + m * element_size_, weight);
851 x0 = lesptr(0, tstp);
852 for (m = 0; m <= tstp; m++) {
853 element_smul<T, LARGESIZE>(size1_, x0 + m * element_size_, weight);
862 template <
typename T>
863 void herm_pseudo<T>::left_multiply(
int tstp, std::complex<T> *f0, std::complex<T> *ft,
866 cplx *xtemp, *ftemp, *x0;
867 xtemp =
new cplx[element_size_];
868 assert(tstp >= -1 && tstp <= nt_);
871 for (m = 0; m <= ntau_; m++) {
872 element_mult<T, LARGESIZE>(size1_, xtemp, f0, x0 + m * element_size_);
873 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
874 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
877 ftemp = ft + tstp * element_size_;
878 x0 = retptr(tstp, 0);
879 for (m = 0; m <= tstp; m++) {
880 element_mult<T, LARGESIZE>(size1_, xtemp, ftemp, x0 + m * element_size_);
881 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
882 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
885 for (m = 0; m <= ntau_; m++) {
886 element_mult<T, LARGESIZE>(size1_, xtemp, ftemp, x0 + m * element_size_);
887 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
888 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
890 x0 = lesptr(0, tstp);
891 for (m = 0; m <= tstp; m++) {
892 element_mult<T, LARGESIZE>(size1_, xtemp, ft + m * element_size_,
893 x0 + m * element_size_);
894 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
895 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
901 template <
typename T>
902 void herm_pseudo<T>::left_multiply(
int tstp, function<T> &ft, T weight) {
903 assert(tstp >= -1 && tstp <= nt_ && ft.nt() >= tstp && ft.size1() == size1_ &&
904 ft.size2() == size2_);
906 left_multiply(tstp, ft.ptr(-1), ft.ptr(0), weight);
908 left_multiply(tstp, ft.ptr(-1), 0, weight);
912 template <
typename T>
913 void herm_pseudo<T>::right_multiply(
int tstp, std::complex<T> *f0, std::complex<T> *ft,
916 cplx *xtemp, *ftemp, *x0;
917 xtemp =
new cplx[element_size_];
918 assert(tstp >= -1 && tstp <= nt_);
921 for (m = 0; m <= ntau_; m++) {
922 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_, f0);
923 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
924 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
927 x0 = retptr(tstp, 0);
928 for (m = 0; m <= tstp; m++) {
929 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
930 ft + m * element_size_);
931 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
932 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
935 for (m = 0; m <= ntau_; m++) {
936 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_, f0);
937 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
938 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
940 ftemp = ft + tstp * element_size_;
941 x0 = lesptr(0, tstp);
942 for (m = 0; m <= tstp; m++) {
943 element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_, ftemp);
944 element_smul<T, LARGESIZE>(size1_, xtemp, weight);
945 element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
951 template <
typename T>
952 void herm_pseudo<T>::right_multiply(
int tstp, function<T> &ft, T weight) {
953 assert(tstp >= -1 && tstp <= nt_ && ft.nt() >= tstp && ft.size1() == size1_ &&
954 ft.size2() == size2_);
956 right_multiply(tstp, ft.ptr(-1), ft.ptr(0), weight);
958 right_multiply(tstp, ft.ptr(-1), 0, weight);
964 int len=2*(tstp+1)+ntau_,len1,j;
966 len1=len*element_size_;
967 assert(tstp>=-1 && tstp<=nt_);
968 if((
int)data.size()<len1) data.resize(len1);
969 j=(tstp>=0 ? IDXLOWER(tstp) : IDXIMAG(0));
971 for(i=0;i<len1;i++) data[i]=x[i];
974 int len=2*(tstp+1)+ntau_,j;
976 assert(tstp>=-1 && tstp<=nt_);
977 if((
int)data.size()<len) data.resize(len);
978 j=(tstp>=0 ? IDXLOWER(tstp) : IDXIMAG(0));
981 if(data[i].size1()!=size1_ || data[i].size2()!=size1_) data[i].resize(size1_,size1_);
983 data[i]=x[i*element_size_];
987 int len=2*(tstp+1)+ntau_;
988 assert((
int)data.size()>=len*element_size_);
997 template<
typename T>
void herm_pseudo<T>::set_timestep_to_zero(
int tstp);
998 template<
typename T>
void herm_pseudo<T>::smul_timestep(
int tstp,
cplx lambda);
999 template<
typename T>
void herm_pseudo<T>::increment_timestep(
int tstp,std::vector<cplx> &data,
cplx alpha=1.0);
1002 template<
class Matrix>
void get_timestep(
int tstp,std::vector<Matrix> &data);
1003 template<
class Matrix>
void set_timestep(
int tstp,std::vector<Matrix> &data);
1012 int sg=G.element_size(),ntau=G.ntau(),m,l=0;
1013 std::complex<double> *x1;
1016 for(m=0;m<=tstp;m++){
1019 G.element_set(G.retptr(tstp,tstp-m),x1,G);
1020 G.element_smul(G.retptr(tstp,tstp-m),-1);
1021 G.element_conj(G.retptr(tstp,tstp-m));
1024 for(m=0;m<=ntau;m++){
1026 G.element_set(G.tvptr(tstp,ntau-m),x1,G);
1027 G.element_conj(G.tvptr(tstp,ntau-m));
1028 G.element_smul(G.tvptr(tstp,ntau-m),-G.sig());
1031 for(m=0;m<=tstp;m++){
1033 G.element_set(G.lesptr(m,tstp),x1,G);
1037 for(m=0;m<=ntau;m++){
1039 G.element_set(G.matptr(m),x1,G);
1040 G.element_smul(G.matptr(m),std::complex<double>(0,-1));
1047 int sg=G.element_size(),ntau=G.ntau(),m,l=0;
1048 std::complex<double> *x1;
1052 for(m=0;m<=tstp;m++){
1055 G.element_set(x1,G.retptr(tstp,tstp-m),G);
1056 G.element_smul(x1,-1);
1060 for(m=0;m<=ntau;m++){
1062 G.element_set(x1,G.tvptr(tstp,ntau-m),G);
1064 G.element_smul(x1,-G.sig());
1067 for(m=0;m<=tstp;m++){
1069 G.element_set(x1,G.lesptr(m,tstp),G);
1073 for(m=0;m<=ntau;m++){
1075 G.element_set(x1,G.matptr(m),G);
1076 G.element_smul(x1,std::complex<double>(0,1));
1081 template <
typename T,
class Matrix>
1083 int i,l,m,sg,dim,ntau=G.ntau(),nmax=(tstp<0 ? ntau+1 : ntau+2*tstp+3);
1084 std::complex<T> *data1;
1085 assert((
int)data.size()>=nmax);
1088 data1=
new std::complex<T> [nmax*sg];
1089 for(i=0;i<nmax;i++)
for(l=0;l<dim;l++)
for(m=0;m<dim;m++) data1[i*sg+l*dim+m]=data[i](l,m);
1093 template <
typename T,
class Matrix>
1095 int i,l,m,sg,dim,ntau=G.ntau(),nmax=(tstp<0 ? ntau+1 : ntau+2*tstp+3);
1096 std::complex<T> *data1;
1097 assert((
int)data.size()>=nmax);
1100 data1=
new std::complex<T> [nmax*sg];
1102 if(alpha.real()==1 && alpha.imag()==0)
for(i=0;i<nmax;i++)
for(l=0;l<dim;l++)
for(m=0;m<dim;m++) data1[i*sg+l*dim+m] += data[i](l,m);
1103 else for(i=0;i<nmax;i++)
for(l=0;l<dim;l++)
for(m=0;m<dim;m++) data1[i*sg+l*dim+m] += alpha*data[i](l,m);
1107 template <
typename T,
class Matrix>
1109 int i,l,m,sg,dim,ntau=G.ntau(),nmax=(tstp<0 ? ntau+1 : ntau+2*tstp+3);
1110 std::complex<T> *data1;
1111 assert((
int)data.size()>=nmax);
1114 data1=
new std::complex<T> [nmax*sg];
1116 for(i=0;i<nmax;i++)
for(l=0;l<dim;l++)
for(m=0;m<dim;m++) data[i](l,m)=data1[i*sg+l*dim+m];
1124 #endif // CNTR_HERM_PSEUDO_IMPL_H void get_mat(const int m, std::complex< T > &G_mat, herm_matrix< T > &G, herm_matrix< T > &Gcc)
void get_timestep(int tstp, std::vector< Matrix > &data)
void set_timestep_pseudo(int tstp, GG &G, std::complex< double > *timestep)
void get_tv(const int i, const int m, std::complex< T > &G_tv, herm_matrix< T > &G, herm_matrix< T > &Gcc)
std::complex< double > cplx
void get_vt(const int m, const int i, std::complex< T > &G_vt, herm_matrix< T > &G, herm_matrix< T > &Gcc)
void increment_timestep_matrix_pseudo(int tstp, matrix< T > &G, std::complex< T > alpha, std::vector< Matrix > &data)
void get_ret(const int i, const int j, std::complex< T > &G_ret, herm_matrix< T > &G, herm_matrix< T > &Gcc)
void set_timestep_matrix_pseudo(int tstp, matrix< T > &G, std::vector< Matrix > &data)
void get_timestep_matrix_pseudo(int tstp, matrix< T > &G, std::vector< Matrix > &data)
void get_les(const int i, const int j, std::complex< T > &G_les, herm_matrix< T > &G, herm_matrix< T > &Gcc)
void get_gtr(const int i, const int j, std::complex< T > &G_gtr, herm_matrix< T > &G, herm_matrix< T > &Gcc)
void set_timestep(int tstp, std::vector< Matrix > &data)
void get_timestep_pseudo(int tstp, GG &G, std::complex< double > *timestep)