Line data Source code
1 : // The libMesh Finite Element Library. 2 : // Copyright (C) 2002-2025 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner 3 : 4 : // This library is free software; you can redistribute it and/or 5 : // modify it under the terms of the GNU Lesser General Public 6 : // License as published by the Free Software Foundation; either 7 : // version 2.1 of the License, or (at your option) any later version. 8 : 9 : // This library is distributed in the hope that it will be useful, 10 : // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 : // Lesser General Public License for more details. 13 : 14 : // You should have received a copy of the GNU Lesser General Public 15 : // License along with this library; if not, write to the Free Software 16 : // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 : 18 : 19 : 20 : #ifndef LIBMESH_TREE_BASE_H 21 : #define LIBMESH_TREE_BASE_H 22 : 23 : // Local includes 24 : #include "libmesh/reference_counted_object.h" 25 : #include "libmesh/id_types.h" // subdomain_id_type 26 : #include "libmesh/libmesh_common.h" // TOLERANCE 27 : 28 : // C++ includes 29 : #include <set> 30 : #include <ostream> 31 : 32 : namespace libMesh 33 : { 34 : 35 : 36 : // Forward Declarations 37 : class TreeBase; 38 : class MeshBase; 39 : class Point; 40 : class Elem; 41 : 42 : 43 : namespace Trees 44 : { 45 : /** 46 : * \p enum defining how to build the tree. \p NODES will populate the 47 : * tree with nodes and then replace the nodes with element 48 : * connectivity, \p ELEMENTS will populate the tree with the elements 49 : * directly. LOCAL_ELEMENTS will populate the tree only with elements 50 : * from the current processor. This experimental capability may be 51 : * useful if you do not wish to include off-processor elements in the 52 : * search for a Point. 53 : * 54 : * \author Daniel Dreyer 55 : * \date 2003 56 : * \brief Base class for different Tree types. 57 : */ 58 : enum BuildType : int {NODES=0, 59 : ELEMENTS, 60 : LOCAL_ELEMENTS, 61 : INVALID_BUILD_TYPE }; 62 : } 63 : 64 : /** 65 : * This is the base class for trees, it allows pointer 66 : * usage of trees. 67 : */ 68 : class TreeBase : public ReferenceCountedObject<TreeBase> 69 : { 70 : protected: 71 : /** 72 : * Constructor. Protected. 73 : */ 74 : explicit 75 13053 : TreeBase (const MeshBase & m) : mesh(m) {} 76 : 77 : public: 78 : /** 79 : * Destructor. 80 : */ 81 12547 : virtual ~TreeBase() = default; 82 : 83 : /** 84 : * Prints the nodes. 85 : */ 86 : virtual void print_nodes(std::ostream & out_stream=libMesh::out) const = 0; 87 : 88 : /** 89 : * Prints the nodes. 90 : */ 91 : virtual void print_elements(std::ostream & out_stream=libMesh::out) const = 0; 92 : 93 : /** 94 : * \returns The number of active bins. 95 : */ 96 : virtual unsigned int n_active_bins() const = 0; 97 : 98 : /** 99 : * \returns A pointer to the element containing point p, 100 : * optionally restricted to a set of allowed subdomains, 101 : * optionally using a non-zero relative tolerance for searches. 102 : */ 103 : virtual const Elem * find_element(const Point & p, 104 : const std::set<subdomain_id_type> * allowed_subdomains = nullptr, 105 : Real relative_tol = TOLERANCE) const = 0; 106 : 107 : /** 108 : * Fills \p candidate_elements with any elements containing the 109 : * specified point \p p, 110 : * optionally restricted to a set of allowed subdomains, 111 : * optionally using a non-default relative tolerance for searches. 112 : */ 113 : virtual void find_elements(const Point & p, 114 : std::set<const Elem *> & candidate_elements, 115 : const std::set<subdomain_id_type> * allowed_subdomains = nullptr, 116 : Real relative_tol = TOLERANCE) const = 0; 117 : 118 : protected: 119 : 120 : /** 121 : * Constant reference to a mesh. Declared 122 : * at construction. 123 : */ 124 : const MeshBase & mesh; 125 : }; 126 : 127 : } // namespace libMesh 128 : 129 : 130 : #endif // LIBMESH_TREE_BASE_H