您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > OpenFOAM的程序开发初步
OpenFOAM的程序开发初步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,usersubroutine和这是不可相比的。3)用户自己定义离散方法等。对于研究离散格式、代数求解器等人来说,更关注时间项ddt,扩散项Laplacian,对流项div是如何离散的,能否有更高效更高精度的离散方法,这需要修改finiteVolume库和OpenFOAM库中对应的代码。尤其是对流项,尽管OpenFOAM已经提供了基于NVD和TVD的模板和40多种有名的高阶高精度格式,但可以预见,这仍然是不够的,毕竟对流项的离散仍然是目前CFD的重点研究方向。可以肯定的是,目前有很多人关注类型2的应用,毕竟将OpenFOAM当成Fluent或OpenFOAM的程序开发初步Star-CCM来使用,并不见得方便。但是将OpenFOAM作为类库来构建自己的求解器,这是其它软件无法实现的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/utilitiessol=cdto$FOAM_APP/solversOpenFOAM的程序开发初步tut=cdto$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/包含物性数据OpenFOAM的程序开发初步+system/包含计算控制和离散格式设定+controlDict包含计算控制,如时间步长等+fvSchemes包含离散格式设定+fvSolutions包含代数求解器或SIMPLE,PISO算法设定具体而言case/0每个需求解的变量需要一个文件设定其初始边界条件case/constant/polyMesh网格数据,如ownerneighbourpointsfacesboundarycase/system/transportProperties物性数据case/system/controlDict设定起始终止时间,时间步长,输出控制case/system/fvSchemes设定程序用到的每个微分算子的离散格式case/system/fvSolution为每个变量选择代数方程求解器/收敛精度及PISO等算法设定三.OpenFOAM程序开发的理论知识作求解开发,必须能写出需要求解的控制方程及其定解条件,并且对于如何求解方程或方程组的步骤已经明确。这些流体力学、传热学以及相关的理论是必需的,所谓连续介质力学中的数学模型,控制方OpenFOAM的程序开发初步程和定解条件就是表示它的语言。在这里是不可能说清楚的,这要看个人的功底了。四.OpenFOAM程序开发的最简单的例子下面采用OpenFOAM来开发一个用户自己的求解器。主要是利用OpenFOAM的标准求解器icoFoam,用户不需要写任何代码,只为为了熟悉OpenFOAM程序开发的环境和步骤。步骤:1)将icoFoam目录拷贝到新的目录可采用下面的Linux的命令实现:到OpenFOAM的incompressible目录cdapplications/incompressiblecp–ricoFoammyicoFoam以上只是复制目录icoFoam到新的位置,并且新目录名为myicoFoamcdmyicoFoam进入新的目录,查看一下,可以看到里面的文件和icoFoam中是否一样2)原文件改名,并且删除依赖文件将icoFoam.C改名myicoFoam.CmvicoFoam.CmyicoFoam.C删除依赖文件rmicoFoam.depOpenFOAM的程序开发初步3)修改编译文件files和options进入Make目录,打开files文件将icoFoam.C源程序文件名EXE=$(FOAM_APPBIN)/icoFoam可执行文件名修改为myicoFoam.C源程序文件名EXE=$(FOAM_APPBIN)/myicoFoam可执行文件名此例中options不需修改,可以打开看看EXE_INC=\头文件包含-I$(LIB_SRC)/finiteVolume/lnIncludeEXE_LIBS=\链接库-lfiniteVolume4)删除原来的obj文件rm–rflinuxGccDPOptcd..5)编译wmake6)检验一下到tutorial目录,检验一下myicoFoam.cavityOpenFOAM的程序开发初步六.OpenFOAM程序开发――例子一:在icoFoam中加入温度场求解准备:能量控制方程:dT/dt+div(den*U*T)=div(agradT)在壁面上给定值条件。需要解决的问题:a)如何创建标量场,Tb)如何创建物性,ac)如何定义温度方程,并求解d)如何在算例中设定T和ae)如何设定T的离散格式f)如何设定T的求解器的收敛标准等步骤:1)创建程序需要的新物性和新变量场打开myicoFoam.C可以看到,程序开始运行时调用CreateFields.H,创建变量场。打开CreateFields.H,可以看到程序首先从transportProperties文件中读入物性,InfoReadingtransportProperties\nendl;IOdictionarytransportProperties(OpenFOAM的程序开发初步IOobject(transportProperties,从字典文件transportProperties读入runTime.constant(),//transportProperties文件位于目录runTime.constant()中mesh,网格对象IOobject::MUST_READ,IOobject::NO_WRITE));创建了Iodictionary类型对象transportPropertiesdimensionedScalarnu//首先读入粘性系数(transportProperties.lookup(nu));创建有量纲标量nu,nu通过从字典transportProperties查找”nu”来赋值可以加上新方程需要的物性dimensionedScalarDT//首先读入热扩散率(transportProperties.lookup(DT));创建有量纲标量DT,DT通过从字典transportProperties查找”DT”来赋值此外还要从createFields中读入p,U场,我们要加入的新的变量场为温度场T,最快的加OpenFOAM的程序开发初步入温度场的方法是拷贝p场的代码,修改为InfoReadingfieldT\nendl;volScalarFieldT(IOobject(T,runTime.timeName(),mesh,IOobject::MUST_READ,IOobject::AUTO_WRITE),mesh);这样,创建了新的vol标量场T,从文件T中读入。对于T的创建具体解释如下:a)创建了标量场Tb)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,在边界上还OpenFOAM的程序开发初步需要边界条件,这与polyMesh/boundary中要一致。2)在求解器中加入新的求解方程下一步回到myicoFoam.C加入新的微分方程,由于温度场依赖于速度场,可放在PISO循环后面。#includecontinuityErrs.HU-=rUA*fvc::grad(p);U.correctBoundaryConditions();//AddthetemperatureequationfvScalarMatrixTeqn温度是标量方程(fvm::ddt(T)+fvm::div(phi,T)要用到界面流量-fvm::laplacian(DT,T)扩散项);TEqn.solve();求解3)编译OpenFOAM的程序开发初步wmake4)在算例中加入新方程的初始和边界条件4.1拷贝一个cavity算例到mycavity4.2修改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;}//*************************************//OpenFOAM的程序开发初步dimensions[0001000];i
本文标题:OpenFOAM的程序开发初步
链接地址:https://www.777doc.com/doc-5155699 .html