0

如果我使用以下方法创建一个 fipy 2D 网格:

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

我得到了一个合理的矩形元素网格。但是,如果我采用这个网格的值并使用它们来构造一个 vanilla Mesh2D

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

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

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

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

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

4

2 回答 2

1

我认为查看器无法显示 Mesh2D 网格类,而不是使用 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,它似乎工作得很好。

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

于 2019-04-24T18:42:35.530 回答
1

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.)
于 2019-04-24T21:01:30.270 回答