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

// Information about topoSetSource types

cellSet_doc
{
    //- Select all external (boundary) faces.
    {
        source boundaryToCell;
    }


    //- Cells with cell centre within multiple boxes or single box
    {
        source  boxToCell;

        boxes   ((0 0 0) (1 1 1) (10 10 10)(11 11 11));
        // or
        box     (0 0 0) (1 1 1);
        // or
        min     (0 0 0);
        max     (1 1 1);
    }


    //- Copy elements from one or more other cellSets
    {
        source  cellToCell;
        sets    (c1 c2);
        // or
        set     c1;
    }


    //- Cells with centre within cylinder or cylinder annulus
    {
        source  cylinderToCell;
        p1      (0.2 0.2 -10); // start point on cylinder axis
        p2      (0.2 0.2 0);   // end point on cylinder axis
        radius  5.0;
        // optional
        innerRadius 1.0;
    }


    //- Cells with centre within cylinder annulus
    //  Can also simply use cylinderToCell
    {
        source  cylinderAnnulusToCell;
        p1      (0.2 0.2 -10); // start point on cylinder axis
        p2      (0.2 0.2 0);   // end point on cylinder axis
        outerRadius 5.0;
        innerRadius 1.0;
    }


    //- Select based on faceSet
    {
        source  faceToCell;
        sets    (f0 f1);
        // or
        set     f0;             // Name of faceSet

        //- selection option (mandatory)
        option any;             // cell with any face in faceSet
        // option all;          // cell with all faces in faceSet
        // option neighbour;    // cell with neighbour in faceSet
        // option owner;        // cell with owner in faceSet
    }


    //- Cells on master or slave side of faceZone
    {
        source  faceZoneToCell;
        zones   (".*Zone");     // Names of faceZones, word or regex
  // OR zone    ".*Zone";       // Name of faceZone, word or regex
        option  master;         // master/slave

        //- Compat
        // sourceInfo
        // {
        //     name    ".*Zone";
        //     option  master;
        // }
    }


    //- values of field within certain range
    {
        source  fieldToCell;
        field       U;      // Note: uses mag(U) since volVectorField
        min         0.1;
        max         0.5;
    }


    //- Select by explicitly providing cell labels
    {
        source  labelToCell;
        value   (12 13 56);   // labels of cells
    }


    //- Select based on number of neighbouring cells
    {
        source  nbrToCell;
        neighbours  4;   // min neighbours
    }


    //- Cells with cellCentre nearest to coordinates
    {
        source  nearestToCell;
        points  ((0 0 0) (1 1 1)(2 2 2));
    }


    //- Select cells associated with patch
    {
        source  patchToCell;
        patches ("patch.*");
        // or
        patch   somePatch;
    }


    //- Select based on pointSet
    {
        source  pointToCell;
        sets    (p0 p1);
        // or
        sets    p0;

        option any;         // cell with any point in pointSet
        //option edge;      // cell with an edge with both points in pointSet
    }


    //- Mesh region (non-face connected part of (subset of)mesh)
    {
        source  regionToCell;
        insidePoints ((1 2 3)); // points inside region to select
        set     c0;             // optional name of cellSet giving mesh subset
        nErode  0;              // optional number of layers to erode selection
    }


    //- Cells with cell centre within box
    // Is skewed, rotated box. Given as origin and three spanning vectors.
    {
        source  rotatedBoxToCell;
        origin  (0.2 0.2 -10);
        i       (0.2 0.2 0);
        j       (-0.2 0.2 0);
        k       (10 10 10);
    }


    //- Select cells with centres within a searchableSurface
    {
        source  searchableSurfaceToCell;
        surfaceType  triSurfaceMesh;  // The surface type
        surfaceName  blob.obj;        // Name for the IOobject
        // or
        surface      triSurfaceMesh;  // Same as surface type
    }


    //- Select based on cellShape
    {
        source  shapeToCell;
        shape   hex;     // hex/wedge/prism/pyr/tet/tetWedge/splitHex
    }


    //- Cells with centre within sphere
    {
        source  sphereToCell;
        origin  (0.2 0.2 -10);
        radius  5.0;
        // optional
        innerRadius 1.0;
    }


    //- Select based on surface
    {
        source  surfaceToCell;

        file            "geometry.stl";
        outsidePoints   ((-99 -99 -59));    // definition of outside
        includeCut      false;              // cells cut by surface
        includeInside   false;              // cells not on outside of surf
        includeOutside  false;              // cells on outside of surf
        nearDistance    -1;                 // cells with centre near surf
                                            // (set to -1 if not used)
        curvature       0.9;                // cells within nearDistance
                                            // and near surf curvature
                                            // (set to -100 if not used)
        // optional
        useSurfaceOrientation false;  // use closed surface inside/outside
                                      // test (ignores includeCut,
                                      // outsidePoints)
    }


    //- Cells underneath plane such that volume is reached.
    // E.g. for use in setFields to set the level given a wanted volume.
    {
        source  targetVolumeToCell;
        volume  2e-05;
        normal  (0 1 0);          // usually in direction of gravity
        // optional
        set     c0;               // restrict to named cellSet
    }


    //- Cells in cell zone
    {
        source  zoneToCell;
        zones   (".*Zone");     // Names of cellZones, word or regex
  // OR zone    ".*Zone";       // Name of cellZone, word or regex

        //- Compat
        // sourceInfo
        // {
        //     name    ".*Zone";
        // }
    }
}


