用 potentialFoam 初始化流场

PotentialFoam 是 OpenFOAM 中求解势流方程的求解器,常用来为其他求解器提供初始流场。本文将介绍势流方程和 potentialFoam 的一个应用。

我们知道,不可压缩流体的运动满足连续性方程,即速度场的散度为零

[公式]

式中[公式]是速度,是一个向量场。

速度有三个分量,因而无法单用连续性方程解出。但如果流动是无旋的,流速有势,则流速势可被求出,因而流速也可被求出,而无需额外的方程。即

[公式]

式中,[公式]是流速势,是一个标量函数,它的梯度是流速,即[公式]

从以上过程可以看出,仅用运动方程而无需动量方程便可求出无旋流的速度场。

实际工程中,势流方程最常见的应用场合是求解渗流问题。此外,也常用来为其他方程提供初试条件,以帮助收敛。比如,在 OpenFOAM 中,可以用 potentialFoam 求一个初始条件,然后调用其他求解器(如 simpleFoam)继续计算,下面我们用 pitzdaily 这个算例说明用法。

算例的位置是

$FOAM_TUTORIALS/basic/potentialFoam/pitzDailyCode language: PHP (php)

$FOAM_TUTORIALS/incompressible/simpleFoam/pitzDailyCode language: PHP (php)

将算例复制到运行目录,用 Allrun 脚本运行 potentialFoam 的算例。算完后并不会生成以时间步或迭代步命名的文件夹,计算结果依然保存在 0/ 文件夹,原始文件会被覆盖。用 paraFoam 命令打开 paraview 可以看到求出的流速和压强,需要注意的是,压强并非势流方程的求解结果,这一点将在后续的文章中阐述。

下面进入 simpleFoam 那个算例的目录,用 blockMesh 剖分网格,用 mapFields 将 potentialFoam 的计算结果映射过来,然后再用 simpleFoam 求解,用 paraFoam 查看结果。我将这些命令写成了 Allrun 脚本。读者可以逐条运行,也可以直接使用下面的脚本。

#!/bin/sh
cd ${0%/*} || exit 1    # Run from this directory

# Source tutorial run functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions

application=`getApplication`

runApplication blockMesh
runApplication mapFields $FOAM_RUN/basic/potentialFoam/pitzdaily
runApplication $applicationCode language: JavaScript (javascript)

如果要运行这一脚本,可以通过以下命令创建 Allrun 文件,将代码复制粘贴保存,再赋予运行权限,然后运行。

gedit Allrun
chmod +x Allrun
./Allrun

可见,potentialFoam 和 simpleFoam 的求解结果大相径庭,对于这种流动,potentialFoam 严重失真。实际上,用 potentialFoam 提供初始流场后,simpleFoam 的迭代次数也未减少,甚至增加少许。因而,如果不是遇到难以收敛的情况,没必要使用 potentialFoam 初始化。何况,用双方程紊流模型算恒定流,计算代价也不大。

常恭

作者: 常恭

略懂 OpenFOAM

发表评论