libMesh
mesh_refinement.h
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2019 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 
19 
20 #ifndef LIBMESH_MESH_REFINEMENT_H
21 #define LIBMESH_MESH_REFINEMENT_H
22 
23 
24 
25 #include "libmesh/libmesh_config.h"
26 
27 #ifdef LIBMESH_ENABLE_AMR
28 
29 // Local Includes
30 #include "libmesh/libmesh_common.h"
31 #include "libmesh/libmesh.h" // libMesh::invalid_uint
32 #include "libmesh/topology_map.h"
33 #include "libmesh/parallel_object.h"
34 
35 // C++ Includes
36 #include <vector>
37 
38 namespace libMesh
39 {
40 
41 // Forward Declarations
42 class MeshBase;
43 class Point;
44 class Node;
45 class ErrorVector;
46 class PeriodicBoundaries;
47 class Elem;
48 class PointLocatorBase;
49 
62 {
63 public:
64 
68  explicit
70 
71 private:
72  // Both the copy ctor and the assignment operator are
73  // declared private but not implemented. This is the
74  // standard practice to prevent them from being used.
77 
78 public:
79 
89  {
90  public:
94  virtual ~ElementFlagging () {}
95 
99  virtual void flag_elements () = 0;
100  };
101 
106 
110  ~MeshRefinement ();
111 
115  void clear ();
116 
128  void flag_elements_by_error_fraction (const ErrorVector & error_per_cell,
129  const Real refine_fraction = 0.3,
130  const Real coarsen_fraction = 0.0,
131  const unsigned int max_level = libMesh::invalid_uint);
132 
147  void flag_elements_by_error_tolerance (const ErrorVector & error_per_cell);
148 
163  bool flag_elements_by_nelem_target (const ErrorVector & error_per_cell);
164 
178  void flag_elements_by_elem_fraction (const ErrorVector & error_per_cell,
179  const Real refine_fraction = 0.3,
180  const Real coarsen_fraction = 0.0,
181  const unsigned int max_level = libMesh::invalid_uint);
182 
196  void flag_elements_by_mean_stddev (const ErrorVector & error_per_cell,
197  const Real refine_fraction = 1.0,
198  const Real coarsen_fraction = 0.0,
199  const unsigned int max_level = libMesh::invalid_uint);
200 
205  void flag_elements_by (ElementFlagging & element_flagging);
206 
212 
217  void add_p_to_h_refinement();
218 
232 
245  bool coarsen_elements ();
246 
258  bool refine_elements ();
259 
263  void uniformly_refine (unsigned int n=1);
264 
268  void uniformly_coarsen (unsigned int n=1);
269 
273  void uniformly_p_refine (unsigned int n=1);
274 
278  void uniformly_p_coarsen (unsigned int n=1);
279 
284  void clean_refinement_flags ();
285 
293  bool test_level_one (bool libmesh_assert_yes = false);
294 
302  bool test_unflagged (bool libmesh_assert_yes = false);
303 
313  Node * add_node (Elem & parent,
314  unsigned int child,
315  unsigned int node,
316  processor_id_type proc_id);
317 
321  Elem * add_elem (Elem * elem);
322 
327  const MeshBase & get_mesh () const { return _mesh; }
328 
333  MeshBase & get_mesh () { return _mesh; }
334 
342  bool & coarsen_by_parents();
343 
351  Real & refine_fraction();
352 
361 
368  unsigned int & max_h_level();
369 
379 
388 
399 
410  unsigned char & face_level_mismatch_limit();
411 
421  unsigned char & edge_level_mismatch_limit();
422 
432  unsigned char & node_level_mismatch_limit();
433 
451  signed char & overrefined_boundary_limit();
452 
468  signed char & underrefined_boundary_limit();
469 
470 
478 
485 #ifdef LIBMESH_ENABLE_DEPRECATED
487 #endif
488 
495 #ifdef LIBMESH_ENABLE_DEPRECATED
497 #endif
498 
504 
505 private:
506 
520  bool _coarsen_elements ();
521 
530  bool _refine_elements ();
531 
540  void _smooth_flags (bool refining, bool coarsening);
541 
542  //------------------------------------------------------
543  // "Smoothing" algorithms for refined meshes
544 
608  bool limit_level_mismatch_at_node (const unsigned int max_mismatch);
609 
610  /*
611  * This algorithm restricts the maximum level mismatch
612  * at any edge in the mesh. See the ASCII art in the comment of
613  * limit_level_mismatch_at_node, and pretend they're hexes.
614  */
615  bool limit_level_mismatch_at_edge (const unsigned int max_mismatch);
616 
617  /*
618  * This algorithm flags interior elements for refinement as needed
619  * to prevent corresponding boundary element refinement mismatch
620  * from exceeding the given limit.
621  */
622  bool limit_overrefined_boundary (const signed char max_mismatch);
623 
624  /*
625  * This algorithm flags boundary elements for refinement as needed
626  * to prevent corresponding interior element refinement mismatch
627  * from exceeding the given limit.
628  */
629  bool limit_underrefined_boundary (const signed char max_mismatch);
630 
683 
684 
685  //---------------------------------------------
686  // Utility algorithms
687 
693  void create_parent_error_vector (const ErrorVector & error_per_cell,
694  ErrorVector & error_per_parent,
695  Real & parent_error_min,
696  Real & parent_error_max);
697 
701  void update_nodes_map ();
702 
711 
720 
725  Elem * topological_neighbor (Elem * elem,
726  const PointLocatorBase * point_locator,
727  const unsigned int side);
728 
733  bool has_topological_neighbor (const Elem * elem,
734  const PointLocatorBase * point_locator,
735  const Elem * neighbor);
736 
741 
746 
753 
759 
761 
763 
764  unsigned int _max_h_level;
765 
767 
769 
771 
775 
778 
848 
860  NeighborType nt,
861  unsigned max_mismatch);
862 
863 #ifdef LIBMESH_ENABLE_PERIODIC
865 #endif
866 };
867 
868 
869 
870 // ------------------------------------------------------------
871 // MeshRefinement class inline members
872 
874 {
875  _use_member_parameters = true;
876  return _coarsen_by_parents;
877 }
878 
880 {
881  _use_member_parameters = true;
882  return _refine_fraction;
883 }
884 
886 {
887  _use_member_parameters = true;
888  return _coarsen_fraction;
889 }
890 
891 inline unsigned int & MeshRefinement::max_h_level()
892 {
893  _use_member_parameters = true;
894  return _max_h_level;
895 }
896 
898 {
899  _use_member_parameters = true;
900  return _coarsen_threshold;
901 }
902 
904 {
905  _use_member_parameters = true;
906  return _nelem_target;
907 }
908 
910 {
911  _use_member_parameters = true;
913 }
914 
916 {
918 }
919 
921 {
923 }
924 
926 {
928 }
929 
931 {
933 }
934 
936 {
938 }
939 
940 #ifdef LIBMESH_ENABLE_DEPRECATED
942 {
943  libmesh_deprecated();
945 }
946 
948 {
949  libmesh_deprecated();
951 }
952 #endif
953 
955 {
957 }
958 
959 
960 
961 } // namespace libMesh
962 
963 #endif // end #ifdef LIBMESH_ENABLE_AMR
964 #endif // LIBMESH_MESH_REFINEMENT_H
libMesh::MeshRefinement::ElementFlagging::flag_elements
virtual void flag_elements()=0
Callback function to be used for marking elements for refinement.
libMesh::MeshRefinement::_node_level_mismatch_limit
unsigned char _node_level_mismatch_limit
Definition: mesh_refinement.h:774
libMesh::MeshRefinement::NeighborType
NeighborType
This helper function enforces the desired mismatch limits prior to refinement.
Definition: mesh_refinement.h:858
libMesh::dof_id_type
uint8_t dof_id_type
Definition: id_types.h:67
libMesh::MeshRefinement::_coarsen_threshold
Real _coarsen_threshold
Definition: mesh_refinement.h:766
libMesh::PeriodicBoundaries
We're using a class instead of a typedef to allow forward declarations and future flexibility.
Definition: periodic_boundaries.h:51
libMesh::MeshRefinement::refine_and_coarsen_elements
bool refine_and_coarsen_elements()
Refines and coarsens user-requested elements.
Definition: mesh_refinement.C:476
libMesh::invalid_uint
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value.
Definition: libmesh.h:249
libMesh::MeshRefinement::_edge_level_mismatch_limit
unsigned char _edge_level_mismatch_limit
Definition: mesh_refinement.h:773
libMesh::MeshRefinement::coarsen_threshold
Real & coarsen_threshold()
The coarsen_threshold provides hysteresis in AMR/C strategies.
Definition: mesh_refinement.h:897
libMesh::MeshRefinement::_mesh
MeshBase & _mesh
Reference to the mesh.
Definition: mesh_refinement.h:745
libMesh::MeshRefinement::add_node
Node * add_node(Elem &parent, unsigned int child, unsigned int node, processor_id_type proc_id)
Add a node to the mesh.
Definition: mesh_refinement.C:142
libMesh::MeshRefinement::refine_elements
bool refine_elements()
Only refines the user-requested elements.
Definition: mesh_refinement.C:683
libMesh::MeshRefinement::eliminate_unrefined_patches
bool eliminate_unrefined_patches()
This algorithm selects an element for refinement if all of its neighbors are (or will be) refined.
Definition: mesh_refinement_smoothing.C:368
libMesh::MeshRefinement::_coarsen_by_parents
bool _coarsen_by_parents
Refinement parameter values.
Definition: mesh_refinement.h:758
libMesh::MeshRefinement::~MeshRefinement
~MeshRefinement()
Destructor.
Definition: mesh_refinement.C:128
libMesh::MeshRefinement::uniformly_p_refine
void uniformly_p_refine(unsigned int n=1)
Uniformly p refines the mesh n times.
Definition: mesh_refinement.C:1649
libMesh::MeshRefinement::edge_level_mismatch_limit
unsigned char & edge_level_mismatch_limit()
If edge_level_mismatch_limit is set to a nonzero value, then refinement and coarsening will produce m...
Definition: mesh_refinement.h:920
libMesh::MeshRefinement::_refine_elements
bool _refine_elements()
Refines user-requested elements.
Definition: mesh_refinement.C:1462
libMesh::MeshRefinement::_underrefined_boundary_limit
signed char _underrefined_boundary_limit
Definition: mesh_refinement.h:777
libMesh::MeshRefinement::_coarsen_fraction
Real _coarsen_fraction
Definition: mesh_refinement.h:762
libMesh::MeshRefinement::_overrefined_boundary_limit
signed char _overrefined_boundary_limit
Definition: mesh_refinement.h:776
libMesh::TopologyMap
Data structures that enable topology-based lookups of nodes created by mesh refinement.
Definition: topology_map.h:69
libMesh
The libMesh namespace provides an interface to certain functionality in the library.
Definition: factoryfunction.C:55
libMesh::MeshRefinement::overrefined_boundary_limit
signed char & overrefined_boundary_limit()
If overrefined_boundary_limit is set to a nonnegative value, then refinement and coarsening will prod...
Definition: mesh_refinement.h:930
libMesh::MeshRefinement::make_flags_parallel_consistent
bool make_flags_parallel_consistent()
Copy refinement flags on ghost elements from their local processors.
Definition: mesh_refinement.C:752
libMesh::MeshRefinement::add_elem
Elem * add_elem(Elem *elem)
Adds the element elem to the mesh.
Definition: mesh_refinement.C:211
libMesh::MeshTools::max_level
unsigned int max_level(const MeshBase &mesh)
Find the maximum h-refinement level in a mesh.
mesh
MeshBase & mesh
Definition: mesh_communication.C:1257
libMesh::MeshRefinement::_max_h_level
unsigned int _max_h_level
Definition: mesh_refinement.h:764
libMesh::MeshRefinement::limit_overrefined_boundary
bool limit_overrefined_boundary(const signed char max_mismatch)
Definition: mesh_refinement_smoothing.C:255
libMesh::MeshRefinement::flag_elements_by_nelem_target
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.
Definition: mesh_refinement_flagging.C:237
libMesh::MeshRefinement::face_level_mismatch_limit
unsigned char & face_level_mismatch_limit()
If face_level_mismatch_limit is set to a nonzero value, then refinement and coarsening will produce m...
Definition: mesh_refinement.h:915
libMesh::MeshRefinement::_smooth_flags
void _smooth_flags(bool refining, bool coarsening)
Smooths refinement flags according to current settings.
Definition: mesh_refinement.C:1594
libMesh::MeshRefinement::get_mesh
MeshBase & get_mesh()
Definition: mesh_refinement.h:333
libMesh::MeshRefinement::_coarsen_elements
bool _coarsen_elements()
Coarsens user-requested elements.
Definition: mesh_refinement.C:1336
libMesh::MeshRefinement
Implements (adaptive) mesh refinement algorithms for a MeshBase.
Definition: mesh_refinement.h:61
libMesh::MeshRefinement::MeshRefinement
MeshRefinement(MeshBase &mesh)
Constructor.
Definition: mesh_refinement.C:94
libMesh::MeshBase
This is the MeshBase class.
Definition: mesh_base.h:78
libMesh::MeshRefinement::underrefined_boundary_limit
signed char & underrefined_boundary_limit()
If underrefined_boundary_limit is set to a nonnegative value, then refinement and coarsening will pro...
Definition: mesh_refinement.h:935
libMesh::MeshRefinement::_absolute_global_tolerance
Real _absolute_global_tolerance
Definition: mesh_refinement.h:770
libMesh::MeshRefinement::_face_level_mismatch_limit
unsigned char _face_level_mismatch_limit
Definition: mesh_refinement.h:772
libMesh::MeshRefinement::make_refinement_compatible
bool make_refinement_compatible()
Take user-specified refinement flags and augment them so that level-one dependency is satisfied.
Definition: mesh_refinement.C:1160
libMesh::MeshRefinement::clear
void clear()
Deletes all the data that are currently stored.
Definition: mesh_refinement.C:135
libMesh::MeshRefinement::flag_elements_by
void flag_elements_by(ElementFlagging &element_flagging)
Flag elements based on a function object.
Definition: mesh_refinement_flagging.C:648
libMesh::MeshRefinement::flag_elements_by_error_tolerance
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.
Definition: mesh_refinement_flagging.C:170
libMesh::MeshRefinement::flag_elements_by_elem_fraction
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.
Definition: mesh_refinement_flagging.C:446
libMesh::MeshRefinement::_new_nodes_map
TopologyMap _new_nodes_map
Data structure that holds the new nodes information.
Definition: mesh_refinement.h:740
libMesh::MeshRefinement::create_parent_error_vector
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.
Definition: mesh_refinement.C:220
libMesh::MeshRefinement::limit_underrefined_boundary
bool limit_underrefined_boundary(const signed char max_mismatch)
Definition: mesh_refinement_smoothing.C:309
libMesh::processor_id_type
uint8_t processor_id_type
Definition: id_types.h:104
libMesh::MeshRefinement::ElementFlagging::~ElementFlagging
virtual ~ElementFlagging()
Destructor.
Definition: mesh_refinement.h:94
libMesh::Node
A Node is like a Point, but with more information.
Definition: node.h:52
libMesh::MeshRefinement::clean_refinement_flags
void clean_refinement_flags()
Sets the refinement flag to Elem::DO_NOTHING for each element in the mesh.
Definition: mesh_refinement_flagging.C:682
libMesh::ErrorVector
The ErrorVector is a specialization of the StatisticsVector for error data computed on a finite eleme...
Definition: error_vector.h:50
libMesh::MeshRefinement::enforce_mismatch_limit_prior_to_refinement
bool & enforce_mismatch_limit_prior_to_refinement()
Get/set the _enforce_mismatch_limit_prior_to_refinement flag.
Definition: mesh_refinement.h:954
libMesh::MeshRefinement::get_mesh
const MeshBase & get_mesh() const
Definition: mesh_refinement.h:327
libMesh::MeshRefinement::nelem_target
dof_id_type & nelem_target()
If nelem_target is set to a nonzero value, methods like flag_elements_by_nelem_target() will attempt ...
Definition: mesh_refinement.h:903
libMesh::MeshRefinement::switch_h_to_p_refinement
void switch_h_to_p_refinement()
Takes a mesh whose elements are flagged for h refinement and coarsening, and switches those flags to ...
Definition: mesh_refinement_flagging.C:655
libMesh::MeshRefinement::set_enforce_mismatch_limit_prior_to_refinement
void set_enforce_mismatch_limit_prior_to_refinement(bool enforce)
Set _enforce_mismatch_limit_prior_to_refinement option.
Definition: mesh_refinement.h:947
libMesh::MeshRefinement::max_h_level
unsigned int & max_h_level()
The max_h_level is the greatest refinement level an element should reach.
Definition: mesh_refinement.h:891
libMesh::MeshRefinement::get_enforce_mismatch_limit_prior_to_refinement
bool get_enforce_mismatch_limit_prior_to_refinement()
Definition: mesh_refinement.h:941
libMesh::MeshRefinement::test_unflagged
bool test_unflagged(bool libmesh_assert_yes=false)
Definition: mesh_refinement.C:428
libMesh::MeshRefinement::coarsen_fraction
Real & coarsen_fraction()
The coarsen_fraction sets either a desired target or a desired maximum number of elements to flag for...
Definition: mesh_refinement.h:885
libMesh::MeshRefinement::_periodic_boundaries
PeriodicBoundaries * _periodic_boundaries
Definition: mesh_refinement.h:864
libMesh::MeshRefinement::refine_fraction
Real & refine_fraction()
The refine_fraction sets either a desired target or a desired maximum number of elements to flag for ...
Definition: mesh_refinement.h:879
libMesh::MeshRefinement::_use_member_parameters
bool _use_member_parameters
For backwards compatibility, we initialize this as false and then set it to true if the user uses any...
Definition: mesh_refinement.h:752
libMesh::MeshRefinement::operator=
MeshRefinement & operator=(const MeshRefinement &)
libMesh::MeshRefinement::absolute_global_tolerance
Real & absolute_global_tolerance()
If absolute_global_tolerance is set to a nonzero value, methods like flag_elements_by_global_toleranc...
Definition: mesh_refinement.h:909
libMesh::Elem
This is the base class from which all geometric element types are derived.
Definition: elem.h:100
libMesh::MeshRefinement::set_periodic_boundaries_ptr
void set_periodic_boundaries_ptr(PeriodicBoundaries *pb_ptr)
Sets the PeriodicBoundaries pointer.
libMesh::MeshRefinement::ElementFlagging
Abstract base class to be used for user-specified element flagging.
Definition: mesh_refinement.h:88
libMesh::MeshRefinement::limit_level_mismatch_at_edge
bool limit_level_mismatch_at_edge(const unsigned int max_mismatch)
Definition: mesh_refinement_smoothing.C:126
libMesh::MeshRefinement::coarsen_by_parents
bool & coarsen_by_parents()
If coarsen_by_parents is true, complete groups of sibling elements (elements with the same parent) wi...
Definition: mesh_refinement.h:873
libMesh::MeshRefinement::coarsen_elements
bool coarsen_elements()
Only coarsens the user-requested elements.
Definition: mesh_refinement.C:608
libMesh::MeshRefinement::topological_neighbor
Elem * topological_neighbor(Elem *elem, const PointLocatorBase *point_locator, const unsigned int side)
Local dispatch function for getting the correct topological neighbor from the Elem class.
Definition: mesh_refinement.C:1791
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
libMesh::ParallelObject
An object whose state is distributed along a set of processors.
Definition: parallel_object.h:55
libMesh::MeshRefinement::has_topological_neighbor
bool has_topological_neighbor(const Elem *elem, const PointLocatorBase *point_locator, const Elem *neighbor)
Local dispatch function for checking the correct has_neighbor function from the Elem class.
Definition: mesh_refinement.C:1807
libMesh::MeshRefinement::flag_elements_by_error_fraction
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.
Definition: mesh_refinement_flagging.C:44
libMesh::MeshRefinement::update_nodes_map
void update_nodes_map()
Updates the _new_nodes_map.
Definition: mesh_refinement.C:346
libMesh::MeshRefinement::_enforce_mismatch_limit_prior_to_refinement
bool _enforce_mismatch_limit_prior_to_refinement
This option enforces the mismatch level prior to refinement by checking if refining any element marke...
Definition: mesh_refinement.h:847
libMesh::MeshRefinement::test_level_one
bool test_level_one(bool libmesh_assert_yes=false)
Definition: mesh_refinement.C:353
libMesh::MeshRefinement::uniformly_refine
void uniformly_refine(unsigned int n=1)
Uniformly refines the mesh n times.
Definition: mesh_refinement.C:1678
libMesh::MeshRefinement::POINT
Definition: mesh_refinement.h:858
libMesh::PointLocatorBase
This is the base class for point locators.
Definition: point_locator_base.h:62
libMesh::MeshRefinement::uniformly_coarsen
void uniformly_coarsen(unsigned int n=1)
Attempts to uniformly coarsen the mesh n times.
Definition: mesh_refinement.C:1703
libMesh::MeshRefinement::_refine_fraction
Real _refine_fraction
Definition: mesh_refinement.h:760
libMesh::MeshRefinement::make_coarsening_compatible
bool make_coarsening_compatible()
Take user-specified coarsening flags and augment them so that level-one dependency is satisfied.
Definition: mesh_refinement.C:780
libMesh::MeshRefinement::uniformly_p_coarsen
void uniformly_p_coarsen(unsigned int n=1)
Attempts to uniformly p coarsen the mesh n times.
Definition: mesh_refinement.C:1663
libMesh::MeshRefinement::limit_level_mismatch_at_node
bool limit_level_mismatch_at_node(const unsigned int max_mismatch)
This algorithm restricts the maximum level mismatch at any node in the mesh.
Definition: mesh_refinement_smoothing.C:39
libMesh::MeshRefinement::_nelem_target
dof_id_type _nelem_target
Definition: mesh_refinement.h:768
libMesh::MeshRefinement::node_level_mismatch_limit
unsigned char & node_level_mismatch_limit()
If node_level_mismatch_limit is set to a nonzero value, then refinement and coarsening will produce m...
Definition: mesh_refinement.h:925
libMesh::MeshRefinement::flag_elements_by_mean_stddev
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.
Definition: mesh_refinement_flagging.C:584
libMesh::MeshRefinement::EDGE
Definition: mesh_refinement.h:858
libMesh::MeshRefinement::add_p_to_h_refinement
void add_p_to_h_refinement()
Takes a mesh whose elements are flagged for h refinement and coarsening, and adds flags to request p ...
Definition: mesh_refinement_flagging.C:674