本章将深入讲解Gmsh的网格生成技术,包括全局/局部网格控制、边界层生成、自适应细化等,并提供完整的代码示例。
4.1 网格生成基础
4.1.1 全局网格尺寸设置
通过设置全局参数控制网格密度:
# 设置全局最大/最小网格尺寸
gmsh.option.setNumber("Mesh.CharacteristicLengthMin", 0.1)
gmsh.option.setNumber("Mesh.CharacteristicLengthMax", 0.5)
4.1.2 局部网格尺寸控制
对特定几何实体(点、线、面)设置局部网格尺寸:
# 对曲线ID=1设置网格尺寸为0.05
model.mesh.setSize([(1, 1)], 0.05)
4.1.3 生成网格
# 生成二维三角形网格
model.mesh.generate(2)
# 生成三维四面体网格
model.mesh.generate(3)
4.2 网格类型与算法
4.2.1 二维网格
- 三角形网格(默认):
gmsh.option.setNumber("Mesh.Algorithm", 6) # 使用Frontal-Delaunay算法
- 四边形网格:
gmsh.option.setNumber("Mesh.RecombineAll", 1) # 启用四边形重组
4.2.2 三维网格
- 四面体网格:
gmsh.option.setNumber("Mesh.Algorithm3D", 1) # 使用Delaunay算法
- 六面体主导网格:
gmsh.option.setNumber("Mesh.Recombine3DAll", 1) # 尝试生成六面体
4.3 边界层生成
在流体力学中,边界层需要高密度网格:
# 在曲线ID=1周围生成边界层(3层,厚度增长因子1.2)
model.mesh.setBoundaryLayer(1, [1], 3, 0.1, 1.2)
model.mesh.generate(2)
4.4 自适应网格细化
根据误差估计自动加密网格:
# 启用自适应细化(基于后验误差估计)
gmsh.option.setNumber("Mesh.Adaptivity", 1)
gmsh.option.setNumber("Mesh.MaxIterAdaptive", 3) # 最大迭代次数
# 生成初始网格并细化
model.mesh.generate(2)
model.mesh.refine()
4.5 导出网格数据
4.5.1 导出为Gmsh格式
gmsh.write("mesh.msh") # 默认格式为MSH 4.1
4.5.2 导出为VTK格式(Paraview可用)
gmsh.option.setNumber("Mesh.SaveAll", 1) # 保存所有元素(包括物理组)
gmsh.write("mesh.vtk")
4.5.3 导出为XDMF格式(FEniCS可用)
gmsh.option.setNumber("Mesh.Format", 31) # 设置XDMF格式
gmsh.write("mesh.xdmf")
4.6 完整示例:带边界层的管道网格
import gmsh
gmsh.initialize()
model = gmsh.model
model.add("pipe_flow")
# 创建管道几何(矩形截面)
pipe = model.occ.addRectangle(0, 0, 0, 10, 2)
model.occ.synchronize()
# 设置全局网格尺寸
gmsh.option.setNumber("Mesh.CharacteristicLengthMin", 0.1)
gmsh.option.setNumber("Mesh.CharacteristicLengthMax", 0.5)
# 在管道壁面(曲线ID=1)生成边界层
model.mesh.setBoundaryLayer(1, [1, 3], layers=5, thickness=0.1, ratio=1.2)
# 生成二维网格并导出
model.mesh.generate(2)
gmsh.write("pipe_mesh.msh")
# 可视化网格
gmsh.fltk.run()
gmsh.finalize()
4.7 常见问题
-
网格质量差(存在畸形单元)
- 解决:调整网格算法或局部加密:
gmsh.option.setNumber("Mesh.Algorithm", 8) # 改用Packing Parallelepipeds算法
- 解决:调整网格算法或局部加密:
-
三维网格生成失败
- 原因:几何存在缝隙或非流形结构。
- 解决:使用
model.occ.healShapes()
修复几何。
-
边界层不连续
- 原因:边界层参数(层数/厚度)设置不合理。
- 解决:减少层数或增大厚度增长因子(
ratio
)。
4.8 本章小结
本章详细讲解了Gmsh的网格生成与控制技术,包括全局/局部参数设置、边界层生成、自适应细化及数据导出。通过“带边界层的管道网格”示例,读者可掌握复杂网格生成方法。