import numpy as np
import time
from .impurity import Fastdiagram
from .ac_pes import *
from .diag import *
[docs]
def two_band_init(U, v, mu):
F = np.zeros((2,4,4), dtype=np.complex128)
F_dag = np.zeros((2,4,4), dtype=np.complex128)
c0_S_dag = np.zeros((4,4), dtype=np.complex128)
c1_S_dag = np.zeros((4,4), dtype=np.complex128)
c0_S_dag[2,0] = 1
c0_S_dag[3,1] = 1
c1_S_dag[1,0] = 1
c1_S_dag[3,2] = -1
c0_S = np.conjugate(np.transpose(c0_S_dag))
c1_S = np.conjugate(np.transpose(c1_S_dag))
F[0,:,:] = c0_S
F[1,:,:] = c1_S
F_dag[0,:,:] = c0_S_dag
F_dag[1,:,:] = c1_S_dag
H_S = U*np.matmul(np.matmul(c0_S_dag,c0_S) ,np.matmul(c1_S_dag,c1_S))
H_S = H_S- v*(np.matmul(c0_S_dag,c1_S)+np.matmul(c1_S_dag,c0_S));
H_S = H_S - mu*(np.matmul(c0_S_dag,c0_S)+np.matmul(c1_S_dag,c1_S))
return H_S, F, F_dag
[docs]
def calc_eta0(H_S):
E_S = np.linalg.eigvals(H_S)
E0_S = np.min(np.real(E_S))
E_S-=E0_S
Z_S = np.sum(np.exp(-beta*E_S))
eta_0 = E0_S - np.log(np.real(Z_S))/beta
return eta_0
if __name__ == '__main__':
max_order = 3
beta = 8.0
t, U, v, t1, ek, mu= 1.0, 4.0, 1.5, 1.5, 0.0, 0.0
#create Hamiltonian, F and F_dag matrices. Should be replaced with triqs in other projects
H_S, F, F_dag = two_band_init(U, v, mu)
#calculate eta0, this is for the shift in dyspn solver later
eta_0 = 0.0
# dlr parameters
lamb, eps = 640.0, 1.0e-12
#initialize diagram evaluator
diagramsolver = Fastdiagram(beta,lamb,eps,F,F_dag)
# construct hybridization function Delta(t)
Hbath=np.array([[ek,-t1],[-t1,ek]])
Deltat = 2* diagramsolver.free_greens(beta,Hbath)* (t**2)
##decomposition and reflection of Delta(t) using aaa poles
poledlrflag = False
diagramsolver.hyb_init(Deltat,poledlrflag)
weights, pol, error = polefitting(diagramsolver.Deltaiw, 1j*diagramsolver.dlr_if,eps= 1e-8)
weights_reflect, pol_reflect, error_reflect = polefitting(diagramsolver.Deltaiw_reflect, 1j*diagramsolver.dlr_if,eps= 1e-8)
diagramsolver.copy_aaa_result(pol, weights,pol_reflect,weights_reflect)
diagramsolver.hyb_decomposition(poledlrflag)
##decomposition and reflection of Delta(t) using dlr poles
#diagramsolver.hyb_init(Deltat)
# diagramsolver.hyb_decomposition()
#construct initial value of G(t) by time-ordered free Green's function
G_S = diagramsolver.free_greens_ppsc(beta, H_S)
G_S_old = np.zeros_like(G_S)
#obtain actual imaginary time nodes on [0,beta]
tau_actual = diagramsolver.get_it_actual()
r = tau_actual.size
N = H_S.shape[0]
#start iteration
for ppsc_iter in range(10):
start_time = time.time()
if np.max(np.abs(G_S_old-G_S))<1e-10:
break
G_S_old = G_S.copy()
#calculate pseudo-particle self energy diagrams
Sigma_t = np.zeros((r, N, N),dtype=np.complex128)
for order in range(1, max_order+1):
for par, pair in all_connected_pairings(order):
topology = np.int32(np.array(pair))
num_diagram = diagramsolver.number_of_diagrams(order)
# The below line is expected to be parallelized
Sigma_t = Sigma_t + par*pow(-1,order)*diagramsolver.Sigma_calc_group(G_S, topology, np.int32(np.arange(num_diagram)))
#calculate pseudo-particle Green's function through time-ordered Dyson's equation
G_new = diagramsolver.time_ordered_dyson(beta,H_S,eta_0,Sigma_t)
# G(t) = G(t)*exp(-eta*t)
Z_S = diagramsolver.partition_function(G_new)
deta = np.log(Z_S)/beta
for k in range(r):
G_new[k,:,:] = G_new[k,:,:] * np.exp(-tau_actual[k]*deta)
eta_0 += deta
#linear damping
G_S = 1.0*G_new+0.0*G_S_old
print("iter ",ppsc_iter)
print("diff is ",np.max(np.abs(G_S_old-G_S)))
end_time = time.time()
elapsed_time = end_time - start_time
print("Time spent is ",elapsed_time)
#calculate impurity Green's function diagrams
# g_S = diagramsolver.G_calc(G_S,order)
n = Deltat.shape[1]
g_S = np.zeros((r, n, n),dtype=np.complex128)
for order in range(1, max_order+1):
for par, pair in all_connected_pairings(order):
topology = np.int32(np.array(pair))
num_diagram = diagramsolver.number_of_diagrams(order)
# The below line is expected to be parallelized
g_S = g_S + par*pow(-1,order)*diagramsolver.G_calc_group(G_S, topology, np.int32(np.arange(num_diagram)))
breakpoint()