You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python的GMSH生成二维三角网格,如何获取三角形节点标签三元组?

解决Gmsh无法获取三角形单元节点标签集合的问题

你的代码存在两个核心问题:

  1. 物理组维度错误:平面区域属于2维实体,但你用了gmsh.model.addPhysicalGroup(1, [area], name="Area"),这里的第一个参数应该是2而不是1,导致物理组未正确关联区域。
  2. 未获取单元信息:仅调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:33:26