本章将通过三个实际工程案例,完整展示Gmsh从几何建模、网格生成到求解器集成的全流程,覆盖结构力学、流体力学及多物理场耦合问题。
1.1 案例一:桥梁结构静力学分析
1.1.1 问题描述
- 目标:分析简支梁桥在均布载荷下的应力分布。
- 参数:
- 桥梁跨度:20 m
- 截面尺寸:宽2 m,高1 m
- 材料:钢(弹性模量E=200 GPa,泊松比ν=0.3)
- 载荷:10 kN/m²
1.1.2 建模与网格生成
import gmsh
gmsh.initialize()
model = gmsh.model
model.add("bridge")
# 创建梁几何(箱型截面)
bridge = model.occ.addBox(0, 0, 0, 20, 2, 1)
model.occ.synchronize()
# 设置网格尺寸(边界层加密)
gmsh.option.setNumber("Mesh.CharacteristicLengthMin", 0.5)
gmsh.option.setNumber("Mesh.CharacteristicLengthMax", 1.0)
model.mesh.setSize([(2, bridge)], 0.3) # 截面加密
# 生成六面体主导网格
gmsh.option.setNumber("Mesh.RecombineAll", 1)
model.mesh.generate(3)
# 标记边界条件
supports = model.getBoundary([(3, bridge)], oriented=False)
model.addPhysicalGroup(2, [s[1] for s in supports], name="fixed_supports")
model.addPhysicalGroup(3, [bridge], name="beam")
gmsh.write("bridge_mesh.msh")
gmsh.fltk.run()
gmsh.finalize()
1.1.3 集成到CalculiX求解器
- 导出为INP格式:
gmsh.option.setNumber("Mesh.Format", 2) # Abaqus/CalculiX格式 gmsh.write("bridge_mesh.inp")
- CalculiX输入文件(.inp):
*HEADING Static Analysis of Bridge *NODE, NSET=NALL ...(节点数据) *ELEMENT, TYPE=C3D8, ELSET=EALL ...(单元数据) *BOUNDARY fixed_supports, 1, 6, 0 # 固定六个自由度 *DLOAD beam, P, 10e3 # 均布载荷 *MATERIAL, NAME=STEEL *ELASTIC 2e11, 0.3 *STEP *STATIC *END STEP
1.2 案例二:圆柱绕流CFD模拟
1.2.1 问题描述
- 目标:计算雷诺数Re=100时圆柱周围的流场。
- 参数:
- 圆柱直径D=0.1 m
- 计算域:15D×10D(来流速度U=1 m/s)
- 流体:水(密度ρ=1000 kg/m³,粘度μ=0.001 Pa·s)
1.2.2 边界层网格生成
import gmsh
gmsh.initialize()
model = gmsh.model
model.add("cylinder_flow")
# 创建计算域和圆柱
domain = model.occ.addRectangle(0, -0.5, 0, 1.5, 1)
cylinder = model.occ.addDisk(0.2, 0, 0, 0.05)
domain = model.occ.cut([(2, domain)], [(2, cylinder)])
model.occ.synchronize()
# 设置边界层(圆柱周围5层,增长率1.2)
model.mesh.setBoundaryLayer(2, [cylinder], layers=5, thickness=0.01, ratio=1.2)
# 生成非结构三角形网格
gmsh.option.setNumber("Mesh.Algorithm", 6) # Frontal-Delaunay
model.mesh.generate(2)
# 标记物理组
model.addPhysicalGroup(1, [1], name="inlet") # 左边界为入口
model.addPhysicalGroup(1, [2], name="outlet") # 右边界为出口
model.addPhysicalGroup(1, [3], name="cylinder") # 圆柱表面
model.addPhysicalGroup(2, [domain[0][1]], name="fluid")
gmsh.write("flow_mesh.msh")
gmsh.finalize()
1.2.3 OpenFOAM求解设置
- 转换网格:
gmshToFoam flow_mesh.msh -case /path/to/openfoam/case
- 编辑
0/U
文件:boundaryField { inlet { type fixedValue; value uniform (1 0 0); } outlet { type inletOutlet; inletValue uniform (0 0 0); } cylinder { type noSlip; } }
- 运行求解器:
simpleFoam -case /path/to/case
1.3 案例三:MEMS热-结构耦合分析
1.3.1 问题描述
- 目标:计算微悬臂梁在热载荷下的变形。
- 参数:
- 材料:硅(热膨胀系数α=2.6e-6 /K)
- 尺寸:1000×100×10 μm
- 温度场:基底固定,自由端加热ΔT=100 K
1.3.2 多物理场网格生成
import gmsh
gmsh.initialize()
model = gmsh.model
model.add("mems")
# 创建悬臂梁几何
beam = model.occ.addBox(0, 0, 0, 1000e-6, 100e-6, 10e-6)
model.occ.synchronize()
# 生成高阶六面体网格
gmsh.option.setNumber("Mesh.ElementOrder", 2)
gmsh.option.setNumber("Mesh.RecombineAll", 1)
model.mesh.generate(3)
# 标记边界条件
fixed_face = model.getEntitiesForPhysicalGroup(2, 1) # 假设固定面已标记
heated_nodes = model.getEntitiesForPhysicalGroup(1, 2) # 加热端节点
gmsh.write("mems_mesh.xdmf")
gmsh.finalize()
1.3.3 FEniCS多场求解脚本
from dolfin import *
mesh = Mesh()
with XDMFFile("mems_mesh.xdmf") as f:
f.read(mesh)
# 定义函数空间
V = VectorFunctionSpace(mesh, "CG", 2) # 位移场
Q = FunctionSpace(mesh, "CG", 1) # 温度场
# 热-结构耦合弱形式
u = TrialFunction(V)
v = TestFunction(V)
T = Function(Q)
# 热膨胀项
alpha = Constant(2.6e-6)
epsilon_thermal = alpha*T*Identity(3)
F = inner(grad(u), grad(v))*dx - inner(epsilon_thermal, grad(v))*dx
# 边界条件
bc = DirichletBC(V, (0,0,0), fixed_face)
solve(lhs(F) == rhs(F), u, bc)
1.4 本章小结
本章通过三个实战案例(桥梁结构分析、圆柱绕流、MEMS热-结构耦合),完整演示了Gmsh在复杂工程问题中的应用。读者可通过代码复现流程,深入掌握:
- 结构化/非结构化网格生成技巧
- 物理组与求解器集成方法
- 多物理场耦合建模策略
- 实际工程问题的数值求解全流程
下一步建议结合自身研究领域,基于此框架扩展更多定制化功能(如拓扑优化、瞬态分析)。