问题描述
我修改了 examples.convection.exponential1D.mesh1D
示例,但在运行时出现错误。
from fipy import CellVariable,Grid1D,DiffusionTerm,PowerLawConvectionTerm
from fipy.tools import numerix
diffCoeff = 1.
convCoeff = (10.,)
L = 10.
nx = 100
mesh = Grid1D(dx=L / nx,nx=nx)
valueLeft = (0.,)
valueRight = 0.
var = CellVariable(mesh=mesh,name="variable")
var.faceGrad.constrain(valueLeft,where=mesh.facesLeft)
var.constrain(valueRight,mesh.facesRight)
eq = (DiffusionTerm(coeff=diffCoeff)
+ PowerLawConvectionTerm(coeff=convCoeff))
eq.solve(var=var)
当我运行它时,我收到以下错误:
...\fipy\solvers\scipy\linearLUSolver.py:41: RuntimeWarning: invalid value encountered in double_scalars
if (numerix.sqrt(numerix.sum(errorVector**2)) / error0) <= self.tolerance:
我是否正确地实现了零梯度边界条件?我只找到了 2D 示例。在这个一维问题中,valueLeft
甚至必须是一个向量吗?我尝试使用标量,但仍然出现相同的错误。
我是 FiPy 的新手,我知道这种形式的 PDE 可能没有任何意义,但我想从一个更简单的例子开始,最后我想用这些边界条件和一个来源。添加源会解决我的问题吗?
任何帮助将不胜感激。
解决方法
这是警告,不是错误。这只是意味着我们在标准化零误差的方程方面不是很聪明。
PDE 仍然可以解决(尽管解决方案不是很有趣)。
,这是警告而不是错误。在打印 var
的值时,它们都为零,这是给定边界条件的正确答案。
警告是由代码的divide by zero warning引起的this line引起的,应该修复它以处理残差从零开始的情况。然而,长短是为了让用户忽略该警告,因为求解器仍然返回正确的结果。