interFoam 是 OpenFOAM 中求解两相不可压缩流体的求解器,是很多求解器的基础。这个求解器的 tutorials 也非常丰富,涵盖了 laminar、LES 和 RAS 等类型,本文将简要描述这些算例的背景和其中的技巧。
这些算例中最著名的当属“溃坝”damBreak,被收入了用户手册。这个算例既有层流版本,也有 RAS 版本。文档中的是层流版本,RAS 版本只是加上了 k-epsilon 紊流模型。这个算例的看点有:1)Allrun 脚本用 sed 流编辑器实现了文档中描述的加密网格的过程;2)setFields、decomposePar 和 reconstructPar 的基本用法。
两种网格尺寸,两种紊流模型,一共有四种组合,某一时刻结果对比如下图所示
可以看到,RAS 的两个计算结果明显是是“网格相关的”,而没有紊流模型的两个计算结果看起来是网格无关的。
接下来,看下加了透水挡板的溃坝算例 RAS/damBreakPorousBaffle。图片完全无法展现透水挡板的性质,知乎识别不了我的视频,感兴趣的朋友请运行算例,如果默认配置无法收敛的话请改小库朗数。这个算例的看点是 createBaffles 工具,这个函数的功能是
Makes internal faces into boundary faces. Does not duplicate points, unlike mergeOrSplitBaffles.
这个 baffle 是一对 cyclic 边界条件构成的,很特别。
最后,看下搅拌容器 laminar/mixerVessel2D,这类搅拌容器算例也挺常见的,本专栏先前介绍过用 pimpleDyMFoam 计算的 mixerVesselAMI2D,动网格算例 – 搅拌容器。这个算例的一个看点是用 m4 脚本生成网格,这也是这类算例通用的做法。m4 是个宏处理器,可以理解为一种脚本语言,诞生的年代十分久远,详见 m4 (computer language)。另外一个看点是用 MRFProperties 设置旋转的壁面,MRF 的意思是 moving reference frame,这种办法的好处在于不需要设置动网格,也被称作“frozen rotor approach”(Moving Reference Frame for Computational Fluid Dynamics)。计算结果如下图所示。
看下明渠算例 RAS/waterChannel,这个算例包含两个不同体型的明渠,只需更改 Allmesh 脚本中 i 的值,就可以使用不同的体型进行计算。明渠的网格是用 extrudeMesh 工具生成的,这个工具适合生成具有相同横断面的槽道,管道等。这个算例使用的紊流模型是 kOmegaSST,详见 SST k-omega model — CFD-Wiki。计算结果如下图所示。
上边的渠道转弯前是逆坡,转弯后是顺坡,水流从缓流变成急流;下边的渠道从水池出来的时候就是顺坡,且有转弯,水流同样从缓流变成急流。上下两处变坡+转弯的位置,水面形态相似。
接着看一个堰流 RAS/weirOverflow,这个算例是堰型设计的反面教材,过流面的尖角处出现了负压,我们知道水是没什么抗拉强度的,出现这么大的负压就很可能会空化。工程上用的曲线堰,可以很好地克服了这一问题。压强分布见下图,黑线是水面和流线。
接下来看一个弯折的矩形槽道充水的过程 RAS/angledDuct。入口在下边,出口在上边。这个算例的网格也是用 m4 生成的。
接下来看一个稍复杂的算例——毛细管水面上升 laminar/capillaryRise。这个算例是二维的,也就是说模拟的其实是两个平行壁面间的毛细现象。这个算例的看点在表面张力和重力的平衡。如下图所示,初始水面是平的,计算到10秒,水面在震荡后基本稳定,比初始水位略高,且水面在张力作用下弯曲。请读者思考一个问题,如果初始水位更高,稳定后的水位会不会变高?
最后,看一个船舶工程的案例 RAS/DTCHull。这个算例网格数达到了 84 万,默认的并行设置使用8个线程。这个算例的看点在于多次使用 topoSet 和 refineMesh 工具加密网格。另一个看点是对称面的使用。计算结果如下图,后处理时将一半模型还原成了整个模型。
还剩两个算例没有介绍,一是 laminar/wave,这个算例用到了 OpenFOAM 在 5.0 中新增的波浪模型;一是 LES/nozzleFlow2D 这个大涡模拟的算例。
先来看 laminar/wave,这个算例是有关水波运动的,波浪力学和水波理论我不熟,单纯介绍下算例的设置,就当抛砖引玉了。先来看下边界条件,如下图所示,波浪从左侧向右侧运动,上边是大气,下边是底床。右侧靠近出口的位置是消波区,消波区的目的是防止出口反射水波。
我们看下网格,可以明显看到,中间网格非常密集,水面就位于这里。关注一下网格疏密过渡的位置,六面体网格成了三棱柱。这是非结构网格的一大优势,可以灵活地进行局部加密。
在 OpenFOAM 里,像消波区那种疏密渐变的网格是在 blockMeshDict 中定义的。局部加密是用 topoSet 和 refineMesh 这两个工具实现的,topoSet 用来选取 topoSetDict 中定义范围,refineMesh 用来按照 refineMeshDict 中的加密策略加密网格。在一个算例中,这两个工具往往要多次使用,多次加密网格,所以在 Allrun 脚本中往往会定义一个函数或者直接用循环来实现自动运行,比如这个算例的
for i in 1 2
do
runApplication -s $i topoSet -dict system/topoSetDict$i
runApplication -s $i refineMesh -dict system/refineMeshDictX -overwrite
done
for i in 3 4 5 6
do
runApplication -s $i topoSet -dict system/topoSetDict$i
runApplication -s $i refineMesh -dict system/refineMeshDictY -overwrite
done
Code language: PHP (php)
还有这种的
refineMeshByCellSet()
{
while [ $# -ge 1 ]
do
if [ ! -e log.refineMesh.$1 ]
then
echo "Creating cell set for primary zone - $1"
cp system/topoSetDict.$1 system/topoSetDict
topoSet > log.topoSet.$1 2>&1
echo "Refining primary zone - $1"
refineMesh -dict system/refineMeshDict -overwrite \
> log.refineMesh.$1 2>&1
fi
shift
done
}
refineMeshByCellSet 1 2 3
Code language: PHP (php)
然后看下运行结果
最后,看下 LES/nozzleFlow2D 这个大涡模拟的算例。这是一个自由射流,一股燃油喷射到空气中。几何是二维的,也就是从圆柱体中截出的一个楔形,截面上使用 wedge 边界条件。网格生成同样用到了 extrudeMesh 工具,回忆一下还有哪个算例用了?
这里需要注意的是,大涡模拟原则上不能使用真的只有一层网格的二维几何,OpenFOAM tutorials 并不保证物理正确。看下计算结果
interFoam 的 tutorials 都介绍完了,想要了解更多细节或者获取后处理源文件,可以私信、评论。