From abbbe31f41b2fcbbe69e252e34dc7c54d9fe38d6 Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Thu, 17 May 2012 11:58:35 +0100
Subject: [PATCH] ENH: collapseEdges: parallel operation of mergeEdges

---
 .../advanced/collapseEdges/collapseEdges.C    | 79 +++++++++++--------
 1 file changed, 45 insertions(+), 34 deletions(-)

diff --git a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C
index f1d61f14a7e..5fa068f730c 100644
--- a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C
+++ b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -50,6 +50,7 @@ Description
 #include "PointEdgeWave.H"
 #include "pointEdgeCollapse.H"
 #include "motionSmoother.H"
+#include "removePoints.H"
 
 using namespace Foam;
 
@@ -788,51 +789,61 @@ label mergeEdges
     labelList& collapseEdge
 )
 {
-    const pointField& points = mesh.points();
     const edgeList& edges = mesh.edges();
     const labelListList& pointEdges = mesh.pointEdges();
 
+    // Point removal engine
+    removePoints pointRemover(mesh, false);
+
+    // Find out points that can be deleted
+    boolList pointCanBeDeleted;
+    label nTotRemove = pointRemover.countPointUsage(maxCos, pointCanBeDeleted);
+
+
+    // Rework point-to-remove into edge-to-collapse.
+
     label nCollapsed = 0;
 
-    forAll(pointEdges, pointI)
+    if (nTotRemove > 0)
     {
-        const labelList& pEdges = pointEdges[pointI];
-
-        if (pEdges.size() == 2 && boundaryPoint[pointI] <= 0)
+        forAll(pointEdges, pointI)
         {
-            // Collapse only if none of the points part of merge network and
-            // none protected (minEdgeLen < 0)
-            label e0 = pEdges[0];
-            label e1 = pEdges[1];
-
-            if
-            (
-                collapseEdge[e0] == -1
-             && minEdgeLen[e0] >= 0
-             && collapseEdge[e1] == -1
-             && minEdgeLen[e1] >= 0
-            )
+            if (pointCanBeDeleted[pointI])
             {
-                const edge& leftE = edges[e0];
-                const edge& rightE = edges[e1];
+                const labelList& pEdges = pointEdges[pointI];
 
-                // Get the two vertices on both sides of the point
-                label leftV = leftE.otherVertex(pointI);
-                label rightV = rightE.otherVertex(pointI);
+                if (pEdges.size() == 2)
+                {
+                    // Always the case?
 
-                // Check if the two edge are in line
-                vector leftVec = points[pointI] - points[leftV];
-                leftVec /= mag(leftVec) + VSMALL;
+                    label e0 = pEdges[0];
+                    label e1 = pEdges[1];
 
-                vector rightVec = points[rightV] - points[pointI];
-                rightVec /= mag(rightVec) + VSMALL;
+                    if
+                    (
+                        collapseEdge[e0] == -1
+                     && minEdgeLen[e0] >= 0
+                     && collapseEdge[e1] == -1
+                     && minEdgeLen[e1] >= 0
+                    )
+                    {
+                        // Get the two vertices on both sides of the point
+                        label leftV = edges[e0].otherVertex(pointI);
+                        label rightV = edges[e1].otherVertex(pointI);
 
-                if ((leftVec & rightVec) > maxCos)
-                {
-                    // Collapse one (left) side of the edge. Make pointI
-                    // the master.
-                    collapseEdge[e0] = findIndex(leftE, pointI);
-                    nCollapsed++;
+                        // Can collapse pointI onto either leftV or rightV.
+                        // Preferentially choose an internal point to hopefully
+                        // give less distortion
+
+                        if (boundaryPoint[leftV] == -1)
+                        {
+                            collapseEdge[e0] = findIndex(edges[e0], leftV);
+                        }
+                        else
+                        {
+                            collapseEdge[e1] = findIndex(edges[e1], rightV);
+                        }
+                    }
                 }
             }
         }
-- 
GitLab