libMesh
mesh_base.h
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2024 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_BASE_H
21 #define LIBMESH_MESH_BASE_H
22 
23 // Local Includes
24 #include "libmesh/dof_object.h" // for invalid_processor_id
25 #include "libmesh/int_range.h"
26 #include "libmesh/libmesh_common.h"
27 #include "libmesh/multi_predicates.h"
28 #include "libmesh/point_locator_base.h"
29 #include "libmesh/variant_filter_iterator.h"
30 #include "libmesh/parallel_object.h"
31 #include "libmesh/simple_range.h"
32 
33 // C++ Includes
34 #include <cstddef>
35 #include <string>
36 #include <memory>
37 
38 namespace libMesh
39 {
40 
41 // forward declarations
42 class Elem;
43 class GhostingFunctor;
44 class Node;
45 class Point;
46 class Partitioner;
47 class BoundaryInfo;
48 
49 template <typename T>
50 class SparseMatrix;
51 
52 enum ElemType : int;
53 enum ElemMappingType : unsigned char;
54 
55 template <class MT>
56 class MeshInput;
57 
58 
74 class MeshBase : public ParallelObject
75 {
76 public:
77 
83  MeshBase (const Parallel::Communicator & comm_in,
84  unsigned char dim=1);
85 
89  MeshBase (const MeshBase & other_mesh);
90 
96  MeshBase(MeshBase &&) = delete;
97 
108  MeshBase & operator= (const MeshBase &) = delete;
109  MeshBase & operator= (MeshBase && other_mesh);
110 
115  virtual MeshBase & assign(MeshBase && other_mesh) = 0;
116 
126  bool operator== (const MeshBase & other_mesh) const;
127 
128  bool operator!= (const MeshBase & other_mesh) const
129  {
130  return !(*this == other_mesh);
131  }
132 
138  bool locally_equals (const MeshBase & other_mesh) const;
139 
140 
144  virtual std::unique_ptr<MeshBase> clone() const = 0;
145 
149  virtual ~MeshBase ();
150 
154  virtual std::unique_ptr<Partitioner> & partitioner() { return _partitioner; }
155 
159  const BoundaryInfo & get_boundary_info() const { return *boundary_info; }
160 
165 
173  virtual void clear ();
174 
186  virtual void clear_elems () = 0;
187 
192  bool is_prepared () const
193  { return _is_prepared; }
194 
199  { _is_prepared = false; }
200 
205  virtual bool is_serial () const
206  { return true; }
207 
212  virtual bool is_serial_on_zero () const
213  { return true; }
214 
220  virtual void set_distributed ()
221  { libmesh_error(); }
222 
227  virtual bool is_replicated () const
228  { return true; }
229 
234  virtual void allgather () {}
235 
240  virtual void gather_to_zero() {}
241 
247  virtual void delete_remote_elements () {}
248 
253 
260  unsigned int mesh_dimension () const;
261 
269  void set_mesh_dimension (unsigned char d)
270  { _elem_dims.clear(); _elem_dims.insert(d); }
271 
276  const std::set<unsigned char> & elem_dimensions() const
277  { return _elem_dims; }
278 
289  void set_elem_dimensions(std::set<unsigned char> elem_dims);
290 
297  typedef std::set<elemset_id_type> elemset_type;
298 
321 
327  unsigned int n_elemsets() const;
328 
335  void get_elemsets(dof_id_type elemset_code, MeshBase::elemset_type & id_set_to_fill) const;
337 
342  std::vector<dof_id_type> get_elemset_codes() const;
343 
350  void change_elemset_code(dof_id_type old_code, dof_id_type new_code);
351 
357 
383  unsigned int spatial_dimension () const;
384 
389  void set_spatial_dimension(unsigned char d);
390 
400  virtual dof_id_type n_nodes () const = 0;
401 
411  virtual dof_id_type parallel_n_nodes () const = 0;
412 
416  dof_id_type n_nodes_on_proc (const processor_id_type proc) const;
417 
422  { return this->n_nodes_on_proc (this->processor_id()); }
423 
429 
434  virtual dof_id_type max_node_id () const = 0;
435 
436 #ifdef LIBMESH_ENABLE_UNIQUE_ID
437 
441 
451  virtual void set_next_unique_id(unique_id_type id) = 0;
452 #endif
453 
462  virtual void reserve_nodes (const dof_id_type nn) = 0;
463 
471  virtual dof_id_type n_elem () const = 0;
472 
480  virtual dof_id_type parallel_n_elem () const = 0;
481 
486  virtual dof_id_type max_elem_id () const = 0;
487 
492 #ifdef LIBMESH_ENABLE_UNIQUE_ID
493  virtual unique_id_type parallel_max_unique_id () const = 0;
494 #endif
495 
504  virtual void reserve_elem (const dof_id_type ne) = 0;
505 
510  virtual void update_parallel_id_counts () = 0;
511 
517  virtual dof_id_type n_active_elem () const = 0;
518 
522  dof_id_type n_elem_on_proc (const processor_id_type proc) const;
523 
528  { return this->n_elem_on_proc (this->processor_id()); }
529 
535 
540 
545  { return this->n_active_elem_on_proc (this->processor_id()); }
546 
556  dof_id_type n_sub_elem () const;
557 
562 
568  virtual const Point & point (const dof_id_type i) const = 0;
569 
575  virtual const Node & node_ref (const dof_id_type i) const
576  {
577  return *this->node_ptr(i);
578  }
579 
584  virtual Node & node_ref (const dof_id_type i)
585  {
586  return *this->node_ptr(i);
587  }
588 
593  virtual const Node * node_ptr (const dof_id_type i) const = 0;
594 
600  virtual Node * node_ptr (const dof_id_type i) = 0;
601 
606  virtual const Node * query_node_ptr (const dof_id_type i) const = 0;
607 
612  virtual Node * query_node_ptr (const dof_id_type i) = 0;
613 
618  virtual const Elem & elem_ref (const dof_id_type i) const
619  {
620  return *this->elem_ptr(i);
621  }
622 
628  virtual Elem & elem_ref (const dof_id_type i)
629  {
630  return *this->elem_ptr(i);
631  }
632 
637  virtual const Elem * elem_ptr (const dof_id_type i) const = 0;
638 
644  virtual Elem * elem_ptr (const dof_id_type i) = 0;
645 
650  virtual const Elem * query_elem_ptr (const dof_id_type i) const = 0;
651 
656  virtual Elem * query_elem_ptr (const dof_id_type i) = 0;
657 
668  virtual Node * add_point (const Point & p,
670  const processor_id_type proc_id =
672 
676  virtual Node * add_node (Node * n) = 0;
677 
686  virtual Node * add_node (std::unique_ptr<Node> n) = 0;
687 
688 #ifdef LIBMESH_ENABLE_DEPRECATED
689 
696  virtual Node * insert_node(Node * n) = 0;
697 
705  virtual Node * insert_node(std::unique_ptr<Node> n) = 0;
706 #endif
707 
711  virtual void delete_node (Node * n) = 0;
712 
719  virtual void own_node (Node &) {}
720 
726  virtual void renumber_node (dof_id_type old_id, dof_id_type new_id) = 0;
727 
737  virtual Elem * add_elem (Elem * e) = 0;
738 
747  virtual Elem * add_elem (std::unique_ptr<Elem> e) = 0;
748 
756  virtual Elem * insert_elem (Elem * e) = 0;
757 
766  virtual Elem * insert_elem (std::unique_ptr<Elem> e) = 0;
767 
778  virtual void delete_elem (Elem * e) = 0;
779 
785  virtual void renumber_elem (dof_id_type old_id, dof_id_type new_id) = 0;
786 
792  {
793  return _default_mapping_type;
794  }
795 
801  {
802  _default_mapping_type = type;
803  }
804 
809  unsigned char default_mapping_data () const
810  {
811  return _default_mapping_data;
812  }
813 
818  void set_default_mapping_data (const unsigned char data)
819  {
820  _default_mapping_data = data;
821  }
822 
835  virtual void find_neighbors (const bool reset_remote_elements = false,
836  const bool reset_current_list = true) = 0;
837 
842  void remove_orphaned_nodes ();
843 
849  virtual void renumber_nodes_and_elements () = 0;
850 
857  virtual void fix_broken_node_and_element_numbering () = 0;
858 
859 
860 #ifdef LIBMESH_ENABLE_AMR
861 
866  virtual bool contract () = 0;
867 #endif
868 
886  unsigned int add_elem_integer(std::string name,
887  bool allocate_data = true,
888  dof_id_type default_value = DofObject::invalid_id);
889 
904  std::vector<unsigned int> add_elem_integers(const std::vector<std::string> & names,
905  bool allocate_data = true,
906  const std::vector<dof_id_type> * default_values = nullptr);
907 
908  /*
909  * \returns The index number for the named extra element integer
910  * datum, which must have already been added.
911  */
912  unsigned int get_elem_integer_index(std::string_view name) const;
913 
914  /*
915  * \returns Whether or not the mesh has an element integer with its name.
916  */
917  bool has_elem_integer(std::string_view name) const;
918 
919  /*
920  * \returns The name for the indexed extra element integer
921  * datum, which must have already been added.
922  */
923  const std::string & get_elem_integer_name(unsigned int i) const
924  { return _elem_integer_names[i]; }
925 
926  /*
927  * \returns The number of extra element integers for which space is
928  * being reserved on this mesh.
929  *
930  * If non-integer data has been associated, each datum of type T
931  * counts for sizeof(T)/sizeof(dof_id_type) times in the return
932  * value.
933  */
934  unsigned int n_elem_integers() const { return _elem_integer_names.size(); }
935 
961  template <typename T>
962  unsigned int add_elem_datum(const std::string & name,
963  bool allocate_data = true,
964  const T * default_value = nullptr);
965 
986  template <typename T>
987  std::vector<unsigned int> add_elem_data(const std::vector<std::string> & names,
988  bool allocate_data = true,
989  const std::vector<T> * default_values = nullptr);
990 
1008  unsigned int add_node_integer(std::string name,
1009  bool allocate_data = true,
1010  dof_id_type default_value = DofObject::invalid_id);
1011 
1026  std::vector<unsigned int> add_node_integers(const std::vector<std::string> & names,
1027  bool allocate_data = true,
1028  const std::vector<dof_id_type> * default_values = nullptr);
1029 
1030  /*
1031  * \returns The index number for the named extra node integer
1032  * datum, which must have already been added.
1033  */
1034  unsigned int get_node_integer_index(std::string_view name) const;
1035 
1036  /*
1037  * \returns Whether or not the mesh has a node integer with its name.
1038  */
1039  bool has_node_integer(std::string_view name) const;
1040 
1041  /*
1042  * \returns The name for the indexed extra node integer
1043  * datum, which must have already been added.
1044  */
1045  const std::string & get_node_integer_name(unsigned int i) const
1046  { return _node_integer_names[i]; }
1047 
1048  /*
1049  * \returns The number of extra node integers for which space is
1050  * being reserved on this mesh.
1051  *
1052  * If non-integer data has been associated, each datum of type T
1053  * counts for sizeof(T)/sizeof(dof_id_type) times in the return
1054  * value.
1055  */
1056  unsigned int n_node_integers() const { return _node_integer_names.size(); }
1057 
1083  template <typename T>
1084  unsigned int add_node_datum(const std::string & name,
1085  bool allocate_data = true,
1086  const T * default_value = nullptr);
1087 
1108  template <typename T>
1109  std::vector<unsigned int> add_node_data(const std::vector<std::string> & name,
1110  bool allocate_data = true,
1111  const std::vector<T> * default_values = nullptr);
1112 
1130  void prepare_for_use (const bool skip_renumber_nodes_and_elements, const bool skip_find_neighbors);
1131  void prepare_for_use (const bool skip_renumber_nodes_and_elements);
1132  void prepare_for_use ();
1133 
1137  virtual void partition (const unsigned int n_parts);
1138 
1139  void partition ()
1140  { this->partition(this->n_processors()); }
1141 
1148  virtual void redistribute ();
1149 
1154  virtual void update_post_partitioning () {}
1155 
1175 
1180  void allow_find_neighbors(bool allow) { _skip_find_neighbors = !allow; }
1181  bool allow_find_neighbors() const { return !_skip_find_neighbors; }
1182 
1191 
1214  { _skip_noncritical_partitioning = skip; }
1215 
1218 
1219 
1231  void skip_partitioning(bool skip) { _skip_all_partitioning = skip; }
1232 
1234 
1244  void add_ghosting_functor(GhostingFunctor & ghosting_functor)
1245  { _ghosting_functors.insert(&ghosting_functor); }
1246 
1255  void add_ghosting_functor(std::shared_ptr<GhostingFunctor> ghosting_functor)
1256  { _shared_functors[ghosting_functor.get()] = ghosting_functor;
1257  this->add_ghosting_functor(*ghosting_functor); }
1258 
1263  void remove_ghosting_functor(GhostingFunctor & ghosting_functor);
1264 
1268  std::set<GhostingFunctor *>::const_iterator ghosting_functors_begin() const
1269  { return _ghosting_functors.begin(); }
1270 
1274  std::set<GhostingFunctor *>::const_iterator ghosting_functors_end() const
1275  { return _ghosting_functors.end(); }
1276 
1281 
1294  void subdomain_ids (std::set<subdomain_id_type> & ids, const bool global = true) const;
1295 
1304 
1313 
1322  unsigned int n_partitions () const
1323  { return _n_parts; }
1324 
1341  std::string get_info (const unsigned int verbosity = 0, const bool global = true) const;
1342 
1349  void print_info (std::ostream & os=libMesh::out, const unsigned int verbosity = 0, const bool global = true) const;
1350 
1356  friend std::ostream & operator << (std::ostream & os, const MeshBase & m);
1357 
1362  virtual void read (const std::string & name,
1363  void * mesh_data=nullptr,
1364  bool skip_renumber_nodes_and_elements=false,
1365  bool skip_find_neighbors=false) = 0;
1366  virtual void write (const std::string & name) = 0;
1367 
1374  virtual void all_first_order () = 0;
1375 
1381 
1389  struct element_iterator;
1390  struct const_element_iterator;
1391 
1399  struct node_iterator;
1400  struct const_node_iterator;
1401 
1413  virtual void all_second_order_range(const SimpleRange<element_iterator> & range,
1414  const bool full_ordered = true) = 0;
1415 
1420  void all_second_order (const bool full_ordered = true);
1421 
1429  virtual void all_complete_order_range(const SimpleRange<element_iterator> & range) = 0;
1430 
1435  virtual void all_complete_order ();
1436 
1446  unsigned int recalculate_n_partitions();
1447 
1455  std::unique_ptr<PointLocatorBase> sub_point_locator () const;
1456 
1468 
1472  void clear_point_locator ();
1473 
1479  void set_count_lower_dim_elems_in_point_locator(bool count_lower_dim_elems);
1480 
1485 
1493  virtual void libmesh_assert_valid_parallel_ids() const {}
1494 
1499  std::string & subdomain_name(subdomain_id_type id);
1500  const std::string & subdomain_name(subdomain_id_type id) const;
1501 
1506  subdomain_id_type get_id_by_name(std::string_view name) const;
1507 
1508  /*
1509  * We have many combinations of iterators that filter on various
1510  * characteristics; we use macros to make their abstract base class
1511  * and their subclass declarations more terse.
1512  */
1513 #define ABSTRACT_ELEM_ITERATORS(TYPE, ARGDECL) \
1514  virtual element_iterator TYPE##elements_begin(ARGDECL) = 0; \
1515  virtual element_iterator TYPE##elements_end(ARGDECL) = 0; \
1516  virtual const_element_iterator TYPE##elements_begin(ARGDECL) const = 0; \
1517  virtual const_element_iterator TYPE##elements_end(ARGDECL) const = 0; \
1518  virtual SimpleRange<element_iterator> TYPE##element_ptr_range(ARGDECL) = 0; \
1519  virtual SimpleRange<const_element_iterator> TYPE##element_ptr_range(ARGDECL) const = 0;
1520 
1521 #define DECLARE_ELEM_ITERATORS(TYPE, ARGDECL, ARGS) \
1522  virtual element_iterator TYPE##elements_begin(ARGDECL) override final; \
1523  virtual element_iterator TYPE##elements_end(ARGDECL) override final; \
1524  virtual const_element_iterator TYPE##elements_begin(ARGDECL) const override final; \
1525  virtual const_element_iterator TYPE##elements_end(ARGDECL) const override final; \
1526  virtual SimpleRange<element_iterator> TYPE##element_ptr_range(ARGDECL) override final { return {TYPE##elements_begin(ARGS), TYPE##elements_end(ARGS)}; } \
1527  virtual SimpleRange<const_element_iterator> TYPE##element_ptr_range(ARGDECL) const override final { return {TYPE##elements_begin(ARGS), TYPE##elements_end(ARGS)}; }
1528 
1529 #define ABSTRACT_NODE_ITERATORS(TYPE, ARGDECL) \
1530  virtual node_iterator TYPE##nodes_begin(ARGDECL) = 0; \
1531  virtual node_iterator TYPE##nodes_end(ARGDECL) = 0; \
1532  virtual const_node_iterator TYPE##nodes_begin(ARGDECL) const = 0; \
1533  virtual const_node_iterator TYPE##nodes_end(ARGDECL) const = 0; \
1534  virtual SimpleRange<node_iterator> TYPE##node_ptr_range(ARGDECL) = 0; \
1535  virtual SimpleRange<const_node_iterator> TYPE##node_ptr_range(ARGDECL) const = 0;
1536 
1537 #define DECLARE_NODE_ITERATORS(TYPE, ARGDECL, ARGS) \
1538  virtual node_iterator TYPE##nodes_begin(ARGDECL) override final; \
1539  virtual node_iterator TYPE##nodes_end(ARGDECL) override final; \
1540  virtual const_node_iterator TYPE##nodes_begin(ARGDECL) const override final; \
1541  virtual const_node_iterator TYPE##nodes_end(ARGDECL) const override final; \
1542  virtual SimpleRange<node_iterator> TYPE##node_ptr_range(ARGDECL) override final { return {TYPE##nodes_begin(ARGS), TYPE##nodes_end(ARGS)}; } \
1543  virtual SimpleRange<const_node_iterator> TYPE##node_ptr_range(ARGDECL) const override final { return {TYPE##nodes_begin(ARGS), TYPE##nodes_end(ARGS)}; }
1544 
1545 #define LIBMESH_COMMA ,
1546 
1547  /*
1548  * element_iterator accessors
1549  *
1550  * The basic elements_begin() and elements_end() iterators iterate
1551  * over all elements in a mesh, returning element pointers or const
1552  * element pointers when dereferenced (depending on whether the mesh
1553  * reference was const). range-for loops can be written using
1554  * element_ptr_range()
1555  *
1556  * Filtered versions of these iterators, which skip over all
1557  * elements not matching some predicate, are also available, by
1558  * adding a prefix to the methods above. E.g. local_ (in a form
1559  * like local_elements_begin() or local_element_ptr_range()) will
1560  * iterate only over elements whose processor_id() is the current
1561  * processor, or active_ will iterate only over active elements even
1562  * if the mesh is refined, or active_local_ will iterate over
1563  * elements that are both active and local. Negation forms such as
1564  * not_local_ also exist.
1565  *
1566  * For some iterator prefixes, such as type_, an argument is needed
1567  * for the filter; e.g. the ElemType to select for in that case.
1568  *
1569  * All valid prefixes and their corresponding arguments can be found
1570  * in the macro invocations below.
1571  */
1572  ABSTRACT_ELEM_ITERATORS(,) // elements_begin(), element_ptr_range(): all elements
1573  ABSTRACT_ELEM_ITERATORS(active_,) // Elem::active() == true
1574  ABSTRACT_ELEM_ITERATORS(ancestor_,) // Elem::ancestor() == true
1575  ABSTRACT_ELEM_ITERATORS(subactive_,) // Elem::subactive() == true
1576  ABSTRACT_ELEM_ITERATORS(local_,) // Elem::processor_id() == this processor
1577  ABSTRACT_ELEM_ITERATORS(unpartitioned_,) // Elem::processor_id() == invalid_processor_id
1578  ABSTRACT_ELEM_ITERATORS(facelocal_,) // is on or has a neighbor on this processor
1579  ABSTRACT_ELEM_ITERATORS(level_,unsigned int level) // Elem::level() == level
1580  ABSTRACT_ELEM_ITERATORS(pid_,processor_id_type pid) // Elem::processor_id() == pid
1581  ABSTRACT_ELEM_ITERATORS(type_,ElemType type) // Elem::type() == type
1582 
1583  ABSTRACT_ELEM_ITERATORS(active_subdomain_,subdomain_id_type sid) // active && Elem::subdomain_id() == sid
1584  ABSTRACT_ELEM_ITERATORS(active_subdomain_set_,std::set<subdomain_id_type> ss) // active && ss.contains(Elem::subdomain_id())
1585 
1586  // Iterators which use negations of filters described above
1587  ABSTRACT_ELEM_ITERATORS(not_active_,)
1588  ABSTRACT_ELEM_ITERATORS(not_ancestor_,)
1589  ABSTRACT_ELEM_ITERATORS(not_subactive_,)
1590  ABSTRACT_ELEM_ITERATORS(not_local_,)
1591  ABSTRACT_ELEM_ITERATORS(not_level_,unsigned int level)
1592 
1593  // Iterators which combine multiple of the filters described above
1594  ABSTRACT_ELEM_ITERATORS(active_local_,)
1595  ABSTRACT_ELEM_ITERATORS(active_not_local_,)
1596  ABSTRACT_ELEM_ITERATORS(active_unpartitioned_,)
1597  ABSTRACT_ELEM_ITERATORS(active_type_,ElemType type)
1599  ABSTRACT_ELEM_ITERATORS(local_level_,unsigned int level)
1600  ABSTRACT_ELEM_ITERATORS(local_not_level_,unsigned int level)
1601  ABSTRACT_ELEM_ITERATORS(active_local_subdomain_,subdomain_id_type sid)
1602  ABSTRACT_ELEM_ITERATORS(active_local_subdomain_set_,std::set<subdomain_id_type> ss)
1603 
1604  // Backwards compatibility
1605  virtual SimpleRange<element_iterator> active_subdomain_elements_ptr_range(subdomain_id_type sid) = 0;
1606  virtual SimpleRange<const_element_iterator> active_subdomain_elements_ptr_range(subdomain_id_type sid) const = 0;
1607  virtual SimpleRange<element_iterator> active_local_subdomain_elements_ptr_range(subdomain_id_type sid) = 0;
1608  virtual SimpleRange<const_element_iterator> active_local_subdomain_elements_ptr_range(subdomain_id_type sid) const = 0;
1609  virtual SimpleRange<element_iterator> active_subdomain_set_elements_ptr_range(std::set<subdomain_id_type> ss) = 0;
1610  virtual SimpleRange<const_element_iterator> active_subdomain_set_elements_ptr_range(std::set<subdomain_id_type> ss) const = 0;
1611 
1612  // Discouraged from use - these iterators use outdated
1613  // pre-GhostingFunctor definitions and should be renamed if not
1614  // deprecated
1615  ABSTRACT_ELEM_ITERATORS(semilocal_,) // active && Elem::is_semilocal()
1616  ABSTRACT_ELEM_ITERATORS(ghost_,) // active && Elem::is_semilocal() && not local discouraged
1617  ABSTRACT_ELEM_ITERATORS(active_semilocal_,)
1618 
1619  // solution can be evaluated, with the given DoF map, for the given
1620  // variable number, or for all variables by default
1621  ABSTRACT_ELEM_ITERATORS(evaluable_,const DofMap & dof_map LIBMESH_COMMA unsigned int var_num = libMesh::invalid_uint)
1622 
1623  // solution can be evaluated for all variables of all given DoF maps
1624  ABSTRACT_ELEM_ITERATORS(multi_evaluable_,std::vector<const DofMap *> dof_maps)
1625 
1626 #ifdef LIBMESH_ENABLE_AMR
1627  ABSTRACT_ELEM_ITERATORS(flagged_,unsigned char rflag) // Elem::refinement_flag() == rflag
1628 
1629  // Elem::refinement_flag() == rflag && Elem::processor_id() == pid
1630  ABSTRACT_ELEM_ITERATORS(flagged_pid_,unsigned char rflag LIBMESH_COMMA processor_id_type pid)
1631 #endif
1632 
1633  /*
1634  * node_iterator accessors
1635  *
1636  * The basic nodes_begin() and nodes_end() iterators iterate
1637  * over all nodes in a mesh, returning node pointers or const
1638  * node pointers when dereferenced (depending on whether the mesh
1639  * reference was const). range-for loops can be written using
1640  * node_ptr_range()
1641  *
1642  * Filtered versions of these iterators, which skip over all
1643  * nodes not matching some predicate, are also available, by
1644  * adding a prefix to the methods above. E.g. local_ (in a form
1645  * like local_nodes_begin() or local_node_ptr_range()) will
1646  * iterate only over nodes whose processor_id() is the current
1647  * processor.
1648  *
1649  * All valid prefixes and their corresponding arguments can be found
1650  * in the macro invocations below.
1651  */
1652  ABSTRACT_NODE_ITERATORS(,) // nodes_begin(), node_ptr_range(): all nodes
1653  ABSTRACT_NODE_ITERATORS(active_,) // Node::active() == true; i.e. Node::id() != invalid_id
1654  ABSTRACT_NODE_ITERATORS(local_,) // Node::processor_id() == this processor
1655  ABSTRACT_NODE_ITERATORS(bnd_,) // BoundaryInfo::n_boundary_ids(node) > 0
1656  ABSTRACT_NODE_ITERATORS(pid_,processor_id_type pid) // Node::processor_id() == pid
1657  ABSTRACT_NODE_ITERATORS(bid_,boundary_id_type bid) // BoundaryInfo::has_boundary_id(node, bid)
1658 
1659  // solution can be evaluated, with the given DoF map, for the given
1660  // variable number, or for all variables by default
1661  ABSTRACT_NODE_ITERATORS(evaluable_,const DofMap & dof_map LIBMESH_COMMA unsigned int var_num = libMesh::invalid_uint)
1662 
1663  // solution can be evaluated for all variables of all given DoF maps
1664  ABSTRACT_NODE_ITERATORS(multi_evaluable_,std::vector<const DofMap *> dof_maps)
1665 
1670  { return _block_id_to_name; }
1671  const std::map<subdomain_id_type, std::string> & get_subdomain_name_map () const
1672  { return _block_id_to_name; }
1673 
1674  typedef std::vector<std::pair<std::pair<const Elem *, unsigned int>, Real>> constraint_rows_mapped_type;
1675  typedef std::map<const Node *, constraint_rows_mapped_type> constraint_rows_type;
1676 
1677 
1681  void copy_constraint_rows(const MeshBase & other_mesh);
1682 
1684  { return _constraint_rows; }
1685 
1687  { return _constraint_rows; }
1688 
1711  template <typename T>
1712  void copy_constraint_rows(const SparseMatrix<T> & constraint_operator);
1713 
1721  void cache_elem_dims();
1722 
1723  /*
1724  * Search the mesh and cache data for the elements
1725  * present in the mesh. This is done in prepare_for_use(), but can
1726  * be done manually by other classes after major mesh modifications.
1727  * Data cached includes:
1728  * - elem dimensions
1729  * - elem subdomains
1730  */
1731  void cache_elem_data();
1732 
1737  void detect_interior_parents();
1738 
1744  const std::set<subdomain_id_type> & get_mesh_subdomains() const
1745  { libmesh_assert(this->is_prepared()); return _mesh_subdomains; }
1746 
1747 
1757 #ifndef LIBMESH_ENABLE_DEPRECATED
1758 protected:
1759 #endif
1760  std::unique_ptr<BoundaryInfo> boundary_info;
1761 
1762 
1763 protected:
1772  void post_dofobject_moves(MeshBase && other_mesh);
1773 
1778  virtual bool subclass_locally_equals (const MeshBase & other_mesh) const = 0;
1779 
1784  bool nodes_and_elements_equal(const MeshBase & other_mesh) const;
1785 
1789  unsigned int & set_n_partitions ()
1790  { return _n_parts; }
1791 
1802  unsigned int _n_parts;
1803 
1809 
1815  unsigned char _default_mapping_data;
1816 
1821 
1829  mutable std::unique_ptr<PointLocatorBase> _point_locator;
1830 
1836 
1843  std::unique_ptr<Partitioner> _partitioner;
1844 
1845 #ifdef LIBMESH_ENABLE_UNIQUE_ID
1846 
1850 #endif
1851 
1857 
1862 
1869 
1874 
1882 
1888  std::map<subdomain_id_type, std::string> _block_id_to_name;
1889 
1895  std::set<unsigned char> _elem_dims;
1896 
1900  std::set<subdomain_id_type> _mesh_subdomains;
1901 
1924  std::map<dof_id_type, const MeshBase::elemset_type *> _elemset_codes;
1925  std::map<MeshBase::elemset_type, dof_id_type> _elemset_codes_inverse_map;
1927 
1932  unsigned char _spatial_dimension;
1933 
1938  std::vector<std::string> _elem_integer_names;
1939 
1944  std::vector<dof_id_type> _elem_integer_default_values;
1945 
1950  std::vector<std::string> _node_integer_names;
1951 
1956  std::vector<dof_id_type> _node_integer_default_values;
1957 
1961  void size_elem_extra_integers();
1962 
1966  void size_node_extra_integers();
1967 
1974  std::pair<std::vector<unsigned int>, std::vector<unsigned int>>
1975  merge_extra_integer_names(const MeshBase & other);
1976 
1982  std::unique_ptr<GhostingFunctor> _default_ghosting;
1983 
1991  std::set<GhostingFunctor *> _ghosting_functors;
1992 
1997  std::map<GhostingFunctor *, std::shared_ptr<GhostingFunctor> > _shared_functors;
1998 
1999  // Keep track of any constraint equations that are inherent to the
2000  // mesh, such as FE nodes whose Rational Bernstein values need to be
2001  // constrained in terms of values on spline control nodes.
2002  //
2003  // _constraint_rows[constrained_node_id][i].first.first is an
2004  // element,
2005  // _constraint_rows[constrained_node_id][i].first.second is the
2006  // local node id of that element which is a constraining node,
2007  // _constraint_rows[constrained_node_id][i].second is that node's
2008  // constraint coefficient.
2010 
2016 
2021  friend class Partitioner;
2022 
2027  friend class MeshInput<MeshBase>;
2028 
2033  friend class BoundaryInfo;
2034 
2039  friend class MeshCommunication;
2040 
2041 
2046 #ifdef LIBMESH_ENABLE_DEPRECATED
2048 
2050  Elem * const,
2051  Elem * const &,
2053 
2055 
2057  Node * const,
2058  Node * const &,
2060 #else
2062  Elem * const,
2063  Elem * const &,
2064  Elem * const *,
2065  const Elem * const,
2066  const Elem * const &,
2067  const Elem * const *> elem_filter_iter;
2068 
2070  const Elem * const,
2071  const Elem * const &,
2072  const Elem * const *> const_elem_filter_iter;
2073 
2075  Node * const,
2076  Node * const &,
2077  Node * const *,
2078  const Node * const,
2079  const Node * const &,
2080  const Node * const *> node_filter_iter;
2081 
2083  const Node * const,
2084  const Node * const &,
2085  const Node * const *> const_node_filter_iter;
2086 #endif // LIBMESH_ENABLE_DEPRECATED
2087 
2088 };
2089 
2090 
2091 
2092 
2093 
2094 
2095 
2096 
2097 
2098 
2099 
2103 struct
2105 {
2106  // Templated forwarding ctor -- forwards to appropriate variant_filter_iterator ctor
2107  template <typename PredType, typename IterType>
2108  element_iterator (const IterType & d,
2109  const IterType & e,
2110  const PredType & p ) :
2111  elem_filter_iter(d,e,p) {}
2112 };
2113 
2114 
2115 
2116 
2121 struct
2123 {
2127  template <typename PredType, typename IterType>
2128  const_element_iterator (const IterType & d,
2129  const IterType & e,
2130  const PredType & p ) :
2131  const_elem_filter_iter(d,e,p) {}
2132 
2140  const_elem_filter_iter(rhs) {}
2141 };
2142 
2143 
2144 
2145 
2146 
2147 
2148 
2152 struct
2154 {
2158  template <typename PredType, typename IterType>
2159  node_iterator (const IterType & d,
2160  const IterType & e,
2161  const PredType & p ) :
2162  node_filter_iter(d,e,p) {}
2163 };
2164 
2165 
2166 
2167 
2172 struct
2174 {
2178  template <typename PredType, typename IterType>
2179  const_node_iterator (const IterType & d,
2180  const IterType & e,
2181  const PredType & p ) :
2182  const_node_filter_iter(d,e,p) {}
2183 
2191  const_node_filter_iter(rhs) {}
2192 };
2193 
2194 
2195 template <typename T>
2196 inline
2197 unsigned int MeshBase::add_elem_datum(const std::string & name,
2198  bool allocate_data,
2199  const T * default_value)
2200 {
2201  const std::size_t old_size = _elem_integer_names.size();
2202 
2203  unsigned int n_more_integers = (sizeof(T)-1)/sizeof(dof_id_type);
2204  std::vector<dof_id_type> int_data(n_more_integers+1, DofObject::invalid_id);
2205  if (default_value)
2206  std::memcpy(int_data.data(), default_value, sizeof(T));
2207 
2208  unsigned int start_idx = this->add_elem_integer(name, false, int_data[0]);
2209  for (unsigned int i=0; i != n_more_integers; ++i)
2210  this->add_elem_integer(name+"__"+std::to_string(i), false, int_data[i+1]);
2211 
2212  if (allocate_data && old_size != _elem_integer_names.size())
2213  this->size_elem_extra_integers();
2214 
2215  return start_idx;
2216 }
2217 
2218 
2219 template <typename T>
2220 inline
2221 std::vector<unsigned int> MeshBase::add_elem_data(const std::vector<std::string> & names,
2222  bool allocate_data,
2223  const std::vector<T> * default_values)
2224 {
2225  libmesh_assert(!default_values || default_values->size() == names.size());
2226 
2227  std::vector<unsigned int> returnval(names.size());
2228 
2229  const std::size_t old_size = _elem_integer_names.size();
2230 
2231  for (auto i : index_range(names))
2232  returnval[i] =
2233  this->add_elem_datum<T>(names[i], false,
2234  default_values ?
2235  (*default_values)[i] : nullptr);
2236 
2237  if (allocate_data && old_size != _elem_integer_names.size())
2238  this->size_elem_extra_integers();
2239 
2240  return returnval;
2241 }
2242 
2243 
2244 template <typename T>
2245 inline
2246 unsigned int MeshBase::add_node_datum(const std::string & name,
2247  bool allocate_data,
2248  const T * default_value)
2249 {
2250  const std::size_t old_size = _node_integer_names.size();
2251 
2252  unsigned int n_more_integers = (sizeof(T)-1)/sizeof(dof_id_type);
2253  std::vector<dof_id_type> int_data(n_more_integers+1, DofObject::invalid_id);
2254  if (default_value)
2255  std::memcpy(int_data.data(), default_value, sizeof(T));
2256 
2257  unsigned int start_idx = this->add_node_integer(name, false, int_data[0]);
2258  for (unsigned int i=0; i != n_more_integers; ++i)
2259  this->add_node_integer(name+"__"+std::to_string(i), false, int_data[i+1]);
2260 
2261  if (allocate_data && old_size != _node_integer_names.size())
2262  this->size_node_extra_integers();
2263 
2264  return start_idx;
2265 }
2266 
2267 
2268 template <typename T>
2269 inline
2270 std::vector<unsigned int> MeshBase::add_node_data(const std::vector<std::string> & names,
2271  bool allocate_data,
2272  const std::vector<T> * default_values)
2273 {
2274  libmesh_assert(!default_values || default_values->size() == names.size());
2275 
2276  std::vector<unsigned int> returnval(names.size());
2277 
2278  const std::size_t old_size = _node_integer_names.size();
2279 
2280  for (auto i : index_range(names))
2281  returnval[i] =
2282  this->add_node_datum<T>(names[i], false,
2283  default_values ?
2284  (*default_values)[i] : nullptr);
2285 
2286  if (allocate_data && old_size != _node_integer_names.size())
2287  this->size_node_extra_integers();
2288 
2289  return returnval;
2290 }
2291 
2292 
2293 
2294 } // namespace libMesh
2295 
2296 #endif // LIBMESH_MESH_BASE_H
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
The definition of the element_iterator struct.
Definition: mesh_base.h:2103
bool operator==(const MeshBase &other_mesh) const
This tests for exactly-equal data in all the senses that a mathematician would care about (element co...
Definition: mesh_base.C:212
variant_filter_iterator< MeshBase::Predicate, Elem * > elem_filter_iter
The original iterator classes weren&#39;t properly const-safe; relying on their const-incorrectness is no...
Definition: mesh_base.h:2047
std::set< subdomain_id_type > _mesh_subdomains
We cache the subdomain ids of the elements present in the mesh.
Definition: mesh_base.h:1900
bool has_node_integer(std::string_view name) const
Definition: mesh_base.C:679
std::vector< unsigned int > add_elem_integers(const std::vector< std::string > &names, bool allocate_data=true, const std::vector< dof_id_type > *default_values=nullptr)
Register integer data (of type dof_id_type) to be added to each element in the mesh, one string name for each new integer.
Definition: mesh_base.C:535
ElemType
Defines an enum for geometric element types.
The SimpleRange templated class is intended to make it easy to construct ranges from pairs of iterato...
Definition: simple_range.h:36
bool operator!=(const MeshBase &other_mesh) const
Definition: mesh_base.h:128
virtual void read(const std::string &name, void *mesh_data=nullptr, bool skip_renumber_nodes_and_elements=false, bool skip_find_neighbors=false)=0
Interfaces for reading/writing a mesh to/from a file.
virtual void reserve_nodes(const dof_id_type nn)=0
Reserves space for a known number of nodes.
ABSTRACT_ELEM_ITERATORS(,) ABSTRACT_ELEM_ITERATORS(active_
virtual bool subclass_locally_equals(const MeshBase &other_mesh) const =0
Shim to allow operator == (&) to behave like a virtual function without having to be one...
bool _skip_renumber_nodes_and_elements
If this is true then renumbering will be kept to a minimum.
Definition: mesh_base.h:1868
bool is_prepared() const
Definition: mesh_base.h:192
constraint_rows_type & get_constraint_rows()
Definition: mesh_base.h:1683
virtual dof_id_type n_active_elem() const =0
A Node is like a Point, but with more information.
Definition: node.h:52
This abstract base class defines the interface by which library code and user code can report associa...
virtual void renumber_node(dof_id_type old_id, dof_id_type new_id)=0
Changes the id of node old_id, both by changing node(old_id)->id() and by moving node(old_id) in the ...
Real get_point_locator_close_to_point_tol() const
Definition: mesh_base.C:1836
dof_id_type n_elem_on_proc(const processor_id_type proc) const
Definition: mesh_base.C:976
virtual unique_id_type parallel_max_unique_id() const =0
dof_id_type n_unpartitioned_nodes() const
Definition: mesh_base.h:427
variant_filter_iterator< MeshBase::Predicate, Node * > node_filter_iter
Definition: mesh_base.h:2054
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
Definition: libmesh.h:286
std::vector< std::string > _elem_integer_names
The array of names for integer data associated with each element in the mesh.
Definition: mesh_base.h:1938
std::unique_ptr< PointLocatorBase > sub_point_locator() const
Definition: mesh_base.C:1565
unsigned int n_node_integers() const
Definition: mesh_base.h:1056
void remove_orphaned_nodes()
Removes any orphaned nodes, nodes not connected to any elements.
Definition: mesh_base.C:690
Original Authors: Corwin Joy * Michael Gradman cjoy@houston.rr.com * Michael.Gradman@caminus.com Caminus, Suite 1150, Two Allen Center, 1200 Smith Street, Houston, TX 77002 This class is an extension of variant_bidirectional_iterator to a filter_iterator similar to boost&#39;s.
std::vector< dof_id_type > get_elemset_codes() const
Return a vector of all elemset codes defined on the mesh.
Definition: mesh_base.C:397
BoundaryInfo & get_boundary_info()
Writable information about boundary ids on the mesh.
Definition: mesh_base.h:164
virtual void all_second_order_range(const SimpleRange< element_iterator > &range, const bool full_ordered=true)=0
Converts a set of this Mesh&#39;s elements defined by range from FIRST order to SECOND order...
void allow_renumbering(bool allow)
If false is passed in then this mesh will no longer be renumbered when being prepared for use...
Definition: mesh_base.h:1173
void add_ghosting_functor(std::shared_ptr< GhostingFunctor > ghosting_functor)
Adds a functor which can specify ghosting requirements for use on distributed meshes.
Definition: mesh_base.h:1255
void detect_interior_parents()
Search the mesh for elements that have a neighboring element of dim+1 and set that element as the int...
Definition: mesh_base.C:1729
void skip_partitioning(bool skip)
If true is passed in then nothing on this mesh will be (re)partitioned.
Definition: mesh_base.h:1231
dof_id_type n_active_elem_on_proc(const processor_id_type proc) const
Definition: mesh_base.C:989
The definition of the const_element_iterator struct.
Definition: mesh_base.h:2121
unsigned int dim
std::vector< std::pair< std::pair< const Elem *, unsigned int >, Real > > constraint_rows_mapped_type
Definition: mesh_base.h:1674
subdomain_id_type n_local_subdomains() const
Definition: mesh_base.C:951
variant_filter_iterator< MeshBase::Predicate, const Elem *const, const Elem *const &, const Elem *const * > const_elem_filter_iter
Definition: mesh_base.h:2072
Predicates::multi_predicate Predicate
We need an empty, generic class to act as a predicate for this and derived mesh classes.
Definition: mesh_base.h:1380
virtual void allgather()
Gathers all elements and nodes of the mesh onto every processor.
Definition: mesh_base.h:234
void set_spatial_dimension(unsigned char d)
Sets the "spatial dimension" of the Mesh.
Definition: mesh_base.C:502
void set_isnt_prepared()
Tells this we have done some operation where we should no longer consider ourself prepared...
Definition: mesh_base.h:198
std::map< dof_id_type, const MeshBase::elemset_type * > _elemset_codes
Map from "element set code" to list of set ids to which that element belongs (and vice-versa)...
Definition: mesh_base.h:1924
bool skip_noncritical_partitioning() const
Definition: mesh_base.h:1216
unsigned int add_elem_integer(std::string name, bool allocate_data=true, dof_id_type default_value=DofObject::invalid_id)
Register an integer datum (of type dof_id_type) to be added to each element in the mesh...
Definition: mesh_base.C:512
void add_elemset_code(dof_id_type code, MeshBase::elemset_type id_set)
Tabulate a user-defined "code" for elements which belong to the element sets specified in id_set...
Definition: mesh_base.C:350
bool has_elem_integer(std::string_view name) const
Definition: mesh_base.C:590
bool get_count_lower_dim_elems_in_point_locator() const
Get the current value of _count_lower_dim_elems_in_point_locator.
Definition: mesh_base.C:1612
void remove_ghosting_functor(GhostingFunctor &ghosting_functor)
Removes a functor which was previously added to the set of ghosting functors.
Definition: mesh_base.C:888
unsigned int n_elem_integers() const
Definition: mesh_base.h:934
This is the base class from which all geometric element types are derived.
Definition: elem.h:94
dof_id_type n_local_nodes() const
Definition: mesh_base.h:421
virtual std::unique_ptr< Partitioner > & partitioner()
A partitioner to use at each prepare_for_use()
Definition: mesh_base.h:154
constraint_rows_type _constraint_rows
Definition: mesh_base.h:2009
virtual void gather_to_zero()
Gathers all elements and nodes of the mesh onto processor zero.
Definition: mesh_base.h:240
void skip_noncritical_partitioning(bool skip)
If true is passed in then the elements on this mesh will no longer be (re)partitioned, and the nodes on this mesh will only be repartitioned if they are found "orphaned" via coarsening or other removal of the last element responsible for their node/element processor id consistency.
Definition: mesh_base.h:1213
void copy_constraint_rows(const MeshBase &other_mesh)
Copy the constraints from the other mesh to this mesh.
Definition: mesh_base.C:1938
std::vector< unsigned int > add_node_integers(const std::vector< std::string > &names, bool allocate_data=true, const std::vector< dof_id_type > *default_values=nullptr)
Register integer data (of type dof_id_type) to be added to each node in the mesh. ...
Definition: mesh_base.C:624
virtual Elem & elem_ref(const dof_id_type i)
Definition: mesh_base.h:628
const_element_iterator(const IterType &d, const IterType &e, const PredType &p)
Templated forwarding ctor – forwards to appropriate variant_filter_iterator ctor.
Definition: mesh_base.h:2128
bool _skip_noncritical_partitioning
If this is true then no partitioning should be done with the possible exception of orphaned nodes...
Definition: mesh_base.h:1856
std::vector< unsigned int > add_node_data(const std::vector< std::string > &name, bool allocate_data=true, const std::vector< T > *default_values=nullptr)
Register data (of type T) to be added to each node in the mesh.
Definition: mesh_base.h:2270
virtual void fix_broken_node_and_element_numbering()=0
There is no reason for a user to ever call this function.
unsigned char _spatial_dimension
The "spatial dimension" of the Mesh.
Definition: mesh_base.h:1932
virtual void own_node(Node &)
Takes ownership of node n on this partition of a distributed mesh, by setting n.processor_id() to thi...
Definition: mesh_base.h:719
std::unique_ptr< BoundaryInfo > boundary_info
This class holds the boundary information.
Definition: mesh_base.h:1760
virtual void set_next_unique_id(unique_id_type id)=0
Sets the next available unique id to be used.
bool _allow_remote_element_removal
If this is false then even on DistributedMesh remote elements will not be deleted during mesh prepara...
Definition: mesh_base.h:1881
The libMesh namespace provides an interface to certain functionality in the library.
std::map< MeshBase::elemset_type, dof_id_type > _elemset_codes_inverse_map
Definition: mesh_base.h:1925
virtual void all_first_order()=0
Converts a mesh with higher-order elements into a mesh with linear elements.
dof_id_type get_elemset_code(const MeshBase::elemset_type &id_set) const
Definition: mesh_base.C:391
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
Definition: mesh_base.h:159
dof_id_type n_unpartitioned_elem() const
Definition: mesh_base.h:533
std::vector< std::string > _node_integer_names
The array of names for integer data associated with each node in the mesh.
Definition: mesh_base.h:1950
virtual std::unique_ptr< MeshBase > clone() const =0
Virtual "copy constructor".
virtual Node & node_ref(const dof_id_type i)
Definition: mesh_base.h:584
virtual Node * add_point(const Point &p, const dof_id_type id=DofObject::invalid_id, const processor_id_type proc_id=DofObject::invalid_processor_id)=0
Add a new Node at Point p to the end of the vertex array, with processor_id procid.
dof_id_type n_local_elem() const
Definition: mesh_base.h:527
MeshBase::elemset_type _all_elemset_ids
Definition: mesh_base.h:1926
const std::string & get_elem_integer_name(unsigned int i) const
Definition: mesh_base.h:923
bool nodes_and_elements_equal(const MeshBase &other_mesh) const
Tests for equality of all elements and nodes in the mesh.
Definition: mesh_base.C:1906
virtual MeshBase & assign(MeshBase &&other_mesh)=0
Shim to allow operator = (&&) to behave like a virtual function without having to be one...
uint8_t processor_id_type
Definition: id_types.h:104
This is the MeshBase class.
Definition: mesh_base.h:74
The Partitioner class provides a uniform interface for partitioning algorithms.
Definition: partitioner.h:51
ElemMappingType default_mapping_type() const
Returns the default master space to physical space mapping basis functions to be used on newly added ...
Definition: mesh_base.h:791
subdomain_id_type get_id_by_name(std::string_view name) const
Definition: mesh_base.C:1639
void get_elemsets(dof_id_type elemset_code, MeshBase::elemset_type &id_set_to_fill) const
Look up the element sets for a given elemset code and vice-versa.
Definition: mesh_base.C:381
virtual bool is_serial_on_zero() const
Definition: mesh_base.h:212
void change_elemset_code(dof_id_type old_code, dof_id_type new_code)
Replace elemset code "old_code" with "new_code".
Definition: mesh_base.C:406
virtual void all_complete_order_range(const SimpleRange< element_iterator > &range)=0
Converts a set of elements in this (conforming, non-refined) mesh into "complete" order elements...
virtual void set_distributed()
Asserts that not all elements and nodes of the mesh necessarily exist on the current processor...
Definition: mesh_base.h:220
node_iterator(const IterType &d, const IterType &e, const PredType &p)
Templated forwarding ctor – forwards to appropriate variant_filter_iterator ctor.
Definition: mesh_base.h:2159
Generic sparse matrix.
Definition: vector_fe_ex5.C:45
This class handles the numbering of degrees of freedom on a mesh.
Definition: dof_map.h:169
std::set< GhostingFunctor * > _ghosting_functors
The list of all GhostingFunctor objects to be used when distributing a DistributedMesh.
Definition: mesh_base.h:1991
unique_id_type _next_unique_id
The next available unique id for assigning ids to DOF objects.
Definition: mesh_base.h:1849
unsigned int _n_parts
The number of partitions the mesh has.
Definition: mesh_base.h:1802
dof_id_type n_active_local_elem() const
Definition: mesh_base.h:544
unsigned int get_elem_integer_index(std::string_view name) const
Definition: mesh_base.C:578
void allow_remote_element_removal(bool allow)
If false is passed in then this mesh will no longer have remote elements deleted when being prepared ...
Definition: mesh_base.h:1189
processor_id_type n_processors() const
virtual bool is_serial() const
Definition: mesh_base.h:205
virtual void find_neighbors(const bool reset_remote_elements=false, const bool reset_current_list=true)=0
Locate element face (edge in 2D) neighbors.
unsigned char _default_mapping_data
The default mapping data (unused with Lagrange, used for nodal weight lookup index with rational base...
Definition: mesh_base.h:1815
int8_t boundary_id_type
Definition: id_types.h:51
virtual void delete_elem(Elem *e)=0
Removes element e from the mesh.
This is the MeshCommunication class.
const std::map< subdomain_id_type, std::string > & get_subdomain_name_map() const
Definition: mesh_base.h:1671
This class defines an abstract interface for Mesh input.
Definition: mesh_base.h:56
static const processor_id_type invalid_processor_id
An invalid processor_id to distinguish DoFs that have not been assigned to a processor.
Definition: dof_object.h:488
dof_id_type n_sub_elem() const
Definition: mesh_base.C:998
unsigned char default_mapping_data() const
Returns any default data value used by the master space to physical space mapping.
Definition: mesh_base.h:809
virtual Elem * add_elem(Elem *e)=0
Add elem e to the end of the element array.
ElemMappingType _default_mapping_type
The default mapping type (typically Lagrange) between master and physical space to assign to newly ad...
Definition: mesh_base.h:1808
virtual void update_parallel_id_counts()=0
Updates parallel caches so that methods like n_elem() accurately reflect changes on other processors...
void print_info(std::ostream &os=libMesh::out, const unsigned int verbosity=0, const bool global=true) const
Prints relevant information about the mesh.
Definition: mesh_base.C:1489
void cache_elem_data()
Definition: mesh_base.C:1662
std::unique_ptr< Partitioner > _partitioner
A partitioner to use at each prepare_for_use().
Definition: mesh_base.h:1843
virtual const Node * query_node_ptr(const dof_id_type i) const =0
void set_default_mapping_type(const ElemMappingType type)
Set the default master space to physical space mapping basis functions to be used on newly added elem...
Definition: mesh_base.h:800
virtual dof_id_type max_elem_id() const =0
void clear_point_locator()
Releases the current PointLocator object.
Definition: mesh_base.C:1598
variant_filter_iterator< MeshBase::Predicate, Elem *const, Elem *const &, Elem *const * > const_elem_filter_iter
Definition: mesh_base.h:2052
void subdomain_ids(std::set< subdomain_id_type > &ids, const bool global=true) const
Constructs a list of all subdomain identifiers in the local mesh if global == false, and in the global mesh if global == true (default).
Definition: mesh_base.C:899
bool allow_find_neighbors() const
Definition: mesh_base.h:1181
virtual Node * insert_node(Node *n)=0
This method is deprecated.
The BoundaryInfo class contains information relevant to boundary conditions including storing faces...
Definition: boundary_info.h:57
libmesh_assert(ctx)
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:477
bool _skip_find_neighbors
If this is true then we will skip find_neighbors in prepare_for_use.
Definition: mesh_base.h:1873
virtual void delete_node(Node *n)=0
Removes the Node n from the mesh.
std::pair< std::vector< unsigned int >, std::vector< unsigned int > > merge_extra_integer_names(const MeshBase &other)
Merge extra-integer arrays from an other mesh.
Definition: mesh_base.C:1861
unsigned int n_elemsets() const
Returns the number of unique elemset ids which have been added via add_elemset_code(), which is the size of the _all_elemset_ids set.
Definition: mesh_base.C:376
std::set< unsigned char > _elem_dims
We cache the dimension of the elements present in the mesh.
Definition: mesh_base.h:1895
unsigned int add_elem_datum(const std::string &name, bool allocate_data=true, const T *default_value=nullptr)
Register a datum (of type T) to be added to each element in the mesh.
Definition: mesh_base.h:2197
unsigned int get_node_integer_index(std::string_view name) const
Definition: mesh_base.C:667
std::string & subdomain_name(subdomain_id_type id)
Definition: mesh_base.C:1619
const std::set< unsigned char > & elem_dimensions() const
Definition: mesh_base.h:276
void allow_find_neighbors(bool allow)
If false is passed then this mesh will no longer work to find element neighbors when being prepared f...
Definition: mesh_base.h:1180
virtual void write(const std::string &name)=0
void set_mesh_dimension(unsigned char d)
Resets the logical dimension of the mesh.
Definition: mesh_base.h:269
dof_id_type n_nodes_on_proc(const processor_id_type proc) const
Definition: mesh_base.C:963
variant_filter_iterator< MeshBase::Predicate, const Node *const, const Node *const &, const Node *const * > const_node_filter_iter
Definition: mesh_base.h:2085
virtual dof_id_type parallel_n_nodes() const =0
bool allow_remote_element_removal() const
Definition: mesh_base.h:1190
void size_node_extra_integers()
Size extra-integer arrays of all nodes in the mesh.
Definition: mesh_base.C:1852
An object whose state is distributed along a set of processors.
void prepare_for_use()
Definition: mesh_base.C:742
virtual dof_id_type parallel_n_elem() const =0
virtual void clear()
Deletes all the element and node data that is currently stored.
Definition: mesh_base.C:862
variant_filter_iterator< MeshBase::Predicate, Node *const, Node *const &, Node *const * > const_node_filter_iter
Definition: mesh_base.h:2059
friend std::ostream & operator<<(std::ostream &os, const MeshBase &m)
Equivalent to calling print_info() above, but now you can write: Mesh mesh; libMesh::out << mesh << s...
Definition: mesh_base.C:1496
unsigned int add_node_datum(const std::string &name, bool allocate_data=true, const T *default_value=nullptr)
Register a datum (of type T) to be added to each node in the mesh.
Definition: mesh_base.h:2246
const DofMap &dof_map LIBMESH_COMMA unsigned int var_num
Definition: mesh_base.h:1621
const std::set< subdomain_id_type > & get_mesh_subdomains() const
Definition: mesh_base.h:1744
bool skip_partitioning() const
Definition: mesh_base.h:1233
std::map< GhostingFunctor *, std::shared_ptr< GhostingFunctor > > _shared_functors
Hang on to references to any GhostingFunctor objects we were passed in shared_ptr form...
Definition: mesh_base.h:1997
unsigned int n_partitions() const
Definition: mesh_base.h:1322
virtual Node * add_node(Node *n)=0
Add Node n to the end of the vertex array.
virtual void clear_elems()=0
Deletes all the element data that is currently stored.
virtual const Elem * elem_ptr(const dof_id_type i) const =0
The definition of the node_iterator struct.
Definition: mesh_base.h:2152
ElemMappingType
Enumeration of possible element master->physical mapping types.
const_node_iterator(const IterType &d, const IterType &e, const PredType &p)
Templated forwarding ctor – forwards to appropriate variant_filter_iterator ctor.
Definition: mesh_base.h:2179
virtual Elem * insert_elem(Elem *e)=0
Insert elem e to the element array, preserving its id and replacing/deleting any existing element wit...
std::vector< dof_id_type > _node_integer_default_values
The array of default initialization values for integer data associated with each node in the mesh...
Definition: mesh_base.h:1956
std::vector< unsigned int > add_elem_data(const std::vector< std::string > &names, bool allocate_data=true, const std::vector< T > *default_values=nullptr)
Register data (of type T) to be added to each element in the mesh.
Definition: mesh_base.h:2221
unsigned int recalculate_n_partitions()
In a few (very rare) cases, the user may have manually tagged the elements with specific processor ID...
Definition: mesh_base.C:1545
std::set< GhostingFunctor * >::const_iterator ghosting_functors_begin() const
Beginning of range of ghosting functors.
Definition: mesh_base.h:1268
std::set< elemset_id_type > elemset_type
Typedef for the "set" container used to store elemset ids.
Definition: mesh_base.h:297
std::vector< dof_id_type > _elem_integer_default_values
The array of default initialization values for integer data associated with each element in the mesh...
Definition: mesh_base.h:1944
subdomain_id_type n_subdomains() const
Definition: mesh_base.C:937
std::string get_info(const unsigned int verbosity=0, const bool global=true) const
Definition: mesh_base.C:1022
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual bool contract()=0
Delete subactive (i.e.
virtual const Elem * query_elem_ptr(const dof_id_type i) const =0
virtual SimpleRange< element_iterator > active_local_subdomain_elements_ptr_range(subdomain_id_type sid)=0
virtual void renumber_elem(dof_id_type old_id, dof_id_type new_id)=0
Changes the id of element old_id, both by changing elem(old_id)->id() and by moving elem(old_id) in t...
void post_dofobject_moves(MeshBase &&other_mesh)
Moves any superclass data (e.g.
Definition: mesh_base.C:1872
virtual void all_complete_order()
Calls the range-based version of this function with a range consisting of all elements in the mesh...
Definition: mesh_base.C:1540
unsigned int spatial_dimension() const
Definition: mesh_base.C:495
element_iterator(const IterType &d, const IterType &e, const PredType &p)
Definition: mesh_base.h:2108
std::map< const Node *, constraint_rows_mapped_type > constraint_rows_type
Definition: mesh_base.h:1675
OStreamProxy out
virtual bool is_replicated() const
Definition: mesh_base.h:227
bool _is_prepared
Flag indicating if the mesh has been prepared for use.
Definition: mesh_base.h:1820
virtual const Elem & elem_ref(const dof_id_type i) const
Definition: mesh_base.h:618
void set_count_lower_dim_elems_in_point_locator(bool count_lower_dim_elems)
In the point locator, do we count lower dimensional elements when we refine point locator regions...
Definition: mesh_base.C:1605
The definition of the const_node_iterator struct.
Definition: mesh_base.h:2172
MeshBase(const Parallel::Communicator &comm_in, unsigned char dim=1)
Constructor.
Definition: mesh_base.C:58
void all_second_order(const bool full_ordered=true)
Calls the range-based version of this function with a range consisting of all elements in the mesh...
Definition: mesh_base.C:1535
dof_id_type n_active_sub_elem() const
Same as n_sub_elem(), but only counts active elements.
Definition: mesh_base.C:1010
virtual ~MeshBase()
Destructor.
Definition: mesh_base.C:315
void set_elem_dimensions(std::set< unsigned char > elem_dims)
Most of the time you should not need to call this, as the element dimensions will be set automaticall...
Definition: mesh_base.C:333
unsigned int mesh_dimension() const
Definition: mesh_base.C:324
unsigned int level ElemType type std::set< subdomain_id_type > ss processor_id_type pid unsigned int level std::set< subdomain_id_type > virtual ss SimpleRange< element_iterator > active_subdomain_elements_ptr_range(subdomain_id_type sid)=0
std::unique_ptr< GhostingFunctor > _default_ghosting
The default geometric GhostingFunctor, used to implement standard libMesh element ghosting behavior...
Definition: mesh_base.h:1982
void change_elemset_id(elemset_id_type old_id, elemset_id_type new_id)
Replace elemset id "old_id" with "new_id".
Definition: mesh_base.C:454
unsigned int add_node_integer(std::string name, bool allocate_data=true, dof_id_type default_value=DofObject::invalid_id)
Register an integer datum (of type dof_id_type) to be added to each node in the mesh.
Definition: mesh_base.C:601
variant_filter_iterator< MeshBase::Predicate, Elem *const, Elem *const &, Elem *const *, const Elem *const, const Elem *const &, const Elem *const * > elem_filter_iter
Definition: mesh_base.h:2067
virtual SimpleRange< element_iterator > active_subdomain_set_elements_ptr_range(std::set< subdomain_id_type > ss)=0
unique_id_type next_unique_id()
Definition: mesh_base.h:440
void set_default_mapping_data(const unsigned char data)
Set the default master space to physical space mapping basis functions to be used on newly added elem...
Definition: mesh_base.h:818
const std::string & get_node_integer_name(unsigned int i) const
Definition: mesh_base.h:1045
virtual void libmesh_assert_valid_parallel_ids() const
Verify id and processor_id consistency of our elements and nodes containers.
Definition: mesh_base.h:1493
virtual const Node & node_ref(const dof_id_type i) const
Definition: mesh_base.h:575
virtual const Point & point(const dof_id_type i) const =0
bool _skip_all_partitioning
If this is true then no partitioning should be done.
Definition: mesh_base.h:1861
const_node_iterator(const MeshBase::node_iterator &rhs)
The conversion-to-const ctor.
Definition: mesh_base.h:2190
bool allow_renumbering() const
Definition: mesh_base.h:1174
const constraint_rows_type & get_constraint_rows() const
Definition: mesh_base.h:1686
void cache_elem_dims()
Definition: mesh_base.C:1655
virtual void delete_remote_elements()
When supported, deletes all nonlocal elements of the mesh except for "ghosts" which touch a local ele...
Definition: mesh_base.h:247
const_element_iterator(const MeshBase::element_iterator &rhs)
The conversion-to-const ctor.
Definition: mesh_base.h:2139
virtual void update_post_partitioning()
Recalculate any cached data after elements and nodes have been repartitioned.
Definition: mesh_base.h:1154
virtual dof_id_type max_node_id() const =0
void reinit_ghosting_functors()
Loops over ghosting functors and calls mesh_reinit()
Definition: mesh_base.C:853
virtual dof_id_type n_elem() const =0
virtual const Node * node_ptr(const dof_id_type i) const =0
processor_id_type processor_id() const
std::unique_ptr< PointLocatorBase > _point_locator
A PointLocator class for this mesh.
Definition: mesh_base.h:1829
const DofMap &dof_map LIBMESH_COMMA unsigned int std::string & set_subdomain_name_map()
Definition: mesh_base.h:1669
virtual void redistribute()
Redistribute elements between processors.
Definition: mesh_base.C:925
Real _point_locator_close_to_point_tol
If nonzero, we will call PointLocatorBase::set_close_to_point_tol() on any PointLocators that we crea...
Definition: mesh_base.h:2015
bool _count_lower_dim_elems_in_point_locator
Do we count lower dimensional elements in point locator refinement? This is relevant in tree-based po...
Definition: mesh_base.h:1835
GhostingFunctor & default_ghosting()
Default ghosting functor.
Definition: mesh_base.h:1280
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:39
virtual void reserve_elem(const dof_id_type ne)=0
Reserves space for a known number of elements.
uint8_t unique_id_type
Definition: id_types.h:86
bool locally_equals(const MeshBase &other_mesh) const
This behaves the same as operator==, but only for the local and ghosted aspects of the mesh; i...
Definition: mesh_base.C:222
std::map< subdomain_id_type, std::string > _block_id_to_name
This structure maintains the mapping of named blocks for file formats that support named blocks...
Definition: mesh_base.h:1888
unsigned int & set_n_partitions()
Definition: mesh_base.h:1789
void ErrorVector unsigned int
Definition: adjoints_ex3.C:360
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:111
virtual void renumber_nodes_and_elements()=0
After partitioning a mesh it is useful to renumber the nodes and elements so that they lie in contigu...
virtual dof_id_type n_nodes() const =0
variant_filter_iterator< MeshBase::Predicate, Node *const, Node *const &, Node *const *, const Node *const, const Node *const &, const Node *const * > node_filter_iter
Definition: mesh_base.h:2080
void size_elem_extra_integers()
Size extra-integer arrays of all elements in the mesh.
Definition: mesh_base.C:1843
std::set< GhostingFunctor * >::const_iterator ghosting_functors_end() const
End of range of ghosting functors.
Definition: mesh_base.h:1274
void add_ghosting_functor(GhostingFunctor &ghosting_functor)
Adds a functor which can specify ghosting requirements for use on distributed meshes.
Definition: mesh_base.h:1244
uint8_t dof_id_type
Definition: id_types.h:67
MeshBase & operator=(const MeshBase &)=delete
Copy and move assignment are not allowed because MeshBase subclasses manually manage memory (Elems an...
void set_point_locator_close_to_point_tol(Real val)
Set value used by PointLocatorBase::close_to_point_tol().
Definition: mesh_base.C:1822