libMesh
Public Member Functions | Static Public Member Functions | Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes | List of all members
libMesh::PointLocatorTree Class Reference

This is a point locator. More...

#include <point_locator_tree.h>

Inheritance diagram for libMesh::PointLocatorTree:
[legend]

Public Member Functions

 PointLocatorTree (const MeshBase &mesh, const PointLocatorBase *master=nullptr)
 Constructor. More...
 
 PointLocatorTree (const MeshBase &mesh, const Trees::BuildType build_type, const PointLocatorBase *master=nullptr)
 Constructor. More...
 
 ~PointLocatorTree ()
 Destructor. More...
 
virtual void clear () override
 Clears the locator. More...
 
void init (Trees::BuildType build_type)
 Initializes the locator, so that the operator() methods can be used. More...
 
virtual void init () override
 Initializes the locator, so that the operator() methods can be used. More...
 
virtual const Elemoperator() (const Point &p, const std::set< subdomain_id_type > *allowed_subdomains=nullptr) const override
 Locates the element in which the point with global coordinates p is located, optionally restricted to a set of allowed subdomains. More...
 
virtual void operator() (const Point &p, std::set< const Elem * > &candidate_elements, const std::set< subdomain_id_type > *allowed_subdomains=nullptr) const override
 Locates a set of elements in proximity to the point with global coordinates p Pure virtual. More...
 
const Elemperform_linear_search (const Point &p, const std::set< subdomain_id_type > *allowed_subdomains, bool use_close_to_point, Real close_to_point_tolerance=TOLERANCE) const
 As a fallback option, it's helpful to be able to do a linear search over the entire mesh. More...
 
std::set< const Elem * > perform_fuzzy_linear_search (const Point &p, const std::set< subdomain_id_type > *allowed_subdomains, Real close_to_point_tolerance=TOLERANCE) const
 A method to check if "fat" point p is in multiple elements. More...
 
virtual void enable_out_of_mesh_mode () override
 Enables out-of-mesh mode. More...
 
virtual void disable_out_of_mesh_mode () override
 Disables out-of-mesh mode (default). More...
 
void set_target_bin_size (unsigned int target)
 Set the target bin size. More...
 
unsigned int get_target_bin_size () const
 Get the target bin size. More...
 
virtual const Nodelocate_node (const Point &p, const std::set< subdomain_id_type > *allowed_subdomains=nullptr, Real tol=TOLERANCE) const
 
bool initialized () const
 
Real get_close_to_point_tol () const
 Get the close-to-point tolerance. More...
 
virtual void set_close_to_point_tol (Real close_to_point_tol)
 Set a tolerance to use when determining if a point is contained within the mesh. More...
 
virtual void unset_close_to_point_tol ()
 Specify that we do not want to use a user-specified tolerance to determine if a point is contained within the mesh. More...
 
const MeshBaseget_mesh () const
 Get a const reference to this PointLocator's mesh. More...
 

Static Public Member Functions

static std::unique_ptr< PointLocatorBasebuild (PointLocatorType t, const MeshBase &mesh, const PointLocatorBase *master=nullptr)
 Builds an PointLocator for the mesh mesh. More...
 
static std::string get_info ()
 Gets a string containing the reference information. More...
 
