! This code is supported by the website: https://www.guanjihuan.com ! The newest version of this code is on the web page: https://www.guanjihuan.com/archives/3785 module global implicit none double precision sqrt3,Pi parameter(sqrt3=1.7320508075688773d0,Pi=3.14159265358979324d0) end module global program QPI !QPI主程序 use blas95 use lapack95,only:GETRF,GETRI use global implicit none integer i,j,info,index_0(4) double precision omega,kx,ky,Eigenvalues(4),eta,V0,kx1,kx2,ky1,ky2,qx,qy,time_begin,time_end parameter(eta=0.005) complex*16 H0(4,4),green_0(4,4),green_1(4,4),green_0_k1(4,4),green_0_k2(4,4),A_spectral,V(4,4),gamma_0(4,4),Temp_0(4,4),T(4,4),g_1,rho_1 character(len=*):: Flname parameter(Flname='') !可以写上输出文件路径,也可以不写,输出存在当前文件的路径 omega=0.070d0 open(unit=10,file=Flname//'Spectral function_w=0.07.txt') open(unit=20,file=Flname//'QPI_intra_nonmag_w=0.07.txt') call CPU_TIME(time_begin) !计算谱函数A(kx,ky) write(10,"(f20.10,x)",advance='no') 0 do ky=-Pi,Pi,0.01d0 !谱函数图案的精度 write(10,"(f20.10,x)",advance='no') ky enddo write(10,"(a)",advance='yes') ' ' do kx=-Pi,Pi,0.01d0 !谱函数图案的精度 write(10,"(f20.10,x)",advance='no') kx do ky=-Pi,Pi,0.01d0 !谱函数图案的精度 call Greenfunction_clean(kx,ky,eta,omega,green_0) A_spectral=-(green_0(1,1)+green_0(3,3))/Pi write(10,"(f20.10)",advance='no') imag(A_spectral) enddo write(10,"(a)",advance='yes') ' ' enddo !计算QPI(qx,qy) V0=0.4d0 V=0.d0 V(1,1)=V0 V(2,2)=-V0 V(3,3)=V0 V(4,4)=-V0 gamma_0=0.d0 do kx=-Pi,Pi,0.01 do ky=-Pi,Pi,0.01 call Greenfunction_clean(kx,ky,eta,omega,green_0) do i=1,4 do j=1,4 gamma_0(i,j)=gamma_0(i,j)+green_0(i,j)*0.01*0.01 enddo enddo enddo enddo gamma_0=gamma_0/(2*Pi)/(2*Pi) call gemm(V,gamma_0,Temp_0) do i=1,4 Temp_0(i,i)=1-Temp_0(i,i) enddo call GETRF( Temp_0,index_0,info ); call GETRI( Temp_0,index_0,info) !求逆 call gemm(Temp_0,V,T) !矩阵乘积 write(20,"(f20.10,x)",advance='no') 0 do qy=-Pi,Pi,0.01 !QPI图案的精度 write(20,"(f20.10,x)",advance='no') qy enddo write(20,"(a)",advance='yes') ' ' do qx=-Pi,Pi,0.01 !QPI图案的精度 write(*,"(a)",advance='no') 'qx=' write(*,*) qx !屏幕输出可以实时查看计算进度 write(20,"(f20.10)",advance='no') qx do qy=-Pi,Pi,0.01 !QPI图案的精度 rho_1=0.d0 do kx1=-Pi,Pi,0.06 !积分的精度 kx2=kx1+qx do ky1=-Pi,Pi,0.06 !积分的精度 ky2=ky1+qy call Greenfunction_clean(kx1,ky1,eta,omega,green_0_k1) call Greenfunction_clean(kx2,ky2,eta,omega,green_0_k2) call gemm(green_0_k1,T,Temp_0) call gemm(Temp_0, green_0_k2, green_1) g_1=green_1(1,1)-dconjg(green_1(1,1))+green_1(3,3)-dconjg(green_1(3,3)) rho_1=rho_1+g_1*0.06*0.06 enddo enddo rho_1=rho_1/(2*Pi)/(2*Pi)/(2*Pi)*(0.d0,1.d0) write(20,"(f20.10,x,f20.10)",advance='no') real(rho_1) enddo write(20,"(a)",advance='yes') ' ' enddo call CPU_TIME(time_end) write(*,"(a)",advance='no') 'The running time of this task=' write (*,*) time_end-time_begin !屏幕输出总的计算时间,单位为秒(按照当前步长的精度,在个人计算机上运算大概需要4个小时) end program subroutine Greenfunction_clean(kx,ky,eta,omega,green_0) !干净体系的格林函数 use blas95 use lapack95,only:GETRF,GETRI use global integer info,index_0(4) double precision, intent(in):: kx,ky,eta,omega complex*16 H0(4,4) complex*16,intent(out):: green_0(4,4) call Hamiltonian(kx,ky,H0) green_0=H0 do i=1,4 green_0(i,i)=omega+(0.d0,1.d0)*eta-green_0(i,i) enddo call GETRF( green_0,index_0,info ); call GETRI( green_0,index_0,info ); end subroutine Greenfunction_clean subroutine Hamiltonian(kx,ky,Matrix) !哈密顿量 use global implicit none integer i,j double precision t1,t2,t3,t4,mu,epsilon_x,epsilon_y,epsilon_xy,delta_1,delta_2,delta_0 double precision, intent(in):: kx,ky complex*16,intent(out):: Matrix(4,4) t1=-1;t2=1.3;t3=-0.85;t4=-0.85;delta_0=0.1;mu=1.54 Matrix=(0.d0,0.d0) epsilon_x=-2*t1*dcos(kx)-2*t2*dcos(ky)-4*t3*dcos(kx)*dcos(ky) epsilon_y=-2*t1*dcos(ky)-2*t2*dcos(kx)-4*t3*dcos(kx)*dcos(ky) epsilon_xy=-4*t4*dsin(kx)*dsin(ky) delta_1=delta_0*dcos(kx)*dcos(ky) delta_2=delta_1 Matrix(1,1)=epsilon_x-mu Matrix(2,2)=-epsilon_x+mu Matrix(3,3)=epsilon_y-mu Matrix(4,4)=-epsilon_y+mu Matrix(1,2)=delta_1 Matrix(2,1)=delta_1 Matrix(1,3)=epsilon_xy Matrix(3,1)=epsilon_xy Matrix(1,4)=0.d0 Matrix(4,1)=0.d0 Matrix(2,3)=0.d0 Matrix(3,2)=0.d0 Matrix(2,4)=-epsilon_xy Matrix(4,2)=-epsilon_xy Matrix(3,4)=delta_2 Matrix(4,3)=delta_2 end subroutine Hamiltonian