OpenFOAM网格生成
理论:网格工具与壁面处理
概述
OpenFOAM没有图形界面的网格工具,网格怎么生成?
通过文本设置文件来生成。基础工具是blockMesh:在system/blockMeshDict中写出顶点坐标、块(六面体)的分割数和网格增长率(grading),就能得到结构网格。复杂形状先用blockMesh生成箱形背景网格,再把STL表面形状交给snappyHexMesh,分三步完成:(1) 在表面和指定区域细分网格(castellatedMesh),(2) 把网格节点移到表面上(snap),(3) 从壁面挤出薄网格层(addLayers)。也可以转换外部网格工具生成的网格。无论哪种方法,最后都用checkMesh检查网格畸变(非正交性、偏斜度)和负体积。
网格比、第一层网格与y+
r为blockMesh的simpleGrading中最后一个与第一个网格的尺寸比,N为网格数,h为壁面到中心的长度,Δy₁为第一层网格厚度,u_τ为摩擦速度,C_f为流道摩擦系数(Dean公式),ν为运动黏度。y+取第一层网格中心处的值。
对六面体的执着
正如snappyHexMesh这个名字所示,OpenFOAM的网格生成以六面体为中心。OpenFOAM的有限体积法可以处理任意多面体网格,但六面体在同样精度下所需网格更少,与流动方向对齐时数值扩散也更小。snappyHexMesh用“切削六面体背景网格以贴合形状”的方法,即使形状复杂,大部分网格仍保持六面体。只有贴合表面的部分变成多面体,而它们的质量往往决定整个网格的质量。
算例
空气ν = 1.5×10⁻⁵ m²/s;Dean式Re按50 mm全通道高度定义,此处不是水力直径。r = 1时Δy₁ = h/N。y+适用范围取决于壁面处理,不能把所有全y+壁函数都判为不适用。后处理命令也随版本不同。
例1:高50 mm流道,空气10 m/s(半高40个网格)
雷诺数33,333,摩擦系数0.0054,摩擦速度0.52 m/s,黏性长度ν/u_τ约29 µm。
| 网格比r | 第一层网格 | y+ | 中心网格 | 判断 |
|---|---|---|---|---|
| 1 | 625 µm | 10.8 | 0.62 mm | 缓冲层:两者都不适合 |
| 10 | 158 µm | 2.7 | 1.58 mm | 稍粗 |
| 40 | 58 µm | 1.0 | 2.3 mm | 适合壁面解析 |
| 200 | 16 µm | 0.28 | 3.19 mm | 壁面过细、中心过粗 |
使用壁函数时以y+ ≈ 30为参考,第一层网格约1.7 mm,半高均分约14个网格。
40个均分网格看起来很细、很稳妥。为什么说“两者都不适合”?
因为y+ ≈ 11处于缓冲层,介于壁面附近黏性主导的层(y+ < 5)与对数律成立的层(y+ > 30)之间。壁函数以第一层网格位于对数律层为前提确定壁面剪应力,放在缓冲层会算错摩擦和传热。而解析到壁面的低雷诺数模型需要第一层网格在y+ ≈ 1以下、用几个网格解析黏性层,y+ ≈ 11又太粗。OpenFOAM的kOmegaSST可以与nutUSpaldingWallFunction这类适用于全y+范围的壁面处理配合使用,但缓冲层的误差仍然最大。计算后一定要用yPlus工具(postProcess -func yPlus)输出壁面y+分布,确认是否在目标范围内。
例2:snappyHexMesh加密级别与边界层(背景网格8 mm)
| 级别 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 网格尺寸 | 8 mm | 4 mm | 2 mm | 1 mm | 0.5 mm |
在级别3(1 mm)的壁面上以5层、expansionRatio 1.2、finalLayerThickness 0.5(相对值)添加边界层,从外到内依次为0.50、0.42、0.35、0.29、0.24 mm,总厚1.79 mm,第一层0.24 mm(例1的流动中y+ ≈ 4)。要达到y+ ≈ 1,需要增加层数或提高壁面加密级别。
实务流程
- 根据流动条件估算摩擦速度,按所用壁面处理确定第一层网格厚度。
- 用blockMesh生成背景网格(或整体网格),按计算值设置网格比。
- 用snappyHexMesh加密表面和重要区域,确定边界层层数和厚度。
- 用checkMesh检查非正交性、偏斜度和负体积,修正问题部位。
- 求解后确认y+分布,并改变两级网格确认结果不变。
“一个70度非正交的网格”
checkMesh的输出中常常只有几个网格的最大非正交性超过70度。几个而已容易被忽视,但压力方程的收敛会被这些少数网格拖累,往往成为发散的起点。可以增加fvSolution中的nNonOrthogonalCorrectors来修正,但根本办法是修好这些网格。用checkMesh -allGeometry -allTopology把问题网格输出为集合(cellSet),在ParaView中查看位置,就能很快知道是哪个形状或哪个设置造成的。
常见错误
错误与对策
| 错误 | 后果 | 对策 |
|---|---|---|
| 第一层网格在缓冲层 | 摩擦和传热误差 | 使y+≈1或≥30 |
| 不检查y+ | 壁面处理与网格不匹配 | 用yPlus输出分布 |
| 边界层局部缺失 | 局部y+偏大 | 调整层设置和质量约束 |
| 放任非正交网格 | 压力不收敛 | 用cellSet定位并修正 |
| STL有孔洞或重叠 | 内外混淆 | 用surfaceCheck检查 |
我想了解相关内容。
常见问题
OpenFOAM的网格怎么生成?
简单形状用blockMesh拼接六面体块生成;复杂形状先用blockMesh生成背景网格,再用snappyHexMesh按STL形状切削、加密并在壁面添加边界层。也可以用gmshToFoam或fluentMeshToFoam转换Gmsh、ANSYS Meshing等外部工具生成的网格。最后用checkMesh检查质量。
壁面第一层网格的尺寸怎么确定?
根据所用湍流模型的壁面处理方式确定y+(壁面距离除以黏性长度)。解析到壁面时y+≈1,使用壁函数时y+约30〜300。高50 mm流道、空气10 m/s的例子中黏性长度约29 µm,y+≈1需要第一层网格约58 µm(网格中心约29 µm)。
snappyHexMesh的边界层加不好。
沿几何体挤出的空间不够时,边界层会在局部被省略。检查layers设置(层数、expansionRatio、finalLayerThickness)和质量约束(meshQualityControls),先减少层数看能否覆盖所有表面。最终各面加了几层,用日志或checkMesh的输出确认。
参考资料与检验范围
所列数值是基于文中假设的教学参考计算。资料用于理论和设置参考,不证明已在各软件中复现这些数值。工程决策须按实际条件验证。