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

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. $Nodes 段

$Nodes
8 5 1 5
...(节点数据)
  • 首行8 5 1 5:
    • 8:所有节点条目总数(包含实体关联的占位条目,无实际坐标)
    • 5:实际存在坐标的网格节点总数(对应终端显示的5个节点)
    • 1:最小节点ID
    • 5:最大节点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是坐标

5. $Elements 段

$Elements
4 7 1 7
...(单元数据)
  • 首行4 7 1 7:
    • 4:单元类型总数(包含1D线单元、2D三角形单元等)
    • 7:实际存储的唯一网格单元总数
    • 1:最小单元ID
    • 7:最大单元ID
  • 每行单元格式:单元ID 单元类型 标签数 物理组ID 关联节点ID...
    • 单元类型对应Gmsh编码:1=1D线单元,2=2D三角形单元
    • 示例:
      • 1 1 1 1 1 2:单元ID1,线单元,归属物理组1,连接节点1和2
      • 4 2 2 4 1 2 5:单元ID4,三角形单元,归属物理组4,连接节点1、2、5

三、提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:15:14