【问题标题】:Solving a PDE with 1D zero gradient boundary condition and zero flux condition with FiPy使用 FiPy 求解具有一维零梯度边界条件和零通量条件的 PDE
【发布时间】:2021-05-15 16:38:33
【问题描述】:

我修改了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:

我是否实现了零梯度边界条件,对吗?我只找到了二维示例。在这个一维问题中,valueLeft 甚至必须是一个向量吗?我尝试使用标量,但仍然遇到同样的错误。

我是 FiPy 的新手,我知道这种形式的 PDE 可能没有任何意义,但我想从一个更简单的例子开始,最后我想用这些边界条件和一个资源。添加源会解决我的问题吗?

任何帮助将不胜感激。

【问题讨论】:

    标签: pde fipy


    【解决方案1】:

    这是警告而不是错误。在打印var 的值时,它们都为零,这是给定边界条件的正确答案。

    该警告是由代码的this line 引起的divide by zero warning 引起的,应修复该问题以处理残差从零开始的情况。然而,长和短是让用户忽略该警告,因为求解器仍然返回正确的结果。

    【讨论】:

    • 谢谢!所以这意味着我正确使用了 faceGrad.constrain() 方法?
    • 在两个边界上使用零约束不会给您太多反馈,说明您是否正确解决了您感兴趣的问题。尝试一个具有非平凡结果的问题来检查。此外,对流项确实应该与瞬态项结合使用,因为对流存在准确性和稳定性问题。
    【解决方案2】:

    这是一个警告,而不是错误。这只是意味着我们在归一化一个零误差的方程方面不是很聪明。

    PDE 仍然可以解决(尽管解决方案不是很有趣)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 2021-06-21
      相关资源
      最近更新 更多