21 #include "libmesh/libmesh_config.h" 
   24 #ifdef LIBMESH_ENABLE_AMR 
   26 #include "libmesh/elem.h" 
   27 #include "libmesh/mesh_base.h" 
   28 #include "libmesh/mesh_refinement.h" 
   29 #include "libmesh/parallel.h" 
   30 #include "libmesh/remote_elem.h" 
   42   parallel_object_only();
 
   44   bool flags_changed = 
false;
 
   48   std::vector<unsigned char> max_level_at_node (
_mesh.
n_nodes(), 0);
 
   49   std::vector<unsigned char> max_p_level_at_node (
_mesh.
n_nodes(), 0);
 
   54       const unsigned char elem_level =
 
   55         cast_int<unsigned char>(elem->level() +
 
   57       const unsigned char elem_p_level =
 
   58         cast_int<unsigned char>(elem->p_level() +
 
   62       for (
const Node & node : elem->node_ref_range())
 
   66           libmesh_assert_less (node_number, max_level_at_node.size());
 
   68           max_level_at_node[node_number] =
 
   69             std::max (max_level_at_node[node_number], elem_level);
 
   70           max_p_level_at_node[node_number] =
 
   71             std::max (max_p_level_at_node[node_number], elem_p_level);
 
   82       const unsigned int elem_level = elem->level();
 
   83       const unsigned int elem_p_level = elem->p_level();
 
   94       for (
const Node & node : elem->node_ref_range())
 
  100           if ((elem_level + max_mismatch) < max_level_at_node[node_number]
 
  104               flags_changed = 
true;
 
  106           if ((elem_p_level + max_mismatch) < max_p_level_at_node[node_number]
 
  110               flags_changed = 
true;
 
  119   this->
comm().max(flags_changed);
 
  121   return flags_changed;
 
  129   parallel_object_only();
 
  131   bool flags_changed = 
false;
 
  135   std::map<std::pair<unsigned int, unsigned int>, 
unsigned char>
 
  137   std::map<std::pair<unsigned int, unsigned int>, 
unsigned char>
 
  143       const unsigned char elem_level =
 
  144         cast_int<unsigned char>(elem->level() +
 
  146       const unsigned char elem_p_level =
 
  147         cast_int<unsigned char>(elem->p_level() +
 
  151       for (
auto n : elem->edge_index_range())
 
  153           std::unique_ptr<const Elem> edge = elem->build_edge_ptr(n);
 
  156           if (childnode1 < childnode0)
 
  159           for (
const Elem * p = elem; p != 
nullptr; p = p->
parent())
 
  161               std::unique_ptr<const Elem> pedge = p->build_edge_ptr(n);
 
  174               if (node0 != childnode0 && node1 != childnode1)
 
  180               std::pair<unsigned int, unsigned int> edge_key =
 
  181                 std::make_pair(node0, node1);
 
  183               if (max_level_at_edge.find(edge_key) ==
 
  184                   max_level_at_edge.end())
 
  186                   max_level_at_edge[edge_key] = elem_level;
 
  187                   max_p_level_at_edge[edge_key] = elem_p_level;
 
  191                   max_level_at_edge[edge_key] =
 
  192                     std::max (max_level_at_edge[edge_key], elem_level);
 
  193                   max_p_level_at_edge[edge_key] =
 
  194                     std::max (max_p_level_at_edge[edge_key], elem_p_level);
 
  205       const unsigned int elem_level = elem->level();
 
  206       const unsigned int elem_p_level = elem->p_level();
 
  215       for (
auto n : elem->edge_index_range())
 
  217           std::unique_ptr<Elem> edge = elem->build_edge_ptr(n);
 
  223           std::pair<dof_id_type, dof_id_type> edge_key =
 
  224             std::make_pair(node0, node1);
 
  228           if ((elem_level + max_mismatch) < max_level_at_edge[edge_key]
 
  232               flags_changed = 
true;
 
  235           if ((elem_p_level + max_mismatch) < max_p_level_at_edge[edge_key]
 
  239               flags_changed = 
true;
 
  248   this->
comm().max(flags_changed);
 
  250   return flags_changed;
 
  258   parallel_object_only();
 
  260   bool flags_changed = 
false;
 
  267       if ((elem->dim() >= LIBMESH_DIM) ||
 
  268           !elem->interior_parent())
 
  271       const unsigned char elem_level =
 
  272         cast_int<unsigned char>(elem->level() +
 
  274       const unsigned char elem_p_level =
 
  275         cast_int<unsigned char>(elem->p_level() +
 
  279       std::set<Elem *> neighbor_set;
 
  280       elem->find_interior_neighbors(neighbor_set);
 
  282       for (
auto & neighbor : neighbor_set)
 
  283         if (max_mismatch >= 0)
 
  285             if ((elem_level > neighbor->level() + max_mismatch) &&
 
  289                 flags_changed = 
true;
 
  292             if ((elem_p_level > neighbor->p_level() + max_mismatch) &&
 
  296                 flags_changed = 
true;
 
  302   this->
comm().max(flags_changed);
 
  304   return flags_changed;
 
  312   parallel_object_only();
 
  314   bool flags_changed = 
false;
 
  321       if ((elem->dim() >= LIBMESH_DIM) ||
 
  322           !elem->interior_parent())
 
  326       std::set<const Elem *> neighbor_set;
 
  327       elem->find_interior_neighbors(neighbor_set);
 
  329       for (
const Elem * neighbor : neighbor_set)
 
  331           const unsigned char neighbor_level =
 
  332             cast_int<unsigned char>(neighbor->level() +
 
  333                                     ((neighbor->refinement_flag() == 
Elem::REFINE) ? 1 : 0));
 
  335           const unsigned char neighbor_p_level =
 
  336             cast_int<unsigned char>(neighbor->p_level() +
 
  337                                     ((neighbor->p_refinement_flag() == 
Elem::REFINE) ? 1 : 0));
 
  339           if (max_mismatch >= 0)
 
  341               if ((neighbor_level >
 
  342                    elem->level() + max_mismatch) &&
 
  346                   flags_changed = 
true;
 
  349               if ((neighbor_p_level >
 
  350                    elem->p_level() + max_mismatch) &&
 
  354                   flags_changed = 
true;
 
  361   this->
comm().max(flags_changed);
 
  363   return flags_changed;
 
  371   parallel_object_only();
 
  373   bool flags_changed = 
false;
 
  384       bool h_flag_me = 
false,
 
  386       for (
auto neighbor : elem->neighbor_ptr_range())
 
  389           if (neighbor != 
nullptr && neighbor != 
remote_elem)
 
  410           elem = elem->parent();
 
  417       const unsigned int my_level = elem->level();
 
  418       int my_p_adjustment = 0;
 
  423           libmesh_assert_greater (elem->p_level(), 0);
 
  424           my_p_adjustment = -1;
 
  426       const unsigned int my_new_p_level = elem->p_level() +
 
  430       for (
auto neighbor : elem->neighbor_ptr_range())
 
  433           if (neighbor == 
nullptr || neighbor == 
remote_elem)
 
  446               ((neighbor->level() < my_level) ||
 
  450                ((neighbor->active()) &&
 
  471               if (neighbor->active())
 
  473                   int p_adjustment = 0;
 
  478                       libmesh_assert_greater (neighbor->p_level(), 0);
 
  481                   if (my_new_p_level >= neighbor->p_level() + p_adjustment)
 
  490               else if (neighbor->ancestor())
 
  492                   if (neighbor->min_new_p_level_by_neighbor(elem,
 
  493                                                             my_new_p_level + 2) <= my_new_p_level)
 
  509               for (
auto & child : elem->child_ref_range())
 
  511                   libmesh_assert_equal_to (child.refinement_flag(),
 
  519           flags_changed = 
true;
 
  527           flags_changed = 
true;
 
  532   this->
comm().max(flags_changed);
 
  534   return flags_changed;
 
  541                                                                 unsigned max_mismatch)
 
  544   bool flags_changed = 
false;
 
  554       std::set<const Elem *> neighbor_set;
 
  561         libmesh_error_msg(
"Unrecognized NeighborType: " << nt);
 
  564       for (
const auto & neighbor : neighbor_set)
 
  566           if ((elem->
level() + 1 - max_mismatch) > neighbor->level())
 
  569               flags_changed = 
true;
 
  571           if ((elem->
p_level() + 1 - max_mismatch) > neighbor->p_level())
 
  574               flags_changed = 
true;
 
  579   return flags_changed;