Gmsh网格生成
理论:在Gmsh中生成网格的方法
概述
Gmsh是免费的网格工具,与商用前处理软件相比能做什么?
形状导入、单元尺寸控制、物理组定义到多种格式输出,网格生成所需的功能基本齐全。Gmsh以OpenCASCADE为几何内核,可以读入STEP、IGES等CAD,也可以用布尔运算建立形状。单元尺寸除逐点指定外,还可用“尺寸场”按距离或曲率变化,并能生成边界层(BoundaryLayer场)和结构网格(Transfinite)。最大的特点是所有操作都能用脚本(.geo)或Python API编写,适合改变尺寸的参数研究以及优化过程中的网格自动重建。另一方面,装配体接触面的协调和大规模六面体网格的自动生成,往往还是商用工具更方便。
单元数估算
h为单元尺寸,A为面积,d为到孔边等的距离。估算假设单元接近正三角形;Threshold场在d_min到d_max之间线性改变尺寸。
始于1997年的网格工具
Gmsh于1997年前后由比利时的Christophe Geuzaine和Jean-François Remacle为自己的研究而开始编写,至今仍以鲁汶大学和列日大学为中心持续开发,以GPL许可证公开。为研究而开始的软件,如今已成为许多开源求解器的标准入口。
算例
单元数由正三角形面积积分估算,不是实际Gmsh网格的计数。孔边间距一致不保证应力精度;还应检查尺寸过渡、曲面近似、单元质量与收敛。
例:100 mm见方板,中央直径10 mm孔(二维三角形单元)
| 网格划分方式 | 单元尺寸 | 单元数(估算) | 与全部0.5 mm之比 |
|---|---|---|---|
| 全部均匀细化 | 0.5 mm | ≈ 91,650 | 100% |
| 全部均匀粗化 | 5 mm | ≈ 917 | 1.0% |
| 尺寸场(孔边0.5 mm→20 mm外5 mm) | 0.5〜5 mm | ≈ 1,725 | 1.9% |
使用尺寸场时,孔周围同样排列着63个单元,与均匀0.5 mm相同,保持了捕捉应力集中所需的细度,而单元数约减到1/50。三维中尺寸减半单元数变为8倍,尺寸场的效果更大。
设置了尺寸场,孔周围却没有加密。缺了什么?
常见原因有三个。第一,没有设为背景场(Background Field)。只定义Field不会被使用,需要用Background Field = n指定使用哪个场。第二,其他尺寸设置优先。点上指定的尺寸(MeshSize)、按曲率的尺寸、从边界传播的尺寸会组合起作用,把Mesh.MeshSizeFromPoints、Mesh.MeshSizeFromCurvature、Mesh.MeshSizeExtendFromBoundary设为0,让尺寸只由场决定,就容易按意图生成。第三,Distance场的对象指定错误,孔曲线的编号可能因几何修改而改变。用OpenCASCADE建模时编号会重排,不要直接写编号,而是用包围盒等方式获取,这样修改几何也不会出错。
入门流程
- 安装Gmsh,在图形界面中建立简单形状并划分网格,保存为.geo并阅读其内容。
- 读入STEP,用物理组给边界条件面和材料区域命名。
- 用Distance和Threshold尺寸场只加密应力集中部位。
- 按求解器所需格式输出,确认单元数和质量(Gamma、SICN)。
- 用Python API把尺寸设为变量,改变参数自动重建网格。
“加了物理组后面消失了”
初次在Gmsh中使用物理组时,常会惊讶地发现输出的网格中部分单元不见了。规则是:没有任何物理组时Gmsh输出所有单元,只要有一个物理组,就只输出属于物理组的单元。只为边界条件建立面组时,体单元不会被输出,成了空网格。一定要给体(三维时所有实体)也设置物理组,或设置Mesh.SaveAll = 1输出全部。
常见错误
错误与对策
| 错误 | 后果 | 对策 |
|---|---|---|
| 未指定背景场 | 尺寸场不起作用 | 设置Background Field |
| 只给面设物理组 | 不输出体单元 | 体也要设置 |
| 直接写编号 | 修改几何后出错 | 用包围盒等获取 |
| 输出格式不匹配 | 求解器无法读取 | 确认格式和版本 |
| 二阶单元中间节点 | 偏离曲面 | 高阶网格优化 |
我想了解相关内容。
常见问题
Gmsh是什么?
由比利时鲁汶大学等的研究人员开发的开源有限元网格生成软件。读入CAD形状(通过OpenCASCADE读入STEP等),生成二维、三维的三角形、四边形、四面体和六面体网格。可用.geo脚本或Python、C++的API操作,网格可传给CalculiX、Code_Aster、Elmer、FEniCS、OpenFOAM等众多求解器。
怎样只在需要的地方加密网格?
使用尺寸场(Mesh Field)。用Distance场求出到孔边等的距离,用Threshold场按距离改变单元尺寸,例如“距离0处0.5 mm,离开20 mm处5 mm”。100 mm见方带孔板全部0.5 mm需约9.2万个单元,用这种方法约1,700个即可,孔周围排列着63个同样细的单元。
把网格传给求解器时要注意什么?
要设置物理组(Physical Group)。只要存在一个物理组,Gmsh就只输出属于物理组的部分。给施加边界条件的面和各材料区域设置有名称的物理组,并按求解器选择输出格式(.msh版本、.inp、.unv等)。使用二阶单元时,还要确认中间节点是否落在曲线边界上。
参考资料与检验范围
所列数值是基于文中假设的教学参考计算。资料用于理论和设置参考,不证明已在各软件中复现这些数值。工程决策须按实际条件验证。