OpenFOAM后处理
理论:提取数值的机制
概述
OpenFOAM的后处理不就是用ParaView看结果吗?
只是看结果的话ParaView就够了,但用于设计的数值,基本上要用“函数对象”提取。在system/controlDict的functions中写入forces(力和力矩)、forceCoeffs(阻力和升力系数)、probes(点的时间历程)、sets与surfaces(线和面上的分布)、fieldAverage(时间平均)、yPlus、wallShearStress等,计算的同时就会输出到postProcessing文件夹。计算后也可以用postProcess -func对已有结果做同样的处理。提取数值时容易出错的是参考面积、速度和密度的给法,时间平均的开始时刻以及输出间隔,它们都会改变结果的数量级或含义。
系数定义与单位
F_d为阻力,ρ∞、U∞为参考密度和速度,A_ref为参考面积,D为圆柱直径,f为涡脱落频率,St为斯特劳哈尔数,p_kin为不可压缩求解器的运动学压力。
paraFoam与ParaView
打开OpenFOAM结果的paraFoam,其实是启动ParaView并加载OpenFOAM格式读取器的脚本。ParaView本身是美国国家实验室与Kitware公司开发的可视化软件,与OpenFOAM是不同的项目。使用ParaView自带的读取器(.foam文件)不用paraFoam也能打开,在Windows电脑上查看计算机上的结果时常这样用。
算例
Cd = 1.33与St = 0.165是用于检查设置的示例输入,不是本站仿真结果。精确基准比较必须统一阻塞率与边界条件。请使用所用版本的命令,如Foundation v13的foamPostProcess。
例:Re = 100圆柱(直径0.01 m,流速1 m/s,运动黏度1×10⁻⁴ m²/s,网格厚度0.002 m)
| 项目 | 值 | 备注 |
|---|---|---|
| 阻力系数(示例输入) | ≈ 1.33 | 时间平均 |
| 斯特劳哈尔数(示例输入) | ≈ 0.165 | |
| 网格厚度上的阻力 | 1.33×10⁻⁵ N | rhoInf = 1 |
| 误设Aref = D时的显示 | 0.00266 | 小500倍 |
| 涡脱落频率/周期 | 16.5 Hz / 0.061 s | |
| 每周期20点的采样间隔 | 0.003 s | |
| 10个周期平均所需时间 | 0.61 s | 去除初始过渡后 |
示例输入为代表性数值。forceCoeffs的参考面积为直径×网格厚度,涡脱落频率由升力系数时间历程做FFT求得。
把阻力系数时间历程平均后得到1.45,比示例输入1.33高9%。应该加密网格吗?
在那之前,先确认平均方法。圆柱后方的涡脱落在开始流动后的一段时间内仍在发展,可能要几十个周期才进入周期性状态。从一开始就平均,会混入起始的过渡过程而产生偏差。fieldAverage或forceCoeffs的平均,应在升力系数振幅稳定后开始,并取整数个周期(例如10个周期,本例为0.61秒)平均。在周期中途截断,平均值会因振荡而偏移。在此基础上仍有差异,再依次检查计算域大小(侧壁太近会使阻力增大,宽度以直径的20倍以上为宜)、出口位置、时间步长(库朗数)和网格。
实务流程
- 确定需要的数值(力、系数、点时间历程、截面分布),写入controlDict的函数对象。
- 设置参考面积、长度、速度和密度,二维时要计入网格厚度。
- 非稳态时以小于现象周期1/20的间隔输出,过渡结束后按整数周期平均。
- 用yPlus和wallShearStress确认壁面处理是否合理。
- 与示例输入或实验比较,按计算域、时间步长、网格的顺序查找差异原因。
“并行计算结果不能直接打开”
用decomposePar分割并行计算的结果,分别保存在processor0、processor1……等文件夹中。直接用ParaView打开,可能只看到初始时刻而感到困惑。用reconstructPar合并,或在打开.foam文件时选择“Decomposed Case”即可看到全部。函数对象的输出统一写在postProcessing文件夹中,从这里提取数值更可靠。
常见错误
错误与对策
| 错误 | 后果 | 对策 |
|---|---|---|
| 二维时Aref不计厚度 | 系数差几个数量级 | 直径×网格厚度 |
| 把运动学压力当作Pa | 压力和力差密度倍 | 指定rhoInf |
| 平均时包含过渡 | 平均值偏移 | 周期稳定后取整数周期 |
| 输出间隔太粗 | 频率算错 | 小于周期的1/20 |
| 力方向向量错误 | 升力与阻力互换 | 检查liftDir和dragDir |
我想了解相关内容。
常见问题
在OpenFOAM中如何求力和系数?
在system/controlDict的functions(函数对象)中写入forces或forceCoeffs,使其在计算的同时输出。forceCoeffs需要指定参考速度magUInf、参考长度lRef、参考面积Aref、流体密度rhoInf以及力的方向(liftDir、dragDir)。也可以在计算后用postProcess -func从已保存的结果中求出。
二维计算的阻力系数小得离谱。
很可能参考面积Aref没有计入网格厚度。OpenFOAM的二维计算是只有一层网格厚的三维网格,力只作用在这个厚度上。直径0.01 m的圆柱用厚0.002 m的网格计算时,Aref = 0.01 × 0.002 m²。若输入Aref = 0.01,阻力系数会把1.33显示为0.00266。
不可压缩求解器的压力值不对劲?
simpleFoam、pimpleFoam等不可压缩求解器求解的p是压力除以密度后的“运动学压力”(单位m²/s²)。对于空气(密度1.2 kg/m³),p = 50 m²/s²相当于60 Pa。forces中若不给出rho rhoInf及rhoInf的值,力会按密度1计算。
参考资料与检验范围
所列数值是基于文中假设的教学参考计算。资料用于理论和设置参考,不证明已在各软件中复现这些数值。工程决策须按实际条件验证。