From 274d1df8a472fdb235af5c469a4ba0098ca5063c Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Fri, 13 May 2016 17:47:38 +0100
Subject: [PATCH] snappyHexMesh: Automatically remove zero-sized patches All
 patches are preserved if the 'keepPatches' option is set true. Patch
 contributed by Mattijs Janssens

---
 .../generation/snappyHexMesh/snappyHexMesh.C  | 86 +++++++++++++++++++
 .../snappyHexMesh/snappyHexMeshDict           |  5 ++
 src/dynamicMesh/fvMeshTools/fvMeshTools.H     |  3 +-
 .../simpleFoam/rotorDisk/Allrun               |  1 -
 .../rotorDisk/system/createPatchDict          | 29 -------
 .../ras/mixerVesselAMI/Allrun.pre             |  3 -
 .../ras/mixerVesselAMI/system/createPatchDict | 27 ------
 7 files changed, 92 insertions(+), 62 deletions(-)
 delete mode 100644 tutorials/incompressible/simpleFoam/rotorDisk/system/createPatchDict
 delete mode 100644 tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/createPatchDict

diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
index ad0f7ade304..9414149d414 100644
--- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
+++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
@@ -57,6 +57,7 @@ Description
 #include "MeshedSurface.H"
 #include "globalIndex.H"
 #include "IOmanip.H"
+#include "fvMeshTools.H"
 
 using namespace Foam;
 
@@ -571,6 +572,73 @@ scalar getMergeDistance(const polyMesh& mesh, const scalar mergeTol)
 }
 
 
+void removeZeroSizedPatches(fvMesh& mesh)
+{
+    // Remove any zero-sized ones. Assumes
+    // - processor patches are already only there if needed
+    // - all other patches are available on all processors
+    // - but coupled ones might still be needed, even if zero-size
+    //   (e.g. processorCyclic)
+    // See also logic in createPatch.
+    const polyBoundaryMesh& pbm = mesh.boundaryMesh();
+
+    labelList oldToNew(pbm.size(), -1);
+    label newPatchi = 0;
+    forAll(pbm, patchi)
+    {
+        const polyPatch& pp = pbm[patchi];
+
+        if (!isA<processorPolyPatch>(pp))
+        {
+            if
+            (
+                isA<coupledPolyPatch>(pp)
+             || returnReduce(pp.size(), sumOp<label>())
+            )
+            {
+                // Coupled (and unknown size) or uncoupled and used
+                oldToNew[patchi] = newPatchi++;
+            }
+        }
+    }
+
+    forAll(pbm, patchi)
+    {
+        const polyPatch& pp = pbm[patchi];
+
+        if (isA<processorPolyPatch>(pp))
+        {
+            oldToNew[patchi] = newPatchi++;
+        }
+    }
+
+
+    const label nKeepPatches = newPatchi;
+
+    // Shuffle unused ones to end
+    if (nKeepPatches != pbm.size())
+    {
+        Info<< endl
+            << "Removing zero-sized patches:" << endl << incrIndent;
+
+        forAll(oldToNew, patchi)
+        {
+            if (oldToNew[patchi] == -1)
+            {
+                Info<< indent << pbm[patchi].name()
+                    << " type " << pbm[patchi].type()
+                    << " at position " << patchi << endl;
+                oldToNew[patchi] = newPatchi++;
+            }
+        }
+        Info<< decrIndent;
+
+        fvMeshTools::reorderPatches(mesh, oldToNew, nKeepPatches, true);
+        Info<< endl;
+    }
+}
+
+
 // Write mesh and additional information
 void writeMesh
 (
@@ -812,6 +880,8 @@ int main(int argc, char *argv[])
         readScalar(meshDict.lookup("mergeTolerance"))
     );
 
+    const Switch keepPatches(meshDict.lookupOrDefault("keepPatches", false));
+
 
 
     // Read decomposePar dictionary
@@ -1351,6 +1421,12 @@ int main(int argc, char *argv[])
             motionDict
         );
 
+
+        if (!keepPatches && !wantSnap && !wantLayers)
+        {
+            removeZeroSizedPatches(mesh);
+        }
+
         writeMesh
         (
             "Refined mesh",
@@ -1392,6 +1468,11 @@ int main(int argc, char *argv[])
             snapParams
         );
 
+        if (!keepPatches && !wantLayers)
+        {
+            removeZeroSizedPatches(mesh);
+        }
+
         writeMesh
         (
             "Snapped mesh",
@@ -1438,6 +1519,11 @@ int main(int argc, char *argv[])
             distributor
         );
 
