使用 FiPy 求解具有一维零梯度边界条件和零通量条件的偏微分方程

问题描述

修改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引起的,应该修复它以处理残差从零开始的情况。然而,长短是为了让用户忽略该警告,因为求解器仍然返回正确的结果。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...