OpenFOAM的程序开发初步Word格式文档下载.docx
《OpenFOAM的程序开发初步Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《OpenFOAM的程序开发初步Word格式文档下载.docx(20页珍藏版)》请在冰点文库上搜索。
+appName.C求解器主程序
+CreateFields.H场变量的声明和初始化
+Make/编译指令
+files编译需要的源程序文件和生成的目标文件
+options编译选项,如链接库等
appName/appName.C是求解器的主程序
appName/createFields.H声明变量,并从文件中读入初值,如p,物性。
appName/Make/files所有源程序的名称,一个文件一行,最后一行是目标代码的名称和存放位置,EXE=$(FOAM_USER_APPBIN)/appName
appName/Make/options设定查找头文件和库的路径,EXE_INCS,和需要链接的库EXE_LIBS
算例的基本文件结构
case/算例目录
+0/包含初始和边界条件
+constant/包含初次读入后,不随时间变化的数据
+polyMesh/包含多面体网格数据
+transportProperties/包含物性数据
+system/包含计算控制和离散格式设定
+controlDict包含计算控制,如时间步长等
+fvSchemes包含离散格式设定
+fvSolutions包含代数求解器或SIMPLE,PISO算法设定
具体而言
case/0每个需求解的变量需要一个文件设定其初始边界条件
case/constant/polyMesh网格数据,如ownerneighbourpointsfacesboundary
case/system/transportProperties物性数据
case/system/controlDict设定起始终止时间,时间步长,输出控制
case/system/fvSchemes设定程序用到的每个微分算子的离散格式
case/system/fvSolution为每个变量选择代数方程求解器/收敛精度及PISO等算法设定
三.OpenFOAM程序开发的理论知识
作求解开发,必须能写出需要求解的控制方程及其定解条件,并且对于如何求解方程或方程组的步骤已经明确。
这些流体力学、传热学以及相关的理论是必需的,所谓连续介质力学中的数学模型,控制方程和定解条件就是表示它的语言。
在这里是不可能说清楚的,这要看个人的功底了。
四.OpenFOAM程序开发的最简单的例子
下面采用OpenFOAM来开发一个用户自己的求解器。
主要是利用OpenFOAM的标准求解器icoFoam,用户不需要写任何代码,只为为了熟悉OpenFOAM程序开发的环境和步骤。
步骤:
1)将icoFoam目录拷贝到新的目录
可采用下面的Linux的命令实现:
到OpenFOAM的incompressible目录
cdapplications/incompressible
cp–ricoFoammyicoFoam
以上只是复制目录icoFoam到新的位置,并且新目录名为myicoFoam
cdmyicoFoam
进入新的目录,查看一下,可以看到里面的文件和icoFoam中是否一样
2)原文件改名,并且删除依赖文件
将icoFoam.C改名myicoFoam.C
mvicoFoam.CmyicoFoam.C
删除依赖文件
rmicoFoam.dep
3)修改编译文件files和options
进入Make目录,打开files文件
将
icoFoam.C源程序文件名
EXE=$(FOAM_APPBIN)/icoFoam可执行文件名
修改为
myicoFoam.C源程序文件名
EXE=$(FOAM_APPBIN)/myicoFoam可执行文件名
此例中options不需修改,可以打开看看
EXE_INC=\头文件包含
-I$(LIB_SRC)/finiteVolume/lnInclude
EXE_LIBS=\链接库
-lfiniteVolume
4)删除原来的obj文件
rm–rflinuxGccDPOpt
cd..
5)编译
wmake
6)检验一下
到tutorial目录,检验一下
myicoFoam.cavity
六.OpenFOAM程序开发――例子一:
在icoFoam中加入温度场求解
准备:
能量控制方程:
dT/dt+div(den*U*T)=div(agradT)
在壁面上给定值条件。
需要解决的问题:
a)如何创建标量场,T
b)如何创建物性,a
c)如何定义温度方程,并求解
d)如何在算例中设定T和a
e)如何设定T的离散格式
f)如何设定T的求解器的收敛标准等
1)创建程序需要的新物性和新变量场
打开myicoFoam.C可以看到,程序开始运行时调用CreateFields.H,创建变量场。
打开CreateFields.H,可以看到程序首先从transportProperties文件中读入物性,
Info<
<
"
ReadingtransportProperties\n"
<
endl;
IOdictionarytransportProperties
(
IOobject
(
"
transportProperties"
从字典文件transportProperties读入
runTime.constant(),//transportProperties文件位于目录runTime.constant()中
mesh,网格对象
IOobject:
:
MUST_READ,
NO_WRITE
)
);
创建了Iodictionary类型对象transportProperties
dimensionedScalarnu//首先读入粘性系数
transportProperties.lookup("
nu"
)
);
创建有量纲标量nu,nu通过从字典transportProperties查找”nu”来赋值
可以加上新方程需要的物性
dimensionedScalarDT//首先读入热扩散率
DT"
创建有量纲标量DT,DT通过从字典transportProperties查找”DT”来赋值
此外还要从createFields中读入p,U场,我们要加入的新的变量场为温度场T,最快的加入温度场的方法是拷贝p场的代码,修改为
ReadingfieldT\n"
volScalarFieldT
T"
runTime.timeName(),
mesh,
AUTO_WRITE
),
mesh
这样,创建了新的vol标量场T,从文件T中读入。
对于T的创建具体解释如下:
a)创建了标量场T
b)T通过读(IOobject:
MUST_READ)在runTime.timeName()目录下名称为“T”的文件创建,在开始计算时,runTime.timeName()是contorlDict中设定的startTime值决定的。
c)T将自动写入(IOobject:
AUTO_WRITE)计算结果到runTime.timeName()目录中,runTime.timeName()随迭代是变化的,写入控制由contorlDict中设定。
d)T是定义在mesh对象上的,这意味着T在内部cell上有值internalField,在边界上还需要边界条件,这与polyMesh/boundary中要一致。
2)在求解器中加入新的求解方程
下一步回到myicoFoam.C加入新的微分方程,由于温度场依赖于速度场,可放在PISO循环后面。
#include"
continuityErrs.H"
U-=rUA*fvc:
grad(p);
U.correctBoundaryConditions();
//Addthetemperatureequation
fvScalarMatrixTeqn温度是标量方程
(
fvm:
ddt(T)
+fvm:
div(phi,T)要用到界面流量
-fvm:
laplacian(DT,T)扩散项
);
TEqn.solve();
求解
3)编译
wmake
4)在算例中加入新方程的初始和边界条件
4.1拷贝一个cavity算例到mycavity
4.2修改transportProperties字典文件,设定DT
cdconstant
修改transportProperties文件,前面已提到DT要从该字典文件读入。
设定DT=0.002m2/s
DTDT[02-10000]0.002;
4.3修改T文件,设定初始值和边界
cd0进入0目录
拷贝一个T文件
cppT
修改T文件为
FoamFile
{
version2.0;
formatascii;
classvolScalarField;
objectT;
}
//*************************************//
dimensions[0001000];
internalFielduniform300;
初始内部点为300℃
movingWall
{
typefixedValue;
valueuniform350.;
边界为350℃
}
fixedWalls
valueuniform300.;
边界为300℃
5)修改离散格式和代数求解器求解控制文件
A进入system目录
由于温度方程有非稳态项,对流项,扩散项,分别要在ddt,div,laplacian中设置
打开fvSchemes文件,添加
divSchemes
defaultnone;
div(phi,U)Gaussupwind;
div(phi,T)Gaussupwind;
laplacianSchemes
laplacian(nu,U)Gausslinearcorrected;
laplacian(DT,T)Gausslinearcorrected;
laplacian((1|A(U)),p)Gausslinearcorrected;
在fvSolution中设置代数求解器选项
TPBiCG
preconditionerDILU;
tolerance1e-06;
relTol0;
};
注意T方程形成的矩阵是非对称的,不要用PCG和DIC
6)运行
myicoFoam.mycavity
七.OpenFOAM程序开发――求解器的详细分析1
进入icoFoam目录
可以看到
createFields.HicoFoam.CicoFoam.depMake/
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,编辑,可以看出这些是主程序必须的类库
#ifndeffvCFD_H
#definefvCFD_H
#include"
parRun.H"
Time.H"
时间类
fvMesh.H"
网格类
fvc.H"
fvc类
fvMatrices.H"
fvMatrix类
fvm.H"
fvm类
linear.H"
calculatedFvPatchFields.H"
fixedValueFvPatchFields.H"
adjustPhi.H"
findRefCell.H"
mathematicalConstants.H"
OSspecific.H"
argList.H"
#ifndefnamespaceFoam
#definenamespaceFoam
usingnamespaceFoam;
#endif
再看看icoFoam的程序体,了解一下求解程序的结构
fvCFD.H"
――――――――――――――――(头文件)
通常位于main函数前,是程序所需的类的定义
intmain(intargc,char*argv[])
―――――――――――――――(包含文件)
#include"
setRootCase.H"
createTime.H"
createMesh.H"
―――――――――――包含文件通常是程序片断,如创建时间、创建网格等
―――――――――――――――(求解器代码)――――――
createFields.H"
需要根据应用,单独写的代码,如"
和Main,以及Ueqn,pEqn等
―――――――――――――――――――――――――――――――――――――
initContinuityErrs.H"
。
八.OpenFOAM程序开发――求解器的详细分析2
a.场变量的定义
引用前面的温度场
例如
volScalarFieldCO2
(
IOobject
"
CO2"
runTime.timeName(),
mesh,
IOobject:
READ_IF_PRESENT,
),
//Optionaldeclaration,thiscanbedonebyaccessingafilein"
case/0/"
,量纲可在文件中读
//dimensionedScalar("
zero"
dimensionSet(1,-1,-3,0,0,0,0),value)
b.场变量的使用
场变量有定义在内部cell上的值,也有边界上的值
例如给组分限值
Exampleofamassfractionlimiterusedinthisproject:
//InitializethevariableY_iforuseinaloop
scalarField&
CO2Internal=CO2.internalField();
引用内部点
//Loopforallmeshpoints遍历内部点
forAll(CO2,celli)
//Limitsthemassfractiontoapositivenumber
if(CO2Internal[celli]<
0.0)
CO2Internal[celli]=0.0;
//Limitsthemassfractiontomax1.0
if(CO2Internal[celli]>
1.0)
CO2Intern