
- 网格划分流程:
- 画好一个模型文件并定义好patch (用来指定边界条件),导出为
.stl文件并放置到算例目录下。 - 设置好meshDict文件*(用来指定详细的网格划分方法,位于system目录下)*,类似
blockMeshDict文件。 - 类似
blockMesh指令,在终端中输入cartesianMesh,开始自动划分网格,生成polyMesh文件目录。
- 画好一个模型文件并定义好patch (用来指定边界条件),导出为
1.建造模型
- 选取仿真软件,这里用的是onshape进行建模。进行二维仿真,草图要在X—Y轴平面进行绘制,并且只需要拉伸草图边界以形成三维模型。


- 到这里建模完成,但是还没有指定patch,导出为
.stl文件,这里使用COMSOL进行划分patch以指定边界条件。- 创建patch: 打开COMSOL,点击主屏幕---添加组件---三维模型----导入----导出 (选择导出为二进制的.stl文件)。

2.将.stl文件转换为.fms文件
.stl文件转换为.fms文件,再利用.fms来生成网格,这样可以创建质量更好的网格质量。在.stl所在的目录下打开终端输入surfaceToFMS name.stl,就会在当前目录下生成名为name.fms的文件。.fms文件可以以文本的形式打开,这样也方便对从COMSOL中导出模型的patch名称与类型进行重设定,.fms样式如下:

3.cfMesh简单生成网格
- 进入cfMesh教程文件
hatOctree,里面已经有了.fms文件与meshDict文件,简单的meshDict内容如下:
/*--------------------------------*- C++ -*----------------------------------*
| ========= | |
| / F ield | cfMesh: A library for mesh generation |
| / O peration | |
| / A nd | Author: Franjo Juretic |
| / M anipulation | E-mail: franjo.juretic@c-fields.com |
*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object meshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
maxCellSize 0.01; //默认最大网格尺寸
surfaceFile "geom.fms"; //生成网格的模型文件
boundaryLayers //边界层的默认设置
{
nLayers 6; //边界层层数6
thicknessRatio 1.2; //前一层边界层与后一层边界层的比值
}
// ************************************************************************* //
- 在算例目录下打开终端,输入
cartesian2DMesh,生成polyMesh文件目录,网格划分完毕。

- 打开paraview可查看网格

4.修改cfMesh文件对网格进行细化
- 使用的模型:

- 使用的
meshDict文件内容:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
surfaceFile "2Dsks_comsol.fms";
minCellSize 1.5;
maxCellSize 1.5;
boundaryCellSize 0.1;
localRefinement
{
"channalwall1.*"
{
cellSize 0.2;
additonalRefinementLevels 5;//maxCellSize/2的n次方,n为additionalRefinementLeverls的值。同时具有cellSize和additonalThickness时优先选择后者。
refinementThickness 0.8;//定义细化区的厚度,单位为m
}
"channalwall2.*"
{
cellSize 0.2;
additonalRefinementLevels 5;//maxCellSize/2的n次方,n为additionalRefinementLeverls的值。同时具有cellSize和additonalThickness时优先选择后者。
refinementThickness 0.8;//定义细化区的厚度,单位为m
}
}
objectRefinements
{
boxExample
{
type box;
cellSize 0.3;
centre (153.5 0 5);
lengthX 107;
lengthY 16;
lengthZ 12;
}
sphereExample1
{
type sphere;
cellSize 0.5;
centre (100 0 5);
radius 20;
refinementThickness 20;
}
sphereExample2
{
type sphere;
cellSize 0.5;
centre (207 0 5);
radius 20;
refinementThickness 20;
}
}
boundaryLayers
{
/* nLayers 5;
thicknessRatio 1.1;
maxFirstLayerThickness 2;
*/
patchBoundaryLayers
{
"channalwall1.*"
{
nLayers 7; //nuber of layers (optional)
thicknessRatio 1.3;
maxFirstLayerThickness 0.1;
allowDiscontinuty 1;
}
"channalwall2.*"
{
nLayers 7; //nuber of layers (optional)
thicknessRatio 1.3;
maxFirstLayerThickness 0.1;
allowDiscontinuty 1;
}
}
optimiseLayer 1;
untangleLayers 0;
optimisationParameters
{
nSmoothNorms 6;
maxNumIteration 7;
featuresSizeFactor 0.4;
recalculateNormals 1;
relThicknessTol 0.01;
}
- 生成的网格如下:

meshDict文件的详细讲解
surfaceFile "2Dsks_comsol.fms"; //生成网格所用的模型文件
minCellSize 1.5; //默认的最小网格尺寸
maxCellSize 1.5; //默认网格的最大尺寸
boundaryCellSize 1.5; //默认的边界层尺寸
这三个选项为默认选项,即如果没有做另外的局部细化,则默认网格大小为以上设置的数值,只设置这几个参数也可生成网格,如下:

