diff --git a/src/parallel/decompose/decompositionMethods/hierarchGeomDecomp/hierarchGeomDecomp.C b/src/parallel/decompose/decompositionMethods/hierarchGeomDecomp/hierarchGeomDecomp.C
index cc87a33f2d638521eaa09f703a56f59b85c09b1e..2eee63f9c4eeae8f26b9458952930cdc12d3d48a 100644
--- a/src/parallel/decompose/decompositionMethods/hierarchGeomDecomp/hierarchGeomDecomp.C
+++ b/src/parallel/decompose/decompositionMethods/hierarchGeomDecomp/hierarchGeomDecomp.C
@@ -28,7 +28,7 @@ License
 #include "PstreamReduceOps.H"
 #include "SortableList.H"
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
 namespace Foam
 {
@@ -49,7 +49,8 @@ namespace Foam
     );
 }
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
 void Foam::hierarchGeomDecomp::setDecompOrder()
 {
@@ -167,7 +168,7 @@ void Foam::hierarchGeomDecomp::calculateSortedWeightedSizes
 
 // Find position in values so between minIndex and this position there
 // are wantedSize elements.
-void Foam::hierarchGeomDecomp::findBinary
+bool Foam::hierarchGeomDecomp::findBinary
 (
     const label sizeTol,
     const List<scalar>& values,
@@ -228,20 +229,26 @@ void Foam::hierarchGeomDecomp::findBinary
 
         if (returnReduce(hasNotChanged, andOp<bool>()))
         {
-            WarningInFunction
-                << "unable to find desired decomposition split, making do!"
-                << endl;
-            break;
+            if (debug)
+            {
+                WarningInFunction
+                    << "unable to find desired decomposition split, making do!"
+                    << endl;
+            }
+
+            return false;
         }
 
         midValuePrev = midValue;
     }
+
+    return true;
 }
 
 
 // Find position in values so between minIndex and this position there
 // are wantedSize elements.
-void Foam::hierarchGeomDecomp::findBinary
+bool Foam::hierarchGeomDecomp::findBinary
 (
     const label sizeTol,
     const List<scalar>& sortedWeightedSizes,
@@ -308,19 +315,25 @@ void Foam::hierarchGeomDecomp::findBinary
 
         if (returnReduce(hasNotChanged, andOp<bool>()))
         {
-            WarningInFunction
-                << "unable to find desired deomposition split, making do!"
-                << endl;
-            break;
+            if (debug)
+            {
+                WarningInFunction
+                    << "Unable to find desired decomposition split, making do!"
+                    << endl;
+            }
+
+            return false;
         }
 
         midValuePrev = midValue;
     }
+
+    return true;
 }
 
 
 // Sort points into bins according to one component. Recurses to next component.
-void Foam::hierarchGeomDecomp::sortComponent
+Foam::label Foam::hierarchGeomDecomp::sortComponent
 (
     const label sizeTol,
     const pointField& points,
@@ -331,7 +344,10 @@ void Foam::hierarchGeomDecomp::sortComponent
 ) const
 {
     // Current component
-    label compI = decompOrder_[componentIndex];
+    const label compI = decompOrder_[componentIndex];
+
+    // Track the number of times that findBinary() did not converge
+    label nWarnings = 0;
 
     if (debug)
     {
@@ -426,7 +442,7 @@ void Foam::hierarchGeomDecomp::sortComponent
             rightCoord = maxCoord;
 
             // Calculate rightIndex/rightCoord to have wanted size
-            findBinary
+            bool ok = findBinary
             (
                 sizeTol,
                 sortedCoord,
@@ -439,6 +455,11 @@ void Foam::hierarchGeomDecomp::sortComponent
                 rightCoord
             );
             localSize = rightIndex - leftIndex;
+
+            if (!ok)
+            {
+                ++nWarnings;
+            }
         }
 
         if (debug)
@@ -477,7 +498,7 @@ void Foam::hierarchGeomDecomp::sortComponent
                 Pout.prefix() = "  " + oldPrefix;
             }
 
-            sortComponent
+            nWarnings += sortComponent
             (
                 sizeTol,
                 points,
@@ -497,11 +518,13 @@ void Foam::hierarchGeomDecomp::sortComponent
         leftIndex += localSize;
         leftCoord = rightCoord;
     }
+
+    return nWarnings;
 }
 
 
 // Sort points into bins according to one component. Recurses to next component.
-void Foam::hierarchGeomDecomp::sortComponent
+Foam::label Foam::hierarchGeomDecomp::sortComponent
 (
     const label sizeTol,
     const scalarField& weights,
@@ -513,7 +536,10 @@ void Foam::hierarchGeomDecomp::sortComponent
 ) const
 {
     // Current component
-    label compI = decompOrder_[componentIndex];
+    const label compI = decompOrder_[componentIndex];
+
+    // Track the number of times that findBinary() did not converge
+    label nWarnings = 0;
 
     if (debug)
     {
@@ -608,7 +634,7 @@ void Foam::hierarchGeomDecomp::sortComponent
             rightCoord = maxCoord;
 
             // Calculate rightIndex/rightCoord to have wanted size
-            findBinary
+            bool ok = findBinary
             (
                 sizeTol,
                 sortedWeightedSizes,
@@ -622,6 +648,11 @@ void Foam::hierarchGeomDecomp::sortComponent
                 rightCoord
             );
             localSize = rightIndex - leftIndex;
+
+            if (!ok)
+            {
+                ++nWarnings;
+            }
         }
 
         if (debug)
@@ -660,7 +691,7 @@ void Foam::hierarchGeomDecomp::sortComponent
                 Pout.prefix() = "  " + oldPrefix;
             }
 
