21 #include "libmesh/libmesh_config.h" 24 #ifdef LIBMESH_ENABLE_AMR 30 #include "libmesh/elem.h" 31 #include "libmesh/error_vector.h" 32 #include "libmesh/mesh_refinement.h" 33 #include "libmesh/mesh_base.h" 34 #include "libmesh/parallel.h" 35 #include "libmesh/remote_elem.h" 45 const Real refine_frac,
46 const Real coarsen_frac,
47 const unsigned int max_l)
49 parallel_object_only();
53 libmesh_assert(this->
comm().verify(
dynamic_cast<const std::vector<ErrorVectorReal> &
>(error_per_cell)));
61 if (refine_frac != 0.3 ||
62 coarsen_frac != 0.0 ||
84 Real error_min = 1.e30;
88 Real parent_error_min = 1.e30;
89 Real parent_error_max = 0.;
102 for (
auto & elem :
_mesh.active_local_element_ptr_range())
105 libmesh_assert_less (
id, error_per_cell.size());
107 error_max = std::max (error_max, error_per_cell[
id]);
108 error_min = std::min (error_min, error_per_cell[
id]);
114 const Real error_delta = (error_max - error_min);
115 const Real parent_error_delta = parent_error_max - parent_error_min;
134 for (
auto & elem :
_mesh.active_element_ptr_range())
138 libmesh_assert_less (
id, error_per_cell.size());
148 if (error_per_parent[parentid] >= 0. &&
149 error_per_parent[parentid] <= parent_cutoff)
155 else if (elem_error <= coarsen_cutoff)
162 if (elem_error >= refine_cutoff)
172 parallel_object_only();
176 libmesh_assert(this->
comm().verify(
dynamic_cast<const std::vector<ErrorVectorReal> &
>(error_per_cell_in)));
188 const Real local_refinement_tolerance =
190 const Real local_coarsening_tolerance =
197 Real parent_error_min, parent_error_max;
205 for (
auto & elem :
_mesh.active_element_ptr_range())
211 if (elem_error > local_refinement_tolerance &&
216 local_coarsening_tolerance)
222 if (parent_error >= 0.)
224 const Real parent_coarsening_tolerance =
226 local_coarsening_tolerance *
227 local_coarsening_tolerance);
228 if (parent_error < parent_coarsening_tolerance)
239 parallel_object_only();
243 libmesh_assert(this->
comm().verify(
dynamic_cast<const std::vector<ErrorVectorReal> &
>(error_per_cell)));
274 const std::ptrdiff_t n_elem_new =
275 std::ptrdiff_t(
_nelem_target) - std::ptrdiff_t(n_active_elem);
280 std::vector<std::pair<ErrorVectorReal, dof_id_type>> sorted_error;
282 sorted_error.reserve (n_active_elem);
287 std::vector<bool> is_active(max_elem_id,
false);
289 for (
auto & elem :
_mesh.active_local_element_ptr_range())
292 is_active[eid] =
true;
293 libmesh_assert_less (eid, error_per_cell.size());
294 sorted_error.emplace_back(error_per_cell[eid], eid);
303 std::sort (sorted_error.begin(), sorted_error.end());
304 std::reverse (sorted_error.begin(), sorted_error.end());
309 std::vector<std::pair<ErrorVectorReal, dof_id_type>> sorted_parent_error;
310 Real parent_error_min, parent_error_max;
320 if (error_per_parent[i] != -1)
321 sorted_parent_error.emplace_back(error_per_parent[i], i);
323 std::sort (sorted_parent_error.begin(), sorted_parent_error.end());
330 unsigned int twotodim = 1;
331 for (
unsigned int i=0; i!=
dim; ++i)
340 std::min(cast_int<dof_id_type>(n_elem_new / (twotodim-1)),
348 std::min(cast_int<dof_id_type>(-n_elem_new / (twotodim-1)),
353 while (coarsen_count < max_elem_coarsen &&
354 refine_count < max_elem_refine &&
355 coarsen_count < sorted_parent_error.size() &&
356 refine_count < sorted_error.size() &&
357 sorted_error[refine_count].first >
368 std::vector<bool> is_refinable(max_elem_id,
false);
370 for (
const auto & pr : sorted_error)
375 is_refinable[eid] =
true;
377 this->
comm().
max(is_refinable);
379 if (refine_count > max_elem_refine)
380 refine_count = max_elem_refine;
381 for (
const auto & pr : sorted_error)
383 if (successful_refine_count >= refine_count)
388 if (is_refinable[eid])
392 successful_refine_count++;
399 if (coarsen_count < (refine_count - successful_refine_count))
402 coarsen_count -= (refine_count - successful_refine_count);
404 if (coarsen_count > max_elem_coarsen)
405 coarsen_count = max_elem_coarsen;
410 for (
const auto & pr : sorted_parent_error)
412 if (successful_coarsen_count >= coarsen_count * twotodim)
429 successful_coarsen_count++;
436 if (!successful_coarsen_count &&
437 !successful_refine_count)
446 const Real refine_frac,
447 const Real coarsen_frac,
448 const unsigned int max_l)
450 parallel_object_only();
454 libmesh_assert(this->
comm().verify(
dynamic_cast<const std::vector<ErrorVectorReal> &
>(error_per_cell)));
462 if (refine_frac != 0.3 ||
463 coarsen_frac != 0.0 ||
465 libmesh_deprecated();
500 std::vector<ErrorVectorReal> sorted_error;
502 sorted_error.reserve (n_active_elem);
506 for (
auto & elem :
_mesh.active_local_element_ptr_range())
507 sorted_error.push_back (error_per_cell[elem->id()]);
512 std::sort (sorted_error.begin(), sorted_error.end());
520 Real parent_error_min, parent_error_max;
527 sorted_parent_error = error_per_parent;
528 std::sort (sorted_parent_error.begin(), sorted_parent_error.end());
531 sorted_parent_error.erase (std::remove(sorted_parent_error.begin(),
532 sorted_parent_error.end(), 0.),
533 sorted_parent_error.end());
544 unsigned int twotodim = 1;
545 for (
unsigned int i=0; i!=
dim; ++i)
548 dof_id_type n_parent_coarsen = n_elem_coarsen / (twotodim - 1);
550 if (n_parent_coarsen)
551 bottom_error = sorted_parent_error[n_parent_coarsen - 1];
553 else if (n_elem_coarsen)
555 bottom_error = sorted_error[n_elem_coarsen - 1];
559 top_error = sorted_error[sorted_error.size() - n_elem_refine];
562 for (
auto & elem :
_mesh.active_element_ptr_range())
567 error_per_parent[parent->
id()] <= bottom_error)
571 error_per_cell[elem->id()] <= bottom_error)
576 error_per_cell[elem->id()] >= top_error)
584 const Real refine_frac,
585 const Real coarsen_frac,
586 const unsigned int max_l)
590 libmesh_assert(this->
comm().verify(
dynamic_cast<const std::vector<ErrorVectorReal> &
>(error_per_cell)));
598 if (refine_frac != 0.3 ||
599 coarsen_frac != 0.0 ||
601 libmesh_deprecated();
609 const Real mean = error_per_cell.
mean();
613 const Real stddev = std::sqrt (error_per_cell.
variance());
627 for (
auto & elem :
_mesh.active_element_ptr_range())
631 libmesh_assert_less (
id, error_per_cell.size());
636 if (elem_error <= coarsen_cutoff)
640 if ((elem_error >= refine_cutoff) && (elem->level() <
_max_h_level))
656 for (
auto & elem :
_mesh.element_ptr_range())
660 elem->set_p_refinement_flag(elem->refinement_flag());
665 elem->set_p_refinement_flag(elem->refinement_flag());
675 for (
auto & elem :
_mesh.element_ptr_range())
676 elem->set_p_refinement_flag(elem->refinement_flag());
685 for (
auto & elem :
_mesh.element_ptr_range())
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
const Elem * parent() const
virtual dof_id_type n_active_elem() const =0
unsigned int _max_h_level
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
void flag_elements_by_error_tolerance(const ErrorVector &error_per_cell)
Flags elements for coarsening and refinement based on the computed error passed in error_per_cell...
MeshBase & _mesh
Reference to the mesh.
The ErrorVector is a specialization of the StatisticsVector for error data computed on a finite eleme...
bool flag_elements_by_nelem_target(const ErrorVector &error_per_cell)
Flags elements for coarsening and refinement based on the computed error passed in error_per_cell...
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
virtual Real variance() const override
virtual unsigned int n_children() const =0
void clean_refinement_flags()
Sets the refinement flag to Elem::DO_NOTHING for each element in the mesh.
void create_parent_error_vector(const ErrorVector &error_per_cell, ErrorVector &error_per_parent, Real &parent_error_min, Real &parent_error_max)
Calculates the error on all coarsenable parents.
The libMesh namespace provides an interface to certain functionality in the library.
DIE A HORRIBLE DEATH HERE typedef float ErrorVectorReal
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
void switch_h_to_p_refinement()
Takes a mesh whose elements are flagged for h refinement and coarsening, and switches those flags to ...
void flag_elements_by_mean_stddev(const ErrorVector &error_per_cell, const Real refine_fraction=1.0, const Real coarsen_fraction=0.0, const unsigned int max_level=libMesh::invalid_uint)
Flags elements for coarsening and refinement based on the computed error passed in error_per_cell...
void min(const T &r, T &o, Request &req) const
Abstract base class to be used for user-specified element flagging.
bool _use_member_parameters
For backwards compatibility, we initialize this as false and then set it to true if the user uses any...
virtual dof_id_type max_elem_id() const =0
void flag_elements_by(ElementFlagging &element_flagging)
Flag elements based on a function object.
void flag_elements_by_elem_fraction(const ErrorVector &error_per_cell, const Real refine_fraction=0.3, const Real coarsen_fraction=0.0, const unsigned int max_level=libMesh::invalid_uint)
Flags elements for coarsening and refinement based on the computed error passed in error_per_cell...
unsigned int level() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual const Elem * query_elem_ptr(const dof_id_type i) const =0
void max(const T &r, T &o, Request &req) const
unsigned int mesh_dimension() const
void flag_elements_by_error_fraction(const ErrorVector &error_per_cell, const Real refine_fraction=0.3, const Real coarsen_fraction=0.0, const unsigned int max_level=libMesh::invalid_uint)
Flags elements for coarsening and refinement based on the computed error passed in error_per_cell...
void add_p_to_h_refinement()
Takes a mesh whose elements are flagged for h refinement and coarsening, and adds flags to request p ...
dof_id_type _nelem_target
bool has_children() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
bool _coarsen_by_parents
Refinement parameter values.
virtual Real mean() const override
Real _absolute_global_tolerance
const RemoteElem * remote_elem
virtual void flag_elements()=0
Callback function to be used for marking elements for refinement.