NESSi  v1.0.2
The NonEquilibrium Systems Simulation Library

◆ right_multiply_hermconj()

template<typename T >
void cntr::herm_matrix< T >::right_multiply_hermconj ( int  tstp,
function< T > &  ft,
weight = 1.0 
)

Right-multiplies the herm_matrix with the hermitian conjugate of a contour function.

Purpose

Performs the operation \(C(t,t^\prime) \rightarrow w C(t,t^\prime)F^\ddagger(t^\prime)\), where \(C(t,t^\prime)\) is the herm_matrix, \(F(t)\) is a contour function and \(w\) is a real weight. The operation is performed at given time step tstp.

Parameters
tstp

The time step at which \(F^\ddagger(t)\) and \(C(t,t^\prime)\) are multiplied.

ft

The contour function.

weight

The weight as above.

Definition at line 3270 of file cntr_herm_matrix_impl.hpp.

3271  {
3272  int m;
3273  cplx *xtemp, *ftemp, *x0, *f0, *fcc;
3274  xtemp = new cplx[element_size_];
3275  fcc = new cplx[element_size_];
3276  assert(ft.size1() == size1_ && "ft.size1() == size1_");
3277  assert(ft.nt() >= tstp && "ft.nt() >= tstp");
3278  assert(tstp <= nt_&& "ft.nt() >= tstp");
3279  assert(tstp >= -1&& "ft.nt() >= tstp");
3280  f0 = ft.ptr(-1);
3281  element_conj<T, LARGESIZE>(size1_, fcc, f0);
3282  if (tstp == -1) {
3283  x0 = matptr(0);
3284  for (m = 0; m <= ntau_; m++) {
3285  element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
3286  fcc);
3287  element_smul<T, LARGESIZE>(size1_, xtemp, weight);
3288  element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
3289  }
3290  } else {
3291  x0 = retptr(tstp, 0);
3292  for (m = 0; m <= tstp; m++) {
3293  element_conj<T, LARGESIZE>(size1_, fcc, ft.ptr(m));
3294  element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
3295  fcc);
3296  element_smul<T, LARGESIZE>(size1_, xtemp, weight);
3297  element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
3298  }
3299  x0 = tvptr(tstp, 0);
3300  element_conj<T, LARGESIZE>(size1_, fcc, f0);
3301  for (m = 0; m <= ntau_; m++) {
3302  element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
3303  fcc);
3304  element_smul<T, LARGESIZE>(size1_, xtemp, weight);
3305  element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
3306  }
3307  ftemp = ft.ptr(tstp);
3308  element_conj<T, LARGESIZE>(size1_, fcc, ftemp);
3309  x0 = lesptr(0, tstp);
3310  for (m = 0; m <= tstp; m++) {
3311  element_mult<T, LARGESIZE>(size1_, xtemp, x0 + m * element_size_,
3312  fcc);
3313  element_smul<T, LARGESIZE>(size1_, xtemp, weight);
3314  element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
3315  }
3316  }
3317  delete[] fcc;
3318  delete[] xtemp;
3319 }
std::complex< T > cplx