我正在尝试使用 gmsh 生成三角形网格,然后使用 python 读取它,对于 python 部分我使用 meshio。但我的问题是网格元素总是作为线读取,而不是三角形。
这是我的.geo
SetFactory("OpenCASCADE");
Circle(1) = {0, 0, 0, 1, 0, 2*Pi};
Curve Loop(1) = {1};
Plane Surface(1) = {1};
Physical Curve("circle", 2) = {1};
然后我跑:
gmsh -2 circle.geo
并得到这个网格:
用这个Python代码我读取了网格:
ELEMENT_TYPES = {
"line": 2,
"line3": 3,
"triangle": 3,
"quadrangle": 4,
"tetrahedron": 4,
"hexahedron": 8,
"prism": 6,
"pyramid": 5,
}
def read(self, mesh_file: str):
msh = meshio.read(mesh_file)
points = msh.points
number_of_nodes = points.shape[0]
point_index = range(number_of_nodes)
mesh_nodes = dict(zip(point_index, points))
elements = []
for cell in msh.cells:
cell_type = cell.type
for idx, element_nodes in enumerate(cell.data, 1):
element_nodes_coordinates = np.array([mesh_nodes[node] for node in element_nodes])
element = Element(
index=idx,
type=cell_type,
size=ELEMENT_TYPES[cell_type],
nodes=element_nodes,
nodes_coordinates=element_nodes_coordinates,
)
elements.append(element)
但我总是得到网格类型的线(2节点元素),我需要一个3节点三角形网格。
我很确定这是因为您只为圆添加了一个“物理组”,它是一维曲线(而不是二维磁盘),所以您还需要将曲面添加到物理组中,否则 gmsh 将不会保存其输出中的三角形。添加这一行,我认为它会起作用:
Physical Surface("My surface") = {1};