在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)
我在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。为了给不同的点分配不同的蚀刻速率,我想找到坐标
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)