首页 OpenFOAM常用类的一些总结

OpenFOAM常用类的一些总结

举报
开通vip

OpenFOAM常用类的一些总结OpenFOAM常用类的一些总结OpenFOAM中有许多类,每个类的功能都很强大,这也使它面向对象设计得以实现。对于程序,最常用到的,也是最底层的就是数据,在OpenFOAM中引入了三类基础数据类型:标量scalar,向量vector,张量tensor.这三个中数据类型,也是FOAM中最基础的三个类。(还有一个比较重要的就是bool和label,前者就是是非型,及对错型,只不过是更扩展一些,后者是标签型数据,相当于c中的整型。关于更多的其它数据类型可以参看目录..\src\OpenFOAM\primitives里面...

OpenFOAM常用类的一些总结
OpenFOAM常用类的一些总结OpenFOAM中有许多类,每个类的功能都很强大,这也使它面向对象 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 得以实现。对于程序,最常用到的,也是最底层的就是数据,在OpenFOAM中引入了三类基础数据类型:标量scalar,向量vector,张量tensor.这三个中数据类型,也是FOAM中最基础的三个类。(还有一个比较重要的就是bool和label,前者就是是非型,及对错型,只不过是更扩展一些,后者是标签型数据,相当于c中的整型。关于更多的其它数据类型可以参看目录..\src\OpenFOAM\primitives里面)在上述数据类的基础上,增加场(field)的概念,就引入了标量场scalarField,向量场vectorField,张量场tensorField。实际上这三个类又是field类的typedef,如typedeffieldvscalar>saclarField。这些场类中都有对应的成员函数进行加减乘除运算,还有复杂的点积叉积等。说到这fieldclass,其实他就像是一个数据存放的区域一样,存放上scalar,那它成了标量场scalarField。这些类中可以有接口实现数据的计算。从field类中又派生出了FieldField类,这个就是说场中场类,其实这个主要用于边界条件类的一个基类。因为边界条件算是网格类场中的一个特殊的场,后面会介绍。比field类高一点的就是几何场类GeometricFieldclass,其相比fieldclass多了纪录场位置的相关信息。说到这里请大家注意他和polyMeshclass的区别,后者只是纪录网格的结构,如点的位置、面的组成、体的组成等等polyMeshclass中对应有pointMesh,surfaceMesh,volMesh等类,从字面上很容易理解其处理和 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 网格点、网格面、网格体等信息。而GeometricField类,其则是记录了在什么样的网格上有量a的相关信息或数据。它包括了内部区域、边界区域(GeometricBoundaryFieldclass)、网格、尺度单位、计算的先前时间阶的值等。在该类中有常用的三种(实际上还有其他的许多,可以参看OpenFOAM网上说明):volScalarField体标量场,volVectorField体向量场,volTensorField体张量场。这里说的场与field有所不同,这里指的是网格区域上所对应的数据信息。上述的vol就是指ployMesh中的volMesh,女口volscalarField类来说:见下例volScalarFieldp(IOobject(runTime.timeName(),mesh,IOobject::MUST_READ,IOobject::AUTO_WRITE),mesh);看过老苏博客的朋友肯定都知道这是什么意思,这是读入标量压力场文件,把压力值存储到网格体中心。为加深对GeometricField类的理解,贴张PG中的图片:gwmHricFi^ld^T/pe.'-geometricBoundaryFiel(Jpe>■rvtJoundary^e&li■“fvPatc^List■fvPatchFielddimernsLOrt«lpo^tFieldUcelistcelfLis-tField*Lab«ILi&tir«rH'■rwlrr■■■r■・!■・・■■■i!ianHM!aaiiuBivrrnrai=b=»fi—rrbftf・wi!・h・:・■・・・ir・as*polyMnh-■paly8ou-ndaryMt5tiFvPatch由m帥引QnSei町Typasc-alargets-pcriyPitcfilistpolyPatchCesiSOrsyenm^tnsor"in昭ThiTsyirsmTenwiThudFiguTel!-5:BiimcstructureloadiihjtngeonictrkFi#ldOpenFOAM中有许多类,每个类的功能都很强大,这也使它面向对象设计得以实现。对于程序,最常用到的,也是最底层的就是数据,在OpenFOAM中引入了三类基础数据类型:标量scalar,向量vector,张量tensor.这三个中数据类型,也是FOAM中最基础的三个类。(还有一个比较重要的就是bool和label,前者就是是非型,及对错型,只不过是更扩展一些,后者是标签型数据,相当于c中的整型。关于更多的其它数据类型可以参看目录..\src\OpenFOAM\primitives里面)在上述数据类的基础上增加场(field的概念,就引入了标量场scalarField,向量场vectorField,张量场tensorField.实际上这三个类又是field类的typedef,如typedeffieldvscalar>saclarField。这些场类中都有对应的成员函数进行加减乘除运算,还有复杂的点积叉积等。说到这fieldclass,其实他就像是一个数据存放的区域一样,存放上scalar,那它成了标量场scalarField。这些类中可以有接口实现数据的计算。从field类中又派生出了FieldField类,这个就是说场中场类,其实这个主要用于边界条件类的一个基类。因为边界条件算是网格类场中的一个特殊的场,后面会介绍。比field类高一点的就是几何场类GeometricFieldclass,其相比fieldclass多了纪录场位置的相关信息。说到这里请大家注意他和polyMeshclass的区别,后者只是纪录网格的结构,如点的位置、面的组成、体的组成等等polyMeshclass中对应有pointMesh,surfaceMesh,volMesh等类,从字面上很容易理解其处理和记录网格点、网格面、网格体等信息。而GeometricField类,其则是记录了在什么样的网格上有量a的相关信息或数据。它包括了内部区域、边界区域(GeometricBoundaryFieldclass)、网格、尺度单位、计算的先前时间阶的值等。在该类中有常用的三种(实际上还有其他的许多,可以参看OpenFOAM网上说明):volScalarField体标量场,volVectorField体向量场,volTensorField体张量场。这里说的场与field有所不同,这里指的是网格区域上所对应的数据信息。上述的vol就是指ployMesh中的volMesh,如volscalarField类来说:见下例volScalarFieldp(IOobject(runTime.timeName(),mesh,IOobject::MUST_READ,IOobject::AUTO_WRITE),mesh);看过老苏博客的朋友肯定都知道这是什么意思,这是读入标量压力场文件,把压力值存储到网格体中心。为加深对GeometricField类的理解,贴张PG中的图片:£ieofTietricFieldcT^pes-iIg€QmetricBound-aryField■fvB-ounda^yK^-esh-*—fvPaichList■fvPaichField■■-|?olyMesh■polyBoundaryM-estiFvPatctipolyPitchListpointFieldUce-List«IIListFieldiprsynnmTsrbsor匸护詛tThirdfiymmTen&orThirdFi辭r与2.5:車山眸C吨目Etr^tur^-ieFi^ld除了体的向量标量张量场外,还有面标量场surfaceScalarField、面向量场surfaceVectorField、面张量场surfaceTensorField。看下面的例子:surfaceScalarFiephi(IOobject("phi",runTime.timeName(),mesh),fvc::interpolate(alpha)*phia+fvc::interpolate(beta)*phib);这里的phi既是一个面向量场对象,他用来是纪录单元体面上流过的通量值除了常用到的标量向量张量的几何场外,还有一些特殊量的场:surfaceSymmTensor面对称张量几何场、体球面张量场等等。几何场里面还有一个比较重要的类就是GeometricBoundaryField,用来专门对边界进行处理的一个类。如果说数据场类是处理数据的基础,那么时间类则是控制计算步进必不可少的一部分。Timeclass在进行瞬态计算,用它跟踪时间阶,并使时间按一定步长或者变步长累加,及输出计算参数,计算时间等。见下例:(相关说明见老苏博客OpenFOAM>>solver>>incompressible>>icoFoam的说明)Info<<"\nStartingtimeloop\n"< 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示见下图:Irrtitdcsmpticin[mjilicit,ExplicitTc^texpresstoufvm::/fuc::functionsLapl賦bnTmp/E邓评学VFieId,volFieIJ-离散化时空之后,就是解方程,其实求解方程的过程主要分成如下几部:1.离散偏微分方程,2•线性化方程组,3•对应不同的倒数格式选择差分格式,4.求解系数矩阵,5•解方程。在这就涉及到了一个重要的部分:矩阵。Matrix是OpenFOAM中的一个模板类,他是一个用来存储及运算标量张量等类型数据的2维矩阵。这个矩阵类有点像数学上的矩阵一样。对于应用于数值求解矩阵,OpenFOAM引入了fvMatrix类,这个就是有限体积(finitevolume)矩阵类,他是一个特殊的矩阵类型,应用于求解有限体积标量方程组,该类成员函数可以实现给定相应场的求解、通量的计算、残差的计算和控制、方程松弛因子的实现,方程中心系数(centralcoefficient,公共成员函数A())和H操作源(Hoperationsource,成员函数H())的计算、设定计算参考等在此需要提到的是fvMesh类,该类和GoeMesh类差不多,不同之处在于fvMesh类它包含相应网格信息和拓扑结构的同时,还对网格进行实时更新(动网格的时候)。这些更新包括删除单元体面等,并按要求重新定位并计算新的信息。下面举一些关于fvMatrix应用的例子:(选自icoFoam)fvVectorMatrixUEqn(fvm::ddt(U)+fvm::div(phi,U)//div,散度是代表某量通过单元体的面积分,此处phi为一个通量场,该场的值被记录在单元体的面上,而U就是由通量所输运的量,而该速度值则被记录在单元体中心点上。-fvm::laplacian(nu,U));//源项可以使显式的,在离散时进入方程的右端,当源项为隐式的时候他进入方程的系数矩阵中。solve(UEqn==-fvc::grad(p));〃关于==,一直有所疑问,听老苏分析挺有道理,最近你看到一篇文章上说==的定义是用来表示数学意义上的方程左右两端的等于,这个运算符为了使其有最低的的运算优先级所以采用了==,而非=,同时也强调了方程两端得等的概念,而非赋值。在OpenFOAM中,对==的操作实际上是形式上的,而非实质上有什么运算,它自动重排方程各项:所有隐式项写进方程矩阵中,而所有显式项则归于方程的b中。volScalarFieldrUA=1.0/UEqn.A();U=rUA*UEqn.H();pEqn.setReference(pRefCell,pRefValue);pEqn.solve();例子中fvVectorMatrix为一向量有限体积矩阵类,OpenFOAM中定义typedeffvMatrixfvVectorMatrix,其他的还有标量、张量等。其他关于上述程序的说明参看老苏博客。再看如下例子:fvMatrixScalarrhoEqfvm::ddt(rho)+fvc::div(phi));〃此处是一个关于质量守恒方程的求解,对于phi为密度与速度的积,而此时采用fvc即表示速度通量在方程中作为已知量,出现在方程的b项中,它是计算前一时间阶的值。说了一些常用的类,下面介绍一些比较基础底层的类:IOdictionary,argList,IOobject,IOdictionary类是继承于regIOobject类和dictionary类,其主要作于是读入和写入数据。如读取PISO控制参数,或读入transportProperties参数等等。它派生出许多类:basicThermo(用于基本热力学参数读取和计算)LESModel(大涡模拟模型控制参数)RASModel(RAS模型控制参数)fvSchemes(离散格式参数)motionSolver(动网格控制参数)radiationModel(辐射模型控制参数)solution(求解方程控制参数)SRFModel(SRF模型控制参数)tolerances(方程残差控制)transportModel(输运模型参数)见下例:IOdictionarytransportProperties//在transportProperties字典中读入参数(IOobject("transportProperties",runTime.constant(),mesh,IOobject::MUST_READ,IOobject::NO_WRITE));IOobject类:读入写入数据,他与IOdictionary不同之处在于后者是读取一个文件中的一个字典“{}”之内的数据,而IOobject则是读入整个文件,如读入压力场,速度场等,并且有读入写出的控制参数,见上例中的“MUST_READ,NO_WRITE”等等。(老苏博客中有详细介绍,在此不多说了)argList类:读入外部命令参数的一个类,如在命令窗口键入icoFoam-case,则对目录dir执行icoFoam计算,其参数有:-case选择一个case目录替代当前工作目录;-parallel指定并行计算参数;-doc显式该程序文档;-srDoc在浏览器里显示该程序的源文件;-help显示改程序的使用方法dimensionSet类是对基本类型的单位设定,并检查其正确性。tmp类是管理临时对象的一个类。OpenFOAM的程序开发初步一.OpenFOAM应用的类型:使用OpenFOAM进行CAE模拟的,大致可分为三种类型:直接利用OpenFOAM的标准的求解器进行模拟,把OpenFOAM替代商业软件来使用,OpenFOAM已基本具有这样的功能和人气,与Fuent,Star-CD等相比较,OpenFOAM显然具有更高的求解效率和灵活性。用户自定义求解器,即利用OpenFOAM的基本类库,如finiteVolume,OpenFOAM库来按照自己的求解流程来编写针对某类应用的求解器。用户需要开发的求解器就是类似于在OpenFOAM的applications中所看到的标准求解器icoFOAM,simpleFOAM等。显然这一需求是非常大的,从OpenFOAM问世以来,已有很多用户定义了自己的求解器。这类需求的特点是,并不需要特别关心,离散和求解的最底层的知识,如时间项离散,空间项离散等,关注的重点是求解的步骤或者流程。在编程中,通常是顶层的求解流程的开发,在多数情况下可以不编译OpenFOAM的finiteVolume和OpenFOAM库。这种顶层的求解器的开发,是我们以前常常忽略的,或者是以前没有能力做到的。需要指出的是,商业软件中的所谓udf,usersubroutine和这是不可相比的。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=cdto$FOAM_RUNsrc=cdto$FOAM_SRCapp=cdto$FOAM_APPutil=cdto$FOAM_APP/utilitiessolcdto$FOAM_APP/solverstutcdto$FOAM_TUTORIALS求解器的基本文件结构appName包含求解器源代码的目录+appName.C求解器主程序+CreateFields.H场变量的声明和初始化+Make/编译指令+files编译需要的源程序文件和生成的目标文件+options编译选项,如链接库等appName/appName.C是求解器的主程序appName/createFields.H声明变量,并从文件中读入初值,如p,物性。appName/Make/files所有源程序的名称,一个文件一行,最后一行是目标代码的名称和存放位置,EXE=$(FOAM_USER_APPBIN)/appNameappName/Make/options设定查找头文件和库的路径,EXE_INCS,和需要链接的库EXE_LIBS算例目录算例的基本文件结构case/+0/包含初始和边界条件+constant/包含初次读入后,不随时间变化的数据+polyMesh/包含多面体网格数据+transportProperties/包含物性数据+system/包含计算控制和离散格式设定+controlDict包含计算控制,如时间步长等+fvSchemes包含离散格式设定+fvSolutions包含代数求解器或SIMPLE,PISO算法设定具体而言case/0每个需求解的变量需要一个文件设定其初始边界条件case/constant/polyMesh网格数据,女口ownerneighbourpointsfacesboundarycase/system/transportProperties物性数据case/system/fvSchemes设定程序用到的每个微分算子的离散格式case/system/fvSolution为每个变量选择代数方程求解器/收敛精度及PISO等算法设定OpenFOAM程序开发的理论知识作求解开发,必须能写出需要求解的控制方程及其定解条件,并且对于如何求解方程或方程组的步骤已经明确。这些流体力学、传热学以及相关的理论是必需的,所谓连续介质力学中的数学模型,控制方程和定解条件就是表示它的语言。在这里是不可能说清楚的,这要看个人的功底了。OpenFOAM程序开发的最简单的例子下面采用OpenFOAM来开发一个用户自己的求解器。主要是利用OpenFOAM的标准求解器icoFoam,用户不需要写任何代码,只为为了熟悉OpenFOAM程序开发的环境和步骤。步骤:将icoFoam目录拷贝到新的目录可采用下面的Linux的命令实现:到OpenFOAM的incompressible目录cdapplications/incompressiblecp-icoFoammyicoFoam以上只是复制目录icoFoam到新的位置,并且新目录名为myicoFoamcdmyicoFoam进入新的目录,查看一下,可以看到里面的文件和icoFoam中是否一样原文件改名,并且删除依赖文件将icoFoam.C改名myicoFoam.CmvicoFoam.CmyicoFoam.C删除依赖文件rmicoFoam.dep修改编译文件files和options进入Make目录,打开files文件,将icoFoam.C源程序文件名EXE=$(FOAM_APPBIN)/icoFoam可执行文件名修改为myicoFoam.C源程序文件名EXE=$(FOAM_APPBIN)/myicoFoam可执行文件名此例中options不需修改,可以打开看看EXE_INC=\头文件包含-l$(LIB_SRC)/finiteVolume/lnlneludeEXE_LIBS=\链接库-IfiniteVolume删除原来的obj文件rm-rflinuxGccDPOptcd..编译wmake检验一下到tutorial目录,检验一下myicoFoam.cavity六.OpenFOAM程序开发例子一:在icoFoam中加入温度场求解准备:能量控制方程:dT/dt+div(den*U*T)=div(agradT)在壁面上给定值条件。需要解决的问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 :如何创建标量场,T如何创建物性,a如何定义温度方程,并求解如何在算例中设定T和a如何设定T的离散格式如何设定T的求解器的收敛标准等步骤:1)创建程序需要的新物性和新变量场打开myicoFoam.C可以看到,程序开始运行时调用CreateFields.H,创建变量场。打开CreateFields.H,可以看到程序首先从transportProperties文件中读入物性,Infovv"ReadingtransportProperties'n"vvendl;lOdictionarytransportProperties(lOobject("transportProperties",从字典文件transportProperties读入runTime.constant(),//transportProperties文件位于目录runTime.constant()中mesh,网格对象IOobject::MUST_READ,IOobject::NO_WRITE));仓【J建了Iodictionary类型对象transportPropertiesdimensionedScalarnu〃首先读入粘性系数(transportProperties」ookup("nu"));创建有量纲标量nu,nu通过从字典transportProperties查找”nu”来赋值可以加上新方程需要的物性dimensionedScalarDT〃首先读入热扩散率(transportProperties」ookup("DT"));创建有量纲标量DT,DT通过从字典transportProperties查找”DT”来赋值此外还要从createFields中读入p,U场,我们要加入的新的变量场为温度场T,最快的加入温度场的方法是拷贝p场的代码,修改为Infovv"ReadingfieldT\n"vvendl;volScalarFieldT(IOobjectrunTime.timeName(),mesh,IOobject::MUST_READ,IOobject::AUTO_WRITE),mesh);这样,创建了新的vol标量场T,从文件T中读入。对于T的创建具体解释如下:创建了标量场TT通过读(IOobject::MUST_READ)在runTime.timeName()目录下名称为“T的文件创建,在开始计算时,runTime.timeName()是contorlDict中设定的startTime值决定的。T将自动写入(IOobject::AUTO_WRITE)计算结果到runTime.timeName()目录中,runTime.timeName()随迭代是变化的,写入控制由contorlDict中设定。T是定义在mesh对象上的,这意味着T在内部cell上有值internalField,在边界上还需要边界条件,这与polyMesh/boundary中要一致。2)在求解器中加入新的求解方程下一步回到myicoFoam.C加入新的微分方程,由于温度场依赖于速度场,可放在PISO循环后面。#include"continuityErrs.H"U-=rUA*fvc::grad(p);U.correctBoundaryConditions();//AddthetemperatureequationfvScalarMatrixTeqn温度是标量方程(fvm::ddt(T)+fvm::div(phi,T)要用到界面流量-fvm::laplacian(DT,T)扩散项求解);TEqn.solve();编译wmake4)在算例中加入新方程的初始和边界条件4.1拷贝一个cavity算例到mycavity修改transportProperties字典文件,设定DTcdconstant修改transportProperties文件,前面已提到DT要从该字典文件读入。设定DT=0.002m2/sDTDT[02-10000]0.002;4.3修改T文件,设定初始值和边界cd0进入0目录拷贝一个T文件cppT修改T文件为FoamFile{version2.0;formatascii;classvolScalarField;objectT;}//*************************************//dimensions[0001000];internalFielduniform300;初始内部点为300°CmovingWall{typefixedValue;valueuniform350.;边界为350CfixedWalls{typefixedValue;valueuniform300.;边界为300°C修改离散格式和代数求解器求解控制文件A进入system目录由于温度方程有非稳态项,对流项,扩散项,分别要在ddt,div,laplacian中设置打开fvSchemes文件,添加divSchemes{defaultnone;div(phi,U)Gaussupwind;div(phi,T)Gaussupwind;}laplacianSchemes{defaultnone;laplacian(nu,U)Gausslinearcorrected;laplacian(DT,T)Gausslinearcorrected;laplacian((1|A(U)),p)Gausslinearcorrected;}在fvSolution中设置代数求解器选项TPBiCG{preconditionerDILU;toleranee1e-06;relTol0;};注意T方程形成的矩阵是非对称的,不要用PCG和DIC运行myicoFoam.mycavity七.OpenFOAM程序开发--求解器的详细分析1进入icoFoam目录可以看到createFields.HicoFoam.CicoFoam.depMake/Make/为wmake编译所需的文件IcoFoam.C为主程序文件,它包含createFields.H编辑icoFoam.C可以看到icoFoam.C首先引入的头文件为fvCFD.H。所以你可以看到,在编译选项options中EXE_INC=\-l$(LIB_SRC)/finiteVolume/lnlnclude//fvCFD.H的存放目录EXE_LIBS=\-lfiniteVolume〃需要链接的库找到fvCFD.H,编辑,可以看出这些是主程序必须的类库#ifndeffvCFD_H#definefvCFD_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"#inelude"mathematicalConstants.H"#include"OSspecific.H"#include"argList.H"#ifndefnamespaceFoam#definenamespaceFoamusingnamespaceFoam;#endif#endif再看看icoFoam的程序体,了解一下求解程序的结构#include"fvCFD.H"(头文件)通常位于main函数前,是程序所需的类的定义//*************************************//intmain(intargc,char*argv[]){(包含文件)include"setRootCase.H"include"createTime.H"include"createMesh.H"包含文件通常是程序片断,如创建时间、创建网格等(求解器代码)include"createFields.H"需要根据应用,单独写的代码,如"createFields.H"和Main,以及Ueqn,pEqn等#include"initContinuityErrs.H"//*************************************//}八.OpenFOAM程序开发一一求解器的详细分析2场变量的定义引用前面的温度场Infovv"ReadingfieldT\n"<1.0){CO2Internal[celli]=1.0;}}定义输运方程OpenFOAM定义方程时要选择一种类型的fvMatrix,有fvScalarMatrix和fvVectorMatrix离散格式在case/system/fvSchemes.中设定//DefineaScalarMatrixasaobjectfvScalarMatrixCO2Eqn定义系数矩阵(fvm::div(phi,CO2)对流项离散fvm::div-fvm::laplacian(turbulence->nuEff(),CO2)扩散项离散fvm::div==S_CO2源项);//Applyunderrelaxationtotheequation//Underrelaxationfactorsdefinedinfile:fvSolutionCO2Eqn.relax();松弛CO2Eqn.solve();求解运用OpenFOAM编译器wmake编译自己的程序本文将OpenFoam的编译系统介绍一下,并给出了如何在OpenFOAM下编译“hellowor程序。OpenFOAM用的编译器是gcc,他并不是直接运用该编译器,而是将该编译器进行了包装,也就是wmake。OpenFOAM中的头文件通常为H结尾,而代码文件是以C为扩展名,应当注意,这里的C为大写的,如果写成小写,wmake会出现编译错误,尽管你编写的代码没有错误。运用wmake编译程序,程序所在的文件夹结构必须为如下形式|—neiuApp|-newApp.C|-citherHeader.H|-Make|-files|-optionsMake所在的文件夹中放有主程序和在主程序用到的所有头文件,这里面的代码文件和头文件名字任意。Make文件夹里面有两个文件files和options,这两个文件的名字不能改变。files文件主要干两件事指定哪些文件需要编译,这里的文件是代码文件,也就是.C文件,而不包括.H文件指定你要编译的类型,是编译成库,还是编译成可执行文件,以及编译成的库文件或者可执行文件的名字。下面是icoFoam的Make文件夹下的files文件的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 icoFoam.CEXE=$(FOAM_APPBIN)/icoFoam要编译的代码文件直接将名字写到里面就行了,如果有多个代码文件,直接一个一个列在上面就行了。下面为编译程序类型EXE=,说明要编译成可执行文件,等号右面为编译后的文件放在什么地方。这一行也可以不写,他会将编译的可执行文件放到当前文件夹,名字为OpenFOAM.out.如果你要编译成库的话请采用”“LIB=…”等号后面放编译的库文件所在的目录,一般编译库文件命名为lib...,这是一个习惯,而非规定。options文件也是干两件事(1)指定编译的头文件所在的目录,如果说所用的头文件在当前文件夹或者标准C++的头文件,无需指定。(2)指定编译当前程序所用到的库。下面为icoFoam下的options文件的内容EXE_INC=\-I$(LIB_SRC)/finiteVolume/lnIncludeEXE_LIBS=\-lfiniteVolumeEXE_INC=用于所运用到的头文件所在的目录,EXE_LIB用来指定所有到的库。注意这里的库为OpenFOAM中的库或者你自己写的库,C++的标准库无需在这添加。因此如果你不使用OpenFOAM中的库,而是自己独立编写C++程序,并且所有的头文件都在当前的根目录,options里无需指定任何东西。下面是一个简单的“Helloworld”c++程序,按照我说的方法试一试?第1步:建立一个目录,用于编译当前的Helloworld程序?下面为当根目录建立一个hello的文件夹,并进入hello文件夹。cd//进入根目录mkdirhello//建立文件夹,名为hellocdhello//进入hello第2步:建立Make文件夹,并进入Make建立files和options文件mkdirMake//建立Make文件夹cdMake//进入Maketouchfiles//创建files文件touchoptions//创建options文件cd..//退出Make文件夹第3步:建立程序文件hello.C,打开hello.C进行编程序touchhello.C//创建hello.Ckatehello.C//打开hello.C输入如下代码#include"iostream"usingnamespacestd;intmain(){cout<<"helloworld"<0时,认为Ax=b收敛。这里的r1为内残差。对于稳态问题:只有当r->0时,才被认为收敛,也就是(x_l-x_0)->0.也就是我们在cfd计算中通常见到的那个残差,fluent及其pyFoam输出残差图就是这个r。R常被作为收敛判据。对于非稳态问题,下一时刻的求解结果用于和当前的求解结果不一样(时变的,也就是非稳态),这时候R并不是很小,对于特定的问题,这个R永远不可能很小(因为是非稳态问题),所以对于非稳态问题外残差R不能作为收敛判据。无论是稳态还是非稳态,都必须是代数方程Ax=b收敛,r1->0时,是必须满足的。但是在稳态计算中,由于某一个迭代的结构没有意义,这时候为了减少计算量通常给定一定的迭代次数,而并不是设定R1必须满足一定的限制。这是fluent采用的一种手段。而对于非稳态问题,由于我们关心某一个时刻的值,这时候必须是Rl->0,使得求解的代数方程收敛,因此R1才是作为非稳态问题的收敛判据。在openfoam中两个残差都有,外残差就是你在迭代过程中的输出屏幕上看到的那个initialResidual,而内残差就是求解某一个方程迭代一定后的那个残差,内残差r1,可以通过在fvSolution里面的代数方程求解器中设定,relTol(相对残差)tol(绝对残差)。两者的区别不用说了吧。外残差只对稳态的求解器有,就是fvSolution下的Simple字典下的convergence,可以通过下面方法设置Simple{conveRgence1e-6;当所有方程残差外残差小于le-6时,认为收敛,求解器停止计算。OpenFOAM中非均匀初始场的设定采纳网友的建议,这次讨论OpenFOAM中非均匀初始场设置问题。对于openfoam非均匀场初始化现成程序有两个:1)OpenFOAM自带功能setFields2)社区中的funkySetFields.下面介绍一下两者的使用。1setFields的使用使用setFields只需要将system文件夹中建立setFieldsDict,然后在其中设置相应的参数,设置完后,在case根目录下利用控制台输入setFields就可以了。下面介绍一下interFoam算例中的setFieldsDict.该字典位置在OpenFOAM-1.6/tutorials/multiphase/interFoam/laminar/damBreak/system/setFieldsDict,文件中的内容为FoamFile//文件头version2.0;formatascii;classdictionary;location"system";objectsetFieldsDict;}////defaultFieldValues//用来设定场的默认值(volScalarFieldValuealpha10//设置场alpha1的默认值);regions//设置alpha1不为0的区域(boxToCell//方形区域内的cellbox(00-1)(0.14610.2921);〃方形区域的边界,两点xyz最小点和xyz最大点fieldValues//用来指定定值(volScalarFieldValuealphal1〃用来alphal场在上面box区域内的值的大小);});setFields对于规则区域定值使用比较方便,但是很难实现比较复杂内部场的设置,比如满足某种关系式的内部场设置。2funkySetFields的使用用来设定比较复杂的内部场。可以指定满足一定条件的关系式的初始场。软件的获取funkySetFields在官方或者dev版本里面都没有该功能,可以通过下面命令获取。运行下面的命令需要你的电脑安装svn。svncheckoutHYPERLINK"https://openfoam-extend.svn.sourceforge.net/svnroot/openfoam-extend/trunk/Breeder_1.6/utilities/pos"https://openfoam-extend.svn.sourceforge.net/svnroot/openfoam-extend/trunk/Breeder_1.6/utilities/postProcessing/FunkySetFields/软件的安装该软件安装比较简单,直接进入该文件夹,并运行Allwmake./Allwmake使用2.3.1常用关键字field//用来指定要修改的场expression_r//用来指定表达式condition//用来指定上述表达式应当满足的条件keepPatches〃用来说明是否保持原来边界条件,最好加上,不加的话,funkySetField会给所有边界为0梯度create//用来说明是否是新建场valuePatches//用来指定那些定值边界由临近内部节点值给定dimension//用来指定新建立场的单位time〃用来指定funkySetField所指定的时间点应当指出,上述关键字可以直接在控制台上输,也可以写在名字为funkySetFieldsDict(类似于setFieldsDict)中。2.3.2使用方法方法1直接在控制台输入直接进入你要初始话的case中,输入类似于下面的命令。如上面的setField也可以通过下面的funkySetFields命令来实现funkySetFields-time0-keepPatches-fieldalpha1-expression_r"1"-condition"pos().x<=0.1461&&pos().y<=0.292"注意比较长的式子用单引号或者双引号隔开。上述关键字没有次序要求。方法2使用funkySetFieldsDict字典方法和上面setFields差不多,在system文件夹中建立funkySetFieldsDict字典文件,对于上面表达式可以通过下面字典文件实现。expression_rs//设置复杂内部边界入口(alpha//设置alphal,名字任意{fieldalphal;//操作的场expression_r"l";//表达式condition"pos().x<=0.l46l&&pos().y<=0.292";//执行上述表达式的条件keepPatchestrue;//是否保持以前边界}pressurel//设置压力,名字任意{fieldp;//指定操作场expression_r"l0.*(0.l-pos().y)";//执行表达式子,无条件}pressure2{fieldp;指定表达式expression_r"p+U&U";//表达式子condi
本文档为【OpenFOAM常用类的一些总结】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_704284
暂无简介~
格式:doc
大小:101KB
软件:Word
页数:53
分类:
上传时间:2018-07-18
浏览量:4