在FiPy中我们可以通过坐标搜索找到一个点属于哪个网格吗?

Can we find out which mesh a point belongs to in FiPy by searching with the coordinate?

我在FiPY中定义了两个网格如下:

gmsh_mesh = fp.Gmsh2D("ProcessSim_CMOS_Step1.msh")

from fipy.meshes.mesh2D import Mesh2D

def extract_mesh(mesh, mask):
    cellFaceIDs = mesh.cellFaceIDs[..., mask]
    faceIDs = numerix.unique(cellFaceIDs.flatten())
    facemap = numerix.zeros(mesh.faceVertexIDs.shape[1], dtype=int)
    facemap[faceIDs] = faceIDs.argsort()
    
    faceVertexIDs = mesh.faceVertexIDs[..., faceIDs]
    vertIDs = numerix.unique(faceVertexIDs.flatten())
    vertmap = numerix.zeros(mesh.vertexCoords.shape[1], dtype=int)
    vertmap[vertIDs] = vertIDs.argsort()

    return Mesh2D(mesh.vertexCoords[..., vertIDs],
                  vertmap[faceVertexIDs],
                  facemap[cellFaceIDs])

oxideMesh = extract_mesh(mesh=gmsh_mesh, mask=gmsh_mesh.physicalCells["Oxide"])
siliconMesh = extract_mesh(mesh=gmsh_mesh, mask=gmsh_mesh.physicalCells["Silicon"])

因此在进行工艺模拟时,比如蚀刻,用户希望有选择地蚀刻指定的 material。为了给不同的点分配不同的蚀刻速率,我想找到坐标 属于 oxideMesh 还是 siliconMesh。有办法吗?

FiPy 不提供任何此类功能,而且也不可能提供。如果你的 网格是简单连接和凸起的,那么你可以使用 scipy.spatial.tsearch 与网格顶点。 不幸的是,基于您的 ,这种方法 对你不起作用。

很多年前,我做过一些半导体异质结构方面的工作,其中 我需要考虑在连续的光刻和电沉积步骤中建立的不同区域几何形状。我用了 Shapely 定义抽象几何域的包,然后 使用 Gmsh 将这些域转换为 FiPy 网格。 Shapely 可用于 检查点遏制,即使域是凹的或断开的。具体细节与您所做的有点不同,但我相信它仍然适用。

gist 说明了构建多个复杂域、检查 点包含在它们中,然后从中生成单个 FiPy 网格 它们(这是我的用例;您可以从中生成单独的网格 单独的域)。

In [5]:
pt = Point((-5e-7, 3.99e-7))
ntype.contains(pt), ptype.contains(pt)
Out[5]:
(True, False)
In [6]:
pt = Point((-5e-7, 4e-7))
ntype.contains(pt), ptype.contains(pt)
Out[6]:
(False, False)
In [7]:
pt = Point((-5e-7, 4.01e-7))
ntype.contains(pt), ptype.contains(pt)
Out[7]:
(False, True)
In [8]:
pt = Point((-5e-7, 4.0e-7))
ntype.touches(pt), ptype.touches(pt)
Out[8]:
(True, True)