Warning: file(datafile/online) [function.file]: failed to open stream: No such file or directory in /home/all2one/public_html/bbs/topic.php on line 200
阳光精品论坛 > 『 CFD 专栏 』 > OpenFOAM的程序开发
一.OpenFOAM应用的类型: 使用OpenFOAM进行CAE模拟的,大致可分为三种类型: 1)直接利用OpenFOAM的标准的求解器进行模拟,把OpenFOAM替代商业软件来使用,OpenFOAM已基本具有这样的功能和人气,与Fuent,Star-CD等相比较,OpenFOAM显然具有更高的求解效率和灵活性。 2)用户自定义求解器,即利用OpenFOAM的基本类库,如finiteVolume,OpenFOAM库来按照自己的求解流程来编写针对某类应用的求解器。用户需要开发的求解器就是类似于在OpenFOAM的applications中所看到的标准求解器icoFOAM,simpleFOAM等。显然这一需求是非常大的,从OpenFOAM问世以来,已有很多用户定义了自己的求解器。这类需求的特点是,并不需要特别关心,离散和求解的最底层的知识,如时间项离散,空间项离散等,关注的重点是求解的步骤或者流程。在编程中,通常是顶层的求解流程的开发,在多数情况下可以不编译OpenFOAM的finiteVolume和OpenFOAM库。这种顶层的求解器的开发,是我们以前常常忽略的,或者是以前没有能力做到的。需要指出的是,商业软件中的所谓udf,user subroutine和这是不可相比的。 3)用户自己定义离散方法等。对于研究离散格式、代数求解器等人来说,更关注时间项ddt,扩散项Laplacian,对流项div是如何离散的,能否有更高效更高精度的离散方法,这需要修改finiteVolume库和OpenFOAM库中对应的代码。尤其是对流项,尽管OpenFOAM已经提供了基于NVD和TVD的模板和40多种有名的高阶高精度格式,但可以预见,这仍然是不够的,毕竟对流项的离散仍然是目前CFD的重点研究方向。 可以肯定的是,目前有很多人关注类型2的应用,毕竟将OpenFOAM当成Fluent或Star-CCM来使用,并不见得方便。但是将OpenFOAM作为类库来构建自己的求解器,这是其它软件无法实现的。 二.OpenFOAM程序开发的基本知识 2.1OpenFOAM的基本术语 重要的环境变量: $WM_PROJECT_USER_DIR ―― OpenFOAM的用户目录 $FOAM_TUTORIALS ------OpenFOAM的算例目录 $ FOAM _SRC ------OpenFOAM库的源程序目录 $ FOAM_APP ------ OpenFOAM的求解器目录 $ FOAM_APPBIN ------- OpenFOAM的求解器执行文件目录 $ FOAM_RUN ------用户的算例目录 重要的shell: run = cd to $FOAM_RUN src = cd to $FOAM_SRC app = cd to $FOAM_APP util = cd to $FOAM_APP/utilities sol = cd to $FOAM_APP/solvers tut = cd to $FOAM_TUTORIALS
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 Tn" << 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(); 求解。