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;