From 722d23f59c818185bc7af14f996dbda4a0bf9bf0 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Wed, 25 Jan 2017 19:26:50 +0100 Subject: [PATCH] ENH: additional methods/operators for boundBox (related to #196) - Constructor for bounding box of a single point. - add(boundBox), add(point) ... -> Extend box to enclose the second box or point(s). Eg, bb.add(pt); vs. bb.min() = Foam::min(bb.min(), pt); bb.max() = Foam::max(bb.max(), pt); Also works with other bounding boxes. Eg, bb.add(bb2); // OR bb += bb2; vs. bb.min() = Foam::min(bb.min(), bb2.min()); bb.max() = Foam::max(bb.max(), bb2.max()); '+=' operator allows the reduction to be used in parallel gather/scatter operations. A global '+' operator is not currently needed. Note: may be useful in the future to have a 'clear()' method that resets to a zero-sized (inverted) box. STYLE: make many bounding box constructors explicit --- applications/test/boundBox/Test-boundBox.C | 57 ++++++++- applications/test/wallDist/Test-wallDist.C | 4 +- .../backgroundMeshDecomposition.C | 12 +- .../manipulation/checkMesh/checkTopology.C | 11 +- .../reconstructParMesh/reconstructParMesh.C | 7 +- src/OpenFOAM/meshes/boundBox/boundBox.C | 66 +++++----- src/OpenFOAM/meshes/boundBox/boundBox.H | 120 +++++++++++++----- src/OpenFOAM/meshes/boundBox/boundBoxI.H | 73 ++++++++++- .../meshes/boundBox/boundBoxTemplates.C | 58 ++++++--- .../PatchTools/PatchToolsSearch.C | 7 +- .../primitiveMesh/primitiveMeshFindCell.C | 5 +- .../primitiveShapes/tetrahedron/tetPoints.H | 9 +- .../primitiveShapes/triangle/triPoints.H | 9 +- .../meshes/treeBoundBox/treeBoundBox.C | 108 +++++----------- .../meshes/treeBoundBox/treeBoundBox.H | 65 +++++----- .../meshes/treeBoundBox/treeBoundBoxI.H | 23 ++-- .../polyMeshGeometry/polyMeshGeometry.C | 5 +- .../shellSurfaces/shellSurfaces.C | 16 +-- src/meshTools/AABBTree/AABBTree.C | 14 +- src/meshTools/indexedOctree/treeDataFace.C | 17 +-- .../indexedOctree/treeDataPrimitivePatch.C | 62 +++------ .../indexedOctree/treeDataPrimitivePatch.H | 3 - .../searchableSurfaceCollection.C | 6 +- .../searchableSurfacesQueries.C | 14 +- .../tetOverlapVolume/tetOverlapVolume.C | 12 +- .../distributedTriSurfaceMesh.C | 34 ++--- .../meshToMesh/meshToMeshParallelOps.C | 7 +- src/sampling/probes/patchProbes.C | 11 +- .../sampledSet/patchCloud/patchCloudSet.C | 15 +-- .../sampledTriSurfaceMesh.C | 6 +- src/triSurface/triSurface/triSurface.C | 7 +- 31 files changed, 443 insertions(+), 420 deletions(-) diff --git a/applications/test/boundBox/Test-boundBox.C b/applications/test/boundBox/Test-boundBox.C index 8d99361a84..9c06ccf711 100644 --- a/applications/test/boundBox/Test-boundBox.C +++ b/applications/test/boundBox/Test-boundBox.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -40,8 +40,8 @@ boundBox cube(scalar start, scalar width) { return boundBox ( - point(start, start, start), - point(start + width, start + width, start + width) + point::uniform(start), + point::uniform(start + width) ); } @@ -59,10 +59,19 @@ int main(int argc, char *argv[]) Info<<"boundBox faces: " << boundBox::faces << endl; Info<<"hex faces: " << hex.modelFaces() << endl; + Info<<"tree-bb faces: " << treeBoundBox::faces << endl; + Info<<"tree-bb edges: " << treeBoundBox::edges << endl; boundBox bb = boundBox::greatBox; Info<<"great box: " << bb << endl; + // bb.clear(); + // Info<<"zero box: " << bb << endl; + + bb = boundBox::invertedBox; + Info<<"invalid box: " << bb << endl; + Info<< nl << endl; + if (Pstream::parRun()) { bb = cube(Pstream::myProcNo(), 1.1); @@ -71,6 +80,48 @@ int main(int argc, char *argv[]) bb.reduce(); Pout<<"reduced: " << bb << endl; } + else + { + bb = cube(0, 1); + Info<<"starting box: " << bb << endl; + + point pt(Zero); + bb.add(pt); + Info<<"enclose point " << pt << " -> " << bb << endl; + + pt = point(0,1.5,0.5); + bb.add(pt); + Info<<"enclose point " << pt << " -> " << bb << endl; + + pt = point(5,2,-2); + bb.add(pt); + Info<<"enclose point " << pt << " -> " << bb << endl; + + // restart with same points + bb = boundBox::invertedBox; + bb.add(point(1,1,1)); + bb.add(point::zero); + bb.add(point(0,1.5,0.5)); + bb.add(point(5,2,-2)); + + Info<<"repeated " << bb << endl; + + boundBox box1 = cube(0, 1); + boundBox box2 = cube(0, 0.75); + boundBox box3 = cube(0.5, 1); + boundBox box4 = cube(-1, 0.5); + + Info<<"union of " << box1 << " and " << box2 << " => "; + + box1.add(box2); + Info<< box1 << endl; + + box1.add(box3); + Info<<"union with " << box3 << " => " << box1 << endl; + + box1.add(box4); + Info<<"union with " << box4 << " => " << box1 << endl; + } return 0; } diff --git a/applications/test/wallDist/Test-wallDist.C b/applications/test/wallDist/Test-wallDist.C index 7a2d4f5cdf..d25bffc006 100644 --- a/applications/test/wallDist/Test-wallDist.C +++ b/applications/test/wallDist/Test-wallDist.C @@ -66,14 +66,14 @@ int main(int argc, char *argv[]) pointField newPoints(mesh.points()); - const point half(0.5*(meshBb.min() + meshBb.max())); + const point half = meshBb.midpoint(); forAll(newPoints, pointi) { point& pt = newPoints[pointi]; // expand around half - pt.y() += pt.y() - half.y(); + pt.y() += pt.y() - half.y(); } mesh.movePoints(newPoints); diff --git a/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C b/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C index 2974598fa4..53c2324aed 100644 --- a/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C +++ b/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -719,17 +719,13 @@ void Foam::backgroundMeshDecomposition::buildPatchAndTree() Pstream::gatherList(allBackgroundMeshBounds_); Pstream::scatterList(allBackgroundMeshBounds_); - point bbMin(GREAT, GREAT, GREAT); - point bbMax(-GREAT, -GREAT, -GREAT); - + // find global bounding box + globalBackgroundBounds_ = treeBoundBox::invertedBox; forAll(allBackgroundMeshBounds_, proci) { - bbMin = min(bbMin, allBackgroundMeshBounds_[proci].min()); - bbMax = max(bbMax, allBackgroundMeshBounds_[proci].max()); + globalBackgroundBounds_.add(allBackgroundMeshBounds_[proci]); } - globalBackgroundBounds_ = treeBoundBox(bbMin, bbMax); - if (false) { OFstream fStr diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkTopology.C b/applications/utilities/mesh/manipulation/checkMesh/checkTopology.C index 2b58f79335..cad195d013 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkTopology.C +++ b/applications/utilities/mesh/manipulation/checkMesh/checkTopology.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -558,18 +558,11 @@ Foam::label Foam::checkTopology if (allGeometry) { - const pointField& pts = pp.points(); const labelList& mp = pp.meshPoints(); if (returnReduce(mp.size(), sumOp