|
楼主 |
发表于 2010-1-14 08:13:10
|
显示全部楼层
七.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
a.场变量的定义
引用前面的温度场
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)
);
b.场变量的使用
场变量有定义在内部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;
}
}
c.定义输运方程
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(); 求解 |
|