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

下载本文档

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

文档简介

OpenFOAM的基础篇陈丽萍南京工业大学城建学院暖通研究所计算力学OpenFOAM讲座-基础篇第一部分OpenFOAM的简介计算力学OpenFOAM讲座-基础篇

OpenFOAM(OpenSourceFieldOperationandManipulation)第一部分OpenFOAM简介其官方网站为”库”(library)C++语言编写计算力学OpenFOAM讲座-基础篇利用OpenFOAM得到可执行的软件(application)求解器solver工具utility数值计算后处理流体流动、化学反应、换热、结构动力学、电磁场、金融评估等建模、网格、边界条件前处理计算结果显示和处理1.OpenFOAM框架计算力学OpenFOAM讲座-基础篇2.OpenFOAM应用分类应用分类(1)直接利用标准求解器(2)自定义求解器(3)自定义离散方法替代商业软件免费喔这类需求较大,商业软件与之不可相比的更高级的应用下面再谈谈分类(2)和(3)的魅力计算力学OpenFOAM讲座-基础篇商业软件中的所谓udf,usersubroutine和这是不可相比的。总之,将OpenFOAM作为类库来构建自己的求解器,这是其它软件无法实现的。

分类(2)自定义求解器的魅力按照自己的求解流程来编写求解器,关注的重点是求解的流程。需要关心离散和求解的最底层的知识吗?计算力学OpenFOAM讲座-基础篇开始初始值用CFD进行室内温度计算辐射传热计算Qri导热计算Qcdi由热平衡求新的对流传热量Qcvim+1收敛条件结束Qcvim赋新值计算力学OpenFOAM讲座-基础篇

对于研究离散格式、代数求解器用户来说,创建更高效更高精度的离散方法,这需要修改finiteVolume库和OpenFOAM库中对应的代码。分类(3)自定义离散方法的魅力尤其是对流项,尽管OpenFOAM已经提供了基于NVD和TVD的模板和40多种有名的高阶高精度格式,这仍然是不够的,对流项的离散仍然是目前CFD的重点研究方向。高级应用服务未来计算力学OpenFOAM讲座-基础篇第二部分OpenFOAM的应用计算力学OpenFOAM讲座-基础篇标准求解器solver的应用(以顶盖驱动流为例)计算力学OpenFOAM讲座-基础篇算例Case的结构:计算力学OpenFOAM讲座-基础篇FoamFile{version2.0;formatascii;classdictionary;objectblockMeshDict;}//********************//convertToMeters0.1;网格文件blockMeshDict文件头计算力学OpenFOAM讲座-基础篇vertices((000)(100)(110)(010)(000.1)(100.1)(110.1)(010.1));blocks(hex(01234567)(20201)simpleGrading(111));edges();计算力学OpenFOAM讲座-基础篇patches(wallmovingWall((3762))wallfixedWalls((0473)(2651)(1540))emptyfrontAndBack((0321)(4567)));

计算力学OpenFOAM讲座-基础篇算例所在的目录下,在运行终端窗口输入:

blockMesh进行网格生成。网格生成过程中,如有错误,运行终端窗口将显示。查看网格

在运行终端输入:paraFoam计算力学OpenFOAM讲座-基础篇计算力学OpenFOAM讲座-基础篇计算力学OpenFOAM讲座-基础篇计算力学OpenFOAM讲座-基础篇计算力学OpenFOAM讲座-基础篇计算力学OpenFOAM讲座-基础篇FoamFile

{

version

2.0;

format

ascii;

class

dictionary;

object

controlDict;

}

//******************//applicationicoFoam;

startFrom

startTime;

startTime

0;

stopAt

endTime;

endTime

0.5;

deltaT

0.005;

文件为system/controlDict,典型的controlDict文件如下计算力学OpenFOAM讲座-基础篇writeControl

timeStep;

writeInterval

20;

purgeWrite

0;

writeFormat

ascii;

writePrecision

6;

uncompressed/compressed;

writeCompressionuncompressed;

timeFormat

general;

timePrecision

6;//时间文件夹精度

runTimeModifiableyes;//在求解过程中是否允许修改以上参数计算力学OpenFOAM讲座-基础篇文件为system/fvSolution,典型的文件为:(省去文件头)solvers

