libMesh
mesh_refinement_flagging.C
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 // Local includes
21 #include "libmesh/libmesh_config.h"
22 
23 // only compile these functions if the user requests AMR support
24 #ifdef LIBMESH_ENABLE_AMR
25 
26 // C++ includes
27 #include <algorithm> // for std::sort
28 
29 // Local includes
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"
36 
37 namespace libMesh
38 {
39 
40 
41 
42 //-----------------------------------------------------------------
43 // Mesh refinement methods
45  const Real refine_frac,
46  const Real coarsen_frac,
47  const unsigned int max_l)
48 {
49  parallel_object_only();
50 
51  // Verify that our error vector is consistent, using std::vector to
52  // avoid confusing this->comm().verify
53  libmesh_assert(this->comm().verify(dynamic_cast<const std::vector<ErrorVectorReal> &>(error_per_cell)));
54 
55  // The function arguments are currently just there for
56  // backwards_compatibility
58  {
59  // If the user used non-default parameters, lets warn
60  // that they're deprecated
61  if (refine_frac != 0.3 ||
62  coarsen_frac != 0.0 ||
63  max_l != libMesh::invalid_uint)
64  libmesh_deprecated();
65 
66  _refine_fraction = refine_frac;
67  _coarsen_fraction = coarsen_frac;
68  _max_h_level = max_l;
69  }
70 
71  // Check for valid fractions..
72  // The fraction values must be in [0,1]
73  libmesh_assert_greater_equal (_refine_fraction, 0);
74  libmesh_assert_less_equal (_refine_fraction, 1);
75  libmesh_assert_greater_equal (_coarsen_fraction, 0);
76  libmesh_assert_less_equal (_coarsen_fraction, 1);
77 
78  // Clean up the refinement flags. These could be left
79  // over from previous refinement steps.
80  this->clean_refinement_flags();
81 
82  // We're getting the minimum and maximum error values
83  // for the ACTIVE elements
84  Real error_min = 1.e30;
85  Real error_max = 0.;
86 
87  // And, if necessary, for their parents
88  Real parent_error_min = 1.e30;
89  Real parent_error_max = 0.;
90 
91  // Prepare another error vector if we need to sum parent errors
92  ErrorVector error_per_parent;
94  {
95  create_parent_error_vector(error_per_cell,
96  error_per_parent,
97  parent_error_min,
98  parent_error_max);
99  }
100 
101  // We need to loop over all active elements to find the minimum
102  for (auto & elem : _mesh.active_local_element_ptr_range())
103  {
104  const dof_id_type id = elem->id();
105  libmesh_assert_less (id, error_per_cell.size());
106 
107  error_max = std::max (error_max, error_per_cell[id]);
108  error_min = std::min (error_min, error_per_cell[id]);
109  }
110  this->comm().max(error_max);
111  this->comm().min(error_min);
112 
113  // Compute the cutoff values for coarsening and refinement
114  const Real error_delta = (error_max - error_min);
115  const Real parent_error_delta = parent_error_max - parent_error_min;
116 
117  const Real refine_cutoff = (1.- _refine_fraction)*error_max;
118  const Real coarsen_cutoff = _coarsen_fraction*error_delta + error_min;
119  const Real parent_cutoff = _coarsen_fraction*parent_error_delta + error_min;
120 
121  // // Print information about the error
122  // libMesh::out << " Error Information:" << std::endl
123  // << " ------------------" << std::endl
124  // << " min: " << error_min << std::endl
125  // << " max: " << error_max << std::endl
126  // << " delta: " << error_delta << std::endl
127  // << " refine_cutoff: " << refine_cutoff << std::endl
128  // << " coarsen_cutoff: " << coarsen_cutoff << std::endl;
129 
130 
131 
132  // Loop over the elements and flag them for coarsening or
133  // refinement based on the element error
134  for (auto & elem : _mesh.active_element_ptr_range())
135  {
136  const dof_id_type id = elem->id();
137 
138  libmesh_assert_less (id, error_per_cell.size());
139 
140  const ErrorVectorReal elem_error = error_per_cell[id];
141 
143  {
144  Elem * parent = elem->parent();
145  if (parent)
146  {
147  const dof_id_type parentid = parent->id();
148  if (error_per_parent[parentid] >= 0. &&
149  error_per_parent[parentid] <= parent_cutoff)
150  elem->set_refinement_flag(Elem::COARSEN);
151  }
152  }
153  // Flag the element for coarsening if its error
154  // is <= coarsen_fraction*delta + error_min
155  else if (elem_error <= coarsen_cutoff)
156  {
157  elem->set_refinement_flag(Elem::COARSEN);
158  }
159 
160  // Flag the element for refinement if its error
161  // is >= refinement_cutoff.
162  if (elem_error >= refine_cutoff)
163  if (elem->level() < _max_h_level)
164  elem->set_refinement_flag(Elem::REFINE);
165  }
166 }
167 
168 
169 
171 {
172  parallel_object_only();
173 
174  // Verify that our error vector is consistent, using std::vector to
175  // avoid confusing this->comm().verify
176  libmesh_assert(this->comm().verify(dynamic_cast<const std::vector<ErrorVectorReal> &>(error_per_cell_in)));
177 
178  libmesh_assert_greater (_coarsen_threshold, 0);
179 
180  // Check for valid fractions..
181  // The fraction values must be in [0,1]
182  libmesh_assert_greater_equal (_refine_fraction, 0);
183  libmesh_assert_less_equal (_refine_fraction, 1);
184  libmesh_assert_greater_equal (_coarsen_fraction, 0);
185  libmesh_assert_less_equal (_coarsen_fraction, 1);
186 
187  // How much error per cell will we tolerate?
188  const Real local_refinement_tolerance =
190  const Real local_coarsening_tolerance =
191  local_refinement_tolerance * _coarsen_threshold;
192 
193  // Prepare another error vector if we need to sum parent errors
194  ErrorVector error_per_parent;
196  {
197  Real parent_error_min, parent_error_max;
198 
199  create_parent_error_vector(error_per_cell_in,
200  error_per_parent,
201  parent_error_min,
202  parent_error_max);
203  }
204 
205  for (auto & elem : _mesh.active_element_ptr_range())
206  {
207  Elem * parent = elem->parent();
208  const dof_id_type elem_number = elem->id();
209  const ErrorVectorReal elem_error = error_per_cell_in[elem_number];
210 
211  if (elem_error > local_refinement_tolerance &&
212  elem->level() < _max_h_level)
213  elem->set_refinement_flag(Elem::REFINE);
214 
215  if (!_coarsen_by_parents && elem_error <
216  local_coarsening_tolerance)
217  elem->set_refinement_flag(Elem::COARSEN);
218 
219  if (_coarsen_by_parents && parent)
220  {
221  ErrorVectorReal parent_error = error_per_parent[parent->id()];
222  if (parent_error >= 0.)
223  {
224  const Real parent_coarsening_tolerance =
225  std::sqrt(parent->n_children() *
226  local_coarsening_tolerance *
227  local_coarsening_tolerance);
228  if (parent_error < parent_coarsening_tolerance)
229  elem->set_refinement_flag(Elem::COARSEN);
230  }
231  }
232  }
233 }
234 
235 
236 
238 {
239  parallel_object_only();
240 
241  // Verify that our error vector is consistent, using std::vector to
242  // avoid confusing this->comm().verify
243  libmesh_assert(this->comm().verify(dynamic_cast<const std::vector<ErrorVectorReal> &>(error_per_cell)));
244 
245  // Check for valid fractions..
246  // The fraction values must be in [0,1]
247  libmesh_assert_greater_equal (_refine_fraction, 0);
248  libmesh_assert_less_equal (_refine_fraction, 1);
249  libmesh_assert_greater_equal (_coarsen_fraction, 0);
250  libmesh_assert_less_equal (_coarsen_fraction, 1);
251 
252  // This function is currently only coded to work when coarsening by
253  // parents - it's too hard to guess how many coarsenings will be
254  // performed otherwise.
256 
257  // The number of active elements in the mesh - hopefully less than
258  // 2 billion on 32 bit machines
259  const dof_id_type n_active_elem = _mesh.n_active_elem();
260 
261  // The maximum number of active elements to flag for coarsening
262  const dof_id_type max_elem_coarsen =
263  static_cast<dof_id_type>(_coarsen_fraction * n_active_elem) + 1;
264 
265  // The maximum number of elements to flag for refinement
266  const dof_id_type max_elem_refine =
267  static_cast<dof_id_type>(_refine_fraction * n_active_elem) + 1;
268 
269  // Clean up the refinement flags. These could be left
270  // over from previous refinement steps.
271  this->clean_refinement_flags();
272 
273  // The target number of elements to add or remove
274  const std::ptrdiff_t n_elem_new =
275  std::ptrdiff_t(_nelem_target) - std::ptrdiff_t(n_active_elem);
276 
277  // Create an vector with active element errors and ids,
278  // sorted by highest errors first
279  const dof_id_type max_elem_id = _mesh.max_elem_id();
280  std::vector<std::pair<ErrorVectorReal, dof_id_type>> sorted_error;
281 
282  sorted_error.reserve (n_active_elem);
283 
284  // On a DistributedMesh, we need to communicate to know which remote ids
285  // correspond to active elements.
286  {
287  std::vector<bool> is_active(max_elem_id, false);
288 
289  for (auto & elem : _mesh.active_local_element_ptr_range())
290  {
291  const dof_id_type eid = elem->id();
292  is_active[eid] = true;
293  libmesh_assert_less (eid, error_per_cell.size());
294  sorted_error.push_back
295  (std::make_pair(error_per_cell[eid], eid));
296  }
297 
298  this->comm().max(is_active);
299 
300  this->comm().allgather(sorted_error);
301  }
302 
303  // Default sort works since pairs are sorted lexicographically
304  std::sort (sorted_error.begin(), sorted_error.end());
305  std::reverse (sorted_error.begin(), sorted_error.end());
306 
307  // Create a sorted error vector with coarsenable parent elements
308  // only, sorted by lowest errors first
309  ErrorVector error_per_parent;
310  std::vector<std::pair<ErrorVectorReal, dof_id_type>> sorted_parent_error;
311  Real parent_error_min, parent_error_max;
312 
313  create_parent_error_vector(error_per_cell,
314  error_per_parent,
315  parent_error_min,
316  parent_error_max);
317 
318  // create_parent_error_vector sets values for non-parents and
319  // non-coarsenable parents to -1. Get rid of them.
320  for (auto i : index_range(error_per_parent))
321  if (error_per_parent[i] != -1)
322  sorted_parent_error.push_back(std::make_pair(error_per_parent[i], i));
323 
324  std::sort (sorted_parent_error.begin(), sorted_parent_error.end());
325 
326  // Keep track of how many elements we plan to coarsen & refine
327  dof_id_type coarsen_count = 0;
328  dof_id_type refine_count = 0;
329 
330  const unsigned int dim = _mesh.mesh_dimension();
331  unsigned int twotodim = 1;
332  for (unsigned int i=0; i!=dim; ++i)
333  twotodim *= 2;
334 
335  // First, let's try to get our element count to target_nelem
336  if (n_elem_new >= 0)
337  {
338  // Every element refinement creates at least
339  // 2^dim-1 new elements
340  refine_count =
341  std::min(cast_int<dof_id_type>(n_elem_new / (twotodim-1)),
342  max_elem_refine);
343  }
344  else
345  {
346  // Every successful element coarsening is likely to destroy
347  // 2^dim-1 net elements.
348  coarsen_count =
349  std::min(cast_int<dof_id_type>(-n_elem_new / (twotodim-1)),
350  max_elem_coarsen);
351  }
352 
353  // Next, let's see if we can trade any refinement for coarsening
354  while (coarsen_count < max_elem_coarsen &&
355  refine_count < max_elem_refine &&
356  coarsen_count < sorted_parent_error.size() &&
357  refine_count < sorted_error.size() &&
358  sorted_error[refine_count].first >
359  sorted_parent_error[coarsen_count].first * _coarsen_threshold)
360  {
361  coarsen_count++;
362  refine_count++;
363  }
364 
365  // On a DistributedMesh, we need to communicate to know which remote ids
366  // correspond to refinable elements
367  dof_id_type successful_refine_count = 0;
368  {
369  std::vector<bool> is_refinable(max_elem_id, false);
370 
371  for (const auto & pr : sorted_error)
372  {
373  dof_id_type eid = pr.second;
374  Elem * elem = _mesh.query_elem_ptr(eid);
375  if (elem && elem->level() < _max_h_level)
376  is_refinable[eid] = true;
377  }
378  this->comm().max(is_refinable);
379 
380  if (refine_count > max_elem_refine)
381  refine_count = max_elem_refine;
382  for (const auto & pr : sorted_error)
383  {
384  if (successful_refine_count >= refine_count)
385  break;
386 
387  dof_id_type eid = pr.second;
388  Elem * elem = _mesh.query_elem_ptr(eid);
389  if (is_refinable[eid])
390  {
391  if (elem)
393  successful_refine_count++;
394  }
395  }
396  }
397 
398  // If we couldn't refine enough elements, don't coarsen too many
399  // either
400  if (coarsen_count < (refine_count - successful_refine_count))
401  coarsen_count = 0;
402  else
403  coarsen_count -= (refine_count - successful_refine_count);
404 
405  if (coarsen_count > max_elem_coarsen)
406  coarsen_count = max_elem_coarsen;
407 
408  dof_id_type successful_coarsen_count = 0;
409  if (coarsen_count)
410  {
411  for (const auto & pr : sorted_parent_error)
412  {
413  if (successful_coarsen_count >= coarsen_count * twotodim)
414  break;
415 
416  dof_id_type parent_id = pr.second;
417  Elem * parent = _mesh.query_elem_ptr(parent_id);
418 
419  // On a DistributedMesh we skip remote elements
420  if (!parent)
421  continue;
422 
423  libmesh_assert(parent->has_children());
424  for (auto & elem : parent->child_ref_range())
425  {
426  if (&elem != remote_elem)
427  {
428  libmesh_assert(elem.active());
429  elem.set_refinement_flag(Elem::COARSEN);
430  successful_coarsen_count++;
431  }
432  }
433  }
434  }
435 
436  // Return true if we've done all the AMR/C we can
437  if (!successful_coarsen_count &&
438  !successful_refine_count)
439  return true;
440  // And false if there may still be more to do.
441  return false;
442 }
443 
444 
445 
447  const Real refine_frac,
448  const Real coarsen_frac,
449  const unsigned int max_l)
450 {
451  parallel_object_only();
452 
453  // Verify that our error vector is consistent, using std::vector to
454  // avoid confusing this->comm().verify
455  libmesh_assert(this->comm().verify(dynamic_cast<const std::vector<ErrorVectorReal> &>(error_per_cell)));
456 
457  // The function arguments are currently just there for
458  // backwards_compatibility
460  {
461  // If the user used non-default parameters, lets warn
462  // that they're deprecated
463  if (refine_frac != 0.3 ||
464  coarsen_frac != 0.0 ||
465  max_l != libMesh::invalid_uint)
466  libmesh_deprecated();
467 
468  _refine_fraction = refine_frac;
469  _coarsen_fraction = coarsen_frac;
470  _max_h_level = max_l;
471  }
472 
473  // Check for valid fractions..
474  // The fraction values must be in [0,1]
475  libmesh_assert_greater_equal (_refine_fraction, 0);
476  libmesh_assert_less_equal (_refine_fraction, 1);
477  libmesh_assert_greater_equal (_coarsen_fraction, 0);
478  libmesh_assert_less_equal (_coarsen_fraction, 1);
479 
480  // The number of active elements in the mesh
481  const dof_id_type n_active_elem = _mesh.n_active_elem();
482 
483  // The number of elements to flag for coarsening
484  const dof_id_type n_elem_coarsen =
485  static_cast<dof_id_type>(_coarsen_fraction * n_active_elem);
486 
487  // The number of elements to flag for refinement
488  const dof_id_type n_elem_refine =
489  static_cast<dof_id_type>(_refine_fraction * n_active_elem);
490 
491 
492 
493  // Clean up the refinement flags. These could be left
494  // over from previous refinement steps.
495  this->clean_refinement_flags();
496 
497 
498  // This vector stores the error and element number for all the
499  // active elements. It will be sorted and the top & bottom
500  // elements will then be flagged for coarsening & refinement
501  std::vector<ErrorVectorReal> sorted_error;
502 
503  sorted_error.reserve (n_active_elem);
504 
505  // Loop over the active elements and create the entry
506  // in the sorted_error vector
507  for (auto & elem : _mesh.active_local_element_ptr_range())
508  sorted_error.push_back (error_per_cell[elem->id()]);
509 
510  this->comm().allgather(sorted_error);
511 
512  // Now sort the sorted_error vector
513  std::sort (sorted_error.begin(), sorted_error.end());
514 
515  // If we're coarsening by parents:
516  // Create a sorted error vector with coarsenable parent elements
517  // only, sorted by lowest errors first
518  ErrorVector error_per_parent, sorted_parent_error;
520  {
521  Real parent_error_min, parent_error_max;
522 
523  create_parent_error_vector(error_per_cell,
524  error_per_parent,
525  parent_error_min,
526  parent_error_max);
527 
528  sorted_parent_error = error_per_parent;
529  std::sort (sorted_parent_error.begin(), sorted_parent_error.end());
530 
531  // All the other error values will be 0., so get rid of them.
532  sorted_parent_error.erase (std::remove(sorted_parent_error.begin(),
533  sorted_parent_error.end(), 0.),
534  sorted_parent_error.end());
535  }
536 
537 
538  ErrorVectorReal top_error= 0., bottom_error = 0.;
539 
540  // Get the maximum error value corresponding to the
541  // bottom n_elem_coarsen elements
542  if (_coarsen_by_parents && n_elem_coarsen)
543  {
544  const unsigned int dim = _mesh.mesh_dimension();
545  unsigned int twotodim = 1;
546  for (unsigned int i=0; i!=dim; ++i)
547  twotodim *= 2;
548 
549  dof_id_type n_parent_coarsen = n_elem_coarsen / (twotodim - 1);
550 
551  if (n_parent_coarsen)
552  bottom_error = sorted_parent_error[n_parent_coarsen - 1];
553  }
554  else if (n_elem_coarsen)
555  {
556  bottom_error = sorted_error[n_elem_coarsen - 1];
557  }
558 
559  if (n_elem_refine)
560  top_error = sorted_error[sorted_error.size() - n_elem_refine];
561 
562  // Finally, let's do the element flagging
563  for (auto & elem : _mesh.active_element_ptr_range())
564  {
565  Elem * parent = elem->parent();
566 
567  if (_coarsen_by_parents && parent && n_elem_coarsen &&
568  error_per_parent[parent->id()] <= bottom_error)
570 
571  if (!_coarsen_by_parents && n_elem_coarsen &&
572  error_per_cell[elem->id()] <= bottom_error)
573  elem->set_refinement_flag(Elem::COARSEN);
574 
575  if (n_elem_refine &&
576  elem->level() < _max_h_level &&
577  error_per_cell[elem->id()] >= top_error)
578  elem->set_refinement_flag(Elem::REFINE);
579  }
580 }
581 
582 
583 
585  const Real refine_frac,
586  const Real coarsen_frac,
587  const unsigned int max_l)
588 {
589  // Verify that our error vector is consistent, using std::vector to
590  // avoid confusing this->comm().verify
591  libmesh_assert(this->comm().verify(dynamic_cast<const std::vector<ErrorVectorReal> &>(error_per_cell)));
592 
593  // The function arguments are currently just there for
594  // backwards_compatibility
596  {
597  // If the user used non-default parameters, lets warn
598  // that they're deprecated
599  if (refine_frac != 0.3 ||
600  coarsen_frac != 0.0 ||
601  max_l != libMesh::invalid_uint)
602  libmesh_deprecated();
603 
604  _refine_fraction = refine_frac;
605  _coarsen_fraction = coarsen_frac;
606  _max_h_level = max_l;
607  }
608 
609  // Get the mean value from the error vector
610  const Real mean = error_per_cell.mean();
611 
612  // Get the standard deviation. This equals the
613  // square-root of the variance
614  const Real stddev = std::sqrt (error_per_cell.variance());
615 
616  // Check for valid fractions
617  libmesh_assert_greater_equal (_refine_fraction, 0);
618  libmesh_assert_less_equal (_refine_fraction, 1);
619  libmesh_assert_greater_equal (_coarsen_fraction, 0);
620  libmesh_assert_less_equal (_coarsen_fraction, 1);
621 
622  // The refine and coarsen cutoff
623  const Real refine_cutoff = mean + _refine_fraction * stddev;
624  const Real coarsen_cutoff = std::max(mean - _coarsen_fraction * stddev, 0.);
625 
626  // Loop over the elements and flag them for coarsening or
627  // refinement based on the element error
628  for (auto & elem : _mesh.active_element_ptr_range())
629  {
630  const dof_id_type id = elem->id();
631 
632  libmesh_assert_less (id, error_per_cell.size());
633 
634  const ErrorVectorReal elem_error = error_per_cell[id];
635 
636  // Possibly flag the element for coarsening ...
637  if (elem_error <= coarsen_cutoff)
638  elem->set_refinement_flag(Elem::COARSEN);
639 
640  // ... or refinement
641  if ((elem_error >= refine_cutoff) && (elem->level() < _max_h_level))
642  elem->set_refinement_flag(Elem::REFINE);
643  }
644 }
645 
646 
647 
649 {
650  element_flagging.flag_elements();
651 }
652 
653 
654 
656 {
657  for (auto & elem : _mesh.element_ptr_range())
658  {
659  if (elem->active())
660  {
661  elem->set_p_refinement_flag(elem->refinement_flag());
662  elem->set_refinement_flag(Elem::DO_NOTHING);
663  }
664  else
665  {
666  elem->set_p_refinement_flag(elem->refinement_flag());
667  elem->set_refinement_flag(Elem::INACTIVE);
668  }
669  }
670 }
671 
672 
673 
675 {
676  for (auto & elem : _mesh.element_ptr_range())
677  elem->set_p_refinement_flag(elem->refinement_flag());
678 }
679 
680 
681 
683 {
684  // Possibly clean up the refinement flags from
685  // a previous step
686  for (auto & elem : _mesh.element_ptr_range())
687  {
688  if (elem->active())
689  {
690  elem->set_refinement_flag(Elem::DO_NOTHING);
691  elem->set_p_refinement_flag(Elem::DO_NOTHING);
692  }
693  else
694  {
695  elem->set_refinement_flag(Elem::INACTIVE);
696  elem->set_p_refinement_flag(Elem::INACTIVE);
697  }
698  }
699 }
700 
701 } // namespace libMesh
702 
703 #endif
libMesh::MeshRefinement::ElementFlagging::flag_elements
virtual void flag_elements()=0
Callback function to be used for marking elements for refinement.
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::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::_mesh
MeshBase & _mesh
Reference to the mesh.
Definition: mesh_refinement.h:745
libMesh::MeshRefinement::_coarsen_by_parents
bool _coarsen_by_parents
Refinement parameter values.
Definition: mesh_refinement.h:758
libMesh::Elem::level
unsigned int level() const
Definition: elem.h:2478
libMesh::Elem::child_ref_range
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
Definition: elem.h:1839
libMesh::MeshBase::active_local_element_ptr_range
virtual SimpleRange< element_iterator > active_local_element_ptr_range()=0
libMesh::Elem::COARSEN
Definition: elem.h:1169
libMesh::MeshRefinement::_coarsen_fraction
Real _coarsen_fraction
Definition: mesh_refinement.h:762
libMesh::MeshBase::active_element_ptr_range
virtual SimpleRange< element_iterator > active_element_ptr_range()=0
libMesh::ErrorVectorReal
DIE A HORRIBLE DEATH HERE typedef float ErrorVectorReal
Definition: libmesh_common.h:206
libMesh::index_range
IntRange< std::size_t > index_range(const std::vector< T > &vec)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:106
libMesh::MeshBase::max_elem_id
virtual dof_id_type max_elem_id() const =0
libMesh
The libMesh namespace provides an interface to certain functionality in the library.
Definition: factoryfunction.C:55
std::sqrt
MetaPhysicL::DualNumber< T, D > sqrt(const MetaPhysicL::DualNumber< T, D > &in)
libMesh::ParallelObject::comm
const Parallel::Communicator & comm() const
Definition: parallel_object.h:94
libMesh::MeshRefinement::_max_h_level
unsigned int _max_h_level
Definition: mesh_refinement.h:764
libMesh::MeshBase::mesh_dimension
unsigned int mesh_dimension() const
Definition: mesh_base.C:135
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
dim
unsigned int dim
Definition: adaptivity_ex3.C:113
libMesh::MeshBase::query_elem_ptr
virtual const Elem * query_elem_ptr(const dof_id_type i) const =0
libMesh::MeshBase::element_ptr_range
virtual SimpleRange< element_iterator > element_ptr_range()=0
libMesh::libmesh_assert
libmesh_assert(ctx)
libMesh::MeshRefinement::_absolute_global_tolerance
Real _absolute_global_tolerance
Definition: mesh_refinement.h:770
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::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::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::Elem::DO_NOTHING
Definition: elem.h:1170
libMesh::Elem::REFINE
Definition: elem.h:1171
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::Elem::parent
const Elem * parent() const
Definition: elem.h:2434
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::Elem::n_children
virtual unsigned int n_children() const =0
libMesh::DofObject::id
dof_id_type id() const
Definition: dof_object.h:767
libMesh::ErrorVector::mean
virtual Real mean() const override
Definition: error_vector.C:69
libMesh::Elem::has_children
bool has_children() const
Definition: elem.h:2383
libMesh::Elem
This is the base class from which all geometric element types are derived.
Definition: elem.h:100
libMesh::MeshRefinement::ElementFlagging
Abstract base class to be used for user-specified element flagging.
Definition: mesh_refinement.h:88
libMesh::Elem::set_refinement_flag
void set_refinement_flag(const RefinementState rflag)
Sets the value of the refinement flag for the element.
Definition: elem.h:2622
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
libMesh::Elem::INACTIVE
Definition: elem.h:1174
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::_refine_fraction
Real _refine_fraction
Definition: mesh_refinement.h:760
libMesh::ErrorVector::variance
virtual Real variance() const override
Definition: error_vector.h:115
libMesh::remote_elem
const RemoteElem * remote_elem
Definition: remote_elem.C:57
libMesh::MeshRefinement::_nelem_target
dof_id_type _nelem_target
Definition: mesh_refinement.h:768
libMesh::MeshBase::n_active_elem
virtual dof_id_type n_active_elem() const =0
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::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