/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2018 OpenFOAM Foundation Copyright (C) 2018-2020 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::meshSearch Description Various (local, not parallel) searches on polyMesh; uses (demand driven) octree to search. SourceFiles meshSearch.C \*---------------------------------------------------------------------------*/ #ifndef meshSearch_H #define meshSearch_H #include "pointIndexHit.H" #include "pointField.H" #include "polyMesh.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { // Forward Declarations class treeDataCell; class treeDataFace; template class indexedOctree; class treeBoundBox; /*---------------------------------------------------------------------------*\ Class meshSearch Declaration \*---------------------------------------------------------------------------*/ class meshSearch { // Private Data //- Reference to mesh const polyMesh& mesh_; //- Whether to use cell decomposition for all geometric tests const polyMesh::cellDecomposition cellDecompMode_; //- Data bounding box mutable autoPtr overallBbPtr_; //- Demand driven octrees mutable autoPtr> boundaryTreePtr_; mutable autoPtr> nonCoupledBoundaryTreePtr_; mutable autoPtr> cellTreePtr_; // Private Member Functions //- Updates nearestI, nearestDistSqr from any closer ones. static bool findNearer ( const point& sample, const pointField& points, label& nearestI, scalar& nearestDistSqr ); //- Updates nearestI, nearestDistSqr from any selected closer ones. static bool findNearer ( const point& sample, const pointField& points, const labelList& indices, label& nearestI, scalar& nearestDistSqr ); // Points //- Demand-driven bounding box for mesh points const treeBoundBox& dataBoundBox() const; // Cells //- Nearest cell centre using octree label findNearestCellTree(const point&) const; //- Nearest cell centre going through all cells label findNearestCellLinear(const point&) const; //- Walk from seed. Does not 'go around' boundary, just returns // last cell before boundary. label findNearestCellWalk(const point&, const label) const; //- Cell containing location. Linear search. label findCellLinear(const point&) const; //- Walk from seed. Does not 'go around' boundary, just returns // last cell before boundary. label findCellWalk(const point&, const label) const; // Faces label findNearestFaceTree(const point&) const; label findNearestFaceLinear(const point&) const; label findNearestFaceWalk(const point&, const label) const; // Boundary faces //- Walk from seed to find nearest boundary face. Gets stuck in // local minimum. label findNearestBoundaryFaceWalk ( const point& location, const label seedFacei ) const; //- No copy construct meshSearch(const meshSearch&) = delete; //- No copy assignment void operator=(const meshSearch&) = delete; public: //- Declare type-name (with debug switch) ClassName("meshSearch"); // Static Data //- Tolerance on linear dimensions static scalar tol_; // Constructors //- Construct from components. // Constructs bb slightly bigger than mesh points bb. explicit meshSearch ( const polyMesh& mesh, const polyMesh::cellDecomposition = polyMesh::CELL_TETS ); //- Construct with a custom bounding box. // Any mesh element outside bb will not be found. // Up to user to ensure bb extends slightly beyond wanted elements. meshSearch ( const polyMesh& mesh, const treeBoundBox& bb, const polyMesh::cellDecomposition = polyMesh::CELL_TETS ); //- Destructor ~meshSearch(); // Member Functions // Access const polyMesh& mesh() const { return mesh_; } polyMesh::cellDecomposition decompMode() const { return cellDecompMode_; } //- Demand-driven reference to octree holding all boundary faces const indexedOctree& boundaryTree() const; //- Demand-driven reference to octree holding all //- non-coupled boundary faces const indexedOctree& nonCoupledBoundaryTree() const; //- Demand-driven reference to octree holding all cells const indexedOctree& cellTree() const; // Queries //- Find nearest cell in terms of cell centre. // Options: // - use octree // - use linear search // - if seed is provided walk. (uses findNearestCellWalk; // does not handle holes in domain) label findNearestCell ( const point& location, const label seedCelli = -1, const bool useTreeSearch = true ) const; label findNearestFace ( const point& location, const label seedFacei = -1, const bool useTreeSearch = true ) const; //- Find cell containing location. // If seed provided walks and falls back to linear/tree search. // (so handles holes correctly)s // Returns -1 if not in domain. label findCell ( const point& location, const label seedCelli = -1, const bool useTreeSearch = true ) const; //- Find nearest boundary face // If seed provided walks but then does not pass local minima // in distance. Also does not jump from one connected region to // the next. label findNearestBoundaryFace ( const point& location, const label seedFacei = -1, const bool useTreeSearch = true ) const; //- Find first intersection of boundary in segment [pStart, pEnd] // (so inclusive of endpoints). Always octree for now pointIndexHit intersection(const point& pStart, const point& pEnd) const; //- Find all intersections of boundary within segment pStart .. pEnd // Always octree for now List intersections ( const point& pStart, const point& pEnd ) const; //- Determine inside/outside status bool isInside(const point&) const; //- Delete all storage void clearOut(); //- Correct for mesh geom/topo changes void correct(); }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //