OpenFOAM程序开发入门(3)

六、OpenFOAM程序开发――求解器的详细分析1

进入icoFoam目录,可以看到
createFields.H icoFoam.C icoFoam.dep Make/
Make/为wmake编译所需的文件
icoFoam.C为主程序文件,它包含createFields.H
编辑icoFoam.C,可以看到icoFoam.C首先引入的头文件为fvCFD.H
所以你可以看到,在编译选项options中

EXE_INC = \
    -I$(LIB_SRC)/finiteVolume/lnInclude  //fvCFD.H的存放目录
EXE_LIBS = \
    -lfiniteVolume                  //需要链接的库

找到fvCFD.H,编辑,可以看出这些是主程序必须的类库

#ifndef fvCFD_H
#define fvCFD_H

#include "parRun.H"

#include "Time.H"              //时间类
#include "fvMesh.H"            //网格类
#include "fvc.H"                //fvc类
#include "fvMatrices.H"          //fvMatrix类
#include "fvm.H"                //fvm类
#include "linear.H"
#include "calculatedFvPatchFields.H"
#include "fixedValueFvPatchFields.H"
#include "adjustPhi.H"
#include "findRefCell.H"
#include "mathematicalConstants.H"

#include "OSspecific.H"
#include "argList.H"

#ifndef namespaceFoam
#define namespaceFoam
    using namespace Foam;
#endif

#endif

再看看icoFoam的程序体,了解一下求解程序的结构

#include "fvCFD.H"       // ――――――――――――――――(头文件)
                        //通常位于main函数前,是程序所需的类的定义
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
{
                          //―――――――――――――――(包含文件)
#  include "setRootCase.H"  
#  include "createTime.H"
#  include "createMesh.H"
//―――――――――――包含文件通常是程序片断,如创建时间、创建网格等
//―――――――――――――――(求解器代码)――――――
#  include "createFields.H"          
//需要根据应用,单独写的代码,如"createFields.H"和Main,以及Ueqn,pEqn等
#  include "initContinuityErrs.H"                       
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
......
}

七、OpenFOAM程序开发――求解器的详细分析2

1、场变量的定义

引用前面的温度场

    Info<< "Reading field T\n" << endl;
    volScalarField T
    (
        IOobject
        (
            "T",
            runTime.timeName(),
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        mesh
    );

又或者

volScalarField CO2
(
     IOobject
    (
        "CO2",
        runTime.timeName(),
        mesh,
        IOobject::READ_IF_PRESENT,
        IOobject::AUTO_WRITE
    ),
    mesh,
// Optional declaration, this can be done by accessing a file in "case/0/",量纲可在文件中读
// dimensionedScalar("zero", dimensionSet(1,-1,-3,0,0,0,0), value)
);
2、场变量的使用

场变量有定义在内部cell上的值,也有边界上的值
例如给组分限值

//Example of a mass fraction limiter used in this project:
// Initialize the variable Y_i for use in a loop
scalarField& CO2Internal = CO2.internalField();  引用内部点

// Loop for all mesh points  遍历内部点
forAll(CO2, celli)
{
// Limits the mass fraction to a positive number
if (CO2Internal[celli] < 0.0)
{
CO2Internal[celli] = 0.0;
}
// Limits the mass fraction to max 1.0
if (CO2Internal[celli] > 1.0)
{
CO2Internal[celli] = 1.0;
}
}
3、定义输运方程

OpenFOAM 定义方程时要选择一种类型的fvMatrix,有fvScalarMatrix和fvVectorMatrix
离散格式在case/system/fvSchemes.中设定

// Define a ScalarMatrix as a object
fvScalarMatrix CO2Eqn //定义系数矩阵
(
fvm::div(phi, CO2)            //对流项离散fvm::div
- fvm::laplacian(turbulence->nuEff(),CO2)  //扩散项离散fvm::div
== S_CO2                            //源项 
);
// Apply underrelaxation to the equation
// Under relaxation factors defined in file: fvSolution
CO2Eqn.relax();  //松弛
CO2Eqn.solve();  //求解

你可能感兴趣的:(OpenFOAM程序开发入门(3))