使用Python的GMSH生成二维三角网格,如何获取三角形节点标签三元组?
解决Gmsh无法获取三角形单元节点标签集合的问题
你的代码存在两个核心问题:
- 物理组维度错误:平面区域属于2维实体,但你用了
gmsh.model.addPhysicalGroup(1, [area], name="Area"),这里的第一个参数应该是2而不是1,导致物理组未正确关联区域。 - 未获取单元信息:仅调用
getNodes()只能拿到节点数据,要获取三角形单元的节点标签,需要调用getElements()接口提取单元信息。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt import gmsh import sys #Area characteristics S = 20 H = 7 #Boundary points of the area x_b = np.array([250, 100-H, 100-H, 150-H, 150-H, 0, 0, 150, 150, 100, 100, 250]) y_b = np.array([-2*S - H, -2*S - H, -S, -S, -H, -H, 0, 0, -S-H, -S-H, -2*S, -2*S]) #Characteristic size of the mesh lc = 10 gmsh.initialize() gmsh.model.add("pr2") #Constructing of the area points = np.empty(12, dtype = 'int') for i in range(len(x_b)): points[i] = gmsh.model.geo.addPoint(x_b[i], y_b[i], 0.0, lc) lines = np.empty(12, dtype='int') for i in range(len(lines)-1): lines[i] = gmsh.model.geo.addLine(points[i], points[i+1]) lines[-1] = gmsh.model.geo.addLine(points[-1], points[0]) loop = gmsh.model.geo.addCurveLoop(lines) area = gmsh.model.geo.addPlaneSurface([loop]) #Mesh generating gmsh.model.geo.synchronize() # 修正物理组维度:平面区域是2维实体,第一个参数改为2 gmsh.model.addPhysicalGroup(2, [area], name="Area") gmsh.model.mesh.generate(2) gmsh.write("pr2.msh") # 获取节点数据并整理为[[x1,y1], ...]格式 nodeTags, nodeCoords, _ = gmsh.model.mesh.getNodes() # nodeCoords是一维数组,每3个元素对应x,y,z,这里z=0,取前两列 node_list = np.reshape(nodeCoords, (-1, 3))[:, :2].tolist() # 获取2维单元(三角形)的信息 elementTypes, elementTags, elementNodeTags = gmsh.model.mesh.getElements(dim=2) # 二维网格中默认是三角形单元,取第一个元素类型对应的节点标签 triangle_node_tags = [] for nodes in elementNodeTags[0].reshape(-1, 3): triangle_node_tags.append(nodes.tolist()) # 输出结果示例 print("节点集合(前5个):", node_list[:5]) print("三角形单元节点标签(前5个):", triangle_node_tags[:5]) if '-nopopup' not in sys.argv: gmsh.fltk.run() gmsh.finalize()
关键代码解释
- 修正物理组:
gmsh.model.addPhysicalGroup(2, [area], name="Area"),将维度参数从1改为2,确保物理组正确关联平面区域,后续如果需要按物理组筛选单元也能正常工作。 - 整理节点坐标:
np.reshape(nodeCoords, (-1, 3))[:, :2].tolist()把一维的节点坐标数组转换成N×3的矩阵,再去掉z轴(因为是二维网格),得到你需要的[[x1,y1],...]格式。 - 提取三角形单元:
gmsh.model.mesh.getElements(dim=2)获取所有2维单元,返回的elementNodeTags是一个列表,其中第一个元素是三角形单元的节点标签一维数组,通过reshape(-1, 3)拆分每个三角形的三个节点标签,转换成[[tag1,tag2,tag3],...]格式。
内容的提问来源于stack exchange,提问作者denistr
相关产品推荐
相关产品推荐