//方程求解器

{

pPCG

//压力采用预条件共轭梯度法(主要用于求解对称矩阵)

{

preconditioner

DIC;

tolerance

1e-06;

//残差

relTol

0;

//迭代容差

};

UPBiCG//速度采用预条件双共轭梯度法(主要用于反对称矩阵)

{

preconditioner

DILU;//预测器,对角不完全LU

tolerance

1e-05;//残差

relTol

0;//迭代容差

};

}计算力学OpenFOAM讲座-基础篇PISO

//piso控制参数

{

nCorrectors

2;//修正次数

nNonOrthogonalCorrectors0;//非正交修正次数

pRefCell

0;//压力参考cell的index

pRefValue

0;//压力参考值

}

计算力学OpenFOAM讲座-基础篇离散格式的选择:

文件:system/fvSchemes,典型文件:(省去文件头)ddtSchemes

{

default

Euler;//欧拉离散

}gradSchemes//梯度离散

{

default

Gausslinear;//高斯方法,线性插值

grad(p)

Gausslinear;//压力的梯度离散

}

计算力学OpenFOAM讲座-基础篇divSchemes

//散度离散

{

default

none;

//散度的离散(必须指定没有默认值)

div(phi,U)

Gausslinear;//对流项离散,高斯理论,用线性插值

}laplacianSchemes//拉普拉斯项离散

{

default

none;

//拉普拉斯项离散,必须指定

laplacian(nu,U)Gausslinearcorrected;

//扩散项离散采用高斯理论,采用线性插值

laplacian((1|A(U)),p)Gausslinearcorrected;//压力方程离散采用高斯理论,线性插值

}计算力学OpenFOAM讲座-基础篇interpolationSchemes

//插值格式

{

default

linear;

//默认线性插值

interpolate(HbyA)linear;//线性插值

}snGradSchemes//梯度法向分量

{

default

corrected;//默认带有非正交修正

}fluxRequired//是否计算流律

{

default

no;//默认不计算

p;//压力需要计算,因为需要利用压力流律修正速度}计算力学OpenFOAM讲座-基础篇0目录中压力文件:FoamFile{version2.0;formatascii;classvolScalarField;objectp;}//***********************//dimensions[02-20000];internalFielduniform0;计算力学OpenFOAM讲座-基础篇boundaryField{movingWall{typezeroGradient;}fixedWalls{typezeroGradient;}frontAndBack{typeempty;}

}//***********************************//计算力学OpenFOAM讲座-基础篇

dimensions[01-10000];internalFielduniform(000);boundaryField{movingWall{typefixedValue;valueuniform(100);}fixedWalls{typefixedValue;valueuniform(000);}frontAndBack{typeempty;}}速度文件如下:计算力学OpenFOAM讲座-基础篇

transportProperties字典文件:FoamFile{version2.0;formatascii;classdictionary;location"constant";objecttransportProperties;}//*********************//nunu[02-10000]0.01;在算例所在的目录下,在运行终端输入:icoFoam

计算力学OpenFOAM讲座-基础篇计算力学OpenFOAM讲座-基础篇计算力学OpenFOAM讲座-基础篇等值线或等值面计算力学OpenFOAM讲座-基础篇第三部分求解器计算力学OpenFOAM讲座-基础篇求解器结构:计算力学OpenFOAM讲座-基础篇

Info<<“ReadingtransportProperties\n”<<endl;

//声明属性字典类对象。

IOdictionarytransportProperties

(

IOobject

(

“transportProperties”,

runTime.constant(),//位置

mesh,

IOobject::MUST_READ,

IOobject::NO_WRITE

)

);

createFields.H文件

计算力学OpenFOAM讲座-基础篇

dimensionedScalarnu

(

transportProperties.lookup("nu")

);//创建压力场

Info<<"Readingfieldp\n"<<endl;

volScalarFieldp

(

IOobject

(

"p",

runTime.timeName(),

mesh,

IOobject::MUST_READ,

IOobject::AUTO_WRITE

),

mesh

);计算力学OpenFOAM讲座-基础篇//提示并创建速度场

Info<<"ReadingfieldU\n"<<endl;

volVectorFieldU

(

IOobject

(

"U",

runTime.timeName(),

mesh,

IOobject::MUST_READ,

IOobject::AUTO_WRITE

),

mesh

);

计算力学OpenFOAM讲座-基础篇//创建界面流律

#

include"createPhi.H"

//设定压力参考cell的index和参考值

labelpRefCell=0;

scalarpRefValue=0.0;

//通过查询system/fvSolution下的PISO进行更新压力参考cell更新并设定参考值。

setRefCell(p,mesh.solutionDict().subDict("PISO"),pRefCell,pRefValue);

计算力学OpenFOAM讲座-基础篇intmain(intargc,char*argv[])

{

#

include"setRootCase.H"

#

include"createTime.H"

#

include"createMesh.H"

#

include"createFields.H"

#

include"initContinuityErrs.H"

//**********************************//

icoFoam.C

计算力学OpenFOAM讲座-基础篇

Info<<“\nStartingtimeloop\n”<<endl;

//用runTime控制整个的循环

for(runTime++;!runTime.end();runTime++)

{

//显示运行时间

Info<<“Time=”<<runTime.timeName()<<nl<<endl;

#

include“readPISOControls.H”//读入piso控制参数,写在runTime循环中

#

include"CourantNo.H“

计算力学OpenFOAM讲座-基础篇

//构造速度方程

fvVectorMatrixUEqn

(

fvm::ddt(U)

+fvm::div(phi,U)

-fvm::laplacian(nu,U)

);

solve(UEqn==-fvc::grad(p));计算力学OpenFOAM讲座-基础篇

//---PISOloop----速度修正步

for(intcorr=0;corr<nCorr;corr++)

{

//求解系数矩阵对角元素的倒数。

volScalarFieldrUA=1.0/UEqn.A();U=rUA*UEqn.H();//更新速度

//流通量修正

phi=(fvc::interpolate(U)&mesh.Sf())+fvc::ddtPhiCorr(rUA,U,phi);

//调整边值,以便满足连续性条件

adjustPhi(phi,U,p);

计算力学OpenFOAM讲座-基础篇//非正交循环

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();

}

}

计算力学OpenFOAM讲座-基础篇

//计算连续性方程误差

#

include"continuityErrs.H“

U-=rUA*fvc::grad(p);//根据新的压力,修正速度

//修正速度边界(主要针对第二类边界条件)

U.correctBoundaryConditions();

}//PISO循环结束

计算力学OpenFOAM讲座-基础篇

//输出计算结果

runTime.write();//显示执行时间,CPU时间

Info<<“ExecutionTime=”<<runTime.elapsedCpuTime()<<“s”

<<“

ClockTime=”<<runTime.elapsedClockTime()<<“s”

<<nl<<endl;

}//大循环结束

Info<<“End\n”<<endl;

return(0);

)//主程序结束计算力学OpenFOAM讲座-基础篇icoFoam.C

源程序文件名

EXE=$(FOAM_APPBIN)/icoFoam

可执行文件名

Make/files文件:EXE_INC=

包含的头文件

-I$(LIB_SRC)/finiteVolume/lnInclude

EXE_LIBS=

链接库

-lfiniteVolumeMake/options文件:在运行终端运行wmake,进行编译。计算力学OpenFOAM讲座-基础篇第四部分定制自己的求解器计算力学OpenFOAM讲座-基础篇在icoFoam中加入浓度场需要解决的问题:

a)如何在icoFoam中加入浓度场方程

b)如何创建物性,Γcc)如何在算例中设定C和Γcd)如何设定T的离散格式

e)如何设定T的求解器的收敛标准等

计算力学OpenFOAM讲座-基础篇步骤:1)初步建立cicoFoam求解器

3)编译cicoFoam求解器2)添加浓度方程修改creatFields.H文件修改cicoFoam.C文件

计算力学OpenFOAM讲座-基础篇初步建立cicoFoam求解器1.复制目录icoFoam到新的位置,新目录名为cicoFoam.

cdcicoFoam2.原文件改名

将icoFoam.C改名cicoFoam.C

删除依赖文件icoFoam.dep3.