+        if (!keepPatches)
+        {
+            removeZeroSizedPatches(mesh);
+        }
+
         writeMesh
         (
             "Layer mesh",
diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict
index 577e116b64d..9389b50fbe3 100644
--- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict
+++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict
@@ -26,6 +26,11 @@ addLayers       false;
 //singleRegionName false;
 
 
+//Optional: preserve all generated patches. Default is to remove
+//          zero-sized patches.
+//keepPatches true;
+
+
 // Geometry. Definition of all surfaces. All surfaces are of class
 // searchableSurface.
 // Surfaces are used
diff --git a/src/dynamicMesh/fvMeshTools/fvMeshTools.H b/src/dynamicMesh/fvMeshTools/fvMeshTools.H
index 15516612d6a..1b5f60c1c8f 100644
--- a/src/dynamicMesh/fvMeshTools/fvMeshTools.H
+++ b/src/dynamicMesh/fvMeshTools/fvMeshTools.H
@@ -112,7 +112,7 @@ public:
     //- Change patchField to zero on registered fields
     static void zeroPatchFields(fvMesh& mesh, const label patchI);
 
-    // -Reorder and remove trailing patches. If validBoundary call is parallel
+    //- Reorder and remove trailing patches. If validBoundary call is parallel
     //  synced and all add the same patch with same settings
     static void reorderPatches
     (
@@ -121,7 +121,6 @@ public:
         const label nPatches,
         const bool validBoundary
     );
-
 };
 
 
diff --git a/tutorials/incompressible/simpleFoam/rotorDisk/Allrun b/tutorials/incompressible/simpleFoam/rotorDisk/Allrun
index 14d69c2a9a5..f6f12582312 100755
--- a/tutorials/incompressible/simpleFoam/rotorDisk/Allrun
+++ b/tutorials/incompressible/simpleFoam/rotorDisk/Allrun
@@ -8,7 +8,6 @@ cd ${0%/*} || exit 1    # Run from this directory
 runApplication blockMesh
 runApplication surfaceFeatureExtract
 runApplication snappyHexMesh -overwrite
-runApplication createPatch -overwrite
 
 runApplication $(getApplication)
 
diff --git a/tutorials/incompressible/simpleFoam/rotorDisk/system/createPatchDict b/tutorials/incompressible/simpleFoam/rotorDisk/system/createPatchDict
deleted file mode 100644
index a7e00363719..00000000000
--- a/tutorials/incompressible/simpleFoam/rotorDisk/system/createPatchDict
+++ /dev/null
@@ -1,29 +0,0 @@
-/*--------------------------------*- C++ -*----------------------------------*\
-| =========                 |                                                 |
-| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
-|  \\    /   O peration     | Version:  dev                                   |
-|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
-|    \\/     M anipulation  |                                                 |
-\*---------------------------------------------------------------------------*/
-FoamFile
-{
-    version     2.0;
-    format      ascii;
-    class       dictionary;
-    object      createPatchDict;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-// 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;
-
-// Patches to create. An empty patch list just removes patches with zero
-// faces from $FOAM_CASE/constant/polyMesh/boundary.
-patches
-(
-
-);
-
-// ************************************************************************* //
diff --git a/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/Allrun.pre b/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/Allrun.pre
index 3ded7bc7b42..e7e5a4ce56a 100755
--- a/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/Allrun.pre
+++ b/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/Allrun.pre
@@ -16,9 +16,6 @@ runApplication snappyHexMesh -overwrite
 runApplication createBaffles -overwrite
 runApplication mergeOrSplitBaffles -split -overwrite
 
-# Get rid of zero faced patches
-runApplication createPatch -overwrite
-
 # Copy fields after meshing to avoind the generation of unnecessary patch fields
 cp -r 0.orig 0
 
diff --git a/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/createPatchDict b/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/createPatchDict
deleted file mode 100644
index 5aafd9aa4ed..00000000000
--- a/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/createPatchDict
+++ /dev/null
@@ -1,27 +0,0 @@
-/*--------------------------------*- C++ -*----------------------------------*\
-| =========                 |                                                 |
-| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
-|  \\    /   O peration     | Version:  dev                                   |
-|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
-|    \\/     M anipulation  |                                                 |
-\*---------------------------------------------------------------------------*/
-FoamFile
-{
-    version     2.0;
-    format      ascii;
-    class       dictionary;
-    object      createPatchDict;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-// 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;
-
-// Patches to create.
-patches
-(
-);
-
-// ************************************************************************* //
-- 
GitLab