icoFoam中createFields.H文件解读

createFields.H

icoFoam中的 createFields.H 用于创建场对象并进行读取,主要涉及到算例文件夹下的速度场、压力场、温度场等的计算以及部分物性参数的调用。现整理如下:

//-屏幕提示。Info 等价于 C++中std::cout,Info间接调用cout
Info<< "Reading transportProperties\n" << endl; 
//IOdictionary 为创建字典文件,用户可以在transportProperties中读取参数
IOdictionary transportProperties 
(
IOobject  //OpenFOAM采用IOobject定义输入输出类,但凡定义的场大多需要采用此类定义
    (
        "transportProperties",    //变量名称,必须用“”进行声明,否则系统会报错
        runTime.constant(),    //该文件存储于case 文件夹下的constant中
        mesh,                //主要用于对象注册,根据runTime把该数据写入到网格中
        IOobject::MUST_READ_IF_MODIFIED,   //有修改则重新读取
        IOobject::NO_WRITE                 //不需要输出(字典文件不需要进行输出) 
    )
);                     
dimensionedScalar nu     //读取有量纲粘性系数
(
    "nu",              //进行声明
    dimViscosity,
    transportProperties.lookup("nu") //在transportProperties文件下查找关键字(nu)进行读取
);

Info<< "Reading field p\n" << endl;
volScalarField p    //体积标量场函数 压力p         
(
    IOobject      
    (
        "p",                     //压力场初始文件名称。
        runTime.timeName(),      //存储于run 文件夹下的时间文件夹内,由case文件system/controlDict中的startTime控制
        mesh,                    //主要用于对象注册,由runTime.write()控制输出
        IOobject::MUST_READ,     //该对象由文件读出创建,必须进行读取
        IOobject::AUTO_WRITE     //自动输出压力场
    ),
mesh         //压力场所用的网格对象,在createMesh.H创建
             //在需要读取的场可以写mesh,需要计算的场则可以改写为,例如:alpha1*rho
);


Info<< "Reading field U\n" << endl;//显示读取速度场
volVectorField U                   //体积矢量场函数 速度U
(
    IOobject
    (
        "U",
        runTime.timeName(),
        mesh,
        IOobject::MUST_READ,
        IOobject::AUTO_WRITE
    ),
    mesh
);


#include "createPhi.H"   //调用 "createPhi.H"文件                 

label pRefCell = 0;      //参考网格
scalar pRefValue = 0.0;   //压力参考值
//通过查询 system/fvSolution 下的 PISO 进行更新压力参考 cell 更新并设定参考值
setRefCell(p, mesh.solutionDict().subDict("PISO"), pRefCell, pRefValue);
mesh.setFluxRequired(p.name());

下面是对"createPhi.H"的补充:

"createPhi.H"  
Info<< "Reading/calculating face flux field phi\n" << endl;//显示读取表面通量场
//表面场,phi,界面流率,存储在体之间的交接面上
//直接计算,因为他们存储在不同地方,大小不同。
//将体积场转化为表面场(运用fvc::interpolate())
//表面场转化为体积场(运用fvc::reconstruct())

surfaceScalarField phi
(
    IOobject
    (
        "phi",
        runTime.timeName(),
        mesh,
        IOobject::READ_IF_PRESENT, //如果存在则进行读取
        IOobject::AUTO_WRITE
    ),
    fvc::flux(U)  // 通量的值, 该句等同于fvc::interpolate(U) & mesh.Sf()
);

本文内容参考了苏老师的博客

几点说明:
1.IOobject类定义可以参考xxyhjy的博文以及官方网址
2.objectRegistry是一个层次数据库,OpenFOAM使用它来组织与模型相关的数据,主要作用是简化求解器与其数据之间的通讯过程。将之按照某种离散方式进行读写。
3.我们可以发现在创建压力场和速度场时mesh出现了两次,这里涉及到注册机制问题,其中第一个mesh是IOobject对象的参数,第二个mesh是p作为一个volScalarField的参数

你可能感兴趣的:(icoFoam)