/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2017-2023 OpenCFD Ltd.
-------------------------------------------------------------------------------
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 .
Class
Foam::treeBoundBox
Description
Standard boundBox with extra functionality for use in octree.
Numbering of corner points is according to octant numbering as shown below.
For vertex numbering in the sequence 0 to 7:
- faces 0 and 1 are x-min and x-max, respectively;
- faces 2 and 3 are y-min and y-max, respectively;
- faces 4 and 5 are z-min and z-max, respectively.
.
\verbatim
Octant vertex ordering | Hex cell ordering
(treeBoundBox) | (boundBox, blockMesh, hexCell)
|
6 ---- 7 | 7 ---- 6
f5 |\ :\ f3 | f5 |\ :\ f3
| | 4 ---- 5 \ | | | 4 ---- 5 \
| 2.|....3 | \ | | 3.|....2 | \
| \| \| f2 | | \| \| f2
f4 0 ---- 1 | f4 0 ---- 1
Y Z |
\ | f0 ------ f1 | f0 ------ f1
\| |
o--- X |
\endverbatim
Note
When a bounding box is created without any points, it creates an inverted
bounding box. Points can be added later and the bounding box will grow to
include them.
SeeAlso
Foam::boundBox
SourceFiles
treeBoundBoxI.H
treeBoundBox.C
treeBoundBoxTemplates.C
\*---------------------------------------------------------------------------*/
#ifndef Foam_treeBoundBox_H
#define Foam_treeBoundBox_H
#include "boundBox.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward Declarations
class treeBoundBox;
Istream& operator>>(Istream& is, treeBoundBox& bb);
Ostream& operator<<(Ostream& os, const treeBoundBox& bb);
// List types
typedef List treeBoundBoxList; //!< A List of treeBoundBox
/*---------------------------------------------------------------------------*\
Class treeBoundBox Declaration
\*---------------------------------------------------------------------------*/
class treeBoundBox
:
public boundBox
{
public:
// Enumerations
//- Bits used for octant/point directional encoding.
// Every octant/corner point is the combination of three directions.
// Defined as (1 << vector::components).
enum octantBit : direction
{
RIGHTHALF = 1, //!< 1: positive x-direction
TOPHALF = 2, //!< 2: positive y-direction
FRONTHALF = 4 //!< 4: positive z-direction
};
//- Face codes. Identical order and meaning as per hex cellmodel
//- and boundBox, but have a different point ordering.
// Defined as (2 * vector::components + positive).
enum faceId : direction
{
LEFT = 0, //!< 0: x-min face
RIGHT = 1, //!< 1: x-max face
BOTTOM = 2, //!< 2: y-min face
TOP = 3, //!< 3: y-max face
BACK = 4, //!< 4: z-min face
FRONT = 5 //!< 5: z-max face
};
//- Bits used for face encoding.
// Defined as (1 << (2 * vector::components + positive)).
// For example, the positive Z-face:
// (1 << (2 * vector::Z + 1))
enum faceBit : direction
{
NOFACE = 0, //!< 0: none
LEFTBIT = (1 << LEFT), //!< 1: x-min face
RIGHTBIT = (1 << RIGHT), //!< 2: x-max face
BOTTOMBIT = (1 << BOTTOM), //!< 4: y-min face
TOPBIT = (1 << TOP), //!< 8: y-max face
BACKBIT = (1 << BACK), //!< 16: z-min face
FRONTBIT = (1 << FRONT) //!< 32: z-max face
};
//- Edges codes.
// E01 = edge between 0 and 1.
enum edgeId
{
E01 = 0,
E13 = 1,
E23 = 2,
E02 = 3,
E45 = 4,
E57 = 5,
E67 = 6,
E46 = 7,
E04 = 8,
E15 = 9,
E37 = 10,
E26 = 11
};
// Static Data Members
//- Face to point addressing, using octant corner points.
static const faceList faces;
//- Edge to point addressing, using octant corner points.
static const edgeList edges;
// Static Methods
//- The null treeBoundBox is the same as an inverted box
static const treeBoundBox& null() noexcept
{
return
reinterpret_cast(boundBox::invertedBox);
}
// Standard (Generated) Methods
//- Default construct: an inverted bounding box
treeBoundBox() = default;
//- Copy construct
treeBoundBox(const treeBoundBox&) = default;
//- Copy assignment
treeBoundBox& operator=(const treeBoundBox&) = default;
//- Copy construct from a boundBox
explicit treeBoundBox(const boundBox& bb) : boundBox(bb) {}
//- Copy assignment from a boundBox
void operator=(const boundBox& bb)
{
static_cast(*this) = bb;
}
// Constructors
//- Construct a 0/1 unit bounding box
inline explicit treeBoundBox(Foam::zero_one);
//- Construct a bounding box containing a single initial point
inline explicit treeBoundBox(const point& p);
//- Construct from bound box min/max points
inline treeBoundBox(const point& min, const point& max);
///TBD: Construct from bound box min/max points
///inline explicit treeBoundBox(const MinMax& bb);
//- Construct from bound box min/max points
inline explicit treeBoundBox(const Pair& bb);
//- Construct as the bounding box of the given pointField.
// Local processor domain only (no reduce as in boundBox)
explicit treeBoundBox(const UList& points);
//- Construct as subset of points
// Local processor domain only (no reduce as in boundBox)
treeBoundBox(const UList& points, const labelUList& indices);
//- Construct as subset of points
// The indices could be from edge/triFace etc.
// Local processor domain only (no reduce as in boundBox)
template
treeBoundBox
(
const UList& points,
const FixedList