我已经通过Gmsh在FiPy中定义了两个网格,并希望在两个网格之间的接口处找到节点。有没有办法在FiPy中做到这一点
siliconGeometry = '''
SetFactory("OpenCASCADE");
//set node spacing
ns = 1e-1;
ns2 = 1e-2;
x1 = 0;
y1 = 0;
x2 = 1;
y2 = 0.5;
Point(1) = {x1, y1, 0, ns};
Point(2) = {x2, y1, 0, ns};
Point(3) = {x2, y2, 0, ns2};
Point(4) = {x1, y2, 0, ns2};
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 1};
Curve Loop(1) = {1, 2, 3, 4};
Plane Surface(1) = {1};
Physical Surface("Silicon") = {1};
'''
oxideGeometry = '''
SetFactory("OpenCASCADE");
//set node spacing
ns = 1e-1;
ns2 = 1e-2;
x1 = 0;
y1 = 0.5;
x2 = 1;
y2 = 1;
Point(5) = {x1, y1, 0, ns2};
Point(6) = {x2, y1, 0, ns2};
Point(7) = {x2, y2, 0, ns};
Point(8) = {x1, y2, 0, ns};
Line(5) = {5, 6};
Line(6) = {6, 7};
Line(7) = {7, 8};
Line(8) = {8, 5};
Curve Loop(2) = {5, 6, 7, 8};
Plane Surface(2) = {2};
Physical Surface("Oxide") = {2};
m0 = Gmsh2D(siliconGeometry)
m1 = Gmsh2D(oxideGeometry)
我想获取网格m0
和m1
之间接口处的所有节点(或线)
谢谢@wd15。以下是我所做的:
FiPy有一个名为^{} 的函数
它获取两个向量的最近值。因此,要从
m0
和m1
获取重叠的ID,请使用我们已经使用
nearest
获取了m0
的near_ids
,然后使用np.isclose
检查节点是否接近。然后使用mask
我们可以在两个网格之间构造相应的闭合ID请注意,使用Scipy的KDTree查找最接近的值可能要快得多。然而,对于这个小问题,这并不重要,但对于一个非常大的网格,我认为这将是重要的。事实上,FiPy应该在内部使用它(目前还没有)
另外,这里的另一个调整是,您知道上下表面重叠,因此您可以简单地请求
m0.facesTop
和m1.facesBottom
遮罩,以将问题减少到仅重叠的表面,但这依赖于网格的先验知识相关问题 更多 >
编程相关推荐