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

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

// This application/dictionary controls:
// - optional: create new patches from boundary faces (either given as
//   a set of patches or as a faceSet)
// - always: order faces on coupled patches such that they are opposite. This
//   is done for all coupled faces, not just for any patches created.
// - optional: synchronise points on coupled patches.

// 1. Create cyclic:
// - specify where the faces should come from
// - specify the type of cyclic. If a rotational specify the rotationAxis
//   and centre to make matching easier
// - always create both halves in one invocation with correct 'neighbourPatch'
//   setting.
// - optionally pointSync true to guarantee points to line up.

// 2. Correct incorrect cyclic:
// This will usually fail upon loading:
//  "face 0 area does not match neighbour 2 by 0.0100005%"
//  " -- possible face ordering problem."
// - in polyMesh/boundary file:
//      - loosen matchTolerance of all cyclics to get case to load
//      - or change patch type from 'cyclic' to 'patch'
//        and regenerate cyclic as above


// Do a synchronisation of coupled points after creation of any patches.
// Note: this does not work with points that are on multiple coupled patches
//       with transformations (i.e. cyclics).
pointSync false;

// Optional: Write cyclic matches into .obj format; defaults to false.
writeCyclicMatch  false;

connection
{
    name            AMIinner;
    patchInfo
    {
        type            cyclicAMI;
        matchTolerance  0.1;
        neighbourPatch  AMIborda;
        // method          mapNearestAMI;
        // method          faceAreaWeightAMI;
        // method          directAMI;
        method          faceAreaWeightAMI;
    }
    constructFrom patches;
    patches (AMIfarWellIn);
}

patches
(
    // master AMI patch
    {
        $connection;
    }

    // slave AMI patch
    {
        $connection;
        name            AMIborda;
        patchInfo
        {
            matchTolerance  0.1;
            neighbourPatch  AMIinner;
            //method          mapNearestAMI;
            // method          faceAreaWeightAMI;
            // method          directAMI;
            method          faceAreaWeightAMI;
        }
        patches (AMIfarWellOut);
    }
);
// ************************************************************************* //
