Hatree-Fork格林函數磁化率計算(需要優化)

雙粒子格林函數:對於給定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

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章