-            sortComponent
+            nWarnings += sortComponent
             (
                 sizeTol,
                 weights,
@@ -681,6 +712,8 @@ void Foam::hierarchGeomDecomp::sortComponent
         leftIndex += localSize;
         leftCoord = rightCoord;
     }
+
+    return nWarnings;
 }
 
 
@@ -722,24 +755,18 @@ Foam::labelList Foam::hierarchGeomDecomp::decompose
     labelList finalDecomp(points.size(), Zero);
 
     // Start off with every point sorted onto itself.
-    labelList slice(points.size());
-    forAll(slice, i)
-    {
-        slice[i] = i;
-    }
+    labelList slice(identity(points.size()));
 
     pointField rotatedPoints(rotDelta_ & points);
 
     // Calculate tolerance of cell distribution. For large cases finding
     // distribution to the cell exact would cause too many iterations so allow
     // some slack.
-    label allSize = points.size();
-    reduce(allSize, sumOp<label>());
-
+    const label allSize = returnReduce(points.size(), sumOp<label>());
     const label sizeTol = max(1, label(1e-3*allSize/nDomains_));
 
     // Sort recursive
-    sortComponent
+    const label nWarnings = sortComponent
     (
         sizeTol,
         rotatedPoints,
@@ -749,6 +776,13 @@ Foam::labelList Foam::hierarchGeomDecomp::decompose
         finalDecomp
     );
 
+    if (nWarnings)
+    {
+        WarningInFunction
+            << "\nEncountered " << nWarnings << " occurrences where the desired"
+               " decomposition split could not be properly satisfied" << endl;
+    }
+
     return finalDecomp;
 }
 
@@ -763,24 +797,18 @@ Foam::labelList Foam::hierarchGeomDecomp::decompose
     labelList finalDecomp(points.size(), Zero);
 
     // Start off with every point sorted onto itself.
-    labelList slice(points.size());
-    forAll(slice, i)
-    {
-        slice[i] = i;
-    }
+    labelList slice(identity(points.size()));
 
     pointField rotatedPoints(rotDelta_ & points);
 
     // Calculate tolerance of cell distribution. For large cases finding
     // distribution to the cell exact would cause too many iterations so allow
     // some slack.
-    label allSize = points.size();
-    reduce(allSize, sumOp<label>());
-
+    const label allSize = returnReduce(points.size(), sumOp<label>());
     const label sizeTol = max(1, label(1e-3*allSize/nDomains_));
 
     // Sort recursive
-    sortComponent
+    const label nWarnings = sortComponent
     (
         sizeTol,
         weights,
@@ -791,6 +819,13 @@ Foam::labelList Foam::hierarchGeomDecomp::decompose
         finalDecomp
     );
 
+    if (nWarnings)
+    {
+        WarningInFunction
+            << "\nEncountered " << nWarnings << " occurrences where the desired"
+               " decomposition split could not be properly satisfied" << endl;
+    }
+
     return finalDecomp;
 }
 
diff --git a/src/parallel/decompose/decompositionMethods/hierarchGeomDecomp/hierarchGeomDecomp.H b/src/parallel/decompose/decompositionMethods/hierarchGeomDecomp/hierarchGeomDecomp.H
index cfc6b70a93c2ec36ffb2d40f36380ef7848cb3b7..4ccefee1f492172782e8552c147f54795532f9f8 100644
--- a/src/parallel/decompose/decompositionMethods/hierarchGeomDecomp/hierarchGeomDecomp.H
+++ b/src/parallel/decompose/decompositionMethods/hierarchGeomDecomp/hierarchGeomDecomp.H
@@ -111,7 +111,9 @@ class hierarchGeomDecomp
         //- Find midValue (at local index mid) such that the number of
         //  elements between mid and leftIndex are (globally summed) the
         //  wantedSize. Binary search.
-        static void findBinary
+        //
+        //  \Return False if the binary search completed
+        static bool findBinary
         (
             const label sizeTol,        // size difference considered acceptable
             const List<scalar>&,
@@ -126,7 +128,7 @@ class hierarchGeomDecomp
         //- Find midValue (at local index mid) such that the number of
         //  elements between mid and leftIndex are (globally summed) the
         //  wantedSize. Binary search.
-        static void findBinary
+        static bool findBinary
         (
             const label sizeTol,        // size difference considered acceptable
             const List<scalar>& sortedWeightedSizes,
@@ -140,7 +142,8 @@ class hierarchGeomDecomp
         );
 
         //- Recursively sort in x,y,z (or rather acc. to decompOrder_)
-        void sortComponent
+        //  \return the number of warnings from findBinary
+        label sortComponent
         (
             const label sizeTol,
             const pointField&,
@@ -152,7 +155,8 @@ class hierarchGeomDecomp
 
         //- Recursively sort in x,y,z (or rather acc. to decompOrder_)
         //- Using weighted points.
-        void sortComponent
+        //  \return the number of warnings from findBinary
+        label sortComponent
         (
             const label sizeTol,
             const scalarField& weights,