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