/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  7
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

convertToMeters 1;

// 第一个圆柱体参数
radius1       0.038;
radiusNeg1   -0.038;
box1          0.015;
boxNeg1      -0.015;
zMin1         0.0;
zMax1         1.0;

// 网格密度参数
nR1          15;       // 圆柱体径向网格数 (增加以提高边界层分辨率)
nBox1        10;       // 中心块网格数
nZ1          100;      // 轴向网格数500

// 边界层参数
blRatio1      0.2;      // 径向方向上的边界层渐变比例 
blRatio2      5;


verbose no;

geometry
{
    cylinder1
    {
        type      searchableCylinder;
        point1    (0 0 -0.1);  // 延伸超出网格范围
        point2    (0 0  1.1);
        radius    $radius1;
    }
}

vertices
(
    // 底部 - 内部顶点
    ($boxNeg1 $boxNeg1 $zMin1)  // 0
    ($box1    $boxNeg1 $zMin1)  // 1
    ($boxNeg1 $box1    $zMin1)  // 2
    ($box1    $box1    $zMin1)  // 3

    // 底部 - 外部顶点
    project ($radiusNeg1 $radiusNeg1 $zMin1) (cylinder1)  // 4
    project ($radius1    $radiusNeg1 $zMin1) (cylinder1)  // 5
    project ($radiusNeg1 $radius1    $zMin1) (cylinder1)  // 6
    project ($radius1    $radius1    $zMin1) (cylinder1)  // 7

    // 顶部 - 内部顶点
    ($boxNeg1 $boxNeg1 $zMax1)  // 8
    ($box1    $boxNeg1 $zMax1)  // 9
    ($boxNeg1 $box1    $zMax1)  // 10
    ($box1    $box1    $zMax1)  // 11

    // 顶部 - 外部顶点
    project ($radiusNeg1 $radiusNeg1 $zMax1) (cylinder1)  // 12
    project ($radius1    $radiusNeg1 $zMax1) (cylinder1)  // 13
    project ($radiusNeg1 $radius1    $zMax1) (cylinder1)  // 14
    project ($radius1    $radius1    $zMax1) (cylinder1)  // 15
);

blocks
(
    // 为壁面附近增加边界层，根据各个块的几何位置调整渐变方向
    
    // 下块：从内部(0,1)到外部(4,5)方向渐变 - y方向(第2个参数)进行渐变
    hex (4 5 1 0 12 13 9 8)   ($nBox1 $nR1   $nZ1) simpleGrading (1 $blRatio2 1)
    
    // 左块：从内部(0,2)到外部(4,6)方向渐变 - x方向(第1个参数)进行渐变
    hex (4 0 2 6 12 8  10 14) ($nR1   $nBox1 $nZ1) simpleGrading ($blRatio2 1 1)
    
    // 右块：从内部(1,3)到外部(5,7)方向渐变 - x方向(第1个参数)进行渐变
    hex (1 5 7 3 9  13 15 11) ($nR1   $nBox1 $nZ1) simpleGrading ($blRatio1 1 1)
    
    // 上块：从内部(2,3)到外部(6,7)方向渐变 - y方向(第2个参数)进行渐变
    hex (2 3 7 6 10 11 15 14) ($nBox1 $nR1   $nZ1) simpleGrading (1 $blRatio1 1)
    
    // 中心块：保持均匀网格
    hex (0 1 3 2 8  9  11 10) ($nBox1 $nBox1 $nZ1) simpleGrading (1 1 1)
);

edges
(
    // 底部弧
    project 4 5 (cylinder1)
    project 5 7 (cylinder1)
    project 7 6 (cylinder1)
    project 6 4 (cylinder1)
    
    // 顶部弧
    project 12 13 (cylinder1)
    project 13 15 (cylinder1)
    project 15 14 (cylinder1)
    project 14 12 (cylinder1)
);

boundary
(
    cylinder1_wall_down
    {
        type wall;
        faces
        (
            (0 1 3 2)    // 底面中心块
            (0 2 6 4)    // 底面左块
            (0 1 5 4)    // 底面下块
            (1 5 7 3)    // 底面右块
            (2 3 7 6)    // 底面上块
        );
    }
    
    interface
    {
        type wall;
        faces
        (
            (8  9  11 10)  // 顶面中心块
            (8  10 14 12)  // 顶面左块
            (8  9  13 12)  // 顶面下块
            (9  13 15 11)  // 顶面右块
            (10 11 15 14)  // 顶面上块
        );
    }
    
    cylinder1_wall_sides
    {
        type wall;
        faces
        (
            (4 12 14 6)   // 左外壁
            (4 5  13 12)  // 下外壁
            (5 7  15 13)  // 右外壁
            (6 14 15 7)   // 上外壁
        );
    }
);

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