faceSet_doc
{
    //- All boundary faces
    {
        source  boundaryToFace;
    }


    //- Faces with face centre within box ('box') or multiple boxes ('boxes')
    {
        source  boxToFace;

        boxes   ((0 0 0) (1 1 1) (10 10 10)(11 11 11));
        // or
        box     (0 0 0) (1 1 1);
        // or
        min     (0 0 0);
        max     (1 1 1);
    }


    //- Select based on cellSet
    {
        source  cellToFace;
        source  faceToCell;
        sets    (c0 c1);
        // or
        set     c0;             // Name of cellSet

        option all;             // All faces of cells
        //option both;          // Only faces with owner+neighbour in cellSet
    }


    //- Faces with centre within cylinder or cylinder annulus
    {
        source  cylinderToFace;
        p1      (0.2 0.2 -10); // start point on cylinder axis
        p2      (0.2 0.2 0);   // end point on cylinder axis
        radius  5.0;
        // optional
        innerRadius 1.0;
    }


    //- Faces with centre within cylinder annulus
    //  Can also simply use cylinderToCell
    {
        source  cylinderAnnulusToFace;
        p1      (0.2 0.2 -10); // start point on cylinder axis
        p2      (0.2 0.2 0);   // end point on cylinder axis
        outerRadius 5.0;
        innerRadius 1.0;
    }


    //- Copy elements from faceSet
    {
        source  faceToFace;
        set     f1;
    }


    //- Select by explicitly providing face labels
    {
        source  labelToFace;
        value  (12 13 56);      // labels of faces
    }


    //- Faces with normal to within certain angle aligned with vector.
    {
        source  normalToFace;
        normal  (0 0 1);        // Vector
        cos     0.01;           // Tolerance (max cos of angle)
    }


    //- All faces of patch
    {
        source  patchToFace;
        patches ("patch.*");
        // or
        patch   somePatch;

        // Compat
        sourceInfo
        {
            name ".*Wall";      // Name of patch or patch group,
        }
    }


    //- Select based on pointSet
    {
        source  pointToFace;
        sets    (p0 p1);
        // or
        set     p0;             // Name of pointSet

        option  any;           // Faces using any point in pointSet
        //option  all          // Faces with all points in pointSet
        //option  edge         // Faces with two consecutive points in pointSet
    }


    //- Walk on faces in faceSet, starting from face nearest given position
    {
        source  regionToFace;
        set     f0;
        nearPoint (0.1 0.1 0.005);
    }


    //- Select faces with centres within a searchableSurface
    {
        source  searchableSurfaceToFace;
        surfaceType  triSurfaceMesh;  // The surface type
        surfaceName  blob.obj;        // Name for the IOobject
        // or
        surface      triSurfaceMesh;  // Same as surface type
    }


    //- Faces with centre within sphere
    {
        source  sphereToFace;
        origin  (0.2 0.2 -10);
        radius  5.0;
        // optional
        innerRadius 1.0;
    }


    //- All faces of faceZone
    {
        source  zoneToFace;

        zones   (".*Zone");     // Names of faceZones, word or regex
  // OR zone    ".*Zone";       // Name of faceZone, word or regex

        // Compat
        // sourceInfo
        // {
        //     name ".*Zone1";
        // }
    }
}


