FFT毒物求解器的理论收敛速度是多少?
我正在求解泊松方程: 其中 在域具有周期边界条件。该电荷密度是净中性的。解决方案如下: 其中。在倒易空间 其中是倒易空间矢量。我对Hartree能源感兴趣: Ñ
对于上面的测试问题,可以通过分析评估: 该能量应收敛多快?
这是一个使用NumPy进行计算的程序。
from numpy import empty, pi, meshgrid, linspace, sum
from numpy.fft import fftn, fftfreq
E_exact = 128/(35*pi)
print "Hartree Energy (exact): %.15f" % E_exact
f = open("conv.txt", "w")
for N in range(3, 384, 10):
print "N =", N
L = 2.
x1d = linspace(0, L, N)
x, y, z = meshgrid(x1d, x1d, x1d)
nr = 3 * ((x-1)**2 + (y-1)**2 + (z-1)**2 - 1) / pi
ng = fftn(nr) / N**3
G1d = N * fftfreq(N) * 2*pi/L
kx, ky, kz = meshgrid(G1d, G1d, G1d)
G2 = kx**2+ky**2+kz**2
G2[0, 0, 0] = 1 # omit the G=0 term
tmp = 2*pi*abs(ng)**2 / G2
tmp[0, 0, 0] = 0 # omit the G=0 term
E = sum(tmp) * L**3
print "Hartree Energy (calculated): %.15f" % E
f.write("%d %.15f\n" % (N, E))
f.close()
这是一个收敛图(只是绘制conv.txt
上面脚本中的,这是一个笔记本,如果您想自己玩这个的话,可以这样做):
如您所见,收敛是线性的,这令我感到惊讶,我认为FFT的收敛速度快得多。
更新:
该解决方案在边界处具有风头(我之前没有意识到这一点)。为了使FFT快速收敛,解决方案必须使所有导数平滑。因此,我还尝试了以下右侧:
nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4
您可以将其放到上面的脚本中(更新的脚本)。确切的解决方案是,这应该是无限可微的。在这种情况下,确切的积分是。但是,FFT解算器仍然仅朝着该精确解线性收敛,可以通过运行上面的脚本并绘制会聚点(使用图更新的笔记本)进行检查。
有谁知道3D的任何基准测试,以便使我看到比线性更快的收敛速度?