From ecb31dc57f06ed1d510eac68656f195fe9873a5c Mon Sep 17 00:00:00 2001
From: laurence <laurence>
Date: Thu, 9 Feb 2012 12:25:42 +0000
Subject: [PATCH] ENH: cvMesh: Move feature point tree into
 extendedFeatureEdgeMesh from cvMesh

---
 .../conformalVoronoiMesh.C                    | 44 ++++-----------
 .../conformalVoronoiMesh.H                    |  6 --
 .../conformationSurfaces.C                    | 31 ++++++++++
 .../conformationSurfaces.H                    |  8 +++
 .../extendedFeatureEdgeMesh.C                 | 56 +++++++++++++++++++
 .../extendedFeatureEdgeMesh.H                 | 15 +++++
 6 files changed, 120 insertions(+), 40 deletions(-)

diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C
index 8abdd02833d..e8cedc49c2c 100644
--- a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C
+++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C
@@ -522,43 +522,20 @@ void Foam::conformalVoronoiMesh::insertEdgePointGroups
 }
 
 
-const Foam::indexedOctree<Foam::treeDataPoint>&
-Foam::conformalVoronoiMesh::featurePointTree() const
-{
-    if (featurePointTreePtr_.empty())
-    {
-        treeBoundBox overallBb
-        (
-            geometryToConformTo_.globalBounds().extend(rndGen_, 1e-4)
-        );
-
-        overallBb.min() -= Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
-        overallBb.max() += Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
-
-        featurePointTreePtr_.reset
-        (
-            new indexedOctree<treeDataPoint>
-            (
-                treeDataPoint(featurePointLocations_),
-                overallBb,  // overall search domain
-                10,         // max levels
-                10.0,       // maximum ratio of cubes v.s. cells
-                100.0       // max. duplicity; n/a since no bounding boxes.
-            )
-        );
-    }
-
-    return featurePointTreePtr_();
-}
-
-
 bool Foam::conformalVoronoiMesh::nearFeaturePt(const Foam::point& pt) const
 {
-    const indexedOctree<treeDataPoint>& tree = featurePointTree();
-
     scalar exclusionRangeSqr = featurePointExclusionDistanceSqr(pt);
 
-    pointIndexHit info = tree.findNearest(pt, exclusionRangeSqr);
+    pointIndexHit info;
+    label featureHit;
+
+    geometryToConformTo_.findFeaturePointNearest
+    (
+        pt,
+        exclusionRangeSqr,
+        info,
+        featureHit
+    );
 
     return info.hit();
 }
@@ -1207,7 +1184,6 @@ Foam::conformalVoronoiMesh::conformalVoronoiMesh
     limitBounds_(),
     featureVertices_(),
     featurePointLocations_(),
-    featurePointTreePtr_(),
     edgeLocationTreePtr_(),
     surfacePtLocationTreePtr_(),
     sizeAndAlignmentLocations_(),
diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H
index d29cf85295d..7a68f98b035 100644
--- a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H
+++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H
@@ -169,9 +169,6 @@ private:
         //  Single pointField required by the featurePointTree.
         pointField featurePointLocations_;
 
-        //- Search tree for feature point locations
-        mutable autoPtr<indexedOctree<treeDataPoint> > featurePointTreePtr_;
-
         //- Search tree for edge point locations
         mutable autoPtr<dynamicIndexedOctree<dynamicTreeDataPoint> >
         edgeLocationTreePtr_;
@@ -487,9 +484,6 @@ private:
         //- Reinsert stored feature point defining points
         void reinsertFeaturePoints(bool distribute = false);
 
-        //- Demand driven construction of octree for feature points
-        const indexedOctree<treeDataPoint>& featurePointTree() const;
-
         //- Check if a location is in exclusion range around a feature point
         bool nearFeaturePt(const Foam::point& pt) const;
 
diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C
index b91d40121d4..8212688165a 100644
--- a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C
+++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C
@@ -619,6 +619,37 @@ void Foam::conformationSurfaces::findSurfaceNearest
 }
 
 
+void Foam::conformationSurfaces::findFeaturePointNearest
+(
+    const point& sample,
+    scalar nearestDistSqr,
+    pointIndexHit& fpHit,
+    label& featureHit
+) const
+{
+    // Work arrays
+    scalar minDistSqr = nearestDistSqr;
+    pointIndexHit hitInfo;
+
+    forAll(features_, testI)
+    {
+        features_[testI].nearestFeaturePoint
+        (
+            sample,
+            minDistSqr,
+            hitInfo
+        );
+
+        if (hitInfo.hit())
+        {
+            minDistSqr = magSqr(hitInfo.hitPoint()- sample);
+            fpHit = hitInfo;
+            featureHit = testI;
+        }
+    }
+}
+
+
 void Foam::conformationSurfaces::findEdgeNearest
 (
     const point& sample,
diff --git a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H
index fe883fbaa5c..bb78cde3e4e 100644
--- a/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H
+++ b/applications/utilities/mesh/generation/cvMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H
@@ -246,6 +246,14 @@ public:
                 labelList& hitSurfaces
             ) const;
 
