找回密码
 注册
查看: 3021|回复: 0

[转载]OpenFOAM中不可压缩湍流大涡求解器oodles说明

[复制链接]
发表于 2009-5-6 06:34:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表