From cb308ce790fbf03861d84465594e2d07d504ae9c Mon Sep 17 00:00:00 2001
From: laurence <laurence>
Date: Mon, 16 Jan 2012 09:33:10 +0000
Subject: [PATCH] ENH: Add sphere overlap function to treeDataEdge and a test.

---
 .../findSphereFeatureEdges-octree/Make/files  |   3 +
 .../Make/options                              |   9 ++
 .../Test-findSphereFeatureEdges-octree.C      | 111 ++++++++++++++++++
 src/meshTools/indexedOctree/treeDataEdge.C    |  19 +++
 src/meshTools/indexedOctree/treeDataEdge.H    |   8 ++
 5 files changed, 150 insertions(+)
 create mode 100644 applications/test/findSphereFeatureEdges-octree/Make/files
 create mode 100644 applications/test/findSphereFeatureEdges-octree/Make/options
 create mode 100644 applications/test/findSphereFeatureEdges-octree/Test-findSphereFeatureEdges-octree.C

diff --git a/applications/test/findSphereFeatureEdges-octree/Make/files b/applications/test/findSphereFeatureEdges-octree/Make/files
new file mode 100644
index 00000000000..b9c5a5027f0
--- /dev/null
+++ b/applications/test/findSphereFeatureEdges-octree/Make/files
@@ -0,0 +1,3 @@
+Test-findSphereFeatureEdges-octree.C
+
+EXE = $(FOAM_USER_APPBIN)/Test-findSphereFeatureEdges-octree
diff --git a/applications/test/findSphereFeatureEdges-octree/Make/options b/applications/test/findSphereFeatureEdges-octree/Make/options
new file mode 100644
index 00000000000..60690345147
--- /dev/null
+++ b/applications/test/findSphereFeatureEdges-octree/Make/options
@@ -0,0 +1,9 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/edgeMesh/lnInclude
+
+EXE_LIBS = \
+    -lfiniteVolume \
+    -lmeshTools \
+    -ledgeMesh
diff --git a/applications/test/findSphereFeatureEdges-octree/Test-findSphereFeatureEdges-octree.C b/applications/test/findSphereFeatureEdges-octree/Test-findSphereFeatureEdges-octree.C
new file mode 100644
index 00000000000..8a81e211e0e
--- /dev/null
+++ b/applications/test/findSphereFeatureEdges-octree/Test-findSphereFeatureEdges-octree.C
@@ -0,0 +1,111 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "argList.H"
+#include "Time.H"
+#include "fvMesh.H"
+#include "IStringStream.H"
+#include "indexedOctree.H"
+#include "treeDataEdge.H"
+#include "OFstream.H"
+#include "extendedFeatureEdgeMesh.H"
+
+using namespace Foam;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// Main program:
+
+int main(int argc, char *argv[])
+{
+
+#   include "setRootCase.H"
+#   include "createTime.H"
+#   include "createMesh.H"
+
+    fileName sFeatFileName("unit_cube.extendedFeatureEdgeMesh");
+
+    extendedFeatureEdgeMesh efem
+    (
+        IOobject
+        (
+            sFeatFileName,
+            runTime.time().constant(),
+            "extendedFeatureEdgeMesh",
+            runTime.time(),
+            IOobject::MUST_READ,
+            IOobject::NO_WRITE
+        )
+    );
+
+    // Slightly extended bb. Slightly off-centred just so on symmetric
+    // geometry there are less face/edge aligned items.
+    treeBoundBox bb
+    (
+        efem.points()
+    );
+
+    bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
+    bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
+
+    labelList allEdges(identity(efem.edges().size()));
+
+    indexedOctree<treeDataEdge> edgeTree
+    (
+        treeDataEdge
+        (
+            false,          // cachebb
+            efem.edges(),        // edges
+            efem.points(),       // points
+            allEdges        // selected edges
+        ),
+        bb,     // bb
+        8,      // maxLevel
+        10,     // leafsize
+        3.0     // duplicity
+    );
+
+    Info<< "Points: " << efem.points() << nl << endl;
+
+    Info<< "Find edge labels within sphere from point (0, 0, 0):" << endl;
+
+    Info<< "    Radius = 0   : "
+        << edgeTree.findSphere(point(0, 0, 0), 0) << endl;
+
+    Info<< "    Radius = 0.5 : "
+        << edgeTree.findSphere(point(0, 0, 0), 0.5) << endl;
+
+    Info<< "    Radius = 1   : "
+        << edgeTree.findSphere(point(0, 0, 0), 1) << endl;
+
+    Info<< "    Radius = 2   : "
+        << edgeTree.findSphere(point(0, 0, 0), 2) << endl;
+
+    Info<< "End\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/src/meshTools/indexedOctree/treeDataEdge.C b/src/meshTools/indexedOctree/treeDataEdge.C
index d3945822365..08d7ba8eeb3 100644
--- a/src/meshTools/indexedOctree/treeDataEdge.C
+++ b/src/meshTools/indexedOctree/treeDataEdge.C
@@ -139,6 +139,25 @@ bool Foam::treeDataEdge::overlaps
 }
 
 
+// Check if any point on shape is inside sphere.
+bool Foam::treeDataEdge::overlaps
+(
+    const label index,
+    const point& centre,
+    const scalar radiusSqr
+) const
+{
+    if (cacheBb_)
+    {
+        return bbs_[index].overlaps(centre, radiusSqr);
+    }
+    else
+    {
+        return calcBb(edgeLabels_[index]).overlaps(centre, radiusSqr);
+    }
+}
+
+
 // Calculate nearest point to sample. Updates (if any) nearestDistSqr, minIndex,
 // nearestPoint.
 void Foam::treeDataEdge::findNearest
diff --git a/src/meshTools/indexedOctree/treeDataEdge.H b/src/meshTools/indexedOctree/treeDataEdge.H
index c6af44e9edb..9a8deadb73c 100644
--- a/src/meshTools/indexedOctree/treeDataEdge.H
+++ b/src/meshTools/indexedOctree/treeDataEdge.H
@@ -148,6 +148,14 @@ public:
                 const treeBoundBox& sampleBb
             ) const;
 
+            //- Does (bb of) shape at index overlap bb
+            bool overlaps
+            (
+                const label index,
+                const point& centre,
+                const scalar radiusSqr
+            ) const;
+
             //- Calculates nearest (to sample) point in shape.
             //  Returns actual point and distance (squared)
             void findNearest
-- 
GitLab