使用 Mesh2D 构造函数重新创建 fipy Grid2D

Recreate fipy Grid2D with Mesh2D constructor

如果我使用以下方法创建 fipy 二维网格:

mesh = Grid2D(nx=3, ny=3, dx=1., dy=1.)

我得到了一个合理的矩形元素网格。但是,如果我采用此网格的值并使用它们构建普通 Mesh2D:

mesh2d = Mesh2D(mesh.vertexCoords, mesh.faceVertexIDs, mesh.cellFaceIDs)

我得到一个三角形的网格,有些三角形似乎无效。如果我这样做:

model = CellVariable(mesh=mesh2d, value=1.)

并用 matplotlib 查看器查看,一些三角形未填充,我认为这意味着它们无效。

我可以使用 Mesh2D 重新创建原始矩形网格吗?我想这样做是因为我扭曲了来自另一个来源的矩形网格坐标,我想在对 Mesh2D 的调用中替换 mesh.vectorCoords。面顶点和单元面是一样的,只是网格布变形了。

我认为查看器无法显示 Mesh2D 网格 class 而不是使用 Mesh2D 对象求解方程的根本错误。为了演示这一点,您可以使用 Mesh2D 求解一个简单的方程,然后映射回 Grid2D 以显示您的数据。例如,

import fipy

mesh = fipy.Grid2D(nx=3, ny=3, dx=1., dy=1.)
mesh2d = fipy.meshes.mesh2D.Mesh2D(mesh.vertexCoords, mesh.faceVertexIDs, mesh.cellFaceIDs)

var = fipy.CellVariable(mesh=mesh, value=1.)
var2D = fipy.CellVariable(mesh=mesh2d, value=1.)

var2D.constrain(2, where=mesh.facesRight)
var2D.constrain(0, where=mesh.facesLeft)

fipy.DiffusionTerm().solve(var2D)


var[:] = var2D(mesh.cellCenters, order=1)

fipy.Viewer(var).plot()
raw_input('stop')

结果看起来是正确的。我们已经使用 Mesh2D 上的变量求解了一个方程,它似乎工作得很好。

上面是使用CellVariable__call__方法插值回Grid2D上的变量。这种方法也适用于扭曲的网格。插值仅为一阶。

Grid2D 有许多自洽的优化,包括求解和查看,但不会转化为一般网格。你可以通过

来实现你想要的
mesh = fipy.meshes.nonUniformGrid2D.NonUniformGrid2D(nx=3, ny=3, dx=1., dy=1.)
mesh2d = Mesh2D(mesh.vertexCoords, mesh.faceVertexIDs, mesh.cellFaceIDs)
model = CellVariable(mesh=mesh2d, value=1.)