NESSi  v1.0.2
The NonEquilibrium Systems Simulation Library

◆ dyson_timestep_omp()

template<typename T >
void cntr::dyson_timestep_omp ( int  omp_num_threads,
int  n,
herm_matrix< T > &  G,
lam0,
function< T > &  H,
herm_matrix< T > &  Sigma,
beta,
h,
int  SolveOrder 
)

One step Dyson solver (integral-differential form) for a Green's function \(G\) using openMP parallelization

Purpose

One solves the Dyson equation of the following form: \( [ id/dt + \mu - H(t) ] G(t,t^\prime) - [\Sigma*G](t,t^\prime) = \delta(t,t^\prime)\) for a hermitian matrix \(G(t, t^\prime)\) at a given timestep 'n', i.e., G^ret(nh,t'<=nh), G^les(t<=nh,nh), G^tv(nt,tau=0..beta). Timestep must be >k, where k is the Integration order 'I'. The timesteps n=0..k must be computed seperately, using the routine "_start", which assumes that the Matsubara component of \(G\) and \(\Sigma(t,t^\prime)\) for \(t,t^\prime\)<=k are given. Here, are given: \(\Sigma(t, t^\prime)\), \(\mu\), and \(H(t)\).

Parameters
omp_num_threads

[int] The number of openMP threads to be used. Set to the number of threads in the current team. If omp_num_threads = -1, the maximum available number of threads is used.

n

[int] time step

&G

[herm_matrix<T>] solution

lam0

[T] chemical potential

&H

[function<T>] time-dependent function

&Sigma

[herm_matrix<T>] self-energy

beta

[double] inverse temperature

h

[double] time interval

SolveOrder

[int] integrator order

Definition at line 577 of file cntr_dyson_omp_impl.hpp.

References cntr::function< T >::nt(), cntr::herm_matrix< T >::nt(), cntr::herm_matrix< T >::ntau(), cntr::function< T >::ptr(), cntr::herm_matrix< T >::sig(), cntr::function< T >::size1(), and cntr::herm_matrix< T >::size1().

579  {
580  int size1 = G.size1();
581  int omp_num_threads1 = (omp_num_threads == -1 ? omp_get_max_threads() : omp_num_threads);
582  assert(SolveOrder + 1<= n);
583  assert(n<= Sigma.nt());
584  assert(n<= G.nt());
585  assert(n<= H.nt());
586  assert(G.sig()== Sigma.sig());
587  assert(G.size1()== Sigma.size1());
588  assert(G.size1()== H.size1());
589  assert(G.ntau()== Sigma.ntau());
590  if (size1 == 1) {
591  dyson_timestep_ret_omp<T, herm_matrix<T>, 1>(omp_num_threads1, n, G, lam0, H.ptr(0),
592  Sigma, integration::I<T>(SolveOrder), h);
593  dyson_timestep_tv_omp<T, herm_matrix<T>, 1>(omp_num_threads1, n, G, lam0, H.ptr(n),
594  Sigma, integration::I<T>(SolveOrder), beta, h);
595  dyson_timestep_les_omp<T, herm_matrix<T>, 1>(omp_num_threads1, n, G, lam0, H.ptr(0),
596  Sigma, integration::I<T>(SolveOrder), beta, h);
597  } else {
598  dyson_timestep_ret_omp<T, herm_matrix<T>, LARGESIZE>(omp_num_threads1, n, G, lam0,
599  H.ptr(0), Sigma, integration::I<T>(SolveOrder), h);
600  dyson_timestep_tv_omp<T, herm_matrix<T>, LARGESIZE>(omp_num_threads1, n, G, lam0,
601  H.ptr(n), Sigma, integration::I<T>(SolveOrder), beta, h);
602  dyson_timestep_les_omp<T, herm_matrix<T>, LARGESIZE>(omp_num_threads1, n, G, lam0,
603  H.ptr(0), Sigma, integration::I<T>(SolveOrder), beta, h);
604  }
605 }
+ Here is the call graph for this function: