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);
52 for (
auto & elem :
_mesh.active_element_ptr_range())
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);
80 for (
auto & elem :
_mesh.active_element_ptr_range())
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>
140 std::unique_ptr<const Elem> edge, pedge;
142 for (
auto & elem :
_mesh.active_element_ptr_range())
144 const unsigned char elem_level =
145 cast_int<unsigned char>(elem->level() +
147 const unsigned char elem_p_level =
148 cast_int<unsigned char>(elem->p_level() +
152 for (
auto n : elem->edge_index_range())
154 elem->build_edge_ptr(edge, n);
157 if (childnode1 < childnode0)
158 std::swap(childnode0, childnode1);
160 for (
const Elem * p = elem; p !=
nullptr; p = p->
parent())
162 p->build_edge_ptr(pedge, n);
167 std::swap(node0, node1);
175 if (node0 != childnode0 && node1 != childnode1)
181 std::pair<unsigned int, unsigned int> edge_key =
182 std::make_pair(node0, node1);
187 if (
auto [it, emplaced] = max_level_at_edge.emplace(edge_key, elem_level);
189 it->second = std::max(it->second, elem_level);
192 if (
auto [it, emplaced] = max_p_level_at_edge.emplace(edge_key, elem_p_level);
194 it->second = std::max(it->second, elem_p_level);
202 for (
auto & elem :
_mesh.active_element_ptr_range())
204 const unsigned int elem_level = elem->level();
205 const unsigned int elem_p_level = elem->p_level();
214 for (
auto n : elem->edge_index_range())
216 elem->build_edge_ptr(edge, n);
220 std::swap(node0, node1);
222 std::pair<dof_id_type, dof_id_type> edge_key =
223 std::make_pair(node0, node1);
227 if ((elem_level + max_mismatch) < max_level_at_edge[edge_key]
231 flags_changed =
true;
234 if ((elem_p_level + max_mismatch) < max_p_level_at_edge[edge_key]
238 flags_changed =
true;
247 this->
comm().
max(flags_changed);
249 return flags_changed;
257 parallel_object_only();
259 bool flags_changed =
false;
262 for (
auto & elem :
_mesh.active_element_ptr_range())
266 if ((elem->dim() >= LIBMESH_DIM) ||
267 !elem->interior_parent())
270 const unsigned char elem_level =
271 cast_int<unsigned char>(elem->level() +
273 const unsigned char elem_p_level =
274 cast_int<unsigned char>(elem->p_level() +
278 std::set<Elem *> neighbor_set;
279 elem->find_interior_neighbors(neighbor_set);
281 for (
auto & neighbor : neighbor_set)
282 if (max_mismatch >= 0)
284 if ((elem_level > neighbor->level() + max_mismatch) &&
288 flags_changed =
true;
291 if ((elem_p_level > neighbor->p_level() + max_mismatch) &&
295 flags_changed =
true;
301 this->
comm().
max(flags_changed);
303 return flags_changed;
311 parallel_object_only();
313 bool flags_changed =
false;
316 for (
auto & elem :
_mesh.active_element_ptr_range())
320 if ((elem->dim() >= LIBMESH_DIM) ||
321 !elem->interior_parent())
325 std::set<const Elem *> neighbor_set;
326 elem->find_interior_neighbors(neighbor_set);
328 for (
const Elem * neighbor : neighbor_set)
330 const unsigned char neighbor_level =
331 cast_int<unsigned char>(neighbor->level() +
332 ((neighbor->refinement_flag() ==
Elem::REFINE) ? 1 : 0));
334 const unsigned char neighbor_p_level =
335 cast_int<unsigned char>(neighbor->p_level() +
336 ((neighbor->p_refinement_flag() ==
Elem::REFINE) ? 1 : 0));
338 if (max_mismatch >= 0)
340 if ((neighbor_level >
341 elem->level() + max_mismatch) &&
345 flags_changed =
true;
348 if ((neighbor_p_level >
349 elem->p_level() + max_mismatch) &&
353 flags_changed =
true;
360 this->
comm().
max(flags_changed);
362 return flags_changed;
370 parallel_object_only();
372 bool flags_changed =
false;
378 return flags_changed;
383 for (
Elem * elem :
_mesh.active_element_ptr_range())
389 bool h_flag_me =
false,
391 for (
auto neighbor : elem->neighbor_ptr_range())
394 if (neighbor !=
nullptr && neighbor !=
remote_elem)
415 elem = elem->parent();
422 const unsigned int my_level = elem->level();
423 int my_p_adjustment = 0;
428 libmesh_assert_greater (elem->p_level(), 0);
429 my_p_adjustment = -1;
431 const unsigned int my_new_p_level =
432 cast_int<unsigned int>(
int(elem->p_level()) +
436 for (
auto neighbor : elem->neighbor_ptr_range())
439 if (neighbor ==
nullptr || neighbor ==
remote_elem)
452 ((neighbor->level() < my_level) ||
456 ((neighbor->active()) &&
477 if (neighbor->active())
479 int p_adjustment = 0;
484 libmesh_assert_greater (neighbor->p_level(), 0);
487 if (my_new_p_level >=
488 cast_int<unsigned int>(
int(neighbor->p_level())
498 else if (neighbor->ancestor())
500 if (neighbor->min_new_p_level_by_neighbor(elem,
501 my_new_p_level + 2) <= my_new_p_level)
517 for (
auto & child : elem->child_ref_range())
519 libmesh_assert_equal_to (child.refinement_flag(),
527 flags_changed =
true;
535 flags_changed =
true;
540 this->
comm().
max(flags_changed);
542 return flags_changed;