资源描述
单击鼠标编辑标题文的格式,单击鼠标编辑大纲正文格式,第二个大纲级,第三个大纲级,第四个大纲级,第五个大纲级,第六个大纲级,第七个大纲级,第八个大纲级,第九个大纲级,*,OpenFOAM,的基础篇,陈丽萍,南京工业大学城建学院暖通研究所,clpjoy,1,第一部分,OpenFOAM,的简介,2,OpenFOAM,(,Open Source Field Operation and Manipulation,),第一部分,OpenFOAM,简介,其官方网站为,”,库,”,(,library,),C+,语言编写,3,利用,OpenFOAM,得到,可执行的软件(,application,),求解器,solver,工具,utility,数值计算,后处理,流体流动、化学反应、换热、结构动力学、电磁场,、,金融评估等,建模,、,网格,、,边界条件,前处理,计算结果,显示和处理,1.OpenFOAM,框架,4,2.OpenFOAM,应用分类,应用分类,(1),直接利用标准求解器,(2),自定义求解器,(3),自定义离散方法,替代商业软件,免费喔,这类需求较大,商业软件,与之不可相比的,更高级的应用,下面再谈谈,分类(2)和(3)的魅力,5,商业软件中的所谓,udf,,,user subroutine,和这是不可相比的。总之,将,OpenFOAM,作为类库来构建自己的求解器,这是其它软件无法实现的。,分类(,2,)自定义求解器的魅力,按照自己的求解流程来编写求解器,关注的重点是求解的流程。,需要关心离散和求解的最底层的知识吗?,6,开始,初始值,用,CFD,进行室内温度计算,辐射传热计算,Qri,导热计算,Qcdi,由热平衡求新的对流传热量,Qcvi,m+1,收敛条件,结束,Qcvi,m,赋新值,7,对于研究离散格式、代数求解器用户来说,创建更高效更高精度的离散方法,这需要修改,finiteVolume,库和,OpenFOAM,库中对应的代码。,分类(,3,)自定义离散方法的魅力,尤其是对流项,尽管,OpenFOAM,已经提供了基于,NVD,和,TVD,的模板和,40,多种有名的高阶高精度格式,这仍然是不够的,对流项的离散仍然是目前,CFD,的重点研究方向。,高级应用,服务未来,8,第二部分,OpenFOAM,的应用,9,标准求解器,solver,的应用,(以顶盖驱动流为例),10,算例,Case,的结构:,11,FoamFile,version 2.0;,format ascii;,class dictionary;,object blockMeshDict;,/*/,convertToMeters 0.1;,网格文件,blockMeshDict,文件头,12,vertices,(,(0 0 0),(1 0 0),(1 1 0),(0 1 0),(0 0 0.1),(1 0 0.1),(1 1 0.1),(0 1 0.1),);,blocks,(,hex(0 1 2 3 4 5 6 7)(20 20 1)simpleGrading(1 1 1),);,edges,(,);,13,patches,(,wall movingWall,(,(3 7 6 2),),wall fixedWalls,(,(0 4 7 3),(2 6 5 1),(1 5 4 0),),empty frontAndBack,(,(0 3 2 1),(4 5 6 7),),);,14,算例所在的目录下,,在运行终端窗口输入:,blockMesh,进行网格生成。网格生成过程中,如有错误,运行终端窗口将显示。,查看网格,在运行终端输入:,paraFoam,15,16,17,18,19,20,FoamFile version 2.0;format ascii;class dictionary;object controlDict;/*/,application icoFoam;startFrom startTime;start Time 0;stopAt endTime;endTime 0.5;deltaT 0.005;,文件为,system/controlDict,典型的,controlDict,文件如下,21,writeControl timeStep;writeInterval 20;purgeWrite 0;writeFormat ascii;writePrecision 6;uncompressed/compressed;writeCompression uncompressed;timeFormat general;timePrecision 6;/,时间文件夹精度,runTimeModifiable yes;/,在求解过程中是否允许修改以上参数,22,文件为,system/fvSolution,,典型的文件为,:,(省去文件头),solvers/,方程求解器,p PCG/,压力采用预条件共轭梯度法(主要用于求解对称矩阵),preconditioner DIC;,tolerance 1e-06;/,残差,relTol 0;/,迭代容差,;,U PBiCG/,速度采用预条件双共轭梯度法(主要用于反对称矩阵),preconditioner DILU;/,预测器,对角不完全,LU tolerance 1e-05;/,残差,relTol 0;/,迭代容差,;,23,PISO/piso,控制参数,nCorrectors 2;/,修正次数,nNonOrthogonalCorrectors 0;/,非正交修正次数,pRefCell 0;/,压力参考,cell,的,index pRefValue 0;/,压力参考值,24,离散格式的选择:文件:,system/fvSchemes,,典型文件,:,(省去文件头),ddtSchemes default Euler;/,欧拉离散,gradSchemes/,梯度离散,default Gauss linear;/,高斯方法,线性插值,grad(p)Gauss linear;/,压力的梯度离散,25,divSchemes/,散度离散,default none;/,散度的离散(必须指定没有默认值,),div(phi,U)Gauss linear;,/,对流项离散,高斯理论,用线性插值,laplacianSchemes/,拉普拉斯项离散,default none;/,拉普拉斯项离散,必须指定,laplacian(nu,U)Gauss linear corrected;/,扩散项离散采用高斯理论,采用线性插值,laplacian(1|A(U),p)Gauss linear corrected;/,压力方程离散采用高斯理论,线性插值,26,interpolationSchemes/,插值格式,default linear;/,默认线性插值,interpolate(HbyA)linear;/,线性插值,snGradSchemes/,梯度法向分量,defaultcorrected;/,默认带有非正交修正,fluxRequired/,是否计算流律,default no;/,默认不计算,p;/,压力需要计算,因为需要利用压力流律修正速度,27,0,目录中压力文件:,FoamFile,version 2.0;,format ascii;,class volScalarField;,object p;,/*/,dimensions 0 2-2 0 0 0 0;,internalField uniform 0;,28,boundaryField,movingWall,type zeroGradient;,fixedWalls,type zeroGradient;,frontAndBack,type empty;,/*/,29,dimensions 0 1-1 0 0 0 0;,internalField uniform(0 0 0);,boundaryField,movingWall,type fixedValue;,value uniform(1 0 0);,fixedWalls,type fixedValue;,value uniform(0 0 0);,frontAndBack,type empty;,速度文件如下:,30,transportProperties,字典文件:,FoamFile,version 2.0;,format ascii;,class dictionary;,location constant;,object transportProperties;,/*/,nu nu 0 2-1 0 0 0 0 0.01;,在算例所在的目录下,在运行终端输入:,icoFoam,31,32,33,等值线或等值面,34,第三部分 求解器,35,求解器结构:,36,Info“Reading transportPropertiesn”endl;/,声明属性字典类对象。,IOdictionary transportProperties(IOobject(“transportProperties”,runTime.constant(),/,位置,mesh,IOobject:MUST_READ,IOobject:NO_WRITE,);,createFields.H,文件,37,dimensionedScalar nu(transportProperties.lookup(nu);,/,创建压力场,Info Reading field pn endl;volScalarField p(IOobject(p,runTime.timeName(),mesh,IOobject:MUST_READ,IOobject:AUTO_WRITE),mesh);,38,/,提示并创建速度场,Info Reading field Un endl;volVectorField U(IOobject(U,runTime.timeName(),mesh,IOobject:MUST_READ,IOobject:AUTO_WRITE),mesh);,39,/,/,创建界面流律,#include createPhi.H/,设定压力参考,cell,的,index,和参考值,label pRefCell=0;scalar pRefValue=0.0;/,通过查询,system/fvSolution,下的,PISO,进行更新压力参考,cell,更新并设定参考值。,setRefCell(p,mesh.solutionDict().subDict(PISO),pRefCell,pRefValue);,40,int main(int argc,char*argv)#include setRootCase.H#include createTime.H#include createMesh.H#include createFields.H#include initContinuityErrs.H/*/,icoFoam.C,41,Info“nStarting time loopn”endl;/,用,runTime,控制整个的循环,for(runTime+;!runTime.end();runTime+)/,显示运行时间,Info“Time=”runTime.timeName()nl endl;#include“readPISOControls.H”,/,读入,piso,控制参数,写在,runTime,循环中,#include CourantNo.H“,42,/,构造速度方程,fvVectorMatrix UEqn(fvm:ddt(U)+fvm:div(phi,U)-fvm:laplacian(nu,U);,solve(UEqn=-fvc:grad(p);,43,/-PISO loop-,速度修正步,for(int corr=0;corrnCorr;corr+),/,求解系数矩阵对角元素的倒数。,volScalarField rUA=1.0/UEqn.A();,U=rUA*UEqn.H();/,更新速度,/,流通量修正,phi=(fvc:interpolate(U)&mesh.Sf(),+fvc:ddtPhiCorr(rUA,U,phi);,/,调整边值,以便满足连续性条件,adjustPhi(phi,U,p);,44,/,非正交循环,for(int nonOrth=0;nonOrth=nNonOrthCorr;nonOrth+)fvScalarMatrix pEqn /,求解压力方程,(fvm:laplacian(rUA,p)=fvc:div(phi);pEqn.setReference(pRefCell,pRefValue);pEqn.solve();/,根据新求解的压力,更新面流通量,if(nonOrth=nNonOrthCorr)phi-=pEqn.flux();,45,/,计算连续性方程误差,#include continuityErrs.H“,U-=rUA*fvc:grad(p);/,根据新的压力,修正速度,/,修正速度边界,(,主要针对第二类边界条件),U.correctBoundaryConditions();,/PISO,循环结束,46,/,输出计算结果,runTime.write();/,显示执行时间,,CPU,时间,Info“ExecutionTime=”runTime.elapsedCpuTime()“s”“ClockTime=”runTime.elapsedClockTime()“s”nl endl;/,大循环结束,Info“Endn”endl;return(0);)/,主程序结束,47,icoFoam.C,源程序文件名,EXE=$(FOAM_APPBIN)/icoFoam,可执行文件名,Make/files,文件:,EXE_INC=,包含的头文件,-I$(LIB_SRC)/finiteVolume/lnInclude EXE_LIBS=,链接库,-lfiniteVolume,Make/options,文件:,在运行终端运行,wmake,,进行编译。,48,第四部分 定制自己的求解器,49,在,icoFoam,中加入浓度场,需要解决的问题:,a,)如何在,icoFoam,中加入浓度场方程,b),如何创建物性,,c,c),如何在算例中设定,C,和,c,d),如何设定,T,的离散格式,e),如何设定,T,的求解器的收敛标准等,50,步骤:,1),初步建立,cicoFoam,求解器,3,)编译,cicoFoam,求解器,2)添加浓度方程,修改,creatFields.H,文件,修改,cicoFoam.C,文件,51,初步建立,cicoFoam,求解器,1.,复制目录,icoFoam,到新的位置,新目录名为,cicoFoam.cd cicoFoam,2.,原文件改名,将,icoFoam.C,改名,cicoFoam.C,删除依赖文件,icoFoam.dep,3.,修改编译文件,files,和,options,进入,Make,目录,打开,files,文件 将,icoFoam.C,改名,cicoFoam.C,EXE=$(FOAM_APPBIN)/icoFoam,改为:,EXE=$(FOAM_USER_APPBIN)/cicoFoam,可执行文件名,此例中,options,不需修改,52,4.,删除原来的,obj,文件,5.,编译,wmake,下面要完成,2)添加浓度方程,修改,creatFields.H,文件,修改,cicoFoam.C,文件,初步建立,cicoFoam,求解器,,完成了!,53,打开,CreateFields.H,修改,CreateFields.H,加入浓度方程需要的物性,dimensionedScalar c /,首先读入浓度扩散系数,(transportProperties.lookup(c);,54,加入浓度场,Info Reading field C patchInternalField(),+gradient_/this-patch().deltaCoeffs(),);,2.,修改,newgradFvPatchScalarField.C,69,3.,OpenFOAM-1.xsrcfiniteVolumeMake,的,files,文件中,添加关于新边界的编译文件,$(,derivedFvPatchFields)/newgrad/,newgradFvPatchField.C,4,4,4.,进入,OpenFOAM-1.xsrcfiniteVolume,目录 编译,wmake libso,70,如何应用,newgrad,边界条件?,同,OpenFOAM,提供的边界条件一样!,71,Thank you for listening!,72,
展开阅读全文