1  明确目标——为啥费老大劲儿学习OpenFOAM

学习OpenFOAM主要出于课题需要,希望实现以下几个目标:

【 】学会用SnappyHexMesh生成高质量网格;

【 】学习使用OpenFOAM自带的 Immersed Boundary Method (IBM)处理复杂几何边界;

【 】实现LES算例;

【 】实现CFD的批处理以完成大量算例。

2 前期准备——在Win10上安装OpenFOAM

这部分主要参CFD大佬【流沙】提供的方法,详情见网页:

https://www.cnblogs.com/LSCAX/p/7074326.html

出于方便考虑,直接在Github上下载并安装BlueCFD,详情见下载页:

https://github.com/blueCFD/Core/releases/tag/blueCFD-Core-2017-2

目前已经更新到 2017-2 版,搭载OpenFOAM 5.0 版本,基本能满足使用要求。

3 入门算例学习—— lid-driven cavity flow

3.1 问题描述

一开始不打算写问题描述,在找lid-driven cavity flow一词的中文翻译的时候才发现也有大佬学习这个算例,而且这个算例能说明湍流的特征,也有相关的实验支持,所以添加问题描述这个环节,关于这部分的知识主要参考网页:

【陈十七】cavity算例https://blog.csdn.net/weixin_39124457/article/details/88926300

lid-driven cavity flow 翻译成中文就是 顶盖驱动方腔流 (参考知网翻译),理想模型见 REF _Ref12095029 \h 图 3‑1
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000D0000005F00520065006600310032003000390035003000320039000000
。当顶盖以不同的速度运动时,方腔内的流体会呈现不同的流动特征。方腔流可以反映出不同雷诺数条件下的流场特性, 并且流场中包含了涡旋、二次流、复杂三维流动、不稳定层流、过渡流和紊流等多种现象, 成为研究复杂紊动流场最为理想的物理模型, 也是验证数值模拟方法准确度和效率的标准(张金凤,2015)。

图 3-1 顶盖驱动方腔流动模型,左为OpenFOAM Tutorial给出的计算模型,右图为实验模型

在OpenFOAM中求解这个问题主要分为三个环节:前处理()——求解——后处理。首先将官方指南设置好的算例放入RUN所在的文件夹下,在BlueCFD终端中输入:

 cd $FOAM_RUN

 cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity .

 cd cavity

在cavity下面有这样三个文件夹。

 STYLEREF 1 \s 3 SEQ 图 \* ARABIC \s 1 2 cavity文件夹下所包含的内容

输入以下代码也能显示cavity文件夹下的目录结构,结果如 REF _Ref12108237 \h 图 3‑3
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000D0000005F00520065006600310032003100300038003200330037000000
所示:

 tree $FOAM_RUN/cavity

图3-3 在BlueCFD终端下查看cavity文件夹下所包含的内容

一般case文件夹包括三个子文件夹,每部分的内容分别是:

0:存储物理量的初始值

——p:存储初始时刻的压力

——U:存储初始时刻的速度

constant:存储网格参数、边界条件以及物理属性(如材料参数、湍流参数等)

——polyMesh:blockMesh生成的网格文件

——transportProperties:物理特性

system:存储求解控制参数

——blockMeshDict:blockMesh网格控制文件

——controlDict:求解时间步的控制参数和输出控制参数

——fvScheme:离散格式

——fvSlotion:算法格式

上述内容参考:【流沙】的博客http://blog.sina.com.cn/s/blog_599d8faa0102wq09.html

3.2  前处理(pre-processing)

OpenFOAM默认按照三维笛卡尔坐标运行,lid-driven cavity的算例是二维的运动,所以通过设置 empty 的边界条件实现二维的计算。

3.2.1 创建几何并生成网格

本例采用OpenFOAM自带的网格生成器blockMesh实现,包含网格信息的文件名为blockMeshDict,放在目录cavicity/system下面。

 STYLEREF 1 \s 3 SEQ 图 \* ARABIC \s 1 4 blockMeshDict的存放位置

在BlueCFD终端输入以下代码可以查看文件的内容:

 cat $FOAM_RUN/cavity/system/blockMeshDict

在终端显示结果如下:

 STYLEREF 1 \s 3 SEQ 图 \* ARABIC \s 1 5 blockMeshDict的内容

可以看到blockMeshDict大致包含以下几个部分的内容

1.       软件信息

 /*--------------------------------*- C++ -*----------------------------------*\

 | =========                 |                                                 |

 | \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |

 |  \\    /   O peration     | Version:  5                                     |

 |   \\  /    A nd           | Web:      www.OpenFOAM.org                      |

 |    \\/     M anipulation  |                                                 |

 \*---------------------------------------------------------------------------*/

 //说明基本信息

