吾生有涯 学海无涯
析模有界 知识无界

OpenFOAM|08 第一个case

本文简单描述OpenFOAM计算案例的运行过程。

OpenFOAM中包含了众多的预制求解器,不同的求解器所需的字典输入文件可能存在较大差异,想要记住每个求解器所需的字典文件是非常困难的,所以一般情况下设置案例时,通常是在OpenFOAM案例库中找一个与自己问题足够接近的案例,然后根据自己的物理情况对案例进行修改。

OpenFOAM内置案例存放在路径$FOAM_TUTORIALS中。OpenFOAM没有GUI图形界面,所有的操作都是通过终端命令来完成,所以在使用OpenFOAM之前,最好复习一下Linux系统的基本命令操作。

本文从一个方腔顶盖流计算入手,详细介绍OpenFOAM案例文件的设置。

1 问题描述

要计算的物理问题如下图所示。

  • 控制方程为不可压缩层流NS方程
  • 计算区域为二维,但是也可以扩展为三维
  • 为了求得数值解,需要对计算区域进行离散,设置边界条件与初始条件,定义流体属性,设置数值格式与求解器参数
  • 在处理不可压缩流动时,采用相对压力进行计算
  • 已预制好所有的字典文件

本案例采用icoFoam求解器进行计算,这是一个瞬态不可压缩层流求解器,一般情况下不建议在工程应用中使用此求解器,因为icoFoam的建模功能很弱,工程问题可以采用pisoFoam或pimpleFoam求解器,它们的模拟能力要比icoFoam强很多。

2 计算过程

所有的操作工作都在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读取此文件进行后处理。

最终时刻速度分布如图所示。

3 保存计算信息

3.1 保存计算过程信息

前面的计算过程中,求解器输出到终端的信息并不会被保存。当需要对计算过程进行调试时,这些信息非常重要,因此很有必要将其保存到文件中。

可以利用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的使用,可以参阅该软件的官方文档。

3.2 查看计算残差

若想要在计算过程中查看残差信息,可以采用两种方案:

  • 方法1:利用OpenFOAM提供的工具foamMonitor,配合字典文件residuals一起使用
  • 方法2:利用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.pypyFoamPlotWatcher.py进行残差查看。

icoFoam > log.icoFoam
pyFoamPlotWatcher.py log.icoFoam

输出图形如下图所示。

注:

不建议使用pyFoam,虽然很多时候比较方便,但pyFoam很多时候动不动罢工。

3.3 终止计算

计算终止条件在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字典文件中增加关键字runTimeModifiabletrue,如:

FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * //
runTimeModifiable true; //采用动态修改的方式
application icoFoam;
startFrom startTime;
startTime 0;

也可以在OpenFOAM计算过程中采用键盘ctrl+c组合键强行终止,但是采用此方式终止进程的话,OpenFOAM不会保存最终时间步或迭代步得到的数据。

3.4 清理文件

如果想要清除案例文件夹中的网格与计算结果文件,可以通过命令foamCleanTutorials来实现。若是并行计算的文件夹,此命令也会清除所有的processorN目录。

foamCleanTutorials

若只想清除网格文件,可以在终端输入foamCleanPolyMesh命令。

foamCleanPolyMesh

若只想清除保存的结果文件,可以在终端输入:

foamListTimes -rm

若想要删除并行计算的结果文件,可以在终端输入:

foamListTimes -rm -processor

本篇文章来源于微信公众号: CFD之道

赞(4) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《OpenFOAM|08 第一个case》
文章链接:https://www.topcfd.cn/12102/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册