FiPy:如何在两个网格之间的界面处找到节点顶点

如何解决FiPy:如何在两个网格之间的界面处找到节点顶点

我已经通过 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,ns};
Point(2) = {x2,ns};
Point(3) = {x2,y2,ns2};
Point(4) = {x1,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,ns2};
Point(6) = {x2,ns2};
Point(7) = {x2,ns};
Point(8) = {x1,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)

我想获取网格 m0m1 之间界面处的所有节点(或线)。

解决方法

FiPy 有一个名为 nearest 的函数 它获得两个向量的最近值。因此,要从 m0m1 中获取重叠的 ID,然后使用

from fipy import Gmsh2D
from fipy.tools.numerix import nearest
import numpy as np

siliconGeometry = '''
...
'''

oxideGeometry = '''
...
'''
 
m0 = Gmsh2D(siliconGeometry)
m1 = Gmsh2D(oxideGeometry)

near_ids = nearest(m0.vertexCoords,m1.vertexCoords)
mask = np.all(np.isclose(m0.vertexCoords[:,near_ids],m1.vertexCoords),axis=0)
m1_close_ids = np.arange(len(m1.vertexCoords[0]))[mask]
m0_close_ids = near_ids[mask]

for i in range(len(m0_close_ids)):
    m0_id = m0_close_ids[i]
    m1_id = m1_close_ids[i]
    print()
    print(f'm0: {m0_id},{m0.vertexCoords[:,m0_id]}')
    print(f'm1: {m1_id},{m1.vertexCoords[:,m1_id]}')

我们使用 nearest 获取 near_idsm0,然后使用 np.isclose 检查节点是否关闭。然后我们可以使用 mask 在两个网格之间构建相应的关闭 ID。

请注意,使用 Scipy 的 KDTree 查找最近值可能要快得多。但是,对于这个小问题并不重要,但是对于非常大的网格,我想这很重要。事实上,FiPy 应该真的在内部使用它(目前还没有)。

此外,这里的另一个调整是您知道上下面重叠,因此您可以简单地要求 m0.facesTopm1.facesBottom 掩码以将问题减少到重叠面,但是这依赖于网格的先验知识。

,

谢谢@wd15。这是我所做的:

m0 = Gmsh2D(siliconGeometry) 
m1 = Gmsh2D(oxideGeometry) 

m0_faces = m0.exteriorFaces 
m0_vertices = numerix.unique(m0.faceVertexIDs[...,m0_faces].flatten()) m0_vertexCoords = m0.vertexCoords[...,m0_vertices ] 

m1_faces = m1.exteriorFaces 
m1_vertices = numerix.unique(m1.faceVertexIDs[...,m1_faces].flatten()) m1_vertexCoords = m1.vertexCoords[...,m0_vertices ] 

surfVertexID = numerix.nearest(m0_vertexCoords,m1_vertexCoords)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?