openFoam网格绘制总结笔记

目录

1. 如何运行一个算例

1)openFOAM结构

2)网格生成

3)计算的运行与结果查看

2. openFOAM的网格生成逻辑

1)openFOAM网格的生成方式

Points

Faces

Owner

Neighbor

2)边界条件的设定 

3. blockMeshDict代码阅读

1)convertToMeters

2)vertices

3)blocks

 单级网格划分

多等级网格划分

4)edges

5)boundary

 6)mergePatchPairs

 7)Example

4. snappyHexMesh

1)简介

生成流程

2)背景网格blockMesh

3)全局参数(Global)

全局网格细化参数 castellatedMeshControls

4)面贴合参数

5)面加密(refinementSurfaces)

6)体加密(refinementRegions)

平面切割(searchablePlane)

细化小特征gapMode

7)边界层(addLayersControls)

基本参数设置

高级控制参数设置:

表面网格最大纵横比(maxFaceThicknessRatio)

8)网格质量控制(meshQualityControls)

5. 画网格工具

1) Pointwise

2)Ansys workbench meshing


1. 如何运行一个算例

openFOAM网格绘制教程1:如何运行一个算例 - 知乎

1)openFOAM结构

在这个文件系统中system存储的是算例求解的一些基本信息,主要包含三个文件:

controlDict:这个文件中有一系列参数可以控制计算的起始时间,时间步长,输出精度等。

fvSchemesfvSolution:主要规定了CFD的离散格式以及求解方法等,要了解这两个文件的设置需要有一定的流体力学基础。

此外还有一个blockMeshDict文件,这个文件的作用就是为blockMesh命令输入参数,我们会在3.2节详细介绍再说。

constant:文件夹下面主要存储了计算过程中的一些常量和网格数据。

在没有绘制网格前constant文件夹下并不包含网格数据,在这个例子中它只有一个transportProperties文件,用于规定流体的运动黏度。

此外在算例文件夹下还有一系列时间文件夹,在没有进行模拟前只有一个0文件夹,这个文件夹定义的是流体模拟初始时刻的温度,压力等各种场量以及它们所满足的边界条件。

2)网格生成

在对openFOAM的文件系统有所了解之后,我们的第一步就是绘制网格。众所周知,绘制网格需要向计算机提供一系列参数,而这些参数就储存在blockMeshDict字典文件之中。在已经编写好blockMeshDict文件之后,我们只需要在算例文件夹下打开终端,然后在终端中输入如下命令,并按Enter键执行。

blockMesh

这个过程中,计算机就会调用blockMeshDict,并生成网格。

我们如果修改blockMeshDict中的设定,计算机就会生成相应的网格,来满足我们需求。

在输入blockMesh并成功运行之后,我们会发现constant文件夹下多出了一个polyMesh文件夹,实际上这个文件夹就储存了我们计算所需要的网格。

3)计算的运行与结果查看

在完成网格划分后我们在终端中输入命令:

icoFoam

这个命令会让计算机调用我们案例文件夹下所有相关的输入文件,将其输入icoFoam求解器,然后完成计算。在计算完成后我们会发现案例文件夹下多出了一系列时间文件夹,名称分别为0.1, 0.2 ,0.3 ,0.4 ,0.5 。这实际上就是计算机计算的结果,包含了各个时间下这个空腔内流体的压力与速度分布。

如果我们需要对这个计算结果进行可视化查看,我们可以通过在终端输入命令:

paraFoam

这个命令可以调用openFOAM的后处理程序paraView对数据结果进行处理,我们可以根据需要对网格进行查看或者绘制计算结果的云图或矢量图。

2. openFOAM的网格生成逻辑

openFOAM网格绘制教程2:openFOAM的网格生成逻辑 - 知乎

1)openFOAM网格的生成方式

openFOAM的网格本身,也就是openFOAM是如何告诉计算机这些网格的大小,形状,位置,以及连接顺序的。

在构建网格的过程中openFOAM首先确定是所有网格点的坐标,再由一系列点生成面,由面生成网格单元,这样一来网格单元的大小,形状,位置就被唯一确定了下来。然后再通过面与网格单元的从属相邻关系,确定网格的连接关系。

我们结合上一讲的案例来看,我们首先打开polyMesh文件夹,发现下面有一系列文件。分别为pointsfacesownerneighborboundary

Points

其中points文件就是一个存储了所有网格结点的列表,如其基本格式如下:

图中点的定义遵循以下格式:

点的总数量

(

(点0坐标)

(点1坐标)

……

(点N坐标)

)

文件中第一行为模型中点的总数量,随后小括号内就是一系列点的列表,这个列表中每一个行存储了一个节点的坐标。同时这个列表中的点是带有编号的,这个编号从0开始。也就是说第0个点的坐标是(0 0 0),第1个点的坐标是(0.005 0 0)以此类推。

Faces

有了点的坐标之后我们就可以利用这些点的坐标来围成面,因此就有了faces文件。

face文件的基本格式如下:

面的数量

