3 设置网格数的大小_cfMesh使用笔记(2D网格)

b4ef626d0d3c77553b89d6631433d6bf.png
  • 网格划分流程:
    • 画好一个模型文件并定义好patch (用来指定边界条件),导出为.stl文件并放置到算例目录下。
    • 设置好meshDict文件*(用来指定详细的网格划分方法,位于system目录下)*,类似blockMeshDict文件。
    • 类似blockMesh指令,在终端中输入cartesianMesh,开始自动划分网格,生成polyMesh文件目录。

1.建造模型

  • 选取仿真软件,这里用的是onshape进行建模。进行二维仿真,草图要在X—Y轴平面进行绘制,并且只需要拉伸草图边界以形成三维模型。

3c55b838044910a8f8b4ed037a66692d.png

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

bcb561957b4f9aef04a9c6af3eb6ca4a.png

2.将.stl文件转换为.fms文件

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

efbcccd609ec29c4a2438616f88286d5.png

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文件目录,网格划分完毕。

e2f8819f50707fb66ff051e98b663c41.png
  • 打开paraview可查看网格

3ca45de7a35f0104eb933a3d611e6e2f.png

4.修改cfMesh文件对网格进行细化

  • 使用的模型:

5cabd2e9eaa23afc3258868c1255fbac.png
  • 使用的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;
    }


 
  • 生成的网格如下:

fc09556cf462d153c714bf8236a9077d.png
  • meshDict文件的详细讲解
surfaceFile "2Dsks_comsol.fms"; //生成网格所用的模型文件

minCellSize 1.5;    //默认的最小网格尺寸

maxCellSize 1.5;    //默认网格的最大尺寸

boundaryCellSize 1.5;   //默认的边界层尺寸


这三个选项为默认选项,即如果没有做另外的局部细化,则默认网格大小为以上设置的数值,只设置这几个参数也可生成网格,如下:

ca2a5fc1b99b2acb6854cc2d85996ca6.png
    • 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字段,效果如下:

4bcb7e0bccaa370c2a7709118fcccfa7.png
    • 区域加密,一个形状的区域(此区域形状可为长方体区域,球型区域等,具体可详见用户指南)
 objectRefinements
{
    boxExample
    {
 type        box;   //加密区域类型,这里为长方体
        cellSize    0.3;   //区域网格尺寸
        centre      (153.5 0 5); //长方体的中心坐标
        lengthX     107;   //X方向长度,即长方体的长
        lengthY     16;    //Y方向长度,即长方体的宽
        lengthZ     12;    //Z方向长度,即长方体的高
    }


继续在上面的基础上增加区域加密,效果图如下:

77748f202e59bd1802972e17556af8ec.png

这里的波浪通道处于矩形区域之中,可见通道被全部加密。但是由于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;
   }

 

334c096b020b194c2834a39386c312a0.png
    • 边界层网格设置
      • 全局边界层默认设置
 boundaryLayers
{
   nLayers 5;    //边界层数

    thicknessRatio 1.1;  //后一层边界层网格与前一层边界层网格厚度的比值

  maxFirstLayerThickness 2; //最外层边界层的最大厚度
 }


加上这段代码后,未特殊指定加密的边界层将全部默认为这里设定的参数,效果如下:

424f9b25f8a997391079305ec8ecc6f8.png
      • 指定边界层设置
 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版权协议,转载请附上原文出处链接和本声明。