2.       基本参数

FoamFile

 {

     version     2.0;

     format      ascii;

     class       dictionary;

     object      blockMeshDict;

 }

3.       定义缩放比

 convertToMeters 0.1;    //说明缩放尺寸,即模型中1个几何单位代表0.1m

4.       定义顶点

 vertices                //定义了立方体的顶点坐标,8个顶点,编号0~7

 (

     (  )

     (  )

     (  )

     (  )

     (  0.1)

     (  0.1)

     (  0.1)

     (  0.1)

 );

 .       定义block和block的网格划分

 blocks

 (

     hex (       ) (  ) simpleGrading (  )

 );

 //定义了构成block立方体的所有点,x、y和厚度方向分别划分为20、20、1个网格,simpleGrading应该指的是网格的尺寸的比例

6.       定义边

 edges

 (

 );      //定义边 edge,这里是体网格,所i有没有edge

7.       定义边界

 boundary    //定义边界

 (

     movingWall      //定义顶部的运动壁面,外面的名字是边界面的名称

     {

         type wall;       //边界面的类型

         faces

         (

             (   )   //由3762四个点构成的面,其中按照顺序以右手法则确定法向量

         );

     }

     fixedWalls

     {

         type wall;

         faces

         (

             (   )

             (   )

             (   )

         );          //定义静止壁面

     }

     frontAndBack   

     {

         type empty;    //定义前面和后面均为empty以实现二维运动

         faces

         (

             (   )

             (   )

         );

     }

 );

8.       定义需要融合的部分

 mergePatchPairs

 (

 ); //list of patches to be merged

 blockMeshDict文件编写好后,在BlueMesh终端输入以下命令即可执行网格生成blockMesh

返回如图3‑6所示结果。

图3 SEQ 图 \* ARABIC \s 1 6 blockMesh生成网格返回的结果

3.2.2 查看网格

建议采用Paraview查看网格划分结果,为了保持Paraview一直打开,所以在调用Paraview的命令后面空格兵添加&符号:

 paraFoam &

 STYLEREF 1 \s 3 SEQ 图 \* ARABIC \s 1 7在Paraview中查看划分的网格

ParaView的使用也不太熟悉,做到这一步的时候真的感觉我是从零学起,哭辽。

注意先选定要绘制的part,点击apply之后再修改绘图的控制选项。

 STYLEREF 1 \s 3 SEQ 图 \* ARABIC \s 1 8在Paraview中设置显示网格划分的结果

3.2.3 边界设置和初始条件确定

因为整个过程从时刻

开始,所以如前文所述,初始条件放在0这个文件夹下面,包括压力(文件夹p)和速度(文件夹U)。首先看p文件包含的信息,如 REF _Ref12115268 \h 图 3‑9
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000D0000005F00520065006600310032003100310035003200360038000000
所示。

图3-9 p文件包含的信息

头文件略去,其余信息分析如下:

1.       量纲

一个7维向量来定义,每一维表示的量纲如 REF _Ref12115915 \h 表 3‑1
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000D0000005F00520065006600310032003100310035003900310035000000
所示:

表3-1 OpenFOAM的量纲

维度

物理量

SI单位

USCS单位

1

质量(Mass)

Kg

lbm

2

长度(Length)

m

ft

3

时间(Time)

s

s

4

温度(Temperature)

K

ºR

5

物质的量(Quantity)

mol

mol

6

电流(Current)

A

A

7

发光强度(Luminous intensity)

cd

cd

这个p文件里的量纲为m2s-2,即为运动压力(Kinematic pressure)的量纲

 dimensions      [  -    ];       //定义量纲,这里指运动压力

2.       场的初始条件

流场的每个控制点的数值,这里定义为均匀(uniform)并取为0

 internalField   uniform ;              //场的初始值,即流场的每个控制点值,这里定义为均匀(uniform)并取为0

3.       边界的初始条件

 boundaryField

 {

     movingWall

     {

         type            zeroGradient;

     }

     fixedWalls

     {

         type            zeroGradient;          //定义压力梯度为零,即法向压力梯度为零

     }

     frontAndBack

     {

         type            empty;            //empty使流动为二维

     }

 }

速度场的初始条件也是类似的:

 dimensions      
 dimension  [  -    ];   //速度的量纲 m/s
internalField uniform ( ); //定义速度场的初始值,注意速度场是个矢量,所以是定义的是向量 boundaryField //定义的边界的速度 { movingWall { type fixedValue; value uniform ( ); //和顶盖的移动速度一致 } fixedWalls { type noSlip; //无滑移壁面边界条件 } frontAndBack { type empty; //设置前后为empty来实现二维流动 } }

3.2.4 物理性质

物理性质通常定义在命名为 xxProperties 的文件中,对于本问题只需要定义运动粘度所以放在文件 tansportProperties 中,定义的代码如下:

 nu              [  -    ] 0.01;  //定义运动粘度nu,前面的向量为量纲

注意在这里,考虑雷诺数为10,根据那么运动粘度取值为0.01

3.2.5 时间控制

时间步的控制及相关的输出文件在system文件夹下的controlDict文件中。开始和结束时间是必须设定的,比如设定开始时间为0,这意味着OpenFOAM需要从名为0的文件夹中读取数据。这里将startFrom指定为startTime,并设定值为0,将stopAt指定为endTime,且指定为0.5s(即顶盖完整地划过10次)。

时间步长的关键词为deltaT,可以通过库朗数来确定,库朗数定义为:

其中

表示速度方向的网格尺寸,

为时间,需要保证在每一处地方

,考虑最极端的情况有:

 MACROBUTTON AMMPlaceRM \* MERGEFORMAT  SEQ AMEqn \h \* MERGEFORMAT (
SEQ AMEqn \c \* Arabic \* MERGEFORMAT 2)

反算得到

。指定OpenFOAM按照一定的时间步输出,那么就会在创建相应的时间步的文件夹如0,1.0,2.0等,将相关文件保存在其中。

 application     icoFoam;        //求解器选择icoFoam

 startFrom       startTime;       //指定开始的关键词

 startTime       ;               //指定开始时间

 stopAt          endTime;         //指定结束的关键词

 endTime         0.5;             //指定结束的时间

 deltaT          0.005;           //指定时间步长

 writeControl    timeStep;       //指定文件输出的方式:按照时间步输出

 writeInterval   ;             //每20个时间步输出一个结果

 purgeWrite      ;

 writeFormat     ascii;

 writePrecision  ;

 writeCompression off;

 timeFormat      general;

 timePrecision   ;

 runTimeModifiable true;

3.2.6 离散和求解器的设置(Discretisation and linear-solver settings)

若采用有限体积法,则离散格式的设定在system文件夹下的fvSchemes文件中,线性求解器和误差等算法格式的指定在system文件夹下的fvSolution文件中确定。对于本问题,当考虑为不可压缩流体时候,采用PISO算法,需要注意的本文采用的是相对压力(运动压力),所对需要指定pRefValue和pRefCell两个关键词。

3.3 求解(Running an application)

当前处理的每个部分都设置好之后,求解实质上就调用求解器,对于低层流,这里调用icoFoam,并指定相应的算例文件:

 icoFoam -case $FOAM_RUN/cavity

 STYLEREF 1 \s 3 SEQ 图 \* ARABIC \s 1 10计算结束后生成0.1~0.5结果的文件夹

3.4 后处理(Post-processing)

后处理也是熟悉Paraview的一个重要过程

1.       点击apply,确保cavity.foam左边地小眼睛是蓝色的。

2.       选择要编辑的物理量,点击Edit,在右边可以调整绘图的选项。

point icon和 cell icon 的区别:

point icon以每个单元的值插值后绘制

cell icon 每个单元只有赋一个值

3.       【略,妈的paraview好难上手】

3.5 加密网格

3.5.1 在原来算例的基础上创建新的算例

首先创建cavityFine的算例文件夹,并将原始cavity的文件的设置文件constant和system文件夹拷贝到新的算例文件夹下

 mkdir cavityFine
cp -r cavity/constant cavityFine
cp -r cavity/system cavityFine
cd cavityFine

3.5.2 修改blockMesh文件

修改blockMesh将网格尺寸变为(40,40,1),,保存文件后重新输入命令blockMesh即可生成需要的网格。

!!!注意!!!我发现在blueCFD中,当修改网格文本之后,首先要退回到run文件夹下重新进入cavityFine这个时候才能读取更新后的网格文本。

3.5.3 把粗网格的结果映射到细网格上

mapFields命令能够将一个几何的场结果映射到另一个几何上面,本例中粗细网格的几何和边界都是一样的,因此在调用mapFields命令时输入的参数选项为-consistent,并将粗网格的最后的结果映射到细网格开始的时刻(细网格中controlDict的startTime相应地要改为0.5):

 mapFields $FOAM_RUN/cavity -consistent -sourceTime ‘latestTime’

由于网格尺寸减小了,根据库朗数控制的时间步长也要调整为0.0025s,将输出控制从timeStep改为从runTime输出,每0.1s输出一次结果,因此writeInterval改为0.1。注意因为cavityFine的startTime改为0.5了,所以endTime应该改为0.7s。

 //…

 application     icoFoam;

 startFrom       startTime;

 startTime       0.5;

 stopAt          endTime;

 endTime         0.7;

 deltaT          0.0025;

 writeControl    runTime;

 writeInterval   0.1;

 //…

可以看到运行icoFoam后,从0.5s开始算到了0.7s,且计算过程没有输入到blueCFD的终端上,而是放在了日志文件中:

计算的结果可以看到从0.5s(20网格)到0.7s(40网格)的变化过程

【OpenFOAM】——OpenFOAM入门算例学习的更多相关文章

  1. OpenFOAM在原有算例上新建算例(只拷贝0,system,constant)

    原视频下载地址: https://yunpan.cn/cMpyBHSEvC7T4  (提取码:dca4)

  2. Fluent算例精选|02瞬态滑移网格分析叶轮机械内部流动

    本算例使用的软件:fluent.icem 通过学习本算例您将获得? 1.学会周期区域创建 2.学会瞬态求解器及滑移网格边界条件设置 3.学会周期面.滑移面设置 4.学会如何监测压力脉动(声学仿真) 5 ...

  3. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  4. 以 BZOJ 2002 为例学习有根树LCT(Link-Cut Tree)

    以BZOJ 2002 弹飞绵羊为例学习有根树LCT(Link-Cut Tree) 注:本文非常简单,只涉及有根树LCT,对于无根树,LCT还有几个本文没有提到的操作,以后慢慢更新 =v= 知识储备 [ ...

  5. Fluent算例精选|03利用VOF和蒸发-冷凝模型

    通过学习本算例您将获得? 1.学会基本的VOF模型设置流程 2.学会利用蒸发-冷凝模型来模拟传热沸腾 目录 1摘要4 2传热沸腾模型介绍4 3前处理4 4求解设置5 4.1启动Fluent5 4.2网 ...

  6. CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL

    CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL +BIT祝威+悄悄在此留下版了个权的信息说: 开始 本文用step by step的方式,讲述如何使 ...

  7. Struts2入门3 深入学习

    Struts2入门3 深入学习 处理结果和异常 前言: Struts学习的差不多了,还有最后的一点就收官了就是结果处理和异常处理.前面学习Struts主要围绕就是Action以及struts.xml配 ...

  8. 【特别推荐】Node.js 入门教程和学习资源汇总

    这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...

  9. 模式识别 - 处理多演示样例学习(MIL)特征(matlab)

    处理多演示样例学习(MIL)特征(matlab) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27206325 多演示样例学习( ...

随机推荐

  1. MT6755 使用R63350 IC 出现唤醒概率性闪白,并导致ESD FAIL

    现象描述. 手机自动灭屏后按power键或home 键点亮屏幕,概率性上方有白色的一道,还会闪两三下屏.使用的LCM IC是:r63350, (FHD VDO)屏,附件为mtklog看看是什么原因? ...

  2. [转]fedora国内源常见配置

    1.参考:1.http://mirrors.ustc.edu.cn/2.http://mirrors.fedoraproject.org/publiclist#CN3.http://mirrors.n ...

  3. 【2018 Multi-University Training Contest 5】

    01: 02:https://www.cnblogs.com/myx12345/p/9436953.html 03: 04: 05:https://www.cnblogs.com/myx12345/p ...

  4. msp430入门编程47

    msp430中C语言的人机交互--菜单退出 msp430入门编程 msp430入门学习

  5. ThinkPHP5 的入门学习

    与Tp3.2相比,有一下的不同: (1)目录名称的改变: tp3.2的目录命名首字母皆为大写,例如:Application.Public.Controller.Model.View.ThinkPHP. ...

  6. Back弹出AlertDialog

    package com.pingyijinren.helloworld.activity; import android.content.DialogInterface; import android ...

  7. Maven 手动添加本地jar包

    mvn install:install-file -Dfile=jar绝对路径 -DgroupId=项目组织唯一的标识符 -DartifactId=项目的唯一的标识符 -Dversion=jar版本 ...

  8. dnsmasq possible DNS-rebind attack detected错误

    最近在做openwrt的平台,dns使用的是dnsmasq,但是通过板子上网,将PC的dns设置成板子的时候,发现百度等都可以,但是公司邮箱打不开.公司邮箱的域名 xx-xx-notes.xxx.co ...

  9. nyoj473 A^B Problem (高速幂)

    题目473 题目信息 执行结果 pid=473" style="text-decoration:none; color:rgb(55,119,188)">本题排行 ...

  10. 如何更有效的消灭watchdogs挖矿病毒?华为云DCS Redis为您支招

    漏洞概述 近日,互联网出现watchdogs挖矿病毒,攻击者可以利用Redis未授权访问漏洞入侵服务器,通过内外网扫描感染更多机器.被感染的主机出现 crontab 任务异常.系统文件被删除.CPU ...