NESSi  v1.0.2
The NonEquilibrium Systems Simulation Library

◆ left_multiply_hermconj()

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

Left-multiplies the herm_matrix_timestep_view with the hermitian conjugate of a contour function.

Purpose

Performs the operation \(C(t,t^\prime) \rightarrow w F^\ddagger(t)C(t,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

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

ft

[function] The contour function.

weight

[T] The weight as above.

Definition at line 953 of file cntr_herm_matrix_timestep_view_impl.hpp.

References cntr::function< T >::nt(), cntr::function< T >::ptr(), cntr::function< T >::size1(), and cntr::function< T >::size2().

954  {
955  int m;
956  cplx *xtemp, *ftemp, *x0, *f0, *fcc;
957  xtemp = new cplx[element_size_];
958  fcc = new cplx[element_size_];
959  assert(tstp >= -1 && ft.nt() >= tstp &&
960  ft.size1() == size1_ && ft.size2() == size2_ &&
961  "tstp >= -1 && ft.nt() >= tstp && ft.size1() == size1_ && ft.size2() == size2_");
962 
963  f0 = ft.ptr(-1);
964  element_conj<T, LARGESIZE>(size1_, fcc, f0);
965  if (tstp == -1) {
966  x0 = matptr(0);
967  for (m = 0; m <= ntau_; m++) {
968  element_mult<T, LARGESIZE>(size1_, xtemp, fcc,
969  x0 + m * element_size_);
970  element_smul<T, LARGESIZE>(size1_, xtemp, weight);
971  element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
972  }
973  } else {
974  ftemp = ft.ptr(tstp);
975  element_conj<T, LARGESIZE>(size1_, fcc, ftemp);
976  x0 = retptr(tstp, 0);
977  for (m = 0; m <= tstp; m++) {
978  element_mult<T, LARGESIZE>(size1_, xtemp, fcc,
979  x0 + m * element_size_);
980  element_smul<T, LARGESIZE>(size1_, xtemp, weight);
981  element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
982  }
983  x0 = tvptr(tstp, 0);
984  for (m = 0; m <= ntau_; m++) {
985  element_mult<T, LARGESIZE>(size1_, xtemp, fcc,
986  x0 + m * element_size_);
987  element_smul<T, LARGESIZE>(size1_, xtemp, weight);
988  element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
989  }
990  x0 = lesptr(0, tstp);
991  for (m = 0; m <= tstp; m++) {
992  element_conj<T, LARGESIZE>(size1_, fcc, ft.ptr(m));
993  element_mult<T, LARGESIZE>(size1_, xtemp, fcc,
994  x0 + m * element_size_);
995  element_smul<T, LARGESIZE>(size1_, xtemp, weight);
996  element_set<T, LARGESIZE>(size1_, x0 + m * element_size_, xtemp);
997  }
998  }
999  delete[] xtemp;
1000  delete[] fcc;
1001 }
+ Here is the call graph for this function: