本文简单描述OpenFOAM计算案例的运行过程。
OpenFOAM中包含了众多的预制求解器,不同的求解器所需的字典输入文件可能存在较大差异,想要记住每个求解器所需的字典文件是非常困难的,所以一般情况下设置案例时,通常是在OpenFOAM案例库中找一个与自己问题足够接近的案例,然后根据自己的物理情况对案例进行修改。
OpenFOAM内置案例存放在路径$FOAM_TUTORIALS
中。OpenFOAM没有GUI图形界面,所有的操作都是通过终端命令来完成,所以在使用OpenFOAM之前,最好复习一下Linux系统的基本命令操作。
本文从一个方腔顶盖流计算入手,详细介绍OpenFOAM案例文件的设置。
要计算的物理问题如下图所示。
本案例采用icoFoam
求解器进行计算,这是一个瞬态不可压缩层流求解器,一般情况下不建议在工程应用中使用此求解器,因为icoFoam的建模功能很弱,工程问题可以采用pisoFoam或pimpleFoam求解器,它们的模拟能力要比icoFoam强很多。
所有的操作工作都在Linux终端中完成(Windows系统中可以使用WSL)。
tutorials
文件夹中复制文件到用户工作目录cd $FOAM_RUN
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity .
注意第二条命令最后面的.
,表示将文件拷贝到当前文件夹中。-r
表示连文件夹中的子文件一起拷贝。
cd cavity
blockMesh
checkMesh
网格生成以及后面的计算都必须在案例文件夹内部进行,因此先利用cd
命令进入到案例文件夹中;blockMesh
为OpenFOAM内置的分块网格生成器;checkMesh
程序主要用于统计网格信息并检查网格质量。
icoFoam
直接运行icoFoam
进行计算。
paraFoam
采用命令paraFoam
会启动paraview并读取结果数据,之后可以进行后处理计算。这里也可以利用命令touch cavity.foam
创建一个空文件,然后手工启动paraview读取此文件进行后处理。
最终时刻速度分布如图所示。
前面的计算过程中,求解器输出到终端的信息并不会被保存。当需要对计算过程进行调试时,这些信息非常重要,因此很有必要将其保存到文件中。
可以利用Linux中的tee
命令将这些信息保存到文本文件中。如在cavity文件夹下面的操作命令:
foamCleanTutorials
blockMesh | tee log.blockMesh
checkMesh | tee log.checkMesh
icoFoam | tee log.icoFoam
命令中的foamCleanTutorials
命令用于清除除了0、constant及system文件夹之外的所有文件;所有的log文件名都可以任意取。
执行完毕后查看工作目录,如下图所示,可以看到日志文件已经保留到路径中了。
这些日志文件都是文本文件,可以使用任何文本编辑器打开。
若想要绘制数据图形,可以利用命令:
foamLog log.icoFoam
该命令会将log.icoFoam文件中的数据进行分解。
之后可以利用gnuplot
进行图形绘制。
gnuplot
set logscale y
plot 'logs/p_0' using 1:2 with lines
在终端输入gnuplot
可进入gnuplot设置绘图环境(注意要先安装gnuplot)。终端显示如下图所示。
此时可以输出压力残差,如下图所示。
类似的命令还可以输入:
plot 'logs/p_0' using 1:2 with lines, 'logs/pFinalRes_0' using 1:2 with lines
reset
plot 'logs/CourantMax_0' u 1:2 w l
set logscale y
plot [30:50][] 'logs/Ux_0' u 1:2 w l title 'Ux','logs/Uy_0' u 1:2 w l title 'Uy'
关于gnuplot的使用,可以参阅该软件的官方文档。
若想要在计算过程中查看残差信息,可以采用两种方案:
foamMonitor
,配合字典文件residuals
一起使用pyFoam
进行残差显示对于foamMonitor
,可以利用以下命令添加residuals字典:
foamGet residuals
打开system/controlDic
文件,添加语句:
functions
{
#includeFunc residuals
}
然后运行案例:
icoFoam &
foamMonitor -l postProcessing/residuals/0/residuals.dat
图形显示结果如下图所示。
若要使用pyFoam
进行残差显示,需要首先安装pyFoam,这可以使用pip或pip3进行安装。
pip3 install pyFoam
安装完毕后,可以使用pyFoamPlotRunner.py
或pyFoamPlotWatcher.py
进行残差查看。
icoFoam > log.icoFoam
pyFoamPlotWatcher.py log.icoFoam
输出图形如下图所示。
注:不建议使用pyFoam,虽然很多时候比较方便,但pyFoam很多时候动不动罢工。
”
计算终止条件在system/controlDict
文件中进行指定。
application icoFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 0.5;
deltaT 0.005;
writeControl timeStep;
在该文件中包含关键字endTime
,其规定了计算结束时间。如上示例中指定了结束时间为50 s。
若想要停止仿真计算并且保存计算结果,可以在controlDict
字典文件中修改:
stopAt writeNow;
此时会终止计算并保存当前时刻数据。
若想要动态修改计算停止条件,需要在controlDict
字典文件中增加关键字runTimeModifiable
为true
,如:
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * //
runTimeModifiable true; //采用动态修改的方式
application icoFoam;
startFrom startTime;
startTime 0;
也可以在OpenFOAM计算过程中采用键盘ctrl c
组合键强行终止,但是采用此方式终止进程的话,OpenFOAM不会保存最终时间步或迭代步得到的数据。
如果想要清除案例文件夹中的网格与计算结果文件,可以通过命令foamCleanTutorials
来实现。若是并行计算的文件夹,此命令也会清除所有的processorN目录。
foamCleanTutorials
若只想清除网格文件,可以在终端输入foamCleanPolyMesh
命令。
foamCleanPolyMesh
若只想清除保存的结果文件,可以在终端输入:
foamListTimes -rm
若想要删除并行计算的结果文件,可以在终端输入:
foamListTimes -rm -processor