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,
 
  162   libmesh_assert_less (side, elem->n_sides());
 
  166     family.push_back(elem);
 
  172       const unsigned int nc = elem->n_children();
 
  173       for (
unsigned int c = 0; c != nc; c++)
 
  174         if (!elem->child_ptr(c)->is_remote() && elem->is_child_on_side(c, side))
 
  183                          std::vector<T> & family,
 
  198   family.push_back(elem);
 
  203     for (
auto & c : elem->child_ref_range())
 
  204       if (!c.is_remote() && c.has_neighbor(neighbor_in))
 
  212                                std::vector<T> & family,
 
  224   family.push_back(elem);
 
  228   if (elem->has_children())
 
  229     for (
auto & c : elem->child_ref_range())
 
  230       if (!c.is_remote() && c.has_neighbor(neighbor_in))
 
  238                             std::vector<T> & family,
 
  261   if (neighbor_in == subneighbor)
 
  262     family.push_back(elem);
 
  267     for (
auto & c : elem->child_ref_range())
 
  269         for (
auto child_neigh : c.neighbor_ptr_range())
 
  271               (child_neigh == neighbor_in || (child_neigh->parent() == neighbor_in &&
 
  272                                               child_neigh->is_ancestor_of(subneighbor))))
 
  281                                  std::vector<T> & family,
 
  301   if (neighbor_in == subneighbor)
 
  302     family.push_back(elem);
 
  306   if (elem->has_children())
 
  307     for (
auto & c : elem->child_ref_range())
 
  309         for (
auto child_neigh : c.neighbor_ptr_range())
 
  311               (child_neigh == neighbor_in ||
 
  312                (child_neigh->parent() == neighbor_in && child_neigh->is_ancestor_of(subneighbor))))
 
  313             c.total_family_tree_by_subneighbor(family, child_neigh, subneighbor, 
false);
 
  321                                std::vector<T> & family,
 
  336   if (elem->level() >= neighbor_in->level())
 
  342     family.push_back(elem);
 
  346   else if (!elem->active())
 
  347     for (
auto & c : elem->child_ref_range())
 
  348       if (!c.is_remote() && c.has_neighbor(neighbor_in))
 
  357                                             std::vector<T> & family,
 
  375   if (elem->level() >= neighbor_in->level())
 
  384     family.push_back(elem);
 
  388   else if (!elem->active())
 
  389     for (
auto & c : elem->child_ref_range())
 
  390       if (!c.is_remote() &&
 
  391           c.has_topological_neighbor(neighbor_in, 
mesh, point_locator, pb))
 
  392         c.active_family_tree_by_topological_neighbor
 
  393           (family, neighbor_in, 
mesh, point_locator, pb, 
false);
 
  401                      std::set<T> & neighbor_set,
 
  407                  this_elem->contains_vertex_of(start_elem));
 
  409   neighbor_set.clear();
 
  410   neighbor_set.insert(start_elem);
 
  412   std::set<T> untested_set, next_untested_set;
 
  413   untested_set.insert(start_elem);
 
  415   while (!untested_set.empty())
 
  419       for (
const auto & elem : untested_set)
 
  420           for (
auto current_neighbor : elem->neighbor_ptr_range())
 
  422               if (current_neighbor &&
 
  423                   !current_neighbor->is_remote())    
 
  425                   if (current_neighbor->active())                
 
  427                       if (this_elem->contains_vertex_of(current_neighbor) 
 
  428                           || current_neighbor->contains_vertex_of(this_elem))
 
  431                           if (!neighbor_set.count(current_neighbor))
 
  432                             next_untested_set.insert (current_neighbor);
 
  435                           neighbor_set.insert (current_neighbor);
 
  438 #ifdef LIBMESH_ENABLE_AMR 
  442                       std::vector<T> active_neighbor_children;
 
  444                       current_neighbor->active_family_tree_by_neighbor
 
  445                         (active_neighbor_children, elem);
 
  447                       for (
const auto & current_child : active_neighbor_children)
 
  449                           if (this_elem->contains_vertex_of(current_child) ||
 
  450                               current_child->contains_vertex_of(this_elem))
 
  453                               if (!neighbor_set.count(current_child))
 
  454                                 next_untested_set.insert (current_child);
 
  456                               neighbor_set.insert (current_child);
 
  460 #endif // #ifdef LIBMESH_ENABLE_AMR 
  463       untested_set.swap(next_untested_set);
 
  464       next_untested_set.clear();
 
  473                         std::set<T> & neighbor_set)
 
  475   neighbor_set.clear();
 
  477   if ((this_elem->dim() >= LIBMESH_DIM) ||
 
  478       !this_elem->interior_parent())
 
  481   T ip = this_elem->interior_parent();
 
  483                   this_elem->contains_vertex_of(ip));
 
  487 #ifdef LIBMESH_ENABLE_AMR 
  488   while (!ip->active()) 
 
  490       for (
auto & child : ip->child_ref_range())
 
  492           if (child.contains_vertex_of(this_elem) ||
 
  493               this_elem->contains_vertex_of(&child))
 
  513   auto it = neighbor_set.begin();
 
  514   const auto end = neighbor_set.end();
 
  519       T current_elem = *current;
 
  523       if (current_elem->level() > this_elem->level())
 
  525           unsigned int vertices_contained = 0;
 
  526           for (
auto & n : current_elem->node_ref_range())
 
  527             if (this_elem->contains_point(n))
 
  528               vertices_contained++;
 
  530           if (vertices_contained <= this_elem->
dim())
 
  532               neighbor_set.erase(current);
 
  538           for (
auto & n : this_elem->node_ref_range())
 
  540               if (!current_elem->contains_point(n))
 
  542                   neighbor_set.erase(current);