From 09a44ad6064fc910132d1485426a20a50cc0371c Mon Sep 17 00:00:00 2001
From: laurence <laurence>
Date: Tue, 30 Jul 2013 12:12:18 +0100
Subject: [PATCH] ENH: foamyHexMesh: Check moved internal points are inside the
 geometry before inserting them

---
 .../conformalVoronoiMesh.C                    | 114 ++++++------------
 .../conformalVoronoiMesh.H                    |   3 +
 .../conformalVoronoiMeshI.H                   |  18 +++
 .../conformalVoronoiMeshIO.C                  |   4 +
 4 files changed, 60 insertions(+), 79 deletions(-)

diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C
index 14d10427786..d87d1ed97b8 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C
@@ -562,7 +562,7 @@ void Foam::conformalVoronoiMesh::setVertexSizeAndAlignment()
     {
         if (vit->internalOrBoundaryPoint())
         {
-            pointFromPoint pt = topoint(vit->point());
+            const pointFromPoint pt = topoint(vit->point());
 
             cellShapeControls().cellSizeAndAlignment
             (
@@ -1135,10 +1135,12 @@ void Foam::conformalVoronoiMesh::move()
                      && pointToBeRetained[vB->index()] == true
                     )
                     {
-                        pointsToInsert.append
-                        (
-                            toPoint(0.5*(dVA + dVB))
-                        );
+                        Foam::point pt(0.5*(dVA + dVB));
+
+                        if (internalPointIsInside(pt))
+                        {
+                            pointsToInsert.append(toPoint(pt));
+                        }
                     }
                 }
 
@@ -1274,7 +1276,10 @@ void Foam::conformalVoronoiMesh::move()
                             if (positionOnThisProc(newPt))
                             {
                                 // Prevent insertions spanning surfaces
-                                pointsToInsert.append(toPoint(newPt));
+                                if (internalPointIsInside(newPt))
+                                {
+                                    pointsToInsert.append(toPoint(newPt));
+                                }
                             }
                         }
                     }
@@ -1310,10 +1315,12 @@ void Foam::conformalVoronoiMesh::move()
                              && pointToBeRetained[vB->index()] == true
                             )
                             {
-                                pointsToInsert.append
-                                (
-                                    toPoint(0.5*(dVA + dVB))
-                                );
+                                Foam::point pt(0.5*(dVA + dVB));
+
+                                if (internalPointIsInside(pt))
+                                {
+                                    pointsToInsert.append(toPoint(pt));
+                                }
                             }
                         }
 
@@ -1428,21 +1435,31 @@ void Foam::conformalVoronoiMesh::move()
                 // 14/1/2011.
                 // Only necessary if using an exact constructions kernel
                 // (extended precision)
-
-                pointsToInsert.append
+                Foam::point pt
                 (
-                    toPoint
-                    (
-                        topoint(vit->point())
-                      + displacementAccumulator[vit->index()]
-                    )
+                    topoint(vit->point())
+                  + displacementAccumulator[vit->index()]
                 );
+
+                if (internalPointIsInside(pt))
+                {
+                    pointsToInsert.append(toPoint(pt));
+                }
             }
         }
     }
 
     pointsToInsert.shrink();
 
+    Info<< indent
+        << returnReduce
+           (
+               pointToBeRetained.count() - pointsToInsert.size(),
+               sumOp<label>()
+           )
+        << " internal points were inserted outside the domain. "
+        << "They have been removed." << endl;
+
     // Save displacements to file.
     if (foamyHexMeshControls().objOutput() && time().outputTime())
     {
@@ -1477,73 +1494,12 @@ void Foam::conformalVoronoiMesh::move()
 
     timeCheck("Displacement calculated");
 
-    Info<< nl << "Inserting displaced tessellation" << endl;
+    Info<< nl<< "Inserting displaced tessellation" << endl;
 
     insertFeaturePoints(true);
 
     insertInternalPoints(pointsToInsert, true);
 
-    {
-        // Remove internal points that have been inserted outside the surface.
-        label internalPtIsOutside = 0;
-
-        autoPtr<OBJstream> str;
-
-        if (foamyHexMeshControls().objOutput() && time().outputTime())
-        {
-            str.set
-            (
-                new OBJstream(time().path()/"internalPointsOutsideDomain.obj")
-            );
-        }
-
-        DynamicList<Vertex_handle> pointsToRemove;
-
-        for
-        (
-            Delaunay::Finite_vertices_iterator vit = finite_vertices_begin();
-            vit != finite_vertices_end();
-            ++vit
-        )
-        {
-            if
-            (
-                (vit->internalPoint() || vit->internalBoundaryPoint())
-             //&& !vit->referred()
-            )
-            {
-                const pointFromPoint pt = topoint(vit->point());
-
-                bool inside = geometryToConformTo_.inside(pt);
-
-                if
-                (
-                    !inside
-                 || !geometryToConformTo_.globalBounds().contains(pt)
-                )
-                {
-                    if
-                    (
-                        foamyHexMeshControls().objOutput()
-                     && time().outputTime()
-                    )
-                    {
-                        str().write(topoint(vit->point()));
-                    }
-
-                    pointsToRemove.append(vit);
-                    internalPtIsOutside++;
-                }
-            }
-        }
-
-        remove(pointsToRemove.begin(), pointsToRemove.end());
-
-        Info<< "    " << returnReduce(internalPtIsOutside, sumOp<label>())
-            << " internal points were inserted outside the domain. "
-            << "They have been removed." << endl;
-    }
-
     // Fix points that have not been significantly displaced
 //    for
 //    (
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H
index 6190b0418e4..7e78d35557c 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H
@@ -244,6 +244,9 @@ private:
             DynamicList<Vb>& pts
         ) const;
 
+        //- Check internal point is completely inside the meshable region
+        inline bool internalPointIsInside(const Foam::point& pt) const;
+
         inline bool isPointPair
         (
             const Vertex_handle& vA,
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H
index def7120d554..64534cb8390 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H
@@ -325,6 +325,24 @@ inline void Foam::conformalVoronoiMesh::createBafflePointPair
 }
 
 
+inline bool Foam::conformalVoronoiMesh::internalPointIsInside
+(
+    const Foam::point& pt
+) const
+{
+    if
+    (
+        !geometryToConformTo_.inside(pt)
+     || !geometryToConformTo_.globalBounds().contains(pt)
+    )
+    {
+        return false;
+    }
+
+    return true;
+}
+
+
 inline bool Foam::conformalVoronoiMesh::isPointPair
 (
     const Vertex_handle& vA,
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C
index 9c33e9f5aba..bb34cbd4a69 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C
@@ -674,6 +674,8 @@ void Foam::conformalVoronoiMesh::reorderProcessorPatches
 
     pBufs.finishedSends();
 
+    Info<< incrIndent << indent << "    Face ordering initialised..." << endl;
+
     // Receive and calculate ordering
     bool anyChanged = false;
 
@@ -731,6 +733,8 @@ void Foam::conformalVoronoiMesh::reorderProcessorPatches
         }
     }
 
+    Info<< incrIndent << indent << "    Faces matched." << endl;
+
     reduce(anyChanged, orOp<bool>());
 
     if (anyChanged)
-- 
GitLab