我目前正在学习如何使用fipy,并且在尝试运行下面的代码时遇到了一个问题。该问题为稳定的一维扩散,并有一个从右边界流出的流动。我在其他帖子里看到
var.faceGrad.constrain(valueRight, where=mesh.facesRight)不适用于fipy中的这个问题。
nx = 50
dx = 1.
msh = Grid1D(nx=nx, dx=dx)
phi = CellVariable(name="solution variable", mesh=msh, value=0.)
D = FaceVariable(name='diffusion coefficient',mesh=msh, value=1.)
D.constrain(0., msh.facesRight)
flux = 1
boundary = (msh.facesRight * flux).divergence
(DiffusionTerm(coeff=D) + boundary).solve(var=phi)
viewer = Viewer(vars=phi)
viewer.plot()我一直收到错误消息:
RuntimeError:因子是完全奇异的
但是对于两个Neumann边界条件,这应该是可解的,对吗?(默认的零通量在左边,指定的通量在右边)?出什么问题了?由于某些原因,这工作在2D网格,但不是在一维。
发布于 2022-05-25 13:01:32
当二阶PDE具有两个边界条件时,它允许无限多个解,所有的解都被一个常数抵消。您可以看到,如果您修改您的方程,以添加一个TransientTerm,然后求解很长时间。如果您尝试不同的大值的dt,您将观察到相同的解决方案抵消不同的数额。比较:
(TransientTerm() == DiffusionTerm(coeff=D) + boundary).solve(var=phi, dt=1e3)

(TransientTerm() == DiffusionTerm(coeff=D) + boundary).solve(var=phi, dt=1e6)

(TransientTerm() == DiffusionTerm(coeff=D) + boundary).solve(var=phi, dt=1e9)

我还没有成功地用内部固定值“固定”特定的解决方案。@wd15 15可能有一些想法。
largeValue = 1e5
pin_value = 10.
fraction = 0.25
mask = (msh.x > (fraction * nx - 1) * dx) & (msh.x < (fraction * nx + 1) * dx)
(DiffusionTerm(coeff=D) + boundary
- ImplicitSourceTerm(mask * largeValue) + mask * largeValue * pin_value).solve(var=phi)

注:我们讨论了examples.diffusion.mesh1D中稳态隐式解的一些相关问题.
添加约束
使用类似的FEniCS多芬实例作为指南,可以通过在phi上添加约束来修复特定的解决方案,例如,

eq = (TransientTerm() == DiffusionTerm(coeff=D) + boundary - phi.cellVolumeAverage)
for sweep in range(500):
res = eq.sweep(var=phi, dt=2)

https://stackoverflow.com/questions/72373795
复制相似问题