在这不在累述。需要附加说明的是边界条件类:边界条件在OpenFOAM被定义作为场的一个完整部分而不是场上额外附加的。在fvMatrix类中并入了patch用来定义区域的外部边界。每一个patch有一个边界条件,再由fvm用合适的方式进行操作处理。patch有多种类型:calculated,fixed value, fixed gradient, zero gradient, symmetry, cyclic等。这些类型都继承于基类patchField。 在求解之前,需要对偏微分方程组进行离散,转化为线性方程组[A][x]=[b]的形式。其中[x]就是我们所要求的量,他也就是咱们前面介绍的GeometricField类,而[A]代数方程的系数,他就是我们下面所要提到的fvMatrix类。对于偏微分方程的每一项,OpenFOAM应用两个类来离散:finiteVolumeMethod和finiteVolumeCalculus,分别用typedef声明为fvm和fvc. fvm是计算隐式导数从而返回fvMatrix,而fvc是计算显式导数或者其它隐式计算返回geometricField,该类不存储私有数据,仅是执行操作从一个量map到另外一个量上。对于偏微分方程,其中有很多种导数形式:拉普拉斯、时间导数、二阶时间导数、对流项、散度、梯度、梯度梯度平方、旋度、源等,在OpenFOAM中的表示见下图:
离散化时空之后,就是解方程,其实求解方程的过程主要分成如下几部:1.离散偏微分方程,2.线性化方程组,3.对应不同的倒数格式选择差分格式,4.求解系数矩阵,5.解方程。在这就涉及到了一个重要的部分:矩阵。Matrix是OpenFOAM中的一个模板类,他是一个用来存储及运算标量张量等类型数据的2维矩阵。这个矩阵类有点像数学上的矩阵一样。对于应用于数值求解矩阵,OpenFOAM引入了fvMatrix类,这个就是有限体积(finite volume)矩阵类,他是一个特殊的矩阵类型,应用于求解有限体积标量方程组,该类成员函数可以实现给定相应场的求解、通量的计算、残差的计算和控制、方程松弛因子的实现,方程中心系数(central coefficient, 公共成员函数A())和H操作源(H operation source,成员函数H())的计算、设定计算参考等。在此需要提到的是fvMesh类,该类和GoeMesh类差不多,不同之处在于fvMesh类它包含相应网格信息和拓扑结构的同时,还对网格进行实时更新(动网格的时候)。这些更新包括删除单元体面等,并按要求重新定位并计算新的信息。下面举一些关于fvMatrix应用的例子:(选自icoFoam)
fvVectorMatrix UEqn (
fvm::ddt(U)
+ fvm::div(phi, U) //div,散度是代表某量通过单元体的面积分,此处phi为一个通量场,该场的值被记录在单元体的面上,而U就是由通量所输运的量,而该速度值则被记录在单元体中心点上。
- fvm::laplacian(nu, U)
);//源项可以使显式的,在离散时进入方程的右端,当源项为隐式的时候他进入方程的系数矩阵中。
solve(UEqn == -fvc::grad(p));//关于==,一直有所疑问,听老苏分析挺有道理,最近你看到一篇文章上说==的定义是用来表示数学意义上的方程左右两端的等于,这个运算符为了使其有最低的的运算优先级所以采用了==,而非=,同时也强调了方程两端得等的概念,而非赋值。在OpenFOAM中,对==的操作实际上是形式上的,而非实质上有什么运算,它自动重排方程各项:所有隐式项写进方程矩阵中,而所有显式项则归于方程的b中。 volScalarField rUA = 1.0/UEqn.A(); U = rUA*UEqn.H();
pEqn.setReference(pRefCell, pRefValue); pEqn.solve();
例子中fvVectorMatrix为一向量有限体积矩阵类,OpenFOAM中定义 typedef fvMatrix
fvm::ddt(rho)+fvc::div(phi)
);//此处是一个关于质量守恒方程的求解,对于phi为密度与速度的积,而此时采用fvc即表示速度通量在方程中作为已知量,出现在方程的b项中,它是计算前一时间阶的值。 说了一些常用的类,下面介绍一些比较基础底层的类:IOdictionary,argList,IOobject, IOdictionary类是继承于regIOobject类和dictionary类,其主要作于是读入和写入数据。如读取PISO控制参数,或读入transportProperties参数等等。 它派生出许多类:
1. basicThermo(用于基本热力学参数读取和计算) 2. LESModel(大涡模拟模型控制参数) 3. RASModel (RAS模型控制参数) 4. fvSchemes (离散格式参数) 5. motionSolver (动网格控制参数) 6. radiationModel (辐射模型控制参数) 7. solution (求解方程控制参数) 8. SRFModel (SRF模型控制参数) 9. tolerances (方程残差控制) 10. transportModel (输运模型参数) 见下例:
IOdictionary transportProperties //在transportProperties字典中读入参数 (
IOobject (
\ runTime.constant(), mesh,
IOobject::MUST_READ, IOobject::NO_WRITE ) );
IOobject类:读入写入数据,他与IOdictionary不同之处在于后者是读取一个文件中的一个字典“{}”之内的数据,而IOobject则是读入整个文件,如读入压力场,速度场等,并且有读入写出的控制参数,见上例中的“MUST_READ,NO_WRITE”等等。(老苏博客中有详细介绍,在此不多说了)
argList类:读入外部命令参数的一个类,如在命令窗口键入icoFoam -case
dimensionSet类是对基本类型的单位设定,并检查其正确性。 tmp类是管理临时对象的一个类。
OpenFOAM的程序开发初步
一.OpenFOAM应用的类型:
使用OpenFOAM进行CAE模拟的,大致可分为三种类型:
1)直接利用OpenFOAM的标准的求解器进行模拟,把OpenFOAM替代商业软件来使用,OpenFOAM已基本具有这样的功能和人气,与Fuent,Star-CD等相比较,OpenFOAM显然具有更高的求解效率和灵活性。
2)用户自定义求解器,即利用OpenFOAM的基本类库,如finiteVolume,OpenFOAM库来按照自己的求解流程来编写针对某类应用的求解器。用户需要开发的求解器就是类似于在
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库OpenFOAM常用类的一些总结(2)在线全文阅读。
相关推荐: