计算力学OpenFOAM讲座-基础篇(陈丽萍).ppt

上传人:李医生 文档编号:9101215 上传时间:2021-02-02 格式:PPT 页数:72 大小:757KB
返回 下载 相关 举报
计算力学OpenFOAM讲座-基础篇(陈丽萍).ppt_第1页
第1页 / 共72页
计算力学OpenFOAM讲座-基础篇(陈丽萍).ppt_第2页
第2页 / 共72页
计算力学OpenFOAM讲座-基础篇(陈丽萍).ppt_第3页
第3页 / 共72页
计算力学OpenFOAM讲座-基础篇(陈丽萍).ppt_第4页
第4页 / 共72页
计算力学OpenFOAM讲座-基础篇(陈丽萍).ppt_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《计算力学OpenFOAM讲座-基础篇(陈丽萍).ppt》由会员分享,可在线阅读,更多相关《计算力学OpenFOAM讲座-基础篇(陈丽萍).ppt(72页珍藏版)》请在三一文库上搜索。

1、OpenFOAM的基础篇,第一部分 OpenFOAM的简介,OpenFOAM (Open Source Field Operation and Manipulation),第一部分 OpenFOAM简介,其官方网站为,”库”(library),C+语言编写,利用OpenFOAM得到可执行的软件(application),求解器 solver,工具 utility,数值计算,后处理,流体流动、化学反应、换热 、 结构动力学、电磁场、金融评估等,建模、 网格 、边界条件,前处理,计算结果显示和处理,1. OpenFOAM框架,2. OpenFOAM 应用分类,应用分类,(1) 直接利用标准求解器,

2、(2) 自定义求解器,(3) 自定义离散方法,替代商业软件,免费喔,这类需求较大,商业软件与之不可相比的,更高级的应用,下面再谈谈 分类(2)和(3)的魅力,商业软件中的所谓udf,user subroutine和这是不可相比的。总之,将OpenFOAM作为类库来构建自己的求解器,这是其它软件无法实现的。,分类(2)自定义求解器的魅力,按照自己的求解流程来编写求解器, 关注的重点是求解的流程。,需要关心离散和求解的最底层的知识吗?,开始,初始值,用CFD进行室内温度计算,辐射传热计算Qri,导热计算Qcdi,由热平衡求新的对流传热量Qcvi m+1,收敛条件,结束,Qcvi m 赋新值,对于研

3、究离散格式、代数求解器用户来说,创建更高效更高精度的离散方法,这需要修改finiteVolume库和OpenFOAM库中对应的代码。,分类(3)自定义离散方法的魅力,尤其是对流项,尽管OpenFOAM已经提供了基于NVD和TVD的模板和40多种有名的高阶高精度格式,这仍然是不够的,对流项的离散仍然是目前CFD的重点研究方向。,高级应用,服务未来,第二部分 OpenFOAM的应用,标准求解器solver的应用,(以顶盖驱动流为例),算例Case的结构:,FoamFile version 2.0; format ascii; class dictionary; object blockMeshDi

4、ct; / * * * * * * * * * * * * * * * * * * * * / convertToMeters 0.1;,网格文件 blockMeshDict,文件头,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 ( );,patches ( wall movingWall ( (3 7 6 2) ) wall

5、fixedWalls ( (0 4 7 3) (2 6 5 1) (1 5 4 0) ) empty frontAndBack ( (0 3 2 1) (4 5 6 7) ) );,算例所在的目录下,在运行终端窗口输入: blockMesh 进行网格生成。网格生成过程中,如有错误,运行终端窗口将显示。,查看网格 在运行终端输入:paraFoam,FoamFile version 2.0; format ascii; class dictionary; object controlDict;/ * * * * * * * * * * * * * * * * * * / application i

6、coFoam;startFrom startTime;start Time 0;stopAt endTime;endTime 0.5;deltaT 0.005;,文件为system/controlDict,典型的controlDict文件如下,writeControl timeStep;writeInterval 20; purgeWrite 0;writeFormat ascii;writePrecision 6;uncompressed/compressed;writeCompression uncompressed;timeFormat general;timePrecision 6;

7、/时间文件夹精度 runTimeModifiable yes; /在求解过程中是否允许修改以上参数,文件为system/fvSolution,典型的文件为 :(省去文件头),solvers /方程求解器 p PCG /压力采用预条件共轭梯度法(主要用于求解对称矩阵) preconditioner DIC; tolerance 1e-06; /残差 relTol 0; /迭代容差 ; U PBiCG /速度采用预条件双共轭梯度法(主要用于反对称矩阵) preconditioner DILU; /预测器,对角不完全LU tolerance 1e-05;/残差 relTol 0; /迭代容差 ;,P

8、ISO /piso控制参数 nCorrectors 2;/修正次数 nNonOrthogonalCorrectors 0;/非正交修正次数 pRefCell 0;/压力参考cell的index pRefValue 0;/压力参考值,离散格式的选择:文件:system/fvSchemes,典型文件 :(省去文件头),ddtSchemes default Euler; /欧拉离散 gradSchemes /梯度离散 default Gauss linear;/高斯方法,线性插值 grad(p) Gauss linear; /压力的梯度离散,divSchemes /散度离散 default none

9、; /散度的离散(必须指定没有默认值) div(phi,U)Gauss linear;/对流项离散,高斯理论,用线性插值 laplacianSchemes /拉普拉斯项离散 default none; /拉普拉斯项离散,必须指定 laplacian(nu,U) Gauss linear corrected; /扩散项离散采用高斯理论,采用线性插值 laplacian(1|A(U),p) Gauss linear corrected;/压力方程离散采用高斯理论,线性插值,interpolationSchemes /插值格式 default linear; /默认线性插值 interpolate(

10、HbyA) linear;/线性插值 snGradSchemes/梯度法向分量 defaultcorrected;/默认带有非正交修正 fluxRequired /是否计算流律 default no; /默认不计算 p;/压力需要计算,因为需要利用压力流律修正速度 ,0目录中压力文件: FoamFile version 2.0; format ascii; class volScalarField; object p; / * * * * * * * * * * * * * * * * * * * * * * / dimensions 0 2 -2 0 0 0 0; internalField

11、 uniform 0;,boundaryField movingWall type zeroGradient; fixedWalls type zeroGradient; frontAndBack type empty; / * /,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); frontAndB

12、ack type empty; ,速度文件如下:,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,等值线或等值面,第三部分 求解器,求解器结构:,Info “Reading transportP

13、ropertiesn” endl;/声明属性字典类对象。 IOdictionary transportProperties ( IOobject ( “transportProperties”, runTime.constant(), /位置 mesh, IOobject:MUST_READ, IOobject:NO_WRITE ) );,createFields.H 文件,dimensionedScalar nu ( transportProperties.lookup(nu) );,/创建压力场 Info Reading field pn endl; volScalarField p (

14、IOobject ( p, runTime.timeName(), mesh, IOobject:MUST_READ, IOobject:AUTO_WRITE ), mesh );,/提示并创建速度场 Info Reading field Un endl; volVectorField U ( IOobject ( U, runTime.timeName(), mesh, IOobject:MUST_READ, IOobject:AUTO_WRITE ), mesh );,/创建界面流律# include createPhi.H/设定压力参考cell的index和参考值 label pRefC

15、ell = 0; scalar pRefValue = 0.0;/通过查询system/fvSolution下的PISO进行更新压力参考cell更新并设定参考值。 setRefCell(p, mesh.solutionDict().subDict(PISO), pRefCell, pRefValue);,int main(int argc, char *argv)# include setRootCase.H# include createTime.H# include createMesh.H# include createFields.H# include initContinuityEr

16、rs.H/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /,icoFoam.C,Info “nStarting time loopn” endl;/ 用runTime 控制整个的循环 for (runTime+; !runTime.end(); runTime+) /显示运行时间 Info “Time = ” runTime.timeName() nl endl; # include “readPISOControls.H” /读入piso控制参数,写在runTime循环中 # include Cour

17、antNo.H“,/构造速度方程 fvVectorMatrix UEqn ( fvm:ddt(U) + fvm:div(phi, U) - fvm:laplacian(nu, U) );,solve(UEqn = -fvc:grad(p);,/ - PISO loop- 速度修正步 for (int corr=0; corrnCorr; corr+) /求解系数矩阵对角元素的倒数。 volScalarField rUA = 1.0/UEqn.A(); U = rUA*UEqn.H(); / 更新速度,/流通量修正 phi = (fvc:interpolate(U) ,/调整边值,以便满足连续性

18、条件 adjustPhi(phi, U, p);,/非正交循环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(); ,/计算连续性方程误差 #include continuit

19、yErrs.H“ U -= rUA*fvc:grad(p); /根据新的压力,修正速度 /修正速度边界(主要针对第二类边界条件) U.correctBoundaryConditions(); / PISO循环结束,/输出计算结果 runTime.write();/显示执行时间,CPU时间 Info “ExecutionTime = ” runTime.elapsedCpuTime() “ s” “ ClockTime = ” runTime.elapsedClockTime() “ s” nl endl; / 大循环结束 Info “Endn” endl; return(0);)/ 主程序结束

20、,icoFoam.C 源程序文件名 EXE = $(FOAM_APPBIN)/icoFoam 可执行文件名,Make/files 文件:,EXE_INC = 包含的头文件 -I$(LIB_SRC)/finiteVolume/lnInclude EXE_LIBS = 链接库 -lfiniteVolume,Make/options 文件:,在运行终端运行 wmake,进行编译。,第四部分 定制自己的求解器,在icoFoam中加入浓度场,需要解决的问题: a)如何在icoFoam中加入浓度场方程b) 如何创建物性,c c) 如何在算例中设定C和c d)如何设定T的离散格式 e)如何设定T的求解器的收

21、敛标准等,步骤: 1)初步建立cicoFoam求解器,3)编译cicoFoam求解器,2) 添加浓度方程 修改creatFields.H 文件 修改cicoFoam.C 文件,初步建立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

22、 改为: EXE = $(FOAM_USER_APPBIN)/cicoFoam 可执行文件名,此例中options不需修改,4. 删除原来的obj文件,5. 编译 wmake,下面要完成,2) 添加浓度方程 修改creatFields.H 文件 修改cicoFoam.C 文件,初步建立cicoFoam求解器, 完成了!,打开 CreateFields.H,修改 CreateFields.H,加入浓度方程需要的物性 dimensionedScalar c /首先读入浓度扩散系数 ( transportProperties.lookup( c ) );,加入浓度场 Info Reading fie

23、ld C endl; volScalarField C ( IOobject ( “C, runTime.timeName(), mesh, IOobject:MUST_READ, IOobject:AUTO_WRITE ), mesh );,修改 CreateFields.H,修改CreateFields.H 也完成了!,修改cicoFoam.C,在cicoFoam.C加入浓度微分方程,在PISO循环后面。,fvScalarMatrix Ceqn 浓度是标量方程 ( fvm:ddt(C) + fvm:div(phi, C) 要用到界面流量 - fvm:laplacian(c , C) 扩散项

24、 ); Ceqn.solve(); 求解,wmake,3)编译cicoFoam求解器,什,为什么?,修改cicoFoam.C 完成啦!,新求解器就这样建立了!,如何应用cicoFoam 求解器?,1. 在算例中加入新方程的初始和边界条件,2. 修改离散格式和代数求解控制文件,3. 运行,(1)拷贝一个cavity算例到ccavity (2)修改transportProperties字典文件,设定c cd constant 修改transportProperties文件,设定c =0.002m2/s c c 0 2 -1 0 0 0 0 0.002;,1.在算例中加入新方程的初始和边界条件,(3

25、)创建浓度C文件,设定初始值和边界 进入0目录 拷贝一个p文件,改名为C文件 修改C文件,设定初始值和边界,2 修改离散格式和代数求解控制文件 A 进入system目录 打开fvSchemes文件,添加 divSchemes default none; div(phi,U) Gauss upwind; div(phi,C) Gauss upwind; laplacianSchemes default none; laplacian(nu,U) Gauss linear corrected; laplacian(c ,C) Gauss linear corrected; laplacian(1|

26、A(U),p) Gauss linear corrected; ,在fvSolution中设置代数求解器选项 C PBiCG preconditioner DILU; tolerance 1e-06; relTol 0; ;,3 运行 cicoFoam . ccavity,第五部分 新边界条件的创建,已知新边界条件,新边界条件命名为newgrad,步骤: 1. 复制相近的边界,改名为newgrad 2. 修改 .H文件和 . C 文件 3. 添加关于新边界的编译文件 4.编译,怎么创建和应用?,1. 复制相近的边界,改名为newgrad,(1)复制 在OpenFOAM-1.X/src/fini

27、teVolume/fields/ fvpatchFields/derived 中复制totalTemperature文件夹,(2)改名 将复制的totalTemperature 文件夹改名为newgrad, 文件夹内所以关于totalTemperature 的词全部改为 newgrad.,2.修改 newgradFvPatchScalarField.H,(1),修改newgradFvPatchScalarField.H,class newgradFvPatchScalarField : public fixedGradientFvPatchScalarField,类型修改,class tota

28、lTemperatureFvPatchScalarField : public fixedValueFvPatchScalarField,变了!,word UName_; word phiName_; word psiName_; scalar gamma_; scalarField T0_;,/ Private data word CC_; scalarField gradient_;,/ Private data,(2)修改变量,/- Runtime type information TypeName(totalTemperature);,(3)修改类型名称及其他,/- Runtime t

29、ype information TypeName(newgrad);,const scalarField ,const scalarField ,在updateCoeffs()函数中添加 const volScalarField,2. 修改 newgradFvPatchScalarField.C,3. OpenFOAM-1.xsrcfiniteVolumeMake 的files 文件中 添加关于新边界的编译文件,$(derivedFvPatchFields)/newgrad/ newgradFvPatchField.C,4,4,4. 进入OpenFOAM-1.xsrcfiniteVolume 目录 编译 wmake libso,如何应用newgrad 边界条件?,同OpenFOAM 提供的边界条件一样!,Thank you for listening!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1