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
的参数