整理一下将库仑势以及屏蔽库仑势通过Fourier变换到实空间时的衰减情况
{:.info}
库伦势
如果电子之间是直接的库伦相互作用,
该势能随着$\rvert \boldsymbol{k}\rvert $增加而减小,如下图所示

通过Fourier变换到实空间中
这里取$y=0$进行$x$方向进行Fourier变换,得到实空间中库伦势能

可以看到在$x$比较大的时候,排斥相互作用还是比较强的。
屏蔽库伦势
现在考虑屏蔽库伦势
该势能在$\boldsymbol{k}\rightarrow 0$的时候并不是发散的,而是趋近于一个常数,其分布如下图所示

与前面的库伦势相同,对$x$方向做Fourier变换,并取$y=0$,可以得到

此时可以看到,屏蔽库伦势能在实空间会很快衰减。
代码
这里是用Mathematica做的快速Fourier变换,代码也贴一下

还有比较愚蠢的方式就是自己写程序进行上面的求和过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| @everywhere using SharedArrays,LinearAlgebra,Distributed,DelimitedFiles,Printf,BenchmarkTools,Arpack,Dates
@everywhere function Set_BZ(kn::Int64) knn::Int64 = 2 * kn + 1 kmax::Float64 = pi klist = zeros(Float64,2,knn^2) ik0 = 0 for ikx in -kn:kn for iky in -kn:kn ik0 += 1 klist[1,ik0] = ikx * kmax/kn klist[2,ik0] = iky * kmax/kn end end return klist end
@everywhere function Bare_Coulomb_potential(qx::Float64,qy::Float64) re1::Float64 = 0.0 dd0::Float64 = 40 epsilon::Float64 = 4.0 if (qx == 0 && qy == 0) re1 = 0.0 else re1 = 2.0 * pi/(epsilon * sqrt(qx^2 + qy^2)) * tanh(dd0 * sqrt(qx^2 + qy^2)) end return re1 end
@everywhere function Coulomb_Real(ix::Int64,iy::Int64) kn::Int64 = 1e2 klist = Set_BZ(kn) re1::ComplexF64 = 0.0 for ik0 in 1:(2 * kn + 1)^2 kx, ky = klist[1,ik0],klist[2,ik0] re1 += Bare_Coulomb_potential(kx,ky) * exp(im * (kx * ix + ky * iy)) end return real(re1)/(2 * kn + 1)^2 end
@everywhere function main1() xn::Int64 = 100 re1 = SharedArray(zeros(Float64, xn, xn)) @sync @distributed for ix in 1:xn for iy in 1:xn re1[ix,iy] = Coulomb_Real(ix,iy) end end fx1 = "Real_Coulobm.dat" f1 = open(fx1,"w") writedlm(f1,re1,"\t") close(f1) end
@time main1()
|
实际上用Julia也可以进行快速Fourier变换,这里就还是蠢办法上了。
参考
公众号
相关内容均会在公众号进行同步,若对该Blog感兴趣,欢迎关注微信公众号。
{:.info}