修改编译文件files和options

进入Make目录,打开files文件

icoFoam.C

改名cicoFoam.CEXE=$(FOAM_APPBIN)/icoFoam

改为:EXE=$(FOAM_USER_APPBIN)/cicoFoam

可执行文件名

此例中options不需修改计算力学OpenFOAM讲座-基础篇4.删除原来的obj文件5.编译wmake

下面要完成2)添加浓度方程修改creatFields.H文件修改cicoFoam.C文件

初步建立cicoFoam求解器,完成了!!计算力学OpenFOAM讲座-基础篇打开CreateFields.H

修改CreateFields.H

加入浓度方程需要的物性

dimensionedScalarΓc

//首先读入浓度扩散系数

(

transportProperties.lookup("Γc")

);

计算力学OpenFOAM讲座-基础篇加入浓度场

Info<<"ReadingfieldC"<<endl;

volScalarFieldC

(

IOobject

(

“C",

runTime.timeName(),

mesh,

IOobject::MUST_READ,

IOobject::AUTO_WRITE

),

mesh

);

修改CreateFields.H修改CreateFields.H也完成了!!计算力学OpenFOAM讲座-基础篇修改cicoFoam.C在cicoFoam.C加入浓度微分方程,在PISO循环后面。

fvScalarMatrixCeqn浓度是标量方程

(

fvm::ddt(C)

+fvm::div(phi,C)

要用到界面流量

-fvm::laplacian(Γc,C)

扩散项

);

Ceqn.solve();

求解

wmake3)编译cicoFoam求解器什为什么?修改cicoFoam.C

完成啦!!新求解器就这样建立了!!计算力学OpenFOAM讲座-基础篇如何应用cicoFoam求解器?1.在算例中加入新方程的初始和边界条件2.修改离散格式和代数求解控制文件3.运行计算力学OpenFOAM讲座-基础篇(1)拷贝一个cavity算例到ccavity

(2)修改transportProperties字典文件,设定Γc

cdconstant

修改transportProperties文件,设定Γc=0.002m2/s

Γc

Γc[02-10000]0.002;1.在算例中加入新方程的初始和边界条件计算力学OpenFOAM讲座-基础篇(3)创建浓度C文件,设定初始值和边界

进入0目录拷贝一个p文件,改名为C文件

修改C文件,设定初始值和边界计算力学OpenFOAM讲座-基础篇2修改离散格式和代数求解控制文件

A进入system目录

打开fvSchemes文件,添加

divSchemes

{

default

none;

div(phi,U)

Gaussupwind;

div(phi,C)

Gaussupwind;

}

laplacianSchemes

{

default

none;

laplacian(nu,U)Gausslinearcorrected;

laplacian(Γc,C)Gausslinearcorrected;

laplacian((1|A(U)),p)Gausslinearcorrected;

}计算力学OpenFOAM讲座-基础篇在fvSolution中设置代数求解器选项

CPBiCG

{

preconditioner

DILU;

tolerance

1e-06;

relTol

0;

};

3运行

cicoFoam.ccavity

计算力学OpenFOAM讲座-基础篇第五部分新边界条件的创建计算力学OpenFOAM讲座-基础篇已知新边界条件新边界条件命名为newgrad步骤:1.复制相近的边界,改名为newgrad2.修改.H文件和.C文件3.添加关于新边界的编译文件4.编译怎么创建和应用??计算力学OpenFOAM讲座-基础篇1.复制相近的边界,改名为newgrad(1)复制

在OpenFOAM-1.X/src/finiteVolume/fields/fvpatchFields/derived中复制totalTemperature文件夹(2)改名

将复制的totalTemperature文件夹改名为newgrad,

文件夹内所以关于totalTemperature的词全部改为newgrad.计算力学OpenFOAM讲座-基础篇2.修改newgradFvPatchScalarField.H(1)修改newgradFvPatchScalarField.H

classnewgradFvPatchScalarField:publicfixedGradientFvPatchScalarField类型修改classtotalTemperatureFvPatchScalarField:publicfixedValueFvPatchScalarField变了!计算力学OpenFOAM讲座-基础篇wor

温馨提示

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

评论

0/150

提交评论