【发布时间】:2019-02-11 15:50:19
【问题描述】:
当我意识到命令 sweep 没有像我想象的那样工作时,我正试图使用 FiPy 解决一组 PDE。这是我的部分代码示例:
from pylab import *
import sys
from fipy import *
viscosity = 5.55555555556e-06
Pe =5.
pfi=100.
lfi=0.01
Ly=1.
Nx =200
Ny=100
Lx=Ly*Nx/Ny
dL=Ly/Ny
mesh = PeriodicGrid2DTopBottom(nx=Nx, ny=Ny, dx=dL, dy=dL)
x, y = mesh.cellCenters
xVelocity = CellVariable(mesh=mesh, hasOld=True, name='X velocity')
xVelocity.constrain(Pe, mesh.facesLeft)
xVelocity.constrain(Pe, mesh.facesRight)
rad=0.1
var1 = DistanceVariable(name='distance to center', mesh=mesh, value=numerix.sqrt((x-Nx*dL/2.)**2+(y-Ny*dL/2.)**2))
pi_fi= CellVariable(mesh=mesh, value=0.,name='Fluid-interface energy map')
pi_fi.setValue(pfi*exp(-1.*(var1-rad)/lfi), where=(var1 > rad) )
pi_fi.setValue(pfi, where=(var1 <= rad))
xVelocityEq = DiffusionTerm(coeff=viscosity) - ImplicitSourceTerm(pi_fi)
xres=10.
while (xres > 1.e-6) :
xVelocity.updateOld()
mySolver = LinearGMRESSolver(iterations=1000,tolerance=1.e-6)
xres = xVelocityEq.sweep(var=xVelocity,solver=mySolver)
print 'Result = ', xres
#Thats it
简而言之,我声明了一个名为xVelocityEq 的函数并使用sweep 解决它。这是我的输出:
Result = 0.0007856742013190237
Result = 6.414470433257661e-07
如您所见,while 循环在两次迭代后结束。我的第一个问题是:为什么我的第一个残差 (=0.0007856742013190237) 高于求解器的容差?我认为,由于 xVelocityEq 对应于线性系统,因此求解器容差和残差是同一个意思。
如果我增加编号。 mySolver 中从 1000 到 10000 的迭代次数,我得到以下输出:
Result = 0.0007856742013190237
Result = 2.4619110931978988e-09
既然第一个保持不变,为什么第二个残差会发生变化?
如果我将 mySolver 中的容差从 1.e-6 增加到 7.e-4,我会得到以下输出:
Result = 0.0007856742013190237
Result = 6.414470433257661e-07
请注意,这些残差与第一个输出中的相同。现在,如果我尝试将容差进一步增加到 8.e-4,这就是我得到的输出:
Result = 0.0007856742013190237
Result = 0.0007856742013190237
Result = 0.0007856742013190237
Result = 0.0007856742013190237
Result = 0.0007856742013190237
...
此时我完全迷失了。 为什么对于小于 7.e-4 的所有求解器公差,残差具有相同的值?对于高于 7.e-4 的求解器容差,为什么这些残差是常数并等于 0.0007856742013190237?
如果我将 mySolver 更改为 LinearLUSolver(迭代次数 = 1000,容差 = 1.e-6),我会得到以下结果:
Result = 0.0007856742013190237
Result = 1.6772757200988522e-18
为什么我的第一个残差还是和以前一样,即使我已经改变了求解器?
【问题讨论】: