计算力学OpenFOAM讲座-基础篇_第1页
计算力学OpenFOAM讲座-基础篇_第2页
计算力学OpenFOAM讲座-基础篇_第3页
计算力学OpenFOAM讲座-基础篇_第4页
计算力学OpenFOAM讲座-基础篇_第5页
已阅读5页,还剩67页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

OpenFOAM的基础篇,陈丽萍,南京工业大学城建学院暖通研究所,clpjoy,第一部分OpenFOAM的简介,OpenFOAM(OpenSourceFieldOperationandManipulation),第一部分OpenFOAM简介,其官方网站为,”库”(library)随便取,来组建我们需要的算例,C+语言编写,利用OpenFOAM得到可执行的软件(application),求解器solver,工具utility,数值计算,后处理,流体流动、化学反应、换热、结构动力学、电磁场、金融评估等,建模、网格、边界条件,前处理,计算结果显示和处理,1.OpenFOAM框架,2.OpenFOAM应用分类,应用分类,(1)直接利用标准求解器,(2)自定义求解器,(3)自定义离散方法,替代商业软件,免费喔,这类需求较大,商业软件与之不可相比的,更高级的应用,下面再谈谈分类(2)和(3)的魅力,商业软件中的所谓udf,usersubroutine和这是不可相比的。总之,将OpenFOAM作为类库来构建自己的求解器,这是其它软件无法实现的。,分类(2)自定义求解器的魅力,按照自己的求解流程来编写求解器,关注的重点是求解的流程。,需要关心离散和求解的最底层的知识吗?,开始,初始值,用CFD进行室内温度计算,辐射传热计算Qri,导热计算Qcdi,由热平衡求新的对流传热量Qcvim+1,收敛条件,结束,Qcvim赋新值,对于研究离散格式、代数求解器用户来说,创建更高效更高精度的离散方法,这需要修改finiteVolume库和OpenFOAM库中对应的代码。,分类(3)自定义离散方法的魅力,尤其是对流项,尽管OpenFOAM已经提供了基于NVD和TVD的模板和40多种有名的高阶高精度格式,这仍然是不够的,对流项的离散仍然是目前CFD的重点研究方向。,高级应用,服务未来,第二部分OpenFOAM的应用,标准求解器solver的应用,(以顶盖驱动流为例),算例Case的结构:,FoamFileversion2.0;formatascii;classdictionary;objectblockMeshDict;/*/convertToMeters0.1;,网格文件blockMeshDict,文件头,vertices(000)(100)(110)(010)(000.1)(100.1)(110.1)(010.1);,blocks(hex(01234567)(20201)simpleGrading(111);edges();,patches(wallmovingWall(3762)wallfixedWalls(0473)(2651)(1540)emptyfrontAndBack(0321)(4567);,算例所在的目录下,在运行终端窗口输入:blockMesh进行网格生成。网格生成过程中,如有错误,运行终端窗口将显示。,查看网格在运行终端输入:paraFoam,FoamFileversion2.0;formatascii;classdictionary;objectcontrolDict;/*/applicationicoFoam;startFromstartTime;startTime0;stopAtendTime;endTime0.5;deltaT0.005;,文件为system/controlDict,典型的controlDict文件如下,writeControltimeStep;writeInterval20;purgeWrite0;writeFormatascii;writePrecision6;uncompressed/compressed;writeCompressionuncompressed;timeFormatgeneral;timePrecision6;/时间文件夹精度runTimeModifiableyes;/在求解过程中是否允许修改以上参数,文件为system/fvSolution,典型的文件为:(省去文件头),solvers/方程求解器pPCG/压力采用预条件共轭梯度法(主要用于求解对称矩阵)preconditionerDIC;tolerance1e-06;/残差relTol0;/迭代容差;UPBiCG/速度采用预条件双共轭梯度法(主要用于反对称矩阵)preconditionerDILU;/预测器,对角不完全LUtolerance1e-05;/残差relTol0;/迭代容差;,PISO/piso控制参数nCorrectors2;/修正次数nNonOrthogonalCorrectors0;/非正交修正次数pRefCell0;/压力参考cell的indexpRefValue0;/压力参考值,离散格式的选择:文件:system/fvSchemes,典型文件:(省去文件头),ddtSchemesdefaultEuler;/欧拉离散gradSchemes/梯度离散defaultGausslinear;/高斯方法,线性插值grad(p)Gausslinear;/压力的梯度离散,divSchemes/散度离散defaultnone;/散度的离散(必须指定没有默认值)div(phi,U)Gausslinear;/对流项离散,高斯理论,用线性插值laplacianSchemes/拉普拉斯项离散defaultnone;/拉普拉斯项离散,必须指定laplacian(nu,U)Gausslinearcorrected;/扩散项离散采用高斯理论,采用线性插值laplacian(1|A(U),p)Gausslinearcorrected;/压力方程离散采用高斯理论,线性插值,interpolationSchemes/插值格式defaultlinear;/默认线性插值interpolate(HbyA)linear;/线性插值snGradSchemes/梯度法向分量defaultcorrected;/默认带有非正交修正fluxRequired/是否计算流律defaultno;/默认不计算p;/压力需要计算,因为需要利用压力流律修正速度,0目录中压力文件:FoamFileversion2.0;formatascii;classvolScalarField;objectp;/*/dimensions02-20000;internalFielduniform0;,boundaryFieldmovingWalltypezeroGradient;fixedWallstypezeroGradient;frontAndBacktypeempty;/*/,dimensions01-10000;internalFielduniform(000);boundaryFieldmovingWalltypefixedValue;valueuniform(100);fixedWallstypefixedValue;valueuniform(000);frontAndBacktypeempty;,速度文件如下:,transportProperties字典文件:FoamFileversion2.0;formatascii;classdictionary;locationconstant;objecttransportProperties;/*/nunu02-100000.01;,在算例所在的目录下,在运行终端输入:icoFoam,等值线或等值面,第三部分求解器,求解器结构:,Info“ReadingtransportPropertiesn”endl;/声明属性字典类对象。IOdictionarytransportProperties(IOobject(“transportProperties”,runTime.constant(),/位置mesh,IOobject:MUST_READ,IOobject:NO_WRITE);,createFields.H文件,dimensionedScalarnu(transportProperties.lookup(nu);,/创建压力场InfoReadingfieldpnendl;volScalarFieldp(IOobject(p,runTime.timeName(),mesh,IOobject:MUST_READ,IOobject:AUTO_WRITE),mesh);,/提示并创建速度场InfoReadingfieldUnendl;volVectorFieldU(IOobject(U,runTime.timeName(),mesh,IOobject:MUST_READ,IOobject:AUTO_WRITE),mesh);,/创建界面流律#includecreatePhi.H/设定压力参考cell的index和参考值labelpRefCell=0;scalarpRefValue=0.0;/通过查询system/fvSolution下的PISO进行更新压力参考cell更新并设定参考值。setRefCell(p,mesh.solutionDict().subDict(PISO),pRefCell,pRefValue);,intmain(intargc,char*argv)#includesetRootCase.H#includecreateTime.H#includecreateMesh.H#includecreateFields.H#includeinitContinuityErrs.H/*/,icoFoam.C,Info“nStartingtimeloopn”endl;/用runTime控制整个的循环for(runTime+;!runTime.end();runTime+)/显示运行时间Info“Time=”runTime.timeName()nlendl;#include“readPISOControls.H”/读入piso控制参数,写在runTime循环中#includeCourantNo.H“,/构造速度方程fvVectorMatrixUEqn(fvm:ddt(U)+fvm:div(phi,U)-fvm:laplacian(nu,U);,solve(UEqn=-fvc:grad(p);,/-PISOloop-速度修正步for(intcorr=0;corrnCorr;corr+)/求解系数矩阵对角元素的倒数。volScalarFieldrUA=1.0/UEqn.A();U=rUA*UEqn.H();/更新速度,/流通量修正phi=(fvc:interpolate(U),/调整边值,以便满足连续性条件adjustPhi(phi,U,p);,/非正交循环for(intnonOrth=0;nonOrth=nNonOrthCorr;nonOrth+)fvScalarMatrixpEqn/求解压力方程(fvm:laplacian(rUA,p)=fvc:div(phi);pEqn.setReference(pRefCell,pRefValue);pEqn.solve();/根据新求解的压力,更新面流通量if(nonOrth=nNonOrthCorr)phi-=pEqn.flux();,/计算连续性方程误差#includecontinuityErrs.H“U-=rUA*fvc:grad(p);/根据新的压力,修正速度/修正速度边界(主要针对第二类边界条件)U.correctBoundaryConditions();/PISO循环结束,/输出计算结果runTime.write();/显示执行时间,CPU时间Info“ExecutionTime=”runTime.elapsedCpuTime()“s”“ClockTime=”runTime.elapsedClockTime()“s”nlendl;/大循环结束Info“Endn”endl;return(0);)/主程序结束,icoFoam.C源程序文件名EXE=$(FOAM_APPBIN)/icoFoam可执行文件名,Make/files文件:,EXE_INC=包含的头文件-I$(LIB_SRC)/finiteVolume/lnIncludeEXE_LIBS=链接库-lfiniteVolume,Make/options文件:,在运行终端运行wmake,进行编译。,第四部分定制自己的求解器,在icoFoam中加入浓度场,需要解决的问题:a)如何在icoFoam中加入浓度场方程b)如何创建物性,cc)如何在算例中设定C和cd)如何设定C的离散格式e)如何设定C的求解器的收敛标准等,步骤:1)初步建立cicoFoam求解器,3)编译cicoFoam求解器,2)添加浓度方程修改creatFields.H文件修改cicoFoam.C文件,初步建立cicoFoam求解器,1.复制目录icoFoam到新的位置,新目录名为cicoFoam.cdcicoFoam,2.原文件改名将icoFoam.C改名cicoFoam.C删除依赖文件icoFoam.dep,3.修改编译文件files和options进入Make目录,打开files文件将icoFoam.C改名cicoFoam.CEXE=$(FOAM_APPBIN)/icoFoam改为:EXE=$(FOAM_USER_APPBIN)/cicoFoam可执行文件名,此例中options不需修改,4.删除原来的obj文件,5.编译wmake,下面要完成,2)添加浓度方程修改creatFields.H文件修改cicoFoam.C文件,初步建立cicoFoam求解器,完成了!,打开CreateFields.H,修改CreateFields.H,加入浓度方程需要的物性dimensionedScalarc/首先读入浓度扩散系数(transportProperties.lookup(c);,加入浓度场Info“ReadingfieldC”endl;volScalarFieldC/拷贝压力场就可以(IOobject(“C,runTime.timeName(),mesh,IOobject:MUST_READ,IOobject:AUTO_WRITE),mesh);,修改CreateFields.H,修改CreateFields.H也完成了!,修改cicoFoam.C,在cicoFoam.C加入浓度微分方程,在PISO(求解速度压力)循环后面。,fvScalarMatrixCeqn浓度是标量方程(fvm:ddt(C)+fvm:div(phi,C)要用到界面流量-fvm:laplacian(c,C)扩散项);Ceqn.solve();求解,wmake,3)编译cicoFoam求解器,什,为什么?,修改cicoFoam.C完成啦!,新求解器就这样建立了!,如何应用cicoFoam求解器?,1.在算例中加入新方程的初始和边界条件,2.修改离散格式和代数求解控制文件,3.运行,(1)拷贝一个cavity算例到ccavity(2)修改transportProperties字典文件,设定ccdconstant修改transportProperties文件,设定c=0.002m2/scc02-100000.002;,1.在算例中加入新方程的初始和边界条件,(3)创建浓度C文件,设定初始值和边界进入0目录拷贝一个p文件,改名为C文件修改C文件,设定初始值和边界,2修改离散格式和代数求解控制文件A进入system目录打开fvSchemes文件,添加divSchemesdefaultnone;div(phi,U)Gaussupwind;div(phi,C)Gaussupwind;laplacianSchemesdefaultnone;laplacian(nu,U)Gausslinearcorrected;laplacian(c,C)Gausslinearcorrected;laplacian(1|A(U),p)Gausslinearcorrected;,在fvSolution中设置代数求解器选项CPBiCGpreconditionerDILU;tolerance1e-06;relTol0;,3运行cicoFoam.ccavity,第五部分新边界条件的创建,已知新边界条件,新边界条件命名为newgrad,步骤:1.复制相近的边界,改名为newgrad2.修改.H文件和.C文件3.添加关于新边界的编译文件4.编译,怎么创建和应用?,1.复制相近的边界,改名为newgrad,(1)复制在OpenFOAM-1.X/src/finiteVolume/fields/fvpatchFields/derived中复制totalTemperature文件夹,(2)改名将复制的totalTemperature文件夹改名为newgrad,文件夹内所以关于totalTemperature的词全部改为newgrad.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论