|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本文谈谈OpenFOAM中不可压缩湍流流动大涡求解器oodles,这也许和研究湍流的同志们课题更紧密一些。闲言少叙。 OpenFOAM中湍流模型架构相似,所以大涡求解器和RAS求解器具有很大的相似之处,本文在介绍oodles时候和RAS求解器turbFoam进行比较。如果大家该求解器不熟悉请参看本站博文“OpenFOAM中的不可压缩湍流流动求解器turbFoam的说明”。
(1)求解器位置:applications\solvers\incompressible\oodles
(2)求解器文件夹结构
|-Make
| |-options
| |-files
|-createFields.H
|-oodles.C
(3)求解器功能
任意不可压缩湍流流动,湍流模拟大涡模拟(LES)
(4)文件说明
1.options //编译选项,用于指定编译用到的头文件位置及其动态库
//文件内容
#用到的头文件文件夹
EXE_INC = \
#大涡湍流模型头文件
-I$(LIB_SRC)/turbulenceModels/LES \
#大涡delta函数头文件
-I$(LIB_SRC)/turbulenceModels/LES/LESdeltas/lnInclude \
#传输模型头文件,牛顿流体或者非牛顿流体选择。
-I$(LIB_SRC)/transportModels \
#有限容积方法头文件
-I$(LIB_SRC)/finiteVolume/lnInclude
#网格工具头文件
-I$(LIB_SRC)/meshTools/lnInclude \
#取样头文件,比如从场中取出模型符合一定条件的点
-I$(LIB_SRC)/sampling/lnInclude
#用到的动态连接库
EXE_LIBS = \
#不可压缩雷诺时均模型库
-lincompressibleLESModels \
#不可压缩传输模型库(牛顿流体传输模型和非牛顿流体传输模型)
-lincompressibleTransportModels \
#有限容积库
-lfiniteVolume \
#网格相关工具库
-lmeshTools
从上面的options可以看出,oodles和turbFoam的编译选项仅仅差别在湍流模型的选择上。
2.files //用于指定当前要编译的文件,这里不包含头文件,都是*.C文件。
//文件内容
oodles.C //主文件
//编译后求解器的名字和存放位置
EXE = $(FOAM_APPBIN)/oodles
3.createFields.H
createFields.H中oodles求解器和turbFoam几乎完全相同。差别在湍流模型的创建上。turbFoam创建了RAS模型。
autoPtr<incompressible::RASModel> turbulence
(
incompressible::RASModel::New(U, phi, laminarTransport)
);
而oodles创建了大涡模型
autoPtr<incompressible::RASModel> turbulence
(
incompressible::RASModel::New(U, phi, laminarTransport)
);
autoPtr后面会有专门博文介绍这个只能指针,当前你就看成普通指针吧。 createFields.H其他代码说明,请参看本站博文“OpenFOAM中的不可压缩湍流流动求解器turbFoam的说明”。
4.oodles.C
//有限容积离散相关文件
#include "fvCFD.H"
//单相传输模型。
#include "incompressible/singlePhaseTransportModel/singlePhaseTransportModel.H"
//牛顿非牛顿传输
#include "incompressible/transportModel/transportModel.H"
//大涡模型库
#include "incompressible/LESModel/LESModel.H"
//文件输入流
#include "IFstream.H"
//文件输出流
#include "OFstream.H"
//随机数发生器
#include "Random.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//主程序入口
int main(int argc, char *argv[])
{
//设置根目录
#include "setRootCase.H"
//创建时间对象runTime
#include "createTime.H"
//创建网格
#include "createMeshNoClear.H"
//前面刚谈到的那个文件
#include "createFields.H"
//连续性误差
#include "initContinuityErrs.H"
Info<< "\nStarting time loop\n" << endl;
//主流程和turbFoam大部分一样,不再累述。具体参看本站博文“OpenFOAM中的不可压缩湍流流动求解器turbFoam的说明”,下面主要针对差异的地方说明。
for (runTime++; !runTime.end(); runTime++)
{
Info<< "Time = " << runTime.timeName() << nl << endl;
#include "readPISOControls.H"
#include "CourantNo.H"
//turbFoam的correct在后面,大涡在前面,我感觉无所谓了
//就是时候在第一次动量预测的时候考虑湍流模型。
sgsModel->correct();
fvVectorMatrix UEqn
(
fvm::ddt(U)
+ fvm::div(phi, U)
//亚格子模型,包括分子扩散项和亚格子应力项的偏分量。
+ sgsModel->divDevBeff(U)
);
//如果动量预测,则求解动量方程。
if (momentumPredictor)
{
solve(UEqn == -fvc::grad(p));
}
// --- PISO loop
for (int corr=0; corr<nCorr; corr++)
{
volScalarField rUA = 1.0/UEqn.A();
U = rUA*UEqn.H();
phi = (fvc::interpolate(U) & mesh.Sf())
+ fvc::ddtPhiCorr(rUA, U, phi);
adjustPhi(phi, U, p);
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
{
fvScalarMatrix pEqn
(
fvm::laplacian(rUA, p) == fvc::div(phi)
);
pEqn.setReference(pRefCell, pRefValue);
//下面也是和TurbFoam不同的地方,在非正交修正循环过程中,前面循环运用的是fvSolutions中p所指示的求解器,而最后一次迭代采用的是pFinal开头的求解器,我看了他们给出的算例,上面这两个求解器本身一样,差别在于残差不一样,pFinal中的残差较小。这可能是开发者为了降低其计算量吧。
//除了下面的压力求解器选择和上面的亚格子模型选择不同外,oodles和turbFoam没有其他差别,剩下代码说明,参看“OpenFOAM中的不可压缩湍流流动求解器turbFoam的说明”,不再累述。
if (corr == nCorr-1 && nonOrth == nNonOrthCorr)
{
pEqn.solve(mesh.solver(p.name() + "Final"));
}
else
{
pEqn.solve(mesh.solver(p.name()));
}
if (nonOrth == nNonOrthCorr)
{
phi -= pEqn.flux();
}
}
#include "continuityErrs.H"
U -= rUA*fvc::grad(p);
U.correctBoundaryConditions();
}
runTime.write();
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl;
}
Info<< "End\n" << endl;
return(0);
}
(5)编译求解器
打开控制台,进入求解器文件夹,输入wmake
如果是想将前面的编译结构清除掉,输入wclean
转自OpenFOAM研究:http://blog.sina.com.cn/openfoamresearch |
|