(

构成面1的点数(点编号1 点编号2 点编号3 ……)

构成面2的点数(点编号1 点编号2 点编号3 ……)

......

构成面N的点数(点编号1 点编号2 点编号3 ……)

)

 faces文件的第一行是面的数量,接着小括号内部标出的是面的列表,这个列表同样是带有编号的,编号从0开始。另外openFOAM在对面进行编号的时候会优先对网格的内部面进行编号,在此之后再给边界面编号。每一行的内容中,括号外的数字表示这个面有几个点组成,括号内的数字则是这些点的编号,点的编号与points文件中的编号一致。另外还要注意这些点的书写有一定的顺序要求,必须按照右手螺旋定则来进行书写。

Owner

在有了面以后,我们就需要用这些面来生成网格单元。openFOAM中生成网格单元的方法是:首先计算系统内有多少个网格,然后给每个网格单元一个序号。接着在owner这个文件中,指定每一个面从属于一个特定的网格。这样当每一个面都被分配从属于一个特定的网格之后,相当于我们知道了每一个网格是由哪些面围成的。这样一来我们就知道了每一个网格的大小,形状和位置。owner文件示例如下:

owner文件代码基本格式如下:

面的总数量

(

面0从属的网格编号

面1从属的网格编号

……

面N从属的网格编号

)

在这段代码中,第一行1640表示面的数量,括号内每一行表示对应编号的面所从属的网格编号。例如第一行表示的就是0号面从属于0号网格,第二行表示的就是1号面从属于0号网格,以此类推。

Neighbor

最后我们再确定网格之间的连接关系,我们知道对于一个内部的网格面,它实际上连接着两个网格的,在前一步中我们已经指定了它从属于哪一个网格,因此再下一步中我们只需要指定它与哪一个网格相邻就可以了,相关的信息就存储在neighbor文件中。

neighbor文件的代码格式如下:

内部面数量

(

面0相邻的网格

面1相邻的网格

……

面N相邻的网格

)

代码的第一行表示了这个模型中有760个内部面,括号内每一行表示对应编号的面所相邻的网格编号。例如第一行表示的就是0号面相邻于1号网格,第二行表示的就是1号面相邻于20号网格,以此类推。

2)边界条件的设定 

在一个网格文件中实际上包含两类网格,一类是内部网格,一类是边界网格,对于边界网格我们需要指定其边界条件,边界条件对于CFD的计算必不可少。,

这也要求我们在绘制网格的过程中还需要提供边界信息,具体而言就是一个边界包含哪些网格,这个边界属于哪种类型。这一系列指定需要在boundary文件中进行。打开boundary以后我们就可以看到一个典型的边界定义如下(忽略文件头):

代码的首行为边界的数量,括弧内为各个边界的详细定义,其中的movingWall就是用户给边界定下的名称。对于每一个边界大括号内给定了与这个边界名称相关的三个参数:type设定了这个边界的类型,nFaces表明了这个边界包含的面的数量,startFace指的是这个边界的起始面编号。

边界数量

(

边界1名称

{

type 边界1类型;

nFaces 边界1面数量;

startFace 边界1起始面;

}

边界2名称

{

type 边界2类型;

nFaces 边界2面数量;

startFace 边界2起始面;

}

……

)

3. blockMeshDict代码阅读

这个slide图文并茂解释的特别清晰:

Slide 1 (openfoamwiki.net)

zT​​​​​​​BlockMesh笔记 - 知乎

通过编写blockMeshDict文件 blockMesh划分网格

1)convertToMeters

convertToMeters 0.001;

字面上的意思就是将单位转换成m,在文件中是转换因子的意思。例如在输入的量为mm时,convertToMeter为0.001。

2)vertices

 几何图形的顶点坐标,几何图形的顶点排序从0开始依次增加,坐标系原点为集合图形的第一个点0点。顶点定义的顺序代表了顶点的序号,第一个定义的为0,第二个定义的为1,以此类推。

3)blocks

由下面代码表示

 单级网格划分

hex (0 1 2 3 4 5 6 7) ($xcells $ycells $zcells) simpleGrading (1 1 1)

hex表示的是六面体,(0 1 2 3 4 5 6 7)是vertices里面定义的几何图形的顶点编号,八个顶点表示一个六面体。

($xcells $ycells $zcells)表示的是X,Y,Z方向上几何图形的网格数,计算过程如下

```c++ xmin 0;//几何图形X方向起点 xmax 1;//几何图形X方向终点 ymin 0;//几何图形Y方向起点 ymax 1;//几何图形Y方向终点 zmin 0;//几何图形Z方向起点 zmax 1;//几何图形Z方向终点

deltax 0.05;//X方向单元格间距 deltay 0.05;//Y方向单元格间距 deltaz 0.05;//Z方向单元格间距

lx #calc "$xmax - $xmin";//X方向上的长度 ly #calc "$ymax - $ymin";//Y方向上的长度 lz #calc "$zmax – $zmin";//Z方向上的长度

xcells #calc "round($lx/$deltax)";//X方向上网格数 ycells #calc "round($ly/$deltay)";//Y方向上网格数 zcells #calc "round($lz/$deltaz)";//Z方向上网格数 ```

在编写blockMeshDict的时候可以不写以上的计算代码,直接在block中给定即可。

simpleGrading(1 2 3)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值