+            //- Find the nearest point on any feature edge
+            void findFeaturePointNearest
+            (
+                const point& sample,
+                scalar nearestDistSqr,
+                pointIndexHit& fpHit,
+                label& featureHit
+            ) const;
 
             //- Find the nearest point on any feature edge
             void findEdgeNearest
diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C
index 9f621b24ee6..b7ab3074fc9 100644
--- a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C
+++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C
@@ -72,6 +72,7 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh(const IOobject& io)
     edgeNormals_(0),
     featurePointNormals_(0),
     regionEdges_(0),
+    pointTree_(),
     edgeTree_(),
     edgeTreesByType_()
 {
@@ -159,6 +160,7 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh
     edgeNormals_(fem.edgeNormals()),
     featurePointNormals_(fem.featurePointNormals()),
     regionEdges_(fem.regionEdges()),
+    pointTree_(),
     edgeTree_(),
     edgeTreesByType_()
 {}
@@ -185,6 +187,7 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh
     edgeNormals_(0),
     featurePointNormals_(0),
     regionEdges_(0),
+    pointTree_(),
     edgeTree_(),
     edgeTreesByType_()
 {}
@@ -222,6 +225,7 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh
     edgeNormals_(0),
     featurePointNormals_(0),
     regionEdges_(0),
+    pointTree_(),
     edgeTree_(),
     edgeTreesByType_()
 {
@@ -578,6 +582,7 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh
     edgeNormals_(edgeNormals),
     featurePointNormals_(featurePointNormals),
     regionEdges_(regionEdges),
+    pointTree_(),
     edgeTree_(),
     edgeTreesByType_()
 {}
@@ -684,6 +689,21 @@ Foam::extendedFeatureEdgeMesh::classifyEdge
 
 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
 
+void Foam::extendedFeatureEdgeMesh::nearestFeaturePoint
+(
+    const point& sample,
+    scalar searchDistSqr,
+    pointIndexHit& info
+) const
+{
+    info = pointTree().findNearest
+    (
+        sample,
+        searchDistSqr
+    );
+}
+
+
 void Foam::extendedFeatureEdgeMesh::nearestFeatureEdge
 (
     const point& sample,
@@ -816,6 +836,42 @@ void Foam::extendedFeatureEdgeMesh::allNearestFeatureEdges
 }
 
 
+const Foam::indexedOctree<Foam::treeDataPoint>&
+Foam::extendedFeatureEdgeMesh::pointTree() const
+{
+    if (pointTree_.empty())
+    {
+        Random rndGen(17301893);
+
+        // Slightly extended bb. Slightly off-centred just so on symmetric
+        // geometry there are less face/edge aligned items.
+        treeBoundBox bb
+        (
+            treeBoundBox(points()).extend(rndGen, 1E-4)
+        );
+
+        bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
+        bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
+
+        labelList allPoints(identity(points().size()));
+
+        pointTree_.reset
+        (
+            new indexedOctree<treeDataPoint>
+            (
+                treeDataPoint(points()),
+                bb,     // bb
+                8,      // maxLevel
+                10,     // leafsize
+                3.0     // duplicity
+            )
+        );
+    }
+
+    return pointTree_();
+}
+
+
 const Foam::indexedOctree<Foam::treeDataEdge>&
 Foam::extendedFeatureEdgeMesh::edgeTree() const
 {
diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H
index 3268e719c5f..52de62552ca 100644
--- a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H
+++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H
@@ -61,6 +61,7 @@ SourceFiles
 #include "IOdictionary.H"
 #include "indexedOctree.H"
 #include "treeDataEdge.H"
+#include "treeDataPoint.H"
 #include "pointIndexHit.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -155,6 +156,9 @@ private:
         //- Feature edges which are on the boundary between regions
         labelList regionEdges_;
 
+        //- Search tree for all feature points
+        mutable autoPtr<indexedOctree<treeDataPoint> > pointTree_;
+
         //- Search tree for all edges
         mutable autoPtr<indexedOctree<treeDataEdge> > edgeTree_;
 
@@ -247,6 +251,14 @@ public:
 
         // Find
 
+            //- Find nearest surface edge for the sample point.
+            void nearestFeaturePoint
+            (
+                const point& sample,
+                scalar searchDistSqr,
+                pointIndexHit& info
+            ) const;
+
             //- Find nearest surface edge for the sample point.
             void nearestFeatureEdge
             (
@@ -349,6 +361,9 @@ public:
             //- Return the edgeStatus of a specified edge
             inline edgeStatus getEdgeStatus(label edgeI) const;
 
+            //- Demand driven construction of octree for feature points
+            const indexedOctree<treeDataPoint>& pointTree() const;
+
             //- Demand driven construction of octree for boundary edges
             const indexedOctree<treeDataEdge>& edgeTree() const;
 
-- 
GitLab