GMSH msh文件结构解析求助:节点与单元信息解读
GMSH msh文件结构解析与单元数量差异问题解答
一、单元数量差异原因
终端显示的「12个单元」是Gmsh内部的全量计数,包含实际网格单元、物理组与单元的关联条目(重复计数)、实体离散的中间计数;而msh文件的$Elements段仅存储唯一的实际网格单元,不会重复存储物理组关联的单元,只通过ID标记归属,因此这里显示7个单元(3个1D线单元 + 4个2D三角形单元)。
二、msh文件各段详细解析
1. $MeshFormat 段
$MeshFormat 4.1 0 8 $EndMeshFormat
4.1:msh文件版本(4.1版)0:文件格式为ASCII(1表示二进制)8:浮点数采用双精度(8字节)存储
2. $PhysicalNames 段
$PhysicalNames 1 2 6 "My surface" $EndPhysicalNames
- 首行
1:仅定义了1个带名称的物理组 - 第二行
2 6 "My surface":2表示维度(2D面),6是物理组ID,"My surface"是组名;代码中定义的1D物理组(ID5)因未设置名称,默认不在这里输出
3. $Entities 段
$Entities 4 4 1 0 ...(实体数据行)
- 首行
4 4 1 0:依次为0D点实体数、1D线实体数、2D面实体数、3D体实体数 - 后续每行对应一个实体:
- 前4行:0D点实体,格式为
点ID x y z 0(最后一位是标记位) - 中间4行:1D线实体,格式为
线ID 起点坐标 终点坐标 物理组ID 标签数 关联节点ID... - 最后1行:2D面实体,格式为
面ID 边界盒坐标 物理组ID 标签数 关联线ID...
- 前4行:0D点实体,格式为
4. $Nodes 段
$Nodes 8 5 1 5 ...(节点数据)
- 首行
8 5 1 5:8:所有节点条目总数(包含实体关联的占位条目,无实际坐标)5:实际存在坐标的网格节点总数(对应终端显示的5个节点)1:最小节点ID5:最大节点ID
- 后续数据结构:
- 0D点实体组:比如
0 1 0 1表示0D实体ID1,关联1个节点;下一行1是节点ID,再下一行0 0 0是坐标 - 1D线实体组:比如
1 1 0 0是1D实体ID1的节点占位条目,无实际坐标(线的节点已在0D实体中定义) - 2D面实体组:
2 1 0 1表示2D实体ID1,关联1个内部网格节点;下一行5是节点ID,再下一行5 5 0是坐标
- 0D点实体组:比如
5. $Elements 段
$Elements 4 7 1 7 ...(单元数据)
- 首行
4 7 1 7:4:单元类型总数(包含1D线单元、2D三角形单元等)7:实际存储的唯一网格单元总数1:最小单元ID7:最大单元ID
- 每行单元格式:
单元ID 单元类型 标签数 物理组ID 关联节点ID...- 单元类型对应Gmsh编码:
1=1D线单元,2=2D三角形单元 - 示例:
1 1 1 1 1 2:单元ID1,线单元,归属物理组1,连接节点1和24 2 2 4 1 2 5:单元ID4,三角形单元,归属物理组4,连接节点1、2、5
- 单元类型对应Gmsh编码:
三、提取TikZ可用的节点与连通性
节点坐标(仅提取带坐标的节点)
- ID1: (0, 0)
- ID2: (10, 0)
- ID3: (10, 10)
- ID4: (0, 10)
- ID5: (5, 5)
连通性
- 边界线单元:1-2,2-3,3-4,4-1
- 面网格三角形单元:1-2-5,4-1-5,2-3-5,3-4-5
附:修改后的t1.py脚本
import gmsh import sys gmsh.initialize() gmsh.model.add("t1") lc = 10 gmsh.model.geo.addPoint(0, 0, 0, lc, 1) gmsh.model.geo.addPoint(10, 0, 0, lc, 2) gmsh.model.geo.addPoint(10, 10, 0, lc, 3) p4 = gmsh.model.geo.addPoint(0, 10, 0, lc) gmsh.model.geo.addLine(1, 2, 1) gmsh.model.geo.addLine(3, 2, 2) gmsh.model.geo.addLine(3, p4, 3) gmsh.model.geo.addLine(4, 1, p4) gmsh.model.geo.addCurveLoop([4, 1, -2, 3], 1) gmsh.model.geo.addPlaneSurface([1], 1) gmsh.model.geo.synchronize() gmsh.model.addPhysicalGroup(1, [1, 2, 4], 5) gmsh.model.addPhysicalGroup(2, [1], name="My surface") gmsh.model.mesh.generate(2) gmsh.write("t1.msh") if '-nopopup' not in sys.argv: gmsh.fltk.run() gmsh.finalize()
附:生成的t1.msh文件
$MeshFormat 4.1 0 8 $EndMeshFormat $PhysicalNames 1 2 6 "My surface" $EndPhysicalNames $Entities 4 4 1 0 1 0 0 0 0 2 10 0 0 0 3 10 10 0 0 4 0 10 0 0 1 0 0 0 10 0 0 1 5 2 1 -2 2 10 0 0 10 10 0 1 5 2 3 -2 3 0 10 0 10 10 0 0 2 3 -4 4 0 0 0 0 10 0 1 5 2 4 -1 1 0 0 0 10 10 0 1 6 4 4 1 -2 3 $EndEntities $Nodes 8 5 1 5 0 1 0 1 1 0 0 0 0 2 0 1 2 10 0 0 0 3 0 1 3 10 10 0 0 4 0 1 4 0 10 0 1 1 0 0 1 2 0 0 1 4 0 0 2 1 0 1 5 5 5 0 $EndNodes $Elements 4 7 1 7 1 1 1 1 1 1 2 1 2 1 1 2 3 2 1 4 1 1 3 4 1 2 1 2 4 4 1 2 5 5 4 1 5 6 2 3 5 7 3 4 5 $EndElements
内容的提问来源于stack exchange,提问作者TOP1RM
相关产品推荐
相关产品推荐