static void print_info (std::ostream &out=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info() More...
 
static void disable_print_counter_info ()
 

Public Attributes

bool _verbose
 Boolean flag to indicate whether to print out extra info. More...
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information. More...
 

Protected Member Functions

void increment_constructor_count (const std::string &name)
 Increments the construction counter. More...
 
void increment_destructor_count (const std::string &name)
 Increments the destruction counter. More...
 

Protected Attributes

TreeBase_tree
 Pointer to our tree. More...
 
const Elem_element
 Pointer to the last element that was found by the tree. More...
 
bool _out_of_mesh_mode
 true if out-of-mesh mode is enabled. More...
 
unsigned int _target_bin_size
 Target bin size, which gets passed to the constructor of _tree. More...
 
Trees::BuildType _build_type
 How the underlying tree is built. More...
 
const PointLocatorBase_master
 Const pointer to our master, initialized to nullptr if none given. More...
 
const MeshBase_mesh
 constant reference to the mesh in which the point is looked for. More...
 
bool _initialized
 true when properly initialized, false otherwise. More...
 
bool _use_close_to_point_tol
 true if we will use a user-specified tolerance for locating the element. More...
 
Real _close_to_point_tol
 The tolerance to use. More...
 

Static Protected Attributes

static Counts _counts
 Actually holds the data. More...
 
static Threads::atomic< unsigned int_n_objects
 The number of objects. More...
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting. More...
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called. More...
 

Detailed Description

This is a point locator.

It locates points in space using a tree: given a mesh they return the element and local coordinates for a given point in global coordinates. Use PointLocatorBase::build() to create objects of this type at run time.

Author
Daniel Dreyer
Date
2003

Definition at line 48 of file point_locator_tree.h.

Member Typedef Documentation

◆ Counts

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 117 of file reference_counter.h.

Constructor & Destructor Documentation

◆ PointLocatorTree() [1/2]

libMesh::PointLocatorTree::PointLocatorTree ( const MeshBase mesh,
const PointLocatorBase master = nullptr 
)

Constructor.

Needs the mesh in which the points should be located. Optionally takes a master interpolator. This master helps in saving memory by reducing the number of trees in use. Only the master locator holds a tree, the others simply use the master's tree.

Definition at line 37 of file point_locator_tree.C.

38  :
39  PointLocatorBase (mesh,master),
40  _tree (nullptr),
41  _element (nullptr),
42  _out_of_mesh_mode(false),
43  _target_bin_size (200),
45 {
46  this->init(_build_type);
47 }

References _build_type, and init().

◆ PointLocatorTree() [2/2]

libMesh::PointLocatorTree::PointLocatorTree ( const MeshBase mesh,
const Trees::BuildType  build_type,
const PointLocatorBase master = nullptr 
)

Constructor.

Needs the mesh in which the points should be located. Allows the user to specify the method to use when building the tree. Optionally takes a master interpolator. This master helps in saving memory by reducing the number of trees in use. Only the master locator holds a tree, the others simply use the master's tree. Allows the user to specify the build type.

Definition at line 51 of file point_locator_tree.C.

53  :
54  PointLocatorBase (mesh,master),
55  _tree (nullptr),
56  _element (nullptr),
57  _out_of_mesh_mode(false),
58  _target_bin_size (200),
59  _build_type(build_type)
60 {
61  this->init(_build_type);
62 }

References _build_type, and init().

◆ ~PointLocatorTree()

libMesh::PointLocatorTree::~PointLocatorTree ( )

Destructor.

Definition at line 66 of file point_locator_tree.C.

67 {
68  this->clear ();
69 }

References clear().

Member Function Documentation

◆ build()

std::unique_ptr< PointLocatorBase > libMesh::PointLocatorBase::build ( PointLocatorType  t,
const MeshBase mesh,
const PointLocatorBase master = nullptr 
)
staticinherited

Builds an PointLocator for the mesh mesh.

Optionally takes a master PointLocator to save memory. An std::unique_ptr<PointLocatorBase> is returned to prevent memory leak. This way the user need not remember to delete the object.

Definition at line 66 of file point_locator_base.C.

69 {
70  switch (t)
71  {
72  case TREE:
73  return libmesh_make_unique<PointLocatorTree>(mesh, /*Trees::NODES,*/ master);
74 
75  case TREE_ELEMENTS:
76  return libmesh_make_unique<PointLocatorTree>(mesh, Trees::ELEMENTS, master);
77 
79  return libmesh_make_unique<PointLocatorTree>(mesh, Trees::LOCAL_ELEMENTS, master);
80 
81  default:
82  libmesh_error_msg("ERROR: Bad PointLocatorType = " << t);
83  }
84 }

References libMesh::Trees::ELEMENTS, libMesh::Trees::LOCAL_ELEMENTS, mesh, libMesh::TREE, libMesh::TREE_ELEMENTS, and libMesh::TREE_LOCAL_ELEMENTS.

◆ clear()

void libMesh::PointLocatorTree::clear ( )
overridevirtual

Clears the locator.

This function frees dynamic memory with "delete".

Implements libMesh::PointLocatorBase.

Definition at line 73 of file point_locator_tree.C.

74 {
75  // only delete the tree when we are the master
76  if (this->_tree != nullptr)
77  {
78  if (this->_master == nullptr)
79  // we own the tree
80  delete this->_tree;
81  else
82  // someone else owns and therefore deletes the tree
83  this->_tree = nullptr;
84 
85  // make sure operator () throws an assertion
86  this->_initialized = false;
87  }
88 }

References libMesh::PointLocatorBase::_initialized, libMesh::PointLocatorBase::_master, and _tree.

Referenced by ~PointLocatorTree().

◆ disable_out_of_mesh_mode()

void libMesh::PointLocatorTree::disable_out_of_mesh_mode ( void  )
overridevirtual

Disables out-of-mesh mode (default).

If asked to find a point that is contained in no mesh at all, the point locator will now crash.

Implements libMesh::PointLocatorBase.

Definition at line 342 of file point_locator_tree.C.

343 {
344  _out_of_mesh_mode = false;
345 }

References _out_of_mesh_mode.

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 106 of file reference_counter.C.

107 {
108  _enable_print_counter = false;
109  return;
110 }

References libMesh::ReferenceCounter::_enable_print_counter.

Referenced by libMesh::LibMeshInit::LibMeshInit().

◆ enable_out_of_mesh_mode()

void libMesh::PointLocatorTree::enable_out_of_mesh_mode ( )
overridevirtual

Enables out-of-mesh mode.

In this mode, if asked to find a point that is contained in no mesh at all, the point locator will return nullptr instead of crashing. Per default, this mode is off.

Implements libMesh::PointLocatorBase.

Definition at line 334 of file point_locator_tree.C.

335 {
336  // Out-of-mesh mode should now work properly even on meshes with
337  // non-affine elements.
338  _out_of_mesh_mode = true;
339 }

References _out_of_mesh_mode.

◆ enable_print_counter_info()

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info()

Definition at line 100 of file reference_counter.C.

101 {
102  _enable_print_counter = true;
103  return;
104 }

References libMesh::ReferenceCounter::_enable_print_counter.

◆ get_close_to_point_tol()

Real libMesh::PointLocatorBase::get_close_to_point_tol ( ) const
inherited

Get the close-to-point tolerance.

Definition at line 86 of file point_locator_base.C.

87 {
88  return _close_to_point_tol;
89 }

References libMesh::PointLocatorBase::_close_to_point_tol.

◆ get_info()

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

48 {
49 #if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50 
51  std::ostringstream oss;
52 
53  oss << '\n'
54  << " ---------------------------------------------------------------------------- \n"
55  << "| Reference count information |\n"
56  << " ---------------------------------------------------------------------------- \n";
57 
58  for (const auto & pr : _counts)
59  {
60  const std::string name(pr.first);
61  const unsigned int creations = pr.second.first;
62  const unsigned int destructions = pr.second.second;
63 
64  oss << "| " << name << " reference count information:\n"
65  << "| Creations: " << creations << '\n'
66  << "| Destructions: " << destructions << '\n';
67  }
68 
69  oss << " ---------------------------------------------------------------------------- \n";
70 
71  return oss.str();
72 
73 #else
74 
75  return "";
76 
77 #endif
78 }

References libMesh::ReferenceCounter::_counts, and libMesh::Quality::name().

Referenced by libMesh::ReferenceCounter::print_info().

◆ get_mesh()

const MeshBase & libMesh::PointLocatorBase::get_mesh ( ) const
inherited

Get a const reference to this PointLocator's mesh.

Definition at line 106 of file point_locator_base.C.

107 {
108  return _mesh;
109 }

References libMesh::PointLocatorBase::_mesh.

Referenced by libMesh::PeriodicBoundaries::neighbor().

◆ get_target_bin_size()

unsigned int libMesh::PointLocatorTree::get_target_bin_size ( ) const

Get the target bin size.

Definition at line 354 of file point_locator_tree.C.

355 {
356  return _target_bin_size;
357 }

References _target_bin_size.

Referenced by init().

◆ increment_constructor_count()

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectedinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 181 of file reference_counter.h.

182 {
183  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
184  std::pair<unsigned int, unsigned int> & p = _counts[name];
185 
186  p.first++;
187 }

References libMesh::ReferenceCounter::_counts, libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::ReferenceCountedObject().

◆ increment_destructor_count()

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectedinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 194 of file reference_counter.h.

195 {
196  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
197  std::pair<unsigned int, unsigned int> & p = _counts[name];
198 
199  p.second++;
200 }

References libMesh::ReferenceCounter::_counts, libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::~ReferenceCountedObject().

◆ init() [1/2]

void libMesh::PointLocatorTree::init ( )
overridevirtual

Initializes the locator, so that the operator() methods can be used.

This function allocates dynamic memory with "new".

Implements libMesh::PointLocatorBase.

Definition at line 92 of file point_locator_tree.C.

93 {
94  this->init(_build_type);
95 }

References _build_type.

Referenced by PointLocatorTree().

◆ init() [2/2]

void libMesh::PointLocatorTree::init ( Trees::BuildType  build_type)

Initializes the locator, so that the operator() methods can be used.

This function allocates dynamic memory with "new".

Definition at line 99 of file point_locator_tree.C.

100 {
101  libmesh_assert (!this->_tree);
102 
103  if (this->_initialized)
104  {
105  // Warn that we are already initialized
106  libMesh::err << "Warning: PointLocatorTree already initialized! Will ignore this call..." << std::endl;
107 
108  // Further warn if we try to init() again with a different build_type
109  if (_build_type != build_type)
110  {
111  libMesh::err << "Warning: PointLocatorTree is using build_type = " << _build_type << ".\n"
112  << "Your requested build_type, " << build_type << " will not be used!" << std::endl;
113  }
114  }
115 
116  else
117  {
118  // Let the requested build_type override the _build_type we were
119  // constructed with. This is no big deal since we have not been
120  // initialized before.
121  _build_type = build_type;
122 
123  if (this->_master == nullptr)
124  {
125  LOG_SCOPE("init(no master)", "PointLocatorTree");
126 
127  if (this->_mesh.mesh_dimension() == 3)
129  else
130  {
131  // A 1D/2D mesh in 3D space needs special consideration.
132  // If the mesh is planar XY, we want to build a QuadTree
133  // to search efficiently. If the mesh is truly a manifold,
134  // then we need an octree
135 #if LIBMESH_DIM > 2
136  bool is_planar_xy = false;
137 
138  // Build the bounding box for the mesh. If the delta-z bound is
139  // negligibly small then we can use a quadtree.
140  {
141  BoundingBox bbox = MeshTools::create_bounding_box(this->_mesh);
142 
143  const Real
144  Dx = bbox.second(0) - bbox.first(0),
145  Dz = bbox.second(2) - bbox.first(2);
146 
147  // In order to satisfy is_planar_xy the mesh should be planar and should
148  // also be in the z=0 plane, since otherwise it is incorrect to use a
149  // QuadTree since QuadTrees assume z=0.
150  if ( (std::abs(Dz/(Dx + 1.e-20)) < 1e-10) && (std::abs(bbox.second(2)) < 1.e-10) )
151  is_planar_xy = true;
152  }
153 
154  if (!is_planar_xy)
156  else
157 #endif
158 #if LIBMESH_DIM > 1
160 #else
162 #endif
163  }
164  }
165 
166  else
167  {
168  // We are _not_ the master. Let our Tree point to
169  // the master's tree. But for this we first transform
170  // the master in a state for which we are friends.
171  // And make sure the master has a tree!
172  const PointLocatorTree * my_master =
173  cast_ptr<const PointLocatorTree *>(this->_master);
174 
175  if (my_master->initialized())
176  this->_tree = my_master->_tree;
177  else
178  libmesh_error_msg("ERROR: Initialize master first, then servants!");
179  }
180 
181  // Not all PointLocators may own a tree, but all of them
182  // use their own element pointer. Let the element pointer
183  // be unique for every interpolator.
184  // Suppose the interpolators are used concurrently
185  // at different locations in the mesh, then it makes quite
186  // sense to have unique start elements.
187  this->_element = nullptr;
188  }
189 
190  // ready for take-off
191  this->_initialized = true;
192 }

References _build_type, _element, libMesh::PointLocatorBase::_initialized, libMesh::PointLocatorBase::_master, libMesh::PointLocatorBase::_mesh, _tree, std::abs(), libMesh::MeshTools::create_bounding_box(), libMesh::err, get_target_bin_size(), libMesh::PointLocatorBase::initialized(), libMesh::libmesh_assert(), libMesh::MeshBase::mesh_dimension(), and libMesh::Real.

◆ initialized()

bool libMesh::PointLocatorBase::initialized ( ) const
inherited
Returns
true when this object is properly initialized and ready for use, false otherwise.

Definition at line 59 of file point_locator_base.C.

60 {
61  return this->_initialized;
62 }

References libMesh::PointLocatorBase::_initialized.

Referenced by init().

◆ locate_node()

const Node * libMesh::PointLocatorBase::locate_node ( const Point p,
const std::set< subdomain_id_type > *  allowed_subdomains = nullptr,
Real  tol = TOLERANCE 
) const
virtualinherited
Returns
A pointer to a Node with global coordinates p or nullptr if no such Node can be found.

Virtual subclasses can override for efficiency, but the base class has a default implementation that works based on element lookup.

Optionally allows the user to restrict the subdomains searched; with such a restriction, only a Node belonging to an element on one or more of those subdomains will be returned.

Will only return a Node whose distance from p is less than tol multiplied by the size of a semilocal element which contains p.

Definition at line 114 of file point_locator_base.C.

117 {
118  std::set<const Elem *> candidate_elements;
119  this->operator()(p, candidate_elements, allowed_subdomains);
120 
121  for (const auto & elem : candidate_elements)
122  {
123  const int elem_n_nodes = elem->n_nodes();
124  const Real hmax = elem->hmax();
125  const Real dist_tol_sq = (tol * hmax) * (tol * hmax);
126 
127  for (int n=0; n != elem_n_nodes; ++n)
128  if ((elem->point(n) - p).norm_sq() < dist_tol_sq)
129  return elem->node_ptr(n);
130  }
131 
132  return nullptr;
133 }

References libMesh::TensorTools::norm_sq(), libMesh::PointLocatorBase::operator()(), and libMesh::Real.

◆ n_objects()

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 83 of file reference_counter.h.

84  { return _n_objects; }

References libMesh::ReferenceCounter::_n_objects.

◆ operator()() [1/2]

const Elem * libMesh::PointLocatorTree::operator() ( const Point p,
const std::set< subdomain_id_type > *  allowed_subdomains = nullptr 
) const
overridevirtual

Locates the element in which the point with global coordinates p is located, optionally restricted to a set of allowed subdomains.

The mutable _element member is used to cache the result and allow it to be used during the next call to operator().

Implements libMesh::PointLocatorBase.

Definition at line 196 of file point_locator_tree.C.

198 {
200 
201  LOG_SCOPE("operator()", "PointLocatorTree");
202 
203  // If we're provided with an allowed_subdomains list and have a cached element, make sure it complies
204  if (allowed_subdomains && this->_element && !allowed_subdomains->count(this->_element->subdomain_id())) this->_element = nullptr;
205 
206  // First check the element from last time before asking the tree
207  if (this->_element==nullptr || !(this->_element->contains_point(p)))
208  {
209  // ask the tree
210  this->_element = this->_tree->find_element (p,allowed_subdomains);
211 
212  if (this->_element == nullptr)
213  {
214  // If we haven't found the element, we may want to do a linear
215  // search using a tolerance.
217  {
218  if (_verbose)
219  {
220  libMesh::out << "Performing linear search using close-to-point tolerance "
222  << std::endl;
223  }
224 
225  this->_element =
226  this->perform_linear_search(p,
227  allowed_subdomains,
228  /*use_close_to_point*/ true,
230 
231  return this->_element;
232  }
233 
234  // No element seems to contain this point. In theory, our
235  // tree now correctly handles curved elements. In
236  // out-of-mesh mode this is sometimes expected, and we can
237  // just return nullptr without searching further. Out of
238  // out-of-mesh mode, something must have gone wrong.
239  libmesh_assert_equal_to (_out_of_mesh_mode, true);
240 
241  return this->_element;
242  }
243  }
244 
245  // If we found an element, it should be active
246  libmesh_assert (!this->_element || this->_element->active());
247 
248  // If we found an element and have a restriction list, they better match
249  libmesh_assert (!this->_element || !allowed_subdomains || allowed_subdomains->count(this->_element->subdomain_id()));
250 
251  // return the element
252  return this->_element;
253 }

References libMesh::PointLocatorBase::_close_to_point_tol, _element, libMesh::PointLocatorBase::_initialized, _out_of_mesh_mode, _tree, libMesh::PointLocatorBase::_use_close_to_point_tol, libMesh::PointLocatorBase::_verbose, libMesh::Elem::active(), libMesh::Elem::contains_point(), libMesh::TreeBase::find_element(), libMesh::libmesh_assert(), libMesh::out, and perform_linear_search().

◆ operator()() [2/2]

void libMesh::PointLocatorTree::operator() ( const Point p,
std::set< const Elem * > &  candidate_elements,
const std::set< subdomain_id_type > *  allowed_subdomains = nullptr 
) const
overridevirtual

Locates a set of elements in proximity to the point with global coordinates p Pure virtual.

Optionally allows the user to restrict the subdomains searched.

Implements libMesh::PointLocatorBase.

Definition at line 256 of file point_locator_tree.C.

259 {
261 
262  LOG_SCOPE("operator() - Version 2", "PointLocatorTree");
263 
264  // ask the tree
265  this->_tree->find_elements (p, candidate_elements, allowed_subdomains, _close_to_point_tol);
266 }

References libMesh::PointLocatorBase::_close_to_point_tol, libMesh::PointLocatorBase::_initialized, _tree, libMesh::TreeBase::find_elements(), and libMesh::libmesh_assert().

◆ perform_fuzzy_linear_search()

std::set< const Elem * > libMesh::PointLocatorTree::perform_fuzzy_linear_search ( const Point p,
const std::set< subdomain_id_type > *  allowed_subdomains,
Real  close_to_point_tolerance = TOLERANCE 
) const

A method to check if "fat" point p is in multiple elements.

This would happen if p is close to a face or node. This is important for evaluating MeshFunction on faces when discontinuous shape functions are used.

Definition at line 308 of file point_locator_tree.C.

311 {
312  LOG_SCOPE("perform_fuzzy_linear_search", "PointLocatorTree");
313 
314  std::set<const Elem *> candidate_elements;
315 
316  // The type of iterator depends on the Trees::BuildType
317  // used for this PointLocator. If it's
318  // TREE_LOCAL_ELEMENTS, we only want to double check
319  // local elements during this linear search.
320  SimpleRange<MeshBase::const_element_iterator> r =
324 
325  for (const auto & elem : r)
326  if ((!allowed_subdomains || allowed_subdomains->count(elem->subdomain_id())) && elem->close_to_point(p, close_to_point_tolerance))
327  candidate_elements.insert(elem);
328 
329  return candidate_elements;
330 }

References _build_type, libMesh::PointLocatorBase::_mesh, libMesh::MeshBase::active_element_ptr_range(), libMesh::MeshBase::active_local_element_ptr_range(), and libMesh::Trees::LOCAL_ELEMENTS.

◆ perform_linear_search()

const Elem * libMesh::PointLocatorTree::perform_linear_search ( const Point p,
const std::set< subdomain_id_type > *  allowed_subdomains,
bool  use_close_to_point,
Real  close_to_point_tolerance = TOLERANCE 
) const

As a fallback option, it's helpful to be able to do a linear search over the entire mesh.

This can be used if operator() fails to find an element that contains p, for example. Optionally specify a "close to point" tolerance to use in the linear search. Return nullptr if no element is found.

Definition at line 270 of file point_locator_tree.C.

274 {
275  LOG_SCOPE("perform_linear_search", "PointLocatorTree");
276 
277  // The type of iterator depends on the Trees::BuildType
278  // used for this PointLocator. If it's
279  // TREE_LOCAL_ELEMENTS, we only want to double check
280  // local elements during this linear search.
281  SimpleRange<MeshBase::const_element_iterator> r =
285 
286  for (const auto & elem : r)
287  {
288  if (!allowed_subdomains ||
289  allowed_subdomains->count(elem->subdomain_id()))
290  {
291  if (!use_close_to_point)
292  {
293  if (elem->contains_point(p))
294  return elem;
295  }
296  else
297  {
298  if (elem->close_to_point(p, close_to_point_tolerance))
299  return elem;
300  }
301  }
302  }
303 
304  return nullptr;
305 }

References _build_type, libMesh::PointLocatorBase::_mesh, libMesh::MeshBase::active_element_ptr_range(), libMesh::MeshBase::active_local_element_ptr_range(), and libMesh::Trees::LOCAL_ELEMENTS.

Referenced by operator()().

◆ print_info()

void libMesh::ReferenceCounter::print_info ( std::ostream &  out = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 87 of file reference_counter.C.

88 {
90  out_stream << ReferenceCounter::get_info();
91 }

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

◆ set_close_to_point_tol()

void libMesh::PointLocatorBase::set_close_to_point_tol ( Real  close_to_point_tol)
virtualinherited

Set a tolerance to use when determining if a point is contained within the mesh.

Definition at line 92 of file point_locator_base.C.

93 {
95  _close_to_point_tol = close_to_point_tol;
96 }

References libMesh::PointLocatorBase::_close_to_point_tol, and libMesh::PointLocatorBase::_use_close_to_point_tol.

Referenced by libMesh::MeshFunction::set_point_locator_tolerance().

◆ set_target_bin_size()

void libMesh::PointLocatorTree::set_target_bin_size ( unsigned int  target)

Set the target bin size.

Definition at line 348 of file point_locator_tree.C.

349 {
350  _target_bin_size = target_bin_size;
351 }

References _target_bin_size.

◆ unset_close_to_point_tol()

void libMesh::PointLocatorBase::unset_close_to_point_tol ( )
virtualinherited

Specify that we do not want to use a user-specified tolerance to determine if a point is contained within the mesh.

Definition at line 99 of file point_locator_base.C.

100 {
101  _use_close_to_point_tol = false;
103 }

References libMesh::PointLocatorBase::_close_to_point_tol, libMesh::PointLocatorBase::_use_close_to_point_tol, and libMesh::TOLERANCE.

Referenced by libMesh::MeshFunction::unset_point_locator_tolerance().

Member Data Documentation

◆ _build_type

Trees::BuildType libMesh::PointLocatorTree::_build_type
protected

How the underlying tree is built.

Definition at line 194 of file point_locator_tree.h.

Referenced by init(), perform_fuzzy_linear_search(), perform_linear_search(), and PointLocatorTree().

◆ _close_to_point_tol

Real libMesh::PointLocatorBase::_close_to_point_tol
protectedinherited

◆ _counts

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

◆ _element

const Elem* libMesh::PointLocatorTree::_element
mutableprotected

Pointer to the last element that was found by the tree.

Chances are that this may be close to the next call to operator()...

Definition at line 178 of file point_locator_tree.h.

Referenced by init(), and operator()().

◆ _enable_print_counter

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 141 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _initialized

bool libMesh::PointLocatorBase::_initialized
protectedinherited

true when properly initialized, false otherwise.

Definition at line 201 of file point_locator_base.h.

Referenced by clear(), init(), libMesh::PointLocatorBase::initialized(), and operator()().

◆ _master

const PointLocatorBase* libMesh::PointLocatorBase::_master
protectedinherited

Const pointer to our master, initialized to nullptr if none given.

When using multiple PointLocators, one can be assigned master and be in charge of something that all can have access to.

Definition at line 191 of file point_locator_base.h.

Referenced by clear(), init(), and libMesh::PointLocatorBase::PointLocatorBase().

◆ _mesh

const MeshBase& libMesh::PointLocatorBase::_mesh
protectedinherited

constant reference to the mesh in which the point is looked for.

Definition at line 196 of file point_locator_base.h.

Referenced by libMesh::PointLocatorBase::get_mesh(), init(), perform_fuzzy_linear_search(), and perform_linear_search().

◆ _mutex

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 135 of file reference_counter.h.

◆ _n_objects

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 130 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _out_of_mesh_mode

bool libMesh::PointLocatorTree::_out_of_mesh_mode
protected

true if out-of-mesh mode is enabled.

See enable_out_of_mesh_mode() for details.

Definition at line 184 of file point_locator_tree.h.

Referenced by disable_out_of_mesh_mode(), enable_out_of_mesh_mode(), and operator()().

◆ _target_bin_size

unsigned int libMesh::PointLocatorTree::_target_bin_size
protected

Target bin size, which gets passed to the constructor of _tree.

Definition at line 189 of file point_locator_tree.h.

Referenced by get_target_bin_size(), and set_target_bin_size().

◆ _tree

TreeBase* libMesh::PointLocatorTree::_tree
protected

Pointer to our tree.

The tree is built at run-time through init(). For servant PointLocators (not master), this simply points to the tree of the master.

Definition at line 171 of file point_locator_tree.h.

Referenced by clear(), init(), and operator()().

◆ _use_close_to_point_tol

bool libMesh::PointLocatorBase::_use_close_to_point_tol
protectedinherited

true if we will use a user-specified tolerance for locating the element.

Definition at line 207 of file point_locator_base.h.

Referenced by operator()(), libMesh::PointLocatorBase::PointLocatorBase(), libMesh::PointLocatorBase::set_close_to_point_tol(), and libMesh::PointLocatorBase::unset_close_to_point_tol().

◆ _verbose

bool libMesh::PointLocatorBase::_verbose
inherited

Boolean flag to indicate whether to print out extra info.

Definition at line 183 of file point_locator_base.h.

Referenced by operator()().


The documentation for this class was generated from the following files:
libMesh::TREE_LOCAL_ELEMENTS
Definition: enum_point_locator_type.h:38
libMesh::TREE
Definition: enum_point_locator_type.h:36
libMesh::PointLocatorBase::_master
const PointLocatorBase * _master
Const pointer to our master, initialized to nullptr if none given.
Definition: point_locator_base.h:191
libMesh::Elem::contains_point
virtual bool contains_point(const Point &p, Real tol=TOLERANCE) const
Definition: elem.C:2094
libMesh::PointLocatorTree::_build_type
Trees::BuildType _build_type
How the underlying tree is built.
Definition: point_locator_tree.h:194
libMesh::Trees::LOCAL_ELEMENTS
Definition: tree_base.h:57
libMesh::MeshBase::active_local_element_ptr_range
virtual SimpleRange< element_iterator > active_local_element_ptr_range()=0
libMesh::Trees::BinaryTree
Tree< 2 > BinaryTree
A BinaryTree is a tree appropriate for 1D meshes.
Definition: tree.h:133
libMesh::MeshBase::active_element_ptr_range
virtual SimpleRange< element_iterator > active_element_ptr_range()=0
libMesh::TREE_ELEMENTS
Definition: enum_point_locator_type.h:37
libMesh::PointLocatorTree::_target_bin_size
unsigned int _target_bin_size
Target bin size, which gets passed to the constructor of _tree.
Definition: point_locator_tree.h:189
libMesh::PointLocatorBase::_verbose
bool _verbose
Boolean flag to indicate whether to print out extra info.
Definition: point_locator_base.h:183
libMesh::ReferenceCounter::_counts
static Counts _counts
Actually holds the data.
Definition: reference_counter.h:122
libMesh::TOLERANCE
static const Real TOLERANCE
Definition: libmesh_common.h:128
libMesh::PointLocatorBase::_close_to_point_tol
Real _close_to_point_tol
The tolerance to use.
Definition: point_locator_base.h:212
libMesh::ReferenceCounter::_n_objects
static Threads::atomic< unsigned int > _n_objects
The number of objects.
Definition: reference_counter.h:130
mesh
MeshBase & mesh
Definition: mesh_communication.C:1257
libMesh::MeshBase::mesh_dimension
unsigned int mesh_dimension() const
Definition: mesh_base.C:135
libMesh::ReferenceCounter::get_info
static std::string get_info()
Gets a string containing the reference information.
Definition: reference_counter.C:47
libMesh::TreeBase::find_element
virtual const Elem * find_element(const Point &p, const std::set< subdomain_id_type > *allowed_subdomains=nullptr, Real relative_tol=TOLERANCE) const =0
libMesh::Elem::active
bool active() const
Definition: elem.h:2345
libMesh::PointLocatorTree::PointLocatorTree
PointLocatorTree(const MeshBase &mesh, const PointLocatorBase *master=nullptr)
Constructor.
Definition: point_locator_tree.C:37
libMesh::libmesh_assert
libmesh_assert(ctx)
libMesh::PointLocatorBase::_use_close_to_point_tol
bool _use_close_to_point_tol
true if we will use a user-specified tolerance for locating the element.
Definition: point_locator_base.h:207
libMesh::MeshTools::create_bounding_box
libMesh::BoundingBox create_bounding_box(const MeshBase &mesh)
The same functionality as the deprecated MeshTools::bounding_box().
Definition: mesh_tools.C:389
std::abs
MetaPhysicL::DualNumber< T, D > abs(const MetaPhysicL::DualNumber< T, D > &in)
libMesh::Threads::spin_mtx
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:29
libMesh::PointLocatorBase::operator()
virtual const Elem * operator()(const Point &p, const std::set< subdomain_id_type > *allowed_subdomains=nullptr) const =0
Locates the element in which the point with global coordinates p is located.
libMesh::PointLocatorTree::clear
virtual void clear() override
Clears the locator.
Definition: point_locator_tree.C:73
libMesh::TreeBase::find_elements
virtual void find_elements(const Point &p, std::set< const Elem * > &candidate_elements, const std::set< subdomain_id_type > *allowed_subdomains=nullptr, Real relative_tol=TOLERANCE) const =0
Fills candidate_elements with any elements containing the specified point p, optionally restricted to...
libMesh::PointLocatorTree::_out_of_mesh_mode
bool _out_of_mesh_mode
true if out-of-mesh mode is enabled.
Definition: point_locator_tree.h:184
libMesh::PointLocatorTree::init
virtual void init() override
Initializes the locator, so that the operator() methods can be used.
Definition: point_locator_tree.C:92
libMesh::TensorTools::norm_sq
T norm_sq(std::complex< T > a)
Definition: tensor_tools.h:85
libMesh::PointLocatorTree::perform_linear_search
const Elem * perform_linear_search(const Point &p, const std::set< subdomain_id_type > *allowed_subdomains, bool use_close_to_point, Real close_to_point_tolerance=TOLERANCE) const
As a fallback option, it's helpful to be able to do a linear search over the entire mesh.
Definition: point_locator_tree.C:270
libMesh::PointLocatorBase::_mesh
const MeshBase & _mesh
constant reference to the mesh in which the point is looked for.
Definition: point_locator_base.h:196
libMesh::Trees::NODES
Definition: tree_base.h:55
libMesh::PointLocatorTree::_element
const Elem * _element
Pointer to the last element that was found by the tree.
Definition: point_locator_tree.h:178
libMesh::err
OStreamProxy err
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
libMesh::Trees::OctTree
Tree< 8 > OctTree
An OctTree is a tree appropriate for 3D meshes.
Definition: tree.h:145
libMesh::ReferenceCounter::_enable_print_counter
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called.
Definition: reference_counter.h:141
libMesh::PointLocatorTree::get_target_bin_size
unsigned int get_target_bin_size() const
Get the target bin size.
Definition: point_locator_tree.C:354
libMesh::out
OStreamProxy out
libMesh::PointLocatorTree::_tree
TreeBase * _tree
Pointer to our tree.
Definition: point_locator_tree.h:171
libMesh::PointLocatorBase::_initialized
bool _initialized
true when properly initialized, false otherwise.
Definition: point_locator_base.h:201
libMesh::Trees::QuadTree
Tree< 4 > QuadTree
A QuadTree is a tree appropriate for 2D meshes.
Definition: tree.h:139
libMesh::Trees::ELEMENTS
Definition: tree_base.h:56
libMesh::Quality::name
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
libMesh::PointLocatorBase::PointLocatorBase
PointLocatorBase(const MeshBase &mesh, const PointLocatorBase *master)
Constructor.
Definition: point_locator_base.C:34