Dyson Equation
The Dyson equation for the Green’s function \(G(t,t^\prime)\) can be written as:
This equation is to be solved for \(G(t,t^\prime)\) for given input \(\epsilon(t)\) and \(\Sigma(t,t^\prime)\), and the KMS boundary conditions. All quantities \(\Sigma(t,t^\prime)\), \(G(t,t^\prime)\), and \(\epsilon(t)\) are square matrices. The equation is an integro-differential form of the Dyson series:
where the free Green’s function \(G_0\) is determined by the differential equation \(i\partial_t G(t,t^\prime) + \mu G(t,t^\prime) - \epsilon(t) G(t,t^\prime) = \delta_{\mathcal{C}}(t,t^\prime)\) (cf Sec. Free Green’s Functions).
It is assumed that \(\Sigma=\Sigma^\ddagger\) is hermitian, and \(\epsilon(t) =\epsilon(t)^\dagger\), which implies that also the solution \(G\) possesses hermitian symmetry. Because of the hermitian symmetry, \(G\) can also be determined from the equivalent conjugate equation:
Because of its causal nature, the Dyson equation can be solved in a time-stepping manner (see explanation at input/output relation below). The following routines are used to solve the Dyson equation:
|
Solve (9) for |
|
Solve (9) for |
|
Solve (9) for |
|
Solve (9) for |
|
Same as |
GandSigmaare Green’s functions of typecntr::herm_matrix<T>, assumed to be hermitianHis acntr::function<T>, the function \(\epsilon\) in (9).SolveOrder\(\in\)1,...,MAX_SOLVE_ORDER, the order of accuracy for the solution. UseSolveOrder=5(=MAX_SOLVE_ORDER) if there is no good reason against it.dtis the time-discretization step \(\Delta t\) on the real-time branchbetais the length of the imaginary-time contour (inverse temperature)Size requirements:
G.size1()==Sigma.size1()==H.size1(),G.ntau()==Sigma.ntau(),G.ntau() > SolveOrderFor
dyson_start:G.nt(),Sigma.nt() >= SolveOrderFor
dyson_timestep:G.nt(),Sigma.nt() >= tstp
Special numerical parameters for
dyson_mat:MAT_METHOD=CNTR_MAT_FOURIERorCNTR_MAT_FIXPOINT. Different methods to solve the equation on the Matsubara contour.CNTR_MAT_FIXPOINTis default and should be used.
Input/Output relation and time-stepping:
dyson_mat:Sigmais read on timesteptstp=-1,His read on timeststp=-1;Gis written on timesteptstp=-1dyson_start:Sigmais read on timesteptstp=-1,...,SolveOrder,His read on timeststp=-1,...,SolveOrder,Gis read on timesteptstp=-1;Gis written on timesteptstp=0,...,SolveOrderdyson_timestep:Sigmais read on timestept=-1,...,tstp,His read on timest=-1,...,tstp,Gis read on timestept=-1,...tstp-1;Gis written on timestept=tstp
Because of this causal structure, the Dyson equation can be solved by time-stepping: First G is determined on timestep tstp=-1 using dyson_mat. The result enters the determination of G on timesteps 0,...,SolveOrder, done with dyson_start. The equation is solved successively for timesteps tstp=SolveOrder+1,SolveOrder+2,..., where the result at timestep tstp depends on all previous timesteps.
Example:
Solution of (9) on all times for given self-energy:
int nt=10;
int ntau=20;
int size1=2;
int SolveOrder=5;
double dt=0.01; // time-discretization
double beta=10.0; // inverse temperature
double mu=1.433; // chemical potential
GREEN G(nt,ntau,size1,FERMION);
GREEN Sigma(nt,ntau,size1,FERMION);
CFUNC H(nt,size1);
//...
// ... do something to set H and Sigma on timestep -1
// solve for G on timestep -1:
cntr::dyson_mat(G,mu,H,Sigma,beta,SolveOrder,CNTR_MAT_FIXPOINT);
// ... do something to set H and Sigma on timesteps 0 ... SolveOrder=5
// solve for G on timesteps 0 ... SolveOrder=5
cntr::dyson_start(G,mu,H,Sigma,beta,dt,SolveOrder);
//all other timesteps:
for(int tstp=SolveOrder+1;tstp<=nt;tstp++){
// ... do something to set H and Sigma on timestep tstp
cntr::dyson_timestep(tstp,G,mu,H,Sigma,beta,dt,SolveOrder);
}
OpenMP parallelization:
The variant dyson_timestep_omp uses shared memory openMP parallelization to distribute the evaluation of \(G(t,t')\) for different time arguments of the timestep tstp over omp_num_threads tasks. Note that dyson_timestep_omp and dyson_timestep follow a slightly different implementation, thus the result differs by the numerical error.
The openMP parallelization is handled internally in dyson_timestep_omp. A race condition cannot occur if omp_num_threads is set to the number of openMP threads in the current team.