OpenFOAM入门
理论:算例结构以及时间步长与网格的确定
概述
我想开始用OpenFOAM,但听说没有图形界面,有点不安。从哪里入手好?
先原样运行一个官方教程。OpenFOAM用称为“算例”的文件夹表示一个分析,里面有三个文件夹:0/写各变量(速度U、压力p)的初值和边界条件,constant/写物性(运动粘度等)和网格,system/写计算时间与输出(controlDict)、离散方法(fvSchemes)、方程组求解方法(fvSolution)和网格生成方法(blockMeshDict)。一开始复制方腔流(只有顶盖运动的正方形箱体)算例,用blockMesh生成网格,用icoFoam求解,用ParaView查看。这一整套跑通后,再一项项改变设置确认结果的变化。没有图形界面,反过来所有设置都以文本保存,便于比较条件和自动化。
雷诺数、库朗数与计算量
U为代表速度(顶盖速度),L为代表长度(方腔边长),ν为运动粘度,Δt为时间步长,Δx为网格尺寸,N为每边分割数。icoFoam是不可压缩层流瞬态求解器,用PISO算法耦合压力和速度。
从伦敦的实验室走向世界
OpenFOAM的前身FOAM于1990年代在伦敦帝国理工学院开发,是一个能用C++“按方程原样”书写偏微分方程的库。2004年作为开源软件发布后,在企业和大学中迅速普及。求解器代码读起来几乎与控制方程形式相同,这是研究者容易加入自己模型的原因。
算例
例1:运动粘度与雷诺数(顶盖1 m/s,边长0.1 m)
| 运动粘度 ν | 雷诺数 | 粘性扩散时间 L²/ν |
|---|---|---|
| 0.01 m²/s | 10 | 1秒 |
| 0.001 m²/s | 100 | 10秒 |
| 0.0001 m²/s | 1,000 | 100秒 |
教程设置为ν = 0.01(Re = 10),结束时间0.5秒。
例2:网格疏密与计算量(库朗数1,计算到0.5秒)
| 网格 | 网格尺寸 | 时间步长 | 步数 | 网格数 | 计算量(20×20为1) |
|---|---|---|---|---|---|
| 20×20 | 0.0050 m | 0.0050 s | 100 | 400 | 1 |
| 40×40 | 0.0025 m | 0.0025 s | 200 | 1,600 | 8 |
| 80×80 | 0.00125 m | 0.00125 s | 400 | 6,400 | 64 |
想要Re = 1000,只把运动粘度改成0.0001就行吗?
这样还不够。首先,Re升高后方腔角落出现小涡,壁面附近速度变化很陡,20×20太粗,至少要加密到80×80左右,时间步长也要减小,使库朗数不超过1。其次,流动稳定下来所需的时间变长。粘性把动量扩散到整个方腔的时间尺度L²/ν,Re = 10时为1秒,Re = 1000时为100秒,在0.5秒停下只是在看中间状态。要延长endTime,确认中心线速度分布不再随时间变化后再使用结果。此外Re = 1000时一定要检查网格加密后结果是否不再改变(网格收敛)。方腔流有详细的参考解(Ghia等人的数据表),与之比较是最合适的第一项验证。
入门流程
- 把教程的cavity算例复制到工作文件夹。
- 用blockMesh生成网格,用checkMesh确认质量。
- 用icoFoam求解,在日志中确认残差和库朗数。
- 在ParaView中查看速度和压力(paraFoam或foamToVTK)。
- 一项项改变设置,与参考解比较验证。
“第一次改动就发散”
跑通教程后常做的下一步,是加密网格后直接运行。有个学生改成40×40后计算立刻发散。查看日志,库朗数接近2,原因是网格尺寸减半而时间步长仍为0.005秒。把时间步长改为0.0025秒后顺利收敛。OpenFOAM也可以在controlDict中用adjustTimeStep并指定最大库朗数,让时间步长自动调整。
常见错误
错误与对策
| 错误 | 后果 | 对策 |
|---|---|---|
| 只加密网格 | 库朗数超限发散 | 同时减小时间步长 |
| 提高Re仍用原结束时间 | 看到的是中间状态 | 确认已达稳态 |
| 边界名称不一致 | 启动时报错 | 统一0/与网格中的名称 |
| 跳过checkMesh | 坏单元导致发散 | 确认质量 |
| 不与参考解比较 | 发现不了错误 | 用基准问题验证 |
我想了解相关内容。