- patch局部加密,下面的代码用来加密指定patch临近的网格。
localRefinement
{
"channalwall1.*" //指定patch名
{
cellSize 0.2; //指定网格尺寸
additonalRefinementLevels 5;//maxCellSize/2的n次方,n为additionalRefinementLeverls的值。同时具有cellSize和additonalThickness时优先选择后者。
refinementThickness 0.8;//定义细化区的厚度,单位为m
}
"channalwall2.*"
{
cellSize 0.2;
additonalRefinementLevels 5;//maxCellSize/2的n次方,n为additionalRefinementLeverls的值。同时具有cellSize和additonalThickness时优先选择后者。
refinementThickness 0.8;//定义细化区的厚度,单位为m
}
}
在只有默认参数设定的基础上加入localRefinement字段,效果如下:

- 区域加密,一个形状的区域(此区域形状可为长方体区域,球型区域等,具体可详见用户指南)
objectRefinements
{
boxExample
{
type box; //加密区域类型,这里为长方体
cellSize 0.3; //区域网格尺寸
centre (153.5 0 5); //长方体的中心坐标
lengthX 107; //X方向长度,即长方体的长
lengthY 16; //Y方向长度,即长方体的宽
lengthZ 12; //Z方向长度,即长方体的高
}
继续在上面的基础上增加区域加密,效果图如下:

这里的波浪通道处于矩形区域之中,可见通道被全部加密。但是由于locaRifinement定义的网格尺寸比objectRefine定义的小,所以不会受到影响。若几个加密区域有重叠部分,重叠部分的网格尺寸以较小尺寸网格的区域为准,且不同网格尺寸之间会自动调整过度区域网格。如下,定义的球形加密区域与长方体加密区域有重叠部分,因为长方体加密区域的尺寸更小,所以重叠部分以长方体加密区域的网格尺寸为准,并且球形加密区域会有自动过渡。
sphereExample1 //加密区域名字
{
type sphere; //加密区域类型(这里是球形)
cellSize 0.5; //加密区域网格尺寸
centre (100 0 5); //球形加密区域球心
radius 20; //球形加密区域半径
refinementThickness 20;
}
sphereExample2
{
type sphere;
cellSize 0.5;
centre (207 0 5);
radius 20;
refinementThickness 20;
}

- 边界层网格设置
- 全局边界层默认设置
- 边界层网格设置
boundaryLayers
{
nLayers 5; //边界层数
thicknessRatio 1.1; //后一层边界层网格与前一层边界层网格厚度的比值
maxFirstLayerThickness 2; //最外层边界层的最大厚度
}
加上这段代码后,未特殊指定加密的边界层将全部默认为这里设定的参数,效果如下:

- 指定边界层设置
patchBoundaryLayers
{
"channalwall1.*" //指定patch名称
{
nLayers 7; //边界层层数
thicknessRatio 1.3; //后一层边界层网格与前一层边界层网格的比例
maxFirstLayerThickness 0.1; //最外层边界层的最大厚度
allowDiscontinuty 1; //允许边界层时候连续
}
- 边界层网格大小的一些参数设置
optimiseLayer 1;
untangleLayers 0;
optimisationParameters
{
nSmoothNorms 6; //光顺边界层法向量过程中的迭代次数,不是必须的的,默认值是5
maxNumIteration 7; //平滑过程中的迭代次数,不是必须的的,它的默认值是5
featuresSizeFactor 0.4; //最大允许的层厚度与估计的特征尺寸之间的比率。在以曲率为主的区域,它被用来限制层的厚度。它不是强制的,它的有效范围在0和1之间。默认值是0.3。
recalculateNormals 1; //计算表面法向量,并对齐边界层边缘使其指向法向量方向。该设置不是强制性的,在默认情况下是开启的。
relThicknessTol 0.01; //范围为0-无穷,值越小,边界层网格之间的厚度分布越均匀
}
5.cfMesh的安装
- 在
OpenFOAM/OpenFOAM-6目录中打开终端,输入下列命令:
git clone https://github.com/blueCFD/cfMesh.git cfmesh
cd cfmesh
git checkout development-OF5x
./Allwmake -j //进行编译
等待编译完成,编译时间一般5分钟到20分钟,看电脑性能而定。
1.不用onshape直接指定patch,是因为还没有找到有关的详细操作,没有学会;但是在偶然之间发现COMSOL可以自动划分patch,所以才用了上面这个笨办法。如果哪位大神知道如何直接在onshape中指定patch,或者有其他更好的方法,还请评论留个言,让我学习一下。
版权声明:本文为weixin_34193397原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。