修改OpenFOAM中的pisoFoam使其按照最大库朗数修改最小时间步

前言

在学习OpenFOAM中的LES模拟时,发现一开始的库朗数会比较大,我不得不将时间步调到1e-7秒。但当时间推进到1000步左右时,库朗数就降到0.2左右了(以我自己的算例来举例)。如果仍是以这样的时间步计算到最后,以来增加了计算的时间,二来库朗数太小又会影响计算结果(曾算过负的阻力系数)。因此,在计算的过程中将库朗数维持在某个值就显得尤为重要。要在OpenFOAM上实现这一功能,需要将solver(求解器)进行小改并重新编译。本文以pisoFoam为例将这一实现过程进行展示。

网上能搜到关于这方面的内容主要来自苏军伟博主的一篇博文如何使得OpenFOAM的solver自动调节时间步长。但是,按照他的方法,编译会不通过。然后我在外网的另一篇更早的博文Run a Case with Variable Time Step in OpenFOAM。内容几乎一致,应该是苏教授翻译过来的。在其下的评论中我索引到cfdonline,有人也发出了编译错误的帖子:
Variable time steps sonicfoam error。回复中提到了解决的办法。以下将整一过程完整展示。

修改pisoFoam并编译

我们将OpenFOAM文件夹里面的pisoFoam这一求解器的编译文件整个拷贝出来。位置在OpenFOAM-x/applications/solver/incompressible/pisoFoam。拷贝到任意位置,文件有这些:
atpisoFoam
注意这里我先把原来pisoFoam.C重命名成atpisoFoam.C,名字随意起,只要跟原来的求解器区分开。
打开Make/file,将pisoFoam改成atpisoFoam,这就是计算时用到的指令。
在这里插入图片描述
修改完之后我们打开atpisoFoam.C,将黄色的代码复制到指定的位置:
#include “fvCFD.H”
#include “singlePhaseTransportModel.H”
#include “turbulentTransportModel.H”
#include “pisoControl.H”
#include “fvOptions.H”
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
{
#include “postProcess.H”
#include “setRootCaseLists.H”
#include “createTime.H”
#include “createMesh.H”
#include “createControl.H”
#include “createFields.H”
#include “initContinuityErrs.H”
//声明动态设定步长相关参数
#include “createTimeControls.H”
//读入动态设定步长相关参数
#include "readTimeControls.H"

turbulence->validate()
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Info<< “\\nStarting time loop\\n” << endl;
while (runTime.run())//这里将runTime.loop()改成runTime.run()
{
Info<< “Time = " << runTime.timeName() << nl << endl;
#include “CourantNo.H”
#include “setDeltaT.H”
runTime++;
Info<< "Time = " << runTime.timeName() << nl << endl;

// Pressure-velocity PISO corrector
{
#include “UEqn.H”
// — PISO loop
while (piso.correct())
{
#include “pEqn.H”
}
}
laminarTransport.correct();
turbulence->correct();
runTime.write();
Info<< “ExecutionTime = " << runTime.elapsedCpuTime() << " s”
<< " ClockTime = " << runTime.elapsedClockTime() << " s”
<< nl << endl;
}
Info<< “End\\n” << endl;
return 0;
}
在当前文件夹位置打开终端,输入wmake进行编译。

修改controlDict文件

打开算例中的system/controlDict文件,在functions前添加以下几行:

adjustTimeStep yes;   //想变成静态步长,no即可
maxCo          1;  //如果Co 数大于 0.5则减小步长
maxDeltaT     1e-5;   //最大时间步长

这里maxCo就是最大库朗数,如果库朗数大于所设定的值,那么时间步就会相应减小;反之如果库朗数小于这个值,时间步将增大,使得每次计算的库朗数在这个值上下浮动。

实际效果

在这里插入图片描述
如图,算例原本设置的时间步长为1e-7,经过一定时间的计算,时间步长也在不断调整,图中所示时间步已增加到9.5e-7,接近1e-6,即原来的10倍。这样设置之后,省去了人工重复修改时间步长的功夫,加快了计算过程,提高效率。

注意:

  1. 如果改用其他版本的OpenFOAM,要重新再编译一次。
  2. 输出文件时,我们希望它对应的流场时间是整数(如0.01,0.5等等),而不是0.13562之类的。这时我们只需要将controlDict的writeControl的设置改成adjustableRunTime即可。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片