18 #ifndef LIBMESH_ELEM_INTERNAL_H 19 #define LIBMESH_ELEM_INTERNAL_H 22 #include "libmesh/elem.h" 28 class PointLocatorBase;
29 class PeriodicBoundaries;
36 namespace ElemInternal
42 std::vector<T> & family,
53 family.push_back(elem);
58 for (
auto & c : elem->child_ref_range())
68 std::vector<T> & family,
76 family.push_back(elem);
80 if (elem->has_children())
81 for (
auto & c : elem->child_ref_range())
91 std::vector<T> & active_family,
99 active_family.clear();
103 active_family.push_back(elem);
108 for (
auto & c : elem->child_ref_range())
118 std::vector<T> & family,
129 libmesh_assert_less (s, elem->n_sides());
132 family.push_back(elem);
138 const unsigned int nc = elem->n_children();
139 for (
unsigned int c = 0; c != nc; c++)
140 if (!elem->child_ptr(c)->is_remote() && elem->is_child_on_side(c, s))
150 std::vector<T> & family,
158 libmesh_assert_less (s, elem->n_sides());
161 family.push_back(elem);
165 if (elem->has_children())
167 const unsigned int nc = elem->n_children();
168 for (
unsigned int c = 0; c != nc; c++)
169 if (!elem->child_ptr(c)->is_remote() && elem->is_child_on_side(c, s))
179 std::vector<T> & family,
191 libmesh_assert_less (side, elem->n_sides());
195 family.push_back(elem);
201 const unsigned int nc = elem->n_children();
202 for (
unsigned int c = 0; c != nc; c++)
203 if (!elem->child_ptr(c)->is_remote() && elem->is_child_on_side(c, side))
212 std::vector<T> & family,
227 family.push_back(elem);
232 for (
auto & c : elem->child_ref_range())
233 if (!c.is_remote() && c.has_neighbor(neighbor_in))
241 std::vector<T> & family,
253 family.push_back(elem);
257 if (elem->has_children())
258 for (
auto & c : elem->child_ref_range())
259 if (!c.is_remote() && c.has_neighbor(neighbor_in))
267 std::vector<T> & family,
290 if (neighbor_in == subneighbor)
291 family.push_back(elem);
296 for (
auto & c : elem->child_ref_range())
298 for (
auto child_neigh : c.neighbor_ptr_range())
300 (child_neigh == neighbor_in || (child_neigh->parent() == neighbor_in &&
301 child_neigh->is_ancestor_of(subneighbor))))
310 std::vector<T> & family,
330 if (neighbor_in == subneighbor)
331 family.push_back(elem);
335 if (elem->has_children())
336 for (
auto & c : elem->child_ref_range())
338 for (
auto child_neigh : c.neighbor_ptr_range())
340 (child_neigh == neighbor_in ||
341 (child_neigh->parent() == neighbor_in && child_neigh->is_ancestor_of(subneighbor))))
342 c.total_family_tree_by_subneighbor(family, child_neigh, subneighbor,
false);
350 std::vector<T> & family,
365 if (elem->level() >= neighbor_in->level())
371 family.push_back(elem);
375 else if (!elem->active())
376 for (
auto & c : elem->child_ref_range())
377 if (!c.is_remote() && c.has_neighbor(neighbor_in))
386 std::vector<T> & family,
404 if (elem->level() >= neighbor_in->level())
413 family.push_back(elem);
417 else if (!elem->active())
418 for (
auto & c : elem->child_ref_range())
419 if (!c.is_remote() &&
420 c.has_topological_neighbor(neighbor_in,
mesh, point_locator, pb))
421 c.active_family_tree_by_topological_neighbor
422 (family, neighbor_in,
mesh, point_locator, pb,
false);
430 std::set<T> & neighbor_set,
436 this_elem->contains_vertex_of(start_elem,
true));
438 neighbor_set.clear();
439 neighbor_set.insert(start_elem);
441 std::set<T> untested_set, next_untested_set;
442 untested_set.insert(start_elem);
444 while (!untested_set.empty())
448 for (
const auto & elem : untested_set)
449 for (
auto current_neighbor : elem->neighbor_ptr_range())
451 if (current_neighbor &&
452 !current_neighbor->is_remote())
454 if (current_neighbor->active())
456 if (this_elem->contains_vertex_of(current_neighbor,
true)
457 || current_neighbor->contains_vertex_of(this_elem,
true))
460 if (!neighbor_set.count(current_neighbor))
461 next_untested_set.insert (current_neighbor);
464 neighbor_set.insert (current_neighbor);
467 #ifdef LIBMESH_ENABLE_AMR 471 std::vector<T> active_neighbor_children;
473 current_neighbor->active_family_tree_by_neighbor
474 (active_neighbor_children, elem);
476 for (
const auto & current_child : active_neighbor_children)
478 if (this_elem->contains_vertex_of(current_child,
true) ||
479 current_child->contains_vertex_of(this_elem,
true))
482 if (!neighbor_set.count(current_child))
483 next_untested_set.insert (current_child);
485 neighbor_set.insert (current_child);
489 #endif // #ifdef LIBMESH_ENABLE_AMR 492 untested_set.swap(next_untested_set);
493 next_untested_set.clear();
502 std::set<T> & neighbor_set)
504 neighbor_set.clear();
506 if ((this_elem->dim() >= LIBMESH_DIM) ||
507 !this_elem->interior_parent())
510 T ip = this_elem->interior_parent();
512 this_elem->contains_vertex_of(ip,
true));
516 #ifdef LIBMESH_ENABLE_AMR 517 while (!ip->active())
519 for (
auto & child : ip->child_ref_range())
521 if (child.contains_vertex_of(this_elem,
true) ||
522 this_elem->contains_vertex_of(&child,
true))
542 auto it = neighbor_set.begin();
543 const auto end = neighbor_set.end();
548 T current_elem = *current;
552 if (current_elem->level() > this_elem->level())
554 unsigned int vertices_contained = 0;
555 for (
auto & n : current_elem->node_ref_range())
556 if (this_elem->contains_point(n))
557 vertices_contained++;
559 if (vertices_contained <= this_elem->
dim())
561 neighbor_set.erase(current);
567 for (
auto & n : this_elem->node_ref_range())
569 if (!current_elem->contains_point(n))
571 neighbor_set.erase(current);
void total_family_tree(T elem, std::vector< T > &family, bool reset)
void find_interior_neighbors(T this_elem, std::set< T > &neighbor_set)
void total_family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)
void active_family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)
void active_family_tree(T elem, std::vector< T > &active_family, bool reset=true)
We're using a class instead of a typedef to allow forward declarations and future flexibility...
void total_family_tree_by_side(T elem, std::vector< T > &family, unsigned int s, bool reset)
void active_family_tree_by_side(T elem, std::vector< T > &family, unsigned int side, bool reset=true)
The libMesh namespace provides an interface to certain functionality in the library.
This is the MeshBase class.
void family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)
void family_tree(T elem, std::vector< T > &family, bool reset=true)
This is the base class for point locators.
void family_tree_by_subneighbor(T elem, std::vector< T > &family, T neighbor_in, T subneighbor, bool reset=true)
void find_point_neighbors(T this_elem, std::set< T > &neighbor_set, T start_elem)
void family_tree_by_side(T elem, std::vector< T > &family, unsigned int s, bool reset)
void total_family_tree_by_subneighbor(T elem, std::vector< T > &family, T neighbor_in, T subneighbor, bool reset=true)
void active_family_tree_by_topological_neighbor(T elem, std::vector< T > &family, T neighbor_in, const MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb, bool reset=true)