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);
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;
549 unsigned max_mismatch)
552 bool flags_changed =
false;
562 std::set<const Elem *> neighbor_set;
569 libmesh_error_msg(
"Unrecognized NeighborType: " << nt);
572 for (
const auto & neighbor : neighbor_set)
574 if ((elem->
level() + 1 - max_mismatch) > neighbor->level())
577 flags_changed =
true;
579 if ((elem->
p_level() + 1 - max_mismatch) > neighbor->p_level())
582 flags_changed =
true;
587 return flags_changed;
bool limit_level_mismatch_at_edge(const unsigned int max_mismatch)
bool & enforce_mismatch_limit_prior_to_refinement()
Get/set the _enforce_mismatch_limit_prior_to_refinement flag.
RefinementState refinement_flag() const
const Elem * parent() const
A Node is like a Point, but with more information.
NeighborType
This helper function enforces the desired mismatch limits prior to refinement.
bool limit_level_mismatch_at_node(const unsigned int max_mismatch)
This algorithm restricts the maximum level mismatch at any node in the mesh.
bool limit_underrefined_boundary(const signed char max_mismatch)
MeshBase & _mesh
Reference to the mesh.
This is the base class from which all geometric element types are derived.
void set_refinement_flag(const RefinementState rflag)
Sets the value of the refinement flag for the element.
const Parallel::Communicator & comm() const
bool limit_overrefined_boundary(const signed char max_mismatch)
unsigned int p_level() const
void find_edge_neighbors(const Point &p1, const Point &p2, std::set< const Elem *> &neighbor_set) const
This function finds all active elements in the same manifold as this element which touch the current ...
The libMesh namespace provides an interface to certain functionality in the library.
bool _allow_unrefined_patches
void find_point_neighbors(const Point &p, std::set< const Elem *> &neighbor_set) const
This function finds all active elements (including this one) which are in the same manifold as this e...
bool _enforce_mismatch_limit_prior_to_refinement
This option enforces the mismatch level prior to refinement by checking if refining any element mar...
unsigned int level() const
void max(const T &r, T &o, Request &req) const
void set_p_refinement_flag(const RefinementState pflag)
Sets the value of the p-refinement flag for the element.
bool eliminate_unrefined_patches()
This algorithm selects an element for refinement if all of its neighbors are (or will be) refined...
void ErrorVector unsigned int
virtual dof_id_type n_nodes() const =0
const RemoteElem * remote_elem