pointSet_doc
{
    //- Points within multiple boxes or single box
    {
        source  boxToPoint;

        boxes   ((0 0 0) (1 1 1) (10 10 10)(11 11 11));
        // or
        box     (0 0 0) (1 1 1);
        // or
        min     (0 0 0);
        max     (1 1 1);
    }


    //- Points associated with cellSet
    {
        source  cellToPoint;
        sets    (c1 c2);
        // or
        set     c1;

        option  all;         // all points of cell
    }


    //- Points within cylinder or cylinder annulus
    {
        source  cylinderToPoint;
        p1      (0.2 0.2 -10); // start point on cylinder axis
        p2      (0.2 0.2 0);   // end point on cylinder axis
        radius  5.0;
        // optional
        innerRadius 1.0;
    }


    //- Points associated with faceSet
    {
        source  faceToPoint;
        sets    (f1 f2);
        // or
        set     f1;

        option  all;         // all points of face
    }


    //- Select by explicitly providing point labels
    {
        source  labelToPoint;
        value   (12 13 56);   // labels of points
    }


    //- Points nearest to coordinates
    {
        source  nearestToPoint;
        points  ((0 0 0) (1 1 1));
    }


    //- Copy elements from pointSet
    {
        source  pointToPoint;
        sets    (p1 p2);
        // or
        set     p1;
    }


    //- Points within a searchableSurface
    {
        source  searchableSurfaceToCell;
        surfaceType  triSurfaceMesh;  // The surface type
        surfaceName  blob.obj;        // Name for the IOobject
        // or
        surface      triSurfaceMesh;  // Same as surface type
    }


    //- Points centre within sphere
    {
        source  sphereToPoint;
        origin  (0.2 0.2 -10);
        radius  5.0;
        // optional
        innerRadius 1.0;
    }


    //- Select based on surface
    {
        source  surfaceToPoint;
        file            "geometry.stl";
        nearDistance    0.1;    // points near to surface
        includeInside   false;  // points on inside of surface
                                // (requires closed surface with consistent
                                //  normals)
        includeOutside  false;  //   ,,    outside  ,,
    }


    //- Points from pointZone
    {
        source  zoneToPoint;
        zones   (".*Zone");     // Names of pointZones, word or regex
  // OR zone    ".*Zone";       // Name of pointZone, word or regex

        //- Compat
        // sourceInfo
        // {
        //     name    ".*Zone";
        // }
    }
}


// cellZoneSet
// ~~~~~~~~~~~
// Manipulates a cellZone (as well as a cellSet)
// Takes any cellSet source. The difference with a cellSet is
// - reads the cells from the cellZone, not the cellSet
// - write to the cellZone as well as the cellSet

cellZoneSet_doc
{
    // For backwards compatibility:

    //- Select based on cellSet
    {
        source  setToCellZone;
        set     c0;           // name of cellSet
    }
}


// faceZoneSet
// ~~~~~~~~~~~
// Manipulates a faceZone (as well as a faceSet).
// It can only be used with special sources.

faceZoneSet_doc
{
    //- Select from another faceZone
    {
        source  faceZoneToFaceZone;
        zone    z1;             // Zone name, no regex
    }


    //- Select based on surface. Orientation from normals on surface
    {
        source  searchableSurfaceToFaceZone;
        surfaceType searchableSphere;
        surfaceName blob.obj;        // Optional name if surface triSurfaceMesh

        // or
        surface searchableSphere;    // Same as 'surfaceType'

        // Parameters for surface
        origin  (0.05 0.05 0.005);
        radius  0.025;
    }


    //- Select based on faceSet, using supplied normal to determine orientation
    {
        source  setAndNormalToFaceZone;
        faceSet f0;        // name of faceSet
        normal  (1 0 0);   // normal orientation
    }


    //- Select based on faceSet without orientation
    {
        source  setToFaceZone;
        faceSet f0;       // name of faceSet
    }


    //- Select based on faceSet, using cellSet to determine orientation
    {
        source  setsToFaceZone;
        faceSet f0;       // name of faceSet
        cellSet c0;       // name of cellSet of slave side
        flip    false;    // optional: flip the faceZone (so now the cellSet
                          //           is the master side)
    }
}


// pointZoneSet
// ~~~~~~~~~~~~
// Manipulates a pointZone (as well as a pointSet)
// Takes any pointSet source. The difference with a pointSet is
// - reads the cells from the pointZone, not the pointSet
// - write to the pointZone as well as the pointSet

pointZoneSet_doc
{
    // For backwards compatibility
    //- Select based on pointSet
    {
        source  setToPointZone;
        set     p0;           // name of pointSet
    }
}


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