1、OpenFOAM的程序开发初步共21页OpenFOAM的程序开发初步(chb)一.OpenFOAM应用(yngyng)的类型:使用OpenFOAM进行CAE模拟的,大致可分为(fn wi)三种类型:1)直接利用OpenFOAM的标准的求解器进行模拟,把OpenFOAM替代商业软件来使用,OpenFOAM已基本具有(jyu)这样的功能和人气,与Fuent,Star-CD等相比较,OpenFOAM显然具有更高的求解效率和灵活性。2)用户自定义求解器,即利用OpenFOAM的基本类库,如finiteVolume,OpenFOAM库来按照自己的求解流程来编写针对某类应用的求 解器。用户需要开发的求解器
2、就是类似于在OpenFOAM的applications中所看到的标准求解器icoFOAM,simpleFOAM等。显然 这一需求是非常大的,从OpenFOAM问世以来,已有很多用户定义了自己的求解器。这类需求的特点是,并不需要特别关心,离散和求解的最底层的知识,如 时间项离散,空间项离散等,关注的重点是求解的步骤或者流程。在编程中,通常是顶层的求解流程的开发,在多数情况下可以不编译OpenFOAM的 finiteVolume和OpenFOAM库。这种顶层的求解器的开发,是我们以前常常忽略的,或者是以前没有能力做到的。需要指出的是,商业软件中的 所谓udf,user subroutine和这是不
3、可相比的。3)用户自己定义离散方法等。对于研究离散格式、代数求解器等人来说,更关注时间项ddt,扩散项Laplacian,对流项div是如何离散的,能否有 更高效更高精度的离散方法,这需要修改finiteVolume库和OpenFOAM库中对应的代码。尤其是对流项,尽管OpenFOAM已经提供了基于 NVD和TVD的模板和40多种有名的高阶高精度格式,但可以预见,这仍然是不够的,毕竟对流项的离散仍然是目前CFD的重点研究方向。可以肯定的是,目前(mqin)有很多人关注类型2的应用,毕竟将OpenFOAM当成Fluent或Star-CCM来使用(shyng),并不见得方便。但是将OpenFOAM
4、作为类库来构建自己的求解器,这是其它软件无法实现的OpenFOAM的程序开发初步(chb)二OpenFOAM程序开发的基本知识2.1OpenFOAM的基本(jbn)术语重要的环境变量:$WM_PROJECT_USER_DIR OpenFOAM的用户目录$FOAM_TUTORIALS -OpenFOAM的算例目录$ FOAM _SRC -OpenFOAM库的源程序目录$ FOAM_APP - OpenFOAM的求解器目录$ FOAM_APPBIN - OpenFOAM的求解器执行文件目录$ FOAM_RUN -用户的算例目录重要的shell:run cd to $FOAM_RUNsrc = cd
5、 to $FOAM_SRCapp = cd to $FOAM_APPutil = cd to $FOAM_APP/utilitiessol = cd to $FOAM_APP/solverstut = cd to $FOAM_TUTORIALS求解(qi ji)器的基本文件结构appName 包含求解(qi ji)器源代码的目录+appName.C 求解(qi ji)器主程序 CreateFields.H 场变量(binling)的声明和初始化 +Make/ 编译指令+files 编译需要的源程序文件和生成的目标文件+options 编译选项,如链接库等appName/appName.C是求解
6、器的主程序appName/createFields.H声明变量,并从文件中读入初值,如p,物性。appName/Make/files 所有源程序的名称,一个文件一行,最后一行是目标代码的名称和存放位置,EXE=$(FOAM_USER_APPBIN)/appNameappName/Make/options设定查找头文件和库的路径,EXE_INCS,和需要链接的库EXE_LIBS算例的基本文件(wnjin)结构case/ 算例目录(ml)+0/ 包含(bohn)初始和边界条件+constant/ 包含初次读入后,不随时间变化(binhu)的数据+polyMesh/ 包含多面体网格数据+transp
7、ortProperties/ 包含物性数据 +system/ 包含计算控制和离散格式设定+controlDict 包含计算控制,如时间步长等+fvSchemes 包含离散格式设定+fvSolutions 包含代数求解器或SIMPLE,PISO算法设定具体而言case/0 每个需求解的变量需要一个文件设定其初始边界条件case/constant/polyMesh 网格数据,如owner neighbour points faces boundarycase/system/transportProperties 物性数据case/system/controlDict 设定起始终止时间,时间步长,输
8、出控制case/system/fvSchemes 设定程序用到的每个微分算子的离散格式case/system/fvSolution 为每个变量选择代数方程求解器/收敛精度及PISO等算法设定三OpenFOAM程序开发的理论知识作求解开发,必须(bx)能写出需要求解的控制方程及其定解条件,并且对于如何求解方程或方程组的步骤已经明确。这些流体力学(l xu)、传热学以及相关的理论是必需的,所谓连续介质力学中的数学模型,控制方程和定解条件(tiojin)就是(jish)表示它的语言。在这里是不可能说清楚的,这要看个人的功底了。四 .OpenFOAM程序开发的最简单的例子下面采用OpenFOAM来开发
9、一个用户自己的求解器。主要是利用OpenFOAM的标准求解器icoFoam,用户不需要写任何代码,只为为了熟悉OpenFOAM程序开发的环境和步骤。步骤:1) 将icoFoam目录拷贝到新的目录可采用下面的Linux的命令实现:到OpenFOAM的incompressible目录cd applications/incompressiblecp r icoFoam myicoFoam以上只是复制目录icoFoam到新的位置,并且新目录名为myicoFoamcd myicoFoam进入新的目录,查看一下,可以看到里面的文件和icoFoam中是否一样2) 原文件改名,并且(bngqi)删除依赖文件将
10、icoFoam.C改名myicoFoam.Cmv icoFoam.C myicoFoam.C删除依赖(yli)文件rm icoFoam.dep3) 修改编译(biny)文件files和options进入Make目录(ml),打开files文件 将icoFoam.C 源程序文件名EXE = $(FOAM_APPBIN)/icoFoam 可执行文件名修改为myicoFoam.C 源程序文件名EXE = $(FOAM_APPBIN)/myicoFoam 可执行文件名此例中options不需修改,可以打开看看EXE_INC = 头文件包含 -I$(LIB_SRC)/finiteVolume/lnInc
11、ludeEXE_LIBS = 链接库-lfiniteVolume4)删除原来的obj文件 rm rf linuxGccDPOptcd .5)编译(biny) wmake6) 检验(jinyn)一下 到tutorial目录(ml),检验一下 myicoFoam . cavity六.OpenFOAM程序开发例子(l zi)一:在icoFoam中加入温度场求解准备:能量控制方程: dT/dt+div(den*U*T)=div(a gradT)在壁面上给定值条件。需要解决的问题:a)如何创建标量场,Tb) 如何创建物性,ac)如何定义温度方程,并求解d) 如何在算例中设定T和ae)如何设定T的离散格式
12、f)如何设定T的求解器的收敛标准等步骤:1)创建程序需要的新物性和新变量场打开myicoFoam.C可以看到,程序(chngx)开始运行时调用CreateFields.H,创建变量场。打开CreateFields.H,可以看到程序首先(shuxin)从transportProperties文件中读入物性, Info Reading transportPropertiesn endl; IOdictionary transportProperties ( IOobject ( transportProperties, 从字典(zdin)文件transportProperties读入runTime
13、.constant(), /transportProperties文件(wnjin)位于目录runTime.constant()中 mesh, 网格对象 IOobject:MUST_READ, IOobject:NO_WRITE ); 创建了Iodictionary类型对象 transportProperties dimensionedScalar nu /首先读入粘性系数 ( transportProperties.lookup(nu) ); 创建有量纲(lin n)标量nu,nu通过从字典transportProperties查找”nu”来赋值可以加上新方程需要(xyo)的物性 dimen
14、sionedScalar DT /首先(shuxin)读入热扩散率 ( transportProperties.lookup(DT) ); 创建(chungjin)有量纲标量DT,DT通过从字典transportProperties查找”DT”来赋值此外还要从createFields中读入p,U场,我们要加入的新的变量场为温度场T,最快的加入温度场的方法是拷贝p场的代码,修改为 Info Reading field Tn endl; volScalarField T ( IOobject ( T, runTime.timeName(), mesh, IOobject:MUST_READ, IO
15、object:AUTO_WRITE ), mesh );这样,创建(chungjin)了新的vol标量场T,从文件T中读入。对于T的创建具体解释(jish)如下:a)创建(chungjin)了标量场Tb)T通过读(IOobject:MUST_READ)在runTime.timeName()目录下名称为“T”的文件创建,在开始计算(j sun)时,runTime.timeName()是contorlDict中设定的startTime值决定的。c)T将自动写入(IOobject:AUTO_WRITE)计算结果到runTime.timeName()目录中,runTime.timeName()随迭代是
16、变化的,写入控制由contorlDict中设定。d)T是定义在mesh对象上的,这意味着T在内部cell上有值internalField,在边界上还需要边界条件,这与polyMesh/boundary中要一致。2)在求解器中加入新的求解方程 下一步回到myicoFoam.C加入新的微分方程,由于温度场依赖于速度场,可放在PISO循环后面。# include continuityErrs.H U -= rUA*fvc:grad(p); U.correctBoundaryConditions(); / Add the temperature equation fvScalarMatrix Teqn
17、 温度是标量(bioling)方程 ( fvm:ddt(T) + fvm:div(phi, T) 要用到界面(jimin)流量 - fvm:laplacian(DT, T) 扩散(kusn)项 ); TEqn.solve(); 求解(qi ji)3)编译wmake4)在算例中加入新方程的初始和边界条件4.1拷贝一个cavity算例到mycavity4.2修改transportProperties字典文件,设定DTcd constant修改transportProperties文件,前面已提到DT要从该字典文件读入。设定DT=0.002m2/sDT DT 0 2 -1 0 0 0 0 0.002
18、;4.3修改(xigi)T文件,设定初始值和边界cd 0 进入(jnr)0目录拷贝一个(y )T文件cp p T修改(xigi)T文件为FoamFile version 2.0; format ascii; class volScalarField; object T;/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /dimensions 0 0 0 1 0 0 0;internalField uniform 300; 初始内部点为300 movingWall type fixedValue
19、;value uniform 350.; 边界(binji)为350 fixedWalls type fixedValue;value uniform 300.; 边界(binji)为3005)修改离散格式和代数求解(qi ji)器求解控制文件A进入(jnr)system目录由于温度方程有非稳态项,对流项,扩散项,分别要在ddt,div,laplacian中设置打开fvSchemes文件,添加divSchemes default none; div(phi,U) Gauss upwind; div(phi,T) Gauss upwind;laplacianSchemes default non
20、e; laplacian(nu,U) Gauss linear corrected; laplacian(DT,T) Gauss linear corrected; laplacian(1|A(U),p) Gauss linear corrected;在fvSolution中设置(shzh)代数求解器选项 T PBiCG preconditioner DILU; tolerance 1e-06; relTol 0; ;注意T方程(fngchng)形成的矩阵是非对称的,不要用PCG和DIC6)运行(ynxng)myicoFoam . mycavity七.OpenFOAM程序开发求解(qi ji)
21、器的详细分析1进入icoFoam目录可以看到createFields.H icoFoam.C icoFoam.dep Make/Make/为wmake编译(biny)所需的文件IcoFoam.C为主程序(chngx)文件,它包含createFields.H编辑(binj)icoFoam.C可以(ky)看到icoFoam.C首先引入的头文件为fvCFD.H。所以你可以看到,在编译选项options中EXE_INC = -I$(LIB_SRC)/finiteVolume/lnInclude /fvCFD.H的存放目录EXE_LIBS = -lfiniteVolume /需要链接的库找到fvCFD.
22、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 findRefCel
23、l.H#include mathematicalConstants.H#include OSspecific.H#include argList.H#ifndef namespaceFoam#define namespaceFoam using namespace Foam;#endif#endif再看看icoFoam的程序体,了解一下(yxi)求解程序的结构#include fvCFD.H (头文件) 通常位于(wiy)main函数前,是程序所需的类的定义/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
24、 * * * /int main(int argc, char *argv) (包含(bohn)文件)# include setRootCase.H # include createTime.H# include createMesh.H包含文件通常(tngchng)是程序片断,如创建时间、创建网格等(求解(qi ji)器代码)# include createFields.H 需要根据应用,单独写的代码(di m),如createFields.H和Main,以及Ueqn,pEqn等 # include initContinuityErrs.H / * * * * * * * * * * * *
25、 * * * * * * * * * * * * * * * * * * * * * * * * * /。八.OpenFOAM程序开发求解(qi ji)器的详细分析2a.场变量(binling)的定义引用(ynyng)前面的温度场 Info Reading field Tn endl; volScalarField T ( IOobject ( T, runTime.timeName(), mesh, IOobject:MUST_READ, IOobject:AUTO_WRITE ), mesh );例如(lr)volScalarField CO2(IOobject(CO2,runTime.t
26、imeName(),mesh,IOobject:READ_IF_PRESENT,IOobject:AUTO_WRITE),mesh,/ Optional declaration, this can be done by accessing a file in case/0/,量纲(lin n)可在文件中读/ dimensionedScalar(zero, dimensionSet(1,-1,-3,0,0,0,0), value);b.场变量(binling)的使用场变量有定义(dngy)在内部cell上的值,也有边界上的值例如(lr)给组分限值Example of a mass fractio
27、n limiter used in this project:/ Initialize the variable Y_i for use in a loopscalarField& CO2Internal = CO2.internalField(); 引用内部点/ Loop for all mesh points 遍历内部点forAll(CO2, celli)/ Limits the mass fraction to a positive numberif (CO2Internalcelli 1.0)CO2Internalcelli = 1.0;c.定义(dngy)输运方程OpenFOAM 定
28、义方程(fngchng)时要选择一种类型的fvMatrix,有fvScalarMatrix和fvVectorMatrix离散(lsn)格式在case/system/fvSchemes.中设定/ Define a ScalarMatrix as a objectfvScalarMatrix CO2Eqn 定义(dngy)系数矩阵(fvm:div(phi, CO2) 对流项离散fvm:div- fvm:laplacian(turbulence-nuEff(),CO2) 扩散项离散fvm:div= S_CO2 源项);/ Apply underrelaxation to the equation/
29、Under relaxation factors defined in file: fvSolutionCO2Eqn.relax(); 松弛(sn ch)CO2Eqn.solve(); 求解(qi ji)内容摘要(1)OpenFOAM的程序开发初步一.OpenFOAM应用的类型:使用OpenFOAM进行CAE模拟的,大致可分为三种类型:1)直接利用OpenFOAM的标准的求解器进行模拟,把OpenFOAM替代商业软件来使用,OpenFOAM已基本具有这样的功能和人气,与Fuent,Star-CD等相比较,OpenFOAM显然具有更高的求解效率和灵活性(2)c)T将自动写入(IOobject:AU
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1