雙粒子格林函數:對於給定q和\omega,需要對所有k和\omega' 求和,4重循環,計算量較大。
先解決靜態自旋極化率的計算,即omega=0
預處理格林函數
nw = 200
delta = 0.002
nk = 200
ks = np.linspace(0,2*pi,nk)
omega = np.linspace(-3.1,3.1,nw)
Gk_up_r = np.zeros((nw,nk,m,m),dtype='complex')
Gk_down_r = np.zeros((nw,nk,m,m),dtype='complex')
Gk_up_a = np.zeros((nw,nk,m,m),dtype='complex')
Gk_down_a = np.zeros((nw,nk,m,m),dtype='complex')
Ak_up = np.zeros((nw,nk),dtype='double')
Ak_down = np.zeros((nw,nk),dtype='double')
N = 8
for i in range(nw):
for j in range(nk):
Hk0 = Hamiltonian_H0(ks[j],N)
Hk_up = Hk0 + U*(Ndown_avg -0.5*np.eye(m))
Hk_down = Hk0 + U*(Nup_avg - 0.5*np.eye(m))
Gk_up_r[i,j,:,:] = inv((omega[i]+1j*delta)*np.eye(m)-Hk_up)
Gk_down_r[i,j,:,:] = inv((omega[i]+1j*delta)*np.eye(m)-Hk_down)
Gk_up_a[i,j,:,:] = inv((omega[i]-1j*delta)*np.eye(m)-Hk_up)
Gk_down_a[i,j,:,:] = inv((omega[i]-1j*delta)*np.eye(m)-Hk_down)
Ak_up[i,j] = -np.imag(Gk_up_r[i,j,:,:].trace())/pi
Ak_down[i,j] = -np.imag(Gk_down_r[i,j,:,:].trace())/pi
X,Y = np.meshgrid(ks,omega)
plt.pcolormesh(X, Y, Ak_up)
此時,可以先預處理好G,然後三重循環,計算chi0
nq = 100
chi0_static = np.zeros((nq,m,m),dtype='complex')
for iq in range(nq):
for iw in range(nw):
for ik in range(nk):
k_plus_q = (ik+iq)%nk
k_mines_q = (ik-iq+nk)%nk
chi0_static[iq,:,:] += fermi(omega[iw],mu,T)*(Gk_up_r[iw,ik,:,:].T.imag*Gk_down_r[iw,k_plus_q,:,:]+Gk_down_r[iw,ik,:,:].imag*Gk_up_a[iw,k_mines_q,:,:]).T