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

scale   1;

// Geometric parameters
rInner  0.5;
rOuter  1;
xmax    2;
ymax    2;

zmin   -0.5;  // Back/front locations
zmax    0.5;

// Divisions: Radial, quarter circumference, outer region and z-directions.
nRadial  10;
nQuarter 10;
nxOuter  20;
nyOuter  20;
nz       1;

// ----------------

// Derived quantities
rInner45    ${{ $rInner * sqrt(0.5) }};
rOuter45    ${{ $rOuter * sqrt(0.5) }};

vertices #codeStream
{
    codeInclude
    #{
        #include "pointField.H"
    #};

    code
    #{
        pointField points
        ({
            /* 0*/ { $rInner, 0, $zmin },
            /* 1*/ { $rOuter, 0, $zmin },
            /* 2*/ { $xmax, 0, $zmin },
            /* 3*/ { $xmax, $rOuter45, $zmin },
            /* 4*/ { $rOuter45, $rOuter45, $zmin },
            /* 5*/ { $rInner45, $rInner45, $zmin },
            /* 6*/ { $xmax, $ymax, $zmin },
            /* 7*/ { $rOuter45, $ymax, $zmin },
            /* 8*/ { 0, $ymax, $zmin },
            /* 9*/ { 0, $rOuter, $zmin },
            /*10*/ { 0, $rInner, $zmin },
            /*11*/ { -$rInner, 0, $zmin },
            /*12*/ { -$rOuter, 0, $zmin },
            /*13*/ { -$xmax, 0, $zmin },
            /*14*/ { -$xmax, $rOuter45, $zmin },
            /*15*/ { -$rOuter45, $rOuter45, $zmin },
            /*16*/ { -$rInner45, $rInner45, $zmin },
            /*17*/ { -$xmax, $ymax, $zmin },
            /*18*/ { -$rOuter45, $ymax, $zmin }
        });

        // Duplicate z points for zmax
        const label sz = points.size();
        points.resize(2*sz);
        for (label i = 0; i < sz; ++i)
        {
            const point& pt = points[i];
            points[i + sz] = point(pt.x(), pt.y(), $zmax);
        }

        os  << points;
    #};
};

// Can remove unneeded variables
#remove ( "r(Inner|Outer).*"  "[xy](min|max)" )

blocks
(
    hex (5 4 9 10 24 23 28 29)    ($nRadial  $nQuarter $nz) grading (1 1 1)
    hex (0 1 4 5 19 20 23 24)     ($nRadial  $nQuarter $nz) grading (1 1 1)
    hex (1 2 3 4 20 21 22 23)     ($nxOuter  $nQuarter $nz) grading (1 1 1)
    hex (4 3 6 7 23 22 25 26)     ($nxOuter  $nyOuter  $nz) grading (1 1 1)
    hex (9 4 7 8 28 23 26 27)     ($nQuarter $nyOuter  $nz) grading (1 1 1)
    hex (15 16 10 9 34 35 29 28)  ($nRadial  $nQuarter $nz) grading (1 1 1)
    hex (12 11 16 15 31 30 35 34) ($nRadial  $nQuarter $nz) grading (1 1 1)
    hex (13 12 15 14 32 31 34 33) ($nxOuter  $nQuarter $nz) grading (1 1 1)
    hex (14 15 18 17 33 34 37 36) ($nxOuter  $nyOuter  $nz) grading (1 1 1)
    hex (15 9 8 18 34 28 27 37)   ($nQuarter $nyOuter  $nz) grading (1 1 1)
);

edges
(
    // Inner cylinder
    arc  0  5 origin (0 0 $zmin)
    arc  5 10 origin (0 0 $zmin)
    arc  1  4 origin (0 0 $zmin)
    arc  4  9 origin (0 0 $zmin)
    arc 19 24 origin (0 0 $zmax)
    arc 24 29 origin (0 0 $zmax)
    arc 20 23 origin (0 0 $zmax)
    arc 23 28 origin (0 0 $zmax)
    // Intermediate cylinder
    arc 11 16 origin (0 0 $zmin)
    arc 16 10 origin (0 0 $zmin)
    arc 12 15 origin (0 0 $zmin)
    arc 15  9 origin (0 0 $zmin)
    arc 30 35 origin (0 0 $zmax)
    arc 35 29 origin (0 0 $zmax)
    arc 31 34 origin (0 0 $zmax)
    arc 34 28 origin (0 0 $zmax)
);

boundary
(
    down
    {
        type symmetryPlane;
        faces
        (
            (0 1 20 19)
            (1 2 21 20)
            (12 11 30 31)
            (13 12 31 32)
        );
    }
    right
    {
        type patch;
        faces
        (
            (2 3 22 21)
            (3 6 25 22)
        );
    }
    up
    {
        type symmetryPlane;
        faces
        (
            (7 8 27 26)
            (6 7 26 25)
            (8 18 37 27)
            (18 17 36 37)
        );
    }
    left
    {
        type patch;
        faces
        (
            (14 13 32 33)
            (17 14 33 36)
        );
    }
    cylinder
    {
        type symmetry;
        faces
        (
            (10 5 24 29)
            (5 0 19 24)
            (16 10 29 35)
            (11 16 35 30)
        );
    }
);

mergePatchPairs
(
);


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