On 18th May 2022, CFD Direct released Non-Conformal Coupling (NCC) in OpenFOAM to connect regions of a domain with independent meshes for applications including rotating geometry. NCC is a robust replacement for the Arbitrary Mesh Interface (AMI) and associated ACMI and Repeat AMI functionalities. Due to its wider use, AMI remains in OpenFOAM for the next version 10 release in July 2022, but will thereafter be removed. The less-used and unreliable ACMI and Repeat AMI functionalities are removed. This article describes how to use NCC so that OpenFOAM users can transition from the AMI functionality to NCC.

Meshing with NCC

The process of meshing for NCC is very similar to existing processes for meshing for AMI. Typically, a mesh is generated with an identifiable set of internal faces which coincide with the surface through which the mesh will be coupled. These faces are then duplicated by running the createBaffles utility to create two boundary patches. The points are then split using splitBaffles in order to permit independent motion of the patches.

In AMI, these patches are assigned the cyclicAMI patch type, which couples them using AMI interpolation methods. With NCC, the patches remain non-coupled, e.g. a wall type. Coupling is instead achieved by running the new createNonConformalCouples utility, which creates additional coupled patches of type nonConformalCyclic. These appear in the constant/polyMesh/boundary file with zero faces; they are populated with faces in the finite volume mesh during the connection process in NCC.

For a single couple, such as that which separates the rotating and stationary sections of a mesh, the utility can be called using the non-coupled patch names as arguments, e.g.

createNonConformalCouples -overwrite rotatingZoneInner rotatingZoneOuter

where rotatingZoneInner and rotatingZoneOuter are the names of the patches.

For multiple couples, and/or couples with transformations, createNonConformalCouples should be run without arguments. Settingswill then be read from a configuration file named system/createNonConformalCouplesDict. See $FOAM_ETC/caseDicts/annotated/createNonConformalCouplesDict for examples.

Boundary conditions

For a couple whose patches fully overlap, boundary conditions are typically applied to fields which correspond to a slip wall, i.e:

  • movingWallSlipVelocity (or slip if the mesh is stationary) for velocity U;
  • zeroGradient or fixedFluxPressure for pressure p;
  • zeroGradient for other fields.

For a couple with partially-overlapping patches, boundary conditions are applied which physically represent the non-overlapped region, e.g. a no-slip wall.

Boundary conditions also need to be specified for the nonConformalCyclic patches created by createNonConformalCouples. It
is generally recommended that this is done by including the $FOAM_ETC/caseDicts/setConstraintTypes file in the boundaryField section of each of the field files, e.g.

    #includeEtc "caseDicts/setConstraintTypes"


Solver and algorithm controls

For moving mesh cases, it may be necessary to correct the mesh fluxes that are changed as a result of the connection procedure. If the connected patches do not conform perfectly to the mesh motion, then failure to correct the fluxes can result in noise in the pressure solution.

Correction for the mesh fluxes is enabled by the correctMeshPhi switch in the PIMPLE (or equivalent) section of system/fvSolution. When it is enabled, solver settings are required for MeshPhi. The solution just needs to distribute the error enough to dissipate the noise. A smooth solver with a loose tolerance is sufficient, e.g. the settings in system/fvSolution shown below:

        solver    smoothSolver;
        smoother  symGaussSeidel;
        tolerance 1e-2;
        relTol    0;

    correctMeshPhi yes;

The solution of MeshPhi is an inexpensive computation since it is applied only to a small subset of the mesh adjacent to the couple. Conservation is maintained whether or not the mesh flux correction is enabled, and regardless of the solution tolerance for MeshPhi.


The following examples in the tutorials ($FOAM_TUTORIALS) directory have been converted from using AMI to the new NCC system:

  • compressible/rhoPimpleFoam/RAS/annularThermalMixer
  • incompressible/pimpleFoam/RAS/propeller
  • lagrangian/particleFoam/mixerVessel2D (formerly mixerVesselAMI2D)
  • multiphase/interFoam/RAS/mixerVessel
  • multiphase/interFoam/RAS/propeller
  • multiphase/multiphaseEulerFoam/laminar/mixerVessel2D (formerly mixerVesselAMI2D)

The following tutorial has been converted from using ACMI:

  • incompressible/pimpleFoam/RAS/oscillatingInlet

The following tutorial has been converted from using Repeat AMI:

  • incompressible/pimpleFoam/RAS/impeller

The following tutorial has been added to demonstrate NCC’s ability to create a sufficiently conservative solution in a closed domain to maintain phase fraction boundedness:

  • multiphase/interFoam/laminar/mixerVessel2D

The following tutorials have been added to demonstrate NCC’s ability to simulate partially overlapping couples on curved surfaces:

  • incompressible/pimpleFoam/RAS/ballValve
  • multiphase/compressibleInterFoam/RAS/ballValve

The following tutorial has been added to provide a simple comparison of the conservation behaviour of AMI and NCC:

  • incompressible/pimpleFoam/laminar/nonConformalChannel
Using NCC in OpenFOAM