Processing math: 0%
libMesh
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Pages
Public Types | Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Types | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Static Protected Attributes | List of all members
libMesh::Hex20 Class Referencefinal


The Hex20 is an element in 3D composed of 20 nodes. More...

#include <cell_hex20.h>

Inheritance diagram for libMesh::Hex20:
[legend]

Public Types

enum  RefinementState {
  COARSEN = 0, DO_NOTHING, REFINE, JUST_REFINED,
  JUST_COARSENED, INACTIVE, COARSEN_INACTIVE, INVALID_REFINEMENTSTATE
}
 Enumeration of possible element refinement states. More...
 
typedef Elem *const * NeighborPtrIter
 Nested "classes" for use iterating over all neighbors of an element. More...
 
typedef const Elem *const * ConstNeighborPtrIter
 
typedef Predicates::multi_predicate Predicate
 Useful iterator typedefs. More...
 

Public Member Functions

 Hex20 (Elem *p=nullptr)
 Constructor. More...
 
 Hex20 (Hex20 &&)=delete
 
 Hex20 (const Hex20 &)=delete
 
Hex20operator= (const Hex20 &)=delete
 
Hex20operator= (Hex20 &&)=delete
 
virtual ~Hex20 ()=default
 
virtual ElemType type () const override
 
virtual unsigned int n_nodes () const override
 
virtual unsigned int n_sub_elem () const override
 
virtual bool is_vertex (const unsigned int i) const override
 
virtual bool is_edge (const unsigned int i) const override
 
virtual bool is_face (const unsigned int i) const override
 
virtual bool is_node_on_side (const unsigned int n, const unsigned int s) const override
 
virtual std::vector< unsigned intnodes_on_side (const unsigned int s) const override
 
virtual std::vector< unsigned intnodes_on_edge (const unsigned int e) const override
 
virtual bool is_node_on_edge (const unsigned int n, const unsigned int e) const override
 
virtual bool has_affine_map () const override
 
virtual Order default_order () const override
 
virtual unsigned int local_side_node (unsigned int side, unsigned int side_node) const override
 
virtual unsigned int local_edge_node (unsigned int edge, unsigned int edge_node) const override
 
virtual std::unique_ptr< Elembuild_side_ptr (const unsigned int i, bool proxy=false) override
 Builds a QUAD8 built coincident with face i. More...
 
virtual void build_side_ptr (std::unique_ptr< Elem > &elem, const unsigned int i) override
 Rebuilds a QUAD8 built coincident with face i. More...
 
virtual std::unique_ptr< Elembuild_edge_ptr (const unsigned int i) override
 Builds a EDGE3 built coincident with edge i. More...
 
virtual void build_edge_ptr (std::unique_ptr< Elem > &edge, const unsigned int i) override
 Rebuilds a EDGE3 built coincident with edge i. More...
 
virtual void connectivity (const unsigned int sc, const IOPackage iop, std::vector< dof_id_type > &conn) const override
 
virtual unsigned int n_second_order_adjacent_vertices (const unsigned int) const override
 
virtual unsigned short int second_order_adjacent_vertex (const unsigned int n, const unsigned int v) const override
 
virtual std::pair< unsigned short int, unsigned short intsecond_order_child_vertex (const unsigned int n) const override
 
virtual Real volume () const override
 A specialization for computing the volume of a Hex20. More...
 
virtual void permute (unsigned int perm_num) override final
 Permutes the element (by swapping node and neighbor pointers) according to the specified index. More...
 
virtual void flip (BoundaryInfo *) override final
 Flips the element (by swapping node and neighbor pointers) to have a mapping Jacobian of opposite sign. More...
 
ElemType side_type (const unsigned int s) const override final
 
virtual Point master_point (const unsigned int i) const override final
 
virtual unsigned int n_sides () const override final
 
virtual unsigned int n_vertices () const override final
 
virtual unsigned int n_edges () const override final
 
virtual unsigned int n_faces () const override final
 
virtual unsigned int n_children () const override final
 
virtual bool is_child_on_side (const unsigned int c, const unsigned int s) const override final
 
virtual bool is_edge_on_side (const unsigned int e, const unsigned int s) const override final
 
virtual unsigned int opposite_side (const unsigned int s) const override final
 
virtual unsigned int opposite_node (const unsigned int n, const unsigned int s) const override final
 
virtual dof_id_type key (const unsigned int s) const override
 
virtual dof_id_type key (const unsigned int s) const=0
 Don't hide Elem::key() defined in the base class. More...
 
virtual dof_id_type key () const
 Don't hide Elem::key() defined in the base class. More...
 
virtual dof_id_type key () const
 
virtual dof_id_type low_order_key (const unsigned int s) const override
 
virtual std::unique_ptr< Elemside_ptr (const unsigned int i) override final
 
virtual void side_ptr (std::unique_ptr< Elem > &side, const unsigned int i) override final
 Rebuilds a primitive (4-noded) quad for face i. More...
 
std::unique_ptr< const Elemside_ptr (unsigned int i) const
 
void side_ptr (std::unique_ptr< const Elem > &side, const unsigned int i) const
 
virtual Real quality (const ElemQuality q) const override
 
virtual std::pair< Real, Realqual_bounds (const ElemQuality q) const override
 
virtual std::vector< unsigned intsides_on_edge (const unsigned int e) const override final
 
virtual unsigned int n_permutations () const override final
 Six sides, four orientations per side. More...
 
virtual bool is_flipped () const override final
 
virtual std::vector< unsigned intedges_adjacent_to_node (const unsigned int n) const override
 
virtual bool on_reference_element (const Point &p, const Real eps=TOLERANCE) const override final
 
virtual unsigned short dim () const override
 
virtual BoundingBox loose_bounding_box () const override
 
virtual bool infinite () const override
 
const Pointpoint (const unsigned int i) const
 
Pointpoint (const unsigned int i)
 
dof_id_type node_id (const unsigned int i) const
 
unsigned int local_node (const dof_id_type i) const
 
unsigned int get_node_index (const Node *node_ptr) const
 
const Node *const * get_nodes () const
 
const Nodenode_ptr (const unsigned int i) const
 
Nodenode_ptr (const unsigned int i)
 
const Nodenode_ref (const unsigned int i) const
 
Nodenode_ref (const unsigned int i)
 
virtual Node *& set_node (const unsigned int i)
 
SimpleRange< NodeRefIternode_ref_range ()
 Returns a range with all nodes of an element, usable in range-based for loops. More...
 
SimpleRange< ConstNodeRefIternode_ref_range () const
 
subdomain_id_type subdomain_id () const
 
subdomain_id_typesubdomain_id ()
 
virtual bool runtime_topology () const
 
const Elemreference_elem () const
 
bool operator== (const Elem &rhs) const
 
bool topologically_equal (const Elem &rhs) const
 
const Elemneighbor_ptr (unsigned int i) const
 
Elemneighbor_ptr (unsigned int i)
 
SimpleRange< NeighborPtrIterneighbor_ptr_range ()
 Returns a range with all neighbors of an element, usable in range-based for loops. More...
 
SimpleRange< ConstNeighborPtrIterneighbor_ptr_range () const
 
const Elemtopological_neighbor (const unsigned int i, const MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb) const
 
Elemtopological_neighbor (const unsigned int i, MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb)
 
bool has_topological_neighbor (const Elem *elem, const MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb) const
 
void set_neighbor (const unsigned int i, Elem *n)
 Assigns n as the i^{th} neighbor. More...
 
bool has_neighbor (const Elem *elem) const
 
Elemchild_neighbor (Elem *elem)
 
const Elemchild_neighbor (const Elem *elem) const
 
bool on_boundary () const
 
bool is_semilocal (const processor_id_type my_pid) const
 
unsigned int which_neighbor_am_i (const Elem *e) const
 This function tells you which neighbor e is. More...
 
unsigned int which_side_am_i (const Elem *e) const
 This function tells you which side the boundary element e is. More...
 
unsigned int which_node_am_i (unsigned int side, unsigned int side_node) const
 This function is deprecated, call local_side_node(side, side_node) instead. More...
 
bool contains_vertex_of (const Elem *e, bool mesh_connection=false) const
 
bool contains_edge_of (const Elem *e) const
 
void find_point_neighbors (const Point &p, std::set< const Elem *> &neighbor_set) const
 This function finds all active elements (including this one) which are in the same manifold as this element and which touch the current active element at the specified point, which should be a point in the current element. More...
 
void find_point_neighbors (std::set< const Elem *> &neighbor_set) const
 This function finds all active elements (including this one) in the same manifold as this element which touch this active element at any point. More...
 
void find_point_neighbors (std::set< const Elem *> &neighbor_set, const Elem *start_elem) const
 This function finds all active elements (including this one) in the same manifold as start_elem (which must be active and must touch this element) which touch this element at any point. More...
 
void find_point_neighbors (std::set< Elem *> &neighbor_set, Elem *start_elem)
 Non-const version of function above. More...
 
void find_edge_neighbors (const Point &p1, const Point &p2, std::set< const Elem *> &neighbor_set) const
 This function finds all active elements in the same manifold as this element which touch the current active element along the whole edge defined by the two points p1 and p2. More...
 
void find_edge_neighbors (std::set< const Elem *> &neighbor_set) const
 This function finds all active elements in the same manifold as this element which touch the current active element along any edge (more precisely, at at least two points). More...
 
void find_interior_neighbors (std::set< const Elem *> &neighbor_set) const
 This function finds all active elements (not including this one) in the parent manifold of this element whose intersection with this element has non-zero measure. More...
 
void find_interior_neighbors (std::set< Elem *> &neighbor_set)
 Non-const version of function above that fills up a vector of non-const Elem pointers instead. More...
 
void remove_links_to_me ()
 Resets this element's neighbors' appropriate neighbor pointers and its parent's and children's appropriate pointers to point to null instead of to this. More...
 
void make_links_to_me_remote ()
 Resets this element's neighbors' appropriate neighbor pointers and its parent's and children's appropriate pointers to point to the global remote_elem instead of this. More...
 
void make_links_to_me_local (unsigned int n, unsigned int neighbor_side)
 Resets the neighbor_side pointers of our nth neighbor (and its descendants, if appropriate) to point to this Elem instead of to the global remote_elem. More...
 
virtual bool is_remote () const
 
void write_connectivity (std::ostream &out, const IOPackage iop) const
 Writes the element connectivity for various IO packages to the passed ostream "out". More...
 
IntRange< unsigned short > node_index_range () const
 
virtual unsigned int n_nodes_in_child (unsigned int) const
 
IntRange< unsigned short > side_index_range () const
 
unsigned int n_neighbors () const
 
IntRange< unsigned short > edge_index_range () const
 
virtual bool is_vertex_on_child (unsigned int, unsigned int n) const
 
virtual bool is_vertex_on_parent (unsigned int c, unsigned int n) const
 
bool is_internal (const unsigned int i) const
 
std::unique_ptr< const Elembuild_side_ptr (const unsigned int i, bool proxy=false) const
 
void build_side_ptr (std::unique_ptr< const Elem > &side, const unsigned int i) const
 
std::unique_ptr< const Elembuild_edge_ptr (const unsigned int i) const
 
void build_edge_ptr (std::unique_ptr< const Elem > &edge, const unsigned int i) const
 
virtual Order supported_nodal_order () const
 
virtual Order default_side_order () const
 
virtual Point centroid () const
 Calls Elem::vertex_average() for backwards compatibility. More...
 
virtual Point true_centroid () const
 
Point vertex_average () const
 
virtual Point quasicircumcenter () const
 
virtual Real hmin () const
 
virtual Real hmax () const
 
virtual bool contains_point (const Point &p, Real tol=TOLERANCE) const
 
virtual bool close_to_point (const Point &p, Real tol) const
 
bool positive_edge_orientation (const unsigned int i) const
 
bool positive_face_orientation (const unsigned int i) const
 
virtual bool has_invertible_map (Real tol=TOLERANCE *TOLERANCE) const
 
virtual bool is_linear () const
 
void print_info (std::ostream &os=libMesh::out) const
 Prints relevant information about the element. More...
 
std::string get_info () const
 Prints relevant information about the element to a string. More...
 
bool active () const
 
bool ancestor () const
 
bool subactive () const
 
bool has_children () const
 
bool has_ancestor_children () const
 
bool is_ancestor_of (const Elem *descendant) const
 
const Elemparent () const
 
Elemparent ()
 
void set_parent (Elem *p)
 Sets the pointer to the element's parent. More...
 
const Elemtop_parent () const
 
const Eleminterior_parent () const
 
Eleminterior_parent ()
 
void set_interior_parent (Elem *p)
 Sets the pointer to the element's interior_parent. More...
 
Real length (const unsigned int n1, const unsigned int n2) const
 
unsigned int level () const
 
unsigned int p_level () const
 
ElemMappingType mapping_type () const
 
void set_mapping_type (const ElemMappingType type)
 Sets the value of the mapping type for the element. More...
 
unsigned char mapping_data () const
 
void set_mapping_data (const unsigned char data)
 Sets the value of the mapping data for the element. More...
 
const Elemraw_child_ptr (unsigned int i) const
 
const Elemchild_ptr (unsigned int i) const
 
Elemchild_ptr (unsigned int i)
 
SimpleRange< ChildRefIterchild_ref_range ()
 Returns a range with all children of a parent element, usable in range-based for loops. More...
 
SimpleRange< ConstChildRefIterchild_ref_range () const
 
unsigned int which_child_am_i (const Elem *e) const
 
virtual bool is_child_on_edge (const unsigned int c, const unsigned int e) const
 
void add_child (Elem *elem)
 Adds a child pointer to the array of children of this element. More...
 
void add_child (Elem *elem, unsigned int c)
 Adds a new child pointer to the specified index in the array of children of this element. More...
 
void replace_child (Elem *elem, unsigned int c)
 Replaces the child pointer at the specified index in the child array. More...
 
void family_tree (std::vector< const Elem *> &family, bool reset=true) const
 Fills the vector family with the children of this element, recursively. More...
 
void family_tree (std::vector< Elem *> &family, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
void total_family_tree (std::vector< const Elem *> &family, bool reset=true) const
 Same as the family_tree() member, but also adds any subactive descendants. More...
 
void total_family_tree (std::vector< Elem *> &family, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
void active_family_tree (std::vector< const Elem *> &active_family, bool reset=true) const
 Same as the family_tree() member, but only adds the active children. More...
 
void active_family_tree (std::vector< Elem *> &active_family, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
void family_tree_by_side (std::vector< const Elem *> &family, unsigned int side, bool reset=true) const
 Same as the family_tree() member, but only adds elements which are next to side. More...
 
void family_tree_by_side (std::vector< Elem *> &family, unsigned int side, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
void active_family_tree_by_side (std::vector< const Elem *> &family, unsigned int side, bool reset=true) const
 Same as the active_family_tree() member, but only adds elements which are next to side. More...
 
void active_family_tree_by_side (std::vector< Elem *> &family, unsigned int side, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
void family_tree_by_neighbor (std::vector< const Elem *> &family, const Elem *neighbor, bool reset=true) const
 Same as the family_tree() member, but only adds elements which are next to neighbor. More...
 
void family_tree_by_neighbor (std::vector< Elem *> &family, Elem *neighbor, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
void total_family_tree_by_neighbor (std::vector< const Elem *> &family, const Elem *neighbor, bool reset=true) const
 Same as the family_tree_by_neighbor() member, but also adds any subactive descendants. More...
 
void total_family_tree_by_neighbor (std::vector< Elem *> &family, Elem *neighbor, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
void family_tree_by_subneighbor (std::vector< const Elem *> &family, const Elem *neighbor, const Elem *subneighbor, bool reset=true) const
 Same as the family_tree() member, but only adds elements which are next to subneighbor. More...
 
void family_tree_by_subneighbor (std::vector< Elem *> &family, Elem *neighbor, Elem *subneighbor, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
void total_family_tree_by_subneighbor (std::vector< const Elem *> &family, const Elem *neighbor, const Elem *subneighbor, bool reset=true) const
 Same as the family_tree_by_subneighbor() member, but also adds any subactive descendants. More...
 
void total_family_tree_by_subneighbor (std::vector< Elem *> &family, Elem *neighbor, Elem *subneighbor, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
void active_family_tree_by_neighbor (std::vector< const Elem *> &family, const Elem *neighbor, bool reset=true) const
 Same as the active_family_tree() member, but only adds elements which are next to neighbor. More...
 
void active_family_tree_by_neighbor (std::vector< Elem *> &family, Elem *neighbor, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
void active_family_tree_by_topological_neighbor (std::vector< const Elem *> &family, const Elem *neighbor, const MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb, bool reset=true) const
 Same as the active_family_tree_by_neighbor() member, but the neighbor here may be a topological (e.g. More...
 
void active_family_tree_by_topological_neighbor (std::vector< Elem *> &family, Elem *neighbor, const MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb, bool reset=true)
 Non-const version of function above; fills a vector of non-const pointers. More...
 
RefinementState refinement_flag () const
 
void set_refinement_flag (const RefinementState rflag)
 Sets the value of the refinement flag for the element. More...
 
RefinementState p_refinement_flag () const
 
void set_p_refinement_flag (const RefinementState pflag)
 Sets the value of the p-refinement flag for the element. More...
 
unsigned int max_descendant_p_level () const
 
unsigned int min_p_level_by_neighbor (const Elem *neighbor, unsigned int current_min) const
 
unsigned int min_new_p_level_by_neighbor (const Elem *neighbor, unsigned int current_min) const
 
void set_p_level (const unsigned int p)
 Sets the value of the p-refinement level for the element. More...
 
void hack_p_level (const unsigned int p)
 Sets the value of the p-refinement level for the element without altering the p-level of its ancestors. More...
 
void hack_p_level_and_refinement_flag (const unsigned int p, RefinementState pflag)
 Sets the value of the p-refinement level for the element without altering the p-level of its ancestors; also sets the p_refinement_flag, simultaneously so that they can be safely checked for mutual consistency. More...
 
virtual void refine (MeshRefinement &mesh_refinement)
 Refine the element. More...
 
void coarsen ()
 Coarsen the element. More...
 
void contract ()
 Contract an active element, i.e. More...
 
void libmesh_assert_valid_neighbors () const
 Checks for consistent neighbor links on this element. More...
 
void libmesh_assert_valid_node_pointers () const
 Checks for a valid id and pointers to nodes with valid ids on this element. More...
 
virtual unsigned int local_singular_node (const Point &, const Real=TOLERANCE *TOLERANCE) const
 
virtual bool is_singular_node (unsigned int) const
 
virtual unsigned int center_node_on_side (const unsigned short side) const
 
side_iterator boundary_sides_begin ()
 Iterator accessor functions. More...
 
side_iterator boundary_sides_end ()
 
virtual bool is_mid_infinite_edge_node (const unsigned int) const
 
virtual Point origin () const
 
virtual std::unique_ptr< Elemdisconnected_clone () const
 
void orient (BoundaryInfo *boundary_info)
 Flips the element (by swapping node and neighbor pointers) to have a mapping Jacobian of opposite sign, iff we find a negative orientation. More...
 
virtual unsigned int as_parent_node (unsigned int c, unsigned int n) const
 
virtual const std::vector< std::pair< unsigned char, unsigned char > > & parent_bracketing_nodes (unsigned int c, unsigned int n) const
 
virtual const std::vector< std::pair< dof_id_type, dof_id_type > > bracketing_nodes (unsigned int c, unsigned int n) const
 
virtual unsigned int embedding_matrix_version () const
 
void nullify_neighbors ()
 Replaces this element with nullptr for all of its neighbors. More...
 
DofObjectget_old_dof_object ()
 Pointer accessor for previously public old_dof_object. More...
 
const DofObjectget_old_dof_object () const
 
DofObjectget_old_dof_object_ref ()
 As above, but do not use in situations where the old_dof_object may be nullptr, since this function asserts that the old_dof_object is valid before returning a reference to it. More...
 
const DofObjectget_old_dof_object_ref () const
 
void clear_old_dof_object ()
 Sets the old_dof_object to nullptr. More...
 
void set_old_dof_object ()
 Sets the old_dof_object to a copy of this. More...
 
void clear_dofs ()
 Clear the DofMap data structures holding degree of freedom data. More...
 
void invalidate_dofs (const unsigned int sys_num=libMesh::invalid_uint)
 Sets all degree of freedom numbers to invalid_id. More...
 
void invalidate_id ()
 Sets the id to invalid_id. More...
 
void invalidate_processor_id ()
 Sets the processor id to invalid_processor_id. More...
 
void invalidate ()
 Invalidates all the indices for this DofObject. More...
 
unsigned int n_dofs (const unsigned int s, const unsigned int var=libMesh::invalid_uint) const
 
dof_id_type id () const
 
dof_id_typeset_id ()
 
void set_id (const dof_id_type dofid)
 Sets the id for this DofObject. More...
 
unique_id_type unique_id () const
 
unique_id_typeset_unique_id ()
 
void set_unique_id (unique_id_type new_id)
 Sets the unique_id for this DofObject. More...
 
bool valid_id () const
 
bool valid_unique_id () const
 
processor_id_type processor_id () const
 
processor_id_typeprocessor_id ()
 
void processor_id (const processor_id_type pid)
 Sets the processor_id for this DofObject. More...
 
bool valid_processor_id () const
 
unsigned int n_systems () const
 
unsigned int n_pseudo_systems () const
 
void set_n_systems (const unsigned int s)
 Sets the number of systems for this DofObject. More...
 
void set_extra_integer (const unsigned int index, const dof_id_type value)
 Sets the value on this object of the extra integer associated with index, which should have been obtained via a call to MeshBase::add_elem_integer or MeshBase::add_node_integer. More...
 
dof_id_type get_extra_integer (const unsigned int index) const
 Gets the value on this object of the extra integer associated with index, which should have been obtained via a call to MeshBase::add_elem_integer or MeshBase::add_node_integer. More...
 
template<typename T >
void set_extra_datum (const unsigned int index, const T value)
 Sets the value on this object of the extra datum associated with index, which should have been obtained via a call to MeshBase::add_elem_datum or MeshBase::add_node_datum using the same type T. More...
 
template<typename T >
get_extra_datum (const unsigned int index) const
 Gets the value on this object of the extra datum associated with index, which should have been obtained via a call to MeshBase::add_elem_datum or MeshBase::add_node_datum using the same type T. More...
 
void add_system ()
 Adds an additional system to the DofObject. More...
 
unsigned int n_var_groups (const unsigned int s) const
 
unsigned int n_vars (const unsigned int s, const unsigned int vg) const
 
unsigned int n_vars (const unsigned int s) const
 
void set_n_vars_per_group (const unsigned int s, const std::vector< unsigned int > &nvpg)
 Sets number of variables in each group associated with system s for this DofObject. More...
 
unsigned int n_comp (const unsigned int s, const unsigned int var) const
 
unsigned int n_comp_group (const unsigned int s, const unsigned int vg) const
 
void set_n_comp (const unsigned int s, const unsigned int var, const unsigned int ncomp)
 Sets the number of components for Variable var of system s associated with this DofObject. More...
 
void set_n_comp_group (const unsigned int s, const unsigned int vg, const unsigned int ncomp)
 Sets the number of components for VariableGroup vg of system s associated with this DofObject. More...
 
dof_id_type dof_number (const unsigned int s, const unsigned int var, const unsigned int comp) const
 
dof_id_type dof_number (const unsigned int s, const unsigned int vg, const unsigned int vig, const unsigned int comp, const unsigned int n_comp) const
 
std::pair< unsigned int, unsigned intvar_to_vg_and_offset (const unsigned int s, const unsigned int var) const
 
void set_dof_number (const unsigned int s, const unsigned int var, const unsigned int comp, const dof_id_type dn)
 Sets the global degree of freedom number for variable var, component comp for system s associated with this DofObject. More...
 
bool has_dofs (const unsigned int s=libMesh::invalid_uint) const
 
void set_vg_dof_base (const unsigned int s, const unsigned int vg, const dof_id_type db)
 VariableGroup DoF indices are indexed as id = base + var_in_vg*ncomp + comp This method allows for direct access to the base. More...
 
dof_id_type vg_dof_base (const unsigned int s, const unsigned int vg) const
 VariableGroup DoF indices are indexed as id = base + var_in_vg*ncomp + comp This method allows for direct access to the base. More...
 
void add_extra_integers (const unsigned int n_integers)
 Assigns a set of extra integers to this DofObject. More...
 
void add_extra_integers (const unsigned int n_integers, const std::vector< dof_id_type > &default_values)
 Assigns a set of extra integers to this DofObject. More...
 
unsigned int n_extra_integers () const
 Returns how many extra integers are associated to the DofObject. More...
 
bool has_extra_integers () const
 Returns whether extra integers are associated to the DofObject. More...
 
unsigned int packed_indexing_size () const
 If we pack our indices into an buffer for communications, how many ints do we need? More...
 
void unpack_indexing (std::vector< largest_id_type >::const_iterator begin)
 A method for creating our index buffer from packed data - basically with our current implementation we investigate the size term and then copy. More...
 
void pack_indexing (std::back_insert_iterator< std::vector< largest_id_type >> target) const
 A method for creating packed data from our index buffer - basically a copy with prepended size with our current implementation. More...
 
void debug_buffer () const
 Print our buffer for debugging. More...
 
void print_dof_info () const
 Print out info for debugging. More...
 
void set_buffer (const std::vector< dof_id_type > &buf)
 

Static Public Member Functions

static constexpr bool infinite ()
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static std::string get_info ()
 Gets a string containing the reference information. More...
 
static std::string get_info ()
 Gets a string containing the reference information. More...
 
static ElemType second_order_equivalent_type (const ElemType et, const bool full_ordered=true)
 
static ElemType first_order_equivalent_type (const ElemType et)
 
static ElemType complete_order_equivalent_type (const ElemType et)
 
static std::unique_ptr< Elembuild (const ElemType type, Elem *p=nullptr)
 
static std::unique_ptr< Elembuild_with_id (const ElemType type, dof_id_type id)
 Calls the build() method above with a nullptr parent, and additionally sets the newly-created Elem's id. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info() More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info() More...
 
static void disable_print_counter_info ()
 
static void disable_print_counter_info ()
 
static unsigned int unpackable_indexing_size (std::vector< largest_id_type >::const_iterator begin)
 If we have indices packed into an buffer for communications, how much of that buffer applies to this dof object? More...
 

Static Public Attributes

static const int num_nodes = 20
 Geometric constants for Hex20. More...
 
static const int nodes_per_side = 8
 
static const int nodes_per_edge = 3
 
static const unsigned int side_nodes_map [num_sides][nodes_per_side]
 This maps the j^{th} node of the i^{th} side to element node numbers. More...
 
static const unsigned int edge_nodes_map [num_edges][nodes_per_edge]
 This maps the j^{th} node of the i^{th} edge to element node numbers. More...
 
static const int num_sides = 6
 Geometric constants for all Hexes. More...
 
static const int num_edges = 12
 
static const int num_children = 8
 
static const unsigned int edge_sides_map [12][2]
 This maps each edge to the sides that contain said edge. More...
 
static const subdomain_id_type invalid_subdomain_id = std::numeric_limits<subdomain_id_type>::max()
 A static integral constant representing an invalid subdomain id. More...
 
static const unsigned int type_to_n_nodes_map [INVALID_ELEM]
 This array maps the integer representation of the ElemType enum to the number of nodes in the element. More...
 
static const unsigned int max_n_nodes = 27
 The maximum number of nodes any element can contain. More...
 
static const unsigned int type_to_n_sides_map [INVALID_ELEM]
 This array maps the integer representation of the ElemType enum to the number of sides on the element. More...
 
static const unsigned int type_to_n_edges_map [INVALID_ELEM]
 This array maps the integer representation of the ElemType enum to the number of edges on the element. More...
 
static const dof_id_type invalid_id = static_cast<dof_id_type>(-1)
 An invalid id to distinguish an uninitialized DofObject. More...
 
static const unique_id_type invalid_unique_id = static_cast<unique_id_type>(-1)
 An invalid unique_id to distinguish an uninitialized DofObject. More...
 
static const processor_id_type invalid_processor_id = static_cast<processor_id_type>(-1)
 An invalid processor_id to distinguish DoFs that have not been assigned to a processor. More...
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information. More...
 
typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information. More...
 

Protected Member Functions

virtual Real embedding_matrix (const unsigned int i, const unsigned int j, const unsigned int k) const override
 Matrix used to create the elements children. More...
 
void swap2nodes (unsigned int n1, unsigned int n2)
 Swaps two node_ptrs. More...
 
void swap2neighbors (unsigned int n1, unsigned int n2)
 Swaps two neighbor_ptrs. More...
 
void swap2boundarysides (unsigned short s1, unsigned short s2, BoundaryInfo *boundary_info) const
 Swaps two sides in boundary_info, if it is non-null. More...
 
void swap2boundaryedges (unsigned short e1, unsigned short e2, BoundaryInfo *boundary_info) const
 Swaps two edges in boundary_info, if it is non-null. More...
 
void swap3nodes (unsigned int n1, unsigned int n2, unsigned int n3)
 Swaps three node_ptrs, "rotating" them. More...
 
void swap3neighbors (unsigned int n1, unsigned int n2, unsigned int n3)
 Swaps three neighbor_ptrs, "rotating" them. More...
 
void swap4nodes (unsigned int n1, unsigned int n2, unsigned int n3, unsigned int n4)
 Swaps four node_ptrs, "rotating" them. More...
 
void swap4neighbors (unsigned int n1, unsigned int n2, unsigned int n3, unsigned int n4)
 Swaps four neighbor_ptrs, "rotating" them. More...
 
template<typename Sideclass , typename Subclass >
std::unique_ptr< Elemsimple_build_side_ptr (const unsigned int i, bool proxy)
 An implementation for simple (all sides equal) elements. More...
 
template<typename Subclass >
void simple_build_side_ptr (std::unique_ptr< Elem > &side, const unsigned int i, ElemType sidetype)
 An implementation for simple (all sides equal) elements. More...
 
template<typename Subclass , typename Mapclass >
void simple_side_ptr (std::unique_ptr< Elem > &side, const unsigned int i, ElemType sidetype)
 An implementation for simple (all sides equal) elements. More...
 
template<typename Edgeclass , typename Subclass >
std::unique_ptr< Elemsimple_build_edge_ptr (const unsigned int i)
 An implementation for simple (all edges equal) elements. More...
 
template<typename Subclass >
void simple_build_edge_ptr (std::unique_ptr< Elem > &edge, const unsigned int i, ElemType edgetype)
 An implementation for simple (all edges equal) elements. More...
 
virtual std::vector< std::vector< std::vector< std::vector< std::pair< unsigned char, unsigned char > > > > > & _get_bracketing_node_cache () const
 Elem subclasses which don't do their own bracketing node calculations will need to supply a static cache, since the default calculation is slow. More...
 
virtual std::vector< std::vector< std::vector< signed char > > > & _get_parent_indices_cache () const
 Elem subclasses which don't do their own child-to-parent node calculations will need to supply a static cache, since the default calculation is slow. More...
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter. More...
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter. More...
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter. More...
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter. More...
 

Static Protected Member Functions

static dof_id_type compute_key (dof_id_type n0)
 
static dof_id_type compute_key (dof_id_type n0, dof_id_type n1)
 
static dof_id_type compute_key (dof_id_type n0, dof_id_type n1, dof_id_type n2)
 
static dof_id_type compute_key (dof_id_type n0, dof_id_type n1, dof_id_type n2, dof_id_type n3)
 

Protected Attributes

Node_nodelinks_data [num_nodes]
 Data for links to nodes. More...
 
 LIBMESH_ENABLE_TOPOLOGY_CACHES
 
Elem_elemlinks_data [7+(LIBMESH_DIM >3)]
 Data for links to parent/neighbor/interior_parent elements. More...
 
Node ** _nodes
 Pointers to the nodes we are connected to. More...
 
Elem ** _elemlinks
 Pointers to this element's parent and neighbors, and for lower-dimensional elements' interior_parent. More...
 
std::unique_ptr< Elem *[]> _children
 unique_ptr to array of this element's children. More...
 
subdomain_id_type _sbd_id
 The subdomain to which this element belongs. More...
 
unsigned char _rflag
 h refinement flag. More...
 
unsigned char _pflag
 p refinement flag. More...
 
unsigned char _p_level
 p refinement level - the difference between the polynomial degree on this element and the minimum polynomial degree on the mesh. More...
 
unsigned char _map_type
 Mapping function type; currently either 0 (LAGRANGE) or 1 (RATIONAL_BERNSTEIN). More...
 
unsigned char _map_data
 Mapping function data; currently used when needed to store the RATIONAL_BERNSTEIN nodal weight data index. More...
 
std::unique_ptr< DofObjectold_dof_object
 This object on the last mesh. More...
 

Static Protected Attributes

static const Real _embedding_matrix [num_children][num_nodes][num_nodes]
 Matrix that computes new nodal locations/solution values from current nodes/solution. More...
 
static const unsigned short int _second_order_adjacent_vertices [12][2]
 Matrix that tells which vertices define the location of mid-side (or second-order) nodes. More...
 
static const unsigned short int _second_order_vertex_child_number [27]
 Vector that names a child sharing each second order node. More...
 
static const unsigned short int _second_order_vertex_child_index [27]
 Vector that names the child vertex index for each second order node. More...
 
static const Real _master_points [27][3]
 Master element node locations. More...
 
static const int _child_node_lookup [8][27]
 Lookup table from child id, child node id to "possible node location" (a simple dictionary-index in a 5x5x5 grid) More...
 
static const unsigned int adjacent_edges_map [8][3]
 This maps the j^{th} node to the (in this case) 3 edge ids adjacent to the node. More...
 
static constexpr Real affine_tol = TOLERANCE*TOLERANCE
 Default tolerance to use in has_affine_map(). More...
 
static Counts _counts
 Actually holds the data. More...
 
static Counts _counts
 Actually holds the data. More...
 
static Threads::atomic< unsigned int_n_objects
 The number of objects. More...
 
static Threads::atomic< unsigned int_n_objects
 The number of objects. More...
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting. More...
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting. More...
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called. More...
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called. More...
 

Detailed Description


The Hex20 is an element in 3D composed of 20 nodes.

It is numbered like this:

*   HEX20:      7              18             6
*               o--------------o--------------o
*              /:                            /|
*             / :                           / |
*            /  :                          /  |
*         19/   :                       17/   |
*          o    :                        o    |
*         /     :                       /     |
*        /    15o                      /    14o
*       /       :                     /       |           zeta
*     4/        :    16             5/        |            ^   eta (into page)
*     o--------------o--------------o         |            | /
*     |         :                   |         |            |/
*     |         :                   |         |            o---> xi
*     |         :              10   |         |
*     |        3o..............o....|.........o
*     |        .                    |        / 2
*     |       .                   13|       /
*  12 o      .                      o      /
*     |     .                       |     /
*     |  11o                        |    o
*     |   .                         |   / 9
*     |  .                          |  /
*     | .                           | /
*     |.                            |/
*     o--------------o--------------o
*     0              8              1
* 

(xi, eta, zeta) in [-1,1]^3 are the reference element coordinates associated with the given numbering.

Author
Benjamin S. Kirk
Date
2002 A 3D hexahedral element with 20 nodes.

Definition at line 70 of file cell_hex20.h.

Member Typedef Documentation

◆ ConstNeighborPtrIter

typedef const Elem* const* libMesh::Elem::ConstNeighborPtrIter
inherited

Definition at line 321 of file elem.h.

◆ Counts [1/2]

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

◆ Counts [2/2]

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

◆ NeighborPtrIter

typedef Elem* const* libMesh::Elem::NeighborPtrIter
inherited

Nested "classes" for use iterating over all neighbors of an element.

Definition at line 320 of file elem.h.

◆ Predicate

Useful iterator typedefs.

Definition at line 1809 of file elem.h.

Member Enumeration Documentation

◆ RefinementState

Enumeration of possible element refinement states.

Enumerator
COARSEN 
DO_NOTHING 
REFINE 
JUST_REFINED 
JUST_COARSENED 
INACTIVE 
COARSEN_INACTIVE 
INVALID_REFINEMENTSTATE 

Definition at line 1401 of file elem.h.

Constructor & Destructor Documentation

◆ Hex20() [1/3]

libMesh::Hex20::Hex20 ( Elem p = nullptr)
inlineexplicit

Constructor.

By default this element has no parent.

Definition at line 78 of file cell_hex20.h.

78  :
80  {}
Node * _nodelinks_data[num_nodes]
Data for links to nodes.
Definition: cell_hex20.h:245
static const int num_nodes
Geometric constants for Hex20.
Definition: cell_hex20.h:213
Hex(const unsigned int nn, Elem *p, Node **nodelinkdata)
Default brick element, takes number of nodes and parent.
Definition: cell_hex.h:44

◆ Hex20() [2/3]

libMesh::Hex20::Hex20 ( Hex20 &&  )
delete

◆ Hex20() [3/3]

libMesh::Hex20::Hex20 ( const Hex20 )
delete

◆ ~Hex20()

virtual libMesh::Hex20::~Hex20 ( )
virtualdefault

Member Function Documentation

◆ _get_bracketing_node_cache()

virtual std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char> > > > >& libMesh::Elem::_get_bracketing_node_cache ( ) const
inlineprotectedvirtualinherited

Elem subclasses which don't do their own bracketing node calculations will need to supply a static cache, since the default calculation is slow.

Definition at line 2159 of file elem.h.

Referenced by libMesh::Elem::parent_bracketing_nodes().

2160  {
2161  static std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char>>>>> c;
2162  libmesh_error();
2163  return c;
2164  }

◆ _get_parent_indices_cache()

virtual std::vector<std::vector<std::vector<signed char> > >& libMesh::Elem::_get_parent_indices_cache ( ) const
inlineprotectedvirtualinherited

Elem subclasses which don't do their own child-to-parent node calculations will need to supply a static cache, since the default calculation is slow.

Definition at line 2173 of file elem.h.

Referenced by libMesh::Elem::as_parent_node().

2174  {
2175  static std::vector<std::vector<std::vector<signed char>>> c;
2176  libmesh_error();
2177  return c;
2178  }

◆ active()

bool libMesh::Elem::active ( ) const
inlineinherited
Returns
true if the element is active (i.e. has no active descendants) or AMR is disabled, false otherwise.
Note
It suffices to check the first child only.

Definition at line 2891 of file elem.h.

References libMesh::Elem::COARSEN_INACTIVE, libMesh::Elem::INACTIVE, and libMesh::Elem::refinement_flag().

Referenced by libMesh::DofMap::_dof_indices(), libMesh::DofMap::_node_dof_indices(), libMesh::HPCoarsenTest::add_projection(), libMesh::Elem::ancestor(), assemble_ellipticdg(), libMesh::Patch::build_around_element(), libMesh::Elem::coarsen(), compute_jacobian(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), libMesh::FEAbstract::compute_periodic_node_constraints(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints(), compute_residual(), libMesh::Elem::contract(), libMesh::DofMap::dof_indices(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::Elem::find_point_neighbors(), libMesh::ReplicatedMesh::get_disconnected_subdomains(), libMesh::Elem::get_info(), libMesh::ErrorVector::is_active_elem(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_flags(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_p_levels(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::Elem::make_links_to_me_local(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::Elem::max_descendant_p_level(), libMesh::DofMap::merge_ghost_functor_outputs(), libMesh::Elem::min_new_p_level_by_neighbor(), libMesh::Elem::min_p_level_by_neighbor(), libMesh::PointLocatorTree::operator()(), libMesh::EquationSystems::redundant_added_side(), libMesh::Elem::refine(), libMesh::Elem::subactive(), libMesh::Parallel::sync_element_data_by_parent_id(), libMesh::MeshRefinement::test_level_one(), EquationSystemsTest::testRefineThenReinitPreserveFlags(), and libMesh::BoundaryInfo::transfer_boundary_ids_from_children().

2892 {
2893 #ifdef LIBMESH_ENABLE_AMR
2894  if ((this->refinement_flag() == INACTIVE) ||
2895  (this->refinement_flag() == COARSEN_INACTIVE))
2896  return false;
2897  else
2898  return true;
2899 #else
2900  return true;
2901 #endif
2902 }
RefinementState refinement_flag() const
Definition: elem.h:3160

◆ active_family_tree() [1/2]

void libMesh::Elem::active_family_tree ( std::vector< const Elem *> &  active_family,
bool  reset = true 
) const
inherited

Same as the family_tree() member, but only adds the active children.

Can be thought of as removing all the inactive elements from the vector created by family_tree, but is implemented more efficiently.

Definition at line 2004 of file elem.C.

References libMesh::ElemInternal::active_family_tree().

Referenced by libMesh::MeshCommunication::delete_remote_elements(), libMesh::DofMap::merge_ghost_functor_outputs(), and libMesh::SiblingCoupling::operator()().

2006 {
2007  ElemInternal::active_family_tree(this, active_family, reset);
2008 }
void active_family_tree(T elem, std::vector< T > &active_family, bool reset=true)
Definition: elem_internal.h:90

◆ active_family_tree() [2/2]

void libMesh::Elem::active_family_tree ( std::vector< Elem *> &  active_family,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 2012 of file elem.C.

References libMesh::ElemInternal::active_family_tree().

2014 {
2015  ElemInternal::active_family_tree(this, active_family, reset);
2016 }
void active_family_tree(T elem, std::vector< T > &active_family, bool reset=true)
Definition: elem_internal.h:90

◆ active_family_tree_by_neighbor() [1/2]

void libMesh::Elem::active_family_tree_by_neighbor ( std::vector< const Elem *> &  family,
const Elem neighbor,
bool  reset = true 
) const
inherited

Same as the active_family_tree() member, but only adds elements which are next to neighbor.

Definition at line 2132 of file elem.C.

References libMesh::ElemInternal::active_family_tree_by_neighbor().

Referenced by libMesh::DefaultCoupling::operator()().

2135 {
2136  ElemInternal::active_family_tree_by_neighbor(this, family, neighbor, reset);
2137 }
void active_family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)

◆ active_family_tree_by_neighbor() [2/2]

void libMesh::Elem::active_family_tree_by_neighbor ( std::vector< Elem *> &  family,
Elem neighbor,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 2141 of file elem.C.

References libMesh::ElemInternal::active_family_tree_by_neighbor().

2144 {
2145  ElemInternal::active_family_tree_by_neighbor(this, family, neighbor, reset);
2146 }
void active_family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)

◆ active_family_tree_by_side() [1/2]

void libMesh::Elem::active_family_tree_by_side ( std::vector< const Elem *> &  family,
unsigned int  side,
bool  reset = true 
) const
inherited

Same as the active_family_tree() member, but only adds elements which are next to side.

Definition at line 2038 of file elem.C.

References libMesh::ElemInternal::active_family_tree_by_side().

Referenced by libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::Nemesis_IO_Helper::write_sidesets(), and libMesh::ExodusII_IO_Helper::write_sidesets().

2041 {
2042  ElemInternal::active_family_tree_by_side(this, family, side, reset);
2043 }
void active_family_tree_by_side(T elem, std::vector< T > &family, unsigned int side, bool reset=true)

◆ active_family_tree_by_side() [2/2]

void libMesh::Elem::active_family_tree_by_side ( std::vector< Elem *> &  family,
unsigned int  side,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 2047 of file elem.C.

References libMesh::ElemInternal::active_family_tree_by_side().

2050 {
2051  ElemInternal::active_family_tree_by_side(this, family, side, reset);
2052 }
void active_family_tree_by_side(T elem, std::vector< T > &family, unsigned int side, bool reset=true)

◆ active_family_tree_by_topological_neighbor() [1/2]

void libMesh::Elem::active_family_tree_by_topological_neighbor ( std::vector< const Elem *> &  family,
const Elem neighbor,
const MeshBase mesh,
const PointLocatorBase point_locator,
const PeriodicBoundaries pb,
bool  reset = true 
) const
inherited

Same as the active_family_tree_by_neighbor() member, but the neighbor here may be a topological (e.g.

periodic boundary condition) neighbor, not just a local neighbor.

Definition at line 2150 of file elem.C.

References libMesh::ElemInternal::active_family_tree_by_topological_neighbor(), and mesh.

Referenced by libMesh::GhostPointNeighbors::operator()(), and libMesh::DefaultCoupling::operator()().

2156 {
2158  mesh, point_locator, pb,
2159  reset);
2160 }
MeshBase & mesh
void active_family_tree_by_topological_neighbor(T elem, std::vector< T > &family, T neighbor_in, const MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb, bool reset=true)

◆ active_family_tree_by_topological_neighbor() [2/2]

void libMesh::Elem::active_family_tree_by_topological_neighbor ( std::vector< Elem *> &  family,
Elem neighbor,
const MeshBase mesh,
const PointLocatorBase point_locator,
const PeriodicBoundaries pb,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 2164 of file elem.C.

References libMesh::ElemInternal::active_family_tree_by_topological_neighbor(), and mesh.

2170 {
2172  mesh, point_locator, pb,
2173  reset);
2174 }
MeshBase & mesh
void active_family_tree_by_topological_neighbor(T elem, std::vector< T > &family, T neighbor_in, const MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb, bool reset=true)

◆ add_child() [1/2]

void libMesh::Elem::add_child ( Elem elem)
inherited

Adds a child pointer to the array of children of this element.

If this is the first child to be added, this method allocates memory in the parent's _children array, otherwise, it just sets the pointer.

Definition at line 1915 of file elem.C.

References libMesh::Elem::_children, libMesh::Elem::n_children(), libMesh::Elem::parent(), libMesh::remote_elem, and libMesh::Elem::set_child().

Referenced by libMesh::UnstructuredMesh::all_first_order(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::CheckpointIO::read_connectivity(), and libMesh::CheckpointIO::read_remote_elem().

1916 {
1917  const unsigned int nc = this->n_children();
1918 
1919  if (!_children)
1920  {
1921  _children = std::make_unique<Elem *[]>(nc);
1922 
1923  for (unsigned int c = 0; c != nc; c++)
1924  this->set_child(c, nullptr);
1925  }
1926 
1927  for (unsigned int c = 0; c != nc; c++)
1928  {
1929  if (this->_children[c] == nullptr || this->_children[c] == remote_elem)
1930  {
1931  libmesh_assert_equal_to (this, elem->parent());
1932  this->set_child(c, elem);
1933  return;
1934  }
1935  }
1936 
1937  libmesh_error_msg("Error: Tried to add a child to an element with full children array");
1938 }
virtual unsigned int n_children() const =0
void set_child(unsigned int c, Elem *elem)
Sets the pointer to the child for this element.
Definition: elem.h:3132
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element&#39;s children.
Definition: elem.h:2211
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ add_child() [2/2]

void libMesh::Elem::add_child ( Elem elem,
unsigned int  c 
)
inherited

Adds a new child pointer to the specified index in the array of children of this element.

If this is the first child to be added, this method allocates memory in the parent's _children array, otherwise, it just sets the pointer.

Definition at line 1942 of file elem.C.

References libMesh::Elem::_children, libMesh::Elem::child_ptr(), libMesh::Elem::has_children(), libMesh::libmesh_assert(), libMesh::Elem::n_children(), libMesh::Elem::parent(), libMesh::remote_elem, and libMesh::Elem::set_child().

1943 {
1944  if (!this->has_children())
1945  {
1946  const unsigned int nc = this->n_children();
1947  _children = std::make_unique<Elem *[]>(nc);
1948 
1949  for (unsigned int i = 0; i != nc; i++)
1950  this->set_child(i, nullptr);
1951  }
1952 
1953  libmesh_assert (this->_children[c] == nullptr || this->child_ptr(c) == remote_elem);
1954  libmesh_assert (elem == remote_elem || this == elem->parent());
1955 
1956  this->set_child(c, elem);
1957 }
const Elem * parent() const
Definition: elem.h:2980
virtual unsigned int n_children() const =0
libmesh_assert(ctx)
void set_child(unsigned int c, Elem *elem)
Sets the pointer to the child for this element.
Definition: elem.h:3132
bool has_children() const
Definition: elem.h:2929
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element&#39;s children.
Definition: elem.h:2211
const Elem * child_ptr(unsigned int i) const
Definition: elem.h:3113
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ add_extra_integers() [1/2]

void libMesh::DofObject::add_extra_integers ( const unsigned int  n_integers)
inherited

Assigns a set of extra integers to this DofObject.

There will now be n_integers associated; this replaces, not augments, any previous count.

Any newly-added values will initially be DofObject::invalid_id

If non-integer data is in the set, each datum of type T should be counted sizeof(T)/sizeof(dof_id_type) times in n_integers.

Definition at line 490 of file dof_object.C.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::invalid_id, and libMesh::DofObject::n_extra_integers().

Referenced by libMesh::ReplicatedMesh::add_elem(), libMesh::DistributedMesh::add_elem(), libMesh::DofObject::add_extra_integers(), libMesh::ReplicatedMesh::add_node(), libMesh::DistributedMesh::add_node(), libMesh::ReplicatedMesh::add_point(), libMesh::UnstructuredMesh::all_first_order(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::UnstructuredMesh::create_submesh(), libMesh::ReplicatedMesh::insert_elem(), libMesh::DistributedMesh::insert_elem(), libMesh::ReplicatedMesh::insert_node(), DofObjectTest< Node >::testAddExtraData(), DofObjectTest< Node >::testAddSystemExtraInts(), DofObjectTest< Node >::testSetNSystemsExtraInts(), and DofObjectTest< Node >::testSetNVariableGroupsExtraInts().

491 {
492  if (_idx_buf.empty())
493  {
494  if (n_integers)
495  {
496  _idx_buf.resize(n_integers+1, DofObject::invalid_id);
497  _idx_buf[0] = dof_id_type(-1);
498  }
499  return;
500  }
501  else
502  {
503  const int hdr = dof_id_signed_type(_idx_buf[0]);
504 
505  // We already have some extra integers, but may need more or
506  // less now.
507  if (hdr < 0)
508  {
509  const unsigned int old_n_integers = this->n_extra_integers();
510  if (n_integers != old_n_integers)
511  {
512  // Make or remove space as needed by count change
513  _idx_buf.resize(_idx_buf.size()+n_integers-old_n_integers, DofObject::invalid_id);
514 
515  // The start index for the extra integers is unchanged.
516  }
517  }
518  else if (n_integers)
519  // We had no extra integers, but need to add some
520  {
521  // Mark the DofObject as holding extra integers
522  _idx_buf[0] = dof_id_type(-hdr-1);
523 
524  // Insert the integer start position
525  DofObject::index_buffer_t::iterator it = _idx_buf.begin() + hdr;
526  _idx_buf.insert(it, _idx_buf.size()+1);
527 
528  // Increment the previous system start positions to account
529  // for the new header entry creating an offset
530  for (int i=1; i<hdr; i++)
531  _idx_buf[i]++;
532 
533  // Append space for extra integers
534  _idx_buf.resize(_idx_buf.size()+n_integers, DofObject::invalid_id);
535  }
536  }
537 }
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482
int8_t dof_id_signed_type
Definition: id_types.h:68
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
Definition: dof_object.h:1170
index_buffer_t _idx_buf
Definition: dof_object.h:680
uint8_t dof_id_type
Definition: id_types.h:67

◆ add_extra_integers() [2/2]

void libMesh::DofObject::add_extra_integers ( const unsigned int  n_integers,
const std::vector< dof_id_type > &  default_values 
)
inherited

Assigns a set of extra integers to this DofObject.

There will now be n_integers associated; this replaces, not augments, any previous count.

Any newly-added values will be copied from default_values.

If non-integer data is in the set, each datum of type T should be counted sizeof(T)/sizeof(dof_id_type) times in n_integers, and its data should be expressed in default_values as per memcpy.

Definition at line 542 of file dof_object.C.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::add_extra_integers(), and libMesh::DofObject::n_extra_integers().

544 {
545  libmesh_assert_equal_to(n_integers, default_values.size());
546 
547  const unsigned int n_old_integers = this->n_extra_integers();
548  this->add_extra_integers(n_integers);
549  if (n_integers > n_old_integers)
550  {
551  const unsigned int n_more_integers = n_integers - n_old_integers;
552  std::copy(default_values.begin()+n_old_integers,
553  default_values.end(),
554  _idx_buf.end()-n_more_integers);
555  }
556 }
void add_extra_integers(const unsigned int n_integers)
Assigns a set of extra integers to this DofObject.
Definition: dof_object.C:490
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
Definition: dof_object.h:1170
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ add_system()

void libMesh::DofObject::add_system ( )
inherited

Adds an additional system to the DofObject.

Definition at line 195 of file dof_object.C.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::has_extra_integers(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), libMesh::DofObject::n_vars(), and libMesh::DofObject::set_n_systems().

Referenced by DofObjectTest< Node >::testAddSystemExtraInts().

196 {
197  // quick return?
198  if (this->n_systems() == 0)
199  {
200  this->set_n_systems(1);
201  return;
202  }
203 
204  // cache this value before we screw it up!
205  const unsigned int ns_orig = this->n_systems();
206 
207  DofObject::index_buffer_t::iterator it = _idx_buf.begin() + ns_orig;
208 
209  // Create the entry for the new system indicating 0 variables.
210  //
211  // increment the number of systems and the offsets for each of
212  // the systems including the new one we just added.
213  if (this->has_extra_integers())
214  {
215  // this inserts the extra_integers' start position as the start
216  // position for the new system. We'll increment all those
217  // counts in one sweep next, to account for header expansion.
218  _idx_buf.insert(it, *it);
219 
220  _idx_buf[0]--;
221  for (unsigned int i=1; i<ns_orig+2; i++)
222  {
223  libmesh_assert_less(i, _idx_buf.size());
224  _idx_buf[i]++;
225  }
226  }
227  else
228  {
229  // this inserts the current vector size at the position for the
230  // new system
231  _idx_buf.insert(it, cast_int<dof_id_type>(_idx_buf.size()));
232 
233  for (unsigned int i=0; i<ns_orig+1; i++)
234  {
235  libmesh_assert_less(i, _idx_buf.size());
236  _idx_buf[i]++;
237  }
238  }
239 
240  libmesh_assert_equal_to (this->n_systems(), (ns_orig+1));
241  libmesh_assert_equal_to (this->n_vars(ns_orig), 0);
242  libmesh_assert_equal_to (this->n_var_groups(ns_orig), 0);
243 }
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
bool has_extra_integers() const
Returns whether extra integers are associated to the DofObject.
Definition: dof_object.h:1188
void set_n_systems(const unsigned int s)
Sets the number of systems for this DofObject.
Definition: dof_object.C:150
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ ancestor()

bool libMesh::Elem::ancestor ( ) const
inherited
Returns
true if the element is an ancestor (i.e. has an active child or ancestor child), false otherwise or when AMR is disabled.

Definition at line 1881 of file elem.C.

References libMesh::Elem::active(), libMesh::Elem::child_ref_range(), libMesh::Elem::has_children(), libMesh::libmesh_assert(), libMesh::remote_elem, and libMesh::Elem::subactive().

Referenced by libMesh::UnstructuredMesh::find_neighbors(), libMesh::Elem::get_info(), and libMesh::Elem::refine().

1882 {
1883 #ifdef LIBMESH_ENABLE_AMR
1884 
1885  // Use a fast, DistributedMesh-safe definition
1886  const bool is_ancestor =
1887  !this->active() && !this->subactive();
1888 
1889  // But check for inconsistencies if we have time
1890 #ifdef DEBUG
1891  if (!is_ancestor && this->has_children())
1892  {
1893  for (auto & c : this->child_ref_range())
1894  {
1895  if (&c != remote_elem)
1896  {
1897  libmesh_assert(!c.active());
1898  libmesh_assert(!c.ancestor());
1899  }
1900  }
1901  }
1902 #endif // DEBUG
1903 
1904  return is_ancestor;
1905 
1906 #else
1907  return false;
1908 #endif
1909 }
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
Definition: elem.h:2296
libmesh_assert(ctx)
bool subactive() const
Definition: elem.h:2909
bool active() const
Definition: elem.h:2891
bool has_children() const
Definition: elem.h:2929
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ as_parent_node()

unsigned int libMesh::Elem::as_parent_node ( unsigned int  c,
unsigned int  n 
) const
virtualinherited
Returns
The local node id on the parent which corresponds to node n of child c, or invalid_uint if no such parent node exists.

Definition at line 2257 of file elem.C.

References libMesh::Elem::_get_parent_indices_cache(), libMesh::Elem::embedding_matrix(), libMesh::Elem::embedding_matrix_version(), libMesh::invalid_uint, libMesh::Elem::n_children(), libMesh::Elem::n_nodes(), libMesh::Elem::n_nodes_in_child(), libMesh::parent_indices_mutex, and libMesh::Real.

Referenced by libMesh::MeshRefinement::add_node(), and libMesh::Elem::parent_bracketing_nodes().

2259 {
2260  const unsigned int nc = this->n_children();
2261  libmesh_assert_less(child, nc);
2262 
2263  // Cached return values, indexed first by embedding_matrix version,
2264  // then by child number, then by child node number.
2265  std::vector<std::vector<std::vector<signed char>>> &
2266  cached_parent_indices = this->_get_parent_indices_cache();
2267 
2268  unsigned int em_vers = this->embedding_matrix_version();
2269 
2270  // We may be updating the cache on one thread, and while that
2271  // happens we can't safely access the cache from other threads.
2272  Threads::spin_mutex::scoped_lock lock(parent_indices_mutex);
2273 
2274  if (em_vers >= cached_parent_indices.size())
2275  cached_parent_indices.resize(em_vers+1);
2276 
2277  if (child >= cached_parent_indices[em_vers].size())
2278  {
2279  const signed char nn = cast_int<signed char>(this->n_nodes());
2280 
2281  cached_parent_indices[em_vers].resize(nc);
2282 
2283  for (unsigned int c = 0; c != nc; ++c)
2284  {
2285  const unsigned int ncn = this->n_nodes_in_child(c);
2286  cached_parent_indices[em_vers][c].resize(ncn);
2287  for (unsigned int cn = 0; cn != ncn; ++cn)
2288  {
2289  for (signed char n = 0; n != nn; ++n)
2290  {
2291  const Real em_val = this->embedding_matrix
2292  (c, cn, n);
2293  if (em_val == 1)
2294  {
2295  cached_parent_indices[em_vers][c][cn] = n;
2296  break;
2297  }
2298 
2299  if (em_val != 0)
2300  {
2301  cached_parent_indices[em_vers][c][cn] =
2302  -1;
2303  break;
2304  }
2305 
2306  // We should never see an all-zero embedding matrix
2307  // row
2308  libmesh_assert_not_equal_to (n+1, nn);
2309  }
2310  }
2311  }
2312  }
2313 
2314  const signed char cache_val =
2315  cached_parent_indices[em_vers][child][child_node];
2316  if (cache_val == -1)
2317  return libMesh::invalid_uint;
2318 
2319  return cached_parent_indices[em_vers][child][child_node];
2320 }
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:293
virtual unsigned int embedding_matrix_version() const
Definition: elem.h:2000
Threads::spin_mutex parent_indices_mutex
Definition: elem.C:97
virtual unsigned int n_children() const =0
virtual Real embedding_matrix(const unsigned int child_num, const unsigned int child_node_num, const unsigned int parent_node_num) const =0
virtual std::vector< std::vector< std::vector< signed char > > > & _get_parent_indices_cache() const
Elem subclasses which don&#39;t do their own child-to-parent node calculations will need to supply a stat...
Definition: elem.h:2173
virtual unsigned int n_nodes() const =0
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual unsigned int n_nodes_in_child(unsigned int) const
Definition: elem.h:652

◆ boundary_sides_begin()

Elem::side_iterator libMesh::Elem::boundary_sides_begin ( )
inherited

Iterator accessor functions.

Definition at line 3282 of file elem.C.

References libMesh::Elem::_first_side(), and libMesh::Elem::_last_side().

3283 {
3284  Predicates::BoundarySide<SideIter> bsp;
3285  return side_iterator(this->_first_side(), this->_last_side(), bsp);
3286 }
SideIter _last_side()
Definition: elem.h:3414
SideIter _first_side()
Side iterator helper functions.
Definition: elem.h:3406

◆ boundary_sides_end()

Elem::side_iterator libMesh::Elem::boundary_sides_end ( )
inherited

Definition at line 3291 of file elem.C.

References libMesh::Elem::_last_side().

3292 {
3293  Predicates::BoundarySide<SideIter> bsp;
3294  return side_iterator(this->_last_side(), this->_last_side(), bsp);
3295 }
SideIter _last_side()
Definition: elem.h:3414

◆ bracketing_nodes()

const std::vector< std::pair< dof_id_type, dof_id_type > > libMesh::Elem::bracketing_nodes ( unsigned int  c,
unsigned int  n 
) const
virtualinherited
Returns
All the pairs of nodes (indexed by global node id) which should bracket node n of child c.

Definition at line 2528 of file elem.C.

References libMesh::Elem::build(), libMesh::Elem::child_ptr(), libMesh::Elem::default_order(), libMesh::FIRST, libMesh::HEX20, libMesh::DofObject::invalid_id, libMesh::make_range(), libMesh::Elem::n_nodes(), libMesh::Elem::n_nodes_in_child(), libMesh::Elem::node_id(), libMesh::Elem::parent_bracketing_nodes(), libMesh::Elem::second_order_equivalent_type(), and libMesh::Elem::type().

Referenced by libMesh::MeshRefinement::add_node(), and libMesh::TopologyMap::fill().

2530 {
2531  std::vector<std::pair<dof_id_type, dof_id_type>> returnval;
2532 
2533  const std::vector<std::pair<unsigned char, unsigned char>> & pbc =
2534  this->parent_bracketing_nodes(child,child_node);
2535 
2536  for (const auto & pb : pbc)
2537  {
2538  const unsigned short n_n = this->n_nodes();
2539  if (pb.first < n_n && pb.second < n_n)
2540  returnval.emplace_back(this->node_id(pb.first), this->node_id(pb.second));
2541  else
2542  {
2543  // We must be on a non-full-order higher order element...
2544  libmesh_assert_not_equal_to(this->default_order(), FIRST);
2545  libmesh_assert_not_equal_to
2546  (second_order_equivalent_type (this->type(), true),
2547  this->type());
2548  libmesh_assert_equal_to
2549  (second_order_equivalent_type (this->type(), false),
2550  this->type());
2551 
2552  // And that's a shame, because this is a nasty search:
2553 
2554  // Build the full-order type
2555  ElemType full_type =
2556  second_order_equivalent_type(this->type(), /*full_ordered=*/ true);
2557  std::unique_ptr<Elem> full_elem = Elem::build(full_type);
2558 
2561 
2562  // Find the bracketing nodes by figuring out what
2563  // already-created children will have them.
2564 
2565  // This only doesn't break horribly because we add children
2566  // and nodes in straightforward + hierarchical orders...
2567  for (unsigned int c=0; c <= child; ++c)
2568  for (auto n : make_range(this->n_nodes_in_child(c)))
2569  {
2570  if (c == child && n == child_node)
2571  break;
2572 
2573  if (pb.first == full_elem->as_parent_node(c,n))
2574  {
2575  // We should be consistent
2576  if (pt1 != DofObject::invalid_id)
2577  libmesh_assert_equal_to(pt1, this->child_ptr(c)->node_id(n));
2578 
2579  pt1 = this->child_ptr(c)->node_id(n);
2580  }
2581 
2582  if (pb.second == full_elem->as_parent_node(c,n))
2583  {
2584  // We should be consistent
2585  if (pt2 != DofObject::invalid_id)
2586  libmesh_assert_equal_to(pt2, this->child_ptr(c)->node_id(n));
2587 
2588  pt2 = this->child_ptr(c)->node_id(n);
2589  }
2590  }
2591 
2592  // We should *usually* find all bracketing nodes by the time
2593  // we query them (again, because of the child & node add
2594  // order)
2595  //
2596  // The exception is if we're a HEX20, in which case we will
2597  // find pairs of vertex nodes and edge nodes bracketing the
2598  // new central node but we *won't* find the pairs of face
2599  // nodes which we would have had on a HEX27. In that case
2600  // we'll still have enough bracketing nodes for a
2601  // topological lookup, but we won't be able to make the
2602  // following assertions.
2603  if (this->type() != HEX20)
2604  {
2605  libmesh_assert_not_equal_to (pt1, DofObject::invalid_id);
2606  libmesh_assert_not_equal_to (pt2, DofObject::invalid_id);
2607  }
2608 
2609  if (pt1 != DofObject::invalid_id &&
2610  pt2 != DofObject::invalid_id)
2611  returnval.emplace_back(pt1, pt2);
2612  }
2613  }
2614 
2615  return returnval;
2616 }
ElemType
Defines an enum for geometric element types.
virtual unsigned int n_nodes() const =0
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
Definition: elem.C:321
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482
static ElemType second_order_equivalent_type(const ElemType et, const bool full_ordered=true)
Definition: elem.C:3006
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140
virtual Order default_order() const =0
virtual const std::vector< std::pair< unsigned char, unsigned char > > & parent_bracketing_nodes(unsigned int c, unsigned int n) const
Definition: elem.C:2325
virtual ElemType type() const =0
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:2412
virtual unsigned int n_nodes_in_child(unsigned int) const
Definition: elem.h:652
const Elem * child_ptr(unsigned int i) const
Definition: elem.h:3113
uint8_t dof_id_type
Definition: id_types.h:67

◆ build()

std::unique_ptr< Elem > libMesh::Elem::build ( const ElemType  type,
Elem p = nullptr 
)
staticinherited
Returns
An Elem of type type wrapped in a smart pointer.

Definition at line 321 of file elem.C.

References libMesh::C0POLYGON, libMesh::EDGE2, libMesh::EDGE3, libMesh::EDGE4, libMesh::Utility::enum_to_string(), libMesh::HEX20, libMesh::HEX27, libMesh::HEX8, libMesh::INFEDGE2, libMesh::INFHEX16, libMesh::INFHEX18, libMesh::INFHEX8, libMesh::INFPRISM12, libMesh::INFPRISM6, libMesh::INFQUAD4, libMesh::INFQUAD6, libMesh::NODEELEM, libMesh::PRISM15, libMesh::PRISM18, libMesh::PRISM20, libMesh::PRISM21, libMesh::PRISM6, libMesh::PYRAMID13, libMesh::PYRAMID14, libMesh::PYRAMID18, libMesh::PYRAMID5, libMesh::QUAD4, libMesh::QUAD8, libMesh::QUAD9, libMesh::QUADSHELL4, libMesh::QUADSHELL8, libMesh::QUADSHELL9, libMesh::TET10, libMesh::TET14, libMesh::TET4, libMesh::TRI3, libMesh::TRI3SUBDIVISION, libMesh::TRI6, libMesh::TRI7, libMesh::TRISHELL3, and libMesh::Elem::type().

Referenced by libMesh::GMVIO::_read_one_cell(), libMesh::MeshTools::Subdivision::add_boundary_ghosts(), add_cube_convex_hull_to_mesh(), libMesh::UnstructuredMesh::all_first_order(), libMesh::MeshTools::Modification::all_tri(), AllSecondOrderTest::allCompleteOrderMixed(), AllSecondOrderTest::allCompleteOrderRange(), AllSecondOrderTest::allSecondOrderMixed(), AllSecondOrderTest::allSecondOrderRange(), libMesh::Elem::bracketing_nodes(), libMesh::MeshTools::Generation::build_cube(), libMesh::Nemesis_IO_Helper::build_element_and_node_maps(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::InfElemBuilder::build_inf_elem(), MixedDimensionMeshTest::build_mesh(), ExtraIntegersTest::build_mesh(), MeshfunctionDFEM::build_mesh(), MixedDimensionNonUniformRefinement::build_mesh(), MixedDimensionNonUniformRefinementTriangle::build_mesh(), MixedDimensionNonUniformRefinement3D::build_mesh(), libMesh::Elem::build_with_id(), VolumeTest::construct_elem(), ContainsPointTest::containsPointTri3Helper(), libMesh::MeshBase::copy_constraint_rows(), libMesh::TriangleWrapper::copy_tri_to_mesh(), libMesh::Elem::disconnected_clone(), libMesh::UNVIO::elements_in(), libMesh::MeshTools::Modification::flatten(), libMesh::ExodusII_IO_Helper::init_conversion_map(), main(), libMesh::Elem::parent_bracketing_nodes(), libMesh::TetGenMeshInterface::pointset_convexhull(), libMesh::Nemesis_IO::read(), libMesh::ExodusII_IO::read(), libMesh::VTKIO::read(), libMesh::CheckpointIO::read_connectivity(), libMesh::ExodusII_IO_Helper::read_edge_blocks(), libMesh::AbaqusIO::read_elements(), libMesh::UCDIO::read_implementation(), libMesh::DynaIO::read_mesh(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::OFFIO::read_stream(), libMesh::Elem::refine(), libMesh::SimplexRefiner::refine_via_edges(), PerElemTest< elem_type >::setUp(), RationalMapTest< elem_type >::setUp(), FETestBase< order, family, elem_type, 1 >::setUp(), libMesh::MeshTools::Generation::surface_octahedron(), SystemsTest::test2DProjectVectorFE(), SystemsTest::test3DProjectVectorFE(), ContainsPointTest::testContainsPointNodeElem(), ContainsPointTest::testContainsPointTet4(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), SystemsTest::testDofCouplingWithVarGroups(), DofMapTest::testDofOwner(), MeshTriangulationTest::testEdgesMesh(), MeshTriangulationTest::testHalfDomain(), PointLocatorTest::testLocator(), QuadratureTest::testNodalQuadrature(), MeshTriangulationTest::testPoly2TriBad1DMultiBoundary(), MeshTriangulationTest::testPoly2TriBad2DMultiBoundary(), MeshTriangulationTest::testPoly2TriBadEdges(), QuadratureTest::testPolynomials(), EquationSystemsTest::testReinitWithNodeElem(), BoundaryInfoTest::testShellFaceConstraints(), MeshTetTest::testTetsToTets(), MeshSubdomainIDTest::testUnpartitioned(), libMesh::TetGenMeshInterface::triangulate_conformingDelaunayMesh_carvehole(), libMesh::TetGenMeshInterface::triangulate_pointset(), and libMesh::GMVIO::write_ascii_old_impl().

323 {
324  switch (type)
325  {
326  // 0D elements
327  case NODEELEM:
328  return std::make_unique<NodeElem>(p);
329 
330  // 1D elements
331  case EDGE2:
332  return std::make_unique<Edge2>(p);
333  case EDGE3:
334  return std::make_unique<Edge3>(p);
335  case EDGE4:
336  return std::make_unique<Edge4>(p);
337 
338  // 2D elements
339  case TRI3:
340  return std::make_unique<Tri3>(p);
341  case TRISHELL3:
342  return std::make_unique<TriShell3>(p);
343  case TRI3SUBDIVISION:
344  return std::make_unique<Tri3Subdivision>(p);
345  case TRI6:
346  return std::make_unique<Tri6>(p);
347  case TRI7:
348  return std::make_unique<Tri7>(p);
349  case QUAD4:
350  return std::make_unique<Quad4>(p);
351  case QUADSHELL4:
352  return std::make_unique<QuadShell4>(p);
353  case QUAD8:
354  return std::make_unique<Quad8>(p);
355  case QUADSHELL8:
356  return std::make_unique<QuadShell8>(p);
357  case QUAD9:
358  return std::make_unique<Quad9>(p);
359  case QUADSHELL9:
360  return std::make_unique<QuadShell9>(p);
361 
362  // Well, a hexagon is *a* polygon...
363  case C0POLYGON:
364  return std::make_unique<C0Polygon>(6, p);
365 
366  // 3D elements
367  case TET4:
368  return std::make_unique<Tet4>(p);
369  case TET10:
370  return std::make_unique<Tet10>(p);
371  case TET14:
372  return std::make_unique<Tet14>(p);
373  case HEX8:
374  return std::make_unique<Hex8>(p);
375  case HEX20:
376  return std::make_unique<Hex20>(p);
377  case HEX27:
378  return std::make_unique<Hex27>(p);
379  case PRISM6:
380  return std::make_unique<Prism6>(p);
381  case PRISM15:
382  return std::make_unique<Prism15>(p);
383  case PRISM18:
384  return std::make_unique<Prism18>(p);
385  case PRISM20:
386  return std::make_unique<Prism20>(p);
387  case PRISM21:
388  return std::make_unique<Prism21>(p);
389  case PYRAMID5:
390  return std::make_unique<Pyramid5>(p);
391  case PYRAMID13:
392  return std::make_unique<Pyramid13>(p);
393  case PYRAMID14:
394  return std::make_unique<Pyramid14>(p);
395  case PYRAMID18:
396  return std::make_unique<Pyramid18>(p);
397 
398 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
399  // 1D infinite elements
400  case INFEDGE2:
401  return std::make_unique<InfEdge2>(p);
402 
403  // 2D infinite elements
404  case INFQUAD4:
405  return std::make_unique<InfQuad4>(p);
406  case INFQUAD6:
407  return std::make_unique<InfQuad6>(p);
408 
409  // 3D infinite elements
410  case INFHEX8:
411  return std::make_unique<InfHex8>(p);
412  case INFHEX16:
413  return std::make_unique<InfHex16>(p);
414  case INFHEX18:
415  return std::make_unique<InfHex18>(p);
416  case INFPRISM6:
417  return std::make_unique<InfPrism6>(p);
418  case INFPRISM12:
419  return std::make_unique<InfPrism12>(p);
420 #endif
421 
422  default:
423  libmesh_error_msg("ERROR: Undefined element type == " << Utility::enum_to_string(type));
424  }
425 }
std::string enum_to_string(const T e)
virtual ElemType type() const =0

◆ build_edge_ptr() [1/4]

std::unique_ptr< Elem > libMesh::Hex20::build_edge_ptr ( const unsigned int  i)
overridevirtual

Builds a EDGE3 built coincident with edge i.

The std::unique_ptr<Elem> handles the memory aspect.

Implements libMesh::Elem.

Definition at line 203 of file cell_hex20.C.

204 {
205  return this->simple_build_edge_ptr<Edge3,Hex20>(i);
206 }

◆ build_edge_ptr() [2/4]

void libMesh::Hex20::build_edge_ptr ( std::unique_ptr< Elem > &  edge,
const unsigned int  i 
)
overridevirtual

Rebuilds a EDGE3 built coincident with edge i.

Implements libMesh::Elem.

Definition at line 210 of file cell_hex20.C.

References libMesh::EDGE3.

211 {
212  this->simple_build_edge_ptr<Hex20>(edge, i, EDGE3);
213 }

◆ build_edge_ptr() [3/4]

std::unique_ptr< const Elem > libMesh::Elem::build_edge_ptr ( const unsigned int  i) const
inlineinherited

Definition at line 2781 of file elem.h.

References libMesh::Elem::build_edge_ptr().

2782 {
2783  // Call the non-const version of this function, return the result as
2784  // a std::unique_ptr<const Elem>.
2785  Elem * me = const_cast<Elem *>(this);
2786  const Elem * e = const_cast<const Elem *>(me->build_edge_ptr(i).release());
2787  return std::unique_ptr<const Elem>(e);
2788 }
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328

◆ build_edge_ptr() [4/4]

void libMesh::Elem::build_edge_ptr ( std::unique_ptr< const Elem > &  edge,
const unsigned int  i 
) const
inlineinherited

Definition at line 2794 of file elem.h.

References libMesh::Elem::build_edge_ptr().

2796 {
2797  // Hand off to the non-const version of this function
2798  Elem * me = const_cast<Elem *>(this);
2799  std::unique_ptr<Elem> e {const_cast<Elem *>(elem.release())};
2800  me->build_edge_ptr(e, i);
2801  elem = std::move(e);
2802 }
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328

◆ build_side_ptr() [1/4]

std::unique_ptr< Elem > libMesh::Hex20::build_side_ptr ( const unsigned int  i,
bool  proxy = false 
)
overridevirtual

Builds a QUAD8 built coincident with face i.

The std::unique_ptr<Elem> handles the memory aspect.

Implements libMesh::Elem.

Definition at line 165 of file cell_hex20.C.

167 {
168  return this->simple_build_side_ptr<Quad8, Hex20>(i, proxy);
169 }

◆ build_side_ptr() [2/4]

void libMesh::Hex20::build_side_ptr ( std::unique_ptr< Elem > &  elem,
const unsigned int  i 
)
overridevirtual

Rebuilds a QUAD8 built coincident with face i.

Implements libMesh::Elem.

Definition at line 173 of file cell_hex20.C.

References libMesh::QUAD8.

175 {
176  this->simple_build_side_ptr<Hex20>(side, i, QUAD8);
177 }

◆ build_side_ptr() [3/4]

std::unique_ptr< const Elem > libMesh::Elem::build_side_ptr ( const unsigned int  i,
bool  proxy = false 
) const
inlineinherited

Definition at line 2659 of file elem.h.

References libMesh::Elem::build_side_ptr().

2660 {
2661  // Call the non-const version of this function, return the result as
2662  // a std::unique_ptr<const Elem>.
2663  Elem * me = const_cast<Elem *>(this);
2664  const Elem * s = const_cast<const Elem *>(me->build_side_ptr(i, proxy).release());
2665  return std::unique_ptr<const Elem>(s);
2666 }
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328

◆ build_side_ptr() [4/4]

void libMesh::Elem::build_side_ptr ( std::unique_ptr< const Elem > &  side,
const unsigned int  i 
) const
inlineinherited

Definition at line 2672 of file elem.h.

References libMesh::Elem::build_side_ptr().

2674 {
2675  // Hand off to the non-const version of this function
2676  Elem * me = const_cast<Elem *>(this);
2677  std::unique_ptr<Elem> e {const_cast<Elem *>(elem.release())};
2678  me->build_side_ptr(e, i);
2679  elem = std::move(e);
2680 }
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328

◆ build_with_id()

std::unique_ptr< Elem > libMesh::Elem::build_with_id ( const ElemType  type,
dof_id_type  id 
)
staticinherited

Calls the build() method above with a nullptr parent, and additionally sets the newly-created Elem's id.

This can be useful when adding pre-numbered Elems to a Mesh via add_elem() calls.

Definition at line 429 of file elem.C.

References libMesh::Elem::build(), and libMesh::Elem::type().

Referenced by libMesh::MeshTools::Subdivision::all_subdivision(), libMesh::MeshTools::Generation::build_cube(), GetBoundaryPointsTest::build_mesh(), SlitMeshTest::build_mesh(), OverlappingTestBase::build_quad_mesh(), libMesh::TetGenIO::element_in(), libMesh::Poly2TriTriangulator::insert_refinement_points(), libMesh::GmshIO::read_mesh(), libMesh::MatlabIO::read_stream(), NodalNeighborsTest::testOrientation(), EquationSystemsTest::testPostInitAddElem(), SystemsTest::testProjectMatrix3D(), InfFERadialTest::testRefinement(), libMesh::NetGenMeshInterface::triangulate(), and libMesh::Poly2TriTriangulator::triangulate_current_points().

431 {
432  // Call the other build() method with nullptr parent, then set the
433  // required id.
434  auto temp = Elem::build(type, nullptr);
435  temp->set_id(id);
436  return temp;
437 }
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
Definition: elem.C:321
virtual ElemType type() const =0

◆ center_node_on_side()

unsigned int libMesh::Elem::center_node_on_side ( const unsigned short  side) const
virtualinherited
Returns
The local index of the center node on the side side.

A center node is a node that is located at the centroid of the given side. If the given side does not have a center node, this will return invalid_uint.

Reimplemented in libMesh::Prism20, libMesh::Prism21, libMesh::Prism18, libMesh::Hex27, libMesh::RemoteElem, libMesh::Pyramid18, libMesh::Pyramid14, libMesh::Edge, libMesh::Tri7, libMesh::Tri6, libMesh::Quad9, and libMesh::Quad8.

Definition at line 3398 of file elem.C.

References libMesh::invalid_uint, and libMesh::Elem::n_sides().

3399 {
3400  libmesh_assert_less (side, this->n_sides());
3401  return invalid_uint;
3402 }
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:293
virtual unsigned int n_sides() const =0

◆ centroid()

Point libMesh::Elem::centroid ( ) const
virtualinherited

Calls Elem::vertex_average() for backwards compatibility.

Definition at line 449 of file elem.C.

References libMesh::err, and libMesh::Elem::vertex_average().

450 {
451  libmesh_do_once(libMesh::err
452  << "Elem::centroid() has been deprecated. Replace with either "
453  << "Elem::vertex_average() to maintain existing behavior, or "
454  << "the more expensive Elem::true_centroid() "
455  << "in cases where the true 'geometric' centroid is required."
456  << std::endl);
457  libmesh_deprecated();
458 
459  return Elem::vertex_average();
460 }
OStreamProxy err
Point vertex_average() const
Definition: elem.C:559

◆ child_neighbor() [1/2]

Elem * libMesh::Elem::child_neighbor ( Elem elem)
inlineinherited
Returns
If elem is a neighbor of a child of this element, a pointer to that child, otherwise nullptr.

Definition at line 2562 of file elem.h.

References libMesh::Elem::neighbor_ptr_range().

2563 {
2564  for (auto n : elem->neighbor_ptr_range())
2565  if (n && n->parent() == this)
2566  return n;
2567 
2568  return nullptr;
2569 }

◆ child_neighbor() [2/2]

const Elem * libMesh::Elem::child_neighbor ( const Elem elem) const
inlineinherited
Returns
If elem is a neighbor of a child of this element, a pointer to that child, otherwise nullptr.

Definition at line 2574 of file elem.h.

References libMesh::Elem::neighbor_ptr_range().

2575 {
2576  for (auto n : elem->neighbor_ptr_range())
2577  if (n && n->parent() == this)
2578  return n;
2579 
2580  return nullptr;
2581 }

◆ child_ptr() [1/2]

const Elem * libMesh::Elem::child_ptr ( unsigned int  i) const
inlineinherited
Returns
A constant pointer to the i^{th} child for this element. Do not call if this element has no children, i.e. is active.

Definition at line 3113 of file elem.h.

References libMesh::Elem::_children, and libMesh::libmesh_assert().

Referenced by libMesh::Elem::add_child(), libMesh::UnstructuredMesh::all_first_order(), libMesh::Elem::bracketing_nodes(), libMesh::Elem::coarsen(), libMesh::FEGenericBase< FEOutputType< T >::type >::coarsened_dof_values(), libMesh::TopologyMap::fill(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::Elem::is_child_on_edge(), libMesh::Elem::is_vertex_on_parent(), libMesh::Elem::make_links_to_me_remote(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::Elem::refine(), libMesh::Elem::replace_child(), libMesh::Parallel::sync_element_data_by_parent_id(), InfFERadialTest::testRefinement(), EquationSystemsTest::testRefineThenReinitPreserveFlags(), libMesh::BoundaryInfo::transfer_boundary_ids_from_children(), libMesh::Elem::which_child_am_i(), and libMesh::CheckpointIO::write_remote_elem().

3114 {
3117 
3118  return _children[i];
3119 }
libmesh_assert(ctx)
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element&#39;s children.
Definition: elem.h:2211

◆ child_ptr() [2/2]

Elem * libMesh::Elem::child_ptr ( unsigned int  i)
inlineinherited
Returns
A non-constant pointer to the i^{th} child for this element. Do not call if this element has no children, i.e. is active.

Definition at line 3122 of file elem.h.

References libMesh::Elem::_children, and libMesh::libmesh_assert().

3123 {
3126 
3127  return _children[i];
3128 }
libmesh_assert(ctx)
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element&#39;s children.
Definition: elem.h:2211

◆ child_ref_range() [1/2]

SimpleRange< Elem::ChildRefIter > libMesh::Elem::child_ref_range ( )
inlineinherited

Returns a range with all children of a parent element, usable in range-based for loops.

The exact type of the return value here may be subject to change in future libMesh releases, but the iterators will always dereference to produce a reference to a child element.

Definition at line 2296 of file elem.h.

References libMesh::Elem::_children, libMesh::libmesh_assert(), and libMesh::Elem::n_children().

Referenced by libMesh::HPCoarsenTest::add_projection(), libMesh::Elem::ancestor(), libMesh::OldSolutionBase< Output, point_output >::check_old_context(), libMesh::Elem::coarsen(), libMesh::FEGenericBase< FEOutputType< T >::type >::coarsened_dof_values(), libMesh::connect_children(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::Elem::has_ancestor_children(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Elem >(), main(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::Elem::make_links_to_me_remote(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::Elem::max_descendant_p_level(), libMesh::Elem::min_new_p_level_by_neighbor(), libMesh::Elem::min_p_level_by_neighbor(), libMesh::Elem::set_p_level(), and libMesh::Partitioner::set_parent_processor_ids().

2297 {
2299  return {_children.get(), _children.get() + this->n_children()};
2300 }
virtual unsigned int n_children() const =0
libmesh_assert(ctx)
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element&#39;s children.
Definition: elem.h:2211

◆ child_ref_range() [2/2]

SimpleRange< Elem::ConstChildRefIter > libMesh::Elem::child_ref_range ( ) const
inlineinherited

Definition at line 2304 of file elem.h.

References libMesh::Elem::_children, libMesh::libmesh_assert(), and libMesh::Elem::n_children().

2305 {
2307  return {_children.get(), _children.get() + this->n_children()};
2308 }
virtual unsigned int n_children() const =0
libmesh_assert(ctx)
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element&#39;s children.
Definition: elem.h:2211

◆ clear_dofs()

void libMesh::DofObject::clear_dofs ( )
inlineinherited

Clear the DofMap data structures holding degree of freedom data.

If any extra integers are associated with this DofObject, their count and values are unchanged.

Definition at line 798 of file dof_object.h.

References libMesh::DofObject::set_n_systems().

799 {
800  this->set_n_systems(0);
801 }
void set_n_systems(const unsigned int s)
Sets the number of systems for this DofObject.
Definition: dof_object.C:150

◆ clear_old_dof_object()

void libMesh::DofObject::clear_old_dof_object ( )
inherited

Sets the old_dof_object to nullptr.

Definition at line 128 of file dof_object.C.

References libMesh::DofObject::old_dof_object.

Referenced by libMesh::DofObject::operator=(), libMesh::DofObject::set_old_dof_object(), and libMesh::DofObject::unpack_indexing().

129 {
130  this->old_dof_object.reset(nullptr);
131 }
std::unique_ptr< DofObject > old_dof_object
This object on the last mesh.
Definition: dof_object.h:88

◆ close_to_point()

bool libMesh::Elem::close_to_point ( const Point p,
Real  tol 
) const
virtualinherited
Returns
true if this element is "close" to the point p, where "close" is determined by the tolerance tol.

Reimplemented in libMesh::NodeElem.

Definition at line 2647 of file elem.C.

References libMesh::Elem::point_test().

Referenced by assemble_SchroedingerEquation(), libMesh::PointLocatorNanoflann::operator()(), and libMesh::PointLocatorTree::operator()().

2648 {
2649  // This test uses the user's passed-in tolerance for the
2650  // bounding box test as well, thereby allowing the routine to
2651  // find points which are not only "in" the element, but also
2652  // "nearby" to within some tolerance.
2653  return this->point_test(p, tol, tol);
2654 }
bool point_test(const Point &p, Real box_tol, Real map_tol) const
Shared private implementation used by the contains_point() and close_to_point() routines.
Definition: elem.C:2659

◆ coarsen()

void libMesh::Elem::coarsen ( )
inherited

Coarsen the element.

This function is non-virtual since it is the same for all element types.

Definition at line 163 of file elem_refinement.C.

References libMesh::Elem::active(), libMesh::TypeVector< T >::add_scaled(), libMesh::Elem::child_ptr(), libMesh::Elem::child_ref_range(), libMesh::Elem::COARSEN, libMesh::Elem::COARSEN_INACTIVE, libMesh::Elem::embedding_matrix(), libMesh::Elem::INACTIVE, libMesh::Elem::JUST_COARSENED, libMesh::libmesh_assert(), libMesh::Elem::n_children(), libMesh::Elem::n_nodes(), libMesh::Elem::node_index_range(), libMesh::Elem::point(), libMesh::Real, libMesh::Elem::refinement_flag(), libMesh::remote_elem, libMesh::Elem::set_p_level(), and libMesh::Elem::set_refinement_flag().

164 {
165  libmesh_assert_equal_to (this->refinement_flag(), Elem::COARSEN_INACTIVE);
166  libmesh_assert (!this->active());
167 
168  // We no longer delete children until MeshRefinement::contract()
169 
170  unsigned int parent_p_level = 0;
171 
172  const unsigned int n_n = this->n_nodes();
173 
174  // re-compute hanging node nodal locations
175  for (unsigned int c = 0, nc = this->n_children(); c != nc; ++c)
176  {
177  Elem * mychild = this->child_ptr(c);
178  if (mychild == remote_elem)
179  continue;
180  for (auto cnode : mychild->node_index_range())
181  {
182  Point new_pos;
183  bool calculated_new_pos = false;
184 
185  for (unsigned int n=0; n<n_n; n++)
186  {
187  // The value from the embedding matrix
188  const Real em_val = this->embedding_matrix(c,cnode,n);
189 
190  // The node location is somewhere between existing vertices
191  if ((em_val != 0.) && (em_val != 1.))
192  {
193  new_pos.add_scaled (this->point(n), em_val);
194  calculated_new_pos = true;
195  }
196  }
197 
198  if (calculated_new_pos)
199  {
200  //Move the existing node back into it's original location
201  for (unsigned int i=0; i<LIBMESH_DIM; i++)
202  {
203  Point & child_node = mychild->point(cnode);
204  child_node(i)=new_pos(i);
205  }
206  }
207  }
208  }
209 
210  for (auto & mychild : this->child_ref_range())
211  {
212  if (&mychild == remote_elem)
213  continue;
214  libmesh_assert_equal_to (mychild.refinement_flag(), Elem::COARSEN);
215  mychild.set_refinement_flag(Elem::INACTIVE);
216  if (mychild.p_level() > parent_p_level)
217  parent_p_level = mychild.p_level();
218  }
219 
221  this->set_p_level(parent_p_level);
222 
223  libmesh_assert (this->active());
224 }
void set_p_level(const unsigned int p)
Sets the value of the p-refinement level for the element.
RefinementState refinement_flag() const
Definition: elem.h:3160
void set_refinement_flag(const RefinementState rflag)
Sets the value of the refinement flag for the element.
Definition: elem.h:3168
virtual unsigned int n_children() const =0
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
Definition: elem.h:2296
virtual Real embedding_matrix(const unsigned int child_num, const unsigned int child_node_num, const unsigned int parent_node_num) const =0
virtual unsigned int n_nodes() const =0
libmesh_assert(ctx)
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
bool active() const
Definition: elem.h:2891
const Point & point(const unsigned int i) const
Definition: elem.h:2390
const Elem * child_ptr(unsigned int i) const
Definition: elem.h:3113
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ complete_order_equivalent_type()

ElemType libMesh::Elem::complete_order_equivalent_type ( const ElemType  et)
staticinherited
Returns
The ElemType of the associated "complete" order element (which will be the same as the input if the input is already a complete-order ElemType), or INVALID_ELEM for elements that cannot be converted into complete-order equivalents.

The "complete" version of an element is an element which can represent the same geometry but which has nodes available to restore degrees of freedom on any vertex, edge, or face.

For example, when this is a TET4, then TET14 is returned.

Definition at line 3190 of file elem.C.

References libMesh::EDGE2, libMesh::EDGE3, libMesh::EDGE4, libMesh::Utility::enum_to_string(), libMesh::HEX20, libMesh::HEX27, libMesh::HEX8, libMesh::INFEDGE2, libMesh::INFHEX16, libMesh::INFHEX18, libMesh::INFHEX8, libMesh::INFPRISM12, libMesh::INFPRISM6, libMesh::INFQUAD4, libMesh::INFQUAD6, libMesh::NODEELEM, libMesh::PRISM15, libMesh::PRISM18, libMesh::PRISM20, libMesh::PRISM21, libMesh::PRISM6, libMesh::PYRAMID13, libMesh::PYRAMID14, libMesh::PYRAMID18, libMesh::PYRAMID5, libMesh::QUAD4, libMesh::QUAD8, libMesh::QUAD9, libMesh::QUADSHELL4, libMesh::QUADSHELL8, libMesh::QUADSHELL9, libMesh::TET10, libMesh::TET14, libMesh::TET4, libMesh::TRI3, libMesh::TRI6, libMesh::TRI7, and libMesh::TRISHELL3.

Referenced by libMesh::UnstructuredMesh::all_complete_order_range().

3191 {
3192  switch (et)
3193  {
3194  case NODEELEM:
3195  return NODEELEM;
3196  case EDGE2:
3197  case EDGE3:
3198  return EDGE3;
3199 
3200  case EDGE4:
3201  return EDGE4;
3202 
3203  case TRI3:
3204  case TRI6:
3205  case TRI7:
3206  return TRI7;
3207 
3208  // Currently there is no TRISHELL6, so similarly to other types
3209  // where this is the case, we just return the input.
3210  case TRISHELL3:
3211  return TRISHELL3;
3212 
3213  case QUAD4:
3214  case QUAD8:
3215  case QUAD9:
3216  return QUAD9;
3217 
3218  case QUADSHELL4:
3219  case QUADSHELL8:
3220  case QUADSHELL9:
3221  return QUADSHELL9;
3222 
3223  case TET4:
3224  case TET10:
3225  case TET14:
3226  return TET14;
3227 
3228  case HEX8:
3229  case HEX20:
3230  case HEX27:
3231  return HEX27;
3232 
3233  // We don't strictly need the 21st node for DoFs, but some code
3234  // depends on it for e.g. refinement patterns
3235  case PRISM6:
3236  case PRISM15:
3237  case PRISM18:
3238  case PRISM20:
3239  case PRISM21:
3240  return PRISM21;
3241 
3242  case PYRAMID5:
3243  case PYRAMID13:
3244  case PYRAMID14:
3245  case PYRAMID18:
3246  return PYRAMID18;
3247 
3248 
3249 
3250 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
3251  case INFEDGE2:
3252  return INFEDGE2;
3253 
3254  case INFQUAD4:
3255  case INFQUAD6:
3256  return INFQUAD6;
3257 
3258  case INFHEX8:
3259  case INFHEX16:
3260  case INFHEX18:
3261  return INFHEX18;
3262 
3263  // Probably ought to implement INFPRISM13 and/or 14; until then
3264  // we'll just return the not-complete-order ElemType, in
3265  // accordance which what seems like bad precedent...
3266  case INFPRISM6:
3267  case INFPRISM12:
3268  return INFPRISM12;
3269 #endif // LIBMESH_ENABLE_INFINITE_ELEMENTS
3270 
3271  default:
3272  {
3273  // what did we miss?
3274  libmesh_error_msg("No complete order equivalent element type for et = "
3275  << Utility::enum_to_string(et));
3276  }
3277  }
3278 }
std::string enum_to_string(const T e)

◆ compute_key() [1/4]

dof_id_type libMesh::Elem::compute_key ( dof_id_type  n0)
inlinestaticprotectedinherited

◆ compute_key() [2/4]

dof_id_type libMesh::Elem::compute_key ( dof_id_type  n0,
dof_id_type  n1 
)
inlinestaticprotectedinherited
Returns
A hash key computed from two node ids.

Definition at line 3252 of file elem.h.

References libMesh::Utility::hashword2().

3254 {
3255  // Order the two so that n0 < n1
3256  if (n0 > n1) std::swap (n0, n1);
3257 
3258  return Utility::hashword2(n0, n1);
3259 }
uint32_t hashword2(const uint32_t &first, const uint32_t &second, uint32_t initval=0)
This is a hard-coded version of hashword for hashing exactly 2 numbers.
Definition: hashword.h:215

◆ compute_key() [3/4]

dof_id_type libMesh::Elem::compute_key ( dof_id_type  n0,
dof_id_type  n1,
dof_id_type  n2 
)
inlinestaticprotectedinherited
Returns
A hash key computed from three node ids.

Definition at line 3264 of file elem.h.

References libMesh::Utility::hashword().

3267 {
3268  std::array<dof_id_type, 3> array = {{n0, n1, n2}};
3269  std::sort(array.begin(), array.end());
3270  return Utility::hashword(array);
3271 }
uint32_t hashword(const uint32_t *k, size_t length, uint32_t initval=0)
The hashword function takes an array of uint32_t&#39;s of length &#39;length&#39; and computes a single key from ...
Definition: hashword.h:158

◆ compute_key() [4/4]

dof_id_type libMesh::Elem::compute_key ( dof_id_type  n0,
dof_id_type  n1,
dof_id_type  n2,
dof_id_type  n3 
)
inlinestaticprotectedinherited
Returns
A hash key computed from four node ids.

Definition at line 3276 of file elem.h.

References libMesh::Utility::hashword().

3280 {
3281  std::array<dof_id_type, 4> array = {{n0, n1, n2, n3}};
3282  std::sort(array.begin(), array.end());
3283  return Utility::hashword(array);
3284 }
uint32_t hashword(const uint32_t *k, size_t length, uint32_t initval=0)
The hashword function takes an array of uint32_t&#39;s of length &#39;length&#39; and computes a single key from ...
Definition: hashword.h:158

◆ connectivity()

void libMesh::Hex20::connectivity ( const unsigned int  sc,
const IOPackage  iop,
std::vector< dof_id_type > &  conn 
) const
overridevirtual
Returns
The connectivity for this element in a specific format, which is specified by the IOPackage tag.

Implements libMesh::Elem.

Definition at line 217 of file cell_hex20.C.

References libMesh::Elem::_nodes, libMesh::INVALID_IO_PACKAGE, libMesh::libmesh_assert(), n_sub_elem(), libMesh::Elem::node_id(), libMesh::TECPLOT, and libMesh::VTK.

220 {
222  libmesh_assert_less (sc, this->n_sub_elem());
223  libmesh_assert_not_equal_to (iop, INVALID_IO_PACKAGE);
224 
225 
226  switch (iop)
227  {
228  case TECPLOT:
229  {
230  switch (sc)
231  {
232  case 0:
233  conn.resize(8);
234  conn[0] = this->node_id(0)+1;
235  conn[1] = this->node_id(1)+1;
236  conn[2] = this->node_id(2)+1;
237  conn[3] = this->node_id(3)+1;
238  conn[4] = this->node_id(4)+1;
239  conn[5] = this->node_id(5)+1;
240  conn[6] = this->node_id(6)+1;
241  conn[7] = this->node_id(7)+1;
242 
243  return;
244 
245  default:
246  libmesh_error_msg("Unknown sc = " << sc);
247  }
248  }
249 
250  case VTK:
251  {
252  switch (sc)
253  {
254  case 0:
255  conn.resize(20);
256  conn[0] = this->node_id(0);
257  conn[1] = this->node_id(1);
258  conn[2] = this->node_id(2);
259  conn[3] = this->node_id(3);
260  conn[4] = this->node_id(4);
261  conn[5] = this->node_id(5);
262  conn[6] = this->node_id(6);
263  conn[7] = this->node_id(7);
264  conn[8] = this->node_id(8);
265  conn[9] = this->node_id(9);
266  conn[10] = this->node_id(10);
267  conn[11] = this->node_id(11);
268  conn[12] = this->node_id(16);
269  conn[13] = this->node_id(17);
270  conn[14] = this->node_id(18);
271  conn[15] = this->node_id(19);
272  conn[16] = this->node_id(12);
273  conn[17] = this->node_id(13);
274  conn[18] = this->node_id(14);
275  conn[19] = this->node_id(15);
276  return;
277 
278  default:
279  libmesh_error_msg("Unknown sc = " << sc);
280  }
281  }
282 
283  default:
284  libmesh_error_msg("Unsupported IO package " << iop);
285  }
286 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
libmesh_assert(ctx)
virtual unsigned int n_sub_elem() const override
Definition: cell_hex20.h:101
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:2412

◆ contains_edge_of()

bool libMesh::Elem::contains_edge_of ( const Elem e) const
inherited
Returns
true if an edge of e is contained in this element. (Internally, this is done by checking whether at least two vertices of e are contained in this element).

Definition at line 843 of file elem.C.

References libMesh::Elem::contains_point(), libMesh::make_range(), libMesh::Elem::n_vertices(), and libMesh::Elem::point().

Referenced by libMesh::Elem::find_edge_neighbors().

844 {
845  unsigned int num_contained_edges = 0;
846 
847  // Our vertices are the first numbered nodes
848  for (auto n : make_range(e->n_vertices()))
849  {
850  if (this->contains_point(e->point(n)))
851  {
852  num_contained_edges++;
853  if (num_contained_edges>=2)
854  {
855  return true;
856  }
857  }
858  }
859  return false;
860 }
virtual bool contains_point(const Point &p, Real tol=TOLERANCE) const
Definition: elem.C:2622
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140

◆ contains_point()

bool libMesh::Elem::contains_point ( const Point p,
Real  tol = TOLERANCE 
) const
virtualinherited
Returns
true if the physical point p is contained in this element, false otherwise.

For linear elements, performs an initial tight bounding box check (as an optimization step) and (if that passes) then uses the user-defined tolerance "tol" in a call to inverse_map() to actually test if the point is in the element. For quadratic elements, the bounding box optimization is skipped, and only the inverse_map() steps are performed.

Note
This routine should not be used to determine if a point is merely "nearby" an element to within some tolerance. For that, use Elem::close_to_point() instead.

Reimplemented in libMesh::NodeElem, libMesh::Tet4, libMesh::InfHex, libMesh::InfPrism, libMesh::Tri3, and libMesh::InfQuad4.

Definition at line 2622 of file elem.C.

References libMesh::err, libMesh::Elem::point_test(), and libMesh::TOLERANCE.

Referenced by libMesh::Elem::contains_edge_of(), libMesh::Elem::contains_vertex_of(), libMesh::Elem::find_edge_neighbors(), libMesh::Elem::find_point_neighbors(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_constraints(), libMesh::PointLocatorNanoflann::operator()(), libMesh::PointLocatorTree::operator()(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), NavierSystem::side_constraint(), RationalMapTest< elem_type >::testContainsPoint(), PointLocatorTest::testLocator(), and PointLocatorTest::testPlanar().

2623 {
2624  // We currently allow the user to enlarge the bounding box by
2625  // providing a tol > TOLERANCE (so this routine is identical to
2626  // Elem::close_to_point()), but print a warning so that the
2627  // user can eventually switch his code over to calling close_to_point()
2628  // instead, which is intended to be used for this purpose.
2629  if (tol > TOLERANCE)
2630  {
2631  libmesh_do_once(libMesh::err
2632  << "WARNING: Resizing bounding box to match user-specified tolerance!\n"
2633  << "In the future, calls to Elem::contains_point() with tol > TOLERANCE\n"
2634  << "will be more optimized, but should not be used\n"
2635  << "to search for points 'close to' elements!\n"
2636  << "Instead, use Elem::close_to_point() for this purpose.\n"
2637  << std::endl;);
2638  return this->point_test(p, tol, tol);
2639  }
2640  else
2641  return this->point_test(p, TOLERANCE, tol);
2642 }
OStreamProxy err
static constexpr Real TOLERANCE
bool point_test(const Point &p, Real box_tol, Real map_tol) const
Shared private implementation used by the contains_point() and close_to_point() routines.
Definition: elem.C:2659

◆ contains_vertex_of()

bool libMesh::Elem::contains_vertex_of ( const Elem e,
bool  mesh_connection = false 
) const
inherited
Returns
true if a vertex of e is contained in this element. If mesh_connection is true, looks specifically for containment possibilities of an element e that is connected to this via membership in the same manifold of the same mesh.

Definition at line 805 of file elem.C.

References libMesh::Elem::contains_point(), libMesh::Elem::level(), libMesh::make_range(), libMesh::Elem::n_vertices(), libMesh::Elem::node_ptr(), libMesh::Elem::node_ref(), and libMesh::Elem::point().

806 {
807  // Our vertices are the first numbered nodes
808  const unsigned int nv = e->n_vertices();
809  const unsigned int my_nv = this->n_vertices();
810 
811  // Check for vertex-to-vertex containment first; contains_point() is
812  // expensive
813  for (auto n : make_range(nv))
814  {
815  const Node * vertex = e->node_ptr(n);
816  for (auto my_n : make_range(my_nv))
817  if (&this->node_ref(my_n) == vertex)
818  return true;
819  }
820 
821  // If e is in our mesh, then we might be done testing
822  if (mesh_connection)
823  {
824  const unsigned int l = this->level();
825  const unsigned int el = e->level();
826 
827  if (l >= el)
828  return false;
829 
830  // We could also return false for l==el-1 iff we knew we had no
831  // triangular faces, but we don't have an API to check that.
832  }
833 
834  // Our vertices are the first numbered nodes
835  for (auto n : make_range(nv))
836  if (this->contains_point(e->point(n)))
837  return true;
838  return false;
839 }
virtual bool contains_point(const Point &p, Real tol=TOLERANCE) const
Definition: elem.C:2622
const Node & node_ref(const unsigned int i) const
Definition: elem.h:2466
unsigned int level() const
Definition: elem.h:3024
virtual unsigned int n_vertices() const =0
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140

◆ contract()

void libMesh::Elem::contract ( )
inherited

Contract an active element, i.e.

remove pointers to any subactive children. This should only be called via MeshRefinement::contract, which will also remove subactive children from the mesh.

Definition at line 228 of file elem_refinement.C.

References libMesh::Elem::_children, libMesh::Elem::active(), libMesh::Elem::DO_NOTHING, libMesh::Elem::JUST_COARSENED, libMesh::libmesh_assert(), libMesh::Elem::refinement_flag(), and libMesh::Elem::set_refinement_flag().

229 {
230  // Subactive elements get deleted entirely, not contracted
231  libmesh_assert (this->active());
232 
233  // Active contracted elements no longer can have children
234  _children.reset(nullptr);
235 
236  if (this->refinement_flag() == Elem::JUST_COARSENED)
238 }
RefinementState refinement_flag() const
Definition: elem.h:3160
void set_refinement_flag(const RefinementState rflag)
Sets the value of the refinement flag for the element.
Definition: elem.h:3168
libmesh_assert(ctx)
bool active() const
Definition: elem.h:2891
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element&#39;s children.
Definition: elem.h:2211

◆ debug_buffer()

void libMesh::DofObject::debug_buffer ( ) const
inherited

Print our buffer for debugging.

Definition at line 660 of file dof_object.C.

References libMesh::DofObject::_idx_buf, libMesh::MeshTools::Generation::Private::idx(), and libMesh::out.

661 {
662  libMesh::out << " [ ";
663  for (const auto & idx : _idx_buf)
664  libMesh::out << idx << " ";
665  libMesh::out << "]\n";
666 }
OStreamProxy out
index_buffer_t _idx_buf
Definition: dof_object.h:680
unsigned int idx(const ElemType type, const unsigned int nx, const unsigned int i, const unsigned int j)
A useful inline function which replaces the macros used previously.

◆ default_order()

Order libMesh::Hex20::default_order ( ) const
overridevirtual
Returns
SECOND.

Implements libMesh::Elem.

Definition at line 158 of file cell_hex20.C.

References libMesh::SECOND.

159 {
160  return SECOND;
161 }

◆ default_side_order()

virtual Order libMesh::Elem::default_side_order ( ) const
inlinevirtualinherited
Returns
The default approximation order for side elements of this element type. This may be lower for elements with 'bubble functions' in the Lagrange basis.

Reimplemented in libMesh::Tri7.

Definition at line 972 of file elem.h.

References libMesh::Elem::default_order().

Referenced by libMesh::FEAbstract::compute_node_constraints(), and libMesh::FEAbstract::compute_periodic_node_constraints().

972 { return default_order(); }
virtual Order default_order() const =0

◆ dim()

virtual unsigned short libMesh::Cell::dim ( ) const
inlineoverridevirtualinherited
Returns
3, the dimensionality of the object.

Implements libMesh::Elem.

Definition at line 61 of file cell.h.

61 { return 3; }

◆ disable_print_counter_info() [1/2]

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

101 {
102  _enable_print_counter = false;
103  return;
104 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ disable_print_counter_info() [2/2]

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

101 {
102  _enable_print_counter = false;
103  return;
104 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ disconnected_clone()

std::unique_ptr< Elem > libMesh::Elem::disconnected_clone ( ) const
virtualinherited
Returns
An Elem of the same type as this, wrapped in a smart pointer.

This is not a complete clone() method (since e.g. it does not set node pointers; the standard use case reassigns node pointers from a different mesh), but it is necessary to use this instead of build() for runtime-polymorphic elements like Polygon subtypes whose "type" depends on more than their type(), and it is useful to use this for elements whose id, unique_id, extra integers, etc. should be preserved in the near-clone.

Definition at line 287 of file elem.C.

References libMesh::Elem::build(), libMesh::C0POLYGON, libMesh::DofObject::id(), libMesh::Elem::mapping_data(), libMesh::Elem::mapping_type(), libMesh::DofObject::n_extra_integers(), libMesh::Elem::n_sides(), libMesh::DofObject::processor_id(), libMesh::Elem::subdomain_id(), libMesh::Elem::type(), and libMesh::DofObject::unique_id().

Referenced by libMesh::UnstructuredMesh::copy_nodes_and_elements(), and libMesh::Elem::true_centroid().

288 {
289  std::unique_ptr<Elem> returnval;
290 
291  switch (this->type())
292  {
293  case C0POLYGON:
294  returnval = std::make_unique<C0Polygon>(this->n_sides());
295  break;
296 
297  default:
298  returnval = Elem::build(this->type());
299  }
300 
301  returnval->set_id() = this->id();
302 #ifdef LIBMESH_ENABLE_UNIQUE_ID
303  returnval->set_unique_id(this->unique_id());
304 #endif
305  returnval->subdomain_id() = this->subdomain_id();
306  returnval->processor_id() = this->processor_id();
307 
308  const auto n_elem_ints = this->n_extra_integers();
309  returnval->add_extra_integers(n_elem_ints);
310  for (unsigned int i = 0; i != n_elem_ints; ++i)
311  returnval->set_extra_integer(i, this->get_extra_integer(i));
312 
313  returnval->set_mapping_type(this->mapping_type());
314  returnval->set_mapping_data(this->mapping_data());
315 
316  return returnval;
317 }
unsigned char mapping_data() const
Definition: elem.h:3086
unique_id_type unique_id() const
Definition: dof_object.h:844
ElemMappingType mapping_type() const
Definition: elem.h:3070
dof_id_type id() const
Definition: dof_object.h:828
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
Definition: elem.C:321
virtual unsigned int n_sides() const =0
subdomain_id_type subdomain_id() const
Definition: elem.h:2504
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
Definition: dof_object.h:1170
processor_id_type processor_id() const
Definition: dof_object.h:905
virtual ElemType type() const =0

◆ dof_number() [1/2]

dof_id_type libMesh::DofObject::dof_number ( const unsigned int  s,
const unsigned int  var,
const unsigned int  comp 
) const
inlineinherited
Returns
The global degree of freedom number for variable var, component comp for system s associated with this DofObject

When partitioning and DoF numbering have been performed by libMesh, every current DoF on this DofObject will belong to its processor.

Definition at line 1032 of file dof_object.h.

References libMesh::DofObject::n_comp(), libMesh::DofObject::n_comp_group(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_vars(), and libMesh::DofObject::var_to_vg_and_offset().

Referenced by libMesh::DofMap::_dof_indices(), libMesh::DofMap::_node_dof_indices(), libMesh::DofMap::allgather_recursive_constraints(), assemble_matrix_and_rhs(), assemble_shell(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), libMesh::DofMap::constrain_p_dofs(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::dof_indices(), libMesh::DofObject::DofObject(), libMesh::OldSolutionCoefs< Output, point_output >::eval_at_node(), libMesh::OldSolutionValue< Output, point_output >::eval_at_node(), libMesh::OldSolutionCoefs< Output, point_output >::eval_mixed_derivatives(), libMesh::OldSolutionValue< Output, point_output >::eval_mixed_derivatives(), libMesh::OldSolutionCoefs< Output, point_output >::eval_old_dofs(), libMesh::OldSolutionValue< Output, point_output >::eval_old_dofs(), fill_dirichlet_bc(), libMesh::Node::get_info(), libMesh::Elem::get_info(), libMesh::DofMap::local_variable_indices(), main(), libMesh::DofMap::old_dof_indices(), libMesh::BuildProjectionList::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::operator()(), libMesh::DofObject::operator=(), libMesh::DofObject::print_dof_info(), libMesh::DofMap::process_mesh_constraint_rows(), LinearElasticityWithContact::residual_and_jacobian(), libMesh::HPCoarsenTest::select_refinement(), libMesh::DofObject::set_dof_number(), libMesh::DofMap::set_nonlocal_dof_objects(), ParsedFEMFunctionTest::setUp(), DofObjectTest< Node >::testJensEftangBug(), DofObjectTest< Node >::testManualDofCalculation(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), libMesh::DTKAdapter::update_variable_values(), and libMesh::Nemesis_IO_Helper::write_nodal_solution().

1035 {
1036  libmesh_assert_less (s, this->n_systems());
1037  libmesh_assert_less (var, this->n_vars(s));
1038  libmesh_assert_less (comp, this->n_comp(s,var));
1039 
1040  const std::pair<unsigned int, unsigned int>
1041  vg_vig = this->var_to_vg_and_offset(s,var);
1042 
1043  const unsigned int
1044  n_comp = this->n_comp_group(s,vg_vig.first);
1045 
1046  return this->dof_number(s, vg_vig.first, vg_vig.second,
1047  comp, n_comp);
1048 }
dof_id_type dof_number(const unsigned int s, const unsigned int var, const unsigned int comp) const
Definition: dof_object.h:1032
unsigned int n_comp(const unsigned int s, const unsigned int var) const
Definition: dof_object.h:1002
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
std::pair< unsigned int, unsigned int > var_to_vg_and_offset(const unsigned int s, const unsigned int var) const
Definition: dof_object.h:1200
unsigned int n_comp_group(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:1015

◆ dof_number() [2/2]

dof_id_type libMesh::DofObject::dof_number ( const unsigned int  s,
const unsigned int  vg,
const unsigned int  vig,
const unsigned int  comp,
const unsigned int  n_comp 
) const
inlineinherited
Returns
The global degree of freedom number for variable group vg, variable index vig within the group, component comp out of n_comp, for system s on this DofObject

Even users who need to call dof_number from user code probably don't want to call this overload.

Definition at line 1053 of file dof_object.h.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::invalid_id, libMesh::DofObject::n_comp(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), libMesh::DofObject::n_vars(), and libMesh::DofObject::start_idx().

1058 {
1059  libmesh_assert_less (s, this->n_systems());
1060  libmesh_assert_less (vg, this->n_var_groups(s));
1061  libmesh_assert_less (vig, this->n_vars(s,vg));
1062 
1063  const unsigned int
1064  start_idx_sys = this->start_idx(s);
1065 
1066  libmesh_assert_less ((start_idx_sys + 2*vg + 1), _idx_buf.size());
1067 
1068  const dof_id_type
1069  base_idx = _idx_buf[start_idx_sys + 2*vg + 1];
1070 
1071  // if the first component is invalid, they
1072  // are all invalid
1073  if (base_idx == invalid_id)
1074  return invalid_id;
1075 
1076  // otherwise the index is the first component
1077  // index augmented by the component number
1078  else
1079  return cast_int<dof_id_type>(base_idx + vig*n_comp + comp);
1080 }
unsigned int n_comp(const unsigned int s, const unsigned int var) const
Definition: dof_object.h:1002
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482
unsigned int start_idx(const unsigned int s) const
The starting index for system s.
Definition: dof_object.h:1249
index_buffer_t _idx_buf
Definition: dof_object.h:680
uint8_t dof_id_type
Definition: id_types.h:67

◆ edge_index_range()

IntRange< unsigned short > libMesh::Elem::edge_index_range ( ) const
inlineinherited
Returns
An integer range from 0 up to (but not including) the number of edges this element has.

Definition at line 2614 of file elem.h.

References libMesh::Elem::n_edges().

Referenced by libMesh::FEGenericBase< FEOutputType< T >::type >::coarsened_dof_values(), libMesh::BoundaryInfo::copy_boundary_ids(), libMesh::ElemCutter::find_intersection_points(), and libMesh::Elem::quality().

2615 {
2616  return {0, cast_int<unsigned short>(this->n_edges())};
2617 }
virtual unsigned int n_edges() const =0

◆ edges_adjacent_to_node()

std::vector< unsigned int > libMesh::Hex::edges_adjacent_to_node ( const unsigned int  int) const
overridevirtualinherited
Returns
the (local) edge numbers that touch the specified node

Implements libMesh::Elem.

Definition at line 263 of file cell_hex.C.

References libMesh::Hex::adjacent_edges_map, libMesh::Elem::is_edge(), libMesh::Elem::is_face(), libMesh::Elem::is_internal(), libMesh::Elem::is_vertex(), libMesh::libmesh_assert(), libMesh::Elem::n_nodes(), and libMesh::Hex::n_vertices().

264 {
265  libmesh_assert_less(n, this->n_nodes());
266 
267  // For vertices, we use the Hex::adjacent_edges_map, otherwise each
268  // of the mid-edge nodes is adjacent only to the edge it is on, and
269  // face/internal nodes are not adjacent to any edge.
270  if (this->is_vertex(n))
271  return {std::begin(adjacent_edges_map[n]), std::end(adjacent_edges_map[n])};
272  else if (this->is_edge(n))
273  return {n - this->n_vertices()};
274 
275  libmesh_assert(this->is_face(n) || this->is_internal(n));
276  return {};
277 }
virtual bool is_face(const unsigned int i) const =0
virtual unsigned int n_nodes() const =0
libmesh_assert(ctx)
virtual unsigned int n_vertices() const override final
Definition: cell_hex.h:85
virtual bool is_vertex(const unsigned int i) const =0
static const unsigned int adjacent_edges_map[8][3]
This maps the node to the (in this case) 3 edge ids adjacent to the node.
Definition: cell_hex.h:245
virtual bool is_edge(const unsigned int i) const =0
bool is_internal(const unsigned int i) const
Definition: elem.C:3437

◆ embedding_matrix()

virtual Real libMesh::Hex20::embedding_matrix ( const unsigned int  i,
const unsigned int  j,
const unsigned int  k 
) const
inlineoverrideprotectedvirtual

Matrix used to create the elements children.

Implements libMesh::Elem.

Definition at line 254 of file cell_hex20.h.

References _embedding_matrix.

257  { return _embedding_matrix[i][j][k]; }
static const Real _embedding_matrix[num_children][num_nodes][num_nodes]
Matrix that computes new nodal locations/solution values from current nodes/solution.
Definition: cell_hex20.h:263

◆ embedding_matrix_version()

virtual unsigned int libMesh::Elem::embedding_matrix_version ( ) const
inlinevirtualinherited
Returns
A "version number" that identifies which embedding matrix is in use.

Some element types may use a different embedding matrix depending on their geometric characteristics.

Reimplemented in libMesh::Tet.

Definition at line 2000 of file elem.h.

Referenced by libMesh::Elem::as_parent_node(), and libMesh::Elem::parent_bracketing_nodes().

2000 { return 0; }

◆ enable_print_counter_info() [1/2]

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info()

Definition at line 94 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

95 {
96  _enable_print_counter = true;
97  return;
98 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ enable_print_counter_info() [2/2]

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info()

Definition at line 94 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

95 {
96  _enable_print_counter = true;
97  return;
98 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ family_tree() [1/2]

void libMesh::Elem::family_tree ( std::vector< const Elem *> &  family,
bool  reset = true 
) const
inherited

Fills the vector family with the children of this element, recursively.

Calling this method on a twice-refined element will give you the element itself, its direct children, and their children, etc... When the optional parameter reset is true, the vector will be cleared before the element and its descendants are added.

The family tree only includes ancestor and active elements. To include subactive elements as well, use total_family_tree().

Definition at line 1972 of file elem.C.

References libMesh::ElemInternal::family_tree().

1974 {
1975  ElemInternal::family_tree(this, family, reset);
1976 }
void family_tree(T elem, std::vector< T > &family, bool reset=true)
Definition: elem_internal.h:41

◆ family_tree() [2/2]

void libMesh::Elem::family_tree ( std::vector< Elem *> &  family,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 1980 of file elem.C.

References libMesh::ElemInternal::family_tree().

1982 {
1983  ElemInternal::family_tree(this, family, reset);
1984 }
void family_tree(T elem, std::vector< T > &family, bool reset=true)
Definition: elem_internal.h:41

◆ family_tree_by_neighbor() [1/2]

void libMesh::Elem::family_tree_by_neighbor ( std::vector< const Elem *> &  family,
const Elem neighbor,
bool  reset = true 
) const
inherited

Same as the family_tree() member, but only adds elements which are next to neighbor.

Definition at line 2056 of file elem.C.

References libMesh::ElemInternal::family_tree_by_neighbor().

2059 {
2060  ElemInternal::family_tree_by_neighbor(this, family, neighbor, reset);
2061 }
void family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)

◆ family_tree_by_neighbor() [2/2]

void libMesh::Elem::family_tree_by_neighbor ( std::vector< Elem *> &  family,
Elem neighbor,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 2065 of file elem.C.

References libMesh::ElemInternal::family_tree_by_neighbor().

2068 {
2069  ElemInternal::family_tree_by_neighbor(this, family, neighbor, reset);
2070 }
void family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)

◆ family_tree_by_side() [1/2]

void libMesh::Elem::family_tree_by_side ( std::vector< const Elem *> &  family,
unsigned int  side,
bool  reset = true 
) const
inherited

Same as the family_tree() member, but only adds elements which are next to side.

Definition at line 2020 of file elem.C.

References libMesh::ElemInternal::family_tree_by_side().

Referenced by libMesh::Elem::make_links_to_me_local().

2023 {
2024  ElemInternal::family_tree_by_side(this, family, side, reset);
2025 }
void family_tree_by_side(T elem, std::vector< T > &family, unsigned int s, bool reset)

◆ family_tree_by_side() [2/2]

void libMesh::Elem::family_tree_by_side ( std::vector< Elem *> &  family,
unsigned int  side,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 2029 of file elem.C.

References libMesh::ElemInternal::family_tree_by_side().

2032 {
2033  ElemInternal::family_tree_by_side(this, family, side, reset);
2034 }
void family_tree_by_side(T elem, std::vector< T > &family, unsigned int s, bool reset)

◆ family_tree_by_subneighbor() [1/2]

void libMesh::Elem::family_tree_by_subneighbor ( std::vector< const Elem *> &  family,
const Elem neighbor,
const Elem subneighbor,
bool  reset = true 
) const
inherited

Same as the family_tree() member, but only adds elements which are next to subneighbor.

Only applicable when this->has_neighbor(neighbor) and neighbor->is_ancestor(subneighbor)

Definition at line 2092 of file elem.C.

References libMesh::ElemInternal::family_tree_by_subneighbor().

2096 {
2097  ElemInternal::family_tree_by_subneighbor(this, family, neighbor, subneighbor, reset);
2098 }
void family_tree_by_subneighbor(T elem, std::vector< T > &family, T neighbor_in, T subneighbor, bool reset=true)

◆ family_tree_by_subneighbor() [2/2]

void libMesh::Elem::family_tree_by_subneighbor ( std::vector< Elem *> &  family,
Elem neighbor,
Elem subneighbor,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 2102 of file elem.C.

References libMesh::ElemInternal::family_tree_by_subneighbor().

2106 {
2107  ElemInternal::family_tree_by_subneighbor(this, family, neighbor, subneighbor, reset);
2108 }
void family_tree_by_subneighbor(T elem, std::vector< T > &family, T neighbor_in, T subneighbor, bool reset=true)

◆ find_edge_neighbors() [1/2]

void libMesh::Elem::find_edge_neighbors ( const Point p1,
const Point p2,
std::set< const Elem *> &  neighbor_set 
) const
inherited

This function finds all active elements in the same manifold as this element which touch the current active element along the whole edge defined by the two points p1 and p2.

Definition at line 954 of file elem.C.

References libMesh::Elem::contains_point(), libMesh::Elem::find_point_neighbors(), and libMesh::libmesh_assert().

Referenced by libMesh::MeshRefinement::enforce_mismatch_limit_prior_to_refinement().

957 {
958  // Simple but perhaps suboptimal code: find elements containing the
959  // first point, then winnow this set down by removing elements which
960  // don't also contain the second point
961 
962  libmesh_assert(this->contains_point(p2));
963  this->find_point_neighbors(p1, neighbor_set);
964 
965  std::set<const Elem *>::iterator it = neighbor_set.begin();
966  const std::set<const Elem *>::iterator end = neighbor_set.end();
967 
968  while (it != end)
969  {
970  // As of C++11, set::erase returns an iterator to the element
971  // following the erased element, or end.
972  if (!(*it)->contains_point(p2))
973  it = neighbor_set.erase(it);
974  else
975  ++it;
976  }
977 }
virtual bool contains_point(const Point &p, Real tol=TOLERANCE) const
Definition: elem.C:2622
void find_point_neighbors(const Point &p, std::set< const Elem *> &neighbor_set) const
This function finds all active elements (including this one) which are in the same manifold as this e...
Definition: elem.C:864
libmesh_assert(ctx)

◆ find_edge_neighbors() [2/2]

void libMesh::Elem::find_edge_neighbors ( std::set< const Elem *> &  neighbor_set) const
inherited

This function finds all active elements in the same manifold as this element which touch the current active element along any edge (more precisely, at at least two points).

In this case, elements are included even if they do not touch a whole edge of this element.

Definition at line 981 of file elem.C.

References libMesh::Elem::contains_edge_of(), and libMesh::remote_elem.

982 {
983  neighbor_set.clear();
984  neighbor_set.insert(this);
985 
986  std::set<const Elem *> untested_set, next_untested_set;
987  untested_set.insert(this);
988 
989  while (!untested_set.empty())
990  {
991  // Loop over all the elements in the patch that haven't already
992  // been tested
993  for (const auto & elem : untested_set)
994  {
995  for (auto current_neighbor : elem->neighbor_ptr_range())
996  {
997  if (current_neighbor &&
998  current_neighbor != remote_elem) // we have a real neighbor on this side
999  {
1000  if (current_neighbor->active()) // ... if it is active
1001  {
1002  if (this->contains_edge_of(current_neighbor) // ... and touches us
1003  || current_neighbor->contains_edge_of(this))
1004  {
1005  // Make sure we'll test it
1006  if (!neighbor_set.count(current_neighbor))
1007  next_untested_set.insert (current_neighbor);
1008 
1009  // And add it
1010  neighbor_set.insert (current_neighbor);
1011  }
1012  }
1013 #ifdef LIBMESH_ENABLE_AMR
1014  else // ... the neighbor is *not* active,
1015  { // ... so add *all* neighboring
1016  // active children
1017  std::vector<const Elem *> active_neighbor_children;
1018 
1019  current_neighbor->active_family_tree_by_neighbor
1020  (active_neighbor_children, elem);
1021 
1022  for (const auto & current_child : active_neighbor_children)
1023  if (this->contains_edge_of(current_child) || current_child->contains_edge_of(this))
1024  {
1025  // Make sure we'll test it
1026  if (!neighbor_set.count(current_child))
1027  next_untested_set.insert (current_child);
1028 
1029  neighbor_set.insert (current_child);
1030  }
1031  }
1032 #endif // #ifdef LIBMESH_ENABLE_AMR
1033  }
1034  }
1035  }
1036  untested_set.swap(next_untested_set);
1037  next_untested_set.clear();
1038  }
1039 }
bool contains_edge_of(const Elem *e) const
Definition: elem.C:843
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ find_interior_neighbors() [1/2]

void libMesh::Elem::find_interior_neighbors ( std::set< const Elem *> &  neighbor_set) const
inherited

This function finds all active elements (not including this one) in the parent manifold of this element whose intersection with this element has non-zero measure.

Definition at line 1043 of file elem.C.

References libMesh::ElemInternal::find_interior_neighbors().

1044 {
1045  ElemInternal::find_interior_neighbors(this, neighbor_set);
1046 }
void find_interior_neighbors(T this_elem, std::set< T > &neighbor_set)

◆ find_interior_neighbors() [2/2]

void libMesh::Elem::find_interior_neighbors ( std::set< Elem *> &  neighbor_set)
inherited

Non-const version of function above that fills up a vector of non-const Elem pointers instead.

Definition at line 1050 of file elem.C.

References libMesh::ElemInternal::find_interior_neighbors().

1051 {
1052  ElemInternal::find_interior_neighbors(this, neighbor_set);
1053 }
void find_interior_neighbors(T this_elem, std::set< T > &neighbor_set)

◆ find_point_neighbors() [1/4]

void libMesh::Elem::find_point_neighbors ( const Point p,
std::set< const Elem *> &  neighbor_set 
) const
inherited

This function finds all active elements (including this one) which are in the same manifold as this element and which touch the current active element at the specified point, which should be a point in the current element.

Elements which are not "in the same manifold" (e.g. the interior_parent of a boundary element) will not be found with this method.

Elements which overlap the specified point but which are only connected to the current element via elements which do not overlap that point (e.g. in a folded or tangled mesh) are not considered to "touch" the current element and will not be found with this method.

Definition at line 864 of file elem.C.

References libMesh::Elem::active(), libMesh::Elem::contains_point(), libMesh::libmesh_assert(), and libMesh::remote_elem.

Referenced by libMesh::MeshFunction::check_found_elem(), libMesh::MeshRefinement::enforce_mismatch_limit_prior_to_refinement(), libMesh::Elem::find_edge_neighbors(), libMesh::Elem::find_point_neighbors(), libMesh::ReplicatedMesh::get_boundary_points(), libMesh::Elem::is_semilocal(), libMesh::GhostPointNeighbors::operator()(), and InfFERadialTest::testRefinement().

866 {
867  libmesh_assert(this->contains_point(p));
868  libmesh_assert(this->active());
869 
870  neighbor_set.clear();
871  neighbor_set.insert(this);
872 
873  std::set<const Elem *> untested_set, next_untested_set;
874  untested_set.insert(this);
875 
876 #ifdef LIBMESH_ENABLE_AMR
877  std::vector<const Elem *> active_neighbor_children;
878 #endif // #ifdef LIBMESH_ENABLE_AMR
879 
880  while (!untested_set.empty())
881  {
882  // Loop over all the elements in the patch that haven't already
883  // been tested
884  for (const auto & elem : untested_set)
885  for (auto current_neighbor : elem->neighbor_ptr_range())
886  {
887  if (current_neighbor &&
888  current_neighbor != remote_elem) // we have a real neighbor on this side
889  {
890  if (current_neighbor->active()) // ... if it is active
891  {
892  auto it = neighbor_set.lower_bound(current_neighbor);
893  if ((it == neighbor_set.end() || *it != current_neighbor) &&
894  current_neighbor->contains_point(p)) // ... don't have and touches p
895  {
896  // Add it and test it
897  next_untested_set.insert(current_neighbor);
898  neighbor_set.emplace_hint(it, current_neighbor);
899  }
900  }
901 #ifdef LIBMESH_ENABLE_AMR
902  else // ... the neighbor is *not* active,
903  { // ... so add *all* neighboring
904  // active children that touch p
905  active_neighbor_children.clear();
906  current_neighbor->active_family_tree_by_neighbor
907  (active_neighbor_children, elem);
908 
909  for (const auto & current_child : active_neighbor_children)
910  {
911  auto it = neighbor_set.lower_bound(current_child);
912  if ((it == neighbor_set.end() || *it != current_child) &&
913  current_child->contains_point(p))
914  {
915  // Add it and test it
916  next_untested_set.insert(current_child);
917  neighbor_set.emplace_hint(it, current_child);
918  }
919  }
920  }
921 #endif // #ifdef LIBMESH_ENABLE_AMR
922  }
923  }
924  untested_set.swap(next_untested_set);
925  next_untested_set.clear();
926  }
927 }
virtual bool contains_point(const Point &p, Real tol=TOLERANCE) const
Definition: elem.C:2622
libmesh_assert(ctx)
bool active() const
Definition: elem.h:2891
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ find_point_neighbors() [2/4]

void libMesh::Elem::find_point_neighbors ( std::set< const Elem *> &  neighbor_set) const
inherited

This function finds all active elements (including this one) in the same manifold as this element which touch this active element at any point.

Definition at line 931 of file elem.C.

References libMesh::Elem::find_point_neighbors().

932 {
933  this->find_point_neighbors(neighbor_set, this);
934 }
void find_point_neighbors(const Point &p, std::set< const Elem *> &neighbor_set) const
This function finds all active elements (including this one) which are in the same manifold as this e...
Definition: elem.C:864

◆ find_point_neighbors() [3/4]

void libMesh::Elem::find_point_neighbors ( std::set< const Elem *> &  neighbor_set,
const Elem start_elem 
) const
inherited

This function finds all active elements (including this one) in the same manifold as start_elem (which must be active and must touch this element) which touch this element at any point.

Definition at line 938 of file elem.C.

References libMesh::ElemInternal::find_point_neighbors().

940 {
941  ElemInternal::find_point_neighbors(this, neighbor_set, start_elem);
942 }
void find_point_neighbors(T this_elem, std::set< T > &neighbor_set, T start_elem)

◆ find_point_neighbors() [4/4]

void libMesh::Elem::find_point_neighbors ( std::set< Elem *> &  neighbor_set,
Elem start_elem 
)
inherited

Non-const version of function above.

Fills a set of non-const Elem pointers.

Definition at line 946 of file elem.C.

References libMesh::ElemInternal::find_point_neighbors().

948 {
949  ElemInternal::find_point_neighbors(this, neighbor_set, start_elem);
950 }
void find_point_neighbors(T this_elem, std::set< T > &neighbor_set, T start_elem)

◆ first_order_equivalent_type()

ElemType libMesh::Elem::first_order_equivalent_type ( const ElemType  et)
staticinherited
Returns
The element type of the associated first-order element, or INVALID_ELEM for first-order or other elements that cannot be converted into lower order equivalents.

For example, when this is a TET10, then TET4 is returned.

Definition at line 2937 of file elem.C.

References libMesh::EDGE2, libMesh::EDGE3, libMesh::EDGE4, libMesh::HEX20, libMesh::HEX27, libMesh::HEX8, libMesh::INFEDGE2, libMesh::INFHEX16, libMesh::INFHEX18, libMesh::INFHEX8, libMesh::INFPRISM12, libMesh::INFPRISM6, libMesh::INFQUAD4, libMesh::INFQUAD6, libMesh::INVALID_ELEM, libMesh::NODEELEM, libMesh::PRISM15, libMesh::PRISM18, libMesh::PRISM20, libMesh::PRISM21, libMesh::PRISM6, libMesh::PYRAMID13, libMesh::PYRAMID14, libMesh::PYRAMID18, libMesh::PYRAMID5, libMesh::QUAD4, libMesh::QUAD8, libMesh::QUAD9, libMesh::QUADSHELL4, libMesh::QUADSHELL8, libMesh::QUADSHELL9, libMesh::TET10, libMesh::TET14, libMesh::TET4, libMesh::TRI3, libMesh::TRI6, libMesh::TRI7, and libMesh::TRISHELL3.

Referenced by libMesh::UnstructuredMesh::all_first_order(), libMesh::ExodusII_IO_Helper::read_edge_blocks(), SideTest< ElemClass, side_type, indexbegin, indexend >::testSidePtr(), SideTest< ElemClass, side_type, indexbegin, indexend >::testSidePtrFill(), and libMesh::GMVIO::write_ascii_old_impl().

2938 {
2939  switch (et)
2940  {
2941  case NODEELEM:
2942  return NODEELEM;
2943  case EDGE2:
2944  case EDGE3:
2945  case EDGE4:
2946  return EDGE2;
2947  case TRI3:
2948  case TRI6:
2949  case TRI7:
2950  return TRI3;
2951  case TRISHELL3:
2952  return TRISHELL3;
2953  case QUAD4:
2954  case QUAD8:
2955  case QUAD9:
2956  return QUAD4;
2957  case QUADSHELL4:
2958  case QUADSHELL8:
2959  case QUADSHELL9:
2960  return QUADSHELL4;
2961  case TET4:
2962  case TET10:
2963  case TET14:
2964  return TET4;
2965  case HEX8:
2966  case HEX27:
2967  case HEX20:
2968  return HEX8;
2969  case PRISM6:
2970  case PRISM15:
2971  case PRISM18:
2972  case PRISM20:
2973  case PRISM21:
2974  return PRISM6;
2975  case PYRAMID5:
2976  case PYRAMID13:
2977  case PYRAMID14:
2978  case PYRAMID18:
2979  return PYRAMID5;
2980 
2981 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
2982 
2983  case INFEDGE2:
2984  return INFEDGE2;
2985  case INFQUAD4:
2986  case INFQUAD6:
2987  return INFQUAD4;
2988  case INFHEX8:
2989  case INFHEX16:
2990  case INFHEX18:
2991  return INFHEX8;
2992  case INFPRISM6:
2993  case INFPRISM12:
2994  return INFPRISM6;
2995 
2996 #endif
2997 
2998  default:
2999  // unknown element
3000  return INVALID_ELEM;
3001  }
3002 }

◆ flip()

void libMesh::Hex20::flip ( BoundaryInfo boundary_info)
finaloverridevirtual

Flips the element (by swapping node and neighbor pointers) to have a mapping Jacobian of opposite sign.

This is useful for automatically fixing up elements that have been newly created (e.g. from extrusions) with a negative Jacobian.

If boundary_info is not null, swap boundary side/edge ids consistently.

Implements libMesh::Elem.

Definition at line 762 of file cell_hex20.C.

References libMesh::libmesh_assert(), libMesh::Elem::swap2boundaryedges(), libMesh::Elem::swap2boundarysides(), libMesh::Elem::swap2neighbors(), and libMesh::Elem::swap2nodes().

763 {
764  libmesh_assert(boundary_info);
765 
766  swap2nodes(0,1);
767  swap2nodes(2,3);
768  swap2nodes(4,5);
769  swap2nodes(6,7);
770  swap2nodes(9,11);
771  swap2nodes(12,13);
772  swap2nodes(14,15);
773  swap2nodes(17,19);
774  swap2neighbors(2,4);
775  swap2boundarysides(2,4,boundary_info);
776  swap2boundaryedges(1,3,boundary_info);
777  swap2boundaryedges(4,5,boundary_info);
778  swap2boundaryedges(6,7,boundary_info);
779  swap2boundaryedges(9,11,boundary_info);
780 }
void swap2boundaryedges(unsigned short e1, unsigned short e2, BoundaryInfo *boundary_info) const
Swaps two edges in boundary_info, if it is non-null.
Definition: elem.C:3421
void swap2boundarysides(unsigned short s1, unsigned short s2, BoundaryInfo *boundary_info) const
Swaps two sides in boundary_info, if it is non-null.
Definition: elem.C:3405
void swap2nodes(unsigned int n1, unsigned int n2)
Swaps two node_ptrs.
Definition: elem.h:2041
libmesh_assert(ctx)
void swap2neighbors(unsigned int n1, unsigned int n2)
Swaps two neighbor_ptrs.
Definition: elem.h:2051

◆ get_extra_datum()

template<typename T >
T libMesh::DofObject::get_extra_datum ( const unsigned int  index) const
inlineinherited

Gets the value on this object of the extra datum associated with index, which should have been obtained via a call to MeshBase::add_elem_datum or MeshBase::add_node_datum using the same type T.

Definition at line 1146 of file dof_object.h.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::n_extra_integers(), libMesh::DofObject::n_systems(), and libMesh::DofObject::start_idx_ints().

Referenced by libMesh::Elem::get_info(), libMesh::VTKIO::nodes_to_vtk(), libMesh::rational_fe_shape(), libMesh::rational_fe_shape_deriv(), libMesh::rational_fe_shape_second_deriv(), libMesh::rational_fe_weighted_shapes(), libMesh::rational_fe_weighted_shapes_derivs(), libMesh::ExodusII_IO::read(), and DofObjectTest< Node >::testAddExtraData().

1147 {
1148 #ifndef NDEBUG
1149  const unsigned int n_more_integers = (sizeof(T)-1)/sizeof(dof_id_type);
1150 #endif
1151  libmesh_assert_less(index+n_more_integers, this->n_extra_integers());
1152  libmesh_assert_less(this->n_systems(), _idx_buf.size());
1153 
1154  const unsigned int start_idx_i = this->start_idx_ints();
1155 
1156  libmesh_assert_less(start_idx_i+index+n_more_integers, _idx_buf.size());
1157  T returnval;
1158  std::memcpy(&returnval, &_idx_buf[start_idx_i+index], sizeof(T));
1159  return returnval;
1160 }
unsigned int start_idx_ints() const
The starting index for an extra_integers pseudosystem.
Definition: dof_object.h:1273
unsigned int n_systems() const
Definition: dof_object.h:937
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
Definition: dof_object.h:1170
index_buffer_t _idx_buf
Definition: dof_object.h:680
uint8_t dof_id_type
Definition: id_types.h:67

◆ get_extra_integer()

dof_id_type libMesh::DofObject::get_extra_integer ( const unsigned int  index) const
inlineinherited

Gets the value on this object of the extra integer associated with index, which should have been obtained via a call to MeshBase::add_elem_integer or MeshBase::add_node_integer.

Definition at line 1102 of file dof_object.h.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::n_extra_integers(), libMesh::DofObject::n_systems(), and libMesh::DofObject::start_idx_ints().

Referenced by libMesh::MeshTools::Modification::all_tri(), WriteElemsetData::checkByCentroid(), libMesh::MeshTools::Modification::flatten(), libMesh::SyncElementIntegers::gather_data(), libMesh::XdrIO::pack_element(), libMesh::CheckpointIO::read_connectivity(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::DofObject::set_n_vars_per_group(), DofObjectTest< Node >::testAddExtraData(), DofObjectTest< Node >::testAddSystemExtraInts(), ExtraIntegersTest::testExtraIntegersExodusReading(), DofObjectTest< Node >::testSetNSystemsExtraInts(), DofObjectTest< Node >::testSetNVariableGroupsExtraInts(), and libMesh::XdrIO::write_serialized_nodes().

1103 {
1104  libmesh_assert_less(index, this->n_extra_integers());
1105  libmesh_assert_less(this->n_systems(), _idx_buf.size());
1106 
1107  const unsigned int start_idx_i = this->start_idx_ints();
1108 
1109  libmesh_assert_less(start_idx_i+index, _idx_buf.size());
1110  return _idx_buf[start_idx_i+index];
1111 }
unsigned int start_idx_ints() const
The starting index for an extra_integers pseudosystem.
Definition: dof_object.h:1273
unsigned int n_systems() const
Definition: dof_object.h:937
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
Definition: dof_object.h:1170
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ get_info() [1/3]

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

References libMesh::ReferenceCounter::_counts, and libMesh::Quality::name().

Referenced by libMesh::ReferenceCounter::print_info().

48 {
49 #if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50 
51  std::ostringstream oss;
52 
53  oss << '\n'
54  << " ---------------------------------------------------------------------------- \n"
55  << "| Reference count information |\n"
56  << " ---------------------------------------------------------------------------- \n";
57 
58  for (const auto & [name, cd] : _counts)
59  oss << "| " << name << " reference count information:\n"
60  << "| Creations: " << cd.first << '\n'
61  << "| Destructions: " << cd.second << '\n';
62 
63  oss << " ---------------------------------------------------------------------------- \n";
64 
65  return oss.str();
66 
67 #else
68 
69  return "";
70 
71 #endif
72 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
static Counts _counts
Actually holds the data.

◆ get_info() [2/3]

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

References libMesh::ReferenceCounter::_counts, and libMesh::Quality::name().

Referenced by libMesh::ReferenceCounter::print_info().

48 {
49 #if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50 
51  std::ostringstream oss;
52 
53  oss << '\n'
54  << " ---------------------------------------------------------------------------- \n"
55  << "| Reference count information |\n"
56  << " ---------------------------------------------------------------------------- \n";
57 
58  for (const auto & [name, cd] : _counts)
59  oss << "| " << name << " reference count information:\n"
60  << "| Creations: " << cd.first << '\n'
61  << "| Destructions: " << cd.second << '\n';
62 
63  oss << " ---------------------------------------------------------------------------- \n";
64 
65  return oss.str();
66 
67 #else
68 
69  return "";
70 
71 #endif
72 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
static Counts _counts
Actually holds the data.

◆ get_info() [3/3]

std::string libMesh::Elem::get_info ( ) const
inherited

Prints relevant information about the element to a string.

Definition at line 2794 of file elem.C.

References libMesh::Elem::active(), libMesh::Elem::ancestor(), libMesh::Elem::dim(), libMesh::DofObject::dof_number(), libMesh::Utility::enum_to_string(), libMesh::DofObject::get_extra_datum(), libMesh::Elem::has_children(), libMesh::Elem::hmax(), libMesh::Elem::hmin(), libMesh::DofObject::id(), libMesh::Elem::infinite(), libMesh::Elem::level(), libMesh::make_range(), libMesh::Elem::mapping_data(), libMesh::Elem::mapping_type(), libMesh::DofObject::n_comp(), libMesh::Elem::n_nodes(), libMesh::Elem::n_sides(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_vars(), libMesh::Elem::neighbor_ptr(), libMesh::Elem::node_index_range(), libMesh::Elem::node_ref(), libMesh::Elem::origin(), libMesh::Elem::p_level(), libMesh::Elem::p_refinement_flag(), libMesh::Elem::parent(), libMesh::DofObject::processor_id(), libMesh::RATIONAL_BERNSTEIN_MAP, libMesh::Real, libMesh::Elem::refinement_flag(), libMesh::Elem::side_index_range(), libMesh::Elem::subactive(), libMesh::Elem::subdomain_id(), libMesh::Elem::type(), libMesh::DofObject::unique_id(), libMesh::DofObject::valid_id(), libMesh::DofObject::valid_unique_id(), and libMesh::Elem::volume().

Referenced by libMesh::Elem::print_info().

2795 {
2796  std::ostringstream oss;
2797 
2798  oss << " Elem Information" << '\n'
2799  << " id()=";
2800 
2801  if (this->valid_id())
2802  oss << this->id();
2803  else
2804  oss << "invalid";
2805 
2806 #ifdef LIBMESH_ENABLE_UNIQUE_ID
2807  oss << ", unique_id()=";
2808  if (this->valid_unique_id())
2809  oss << this->unique_id();
2810  else
2811  oss << "invalid";
2812 #endif
2813 
2814  oss << ", subdomain_id()=" << this->subdomain_id();
2815  oss << ", processor_id()=" << this->processor_id() << '\n';
2816 
2817  oss << " type()=" << Utility::enum_to_string(this->type()) << '\n'
2818  << " dim()=" << this->dim() << '\n'
2819  << " n_nodes()=" << this->n_nodes() << '\n';
2820 
2821  oss << " mapping=" << Utility::enum_to_string(this->mapping_type()) << '\n';
2822 
2823  for (auto n : this->node_index_range())
2824  {
2825  oss << " " << n << this->node_ref(n);
2826  if (this->mapping_type() == RATIONAL_BERNSTEIN_MAP)
2827  {
2828  const unsigned char datum_index = this->mapping_data();
2829  oss << " weight=" <<
2830  this->node_ref(n).get_extra_datum<Real>(datum_index) << '\n';
2831  }
2832  }
2833 
2834  oss << " n_sides()=" << this->n_sides() << '\n';
2835 
2836  for (auto s : this->side_index_range())
2837  {
2838  oss << " neighbor(" << s << ")=";
2839  if (this->neighbor_ptr(s))
2840  oss << this->neighbor_ptr(s)->id() << '\n';
2841  else
2842  oss << "nullptr\n";
2843  }
2844 
2845  if (!this->infinite())
2846  {
2847  oss << " hmin()=" << this->hmin()
2848  << ", hmax()=" << this->hmax() << '\n'
2849  << " volume()=" << this->volume() << '\n';
2850  }
2851  oss << " active()=" << this->active()
2852  << ", ancestor()=" << this->ancestor()
2853  << ", subactive()=" << this->subactive()
2854  << ", has_children()=" << this->has_children() << '\n'
2855  << " parent()=";
2856  if (this->parent())
2857  oss << this->parent()->id() << '\n';
2858  else
2859  oss << "nullptr\n";
2860  oss << " level()=" << this->level()
2861  << ", p_level()=" << this->p_level() << '\n'
2862 #ifdef LIBMESH_ENABLE_AMR
2863  << " refinement_flag()=" << Utility::enum_to_string(this->refinement_flag()) << '\n'
2864  << " p_refinement_flag()=" << Utility::enum_to_string(this->p_refinement_flag()) << '\n'
2865 #endif
2866 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
2867  << " infinite()=" << this->infinite() << '\n';
2868  if (this->infinite())
2869  oss << " origin()=" << this->origin() << '\n'
2870 #endif
2871  ;
2872 
2873  oss << " DoFs=";
2874  for (auto s : make_range(this->n_systems()))
2875  for (auto v : make_range(this->n_vars(s)))
2876  for (auto c : make_range(this->n_comp(s,v)))
2877  oss << '(' << s << '/' << v << '/' << this->dof_number(s,v,c) << ") ";
2878 
2879 
2880  return oss.str();
2881 }
unsigned char mapping_data() const
Definition: elem.h:3086
RefinementState refinement_flag() const
Definition: elem.h:3160
dof_id_type dof_number(const unsigned int s, const unsigned int var, const unsigned int comp) const
Definition: dof_object.h:1032
const Elem * parent() const
Definition: elem.h:2980
virtual Point origin() const
Definition: elem.h:1863
unsigned int n_comp(const unsigned int s, const unsigned int var) const
Definition: dof_object.h:1002
IntRange< unsigned short > side_index_range() const
Definition: elem.h:2623
RefinementState p_refinement_flag() const
Definition: elem.h:3176
unique_id_type unique_id() const
Definition: dof_object.h:844
unsigned int p_level() const
Definition: elem.h:3058
virtual Real hmax() const
Definition: elem.C:593
bool ancestor() const
Definition: elem.C:1881
ElemMappingType mapping_type() const
Definition: elem.h:3070
const Node & node_ref(const unsigned int i) const
Definition: elem.h:2466
dof_id_type id() const
Definition: dof_object.h:828
virtual Real hmin() const
Definition: elem.C:573
virtual unsigned int n_nodes() const =0
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
bool valid_unique_id() const
Definition: dof_object.h:893
std::string enum_to_string(const T e)
virtual unsigned int n_sides() const =0
const Elem * neighbor_ptr(unsigned int i) const
Definition: elem.h:2520
unsigned int level() const
Definition: elem.h:3024
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
subdomain_id_type subdomain_id() const
Definition: elem.h:2504
bool valid_id() const
Definition: dof_object.h:885
virtual unsigned short dim() const =0
bool subactive() const
Definition: elem.h:2909
virtual Real volume() const
Definition: elem.C:3300
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140
IntRange< unsigned short > node_index_range() const
Definition: elem.h:2605
T get_extra_datum(const unsigned int index) const
Gets the value on this object of the extra datum associated with index, which should have been obtain...
Definition: dof_object.h:1146
virtual bool infinite() const =0
bool active() const
Definition: elem.h:2891
processor_id_type processor_id() const
Definition: dof_object.h:905
virtual ElemType type() const =0
bool has_children() const
Definition: elem.h:2929

◆ get_node_index()

unsigned int libMesh::Elem::get_node_index ( const Node node_ptr) const
inlineinherited
Returns
The local index for the Node pointer node_ptr, or invalid_uint if node_ptr is not a local node.

Definition at line 2482 of file elem.h.

References libMesh::Elem::_nodes, libMesh::invalid_uint, libMesh::make_range(), libMesh::Elem::n_nodes(), and libMesh::Elem::node_ptr().

Referenced by libMesh::OldSolutionValue< Output, point_output >::eval_at_node(), libMesh::ElemCutter::find_intersection_points(), and libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()().

2483 {
2484  for (auto n : make_range(this->n_nodes()))
2485  if (this->_nodes[n] == node_ptr)
2486  return n;
2487 
2488  return libMesh::invalid_uint;
2489 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
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:293
virtual unsigned int n_nodes() const =0
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140

◆ get_nodes()

const Node *const * libMesh::Elem::get_nodes ( ) const
inlineinherited
Returns
A pointer to an array of local node pointers.

Definition at line 2436 of file elem.h.

References libMesh::Elem::_nodes.

Referenced by libMesh::DofMap::dof_indices(), and libMesh::DofMap::old_dof_indices().

2437 {
2438  return _nodes;
2439 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195

◆ get_old_dof_object() [1/2]

DofObject* libMesh::DofObject::get_old_dof_object ( )
inlineinherited

◆ get_old_dof_object() [2/2]

const DofObject* libMesh::DofObject::get_old_dof_object ( ) const
inlineinherited

Definition at line 97 of file dof_object.h.

References libMesh::DofObject::old_dof_object.

97 { return old_dof_object.get(); }
std::unique_ptr< DofObject > old_dof_object
This object on the last mesh.
Definition: dof_object.h:88

◆ get_old_dof_object_ref() [1/2]

DofObject& libMesh::DofObject::get_old_dof_object_ref ( )
inlineinherited

As above, but do not use in situations where the old_dof_object may be nullptr, since this function asserts that the old_dof_object is valid before returning a reference to it.

Definition at line 104 of file dof_object.h.

References libMesh::libmesh_assert(), and libMesh::DofObject::old_dof_object.

Referenced by libMesh::OldSolutionCoefs< Output, point_output >::eval_old_dofs(), libMesh::OldSolutionValue< Output, point_output >::eval_old_dofs(), and libMesh::DofMap::old_dof_indices().

105  {
107  return *old_dof_object;
108  }
libmesh_assert(ctx)
std::unique_ptr< DofObject > old_dof_object
This object on the last mesh.
Definition: dof_object.h:88

◆ get_old_dof_object_ref() [2/2]

const DofObject& libMesh::DofObject::get_old_dof_object_ref ( ) const
inlineinherited

Definition at line 110 of file dof_object.h.

References libMesh::libmesh_assert(), and libMesh::DofObject::old_dof_object.

111  {
113  return *old_dof_object;
114  }
libmesh_assert(ctx)
std::unique_ptr< DofObject > old_dof_object
This object on the last mesh.
Definition: dof_object.h:88

◆ hack_p_level()

void libMesh::Elem::hack_p_level ( const unsigned int  p)
inlineinherited

Sets the value of the p-refinement level for the element without altering the p-level of its ancestors.

Definition at line 3214 of file elem.h.

References libMesh::Elem::_p_level, libMesh::Elem::JUST_REFINED, and libMesh::Elem::p_refinement_flag().

Referenced by libMesh::Elem::hack_p_level_and_refinement_flag(), libMesh::HPCoarsenTest::select_refinement(), and libMesh::Elem::set_p_level().

3215 {
3216  if (p == 0)
3217  libmesh_assert_not_equal_to
3219 
3220  _p_level = cast_int<unsigned char>(p);
3221 }
unsigned char _p_level
p refinement level - the difference between the polynomial degree on this element and the minimum pol...
Definition: elem.h:2240
RefinementState p_refinement_flag() const
Definition: elem.h:3176

◆ hack_p_level_and_refinement_flag()

void libMesh::Elem::hack_p_level_and_refinement_flag ( const unsigned int  p,
RefinementState  pflag 
)
inlineinherited

Sets the value of the p-refinement level for the element without altering the p-level of its ancestors; also sets the p_refinement_flag, simultaneously so that they can be safely checked for mutual consistency.

Definition at line 3225 of file elem.h.

References libMesh::Elem::_pflag, and libMesh::Elem::hack_p_level().

3227 {
3228  _pflag = cast_int<unsigned char>(pflag);
3229  this->hack_p_level(p);
3230 }
unsigned char _pflag
p refinement flag.
Definition: elem.h:2230
void hack_p_level(const unsigned int p)
Sets the value of the p-refinement level for the element without altering the p-level of its ancestor...
Definition: elem.h:3214

◆ has_affine_map()

bool libMesh::Hex20::has_affine_map ( ) const
overridevirtual
Returns
true if the element map is definitely affine within numerical tolerances.

Reimplemented from libMesh::Elem.

Definition at line 120 of file cell_hex20.C.

References libMesh::Elem::affine_tol, libMesh::Elem::point(), and libMesh::TypeVector< T >::relative_fuzzy_equals().

121 {
122  // Make sure x-edge endpoints are affine
123  Point v = this->point(1) - this->point(0);
124  if (!v.relative_fuzzy_equals(this->point(2) - this->point(3), affine_tol) ||
125  !v.relative_fuzzy_equals(this->point(5) - this->point(4), affine_tol) ||
126  !v.relative_fuzzy_equals(this->point(6) - this->point(7), affine_tol))
127  return false;
128  // Make sure x-edges are straight
129  v /= 2;
130  if (!v.relative_fuzzy_equals(this->point(8) - this->point(0), affine_tol) ||
131  !v.relative_fuzzy_equals(this->point(10) - this->point(3), affine_tol) ||
132  !v.relative_fuzzy_equals(this->point(16) - this->point(4), affine_tol) ||
133  !v.relative_fuzzy_equals(this->point(18) - this->point(7), affine_tol))
134  return false;
135  // Make sure xz-faces are identical parallelograms
136  v = this->point(4) - this->point(0);
137  if (!v.relative_fuzzy_equals(this->point(7) - this->point(3), affine_tol))
138  return false;
139  v /= 2;
140  if (!v.relative_fuzzy_equals(this->point(12) - this->point(0), affine_tol) ||
141  !v.relative_fuzzy_equals(this->point(13) - this->point(1), affine_tol) ||
142  !v.relative_fuzzy_equals(this->point(14) - this->point(2), affine_tol) ||
143  !v.relative_fuzzy_equals(this->point(15) - this->point(3), affine_tol))
144  return false;
145  // Make sure y-edges are straight
146  v = (this->point(3) - this->point(0))/2;
147  if (!v.relative_fuzzy_equals(this->point(11) - this->point(0), affine_tol) ||
148  !v.relative_fuzzy_equals(this->point(9) - this->point(1), affine_tol) ||
149  !v.relative_fuzzy_equals(this->point(17) - this->point(5), affine_tol) ||
150  !v.relative_fuzzy_equals(this->point(19) - this->point(4), affine_tol))
151  return false;
152  // If all the above checks out, the map is affine
153  return true;
154 }
static constexpr Real affine_tol
Default tolerance to use in has_affine_map().
Definition: elem.h:2010
const Point & point(const unsigned int i) const
Definition: elem.h:2390

◆ has_ancestor_children()

bool libMesh::Elem::has_ancestor_children ( ) const
inlineinherited
Returns
true if the element has any descendants other than its immediate children, false otherwise, or if AMR is disabled.

Definition at line 2943 of file elem.h.

References libMesh::Elem::_children, and libMesh::Elem::child_ref_range().

2944 {
2945 #ifdef LIBMESH_ENABLE_AMR
2946  if (!_children)
2947  return false;
2948  else
2949  for (auto & c : child_ref_range())
2950  if (c.has_children())
2951  return true;
2952 #endif
2953  return false;
2954 }
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
Definition: elem.h:2296
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element&#39;s children.
Definition: elem.h:2211

◆ has_children()

bool libMesh::Elem::has_children ( ) const
inlineinherited

◆ has_dofs()

bool libMesh::DofObject::has_dofs ( const unsigned int  s = libMesh::invalid_uint) const
inlineinherited
Returns
true if any system has variables which have been assigned, false otherwise.

Definition at line 1226 of file dof_object.h.

References libMesh::invalid_uint, libMesh::make_range(), libMesh::DofObject::n_systems(), and libMesh::DofObject::n_vars().

Referenced by libMesh::DofMap::old_dof_indices().

1227 {
1228  if (sys == libMesh::invalid_uint)
1229  {
1230  for (auto s : make_range(this->n_systems()))
1231  if (this->n_vars(s))
1232  return true;
1233  }
1234 
1235  else
1236  {
1237  libmesh_assert_less (sys, this->n_systems());
1238 
1239  if (this->n_vars(sys))
1240  return true;
1241  }
1242 
1243  return false;
1244 }
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:293
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140

◆ has_extra_integers()

bool libMesh::DofObject::has_extra_integers ( ) const
inlineinherited

◆ has_invertible_map()

bool libMesh::Elem::has_invertible_map ( Real  tol = TOLERANCE*TOLERANCE) const
virtualinherited
Returns
true if the element map is invertible everywhere on the element, to within a user-specified tolerance. The tolerance is generally used in comparisons against zero, so it should be an absolute rather than a relative tolerance. Throws a libmesh_not_implemented() error unless specialized by derived classes.

Reimplemented in libMesh::NodeElem, libMesh::Tet4, libMesh::Tri3, libMesh::Edge4, libMesh::Edge3, libMesh::Quad4, and libMesh::Edge2.

Definition at line 2752 of file elem.C.

References libMesh::FEMap::compute_map(), libMesh::Elem::dim(), libMesh::FEMap::get_jacobian(), libMesh::index_range(), libMesh::FEMap::init_reference_to_physical_map(), libMesh::Elem::is_singular_node(), and libMesh::Elem::n_nodes().

Referenced by VolumeTest::testEdge4Invertible().

2753 {
2754  QNodal qnodal {this->dim()};
2755  FEMap fe_map;
2756  auto & jac = fe_map.get_jacobian();
2757 
2758  // We have a separate check for is_singular_node() below, so in this
2759  // case its "OK" to do nodal quadrature on pyramids.
2760  qnodal.allow_nodal_pyramid_quadrature = true;
2761  qnodal.init(*this);
2762  auto & qp = qnodal.get_points();
2763  libmesh_assert_equal_to(qp.size(), this->n_nodes());
2764 
2765  std::vector<Point> one_point(1);
2766  std::vector<Real> one_weight(1,1);
2767  for (auto i : index_range(qp))
2768  {
2769  if (this->is_singular_node(i))
2770  continue;
2771 
2772  one_point[0] = qp[i];
2773 
2774  fe_map.init_reference_to_physical_map(this->dim(), one_point, this);
2775  fe_map.compute_map(this->dim(), one_weight, this, false);
2776 
2777  if (jac[0] <= 0)
2778  return false;
2779  }
2780 
2781  return true;
2782 }
virtual unsigned int n_nodes() const =0
virtual bool is_singular_node(unsigned int) const
Definition: elem.h:1787
virtual unsigned short dim() const =0
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:117

◆ has_neighbor()

bool libMesh::Elem::has_neighbor ( const Elem elem) const
inlineinherited
Returns
true if the element elem in question is a neighbor of this element, false otherwise.

Definition at line 2550 of file elem.h.

References libMesh::Elem::neighbor_ptr_range().

Referenced by libMesh::Elem::has_topological_neighbor(), libMesh::MeshRefinement::has_topological_neighbor(), libMesh::Elem::min_new_p_level_by_neighbor(), libMesh::Elem::min_p_level_by_neighbor(), and libMesh::Elem::on_boundary().

2551 {
2552  for (auto n : this->neighbor_ptr_range())
2553  if (n == elem)
2554  return true;
2555 
2556  return false;
2557 }
SimpleRange< NeighborPtrIter > neighbor_ptr_range()
Returns a range with all neighbors of an element, usable in range-based for loops.
Definition: elem.h:3439

◆ has_topological_neighbor()

bool libMesh::Elem::has_topological_neighbor ( const Elem elem,
const MeshBase mesh,
const PointLocatorBase point_locator,
const PeriodicBoundaries pb 
) const
inherited
Returns
true if the element elem in question is a neighbor or topological neighbor of this element, false otherwise.

Definition at line 1221 of file elem.C.

References libMesh::Elem::has_neighbor(), mesh, libMesh::Elem::side_index_range(), and libMesh::Elem::topological_neighbor().

Referenced by libMesh::MeshRefinement::has_topological_neighbor().

1225 {
1226  // First see if this is a normal "interior" neighbor
1227  if (has_neighbor(elem))
1228  return true;
1229 
1230  for (auto n : this->side_index_range())
1231  if (this->topological_neighbor(n, mesh, point_locator, pb))
1232  return true;
1233 
1234  return false;
1235 }
bool has_neighbor(const Elem *elem) const
Definition: elem.h:2550
const Elem * topological_neighbor(const unsigned int i, const MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb) const
Definition: elem.C:1184
IntRange< unsigned short > side_index_range() const
Definition: elem.h:2623
MeshBase & mesh

◆ hmax()

Real libMesh::Elem::hmax ( ) const
virtualinherited
Returns
The maximum vertex separation for the element.

Definition at line 593 of file elem.C.

References libMesh::Elem::n_vertices(), libMesh::Elem::point(), and libMesh::Real.

Referenced by libMesh::DiscontinuityMeasure::boundary_side_integration(), libMesh::KellyErrorEstimator::boundary_side_integration(), libMesh::OldSolutionBase< Output, point_output >::check_old_context(), libMesh::Elem::get_info(), libMesh::LaplacianErrorEstimator::internal_side_integration(), libMesh::DiscontinuityMeasure::internal_side_integration(), libMesh::KellyErrorEstimator::internal_side_integration(), and libMesh::Elem::point_test().

594 {
595  Real h_max=0;
596 
597  // Avoid calling a virtual a lot of times
598  const auto n_vertices = this->n_vertices();
599 
600  for (unsigned int n_outer=0; n_outer<n_vertices; n_outer++)
601  for (unsigned int n_inner=n_outer+1; n_inner<n_vertices; n_inner++)
602  {
603  const auto diff = (this->point(n_outer) - this->point(n_inner));
604 
605  h_max = std::max(h_max, diff.norm_sq());
606  }
607 
608  return std::sqrt(h_max);
609 }
virtual unsigned int n_vertices() const =0
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Point & point(const unsigned int i) const
Definition: elem.h:2390

◆ hmin()

Real libMesh::Elem::hmin ( ) const
virtualinherited
Returns
The minimum vertex separation for the element.

Definition at line 573 of file elem.C.

References libMesh::Elem::n_vertices(), libMesh::Elem::point(), and libMesh::Real.

Referenced by compute_enriched_soln(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), compute_tau(), libMesh::MeshTools::Modification::distort(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::Elem::get_info(), libMesh::FEMSystem::numerical_jacobian(), and libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()().

574 {
575  Real h_min=std::numeric_limits<Real>::max();
576 
577  // Avoid calling a virtual a lot of times
578  const auto n_vertices = this->n_vertices();
579 
580  for (unsigned int n_outer=0; n_outer<n_vertices; n_outer++)
581  for (unsigned int n_inner=n_outer+1; n_inner<n_vertices; n_inner++)
582  {
583  const auto diff = (this->point(n_outer) - this->point(n_inner));
584 
585  h_min = std::min(h_min, diff.norm_sq());
586  }
587 
588  return std::sqrt(h_min);
589 }
virtual unsigned int n_vertices() const =0
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Point & point(const unsigned int i) const
Definition: elem.h:2390

◆ id()

dof_id_type libMesh::DofObject::id ( ) const
inlineinherited
Returns
The id for this DofObject

Definition at line 828 of file dof_object.h.

References libMesh::DofObject::_id.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::MeshTools::Subdivision::add_boundary_ghosts(), add_cube_convex_hull_to_mesh(), libMesh::ReplicatedMesh::add_elem(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::TopologyMap::add_node(), libMesh::ReplicatedMesh::add_node(), libMesh::DistributedMesh::add_node(), libMesh::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::ClawSystem::assemble_avg_coupling_matrices(), assemble_ellipticdg(), libMesh::ClawSystem::assemble_jump_coupling_matrix(), libMesh::Node::build(), libMesh::MeshTools::Generation::build_cube(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::EquationSystems::build_parallel_solution_vector(), compute_jacobian(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), libMesh::FEAbstract::compute_periodic_node_constraints(), compute_residual(), libMesh::InfFE< Dim, T_radial, T_map >::compute_shape_functions(), libMesh::FEMap::compute_single_point_map(), libMesh::MeshBase::copy_constraint_rows(), libMesh::MeshRefinement::create_parent_error_vector(), libMesh::ReplicatedMesh::delete_elem(), libMesh::DistributedMesh::delete_elem(), libMesh::ReplicatedMesh::delete_node(), libMesh::DistributedMesh::delete_node(), libMesh::Elem::disconnected_clone(), libMesh::DTKAdapter::DTKAdapter(), libMesh::UNVIO::elements_out(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::MeshTools::find_nodal_neighbors(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_error_fraction(), libMesh::MeshRefinement::flag_elements_by_error_tolerance(), libMesh::MeshTools::Modification::flatten(), libMesh::ReplicatedMesh::get_boundary_points(), libMesh::ReplicatedMesh::get_disconnected_subdomains(), libMesh::Node::get_info(), libMesh::Elem::get_info(), libMesh::MeshBase::get_info(), libMesh::ParmetisPartitioner::initialize(), libMesh::TreeNode< N >::insert(), libMesh::TriangulatorInterface::insert_any_extra_boundary_points(), libMesh::ReplicatedMesh::insert_elem(), libMesh::DistributedMesh::insert_elem(), libMesh::ReplicatedMesh::insert_node(), libMesh::Poly2TriTriangulator::insert_refinement_points(), EIM_F::interior_assembly(), AssemblyEIM::interior_assembly(), libMesh::Elem::interior_parent(), libMesh::FEMap::inverse_map(), libMesh::MeshTools::libmesh_assert_valid_amr_elem_ids(), libMesh::MeshTools::libmesh_assert_valid_constraint_rows(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::Tri3Subdivision::local_node_number(), main(), ExodusTest< elem_type >::meshes_equal_enough(), LinearElasticityWithContact::move_mesh(), libMesh::MeshTools::n_connected_components(), libMesh::Elem::node_id(), libMesh::TriangulatorInterface::nodes_to_segments(), libMesh::VTKIO::nodes_to_vtk(), libMesh::CompareElemIdsByLevel::operator()(), libMesh::GhostPointNeighbors::operator()(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::CompareDofObjectsByID::operator()(), libMesh::CompareDofObjectsByPIDAndThenID::operator()(), libMesh::BoundaryInfo::operator==(), libMesh::DistributedMesh::own_node(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::MetisPartitioner::partition_range(), libMesh::DofObject::print_dof_info(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::DistributedMesh::query_elem_ptr(), libMesh::query_ghosting_functors(), libMesh::DistributedMesh::query_node_ptr(), libMesh::Nemesis_IO::read(), libMesh::ExodusII_IO::read(), libMesh::VariationalMeshSmoother::readgr(), libMesh::EquationSystems::redundant_added_side(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::DistributedMesh::renumber_elem(), libMesh::DistributedMesh::renumber_node(), libMesh::DistributedMesh::renumber_nodes_and_elements(), libMesh::DofMap::scatter_constraints(), libMesh::StaticCondensation::set_current_elem(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), FETestBase< order, family, elem_type, 1 >::setUp(), libMesh::MeshTools::Modification::smooth(), libMesh::BoundaryInfo::sync(), libMesh::Parallel::sync_dofobject_data_by_id(), libMesh::Parallel::sync_element_data_by_parent_id(), libMesh::Parallel::sync_node_data_by_element_id_once(), ElemTest< elem_type >::test_orient_elements(), DefaultCouplingTest::testCoupling(), MixedDimensionMeshTest::testPointLocatorTree(), InfFERadialTest::testRefinement(), DofObjectTest< Node >::testSetId(), MeshSmootherTest::testSmoother(), libMesh::Elem::topologically_equal(), libMesh::NetGenMeshInterface::triangulate(), libMesh::TetGenMeshInterface::triangulate_conformingDelaunayMesh_carvehole(), libMesh::Poly2TriTriangulator::triangulate_current_points(), libMesh::MeshTetInterface::volume_to_surface_mesh(), libMesh::GmshIO::write_mesh(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), and libMesh::XdrIO::write_serialized_nodes().

829 {
830  return _id;
831 }
dof_id_type _id
The id of the DofObject.
Definition: dof_object.h:583

◆ increment_constructor_count() [1/2]

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 183 of file reference_counter.h.

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::ReferenceCountedObject().

184 {
185  libmesh_try
186  {
187  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
188  std::pair<unsigned int, unsigned int> & p = _counts[name];
189  p.first++;
190  }
191  libmesh_catch (...)
192  {
193  auto stream = libMesh::err.get();
194  stream->exceptions(stream->goodbit); // stream must not throw
195  libMesh::err << "Encountered unrecoverable error while calling "
196  << "ReferenceCounter::increment_constructor_count() "
197  << "for a(n) " << name << " object." << std::endl;
198  std::terminate();
199  }
200 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;ll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:30

◆ increment_constructor_count() [2/2]

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 183 of file reference_counter.h.

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::ReferenceCountedObject().

184 {
185  libmesh_try
186  {
187  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
188  std::pair<unsigned int, unsigned int> & p = _counts[name];
189  p.first++;
190  }
191  libmesh_catch (...)
192  {
193  auto stream = libMesh::err.get();
194  stream->exceptions(stream->goodbit); // stream must not throw
195  libMesh::err << "Encountered unrecoverable error while calling "
196  << "ReferenceCounter::increment_constructor_count() "
197  << "for a(n) " << name << " object." << std::endl;
198  std::terminate();
199  }
200 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;ll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:30

◆ increment_destructor_count() [1/2]

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 207 of file reference_counter.h.

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::~ReferenceCountedObject().

208 {
209  libmesh_try
210  {
211  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
212  std::pair<unsigned int, unsigned int> & p = _counts[name];
213  p.second++;
214  }
215  libmesh_catch (...)
216  {
217  auto stream = libMesh::err.get();
218  stream->exceptions(stream->goodbit); // stream must not throw
219  libMesh::err << "Encountered unrecoverable error while calling "
220  << "ReferenceCounter::increment_destructor_count() "
221  << "for a(n) " << name << " object." << std::endl;
222  std::terminate();
223  }
224 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;ll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:30

◆ increment_destructor_count() [2/2]

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 207 of file reference_counter.h.

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::~ReferenceCountedObject().

208 {
209  libmesh_try
210  {
211  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
212  std::pair<unsigned int, unsigned int> & p = _counts[name];
213  p.second++;
214  }
215  libmesh_catch (...)
216  {
217  auto stream = libMesh::err.get();
218  stream->exceptions(stream->goodbit); // stream must not throw
219  libMesh::err << "Encountered unrecoverable error while calling "
220  << "ReferenceCounter::increment_destructor_count() "
221  << "for a(n) " << name << " object." << std::endl;
222  std::terminate();
223  }
224 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;ll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:30

◆ infinite() [1/2]

virtual bool libMesh::Cell::infinite ( ) const
inlineoverridevirtualinherited
Returns
false. All classes derived from Cell are finite elements.

Implements libMesh::Elem.

Definition at line 75 of file cell.h.

75 { return false; }

◆ infinite() [2/2]

static constexpr bool libMesh::Elem::infinite ( )
inlinestaticinherited

Definition at line 1867 of file elem.h.

1867 { return false; }

◆ interior_parent() [1/2]

const Elem * libMesh::Elem::interior_parent ( ) const
inherited
Returns
The higher-dimensional Elem for which this Elem is a face.

In some cases it is desirable to extract the boundary (or a subset thereof) of a D-dimensional mesh as a (D-1)-dimensional manifold. In this case we may want to know the 'parent' element from which the manifold elements were extracted. We can easily do that for the level-0 manifold elements by storing the D-dimensional parent. This method provides access to that element.

This method returns nullptr if this->dim() == LIBMESH_DIM; in such cases no data storage for an interior parent pointer has been allocated.

Definition at line 1057 of file elem.C.

References libMesh::Elem::_elemlinks, libMesh::Elem::dim(), libMesh::DofObject::id(), libMesh::DofObject::invalid_id, libMesh::Elem::level(), libMesh::libmesh_assert(), libMesh::Elem::n_sides(), and libMesh::remote_elem.

Referenced by libMesh::FEMap::compute_face_map(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::BoundaryInfo::get_side_and_node_maps(), libMesh::InfFE< Dim, T_radial, T_map >::init_face_shape_functions(), libMesh::MeshTools::libmesh_assert_valid_amr_interior_parents(), libMesh::GhostPointNeighbors::operator()(), BoundaryMeshTest::sanityCheck(), libMesh::Elem::topologically_equal(), libMesh::BoundaryVolumeSolutionTransfer::transfer_boundary_volume(), and libMesh::BoundaryVolumeSolutionTransfer::transfer_volume_boundary().

1058 {
1059  // interior parents make no sense for full-dimensional elements.
1060  if (this->dim() >= LIBMESH_DIM)
1061  return nullptr;
1062 
1063  // they USED TO BE only good for level-0 elements, but we now
1064  // support keeping interior_parent() valid on refined boundary
1065  // elements.
1066  // if (this->level() != 0)
1067  // return this->parent()->interior_parent();
1068 
1069  // We store the interior_parent pointer after both the parent
1070  // neighbor and neighbor pointers
1071  Elem * interior_p = _elemlinks[1+this->n_sides()];
1072 
1073  // If we have an interior_parent, we USED TO assume it was a
1074  // one-higher-dimensional interior element, but we now allow e.g.
1075  // edge elements to have a 3D interior_parent with no
1076  // intermediate 2D element.
1077  // libmesh_assert (!interior_p ||
1078  // interior_p->dim() == (this->dim()+1));
1079  libmesh_assert (!interior_p ||
1080  (interior_p == remote_elem) ||
1081  (interior_p->dim() > this->dim()));
1082 
1083  // If an element in a multi-dimensional mesh has an interior_parent
1084  // link, it should be at our level or coarser, just like a neighbor
1085  // link. Our collect_families() code relies on this, but it might
1086  // be tempting for users to manually assign something that breaks
1087  // it.
1088  //
1089  // However, we *also* create temporary side elements, and we don't
1090  // bother with creating ancestors for those, so they can be at level
1091  // 0 even when they're sides of non-level-0 elements.
1092  libmesh_assert (!interior_p ||
1093  (interior_p->level() <= this->level()) ||
1094  (this->level() == 0 &&
1095  this->id() == DofObject::invalid_id));
1096 
1097  return interior_p;
1098 }
dof_id_type id() const
Definition: dof_object.h:828
Elem ** _elemlinks
Pointers to this element&#39;s parent and neighbors, and for lower-dimensional elements&#39; interior_parent...
Definition: elem.h:2201
libmesh_assert(ctx)
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
virtual unsigned int n_sides() const =0
unsigned int level() const
Definition: elem.h:3024
virtual unsigned short dim() const =0
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ interior_parent() [2/2]

Elem * libMesh::Elem::interior_parent ( )
inherited

Definition at line 1102 of file elem.C.

References libMesh::Elem::_elemlinks, libMesh::Elem::dim(), libMesh::libmesh_assert(), libMesh::Elem::n_sides(), and libMesh::remote_elem.

1103 {
1104  // See the const version for comments
1105  if (this->dim() >= LIBMESH_DIM)
1106  return nullptr;
1107 
1108  Elem * interior_p = _elemlinks[1+this->n_sides()];
1109 
1110  libmesh_assert (!interior_p ||
1111  (interior_p == remote_elem) ||
1112  (interior_p->dim() > this->dim()));
1113 
1114  return interior_p;
1115 }
Elem ** _elemlinks
Pointers to this element&#39;s parent and neighbors, and for lower-dimensional elements&#39; interior_parent...
Definition: elem.h:2201
libmesh_assert(ctx)
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
virtual unsigned int n_sides() const =0
virtual unsigned short dim() const =0
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ invalidate()

void libMesh::DofObject::invalidate ( )
inlineinherited

Invalidates all the indices for this DofObject.

Definition at line 788 of file dof_object.h.

References libMesh::DofObject::invalidate_dofs(), libMesh::DofObject::invalidate_id(), and libMesh::DofObject::invalidate_processor_id().

Referenced by libMesh::DofObject::DofObject().

789 {
790  this->invalidate_dofs ();
791  this->invalidate_id ();
792  this->invalidate_processor_id ();
793 }
void invalidate_id()
Sets the id to invalid_id.
Definition: dof_object.h:772
void invalidate_processor_id()
Sets the processor id to invalid_processor_id.
Definition: dof_object.h:780
void invalidate_dofs(const unsigned int sys_num=libMesh::invalid_uint)
Sets all degree of freedom numbers to invalid_id.
Definition: dof_object.h:751

◆ invalidate_dofs()

void libMesh::DofObject::invalidate_dofs ( const unsigned int  sys_num = libMesh::invalid_uint)
inlineinherited

Sets all degree of freedom numbers to invalid_id.

Definition at line 751 of file dof_object.h.

References libMesh::DofObject::invalid_id, libMesh::make_range(), libMesh::DofObject::n_comp_group(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), and libMesh::DofObject::set_vg_dof_base().

Referenced by libMesh::DofObject::invalidate().

752 {
753  const unsigned int n_sys = this->n_systems();
754  // If the user does not specify the system number...
755  if (sys_num >= n_sys)
756  {
757  for (auto s : make_range(n_sys))
758  for (auto vg : make_range(this->n_var_groups(s)))
759  if (this->n_comp_group(s,vg))
760  this->set_vg_dof_base(s,vg,invalid_id);
761  }
762  // ...otherwise invalidate the dofs for all systems
763  else
764  for (auto vg : make_range(this->n_var_groups(sys_num)))
765  if (this->n_comp_group(sys_num,vg))
766  this->set_vg_dof_base(sys_num,vg,invalid_id);
767 }
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
void set_vg_dof_base(const unsigned int s, const unsigned int vg, const dof_id_type db)
VariableGroup DoF indices are indexed as id = base + var_in_vg*ncomp + comp This method allows for di...
Definition: dof_object.h:1297
unsigned int n_systems() const
Definition: dof_object.h:937
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140
unsigned int n_comp_group(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:1015

◆ invalidate_id()

void libMesh::DofObject::invalidate_id ( )
inlineinherited

Sets the id to invalid_id.

Definition at line 772 of file dof_object.h.

References libMesh::DofObject::invalid_id, and libMesh::DofObject::set_id().

Referenced by libMesh::DofObject::invalidate(), and DofObjectTest< Node >::testInvalidateId().

773 {
774  this->set_id (invalid_id);
775 }
dof_id_type & set_id()
Definition: dof_object.h:836
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482

◆ invalidate_processor_id()

void libMesh::DofObject::invalidate_processor_id ( )
inlineinherited

Sets the processor id to invalid_processor_id.

Definition at line 780 of file dof_object.h.

References libMesh::DofObject::invalid_processor_id, and libMesh::DofObject::processor_id().

Referenced by libMesh::DofObject::invalidate(), libMesh::Partitioner::set_parent_processor_ids(), and DofObjectTest< Node >::testInvalidateProcId().

781 {
783 }
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:493
processor_id_type processor_id() const
Definition: dof_object.h:905

◆ is_ancestor_of()

bool libMesh::Elem::is_ancestor_of ( const Elem descendant) const
inlineinherited
Returns
true if descendant is a child of this, or a child of a child of this, etc., false otherwise or if AMR is disabled.

Definition at line 2959 of file elem.h.

References libMesh::Elem::parent().

Referenced by libMesh::UnstructuredMesh::find_neighbors().

2964 {
2965 #ifdef LIBMESH_ENABLE_AMR
2966  const Elem * e = descendant;
2967  while (e)
2968  {
2969  if (this == e)
2970  return true;
2971  e = e->parent();
2972  }
2973 #endif
2974  return false;
2975 }
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328

◆ is_child_on_edge()

bool libMesh::Elem::is_child_on_edge ( const unsigned int  c,
const unsigned int  e 
) const
virtualinherited
Returns
true if the specified child is on the specified edge.

Definition at line 2177 of file elem.C.

References libMesh::Elem::build_edge_ptr(), libMesh::Elem::child_ptr(), libMesh::Elem::n_children(), and libMesh::Elem::n_edges().

Referenced by libMesh::FEGenericBase< FEOutputType< T >::type >::coarsened_dof_values(), libMesh::BoundaryInfo::edge_boundary_ids(), and libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()().

2179 {
2180  libmesh_assert_less (c, this->n_children());
2181  libmesh_assert_less (e, this->n_edges());
2182 
2183  std::unique_ptr<const Elem> my_edge = this->build_edge_ptr(e);
2184  std::unique_ptr<const Elem> child_edge = this->child_ptr(c)->build_edge_ptr(e);
2185 
2186  // We're assuming that an overlapping child edge has the same
2187  // number and orientation as its parent
2188  return (child_edge->node_id(0) == my_edge->node_id(0) ||
2189  child_edge->node_id(1) == my_edge->node_id(1));
2190 }
virtual unsigned int n_children() const =0
virtual unsigned int n_edges() const =0
virtual std::unique_ptr< Elem > build_edge_ptr(const unsigned int i)=0
const Elem * child_ptr(unsigned int i) const
Definition: elem.h:3113

◆ is_child_on_side()

bool libMesh::Hex::is_child_on_side ( const unsigned int  c,
const unsigned int  s 
) const
finaloverridevirtualinherited
Returns
true if the specified child is on the specified side.

Implements libMesh::Elem.

Definition at line 170 of file cell_hex.C.

References libMesh::Hex::n_children(), libMesh::Hex::n_sides(), and libMesh::Hex8::side_nodes_map.

172 {
173  libmesh_assert_less (c, this->n_children());
174  libmesh_assert_less (s, this->n_sides());
175 
176  // This array maps the Hex8 node numbering to the Hex8 child
177  // numbering. I.e.
178  // node 6 touches child 7, and
179  // node 7 touches child 6, etc.
180  const unsigned int node_child_map[8] = { 0, 1, 3, 2, 4, 5, 7, 6 };
181 
182  for (unsigned int i = 0; i != 4; ++i)
183  if (node_child_map[Hex8::side_nodes_map[s][i]] == c)
184  return true;
185 
186  return false;
187 }
virtual unsigned int n_children() const override final
Definition: cell_hex.h:100
static const unsigned int side_nodes_map[num_sides][nodes_per_side]
This maps the node of the side to element node numbers.
Definition: cell_hex8.h:171
virtual unsigned int n_sides() const override final
Definition: cell_hex.h:80

◆ is_edge()

bool libMesh::Hex20::is_edge ( const unsigned int  i) const
overridevirtual
Returns
true if the specified (local) node number is an edge.

Implements libMesh::Elem.

Definition at line 74 of file cell_hex20.C.

75 {
76  if (i > 7)
77  return true;
78  return false;
79 }

◆ is_edge_on_side()

bool libMesh::Hex::is_edge_on_side ( const unsigned int  e,
const unsigned int  s 
) const
finaloverridevirtualinherited
Returns
true if the specified edge is on the specified side.

Implements libMesh::Elem.

Definition at line 191 of file cell_hex.C.

References libMesh::Hex::edge_sides_map, libMesh::Hex::n_edges(), and libMesh::Hex::n_sides().

193 {
194  libmesh_assert_less (e, this->n_edges());
195  libmesh_assert_less (s, this->n_sides());
196 
197  return (edge_sides_map[e][0] == s || edge_sides_map[e][1] == s);
198 }
virtual unsigned int n_edges() const override final
Definition: cell_hex.h:90
virtual unsigned int n_sides() const override final
Definition: cell_hex.h:80
static const unsigned int edge_sides_map[12][2]
This maps each edge to the sides that contain said edge.
Definition: cell_hex.h:196

◆ is_face()

bool libMesh::Hex20::is_face ( const unsigned int  i) const
overridevirtual
Returns
true if the specified (local) node number is a face.

Implements libMesh::Elem.

Definition at line 81 of file cell_hex20.C.

82 {
83  return false;
84 }

◆ is_flipped()

bool libMesh::Hex::is_flipped ( ) const
finaloverridevirtualinherited
Returns
Whether the element is flipped compared to standard libMesh (e.g. clockwise for 2D elements) node orientations.

Always returns false if a 2D element is not in the XY plane or a 1D element is not on the X axis; user code designed to work for embedded manifolds should handle any consistent orientation, and determining whether an orientation is consistent is not a local operation.

Implements libMesh::Elem.

Definition at line 254 of file cell_hex.C.

References libMesh::Elem::point(), and libMesh::triple_product().

255 {
256  return (triple_product(this->point(1)-this->point(0),
257  this->point(3)-this->point(0),
258  this->point(4)-this->point(0)) < 0);
259 }
T triple_product(const TypeVector< T > &a, const TypeVector< T > &b, const TypeVector< T > &c)
Definition: type_vector.h:1029
const Point & point(const unsigned int i) const
Definition: elem.h:2390

◆ is_internal()

bool libMesh::Elem::is_internal ( const unsigned int  i) const
inherited
Returns
true if the specified (local) node number is an internal node.

Definition at line 3437 of file elem.C.

References libMesh::Elem::dim(), libMesh::Elem::is_edge(), libMesh::Elem::is_face(), and libMesh::Elem::is_vertex().

Referenced by libMesh::Prism::edges_adjacent_to_node(), libMesh::Hex::edges_adjacent_to_node(), libMesh::InfPrism::edges_adjacent_to_node(), and libMesh::InfHex::edges_adjacent_to_node().

3438 {
3439  switch (this->dim())
3440  {
3441  case 0:
3442  return false;
3443 
3444  case 1:
3445  return !this->is_vertex(i);
3446 
3447  case 2:
3448  return !this->is_vertex(i) && !this->is_edge(i);
3449 
3450  case 3:
3451  return !this->is_vertex(i) && !this->is_edge(i) && !this->is_face(i);
3452 
3453  default:
3454  libmesh_error_msg("impossible element dimension " << std::to_string(this->dim()));
3455  return 0;
3456  }
3457 }
virtual bool is_face(const unsigned int i) const =0
virtual unsigned short dim() const =0
virtual bool is_vertex(const unsigned int i) const =0
virtual bool is_edge(const unsigned int i) const =0

◆ is_linear()

virtual bool libMesh::Elem::is_linear ( ) const
inlinevirtualinherited
Returns
true if the Lagrange shape functions on this element are linear.

Reimplemented in libMesh::NodeElem, libMesh::Tet4, libMesh::Tri3, libMesh::Edge2, and libMesh::Tri3Subdivision.

Definition at line 1162 of file elem.h.

Referenced by libMesh::FEMap::init_reference_to_physical_map().

1162 { return false; }

◆ is_mid_infinite_edge_node()

virtual bool libMesh::Elem::is_mid_infinite_edge_node ( const unsigned int  ) const
inlinevirtualinherited
Returns
true if the specified (local) node number is a "mid-edge" node on an infinite element edge.

This is false for all nodes on non-infinite elements, so we won't make it pure virtual, to simplify their code.

Reimplemented in libMesh::InfEdge2, libMesh::InfQuad, libMesh::InfPrism, and libMesh::InfHex.

Definition at line 1854 of file elem.h.

References libMesh::Elem::infinite(), and libMesh::libmesh_assert().

Referenced by libMesh::Elem::parent_bracketing_nodes().

1855  { libmesh_assert (!this->infinite()); return false; }
libmesh_assert(ctx)
virtual bool infinite() const =0

◆ is_node_on_edge()

bool libMesh::Hex20::is_node_on_edge ( const unsigned int  n,
const unsigned int  e 
) const
overridevirtual
Returns
true if the specified (local) node number is on the specified edge.

Implements libMesh::Elem.

Definition at line 109 of file cell_hex20.C.

References edge_nodes_map, and libMesh::Hex::n_edges().

111 {
112  libmesh_assert_less (e, n_edges());
113  return std::find(std::begin(edge_nodes_map[e]),
114  std::end(edge_nodes_map[e]),
115  n) != std::end(edge_nodes_map[e]);
116 }
static const unsigned int edge_nodes_map[num_edges][nodes_per_edge]
This maps the node of the edge to element node numbers.
Definition: cell_hex20.h:227
virtual unsigned int n_edges() const override final
Definition: cell_hex.h:90

◆ is_node_on_side()

bool libMesh::Hex20::is_node_on_side ( const unsigned int  n,
const unsigned int  s 
) const
overridevirtual
Returns
true if the specified (local) node number is on the specified side.

Implements libMesh::Elem.

Definition at line 86 of file cell_hex20.C.

References libMesh::Hex::n_sides(), and side_nodes_map.

88 {
89  libmesh_assert_less (s, n_sides());
90  return std::find(std::begin(side_nodes_map[s]),
91  std::end(side_nodes_map[s]),
92  n) != std::end(side_nodes_map[s]);
93 }
virtual unsigned int n_sides() const override final
Definition: cell_hex.h:80
static const unsigned int side_nodes_map[num_sides][nodes_per_side]
This maps the node of the side to element node numbers.
Definition: cell_hex20.h:221

◆ is_remote()

virtual bool libMesh::Elem::is_remote ( ) const
inlinevirtualinherited
Returns
true if this element is remote, false otherwise.

A remote element (see RemoteElem) is a syntactic convenience – it is a placeholder for an element which exists on some other processor. Local elements are required to have valid neighbors, and these ghost elements may have remote neighbors for data structure consistency. The use of remote elements helps ensure that any element we may access has a nullptr neighbor only if it lies on the physical boundary of the domain.

Reimplemented in libMesh::RemoteElem.

Definition at line 590 of file elem.h.

Referenced by libMesh::Elem::make_links_to_me_local().

591  { return false; }

◆ is_semilocal()

bool libMesh::Elem::is_semilocal ( const processor_id_type  my_pid) const
inherited
Returns
true if this element is "semilocal" to the calling processor, which must specify its rank.

This method is discouraged, as it uses the old definition of semilocal (elements which are not local but which are point neighbors of something local) rather than any of the new definitions discussed in ghosting_functor.h

Definition at line 726 of file elem.C.

References libMesh::Elem::find_point_neighbors().

727 {
728  std::set<const Elem *> point_neighbors;
729 
730  this->find_point_neighbors(point_neighbors);
731 
732  for (const auto & elem : point_neighbors)
733  if (elem->processor_id() == my_pid)
734  return true;
735 
736  return false;
737 }
void find_point_neighbors(const Point &p, std::set< const Elem *> &neighbor_set) const
This function finds all active elements (including this one) which are in the same manifold as this e...
Definition: elem.C:864

◆ is_singular_node()

virtual bool libMesh::Elem::is_singular_node ( unsigned int  ) const
inlinevirtualinherited
Returns
true iff the node at the given index has a singular mapping; i.e. is the degree-4 node on a Pyramid.

Reimplemented in libMesh::Pyramid.

Definition at line 1787 of file elem.h.

Referenced by libMesh::Elem::has_invertible_map().

1787 { return false; }

◆ is_vertex()

bool libMesh::Hex20::is_vertex ( const unsigned int  i) const
overridevirtual
Returns
true if the specified (local) node number is a vertex.

Implements libMesh::Elem.

Definition at line 67 of file cell_hex20.C.

68 {
69  if (i < 8)
70  return true;
71  return false;
72 }

◆ is_vertex_on_child()

virtual bool libMesh::Elem::is_vertex_on_child ( unsigned  int,
unsigned int  n 
) const
inlinevirtualinherited
Returns
true if the specified child has a vertex at the specified (child-local) node number. Except in odd cases like pyramid refinement the child will have the same local structure as the parent element.

Definition at line 746 of file elem.h.

References libMesh::Elem::is_vertex().

Referenced by libMesh::Elem::parent_bracketing_nodes().

748  { return this->is_vertex(n); }
virtual bool is_vertex(const unsigned int i) const =0

◆ is_vertex_on_parent()

bool libMesh::Elem::is_vertex_on_parent ( unsigned int  c,
unsigned int  n 
) const
virtualinherited
Returns
true if this element has a vertex at the specified (child-local) node number n of the specified child c.

Definition at line 3358 of file elem.C.

References libMesh::Elem::child_ptr(), libMesh::libmesh_ignore(), libMesh::Elem::n_vertices(), and libMesh::Elem::node_ptr().

Referenced by libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()().

3360 {
3361 #ifdef LIBMESH_ENABLE_AMR
3362 
3363  unsigned int my_n_vertices = this->n_vertices();
3364  for (unsigned int n_parent = 0; n_parent != my_n_vertices;
3365  ++n_parent)
3366  if (this->node_ptr(n_parent) == this->child_ptr(c)->node_ptr(n))
3367  return true;
3368  return false;
3369 
3370 #else
3371 
3372  // No AMR?
3373  libmesh_ignore(c,n);
3374  libmesh_error_msg("ERROR: AMR disabled, how did we get here?");
3375  return true;
3376 
3377 #endif
3378 }
void libmesh_ignore(const Args &...)
virtual unsigned int n_vertices() const =0
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444
const Elem * child_ptr(unsigned int i) const
Definition: elem.h:3113

◆ key() [1/4]

virtual dof_id_type libMesh::Elem::key
inherited

Don't hide Elem::key() defined in the base class.

◆ key() [2/4]

dof_id_type libMesh::Elem::key
inherited

Don't hide Elem::key() defined in the base class.

Definition at line 624 of file elem.C.

625 {
626  const unsigned short n_n = this->n_nodes();
627 
628  std::array<dof_id_type, Elem::max_n_nodes> node_ids;
629 
630  for (unsigned short n=0; n != n_n; ++n)
631  node_ids[n] = this->node_id(n);
632 
633  // Always sort, so that different local node numberings hash to the
634  // same value.
635  std::sort (node_ids.begin(), node_ids.begin()+n_n);
636 
637  return Utility::hashword(node_ids.data(), n_n);
638 }
uint32_t hashword(const uint32_t *k, size_t length, uint32_t initval=0)
The hashword function takes an array of uint32_t&#39;s of length &#39;length&#39; and computes a single key from ...
Definition: hashword.h:158
virtual unsigned int n_nodes() const =0
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:2412

◆ key() [3/4]

dof_id_type libMesh::Hex::key ( const unsigned int  s) const
overridevirtualinherited
Returns
An id associated with the s side of this element. The id is not necessarily unique, but should be close.

Implements libMesh::Elem.

Reimplemented in libMesh::Hex27.

Definition at line 102 of file cell_hex.C.

References libMesh::Elem::compute_key(), libMesh::Hex::n_sides(), libMesh::Elem::node_id(), and libMesh::Hex8::side_nodes_map.

103 {
104  libmesh_assert_less (s, this->n_sides());
105 
106  return this->compute_key(this->node_id(Hex8::side_nodes_map[s][0]),
107  this->node_id(Hex8::side_nodes_map[s][1]),
108  this->node_id(Hex8::side_nodes_map[s][2]),
109  this->node_id(Hex8::side_nodes_map[s][3]));
110 }
static const unsigned int side_nodes_map[num_sides][nodes_per_side]
This maps the node of the side to element node numbers.
Definition: cell_hex8.h:171
virtual unsigned int n_sides() const override final
Definition: cell_hex.h:80
static dof_id_type compute_key(dof_id_type n0)
Definition: elem.h:3244
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:2412

◆ key() [4/4]

dof_id_type libMesh::Elem::key ( ) const
virtualinherited
Returns
An id associated with the global node ids of this element. The id is not necessarily unique, but should be close. Uses the same hash as the key(s) function, so for example if "tri3" is side 0 of "tet4", then tri3->key()==tet4->key(0).

Reimplemented in libMesh::Tet4, libMesh::Edge3, libMesh::Edge4, libMesh::Edge2, libMesh::Quad9, libMesh::Quad, libMesh::Polygon, and libMesh::Tri.

Definition at line 624 of file elem.C.

References libMesh::Utility::hashword(), libMesh::Elem::n_nodes(), and libMesh::Elem::node_id().

Referenced by libMesh::InfQuad6::key(), libMesh::Prism18::key(), libMesh::Pyramid14::key(), and libMesh::InfHex18::key().

625 {
626  const unsigned short n_n = this->n_nodes();
627 
628  std::array<dof_id_type, Elem::max_n_nodes> node_ids;
629 
630  for (unsigned short n=0; n != n_n; ++n)
631  node_ids[n] = this->node_id(n);
632 
633  // Always sort, so that different local node numberings hash to the
634  // same value.
635  std::sort (node_ids.begin(), node_ids.begin()+n_n);
636 
637  return Utility::hashword(node_ids.data(), n_n);
638 }
uint32_t hashword(const uint32_t *k, size_t length, uint32_t initval=0)
The hashword function takes an array of uint32_t&#39;s of length &#39;length&#39; and computes a single key from ...
Definition: hashword.h:158
virtual unsigned int n_nodes() const =0
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:2412

◆ length()

Real libMesh::Elem::length ( const unsigned int  n1,
const unsigned int  n2 
) const
inherited
Returns
The distance between nodes n1 and n2.

Useful for computing the lengths of the sides of elements.

Definition at line 613 of file elem.C.

References libMesh::Elem::n_vertices(), and libMesh::Elem::point().

Referenced by libMesh::Hex::quality(), libMesh::Quad::quality(), and libMesh::InfHex::quality().

615 {
616  libmesh_assert_less ( n1, this->n_vertices() );
617  libmesh_assert_less ( n2, this->n_vertices() );
618 
619  return (this->point(n1) - this->point(n2)).norm();
620 }
virtual unsigned int n_vertices() const =0
const Point & point(const unsigned int i) const
Definition: elem.h:2390

◆ level()

unsigned int libMesh::Elem::level ( ) const
inlineinherited
Returns
The refinement level of the current element.

If the element's parent is nullptr then by convention it is at level 0, otherwise it is simply at one level greater than its parent.

Definition at line 3024 of file elem.h.

References libMesh::Elem::dim(), libMesh::Elem::level(), and libMesh::Elem::parent().

Referenced by libMesh::BoundaryInfo::add_edge(), libMesh::BoundaryInfo::add_shellface(), libMesh::BoundaryInfo::add_side(), assemble_ellipticdg(), libMesh::BoundaryInfo::boundary_ids(), libMesh::EquationSystems::build_discontinuous_solution_vector(), compute_jacobian(), libMesh::FEAbstract::compute_node_constraints(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), libMesh::FEAbstract::compute_periodic_node_constraints(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints(), compute_residual(), libMesh::Elem::contains_vertex_of(), libMesh::BoundaryInfo::edge_boundary_ids(), libMesh::MeshRefinement::enforce_mismatch_limit_prior_to_refinement(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::MeshTools::find_hanging_nodes_and_parents(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::Elem::get_info(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_constraints(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_node_constraints(), libMesh::Poly2TriTriangulator::insert_refinement_points(), libMesh::Elem::interior_parent(), libMesh::Elem::level(), libMesh::MeshTools::libmesh_assert_valid_amr_interior_parents(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::Elem::make_links_to_me_local(), libMesh::Elem::make_links_to_me_remote(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::Elem::nullify_neighbors(), libMesh::CompareElemIdsByLevel::operator()(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::BoundaryInfo::remove_edge(), libMesh::Elem::remove_links_to_me(), libMesh::BoundaryInfo::remove_shellface(), libMesh::BoundaryInfo::remove_side(), BoundaryMeshTest::sanityCheck(), libMesh::BoundaryInfo::shellface_boundary_ids(), libMesh::BoundaryInfo::side_with_boundary_id(), libMesh::BoundaryInfo::sides_with_boundary_id(), libMesh::UnstructuredMesh::stitching_helper(), libMesh::MeshRefinement::test_level_one(), libMesh::Elem::top_parent(), libMesh::Elem::topological_neighbor(), libMesh::MeshTetInterface::volume_to_surface_mesh(), and libMesh::Elem::which_neighbor_am_i().

3025 {
3026 #ifdef LIBMESH_ENABLE_AMR
3027 
3028  // if I don't have a parent I was
3029  // created directly from file
3030  // or by the user, so I am a
3031  // level-0 element
3032  if (this->parent() == nullptr)
3033  return 0;
3034 
3035  // if the parent and this element are of different
3036  // dimensionality we are at the same level as
3037  // the parent (e.g. we are the 2D side of a
3038  // 3D element)
3039  if (this->dim() != this->parent()->dim())
3040  return this->parent()->level();
3041 
3042  // otherwise we are at a level one
3043  // higher than our parent
3044  return (this->parent()->level() + 1);
3045 
3046 #else
3047 
3048  // Without AMR all elements are
3049  // at level 0.
3050  return 0;
3051 
3052 #endif
3053 }
const Elem * parent() const
Definition: elem.h:2980
unsigned int level() const
Definition: elem.h:3024
virtual unsigned short dim() const =0

◆ libmesh_assert_valid_neighbors()

void libMesh::Elem::libmesh_assert_valid_neighbors ( ) const
inherited

Checks for consistent neighbor links on this element.

Definition at line 1254 of file elem.C.

References libMesh::Elem::dim(), libMesh::libmesh_assert(), libMesh::Elem::n_neighbors(), libMesh::Elem::neighbor_ptr(), libMesh::Elem::parent(), libMesh::remote_elem, libMesh::Elem::side_index_range(), libMesh::Elem::subactive(), and libMesh::Elem::which_neighbor_am_i().

1255 {
1256  for (auto n : this->side_index_range())
1257  {
1258  const Elem * neigh = this->neighbor_ptr(n);
1259 
1260  // Any element might have a remote neighbor; checking
1261  // to make sure that's not inaccurate is tough.
1262  if (neigh == remote_elem)
1263  continue;
1264 
1265  if (neigh)
1266  {
1267  // Only subactive elements have subactive neighbors
1268  libmesh_assert (this->subactive() || !neigh->subactive());
1269 
1270  const Elem * elem = this;
1271 
1272  // If we're subactive but our neighbor isn't, its
1273  // return neighbor link will be to our first active
1274  // ancestor OR to our inactive ancestor of the same
1275  // level as neigh,
1276  if (this->subactive() && !neigh->subactive())
1277  {
1278  for (elem = this; !elem->active();
1279  elem = elem->parent())
1280  libmesh_assert(elem);
1281  }
1282  else
1283  {
1284  unsigned int rev = neigh->which_neighbor_am_i(elem);
1285  libmesh_assert_less (rev, neigh->n_neighbors());
1286 
1287  if (this->subactive() && !neigh->subactive())
1288  {
1289  while (neigh->neighbor_ptr(rev) != elem)
1290  {
1291  libmesh_assert(elem->parent());
1292  elem = elem->parent();
1293  }
1294  }
1295  else
1296  {
1297  const Elem * nn = neigh->neighbor_ptr(rev);
1298  libmesh_assert(nn);
1299 
1300  for (; elem != nn; elem = elem->parent())
1301  libmesh_assert(elem);
1302  }
1303  }
1304  }
1305  // If we don't have a neighbor and we're not subactive, our
1306  // ancestors shouldn't have any neighbors in this same
1307  // direction.
1308  else if (!this->subactive())
1309  {
1310  const Elem * my_parent = this->parent();
1311  if (my_parent &&
1312  // A parent with a different dimension isn't really one of
1313  // our ancestors, it means we're on a boundary mesh and this
1314  // is an interior mesh element for which we're on a side.
1315  // Nothing to test for in that case.
1316  (my_parent->dim() == this->dim()))
1317  libmesh_assert (!my_parent->neighbor_ptr(n));
1318  }
1319  }
1320 }
const Elem * parent() const
Definition: elem.h:2980
IntRange< unsigned short > side_index_range() const
Definition: elem.h:2623
libmesh_assert(ctx)
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
const Elem * neighbor_ptr(unsigned int i) const
Definition: elem.h:2520
virtual unsigned short dim() const =0
bool subactive() const
Definition: elem.h:2909
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ libmesh_assert_valid_node_pointers()

void libMesh::Elem::libmesh_assert_valid_node_pointers ( ) const
inherited

Checks for a valid id and pointers to nodes with valid ids on this element.

Definition at line 1242 of file elem.C.

References libMesh::libmesh_assert(), libMesh::Elem::node_index_range(), libMesh::Elem::node_ptr(), and libMesh::DofObject::valid_id().

1243 {
1244  libmesh_assert(this->valid_id());
1245  for (auto n : this->node_index_range())
1246  {
1247  libmesh_assert(this->node_ptr(n));
1248  libmesh_assert(this->node_ptr(n)->valid_id());
1249  }
1250 }
libmesh_assert(ctx)
bool valid_id() const
Definition: dof_object.h:885
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444
IntRange< unsigned short > node_index_range() const
Definition: elem.h:2605

◆ local_edge_node()

unsigned int libMesh::Hex20::local_edge_node ( unsigned int  edge,
unsigned int  edge_node 
) const
overridevirtual
Returns
Hex20::edge_nodes_map[edge][edge_node] after doing some range checking.

Reimplemented from libMesh::Hex.

Definition at line 192 of file cell_hex20.C.

References edge_nodes_map, libMesh::Hex::n_edges(), and nodes_per_edge.

194 {
195  libmesh_assert_less (edge, this->n_edges());
196  libmesh_assert_less (edge_node, Hex20::nodes_per_edge);
197 
198  return Hex20::edge_nodes_map[edge][edge_node];
199 }
static const unsigned int edge_nodes_map[num_edges][nodes_per_edge]
This maps the node of the edge to element node numbers.
Definition: cell_hex20.h:227
virtual unsigned int n_edges() const override final
Definition: cell_hex.h:90
static const int nodes_per_edge
Definition: cell_hex20.h:215

◆ local_node()

unsigned int libMesh::Elem::local_node ( const dof_id_type  i) const
inlineinherited
Returns
The local id number of global Node id i, or invalid_uint if Node id i is not local.

Definition at line 2424 of file elem.h.

References libMesh::invalid_uint, libMesh::make_range(), libMesh::Elem::n_nodes(), and libMesh::Elem::node_id().

Referenced by libMesh::UnstructuredMesh::stitching_helper().

2425 {
2426  for (auto n : make_range(this->n_nodes()))
2427  if (this->node_id(n) == i)
2428  return n;
2429 
2430  return libMesh::invalid_uint;
2431 }
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:293
virtual unsigned int n_nodes() const =0
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:2412

◆ local_side_node()

unsigned int libMesh::Hex20::local_side_node ( unsigned int  side,
unsigned int  side_node 
) const
overridevirtual
Returns
Hex20::side_nodes_map[side][side_node] after doing some range checking.

Reimplemented from libMesh::Hex.

Definition at line 181 of file cell_hex20.C.

References libMesh::Hex::n_sides(), nodes_per_side, and side_nodes_map.

183 {
184  libmesh_assert_less (side, this->n_sides());
185  libmesh_assert_less (side_node, Hex20::nodes_per_side);
186 
187  return Hex20::side_nodes_map[side][side_node];
188 }
virtual unsigned int n_sides() const override final
Definition: cell_hex.h:80
static const unsigned int side_nodes_map[num_sides][nodes_per_side]
This maps the node of the side to element node numbers.
Definition: cell_hex20.h:221
static const int nodes_per_side
Definition: cell_hex20.h:214

◆ local_singular_node()

virtual unsigned int libMesh::Elem::local_singular_node ( const Point ,
const Real  = TOLERANCE*TOLERANCE 
) const
inlinevirtualinherited
Returns
The local node index of the given point IF said node has a singular Jacobian for this element. If the given point is not a node or is a node and does not have a singular Jacobian, this will return invalid_uint.

The intention is for this to be overridden in derived element classes that do have nodes that have singular Jacobians. When mapping failures are caught, we can check this to see if the failed physical point is actually a singular point and return the correct master point.

Reimplemented in libMesh::Pyramid.

Definition at line 1780 of file elem.h.

References libMesh::invalid_uint.

Referenced by libMesh::FEMap::inverse_map().

1781  { return invalid_uint; }
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:293

◆ loose_bounding_box()

BoundingBox libMesh::Cell::loose_bounding_box ( ) const
overridevirtualinherited
Returns
A bounding box (not necessarily the minimal bounding box) containing the geometric element.

Reimplemented from libMesh::Elem.

Reimplemented in libMesh::Hex8, libMesh::Prism6, and libMesh::Pyramid5.

Definition at line 26 of file cell.C.

References libMesh::Elem::build_side_ptr(), libMesh::Elem::n_sides(), libMesh::Elem::side_ptr(), and libMesh::BoundingBox::union_with().

27 {
28  // This might have curved sides, but it's definitely *not* curving
29  // through 4-D space, so the full bounding box is just the merger of
30  // the sides' bounding boxes.
31 
32  std::unique_ptr<const Elem> side_ptr { this->build_side_ptr(0, false) };
33  BoundingBox bbox = side_ptr->loose_bounding_box();
34  unsigned int my_n_sides = this->n_sides();
35  for (unsigned s=1; s < my_n_sides; ++s)
36  {
37  this->build_side_ptr(side_ptr, s);
38  bbox.union_with(side_ptr->loose_bounding_box());
39  }
40 
41  return bbox;
42 }
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i, bool proxy=false)=0
virtual unsigned int n_sides() const =0
virtual std::unique_ptr< Elem > side_ptr(unsigned int i)=0

◆ low_order_key()

dof_id_type libMesh::Hex::low_order_key ( const unsigned int  s) const
overridevirtualinherited
Returns
An id associated with the s side of this element, as defined solely by element vertices. The id is not necessarily unique, but should be close. This is particularly useful in the MeshBase::find_neighbors() routine.

Implements libMesh::Elem.

Definition at line 114 of file cell_hex.C.

References libMesh::Elem::compute_key(), libMesh::Hex::n_sides(), libMesh::Elem::node_id(), and libMesh::Hex8::side_nodes_map.

115 {
116  libmesh_assert_less (s, this->n_sides());
117 
118  return this->compute_key(this->node_id(Hex8::side_nodes_map[s][0]),
119  this->node_id(Hex8::side_nodes_map[s][1]),
120  this->node_id(Hex8::side_nodes_map[s][2]),
121  this->node_id(Hex8::side_nodes_map[s][3]));
122 }
static const unsigned int side_nodes_map[num_sides][nodes_per_side]
This maps the node of the side to element node numbers.
Definition: cell_hex8.h:171
virtual unsigned int n_sides() const override final
Definition: cell_hex.h:80
static dof_id_type compute_key(dof_id_type n0)
Definition: elem.h:3244
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:2412

◆ make_links_to_me_local()

void libMesh::Elem::make_links_to_me_local ( unsigned int  n,
unsigned int  neighbor_side 
)
inherited

Resets the neighbor_side pointers of our nth neighbor (and its descendants, if appropriate) to point to this Elem instead of to the global remote_elem.

Used by the library when a formerly remote element is being added to the local processor.

Definition at line 1326 of file elem.C.

References libMesh::Elem::active(), libMesh::Elem::family_tree_by_side(), libMesh::Elem::has_children(), libMesh::Elem::is_remote(), libMesh::Elem::JUST_REFINED, libMesh::Elem::level(), libMesh::libmesh_assert(), libMesh::Elem::neighbor_ptr(), libMesh::Elem::parent(), libMesh::Elem::refinement_flag(), libMesh::remote_elem, and libMesh::Elem::subactive().

1327 {
1328  Elem * neigh = this->neighbor_ptr(n);
1329 
1330  // Don't bother calling this function unless it's necessary
1331  libmesh_assert(neigh);
1332  libmesh_assert(!neigh->is_remote());
1333 
1334  // We never have neighbors more refined than us
1335  libmesh_assert_less_equal (neigh->level(), this->level());
1336 
1337  // We never have subactive neighbors of non subactive elements
1338  libmesh_assert(!neigh->subactive() || this->subactive());
1339 
1340  // If we have a neighbor less refined than us then it must not
1341  // have any more refined descendants we could have pointed to
1342  // instead.
1343  libmesh_assert((neigh->level() == this->level()) ||
1344  (neigh->active() && !this->subactive()) ||
1345  (!neigh->has_children() && this->subactive()));
1346 
1347  // If neigh is at our level, then its family might have
1348  // remote_elem neighbor links which need to point to us
1349  // instead, but if not, then we're done.
1350  if (neigh->level() != this->level())
1351  return;
1352 
1353  // What side of neigh are we on? nn.
1354  //
1355  // We can't use the usual Elem method because we're in the middle of
1356  // restoring topology. We can't compare side_ptr nodes because
1357  // users want to abuse neighbor_ptr to point to
1358  // not-technically-neighbors across mesh slits. We can't compare
1359  // node locations because users want to move those
1360  // not-technically-neighbors until they're
1361  // not-even-geometrically-neighbors.
1362 
1363  // Find any elements that ought to point to elem
1364  std::vector<Elem *> neigh_family;
1365 #ifdef LIBMESH_ENABLE_AMR
1366  if (this->active())
1367  neigh->family_tree_by_side(neigh_family, nn);
1368  else
1369 #endif
1370  neigh_family.push_back(neigh);
1371 
1372  // And point them to elem
1373  for (auto & neigh_family_member : neigh_family)
1374  {
1375  // Only subactive elements point to other subactive elements
1376  if (this->subactive() && !neigh_family_member->subactive())
1377  continue;
1378 
1379  // Ideally, the neighbor link ought to either be correct
1380  // already or ought to be to remote_elem.
1381  //
1382  // However, if we're redistributing a newly created elem,
1383  // after an AMR step but before find_neighbors has fixed up
1384  // neighbor links, we might have an out of date neighbor
1385  // link to elem's parent instead.
1386 #ifdef LIBMESH_ENABLE_AMR
1387  libmesh_assert((neigh_family_member->neighbor_ptr(nn) &&
1388  (neigh_family_member->neighbor_ptr(nn)->active() ||
1389  neigh_family_member->neighbor_ptr(nn)->is_ancestor_of(this))) ||
1390  (neigh_family_member->neighbor_ptr(nn) == remote_elem) ||
1391  ((this->refinement_flag() == JUST_REFINED) &&
1392  (this->parent() != nullptr) &&
1393  (neigh_family_member->neighbor_ptr(nn) == this->parent())));
1394 #else
1395  libmesh_assert((neigh_family_member->neighbor_ptr(nn) == this) ||
1396  (neigh_family_member->neighbor_ptr(nn) == remote_elem));
1397 #endif
1398 
1399  neigh_family_member->set_neighbor(nn, this);
1400  }
1401 }
RefinementState refinement_flag() const
Definition: elem.h:3160
const Elem * parent() const
Definition: elem.h:2980
libmesh_assert(ctx)
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
const Elem * neighbor_ptr(unsigned int i) const
Definition: elem.h:2520
unsigned int level() const
Definition: elem.h:3024
bool subactive() const
Definition: elem.h:2909
bool active() const
Definition: elem.h:2891
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ make_links_to_me_remote()

void libMesh::Elem::make_links_to_me_remote ( )
inherited

Resets this element's neighbors' appropriate neighbor pointers and its parent's and children's appropriate pointers to point to the global remote_elem instead of this.

Used by the library before an element becomes remote on the local processor.

Definition at line 1404 of file elem.C.

References libMesh::Elem::child_ptr(), libMesh::Elem::child_ref_range(), libMesh::Elem::dim(), libMesh::Elem::has_children(), libMesh::Elem::level(), libMesh::libmesh_assert(), libMesh::Elem::neighbor_ptr_range(), libMesh::Elem::parent(), libMesh::remote_elem, libMesh::Elem::set_child(), libMesh::Elem::subactive(), and libMesh::Elem::which_child_am_i().

Referenced by libMesh::MeshCommunication::delete_remote_elements().

1405 {
1406  libmesh_assert_not_equal_to (this, remote_elem);
1407 
1408  // We need to have handled any children first
1409 #if defined(LIBMESH_ENABLE_AMR) && defined(DEBUG)
1410  if (this->has_children())
1411  for (auto & child : this->child_ref_range())
1412  libmesh_assert_equal_to (&child, remote_elem);
1413 #endif
1414 
1415  // Remotify any neighbor links
1416  for (auto neigh : this->neighbor_ptr_range())
1417  {
1418  if (neigh && neigh != remote_elem)
1419  {
1420  // My neighbor should never be more refined than me; my real
1421  // neighbor would have been its parent in that case.
1422  libmesh_assert_greater_equal (this->level(), neigh->level());
1423 
1424  if (this->level() == neigh->level() &&
1425  neigh->has_neighbor(this))
1426  {
1427 #ifdef LIBMESH_ENABLE_AMR
1428  // My neighbor may have descendants which also consider me a
1429  // neighbor
1430  std::vector<Elem *> family;
1431  neigh->total_family_tree_by_neighbor (family, this);
1432 
1433  // FIXME - There's a lot of ugly const_casts here; we
1434  // may want to make remote_elem non-const
1435  for (auto & n : family)
1436  {
1437  libmesh_assert (n);
1438  if (n == remote_elem)
1439  continue;
1440  unsigned int my_s = n->which_neighbor_am_i(this);
1441  libmesh_assert_less (my_s, n->n_neighbors());
1442  libmesh_assert_equal_to (n->neighbor_ptr(my_s), this);
1443  n->set_neighbor(my_s, const_cast<RemoteElem *>(remote_elem));
1444  }
1445 #else
1446  unsigned int my_s = neigh->which_neighbor_am_i(this);
1447  libmesh_assert_less (my_s, neigh->n_neighbors());
1448  libmesh_assert_equal_to (neigh->neighbor_ptr(my_s), this);
1449  neigh->set_neighbor(my_s, const_cast<RemoteElem *>(remote_elem));
1450 #endif
1451  }
1452 #ifdef LIBMESH_ENABLE_AMR
1453  // Even if my neighbor doesn't link back to me, it might
1454  // have subactive descendants which do
1455  else if (neigh->has_children())
1456  {
1457  // If my neighbor at the same level doesn't have me as a
1458  // neighbor, I must be subactive
1459  libmesh_assert(this->level() > neigh->level() ||
1460  this->subactive());
1461 
1462  // My neighbor must have some ancestor of mine as a
1463  // neighbor
1464  Elem * my_ancestor = this->parent();
1465  libmesh_assert(my_ancestor);
1466  while (!neigh->has_neighbor(my_ancestor))
1467  {
1468  my_ancestor = my_ancestor->parent();
1469  libmesh_assert(my_ancestor);
1470  }
1471 
1472  // My neighbor may have descendants which consider me a
1473  // neighbor
1474  std::vector<Elem *> family;
1475  neigh->total_family_tree_by_subneighbor (family, my_ancestor, this);
1476 
1477  for (auto & n : family)
1478  {
1479  libmesh_assert (n);
1480  if (n->is_remote())
1481  continue;
1482  unsigned int my_s = n->which_neighbor_am_i(this);
1483  libmesh_assert_less (my_s, n->n_neighbors());
1484  libmesh_assert_equal_to (n->neighbor_ptr(my_s), this);
1485  // TODO: we may want to make remote_elem non-const.
1486  n->set_neighbor(my_s, const_cast<RemoteElem *>(remote_elem));
1487  }
1488  }
1489 #endif
1490  }
1491  }
1492 
1493 #ifdef LIBMESH_ENABLE_AMR
1494  // Remotify parent's child link
1495  Elem * my_parent = this->parent();
1496  if (my_parent &&
1497  // As long as it's not already remote
1498  my_parent != remote_elem &&
1499  // And it's a real parent, not an interior parent
1500  this->dim() == my_parent->dim())
1501  {
1502  unsigned int me = my_parent->which_child_am_i(this);
1503  libmesh_assert_equal_to (my_parent->child_ptr(me), this);
1504  my_parent->set_child(me, const_cast<RemoteElem *>(remote_elem));
1505  }
1506 #endif
1507 }
const Elem * parent() const
Definition: elem.h:2980
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
Definition: elem.h:2296
libmesh_assert(ctx)
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
unsigned int level() const
Definition: elem.h:3024
virtual unsigned short dim() const =0
bool subactive() const
Definition: elem.h:2909
SimpleRange< NeighborPtrIter > neighbor_ptr_range()
Returns a range with all neighbors of an element, usable in range-based for loops.
Definition: elem.h:3439
bool has_children() const
Definition: elem.h:2929
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ mapping_data()

unsigned char libMesh::Elem::mapping_data ( ) const
inlineinherited

◆ mapping_type()

ElemMappingType libMesh::Elem::mapping_type ( ) const
inlineinherited
Returns
The value of the mapping type for the element.

Definition at line 3070 of file elem.h.

References libMesh::Elem::_map_type.

Referenced by libMesh::MeshTools::Modification::all_tri(), libMesh::InfHex8::build_edge_ptr(), libMesh::InfPrism6::build_edge_ptr(), libMesh::InfHex18::build_edge_ptr(), libMesh::InfPrism12::build_edge_ptr(), libMesh::InfHex16::build_edge_ptr(), libMesh::InfQuad4::build_side_ptr(), libMesh::InfHex8::build_side_ptr(), libMesh::InfPrism6::build_side_ptr(), libMesh::InfHex18::build_side_ptr(), libMesh::InfQuad6::build_side_ptr(), libMesh::Pyramid5::build_side_ptr(), libMesh::Prism6::build_side_ptr(), libMesh::InfPrism12::build_side_ptr(), libMesh::InfHex16::build_side_ptr(), libMesh::C0Polygon::build_side_ptr(), libMesh::Pyramid13::build_side_ptr(), libMesh::Prism15::build_side_ptr(), libMesh::Prism18::build_side_ptr(), libMesh::Pyramid14::build_side_ptr(), libMesh::Prism20::build_side_ptr(), libMesh::Prism21::build_side_ptr(), libMesh::Pyramid18::build_side_ptr(), libMesh::MeshTools::clear_spline_nodes(), libMesh::Elem::disconnected_clone(), libMesh::MeshTools::Modification::flatten(), libMesh::Elem::get_info(), libMesh::Quad4::has_invertible_map(), libMesh::Edge3::has_invertible_map(), libMesh::Edge4::has_invertible_map(), libMesh::QComposite< QSubCell >::init(), libMesh::FEMap::map_fe_type(), libMesh::Polygon::Polygon(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::FE< Dim, LAGRANGE_VEC >::reinit(), libMesh::Edge::side_ptr(), libMesh::Elem::simple_build_edge_ptr(), libMesh::Elem::simple_build_side_ptr(), libMesh::C0Polygon::true_centroid(), libMesh::C0Polygon::volume(), libMesh::Quad8::volume(), libMesh::Quad9::volume(), libMesh::Tri6::volume(), libMesh::Pyramid13::volume(), volume(), libMesh::Tet10::volume(), libMesh::Prism15::volume(), libMesh::Pyramid14::volume(), libMesh::Hex27::volume(), and libMesh::Prism18::volume().

3071 {
3072  return static_cast<ElemMappingType>(_map_type);
3073 }
unsigned char _map_type
Mapping function type; currently either 0 (LAGRANGE) or 1 (RATIONAL_BERNSTEIN).
Definition: elem.h:2247
ElemMappingType
Enumeration of possible element master->physical mapping types.

◆ master_point()

virtual Point libMesh::Hex::master_point ( const unsigned int  i) const
inlinefinaloverridevirtualinherited
Returns
The Point associated with local Node i, in master element rather than physical coordinates.

Implements libMesh::Elem.

Definition at line 62 of file cell_hex.h.

References libMesh::Hex::_master_points, and libMesh::Elem::n_nodes().

63  {
64  libmesh_assert_less(i, this->n_nodes());
65  return Point(_master_points[i][0],
66  _master_points[i][1],
67  _master_points[i][2]);
68  }
static const Real _master_points[27][3]
Master element node locations.
Definition: cell_hex.h:230
virtual unsigned int n_nodes() const =0

◆ max_descendant_p_level()

unsigned int libMesh::Elem::max_descendant_p_level ( ) const
inlineinherited
Returns
The maximum value of the p-refinement levels of an ancestor element's descendants.

Definition at line 3196 of file elem.h.

References libMesh::Elem::_p_level, libMesh::Elem::active(), libMesh::Elem::child_ref_range(), libMesh::libmesh_assert(), libMesh::Elem::p_level(), and libMesh::Elem::subactive().

Referenced by libMesh::FEGenericBase< FEOutputType< T >::type >::coarsened_dof_values().

3197 {
3198  // This is undefined for subactive elements,
3199  // which have no active descendants
3200  libmesh_assert (!this->subactive());
3201  if (this->active())
3202  return this->p_level();
3203 
3204  unsigned int max_p_level = _p_level;
3205  for (auto & c : child_ref_range())
3206  max_p_level = std::max(max_p_level,
3207  c.max_descendant_p_level());
3208  return max_p_level;
3209 }
unsigned char _p_level
p refinement level - the difference between the polynomial degree on this element and the minimum pol...
Definition: elem.h:2240
unsigned int p_level() const
Definition: elem.h:3058
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
Definition: elem.h:2296
libmesh_assert(ctx)
bool subactive() const
Definition: elem.h:2909
bool active() const
Definition: elem.h:2891

◆ min_new_p_level_by_neighbor()

unsigned int libMesh::Elem::min_new_p_level_by_neighbor ( const Elem neighbor,
unsigned int  current_min 
) const
inherited
Returns
The minimum new p-refinement level (i.e. after refinement and coarsening is done) of elements which are descended from this element and which share a side with the active neighbor.

Definition at line 2223 of file elem.C.

References libMesh::Elem::active(), libMesh::Elem::child_ref_range(), libMesh::Elem::COARSEN, libMesh::Elem::has_neighbor(), libMesh::libmesh_assert(), libMesh::Elem::p_level(), libMesh::Elem::p_refinement_flag(), libMesh::Elem::REFINE, libMesh::remote_elem, and libMesh::Elem::subactive().

2225 {
2226  libmesh_assert(!this->subactive());
2227  libmesh_assert(neighbor_in->active());
2228 
2229  // If we're an active element this is simple
2230  if (this->active())
2231  {
2232  unsigned int new_p_level = this->p_level();
2233  if (this->p_refinement_flag() == Elem::REFINE)
2234  new_p_level += 1;
2235  if (this->p_refinement_flag() == Elem::COARSEN)
2236  {
2237  libmesh_assert_greater (new_p_level, 0);
2238  new_p_level -= 1;
2239  }
2240  return std::min(current_min, new_p_level);
2241  }
2242 
2243  libmesh_assert(has_neighbor(neighbor_in));
2244 
2245  unsigned int min_p_level = current_min;
2246 
2247  for (auto & c : this->child_ref_range())
2248  if (&c != remote_elem && c.has_neighbor(neighbor_in))
2249  min_p_level =
2250  c.min_new_p_level_by_neighbor(neighbor_in, min_p_level);
2251 
2252  return min_p_level;
2253 }
bool has_neighbor(const Elem *elem) const
Definition: elem.h:2550
RefinementState p_refinement_flag() const
Definition: elem.h:3176
unsigned int p_level() const
Definition: elem.h:3058
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
Definition: elem.h:2296
libmesh_assert(ctx)
bool subactive() const
Definition: elem.h:2909
bool active() const
Definition: elem.h:2891
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ min_p_level_by_neighbor()

unsigned int libMesh::Elem::min_p_level_by_neighbor ( const Elem neighbor,
unsigned int  current_min 
) const
inherited
Returns
The minimum p-refinement level of elements which are descended from this element, and which share a side with the active neighbor.

Definition at line 2194 of file elem.C.

References libMesh::Elem::active(), libMesh::Elem::child_ref_range(), libMesh::Elem::has_neighbor(), libMesh::libmesh_assert(), libMesh::Elem::p_level(), libMesh::remote_elem, and libMesh::Elem::subactive().

Referenced by libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), and libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints().

2196 {
2197  libmesh_assert(!this->subactive());
2198  libmesh_assert(neighbor_in->active());
2199 
2200  // If we're an active element this is simple
2201  if (this->active())
2202  return std::min(current_min, this->p_level());
2203 
2204  libmesh_assert(has_neighbor(neighbor_in));
2205 
2206  // The p_level() of an ancestor element is already the minimum
2207  // p_level() of its children - so if that's high enough, we don't
2208  // need to examine any children.
2209  if (current_min <= this->p_level())
2210  return current_min;
2211 
2212  unsigned int min_p_level = current_min;
2213 
2214  for (auto & c : this->child_ref_range())
2215  if (&c != remote_elem && c.has_neighbor(neighbor_in))
2216  min_p_level =
2217  c.min_p_level_by_neighbor(neighbor_in, min_p_level);
2218 
2219  return min_p_level;
2220 }
bool has_neighbor(const Elem *elem) const
Definition: elem.h:2550
unsigned int p_level() const
Definition: elem.h:3058
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
Definition: elem.h:2296
libmesh_assert(ctx)
bool subactive() const
Definition: elem.h:2909
bool active() const
Definition: elem.h:2891
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ n_children()

virtual unsigned int libMesh::Hex::n_children ( ) const
inlinefinaloverridevirtualinherited
Returns
8.

Implements libMesh::Elem.

Definition at line 100 of file cell_hex.h.

Referenced by libMesh::Hex::is_child_on_side().

100 { return 8; }

◆ n_comp()

unsigned int libMesh::DofObject::n_comp ( const unsigned int  s,
const unsigned int  var 
) const
inlineinherited
Returns
The number of components for variable var of system s associated with this DofObject. For example, the HIERARCHIC shape functions may have multiple DoFs associated with one node. Another example is the MONOMIALs, where only the elements hold the DoFs. For the different spatial directions, and orders, see FE.

Definition at line 1002 of file dof_object.h.

References libMesh::DofObject::n_comp_group(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_vars(), and libMesh::DofObject::var_to_vg().

Referenced by libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), libMesh::DofMap::constrain_p_dofs(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_nodal_solution(), libMesh::DofMap::distribute_dofs(), libMesh::DofObject::dof_number(), libMesh::DofObject::DofObject(), libMesh::OldSolutionCoefs< Output, point_output >::eval_at_node(), libMesh::OldSolutionValue< Output, point_output >::eval_at_node(), libMesh::OldSolutionCoefs< Output, point_output >::eval_mixed_derivatives(), libMesh::OldSolutionValue< Output, point_output >::eval_mixed_derivatives(), libMesh::Node::get_info(), libMesh::Elem::get_info(), libMesh::DofMap::local_variable_indices(), main(), libMesh::DofObject::n_dofs(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::DofObject::operator=(), libMesh::DofObject::print_dof_info(), libMesh::DofObject::set_dof_number(), libMesh::DofObject::set_n_vars_per_group(), libMesh::DofMap::set_nonlocal_dof_objects(), and libMesh::Nemesis_IO_Helper::write_nodal_solution().

1004 {
1005  libmesh_assert_less (s, this->n_systems());
1006  libmesh_assert_less (var, this->n_vars(s));
1007 
1008  return this->n_comp_group(s,this->var_to_vg(s,var));
1009 }
unsigned int var_to_vg(const unsigned int s, const unsigned int var) const
Utility function - for variable var in system s, figure out what variable group it lives in...
Definition: dof_object.h:1341
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
unsigned int n_comp_group(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:1015

◆ n_comp_group()

unsigned int libMesh::DofObject::n_comp_group ( const unsigned int  s,
const unsigned int  vg 
) const
inlineinherited
Returns
The number of components for VariableGroup vg of system s associated with this DofObject. For example, the HIERARCHIC shape functions may have multiple DoFs associated with one node. Another example is the MONOMIALs, where only the elements hold the DoFs. For the different spatial directions, and orders, see FE.

Definition at line 1015 of file dof_object.h.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), libMesh::DofObject::ncv_magic, and libMesh::DofObject::start_idx().

Referenced by libMesh::DofMap::_dof_indices(), libMesh::DofMap::_node_dof_indices(), libMesh::DofMap::distribute_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::DofMap::dof_indices(), libMesh::DofObject::dof_number(), libMesh::OldSolutionCoefs< Output, point_output >::eval_old_dofs(), libMesh::OldSolutionValue< Output, point_output >::eval_old_dofs(), libMesh::DofObject::invalidate_dofs(), libMesh::DofObject::n_comp(), libMesh::DofMap::old_dof_indices(), libMesh::BuildProjectionList::operator()(), libMesh::DofMap::reinit(), libMesh::DofObject::set_dof_number(), libMesh::DofObject::set_n_comp_group(), libMesh::DofObject::set_n_vars_per_group(), and libMesh::DofMap::set_nonlocal_dof_objects().

1017 {
1018  libmesh_assert_less (s, this->n_systems());
1019  libmesh_assert_less (vg, this->n_var_groups(s));
1020 
1021  const unsigned int
1022  start_idx_sys = this->start_idx(s);
1023 
1024  libmesh_assert_less ((start_idx_sys + 2*vg), _idx_buf.size());
1025 
1026  return (_idx_buf[start_idx_sys + 2*vg] % ncv_magic);
1027 }
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
unsigned int n_systems() const
Definition: dof_object.h:937
unsigned int start_idx(const unsigned int s) const
The starting index for system s.
Definition: dof_object.h:1249
index_buffer_t _idx_buf
Definition: dof_object.h:680
static const index_t ncv_magic
Above we introduced the chimera ncv, which is a hybrid of the form ncv = ncv_magic*nv + nc where nv a...
Definition: dof_object.h:691

◆ n_dofs()

unsigned int libMesh::DofObject::n_dofs ( const unsigned int  s,
const unsigned int  var = libMesh::invalid_uint 
) const
inlineinherited
Returns
The number of degrees of freedom associated with system s directly stored on this object. Optionally only degrees of freedom for variable number var are counted. Does not count degrees of freedom only indirectly associated with this object, such as those stored on an element's nodes when n_dofs() is called on the element itself.

Definition at line 806 of file dof_object.h.

References libMesh::invalid_uint, libMesh::make_range(), libMesh::DofObject::n_comp(), libMesh::DofObject::n_systems(), and libMesh::DofObject::n_vars().

Referenced by libMesh::PetscDMWrapper::add_dofs_helper(), and libMesh::EquationSystems::build_parallel_solution_vector().

808 {
809  libmesh_assert_less (s, this->n_systems());
810 
811  unsigned int num = 0;
812 
813  // Count all variables
814  if (var == libMesh::invalid_uint)
815  for (auto v : make_range(this->n_vars(s)))
816  num += this->n_comp(s,v);
817 
818  // Only count specified variable
819  else
820  num = this->n_comp(s,var);
821 
822  return num;
823 }
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:293
unsigned int n_comp(const unsigned int s, const unsigned int var) const
Definition: dof_object.h:1002
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140

◆ n_edges()

virtual unsigned int libMesh::Hex::n_edges ( ) const
inlinefinaloverridevirtualinherited

◆ n_extra_integers()

unsigned int libMesh::DofObject::n_extra_integers ( ) const
inlineinherited

Returns how many extra integers are associated to the DofObject.

If non-integer data has been associated, each datum of type T counts for sizeof(T)/sizeof(dof_id_type) times in the return value.

Definition at line 1170 of file dof_object.h.

References libMesh::DofObject::_idx_buf, and libMesh::DofObject::start_idx_ints().

Referenced by libMesh::DofObject::add_extra_integers(), libMesh::MeshTools::Modification::all_tri(), libMesh::Elem::disconnected_clone(), libMesh::MeshTools::Modification::flatten(), libMesh::DofObject::get_extra_datum(), libMesh::DofObject::get_extra_integer(), libMesh::CheckpointIO::read_connectivity(), libMesh::CheckpointIO::read_nodes(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::Elem::refine(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::DofObject::set_extra_datum(), libMesh::DofObject::set_extra_integer(), libMesh::DofObject::set_n_systems(), libMesh::DofObject::set_n_vars_per_group(), DofObjectTest< Node >::testAddExtraData(), DofObjectTest< Node >::testAddSystemExtraInts(), DofObjectTest< Node >::testSetNSystemsExtraInts(), and DofObjectTest< Node >::testSetNVariableGroupsExtraInts().

1171 {
1172  if (_idx_buf.empty())
1173  return 0;
1174 
1175  const int hdr = dof_id_signed_type(_idx_buf[0]);
1176  if (hdr >= 0)
1177  return 0;
1178 
1179  const unsigned int start_idx_i = this->start_idx_ints();
1180 
1181  return _idx_buf.size() - start_idx_i;
1182 }
unsigned int start_idx_ints() const
The starting index for an extra_integers pseudosystem.
Definition: dof_object.h:1273
int8_t dof_id_signed_type
Definition: id_types.h:68
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ n_faces()

virtual unsigned int libMesh::Hex::n_faces ( ) const
inlinefinaloverridevirtualinherited
Returns
6. All hexahedra have 6 faces.

Implements libMesh::Elem.

Definition at line 95 of file cell_hex.h.

95 { return 6; }

◆ n_neighbors()

unsigned int libMesh::Elem::n_neighbors ( ) const
inlineinherited
Returns
The number of neighbors the element that has been derived from this class has.

Only face (or edge in 2D) neighbors are stored, so this method returns n_sides(). At one point we intended to allow derived classes to override this, but too much current libMesh code assumes n_neighbors==n_sides.

Definition at line 692 of file elem.h.

References libMesh::Elem::n_sides().

Referenced by libMesh::Elem::_last_side(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints(), libMesh::MeshTools::find_hanging_nodes_and_parents(), libMesh::Tri3Subdivision::get_ordered_valence(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::Elem::libmesh_assert_valid_neighbors(), libMesh::Elem::neighbor_ptr(), libMesh::Elem::neighbor_ptr_range(), libMesh::Elem::nullify_neighbors(), libMesh::Elem::set_neighbor(), libMesh::Elem::topological_neighbor(), and libMesh::Elem::topologically_equal().

693  { return this->n_sides(); }
virtual unsigned int n_sides() const =0

◆ n_nodes()

virtual unsigned int libMesh::Hex20::n_nodes ( ) const
inlineoverridevirtual
Returns
20.

Implements libMesh::Elem.

Definition at line 96 of file cell_hex20.h.

References num_nodes.

Referenced by second_order_adjacent_vertex(), and second_order_child_vertex().

96 { return num_nodes; }
static const int num_nodes
Geometric constants for Hex20.
Definition: cell_hex20.h:213

◆ n_nodes_in_child()

virtual unsigned int libMesh::Elem::n_nodes_in_child ( unsigned  int) const
inlinevirtualinherited
Returns
The number of nodes the given child of this element contains. Except in odd cases like pyramid refinement this will be the same as the number of nodes in the parent element.

Definition at line 652 of file elem.h.

References libMesh::Elem::n_nodes().

Referenced by libMesh::Elem::as_parent_node(), libMesh::Elem::bracketing_nodes(), and libMesh::Elem::parent_bracketing_nodes().

653  { return this->n_nodes(); }
virtual unsigned int n_nodes() const =0

◆ n_objects() [1/2]

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 85 of file reference_counter.h.

References libMesh::ReferenceCounter::_n_objects.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

86  { return _n_objects; }
static Threads::atomic< unsigned int > _n_objects
The number of objects.

◆ n_objects() [2/2]

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 85 of file reference_counter.h.

References libMesh::ReferenceCounter::_n_objects.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

86  { return _n_objects; }
static Threads::atomic< unsigned int > _n_objects
The number of objects.

◆ n_permutations()

virtual unsigned int libMesh::Hex::n_permutations ( ) const
inlinefinaloverridevirtualinherited

Six sides, four orientations per side.

Implements libMesh::Elem.

Definition at line 187 of file cell_hex.h.

187 { return 24; }

◆ n_pseudo_systems()

unsigned int libMesh::DofObject::n_pseudo_systems ( ) const
inlineinherited
Returns
The total number of pseudo-systems associated with this DofObject : n_systems(), plus one iff this->has_extra_integers()

Definition at line 947 of file dof_object.h.

References libMesh::DofObject::_idx_buf.

Referenced by libMesh::DofObject::end_idx(), libMesh::DofObject::set_extra_datum(), and libMesh::DofObject::set_extra_integer().

948 {
949  const int hdr = _idx_buf.empty() ?
950  0 : cast_int<int>(dof_id_signed_type(_idx_buf[0]));
951  return std::abs(hdr);
952 }
int8_t dof_id_signed_type
Definition: id_types.h:68
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ n_second_order_adjacent_vertices()

virtual unsigned int libMesh::Hex20::n_second_order_adjacent_vertices ( const unsigned int  ) const
inlineoverridevirtual
Returns
2 for all n.

Reimplemented from libMesh::Elem.

Definition at line 190 of file cell_hex20.h.

191  { return 2; }

◆ n_sides()

virtual unsigned int libMesh::Hex::n_sides ( ) const
inlinefinaloverridevirtualinherited

◆ n_sub_elem()

virtual unsigned int libMesh::Hex20::n_sub_elem ( ) const
inlineoverridevirtual
Returns
1.

Implements libMesh::Elem.

Definition at line 101 of file cell_hex20.h.

Referenced by connectivity().

101 { return 1; }

◆ n_systems()

unsigned int libMesh::DofObject::n_systems ( ) const
inlineinherited
Returns
The number of systems associated with this DofObject

Definition at line 937 of file dof_object.h.

References libMesh::DofObject::_idx_buf.

Referenced by libMesh::DofMap::_dof_indices(), libMesh::DofObject::add_system(), libMesh::DofObject::dof_number(), libMesh::DofObject::DofObject(), libMesh::DofObject::end_idx(), libMesh::OldSolutionCoefs< Output, point_output >::eval_old_dofs(), libMesh::OldSolutionValue< Output, point_output >::eval_old_dofs(), libMesh::DofObject::get_extra_datum(), libMesh::DofObject::get_extra_integer(), libMesh::Node::get_info(), libMesh::Elem::get_info(), libMesh::DofObject::has_dofs(), libMesh::DofObject::invalidate_dofs(), libMesh::DofObject::n_comp(), libMesh::DofObject::n_comp_group(), libMesh::DofObject::n_dofs(), libMesh::DofObject::n_var_groups(), libMesh::DofObject::n_vars(), libMesh::DofMap::old_dof_indices(), libMesh::DofObject::operator=(), libMesh::DofObject::print_dof_info(), libMesh::Elem::refine(), libMesh::DofObject::set_dof_number(), libMesh::DofObject::set_n_comp(), libMesh::DofObject::set_n_comp_group(), libMesh::DofObject::set_n_systems(), libMesh::DofObject::set_n_vars_per_group(), libMesh::DofObject::set_vg_dof_base(), libMesh::DofObject::start_idx(), libMesh::DofObject::start_idx_ints(), DofObjectTest< Node >::testAddSystemExtraInts(), DofObjectTest< Node >::testSetNSystems(), DofObjectTest< Node >::testSetNSystemsExtraInts(), and libMesh::DofObject::vg_dof_base().

938 {
939  const int hdr = _idx_buf.empty() ?
940  0 : cast_int<int>(dof_id_signed_type(_idx_buf[0]));
941  return hdr >= 0 ? hdr : (-hdr-1);
942 }
int8_t dof_id_signed_type
Definition: id_types.h:68
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ n_var_groups()

unsigned int libMesh::DofObject::n_var_groups ( const unsigned int  s) const
inlineinherited

◆ n_vars() [1/2]

unsigned int libMesh::DofObject::n_vars ( const unsigned int  s,
const unsigned int  vg 
) const
inlineinherited
Returns
The number of Variable variables associated with VariableGroup vg in system s for this DofObject

Definition at line 967 of file dof_object.h.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), libMesh::DofObject::ncv_magic_exp, and libMesh::DofObject::start_idx().

Referenced by libMesh::DofObject::add_system(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::DofMap::distribute_dofs(), libMesh::DofObject::dof_number(), libMesh::DofObject::DofObject(), libMesh::OldSolutionCoefs< Output, point_output >::eval_at_node(), libMesh::OldSolutionValue< Output, point_output >::eval_at_node(), libMesh::OldSolutionCoefs< Output, point_output >::eval_mixed_derivatives(), libMesh::OldSolutionValue< Output, point_output >::eval_mixed_derivatives(), libMesh::Node::get_info(), libMesh::Elem::get_info(), libMesh::DofObject::has_dofs(), libMesh::DofObject::n_comp(), libMesh::DofObject::n_dofs(), libMesh::DofObject::n_vars(), libMesh::BuildProjectionList::operator()(), libMesh::DofObject::operator=(), libMesh::DofObject::print_dof_info(), libMesh::DofObject::set_dof_number(), libMesh::DofObject::set_n_comp(), libMesh::DofObject::set_n_comp_group(), libMesh::DofObject::set_n_systems(), libMesh::DofObject::set_n_vars_per_group(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::DofObject::system_var_to_vg_var(), DofObjectTest< Node >::testAddSystemExtraInts(), DofObjectTest< Node >::testSetNVariableGroups(), DofObjectTest< Node >::testSetNVariableGroupsExtraInts(), libMesh::DofObject::var_to_vg(), and libMesh::DofObject::var_to_vg_and_offset().

969 {
970  libmesh_assert_less (s, this->n_systems());
971  libmesh_assert_less (vg, this->n_var_groups(s));
972 
973  const unsigned int start_idx_sys = this->start_idx(s);
974 
975  libmesh_assert_less ((start_idx_sys + 2*vg), _idx_buf.size());
976 
977  return (cast_int<unsigned int>
978  (_idx_buf[start_idx_sys + 2*vg]) >> ncv_magic_exp);
979 }
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
unsigned int n_systems() const
Definition: dof_object.h:937
unsigned int start_idx(const unsigned int s) const
The starting index for system s.
Definition: dof_object.h:1249
index_buffer_t _idx_buf
Definition: dof_object.h:680
static const index_t ncv_magic_exp
Definition: dof_object.h:692

◆ n_vars() [2/2]

unsigned int libMesh::DofObject::n_vars ( const unsigned int  s) const
inlineinherited
Returns
The number of Variable variables associated with system s for this DofObject

Definition at line 984 of file dof_object.h.

References libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), and libMesh::DofObject::n_vars().

985 {
986  libmesh_assert_less (s, this->n_systems());
987 
988  const unsigned int nvg = this->n_var_groups(s);
989 
990  unsigned int val=0;
991 
992  for (unsigned int vg=0; vg<nvg; vg++)
993  val += this->n_vars(s,vg);
994 
995  return val;
996 }
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937

◆ n_vertices()

virtual unsigned int libMesh::Hex::n_vertices ( ) const
inlinefinaloverridevirtualinherited

◆ neighbor_ptr() [1/2]

const Elem * libMesh::Elem::neighbor_ptr ( unsigned int  i) const
inlineinherited
Returns
A const pointer to the i^{th} neighbor of this element, or nullptr if MeshBase::find_neighbors() has not been called.
Note
If MeshBase::find_neighbors() has been called and this function still returns nullptr, then the side is on a boundary of the domain.

Definition at line 2520 of file elem.h.

References libMesh::Elem::_elemlinks, and libMesh::Elem::n_neighbors().

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::MeshTools::Subdivision::add_boundary_ghosts(), libMesh::BoundaryInfo::add_elements(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::MeshTools::Modification::all_tri(), libMesh::ClawSystem::assemble_avg_coupling_matrices(), assemble_ellipticdg(), libMesh::ClawSystem::assemble_jump_coupling_matrix(), assemble_SchroedingerEquation(), assembly_with_dg_fem_context(), libMesh::BoundaryInfo::boundary_ids(), libMesh::EquationSystems::build_discontinuous_solution_vector(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::clear_stitched_boundary_side_ids(), compute_enriched_soln(), compute_jacobian(), libMesh::FEAbstract::compute_node_constraints(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), libMesh::FEAbstract::compute_periodic_node_constraints(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints(), compute_residual(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::BoundaryInfo::edge_boundary_ids(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::MeshTools::find_hanging_nodes_and_parents(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::MeshTools::Subdivision::find_one_ring(), libMesh::MeshTools::Modification::flatten(), libMesh::ReplicatedMesh::get_disconnected_subdomains(), libMesh::Elem::get_info(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_constraints(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_node_constraints(), libMesh::RBEIMConstruction::initialize_qp_data(), libMesh::Poly2TriTriangulator::insert_refinement_points(), libMesh::Poly2TriTriangulator::is_refine_boundary_allowed(), libMesh::HDGProblem::jacobian(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::Elem::libmesh_assert_valid_neighbors(), libMesh::Elem::make_links_to_me_local(), libMesh::Elem::nullify_neighbors(), libMesh::DefaultCoupling::operator()(), libMesh::C0Polygon::permute(), libMesh::CheckpointIO::read_remote_elem(), libMesh::EquationSystems::redundant_added_side(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::InfFE< Dim, T_radial, T_map >::reinit(), libMesh::FE< Dim, LAGRANGE_VEC >::reinit(), libMesh::FEXYZ< Dim >::reinit(), libMesh::HDGProblem::residual(), libMesh::FE< Dim, LAGRANGE_VEC >::side_map(), libMesh::Elem::SideIter::side_on_boundary(), libMesh::BoundaryInfo::side_with_boundary_id(), libMesh::BoundaryInfo::sides_with_boundary_id(), libMesh::MeshTools::Modification::smooth(), libMesh::UnstructuredMesh::stitching_helper(), libMesh::Elem::swap2neighbors(), ElemTest< elem_type >::test_orient_elements(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshBaseTest::testMeshBaseVerifyIsPrepared(), InfFERadialTest::testSides(), libMesh::Elem::topological_neighbor(), libMesh::MeshRefinement::topological_neighbor(), libMesh::Elem::topologically_equal(), libMesh::MeshTetInterface::volume_to_surface_mesh(), libMesh::Elem::which_neighbor_am_i(), and libMesh::CheckpointIO::write_remote_elem().

2521 {
2522  libmesh_assert_less (i, this->n_neighbors());
2523 
2524  return _elemlinks[i+1];
2525 }
Elem ** _elemlinks
Pointers to this element&#39;s parent and neighbors, and for lower-dimensional elements&#39; interior_parent...
Definition: elem.h:2201
unsigned int n_neighbors() const
Definition: elem.h:692

◆ neighbor_ptr() [2/2]

Elem * libMesh::Elem::neighbor_ptr ( unsigned int  i)
inlineinherited
Returns
A non-const pointer to the i^{th} neighbor of this element.

Definition at line 2530 of file elem.h.

References libMesh::Elem::_elemlinks, and libMesh::Elem::n_neighbors().

2531 {
2532  libmesh_assert_less (i, this->n_neighbors());
2533 
2534  return _elemlinks[i+1];
2535 }
Elem ** _elemlinks
Pointers to this element&#39;s parent and neighbors, and for lower-dimensional elements&#39; interior_parent...
Definition: elem.h:2201
unsigned int n_neighbors() const
Definition: elem.h:692

◆ neighbor_ptr_range() [1/2]

SimpleRange< Elem::NeighborPtrIter > libMesh::Elem::neighbor_ptr_range ( )
inlineinherited

Returns a range with all neighbors of an element, usable in range-based for loops.

The exact type of the return value here may be subject to change in future libMesh releases, but the iterators will always dereference to produce a pointer to a neighbor element (or a null pointer, for sides which have no neighbors).

Definition at line 3439 of file elem.h.

References libMesh::Elem::_elemlinks, and libMesh::Elem::n_neighbors().

Referenced by ContrivedPartitioner::_do_partition(), libMesh::MeshTetInterface::check_hull_integrity(), libMesh::Elem::child_neighbor(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::Elem::has_neighbor(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_constraints(), libMesh::Elem::make_links_to_me_remote(), libMesh::Elem::remove_links_to_me(), and DistributedMeshTest::testRemoteElemError().

3440 {
3441  return {_elemlinks+1, _elemlinks + 1 + this->n_neighbors()};
3442 }
Elem ** _elemlinks
Pointers to this element&#39;s parent and neighbors, and for lower-dimensional elements&#39; interior_parent...
Definition: elem.h:2201
unsigned int n_neighbors() const
Definition: elem.h:692

◆ neighbor_ptr_range() [2/2]

SimpleRange< Elem::ConstNeighborPtrIter > libMesh::Elem::neighbor_ptr_range ( ) const
inlineinherited

Definition at line 3446 of file elem.h.

References libMesh::Elem::_elemlinks, and libMesh::Elem::n_neighbors().

3447 {
3448  return {_elemlinks+1, _elemlinks + 1 + this->n_neighbors()};
3449 }
Elem ** _elemlinks
Pointers to this element&#39;s parent and neighbors, and for lower-dimensional elements&#39; interior_parent...
Definition: elem.h:2201
unsigned int n_neighbors() const
Definition: elem.h:692

◆ node_id()

dof_id_type libMesh::Elem::node_id ( const unsigned int  i) const
inlineinherited
Returns
The global id number of local Node i.

Definition at line 2412 of file elem.h.

References libMesh::Elem::_nodes, libMesh::DofObject::id(), libMesh::DofObject::invalid_id, libMesh::libmesh_assert(), and libMesh::Elem::n_nodes().

Referenced by libMesh::UnstructuredMesh::all_first_order(), libMesh::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), assemble_stokes(), libMesh::Elem::bracketing_nodes(), libMesh::Nemesis_IO_Helper::build_element_and_node_maps(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::FEMap::compute_face_map(), libMesh::InfQuad4::connectivity(), libMesh::InfEdge2::connectivity(), libMesh::Edge2::connectivity(), libMesh::Edge3::connectivity(), libMesh::Quad4::connectivity(), libMesh::InfHex8::connectivity(), libMesh::Edge4::connectivity(), libMesh::InfQuad6::connectivity(), libMesh::InfPrism6::connectivity(), libMesh::Pyramid5::connectivity(), libMesh::Tri3::connectivity(), libMesh::Prism6::connectivity(), libMesh::Hex8::connectivity(), libMesh::Quad8::connectivity(), libMesh::InfPrism12::connectivity(), libMesh::Quad9::connectivity(), libMesh::Tri6::connectivity(), libMesh::InfHex16::connectivity(), libMesh::Tri7::connectivity(), libMesh::Tet4::connectivity(), libMesh::InfHex18::connectivity(), connectivity(), libMesh::Tet10::connectivity(), libMesh::Prism15::connectivity(), libMesh::Tet14::connectivity(), libMesh::Hex27::connectivity(), libMesh::Prism18::connectivity(), libMesh::MeshTools::find_hanging_nodes_and_parents(), libMesh::Tri3Subdivision::get_ordered_node(), libMesh::Tri3Subdivision::get_ordered_valence(), libMesh::BoundaryInfo::get_side_and_node_maps(), libMesh::MeshTools::SidesToElemMap::get_sorted_vertex_ids(), libMesh::LaplaceMeshSmoother::init(), libMesh::Tet::key(), libMesh::InfQuad6::key(), libMesh::Prism::key(), libMesh::Pyramid::key(), libMesh::Hex::key(), libMesh::Tri::key(), libMesh::Polygon::key(), libMesh::Quad8::key(), libMesh::Quad9::key(), libMesh::Edge::key(), libMesh::Quad::key(), libMesh::Tri6::key(), libMesh::InfPrism::key(), libMesh::Tri7::key(), libMesh::Hex27::key(), libMesh::InfHex::key(), libMesh::Prism18::key(), libMesh::Pyramid14::key(), libMesh::Edge2::key(), libMesh::InfQuad::key(), libMesh::InfHex18::key(), libMesh::Prism20::key(), libMesh::Prism21::key(), libMesh::Pyramid18::key(), libMesh::Edge4::key(), libMesh::Edge3::key(), libMesh::Tet4::key(), libMesh::Elem::key(), libMesh::MeshTools::libmesh_assert_equal_connectivity(), libMesh::Elem::local_node(), libMesh::Tri3Subdivision::local_node_number(), libMesh::Tet::low_order_key(), libMesh::Prism::low_order_key(), libMesh::Pyramid::low_order_key(), libMesh::Hex::low_order_key(), libMesh::Tri::low_order_key(), libMesh::Polygon::low_order_key(), libMesh::Edge::low_order_key(), libMesh::Quad::low_order_key(), libMesh::InfPrism::low_order_key(), libMesh::InfHex::low_order_key(), libMesh::InfQuad::low_order_key(), libMesh::Elem::operator==(), libMesh::XdrIO::pack_element(), libMesh::CheckpointIO::read_connectivity(), libMesh::Elem::topologically_equal(), libMesh::Elem::write_connectivity(), and libMesh::ExodusII_IO_Helper::write_elements().

2413 {
2414  libmesh_assert_less (i, this->n_nodes());
2415  libmesh_assert(_nodes[i]);
2416  libmesh_assert_not_equal_to (_nodes[i]->id(), Node::invalid_id);
2417 
2418  return _nodes[i]->id();
2419 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
dof_id_type id() const
Definition: dof_object.h:828
virtual unsigned int n_nodes() const =0
libmesh_assert(ctx)
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482

◆ node_index_range()

IntRange< unsigned short > libMesh::Elem::node_index_range ( ) const
inlineinherited

◆ node_ptr() [1/2]

const Node * libMesh::Elem::node_ptr ( const unsigned int  i) const
inlineinherited
Returns
A const pointer to local Node i.

Definition at line 2444 of file elem.h.

References libMesh::Elem::_nodes, libMesh::libmesh_assert(), and libMesh::Elem::n_nodes().

Referenced by libMesh::MeshTools::Subdivision::add_boundary_ghosts(), libMesh::BoundaryInfo::add_elements(), libMesh::MeshRefinement::add_node(), libMesh::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), assemble_shell(), libMesh::EquationSystems::build_discontinuous_solution_vector(), libMesh::InfHex8::build_edge_ptr(), libMesh::InfPrism6::build_edge_ptr(), libMesh::InfHex18::build_edge_ptr(), libMesh::InfPrism12::build_edge_ptr(), libMesh::InfHex16::build_edge_ptr(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::InfQuad4::build_side_ptr(), libMesh::InfHex8::build_side_ptr(), libMesh::InfPrism6::build_side_ptr(), libMesh::InfHex18::build_side_ptr(), libMesh::Pyramid5::build_side_ptr(), libMesh::InfQuad6::build_side_ptr(), libMesh::Prism6::build_side_ptr(), libMesh::InfPrism12::build_side_ptr(), libMesh::InfHex16::build_side_ptr(), libMesh::C0Polygon::build_side_ptr(), libMesh::Pyramid13::build_side_ptr(), libMesh::Prism15::build_side_ptr(), libMesh::Edge::build_side_ptr(), libMesh::Prism18::build_side_ptr(), libMesh::Pyramid14::build_side_ptr(), libMesh::Prism20::build_side_ptr(), libMesh::Prism21::build_side_ptr(), libMesh::Pyramid18::build_side_ptr(), libMesh::BoundaryInfo::clear_stitched_boundary_side_ids(), libMesh::FEMap::compute_affine_map(), libMesh::FEMap::compute_map(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), libMesh::Elem::contains_vertex_of(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::MeshTools::Subdivision::find_one_ring(), libMesh::MeshTools::Modification::flatten(), libMesh::ReplicatedMesh::get_boundary_points(), libMesh::Elem::get_node_index(), libMesh::Elem::is_vertex_on_parent(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::Elem::libmesh_assert_valid_node_pointers(), libMesh::MeshTools::n_connected_components(), libMesh::Elem::node_ref(), libMesh::C0Polygon::permute(), libMesh::Tri3Subdivision::prepare_subdivision_properties(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::FE< Dim, LAGRANGE_VEC >::shape(), libMesh::Tet::side_ptr(), libMesh::Prism::side_ptr(), libMesh::Pyramid::side_ptr(), libMesh::Hex::side_ptr(), libMesh::Tri::side_ptr(), libMesh::Edge::side_ptr(), libMesh::Polygon::side_ptr(), libMesh::Quad::side_ptr(), libMesh::InfPrism::side_ptr(), libMesh::InfHex::side_ptr(), libMesh::InfQuad::side_ptr(), libMesh::Elem::simple_build_edge_ptr(), libMesh::Elem::simple_build_side_ptr(), libMesh::Elem::simple_side_ptr(), libMesh::MeshTools::Modification::smooth(), libMesh::UnstructuredMesh::stitching_helper(), libMesh::Elem::swap2nodes(), SystemsTest::testDofCouplingWithVarGroups(), InfFERadialTest::testInfQuants_numericDeriv(), and InfFERadialTest::testSides().

2445 {
2446  libmesh_assert_less (i, this->n_nodes());
2447  libmesh_assert(_nodes[i]);
2448 
2449  return _nodes[i];
2450 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
virtual unsigned int n_nodes() const =0
libmesh_assert(ctx)

◆ node_ptr() [2/2]

Node * libMesh::Elem::node_ptr ( const unsigned int  i)
inlineinherited
Returns
A non-const pointer to local Node i.

Definition at line 2455 of file elem.h.

References libMesh::Elem::_nodes, libMesh::libmesh_assert(), and libMesh::Elem::n_nodes().

2456 {
2457  libmesh_assert_less (i, this->n_nodes());
2458  libmesh_assert(_nodes[i]);
2459 
2460  return _nodes[i];
2461 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
virtual unsigned int n_nodes() const =0
libmesh_assert(ctx)

◆ node_ref() [1/2]

const Node & libMesh::Elem::node_ref ( const unsigned int  i) const
inlineinherited

◆ node_ref() [2/2]

Node & libMesh::Elem::node_ref ( const unsigned int  i)
inlineinherited
Returns
A writable reference to local Node i.

Definition at line 2474 of file elem.h.

References libMesh::Elem::node_ptr().

2475 {
2476  return *this->node_ptr(i);
2477 }
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444

◆ node_ref_range() [1/2]

SimpleRange< Elem::NodeRefIter > libMesh::Elem::node_ref_range ( )
inlineinherited

◆ node_ref_range() [2/2]

SimpleRange< Elem::ConstNodeRefIter > libMesh::Elem::node_ref_range ( ) const
inlineinherited

Definition at line 2596 of file elem.h.

References libMesh::Elem::_nodes, and libMesh::Elem::n_nodes().

2597 {
2598  return {_nodes, _nodes+this->n_nodes()};
2599 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
virtual unsigned int n_nodes() const =0

◆ nodes_on_edge()

std::vector< unsigned > libMesh::Hex20::nodes_on_edge ( const unsigned int  int) const
overridevirtual
Returns
the (local) node numbers on the specified edge

Implements libMesh::Elem.

Definition at line 103 of file cell_hex20.C.

References edge_nodes_map, and libMesh::Hex::n_edges().

104 {
105  libmesh_assert_less(e, n_edges());
106  return {std::begin(edge_nodes_map[e]), std::end(edge_nodes_map[e])};
107 }
static const unsigned int edge_nodes_map[num_edges][nodes_per_edge]
This maps the node of the edge to element node numbers.
Definition: cell_hex20.h:227
virtual unsigned int n_edges() const override final
Definition: cell_hex.h:90

◆ nodes_on_side()

std::vector< unsigned > libMesh::Hex20::nodes_on_side ( const unsigned int  int) const
overridevirtual
Returns
the (local) node numbers on the specified side

Implements libMesh::Elem.

Definition at line 96 of file cell_hex20.C.

References libMesh::Hex::n_sides(), and side_nodes_map.

97 {
98  libmesh_assert_less(s, n_sides());
99  return {std::begin(side_nodes_map[s]), std::end(side_nodes_map[s])};
100 }
virtual unsigned int n_sides() const override final
Definition: cell_hex.h:80
static const unsigned int side_nodes_map[num_sides][nodes_per_side]
This maps the node of the side to element node numbers.
Definition: cell_hex20.h:221

◆ nullify_neighbors()

void libMesh::Elem::nullify_neighbors ( )
inherited

Replaces this element with nullptr for all of its neighbors.

This is useful when deleting an element.

Definition at line 2885 of file elem.C.

References libMesh::Elem::level(), libMesh::Elem::n_neighbors(), libMesh::Elem::neighbor_ptr(), libMesh::remote_elem, libMesh::Elem::set_neighbor(), libMesh::Elem::side_index_range(), and libMesh::Elem::which_neighbor_am_i().

2886 {
2887  // Tell any of my neighbors about my death...
2888  // Looks strange, huh?
2889  for (auto n : this->side_index_range())
2890  {
2891  Elem * current_neighbor = this->neighbor_ptr(n);
2892  if (current_neighbor && current_neighbor != remote_elem)
2893  {
2894  // Note: it is possible that I see the neighbor
2895  // (which is coarser than me)
2896  // but they don't see me, so avoid that case.
2897  if (current_neighbor->level() == this->level())
2898  {
2899  const unsigned int w_n_a_i = current_neighbor->which_neighbor_am_i(this);
2900  libmesh_assert_less (w_n_a_i, current_neighbor->n_neighbors());
2901  current_neighbor->set_neighbor(w_n_a_i, nullptr);
2902  this->set_neighbor(n, nullptr);
2903  }
2904  }
2905  }
2906 }
IntRange< unsigned short > side_index_range() const
Definition: elem.h:2623
void set_neighbor(const unsigned int i, Elem *n)
Assigns n as the neighbor.
Definition: elem.h:2540
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
const Elem * neighbor_ptr(unsigned int i) const
Definition: elem.h:2520
unsigned int level() const
Definition: elem.h:3024
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ on_boundary()

bool libMesh::Elem::on_boundary ( ) const
inlineinherited
Returns
true if this element has a side coincident with a boundary (indicated by a nullptr neighbor), false otherwise.

Definition at line 2859 of file elem.h.

References libMesh::Elem::has_neighbor().

2860 {
2861  // By convention, the element is on the boundary
2862  // if it has a nullptr neighbor.
2863  return this->has_neighbor(nullptr);
2864 }
bool has_neighbor(const Elem *elem) const
Definition: elem.h:2550

◆ on_reference_element()

bool libMesh::Hex::on_reference_element ( const Point p,
const Real  eps = TOLERANCE 
) const
finaloverridevirtualinherited
Returns
true if the master-space point p is contained in the reference element corresponding to this element, false otherwise.

Since we are doing floating point comparisons here the parameter eps can be specified to indicate a tolerance. For example, x \le 1 becomes x \le 1 + \epsilon .

Implements libMesh::Elem.

Definition at line 577 of file cell_hex.C.

References libMesh::Real.

579 {
580  const Real & xi = p(0);
581  const Real & eta = p(1);
582  const Real & zeta = p(2);
583 
584  // The reference hexahedral element is [-1,1]^3.
585  return ((xi >= -1.-eps) &&
586  (xi <= 1.+eps) &&
587  (eta >= -1.-eps) &&
588  (eta <= 1.+eps) &&
589  (zeta >= -1.-eps) &&
590  (zeta <= 1.+eps));
591 }
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ operator=() [1/2]

Hex20& libMesh::Hex20::operator= ( const Hex20 )
delete

◆ operator=() [2/2]

Hex20& libMesh::Hex20::operator= ( Hex20 &&  )
delete

◆ operator==()

bool libMesh::Elem::operator== ( const Elem rhs) const
inherited
Returns
true if two elements are equivalent, false otherwise. This is true if the elements are connected to identical global nodes, regardless of how those nodes might be numbered local to the elements.

Definition at line 642 of file elem.C.

References libMesh::Elem::n_nodes(), libMesh::Elem::node_id(), and libMesh::Elem::type().

643 {
644  // If the elements aren't the same type, they aren't equal
645  if (this->type() != rhs.type())
646  return false;
647 
648  const unsigned short n_n = this->n_nodes();
649  libmesh_assert_equal_to(n_n, rhs.n_nodes());
650 
651  // Make two sorted arrays of global node ids and compare them for
652  // equality.
653  std::array<dof_id_type, Elem::max_n_nodes> this_ids, rhs_ids;
654 
655  for (unsigned short n = 0; n != n_n; n++)
656  {
657  this_ids[n] = this->node_id(n);
658  rhs_ids[n] = rhs.node_id(n);
659  }
660 
661  // Sort the vectors to rule out different local node numberings.
662  std::sort(this_ids.begin(), this_ids.begin()+n_n);
663  std::sort(rhs_ids.begin(), rhs_ids.begin()+n_n);
664 
665  // If the node ids match, the elements are equal!
666  for (unsigned short n = 0; n != n_n; ++n)
667  if (this_ids[n] != rhs_ids[n])
668  return false;
669  return true;
670 }
virtual unsigned int n_nodes() const =0
virtual ElemType type() const =0
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:2412

◆ opposite_node()

unsigned int libMesh::Hex::opposite_node ( const unsigned int  n,
const unsigned int  s 
) const
finaloverridevirtualinherited
Returns
The local node number for the node opposite to node n on side opposite_side(s) (for a tensor product element), or throws an error otherwise.

Reimplemented from libMesh::Elem.

Definition at line 220 of file cell_hex.C.

References libMesh::Elem::is_node_on_side(), libMesh::libmesh_assert(), libMesh::Elem::n_nodes(), and libMesh::Hex::n_sides().

222 {
223  libmesh_assert_less (node_in, 26);
224  libmesh_assert_less (node_in, this->n_nodes());
225  libmesh_assert_less (side_in, this->n_sides());
226  libmesh_assert(this->is_node_on_side(node_in, side_in));
227 
228  static const unsigned char side05_nodes_map[] =
229  {4, 5, 6, 7, 0, 1, 2, 3, 16, 17, 18, 19, 255, 255, 255, 255, 8, 9, 10, 11, 25, 255, 255, 255, 255, 20};
230  static const unsigned char side13_nodes_map[] =
231  {3, 2, 1, 0, 7, 6, 5, 4, 10, 255, 8, 255, 15, 14, 13, 12, 18, 255, 16, 255, 255, 23, 255, 21, 255, 255};
232  static const unsigned char side24_nodes_map[] =
233  {1, 0, 3, 2, 5, 4, 7, 6, 255, 11, 255, 9, 13, 12, 15, 14, 255, 19, 255, 17, 255, 255, 24, 255, 22, 255};
234 
235  switch (side_in)
236  {
237  case 0:
238  case 5:
239  return side05_nodes_map[node_in];
240  case 1:
241  case 3:
242  return side13_nodes_map[node_in];
243  case 2:
244  case 4:
245  return side24_nodes_map[node_in];
246  default:
247  libmesh_error_msg("Unsupported side_in = " << side_in);
248  }
249 }
virtual bool is_node_on_side(const unsigned int n, const unsigned int s) const =0
virtual unsigned int n_nodes() const =0
libmesh_assert(ctx)
virtual unsigned int n_sides() const override final
Definition: cell_hex.h:80

◆ opposite_side()

unsigned int libMesh::Hex::opposite_side ( const unsigned int  s) const
finaloverridevirtualinherited
Returns
The side number opposite to s (for a tensor product element), or throws an error otherwise.

Reimplemented from libMesh::Elem.

Definition at line 211 of file cell_hex.C.

212 {
213  libmesh_assert_less (side_in, 6);
214  static const unsigned char hex_opposites[6] = {5, 3, 4, 1, 2, 0};
215  return hex_opposites[side_in];
216 }

◆ orient()

void libMesh::Elem::orient ( BoundaryInfo boundary_info)
inlineinherited

Flips the element (by swapping node and neighbor pointers) to have a mapping Jacobian of opposite sign, iff we find a negative orientation.

This only fixes flipped elements; for tangled elements the only fixes possible are non-local.

Definition at line 3236 of file elem.h.

References libMesh::Elem::flip(), and libMesh::Elem::is_flipped().

Referenced by libMesh::MeshTools::Modification::orient_elements().

3237 {
3238  if (this->is_flipped())
3239  this->flip(boundary_info);
3240 }
virtual bool is_flipped() const =0
virtual void flip(BoundaryInfo *boundary_info)=0
Flips the element (by swapping node and neighbor pointers) to have a mapping Jacobian of opposite sig...

◆ origin()

virtual Point libMesh::Elem::origin ( ) const
inlinevirtualinherited
Returns
The origin for an infinite element.

Currently, all infinite elements used in a mesh share the same origin. Override this in infinite element classes.

Reimplemented in libMesh::InfQuad, libMesh::InfEdge2, and libMesh::InfCell.

Definition at line 1863 of file elem.h.

Referenced by InfFERadialTest::base_point(), libMesh::InfFE< Dim, T_radial, T_map >::compute_data(), libMesh::InfFE< Dim, T_radial, T_map >::compute_shape_functions(), libMesh::Elem::get_info(), libMesh::InfFEMap::inverse_map(), libMesh::InfFEMap::map(), InfFERadialTest::testInfQuants(), and InfFERadialTest::testInfQuants_numericDeriv().

1863 { libmesh_not_implemented(); return Point(); }

◆ p_level()

unsigned int libMesh::Elem::p_level ( ) const
inlineinherited
Returns
The value of the p refinement level of an active element, or the minimum value of the p refinement levels of an ancestor element's descendants.

Definition at line 3058 of file elem.h.

References libMesh::Elem::_p_level.

Referenced by libMesh::InfHex8::build_edge_ptr(), libMesh::InfPrism6::build_edge_ptr(), libMesh::InfHex18::build_edge_ptr(), libMesh::InfPrism12::build_edge_ptr(), libMesh::InfHex16::build_edge_ptr(), libMesh::InfQuad4::build_side_ptr(), libMesh::InfHex8::build_side_ptr(), libMesh::InfPrism6::build_side_ptr(), libMesh::InfHex18::build_side_ptr(), libMesh::InfQuad6::build_side_ptr(), libMesh::Pyramid5::build_side_ptr(), libMesh::Prism6::build_side_ptr(), libMesh::InfPrism12::build_side_ptr(), libMesh::InfHex16::build_side_ptr(), libMesh::C0Polygon::build_side_ptr(), libMesh::Pyramid13::build_side_ptr(), libMesh::Prism15::build_side_ptr(), libMesh::Prism18::build_side_ptr(), libMesh::Pyramid14::build_side_ptr(), libMesh::Prism20::build_side_ptr(), libMesh::Prism21::build_side_ptr(), libMesh::Pyramid18::build_side_ptr(), libMesh::FEGenericBase< FEOutputType< T >::type >::coarsened_dof_values(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints(), libMesh::DofMap::constrain_p_dofs(), libMesh::DofMap::dof_indices(), libMesh::FE< Dim, LAGRANGE_VEC >::dofs_on_edge(), libMesh::FE< Dim, LAGRANGE_VEC >::dofs_on_side(), libMesh::FE< Dim, LAGRANGE_VEC >::edge_map(), libMesh::FE< Dim, LAGRANGE_VEC >::edge_reinit(), libMesh::Elem::Elem(), libMesh::MeshRefinement::enforce_mismatch_limit_prior_to_refinement(), libMesh::Elem::get_info(), libMesh::QBase::init(), libMesh::InfFE< Dim, T_radial, T_map >::init_face_shape_functions(), libMesh::lagrange_nodal_soln(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_p_levels(), libMesh::LIBMESH_DEFAULT_VECTORIZED_FE(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::Elem::max_descendant_p_level(), libMesh::Elem::min_new_p_level_by_neighbor(), libMesh::Elem::min_p_level_by_neighbor(), libMesh::FEInterface::n_dofs(), libMesh::FEInterface::n_dofs_at_node(), libMesh::FEInterface::n_dofs_per_elem(), libMesh::FEInterface::n_shape_functions(), libMesh::DofMap::old_dof_indices(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::XdrIO::pack_element(), libMesh::Polygon::Polygon(), libMesh::rational_fe_shape(), libMesh::rational_fe_shape_deriv(), libMesh::rational_fe_shape_second_deriv(), libMesh::rational_fe_weighted_shapes(), libMesh::rational_fe_weighted_shapes_derivs(), libMesh::Elem::refine(), libMesh::InfFE< Dim, T_radial, T_map >::reinit(), libMesh::FE< Dim, LAGRANGE_VEC >::reinit(), libMesh::FEXYZ< Dim >::reinit(), libMesh::FE< Dim, LAGRANGE_VEC >::reinit_dual_shape_coeffs(), libMesh::HPCoarsenTest::select_refinement(), libMesh::Elem::set_p_level(), libMesh::Elem::set_p_refinement_flag(), libMesh::FE< Dim, LAGRANGE_VEC >::shape(), libMesh::InfFE< Dim, T_radial, T_map >::shape(), libMesh::InfFE< Dim, T_radial, T_map >::shape_deriv(), libMesh::FE< Dim, LAGRANGE_VEC >::shape_deriv(), libMesh::FE< Dim, LAGRANGE_VEC >::shape_second_deriv(), libMesh::FE< Dim, LAGRANGE_VEC >::side_map(), libMesh::Elem::simple_build_edge_ptr(), libMesh::Elem::simple_build_side_ptr(), libMesh::SparsityPattern::Build::sorted_connected_dofs(), libMesh::MeshRefinement::test_level_one(), and libMesh::Elem::true_centroid().

3059 {
3060 #ifdef LIBMESH_ENABLE_AMR
3061  return _p_level;
3062 #else
3063  return 0;
3064 #endif
3065 }
unsigned char _p_level
p refinement level - the difference between the polynomial degree on this element and the minimum pol...
Definition: elem.h:2240

◆ p_refinement_flag()

Elem::RefinementState libMesh::Elem::p_refinement_flag ( ) const
inlineinherited

◆ pack_indexing()

void libMesh::DofObject::pack_indexing ( std::back_insert_iterator< std::vector< largest_id_type >>  target) const
inherited

A method for creating packed data from our index buffer - basically a copy with prepended size with our current implementation.

Definition at line 642 of file dof_object.C.

References libMesh::DofObject::_idx_buf, and libMesh::DofObject::old_dof_object.

643 {
644 #ifdef LIBMESH_ENABLE_AMR
645  // We might need to pack old_dof_object too
646  *target++ = (old_dof_object == nullptr) ? 0 : 1;
647 #endif
648 
649  *target++ = _idx_buf.size();
650  std::copy(_idx_buf.begin(), _idx_buf.end(), target);
651 
652 #ifdef LIBMESH_ENABLE_AMR
653  if (old_dof_object)
654  old_dof_object->pack_indexing(target);
655 #endif
656 }
std::unique_ptr< DofObject > old_dof_object
This object on the last mesh.
Definition: dof_object.h:88
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ packed_indexing_size()

unsigned int libMesh::DofObject::packed_indexing_size ( ) const
inherited

If we pack our indices into an buffer for communications, how many ints do we need?

Definition at line 560 of file dof_object.C.

References libMesh::DofObject::_idx_buf, and libMesh::DofObject::old_dof_object.

Referenced by libMesh::Node::packed_size().

561 {
562  return
563  cast_int<unsigned int> (
564 #ifdef LIBMESH_ENABLE_AMR
565  ((old_dof_object == nullptr) ? 0 : old_dof_object->packed_indexing_size()) + 2 +
566 #else
567  1 +
568 #endif
569  _idx_buf.size());
570 }
std::unique_ptr< DofObject > old_dof_object
This object on the last mesh.
Definition: dof_object.h:88
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ parent() [1/2]

const Elem * libMesh::Elem::parent ( ) const
inlineinherited
Returns
A const pointer to the element's parent, or nullptr if the element was not created via refinement.

Definition at line 2980 of file elem.h.

References libMesh::Elem::_elemlinks.

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::Elem::add_child(), libMesh::BoundaryInfo::add_elements(), libMesh::UnstructuredMesh::all_first_order(), libMesh::MeshTools::Modification::all_tri(), libMesh::BoundaryInfo::boundary_ids(), libMesh::OldSolutionBase< Output, point_output >::check_old_context(), libMesh::FEAbstract::compute_node_constraints(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::MeshRefinement::create_parent_error_vector(), libMesh::DistributedMesh::delete_elem(), libMesh::BoundaryInfo::edge_boundary_ids(), libMesh::Elem::Elem(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::OldSolutionCoefs< Output, point_output >::eval_old_dofs(), libMesh::OldSolutionValue< Output, point_output >::eval_old_dofs(), libMesh::MeshTools::find_hanging_nodes_and_parents(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_error_fraction(), libMesh::MeshRefinement::flag_elements_by_error_tolerance(), libMesh::Elem::get_info(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_constraints(), libMesh::Elem::is_ancestor_of(), libMesh::Elem::level(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_amr_elem_ids(), libMesh::MeshTools::libmesh_assert_valid_amr_interior_parents(), libMesh::Elem::libmesh_assert_valid_neighbors(), libMesh::MeshTools::libmesh_assert_valid_remote_elems(), libMesh::MeshRefinement::limit_level_mismatch_at_edge(), libMesh::Elem::make_links_to_me_local(), libMesh::Elem::make_links_to_me_remote(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::SiblingCoupling::operator()(), libMesh::BuildProjectionList::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::BoundaryInfo::raw_boundary_ids(), libMesh::BoundaryInfo::raw_edge_boundary_ids(), libMesh::BoundaryInfo::raw_shellface_boundary_ids(), libMesh::CheckpointIO::read_connectivity(), libMesh::Elem::refine(), libMesh::Elem::remove_links_to_me(), libMesh::HPCoarsenTest::select_refinement(), libMesh::Elem::set_p_level(), libMesh::Partitioner::set_parent_processor_ids(), libMesh::BoundaryInfo::shellface_boundary_ids(), libMesh::BoundaryInfo::side_with_boundary_id(), libMesh::BoundaryInfo::sides_with_boundary_id(), libMesh::MeshTools::Modification::smooth(), libMesh::Elem::subactive(), libMesh::Parallel::sync_element_data_by_parent_id(), ElemTest< elem_type >::test_n_refinements(), libMesh::Elem::top_parent(), libMesh::Elem::topological_neighbor(), libMesh::Elem::topologically_equal(), and libMesh::Elem::which_neighbor_am_i().

2981 {
2982  return _elemlinks[0];
2983 }
Elem ** _elemlinks
Pointers to this element&#39;s parent and neighbors, and for lower-dimensional elements&#39; interior_parent...
Definition: elem.h:2201

◆ parent() [2/2]

Elem * libMesh::Elem::parent ( )
inlineinherited
Returns
A pointer to the element's parent, or nullptr if the element was not created via refinement.

Definition at line 2988 of file elem.h.

References libMesh::Elem::_elemlinks.

2989 {
2990  return _elemlinks[0];
2991 }
Elem ** _elemlinks
Pointers to this element&#39;s parent and neighbors, and for lower-dimensional elements&#39; interior_parent...
Definition: elem.h:2201

◆ parent_bracketing_nodes()

const std::vector< std::pair< unsigned char, unsigned char > > & libMesh::Elem::parent_bracketing_nodes ( unsigned int  c,
unsigned int  n 
) const
virtualinherited
Returns
All the pairs of nodes (indexed by local node id) which should bracket node n of child c.

Reimplemented in libMesh::Prism21, libMesh::Prism20, libMesh::Tet14, and libMesh::Tri7.

Definition at line 2325 of file elem.C.

References libMesh::Elem::_get_bracketing_node_cache(), libMesh::TypeVector< T >::absolute_fuzzy_equals(), libMesh::TypeVector< T >::add_scaled(), libMesh::Elem::as_parent_node(), libMesh::Elem::build(), libMesh::Elem::default_order(), libMesh::Elem::embedding_matrix(), libMesh::Elem::embedding_matrix_version(), libMesh::FIRST, libMesh::invalid_uint, libMesh::Elem::is_mid_infinite_edge_node(), libMesh::Elem::is_vertex_on_child(), libMesh::libmesh_assert(), libMesh::Elem::master_point(), libMesh::Elem::n_children(), libMesh::Elem::n_nodes(), libMesh::Elem::n_nodes_in_child(), libMesh::parent_bracketing_nodes_mutex, libMesh::Real, libMesh::Elem::second_order_equivalent_type(), and libMesh::Elem::type().

Referenced by libMesh::Elem::bracketing_nodes(), and main().

2327 {
2328  // Indexed first by embedding matrix type, then by child id, then by
2329  // child node, then by bracketing pair
2330  std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char>>>>> &
2331  cached_bracketing_nodes = this->_get_bracketing_node_cache();
2332 
2333  const unsigned int em_vers = this->embedding_matrix_version();
2334 
2335  // We may be updating the cache on one thread, and while that
2336  // happens we can't safely access the cache from other threads.
2337  Threads::spin_mutex::scoped_lock lock(parent_bracketing_nodes_mutex);
2338 
2339  if (cached_bracketing_nodes.size() <= em_vers)
2340  cached_bracketing_nodes.resize(em_vers+1);
2341 
2342  const unsigned int nc = this->n_children();
2343 
2344  // If we haven't cached the bracketing nodes corresponding to this
2345  // embedding matrix yet, let's do so now.
2346  if (cached_bracketing_nodes[em_vers].size() < nc)
2347  {
2348  // If we're a second-order element but we're not a full-order
2349  // element, then some of our bracketing nodes may not exist
2350  // except on the equivalent full-order element. Let's build an
2351  // equivalent full-order element and make a copy of its cache to
2352  // use.
2353  if (this->default_order() != FIRST &&
2354  second_order_equivalent_type(this->type(), /*full_ordered=*/ true) != this->type())
2355  {
2356  // Check that we really are the non-full-order type
2357  libmesh_assert_equal_to
2358  (second_order_equivalent_type (this->type(), false),
2359  this->type());
2360 
2361  // Build the full-order type
2362  ElemType full_type =
2363  second_order_equivalent_type(this->type(), /*full_ordered=*/ true);
2364  std::unique_ptr<Elem> full_elem = Elem::build(full_type);
2365 
2366  // This won't work for elements with multiple
2367  // embedding_matrix versions, but every such element is full
2368  // order anyways.
2369  libmesh_assert_equal_to(em_vers, 0);
2370 
2371  // Make sure its cache has been built. We temporarily
2372  // release our mutex lock so that the inner call can
2373  // re-acquire it.
2374  lock.release();
2375  full_elem->parent_bracketing_nodes(0,0);
2376 
2377  // And then we need to lock again, so that if someone *else*
2378  // grabbed our lock before we did we don't risk accessing
2379  // cached_bracketing_nodes while they're working on it.
2380  // Threading is hard.
2381  lock.acquire(parent_bracketing_nodes_mutex);
2382 
2383  // Copy its cache
2384  cached_bracketing_nodes =
2385  full_elem->_get_bracketing_node_cache();
2386 
2387  // Now we don't need to build the cache ourselves.
2388  return cached_bracketing_nodes[em_vers][child][child_node];
2389  }
2390 
2391  cached_bracketing_nodes[em_vers].resize(nc);
2392 
2393  const unsigned int nn = this->n_nodes();
2394 
2395  // We have to examine each child
2396  for (unsigned int c = 0; c != nc; ++c)
2397  {
2398  const unsigned int ncn = this->n_nodes_in_child(c);
2399 
2400  cached_bracketing_nodes[em_vers][c].resize(ncn);
2401 
2402  // We have to examine each node in that child
2403  for (unsigned int n = 0; n != ncn; ++n)
2404  {
2405  // If this child node isn't a vertex or an infinite
2406  // child element's mid-infinite-edge node, then we need
2407  // to find bracketing nodes on the child.
2408  if (!this->is_vertex_on_child(c, n)
2409 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
2410  && !this->is_mid_infinite_edge_node(n)
2411 #endif
2412  )
2413  {
2414  // Use the embedding matrix to find the child node
2415  // location in parent master element space
2416  Point bracketed_pt;
2417 
2418  for (unsigned int pn = 0; pn != nn; ++pn)
2419  {
2420  const Real em_val =
2421  this->embedding_matrix(c,n,pn);
2422 
2423  libmesh_assert_not_equal_to (em_val, 1);
2424  if (em_val != 0.)
2425  bracketed_pt.add_scaled(this->master_point(pn), em_val);
2426  }
2427 
2428  // Check each pair of nodes on the child which are
2429  // also both parent nodes
2430  for (unsigned int n1 = 0; n1 != ncn; ++n1)
2431  {
2432  if (n1 == n)
2433  continue;
2434 
2435  unsigned int parent_n1 =
2436  this->as_parent_node(c,n1);
2437 
2438  if (parent_n1 == libMesh::invalid_uint)
2439  continue;
2440 
2441  Point p1 = this->master_point(parent_n1);
2442 
2443  for (unsigned int n2 = n1+1; n2 < nn; ++n2)
2444  {
2445  if (n2 == n)
2446  continue;
2447 
2448  unsigned int parent_n2 =
2449  this->as_parent_node(c,n2);
2450 
2451  if (parent_n2 == libMesh::invalid_uint)
2452  continue;
2453 
2454  Point p2 = this->master_point(parent_n2);
2455 
2456  Point pmid = (p1 + p2)/2;
2457 
2458  if (pmid == bracketed_pt)
2459  {
2460  cached_bracketing_nodes[em_vers][c][n].emplace_back(parent_n1, parent_n2);
2461  break;
2462  }
2463  else
2464  libmesh_assert(!pmid.absolute_fuzzy_equals(bracketed_pt));
2465  }
2466  }
2467  }
2468  // If this child node is a parent node, we need to
2469  // find bracketing nodes on the parent.
2470  else
2471  {
2472  unsigned int parent_node = this->as_parent_node(c,n);
2473 
2474  Point bracketed_pt;
2475 
2476  // If we're not a parent node, use the embedding
2477  // matrix to find the child node location in parent
2478  // master element space
2479  if (parent_node == libMesh::invalid_uint)
2480  {
2481  for (unsigned int pn = 0; pn != nn; ++pn)
2482  {
2483  const Real em_val =
2484  this->embedding_matrix(c,n,pn);
2485 
2486  libmesh_assert_not_equal_to (em_val, 1);
2487  if (em_val != 0.)
2488  bracketed_pt.add_scaled(this->master_point(pn), em_val);
2489  }
2490  }
2491  // If we're a parent node then we need no arithmetic
2492  else
2493  bracketed_pt = this->master_point(parent_node);
2494 
2495  for (unsigned int n1 = 0; n1 != nn; ++n1)
2496  {
2497  if (n1 == parent_node)
2498  continue;
2499 
2500  Point p1 = this->master_point(n1);
2501 
2502  for (unsigned int n2 = n1+1; n2 < nn; ++n2)
2503  {
2504  if (n2 == parent_node)
2505  continue;
2506 
2507  Point pmid = (p1 + this->master_point(n2))/2;
2508 
2509  if (pmid == bracketed_pt)
2510  {
2511  cached_bracketing_nodes[em_vers][c][n].emplace_back(n1, n2);
2512  break;
2513  }
2514  else
2515  libmesh_assert(!pmid.absolute_fuzzy_equals(bracketed_pt));
2516  }
2517  }
2518  }
2519  }
2520  }
2521  }
2522 
2523  return cached_bracketing_nodes[em_vers][child][child_node];
2524 }
ElemType
Defines an enum for geometric element types.
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:293
virtual unsigned int embedding_matrix_version() const
Definition: elem.h:2000
virtual unsigned int n_children() const =0
virtual Real embedding_matrix(const unsigned int child_num, const unsigned int child_node_num, const unsigned int parent_node_num) const =0
virtual unsigned int n_nodes() const =0
virtual unsigned int as_parent_node(unsigned int c, unsigned int n) const
Definition: elem.C:2257
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
Definition: elem.C:321
libmesh_assert(ctx)
Threads::spin_mutex parent_bracketing_nodes_mutex
Definition: elem.C:98
static ElemType second_order_equivalent_type(const ElemType et, const bool full_ordered=true)
Definition: elem.C:3006
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual Point master_point(const unsigned int i) const =0
virtual bool is_vertex_on_child(unsigned int, unsigned int n) const
Definition: elem.h:746
virtual Order default_order() const =0
virtual std::vector< std::vector< std::vector< std::vector< std::pair< unsigned char, unsigned char > > > > > & _get_bracketing_node_cache() const
Elem subclasses which don&#39;t do their own bracketing node calculations will need to supply a static ca...
Definition: elem.h:2159
virtual ElemType type() const =0
virtual unsigned int n_nodes_in_child(unsigned int) const
Definition: elem.h:652
virtual bool is_mid_infinite_edge_node(const unsigned int) const
Definition: elem.h:1854

◆ permute()

void libMesh::Hex20::permute ( unsigned int  perm_num)
finaloverridevirtual

Permutes the element (by swapping node and neighbor pointers) according to the specified index.

This is useful for regression testing, by making it easy to make a structured mesh behave more like an arbitrarily unstructured mesh.

This is so far only used for regression testing, so we do not currently provide a way to permute any boundary side/edge ids along with the element permutation.

Implements libMesh::Elem.

Definition at line 690 of file cell_hex20.C.

References libMesh::MeshTools::Modification::rotate(), libMesh::Elem::swap2neighbors(), libMesh::Elem::swap2nodes(), libMesh::Elem::swap4neighbors(), and libMesh::Elem::swap4nodes().

691 {
692  libmesh_assert_less (perm_num, 24);
693  const unsigned int side = perm_num % 6;
694  const unsigned int rotate = perm_num / 6;
695 
696  for (unsigned int i = 0; i != rotate; ++i)
697  {
698  swap4nodes(0,1,2,3);
699  swap4nodes(4,5,6,7);
700  swap4nodes(8,9,10,11);
701  swap4nodes(12,13,14,15);
702  swap4nodes(16,17,18,19);
703  swap4neighbors(1,2,3,4);
704  }
705 
706  switch (side) {
707  case 0:
708  break;
709  case 1:
710  swap4nodes(3,7,4,0);
711  swap4nodes(11,15,19,12);
712  swap4nodes(10,18,16,8);
713  swap4nodes(2,6,5,1);
714  swap4nodes(9,14,17,13);
715  swap4neighbors(0,3,5,1);
716  break;
717  case 2:
718  swap4nodes(0,4,5,1);
719  swap4nodes(8,12,16,13);
720  swap4nodes(3,7,6,2);
721  swap4nodes(10,15,18,14);
722  swap4nodes(11,19,17,9);
723  swap4neighbors(0,4,5,2);
724  break;
725  case 3:
726  swap4nodes(0,4,7,3);
727  swap4nodes(12,19,15,11);
728  swap4nodes(8,16,18,10);
729  swap4nodes(1,5,6,2);
730  swap4nodes(13,17,14,9);
731  swap4neighbors(0,1,5,3);
732  break;
733  case 4:
734  swap4nodes(1,5,4,0);
735  swap4nodes(8,13,16,12);
736  swap4nodes(9,17,19,11);
737  swap4nodes(2,6,7,3);
738  swap4nodes(10,14,18,15);
739  swap4neighbors(0,2,5,4);
740  break;
741  case 5:
742  swap2nodes(0,7);
743  swap2nodes(8,18);
744  swap2nodes(1,6);
745  swap2nodes(2,5);
746  swap2nodes(10,16);
747  swap2nodes(3,4);
748  swap2nodes(11,19);
749  swap2nodes(12,15);
750  swap2nodes(9,17);
751  swap2nodes(13,14);
752  swap2neighbors(0,5);
753  swap2neighbors(1,3);
754  break;
755  default:
756  libmesh_error();
757  }
758 }
void swap4nodes(unsigned int n1, unsigned int n2, unsigned int n3, unsigned int n4)
Swaps four node_ptrs, "rotating" them.
Definition: elem.h:2092
void swap2nodes(unsigned int n1, unsigned int n2)
Swaps two node_ptrs.
Definition: elem.h:2041
RealTensorValue rotate(MeshBase &mesh, const Real phi, const Real theta=0., const Real psi=0.)
Rotates the mesh in the xy plane.
void swap2neighbors(unsigned int n1, unsigned int n2)
Swaps two neighbor_ptrs.
Definition: elem.h:2051
void swap4neighbors(unsigned int n1, unsigned int n2, unsigned int n3, unsigned int n4)
Swaps four neighbor_ptrs, "rotating" them.
Definition: elem.h:2102

◆ point() [1/2]

const Point & libMesh::Elem::point ( const unsigned int  i) const
inlineinherited
Returns
The Point associated with local Node i.

Definition at line 2390 of file elem.h.

References libMesh::Elem::_nodes, libMesh::DofObject::invalid_id, libMesh::libmesh_assert(), and libMesh::Elem::n_nodes().

Referenced by libMesh::PostscriptIO::_compute_edge_bezier_coeffs(), libMesh::MeshTools::Subdivision::add_boundary_ghosts(), libMesh::BoundaryInfo::add_elements(), libMesh::MeshRefinement::add_node(), libMesh::MeshTools::Modification::all_tri(), assemble_stokes(), libMesh::Tet::choose_diagonal(), libMesh::Elem::coarsen(), libMesh::InfFE< Dim, T_radial, T_map >::compute_data(), libMesh::FEMap::compute_edge_map(), libMesh::FEMap::compute_face_map(), libMesh::Elem::contains_edge_of(), libMesh::InfQuad4::contains_point(), libMesh::Tri3::contains_point(), libMesh::InfPrism::contains_point(), libMesh::InfHex::contains_point(), libMesh::Tet4::contains_point(), libMesh::NodeElem::contains_point(), libMesh::Elem::contains_vertex_of(), libMesh::ElemCutter::cut_2D(), libMesh::ElemCutter::cut_3D(), libMesh::FEMContext::elem_position_get(), libMesh::Quad4::has_affine_map(), libMesh::Edge3::has_affine_map(), libMesh::Edge4::has_affine_map(), libMesh::Quad8::has_affine_map(), libMesh::Quad9::has_affine_map(), libMesh::Prism6::has_affine_map(), libMesh::Hex8::has_affine_map(), libMesh::Tri7::has_affine_map(), libMesh::Tri6::has_affine_map(), libMesh::C0Polygon::has_affine_map(), has_affine_map(), libMesh::Hex27::has_affine_map(), libMesh::Tet10::has_affine_map(), libMesh::Prism15::has_affine_map(), libMesh::Prism18::has_affine_map(), libMesh::Tet14::has_affine_map(), libMesh::Prism20::has_affine_map(), libMesh::Prism21::has_affine_map(), libMesh::Quad4::has_invertible_map(), libMesh::Edge3::has_invertible_map(), libMesh::Edge4::has_invertible_map(), libMesh::Elem::hmax(), libMesh::Elem::hmin(), libMesh::Prism::is_flipped(), libMesh::Hex::is_flipped(), libMesh::Polygon::is_flipped(), libMesh::Tri::is_flipped(), libMesh::Pyramid::is_flipped(), libMesh::InfPrism::is_flipped(), libMesh::Quad::is_flipped(), libMesh::Tet::is_flipped(), libMesh::InfHex::is_flipped(), libMesh::Edge::is_flipped(), libMesh::InfQuad::is_flipped(), libMesh::Elem::length(), libMesh::Edge4::loose_bounding_box(), libMesh::Edge3::loose_bounding_box(), libMesh::Quad8::loose_bounding_box(), libMesh::Quad9::loose_bounding_box(), libMesh::Tri7::loose_bounding_box(), libMesh::Tri6::loose_bounding_box(), libMesh::Elem::loose_bounding_box(), main(), libMesh::InfFEMap::map(), libMesh::FEMap::map(), libMesh::FEMap::map_deriv(), libMesh::Tri3::min_and_max_angle(), libMesh::Tet4::min_and_max_angle(), libMesh::FEMSystem::numerical_jacobian(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::InfCell::origin(), libMesh::InfEdge2::origin(), libMesh::InfQuad::origin(), libMesh::PostscriptIO::plot_linear_elem(), libMesh::Elem::positive_edge_orientation(), libMesh::Elem::positive_face_orientation(), libMesh::Hex::quality(), libMesh::Tri::quality(), libMesh::Quad::quality(), libMesh::Elem::quality(), libMesh::Face::quasicircumcenter(), libMesh::Edge::quasicircumcenter(), libMesh::NodeElem::quasicircumcenter(), libMesh::FE< Dim, LAGRANGE_VEC >::reinit(), libMesh::C0Polygon::retriangulate(), libMesh::FE< Dim, LAGRANGE_VEC >::shape(), libMesh::FE< Dim, LAGRANGE_VEC >::shape_deriv(), libMesh::FE< Dim, LAGRANGE_VEC >::shape_second_deriv(), libMesh::SimplexRefiner::should_refine_elem(), libMesh::Poly2TriTriangulator::should_refine_elem(), libMesh::MeshTools::Modification::smooth(), ExtraIntegersTest::test_final_integers(), BoundaryInfoTest::testShellFaceConstraints(), VolumeTest::testTwistedVolume(), libMesh::Edge2::true_centroid(), libMesh::Quad4::true_centroid(), libMesh::Pyramid5::true_centroid(), libMesh::C0Polygon::true_centroid(), libMesh::Prism6::true_centroid(), libMesh::Hex8::true_centroid(), libMesh::Elem::true_centroid(), libMesh::Edge2::volume(), libMesh::Quad4::volume(), libMesh::Edge3::volume(), libMesh::C0Polygon::volume(), libMesh::Tri3::volume(), libMesh::Pyramid5::volume(), libMesh::Edge4::volume(), libMesh::Quad8::volume(), libMesh::Hex8::volume(), libMesh::Quad9::volume(), libMesh::Tet4::volume(), libMesh::Tri6::volume(), libMesh::Pyramid13::volume(), volume(), libMesh::Tet10::volume(), libMesh::Prism15::volume(), libMesh::Pyramid14::volume(), libMesh::Hex27::volume(), libMesh::Prism18::volume(), and libMesh::Elem::which_side_am_i().

2391 {
2392  libmesh_assert_less (i, this->n_nodes());
2393  libmesh_assert(_nodes[i]);
2394  libmesh_assert_not_equal_to (_nodes[i]->id(), Node::invalid_id);
2395 
2396  return *_nodes[i];
2397 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
virtual unsigned int n_nodes() const =0
libmesh_assert(ctx)
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482

◆ point() [2/2]

Point & libMesh::Elem::point ( const unsigned int  i)
inlineinherited
Returns
The Point associated with local Node i as a writable reference.

Definition at line 2402 of file elem.h.

References libMesh::Elem::_nodes, and libMesh::Elem::n_nodes().

2403 {
2404  libmesh_assert_less (i, this->n_nodes());
2405 
2406  return *_nodes[i];
2407 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
virtual unsigned int n_nodes() const =0

◆ positive_edge_orientation()

bool libMesh::Elem::positive_edge_orientation ( const unsigned int  i) const
inherited
Returns
true if edge i is positively oriented. An edge is positively oriented iff its first vertex (i.e. zeroth node) is lexicographically greater than its second vertex (i.e. first node).

Definition at line 3460 of file elem.C.

References libMesh::Elem::local_edge_node(), libMesh::Elem::n_edges(), and libMesh::Elem::point().

Referenced by libMesh::FE< Dim, LAGRANGE_VEC >::shape(), libMesh::FE< Dim, LAGRANGE_VEC >::shape_deriv(), and libMesh::FE< Dim, LAGRANGE_VEC >::shape_second_deriv().

3461 {
3462  libmesh_assert_less (i, this->n_edges());
3463 
3464  return this->point(this->local_edge_node(i, 0)) >
3465  this->point(this->local_edge_node(i, 1));
3466 }
virtual unsigned int local_edge_node(unsigned int edge, unsigned int edge_node) const =0
Similar to Elem::local_side_node(), but instead of a side id, takes an edge id and a node id on that ...
virtual unsigned int n_edges() const =0
const Point & point(const unsigned int i) const
Definition: elem.h:2390

◆ positive_face_orientation()

bool libMesh::Elem::positive_face_orientation ( const unsigned int  i) const
inherited
Returns
true if face i is positively oriented. A face with N vertices is positively oriented iff its 3 lexicographically greatest vertices (i.e. 3 lexicographically greatest nodes amongst the N leading nodes) are an odd permutation relative to their lexicographic ordering.

Definition at line 3469 of file elem.C.

References libMesh::Elem::n_faces(), libMesh::Elem::nodes_on_side(), libMesh::Elem::point(), libMesh::MeshTools::Modification::rotate(), and libMesh::Elem::side_ptr().

Referenced by libMesh::FE< Dim, LAGRANGE_VEC >::shape(), and libMesh::FE< Dim, LAGRANGE_VEC >::shape_deriv().

3470 {
3471  libmesh_assert_less (i, this->n_faces());
3472 
3473  // Get the number of vertices N of face i. Note that for 3d elements, i.e.
3474  // elements for which this->n_faces() > 0, the number of vertices on any of
3475  // its sides (or faces) is just the number of that face's sides (or edges).
3476  auto side_i = this->side_ptr(i);
3477  const unsigned int N = side_i->n_sides();
3478 
3479  const std::vector<unsigned int> nodes = this->nodes_on_side(i);
3480  std::vector<Point> vertices(N);
3481  std::transform(nodes.begin(), nodes.begin() + N, vertices.begin(),
3482  [&](unsigned int n) { return this->point(n); });
3483 
3484  for (unsigned int j = 0; j < N - 3; j++)
3485  std::rotate(vertices.begin() + j,
3486  std::min_element(vertices.begin() + j, vertices.end()),
3487  vertices.end());
3488 
3489  unsigned int cnt = 0;
3490  for (unsigned int j = N - 3; j < N; j++)
3491  for (unsigned int k = j + 1; k < N; k++)
3492  if (vertices[j] > vertices[k])
3493  cnt++;
3494 
3495  return cnt % 2;
3496 }
RealTensorValue rotate(MeshBase &mesh, const Real phi, const Real theta=0., const Real psi=0.)
Rotates the mesh in the xy plane.
virtual std::unique_ptr< Elem > side_ptr(unsigned int i)=0
virtual unsigned int n_faces() const =0
const Point & point(const unsigned int i) const
Definition: elem.h:2390
virtual std::vector< unsigned int > nodes_on_side(const unsigned int) const =0

◆ print_dof_info()

void libMesh::DofObject::print_dof_info ( ) const
inherited

Print out info for debugging.

Definition at line 670 of file dof_object.C.

References libMesh::DofObject::dof_number(), libMesh::DofObject::id(), libMesh::make_range(), libMesh::DofObject::n_comp(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_vars(), and libMesh::out.

671 {
672  libMesh::out << this->id() << " [ ";
673 
674  for (auto s : make_range(this->n_systems()))
675  {
676  libMesh::out << "s:" << s << " ";
677  for (auto var : make_range(this->n_vars(s)))
678  {
679  libMesh::out << "v:" << var << " ";
680  for (auto comp : make_range(this->n_comp(s,var)))
681  {
682  libMesh::out << "c:" << comp << " dof:" << this->dof_number(s,var,comp) << " ";
683  }
684  }
685  }
686 
687  libMesh::out << "]\n";
688 }
dof_id_type dof_number(const unsigned int s, const unsigned int var, const unsigned int comp) const
Definition: dof_object.h:1032
unsigned int n_comp(const unsigned int s, const unsigned int var) const
Definition: dof_object.h:1002
dof_id_type id() const
Definition: dof_object.h:828
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
OStreamProxy out
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140

◆ print_info() [1/3]

void libMesh::ReferenceCounter::print_info ( std::ostream &  out_stream = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 81 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

Referenced by libMesh::LibMeshInit::~LibMeshInit().

82 {
84  out_stream << ReferenceCounter::get_info();
85 }
static std::string get_info()
Gets a string containing the reference information.
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ print_info() [2/3]

void libMesh::ReferenceCounter::print_info ( std::ostream &  out_stream = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 81 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

Referenced by libMesh::LibMeshInit::~LibMeshInit().

82 {
84  out_stream << ReferenceCounter::get_info();
85 }
static std::string get_info()
Gets a string containing the reference information.
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ print_info() [3/3]

void libMesh::Elem::print_info ( std::ostream &  os = libMesh::out) const
inherited

Prints relevant information about the element.

Definition at line 2786 of file elem.C.

References libMesh::Elem::get_info().

Referenced by libMesh::FEMap::compute_single_point_map(), libMesh::FEMap::inverse_map(), and libMesh::operator<<().

2787 {
2788  os << this->get_info()
2789  << std::endl;
2790 }
std::string get_info() const
Prints relevant information about the element to a string.
Definition: elem.C:2794

◆ processor_id() [1/3]

processor_id_type libMesh::DofObject::processor_id ( ) const
inlineinherited
Returns
The processor that this DofObject belongs to.

When partitioning and DoF numbering have been performed by libMesh, every current DoF on this DofObject will belong to its processor.

Definition at line 905 of file dof_object.h.

References libMesh::DofObject::_processor_id.

Referenced by NonManifoldTestPartitioner::_do_partition(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DistributedMesh::add_node(), libMesh::MeshRefinement::add_node(), libMesh::ReplicatedMesh::add_point(), libMesh::DistributedMesh::add_point(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::UnstructuredMesh::all_first_order(), libMesh::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::Patch::build_around_element(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::MeshFunction::check_found_elem(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubProjector::construct_projection(), libMesh::MeshBase::copy_constraint_rows(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::DistributedMesh::delete_elem(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::Elem::disconnected_clone(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::Elem::Elem(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::MeshTools::Modification::flatten(), libMesh::Node::get_info(), libMesh::Elem::get_info(), libMesh::RBEIMConstruction::initialize_qp_data(), libMesh::DistributedMesh::insert_elem(), libMesh::DofObject::invalidate_processor_id(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_amr_elem_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DofMap::local_variable_indices(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshCommunication::make_new_node_proc_ids_parallel_consistent(), AugmentSparsityOnInterface::mesh_reinit(), ExodusTest< elem_type >::meshes_equal_enough(), libMesh::PeriodicBoundaries::neighbor(), libMesh::RBEIMEvaluation::node_distribute_bfs(), OverlappingCouplingFunctor::operator()(), AugmentSparsityOnInterface::operator()(), AugmentSparsityOnNodes::operator()(), libMesh::GhostPointNeighbors::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SortAndCopy::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectInteriors::operator()(), libMesh::CompareDofObjectsByPIDAndThenID::operator()(), libMesh::DistributedMesh::own_node(), libMesh::XdrIO::pack_element(), libMesh::LinearPartitioner::partition_range(), libMesh::SFCPartitioner::partition_range(), libMesh::CentroidPartitioner::partition_range(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::Polygon::Polygon(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::DofObject::processor_id(), libMesh::CheckpointIO::read_connectivity(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::DistributedMesh::renumber_nodes_and_elements(), libMesh::DofMap::scatter_constraints(), libMesh::Partitioner::set_interface_node_processor_ids_BFS(), libMesh::Partitioner::set_interface_node_processor_ids_linear(), libMesh::Partitioner::set_interface_node_processor_ids_petscpartitioner(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Partitioner::set_parent_processor_ids(), ParsedFEMFunctionTest::setUp(), libMesh::Partitioner::single_partition_range(), libMesh::Parallel::sync_dofobject_data_by_id(), libMesh::Parallel::sync_element_data_by_parent_id(), libMesh::Parallel::sync_node_data_by_element_id_once(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), DofObjectTest< Node >::testInvalidateProcId(), EquationSystemsTest::testPostInitAddElem(), DofObjectTest< Node >::testSetProcId(), BoundaryInfoTest::testShellFaceConstraints(), DofObjectTest< Node >::testValidProcId(), libMesh::DTKAdapter::update_variable_values(), NonManifoldGhostingFunctorTest::verify_send_list_entries_helper(), libMesh::GmshIO::write_mesh(), and libMesh::Nemesis_IO_Helper::write_sidesets().

906 {
907  return _processor_id;
908 }
processor_id_type _processor_id
The processor_id of the DofObject.
Definition: dof_object.h:594

◆ processor_id() [2/3]

processor_id_type & libMesh::DofObject::processor_id ( )
inlineinherited
Returns
The processor that this DofObject belongs to as a writable reference.

Definition at line 913 of file dof_object.h.

References libMesh::DofObject::_processor_id.

914 {
915  return _processor_id;
916 }
processor_id_type _processor_id
The processor_id of the DofObject.
Definition: dof_object.h:594

◆ processor_id() [3/3]

void libMesh::DofObject::processor_id ( const processor_id_type  pid)
inlineinherited

Sets the processor_id for this DofObject.

Definition at line 921 of file dof_object.h.

References libMesh::DofObject::processor_id().

922 {
923  this->processor_id() = pid;
924 }
processor_id_type processor_id() const
Definition: dof_object.h:905

◆ qual_bounds()

std::pair< Real, Real > libMesh::Hex::qual_bounds ( const ElemQuality  q) const
overridevirtualinherited
Returns
The suggested quality bounds for the hex based on quality measure q. These are the values suggested by the CUBIT User's Manual.

Reimplemented from libMesh::Elem.

Definition at line 507 of file cell_hex.C.

References libMesh::ASPECT_RATIO, libMesh::CONDITION, libMesh::DIAGONAL, libMesh::DISTORTION, libMesh::JACOBIAN, libMesh::out, libMesh::SCALED_JACOBIAN, libMesh::SHAPE, libMesh::SHEAR, libMesh::SIZE, libMesh::SKEW, libMesh::STRETCH, and libMesh::TAPER.

508 {
509  std::pair<Real, Real> bounds;
510 
511  switch (q)
512  {
513 
514  case ASPECT_RATIO:
515  bounds.first = 1.;
516  bounds.second = 4.;
517  break;
518 
519  case SKEW:
520  bounds.first = 0.;
521  bounds.second = 0.5;
522  break;
523 
524  case SHEAR:
525  case SHAPE:
526  bounds.first = 0.3;
527  bounds.second = 1.;
528  break;
529 
530  case CONDITION:
531  bounds.first = 1.;
532  bounds.second = 8.;
533  break;
534 
535  case SCALED_JACOBIAN:
536  case JACOBIAN:
537  bounds.first = 0.5;
538  bounds.second = 1.;
539  break;
540 
541  case DISTORTION:
542  bounds.first = 0.6;
543  bounds.second = 1.;
544  break;
545 
546  case TAPER:
547  bounds.first = 0.;
548  bounds.second = 0.4;
549  break;
550 
551  case STRETCH:
552  bounds.first = 0.25;
553  bounds.second = 1.;
554  break;
555 
556  case DIAGONAL:
557  bounds.first = 0.65;
558  bounds.second = 1.;
559  break;
560 
561  case SIZE:
562  bounds.first = 0.5;
563  bounds.second = 1.;
564  break;
565 
566  default:
567  libMesh::out << "Warning: Invalid quality measure chosen." << std::endl;
568  bounds.first = -1;
569  bounds.second = -1;
570  }
571 
572  return bounds;
573 }
OStreamProxy out

◆ quality()

Real libMesh::Hex::quality ( const ElemQuality  q) const
overridevirtualinherited
Returns
A quantitative assessment of element quality based on the quality metric q specified by the user.

Compute the min/max diagonal ratio. Source: CUBIT User's Manual.

Minimum ratio of lengths derived from opposite edges. Source: CUBIT User's Manual.

Compute the side lengths.

Minimum edge length divided by max diagonal length. Source: CUBIT User's Manual.

Compute the maximum diagonal.

Compute the minimum edge length.

I don't know what to do for this metric. Maybe the base class knows...

Reimplemented from libMesh::Elem.

Definition at line 280 of file cell_hex.C.

References libMesh::TypeTensor< T >::det(), libMesh::DIAGONAL, libMesh::Elem::length(), libMesh::Elem::point(), libMesh::Utility::pow(), libMesh::Elem::quality(), libMesh::Real, libMesh::SHAPE, libMesh::SKEW, libMesh::STRETCH, and libMesh::TAPER.

281 {
282  switch (q)
283  {
284 
285 #if LIBMESH_DIM >= 3
286 
290  case DIAGONAL:
291  {
292  // Diagonal between node 0 and node 6
293  const Real d06 = this->length(0,6);
294 
295  // Diagonal between node 3 and node 5
296  const Real d35 = this->length(3,5);
297 
298  // Diagonal between node 1 and node 7
299  const Real d17 = this->length(1,7);
300 
301  // Diagonal between node 2 and node 4
302  const Real d24 = this->length(2,4);
303 
304  // Find the biggest and smallest diagonals
305  const Real min = std::min(d06, std::min(d35, std::min(d17, d24)));
306  const Real max = std::max(d06, std::max(d35, std::max(d17, d24)));
307 
308  libmesh_assert_not_equal_to (max, 0.0);
309 
310  return min / max;
311 
312  break;
313  }
314 
319  case TAPER:
320  {
321 
325  const Real d01 = this->length(0,1);
326  const Real d12 = this->length(1,2);
327  const Real d23 = this->length(2,3);
328  const Real d03 = this->length(0,3);
329  const Real d45 = this->length(4,5);
330  const Real d56 = this->length(5,6);
331  const Real d67 = this->length(6,7);
332  const Real d47 = this->length(4,7);
333  const Real d04 = this->length(0,4);
334  const Real d15 = this->length(1,5);
335  const Real d37 = this->length(3,7);
336  const Real d26 = this->length(2,6);
337 
338  std::vector<Real> edge_ratios(12);
339  // Front
340  edge_ratios[0] = std::min(d01, d45) / std::max(d01, d45);
341  edge_ratios[1] = std::min(d04, d15) / std::max(d04, d15);
342 
343  // Right
344  edge_ratios[2] = std::min(d15, d26) / std::max(d15, d26);
345  edge_ratios[3] = std::min(d12, d56) / std::max(d12, d56);
346 
347  // Back
348  edge_ratios[4] = std::min(d67, d23) / std::max(d67, d23);
349  edge_ratios[5] = std::min(d26, d37) / std::max(d26, d37);
350 
351  // Left
352  edge_ratios[6] = std::min(d04, d37) / std::max(d04, d37);
353  edge_ratios[7] = std::min(d03, d47) / std::max(d03, d47);
354 
355  // Bottom
356  edge_ratios[8] = std::min(d01, d23) / std::max(d01, d23);
357  edge_ratios[9] = std::min(d03, d12) / std::max(d03, d12);
358 
359  // Top
360  edge_ratios[10] = std::min(d45, d67) / std::max(d45, d67);
361  edge_ratios[11] = std::min(d56, d47) / std::max(d56, d47);
362 
363  return *(std::min_element(edge_ratios.begin(), edge_ratios.end())) ;
364 
365  break;
366  }
367 
368 
373  case STRETCH:
374  {
375  const Real sqrt3 = 1.73205080756888;
376 
380  const Real d06 = this->length(0,6);
381  const Real d17 = this->length(1,7);
382  const Real d35 = this->length(3,5);
383  const Real d24 = this->length(2,4);
384  const Real max_diag = std::max(d06, std::max(d17, std::max(d35, d24)));
385 
386  libmesh_assert_not_equal_to ( max_diag, 0.0 );
387 
391  std::vector<Real> edges(12);
392  edges[0] = this->length(0,1);
393  edges[1] = this->length(1,2);
394  edges[2] = this->length(2,3);
395  edges[3] = this->length(0,3);
396  edges[4] = this->length(4,5);
397  edges[5] = this->length(5,6);
398  edges[6] = this->length(6,7);
399  edges[7] = this->length(4,7);
400  edges[8] = this->length(0,4);
401  edges[9] = this->length(1,5);
402  edges[10] = this->length(2,6);
403  edges[11] = this->length(3,7);
404 
405  const Real min_edge = *(std::min_element(edges.begin(), edges.end()));
406  return sqrt3 * min_edge / max_diag ;
407  }
408 
409 
410  case SHAPE:
411  case SKEW:
412  {
413  // From: P. Knupp, "Algebraic mesh quality metrics for
414  // unstructured initial meshes," Finite Elements in Analysis
415  // and Design 39, 2003, p. 217-241, Sections 6.2 and 6.3.
416 
417  // Make local copies of points, we will access these several
418  // times below.
419  const Point
420  x0 = point(0), x1 = point(1), x2 = point(2), x3 = point(3),
421  x4 = point(4), x5 = point(5), x6 = point(6), x7 = point(7);
422 
423  // The columns of the Jacobian matrices are:
424  // \vec{x}_{\xi} = \vec{a1}*eta*zeta + \vec{b1}*eta + \vec{c1}*zeta + \vec{d1}
425  // \vec{x}_{\eta} = \vec{a2}*xi*zeta + \vec{b2}*xi + \vec{c2}*zeta + \vec{d2}
426  // \vec{x}_{\zeta} = \vec{a3}*xi*eta + \vec{b3}*xi + \vec{c3}*eta + \vec{d3}
427  // where the ai, bi, ci, and di are constants defined below.
428  const Point a1 = -x0 + x1 - x2 + x3 + x4 - x5 + x6 - x7;
429  const Point b1 = x0 - x1 + x2 - x3 + x4 - x5 + x6 - x7;
430  const Point c1 = x0 - x1 - x2 + x3 - x4 + x5 + x6 - x7;
431  const Point d1 = -x0 + x1 + x2 - x3 - x4 + x5 + x6 - x7;
432 
433  const Point a2 = a1;
434  const Point b2 = b1;
435  const Point c2 = x0 + x1 - x2 - x3 - x4 - x5 + x6 + x7;
436  const Point d2 = -x0 - x1 + x2 + x3 - x4 - x5 + x6 + x7;
437 
438  const Point a3 = a1;
439  const Point b3 = c1;
440  const Point c3 = c2;
441  const Point d3 = -x0 - x1 - x2 - x3 + x4 + x5 + x6 + x7;
442 
443  // Form the nodal Jacobians. These were computed using a
444  // Python script and the formulas above. Note that we are
445  // actually computing the Jacobian _columns_ and passing them
446  // to the RealTensor constructor which expects _rows_, but
447  // it's OK because we are only interested in determinants and
448  // products which are not affected by taking the transpose.
449  std::array<RealTensor, 8> A =
450  {{
451  RealTensor(d1, d2, d3),
452  RealTensor(d1, b2 + d2, b3 + d3),
453  RealTensor(b1 + d1, b2 + d2, a3 + b3 + c3 + d3),
454  RealTensor(b1 + d1, d2, c3 + d3),
455  RealTensor(c1 + d1, c2 + d2, d3),
456  RealTensor(c1 + d1, a2 + b2 + c2 + d2, b3 + d3),
457  RealTensor(a1 + b1 + c1 + d1, a2 + b2 + c2 + d2, a3 + b3 + c3 + d3),
458  RealTensor(a1 + b1 + c1 + d1, c2 + d2, c3 + d3)
459  }};
460 
461  // Compute Nodal areas, alpha_k = det(A_k).
462  // If any of these are zero or negative, we return zero
463  // (lowest possible value) for the quality, since the formulas
464  // below require positive nodal areas.
465  std::array<Real, 8> alpha;
466  for (unsigned int k=0; k<alpha.size(); ++k)
467  {
468  alpha[k] = A[k].det();
469  if (alpha[k] <= 0.)
470  return 0.;
471  }
472 
473  // Compute metric tensors, T_k = A_k^T * A_k.
474  std::array<RealTensor, 8> T;
475  for (unsigned int k=0; k<T.size(); ++k)
476  T[k] = A[k] * A[k].transpose();
477 
478  // Compute and return the shape metric. These only use the
479  // diagonal entries of the T_k.
480  Real den = 0.;
481  if (q == SHAPE)
482  {
483  for (unsigned int k=0; k<T.size(); ++k)
484  den += T[k].tr() / std::pow(alpha[k], 2./3.);
485  return (den == 0.) ? 0 : (24. / den);
486  }
487  else
488  {
489  for (unsigned int k=0; k<T.size(); ++k)
490  den += std::pow(std::sqrt(T[k](0,0) * T[k](1,1) * T[k](2,2)) / alpha[k], 2./3.);
491  return (den == 0.) ? 0 : (8. / den);
492  }
493  }
494 #endif // LIBMESH_DIM >= 3
495 
500  default:
501  return Elem::quality(q);
502  }
503 }
RealTensorValue RealTensor
T pow(const T &x)
Definition: utility.h:328
Real length(const unsigned int n1, const unsigned int n2) const
Definition: elem.C:613
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual Real quality(const ElemQuality q) const
Definition: elem.C:1645
const Point & point(const unsigned int i) const
Definition: elem.h:2390

◆ quasicircumcenter()

virtual Point libMesh::Elem::quasicircumcenter ( ) const
inlinevirtualinherited
Returns
The "circumcenter of mass" (area-weighted average of triangulation circumcenters) of the element.

Not implemented for infinite elements, not currently implemented for 3D elements, currently ignores curvature of element edges.

Reimplemented in libMesh::NodeElem, libMesh::Edge, and libMesh::Face.

Definition at line 1020 of file elem.h.

Referenced by libMesh::Poly2TriTriangulator::insert_refinement_points().

1021  { libmesh_not_implemented(); }

◆ raw_child_ptr()

const Elem * libMesh::Elem::raw_child_ptr ( unsigned int  i) const
inlineinherited
Returns
A constant pointer to the i^{th} child for this element. For internal use only - skips assertions about null pointers.

Definition at line 3104 of file elem.h.

References libMesh::Elem::_children.

Referenced by libMesh::CheckpointIO::read_remote_elem().

3105 {
3106  if (!_children)
3107  return nullptr;
3108 
3109  return _children[i];
3110 }
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element&#39;s children.
Definition: elem.h:2211

◆ reference_elem()

const Elem * libMesh::Elem::reference_elem ( ) const
inherited
Returns
A pointer to the "reference element" associated with this element. The reference element is the image of this element in reference parametric space. Importantly, it is not an actual element in the mesh, but rather a Singleton-type object, so for example all Quad4 elements share the same reference_elem().

If the element is of a type that can admit multiple topologies, such as a Polygon subtype, then there is no reference element; for such types this method should not be used.

Definition at line 441 of file elem.C.

References libMesh::ReferenceElem::get(), and libMesh::Elem::type().

Referenced by libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::QComposite< QSubCell >::init(), and libMesh::RBParametrizedFunction::preevaluate_parametrized_function_on_mesh().

442 {
443  return &(ReferenceElem::get(this->type()));
444 }
virtual ElemType type() const =0
const Elem & get(const ElemType type_in)

◆ refine()

void libMesh::Elem::refine ( MeshRefinement mesh_refinement)
virtualinherited

Refine the element.

Definition at line 87 of file elem_refinement.C.

References libMesh::Elem::_children, libMesh::Elem::active(), libMesh::MeshRefinement::add_elem(), libMesh::MeshRefinement::add_node(), libMesh::Elem::ancestor(), libMesh::Elem::build(), libMesh::Elem::child_ptr(), libMesh::Elem::INACTIVE, libMesh::Elem::JUST_REFINED, libMesh::libmesh_assert(), libMesh::Elem::n_children(), libMesh::DofObject::n_extra_integers(), libMesh::DofObject::n_systems(), libMesh::Elem::p_level(), libMesh::Elem::p_refinement_flag(), libMesh::Elem::parent(), libMesh::Elem::REFINE, libMesh::Elem::refinement_flag(), libMesh::remote_elem, libMesh::DofObject::set_extra_integer(), libMesh::DofObject::set_n_systems(), libMesh::Elem::set_p_level(), libMesh::Elem::set_p_refinement_flag(), libMesh::Elem::set_refinement_flag(), libMesh::Elem::subactive(), and libMesh::Elem::type().

88 {
89  libmesh_assert_equal_to (this->refinement_flag(), Elem::REFINE);
90  libmesh_assert (this->active());
91 
92  const unsigned int nc = this->n_children();
93 
94  // Create my children if necessary
95  if (!_children)
96  {
97  _children = std::make_unique<Elem *[]>(nc);
98 
99  unsigned int parent_p_level = this->p_level();
100  const unsigned int nei = this->n_extra_integers();
101  for (unsigned int c = 0; c != nc; c++)
102  {
103  auto current_child = Elem::build(this->type(), this);
104  _children[c] = current_child.get();
105 
106  current_child->set_refinement_flag(Elem::JUST_REFINED);
107  current_child->set_p_level(parent_p_level);
108  current_child->set_p_refinement_flag(this->p_refinement_flag());
109 
110  for (auto cnode : current_child->node_index_range())
111  {
112  Node * node =
113  mesh_refinement.add_node(*this, c, cnode,
114  current_child->processor_id());
115  node->set_n_systems (this->n_systems());
116  current_child->set_node(cnode) = node;
117  }
118 
119  Elem * added_child = mesh_refinement.add_elem (std::move(current_child));
120  added_child->set_n_systems(this->n_systems());
121  libmesh_assert_equal_to (added_child->n_extra_integers(),
122  this->n_extra_integers());
123  for (unsigned int i=0; i != nei; ++i)
124  added_child->set_extra_integer(i, this->get_extra_integer(i));
125  }
126  }
127  else
128  {
129  unsigned int parent_p_level = this->p_level();
130  for (unsigned int c = 0; c != nc; c++)
131  {
132  Elem * current_child = this->child_ptr(c);
133  if (current_child != remote_elem)
134  {
135  libmesh_assert(current_child->subactive());
136  current_child->set_refinement_flag(Elem::JUST_REFINED);
137  current_child->set_p_level(parent_p_level);
138  current_child->set_p_refinement_flag(this->p_refinement_flag());
139  }
140  }
141  }
142 
143  // Un-set my refinement flag now
145 
146  // Leave the p refinement flag set - we will need that later to get
147  // projection operations correct
148  // this->set_p_refinement_flag(Elem::INACTIVE);
149 
150 #ifndef NDEBUG
151  for (unsigned int c = 0; c != nc; c++)
152  if (this->child_ptr(c) != remote_elem)
153  {
154  libmesh_assert_equal_to (this->child_ptr(c)->parent(), this);
155  libmesh_assert(this->child_ptr(c)->active());
156  }
157 #endif
158  libmesh_assert (this->ancestor());
159 }
RefinementState refinement_flag() const
Definition: elem.h:3160
const Elem * parent() const
Definition: elem.h:2980
RefinementState p_refinement_flag() const
Definition: elem.h:3176
void set_refinement_flag(const RefinementState rflag)
Sets the value of the refinement flag for the element.
Definition: elem.h:3168
virtual unsigned int n_children() const =0
unsigned int p_level() const
Definition: elem.h:3058
bool ancestor() const
Definition: elem.C:1881
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
Definition: elem.C:321
unsigned int n_systems() const
Definition: dof_object.h:937
libmesh_assert(ctx)
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
Definition: dof_object.h:1170
bool active() const
Definition: elem.h:2891
virtual ElemType type() const =0
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element&#39;s children.
Definition: elem.h:2211
const Elem * child_ptr(unsigned int i) const
Definition: elem.h:3113
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ refinement_flag()

Elem::RefinementState libMesh::Elem::refinement_flag ( ) const
inlineinherited
Returns
The value of the refinement flag for the element.

Definition at line 3160 of file elem.h.

References libMesh::Elem::_rflag.

Referenced by libMesh::Elem::active(), libMesh::OldSolutionBase< Output, point_output >::check_old_context(), libMesh::Elem::coarsen(), libMesh::Elem::contract(), libMesh::MeshRefinement::enforce_mismatch_limit_prior_to_refinement(), libMesh::OldSolutionCoefs< Output, point_output >::eval_at_node(), libMesh::OldSolutionValue< Output, point_output >::eval_at_node(), libMesh::OldSolutionCoefs< Output, point_output >::eval_old_dofs(), libMesh::OldSolutionValue< Output, point_output >::eval_old_dofs(), libMesh::Elem::get_info(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_flags(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshRefinement::make_flags_parallel_consistent(), libMesh::Elem::make_links_to_me_local(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectEdges::operator()(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectSides::operator()(), libMesh::Elem::refine(), EquationSystemsTest::testRefineThenReinitPreserveFlags(), libMesh::BoundaryInfo::transfer_boundary_ids_from_children(), and libMesh::MeshRefinement::uniformly_coarsen().

3161 {
3162  return static_cast<RefinementState>(_rflag);
3163 }
RefinementState
Enumeration of possible element refinement states.
Definition: elem.h:1401
unsigned char _rflag
h refinement flag.
Definition: elem.h:2224

◆ remove_links_to_me()

void libMesh::Elem::remove_links_to_me ( )
inherited

Resets this element's neighbors' appropriate neighbor pointers and its parent's and children's appropriate pointers to point to null instead of to this.

To be used before an element is deleted from a mesh.

Definition at line 1510 of file elem.C.

References libMesh::Elem::has_children(), libMesh::Elem::level(), libMesh::libmesh_assert(), libMesh::Elem::neighbor_ptr_range(), libMesh::Elem::parent(), libMesh::remote_elem, and libMesh::Elem::subactive().

Referenced by MeshDeletionsTest::testDeleteElem().

1511 {
1512  libmesh_assert_not_equal_to (this, remote_elem);
1513 
1514  // We need to have handled any children first
1515 #ifdef LIBMESH_ENABLE_AMR
1516  libmesh_assert (!this->has_children());
1517 #endif
1518 
1519  // Nullify any neighbor links
1520  for (auto neigh : this->neighbor_ptr_range())
1521  {
1522  if (neigh && neigh != remote_elem)
1523  {
1524  // My neighbor should never be more refined than me; my real
1525  // neighbor would have been its parent in that case.
1526  libmesh_assert_greater_equal (this->level(), neigh->level());
1527 
1528  if (this->level() == neigh->level() &&
1529  neigh->has_neighbor(this))
1530  {
1531 #ifdef LIBMESH_ENABLE_AMR
1532  // My neighbor may have descendants which also consider me a
1533  // neighbor
1534  std::vector<Elem *> family;
1535  neigh->total_family_tree_by_neighbor (family, this);
1536 
1537  for (auto & n : family)
1538  {
1539  libmesh_assert (n);
1540  if (n->is_remote())
1541  continue;
1542  unsigned int my_s = n->which_neighbor_am_i(this);
1543  libmesh_assert_less (my_s, n->n_neighbors());
1544  libmesh_assert_equal_to (n->neighbor_ptr(my_s), this);
1545  n->set_neighbor(my_s, nullptr);
1546  }
1547 #else
1548  unsigned int my_s = neigh->which_neighbor_am_i(this);
1549  libmesh_assert_less (my_s, neigh->n_neighbors());
1550  libmesh_assert_equal_to (neigh->neighbor_ptr(my_s), this);
1551  neigh->set_neighbor(my_s, nullptr);
1552 #endif
1553  }
1554 #ifdef LIBMESH_ENABLE_AMR
1555  // Even if my neighbor doesn't link back to me, it might
1556  // have subactive descendants which do
1557  else if (neigh->has_children())
1558  {
1559  // If my neighbor at the same level doesn't have me as a
1560  // neighbor, I must be subactive
1561  libmesh_assert(this->level() > neigh->level() ||
1562  this->subactive());
1563 
1564  // My neighbor must have some ancestor of mine as a
1565  // neighbor
1566  Elem * my_ancestor = this->parent();
1567  libmesh_assert(my_ancestor);
1568  while (!neigh->has_neighbor(my_ancestor))
1569  {
1570  my_ancestor = my_ancestor->parent();
1571  libmesh_assert(my_ancestor);
1572  }
1573 
1574  // My neighbor may have descendants which consider me a
1575  // neighbor
1576  std::vector<Elem *> family;
1577  neigh->total_family_tree_by_subneighbor (family, my_ancestor, this);
1578 
1579  for (auto & n : family)
1580  {
1581  libmesh_assert (n);
1582  if (n->is_remote())
1583  continue;
1584  unsigned int my_s = n->which_neighbor_am_i(this);
1585  libmesh_assert_less (my_s, n->n_neighbors());
1586  libmesh_assert_equal_to (n->neighbor_ptr(my_s), this);
1587  n->set_neighbor(my_s, nullptr);
1588  }
1589  }
1590 #endif
1591  }
1592  }
1593 
1594 #ifdef LIBMESH_ENABLE_AMR
1595  // We can't currently delete a child with a parent!
1596  libmesh_assert (!this->parent());
1597 #endif
1598 }
const Elem * parent() const
Definition: elem.h:2980
libmesh_assert(ctx)
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
unsigned int level() const
Definition: elem.h:3024
bool subactive() const
Definition: elem.h:2909
SimpleRange< NeighborPtrIter > neighbor_ptr_range()
Returns a range with all neighbors of an element, usable in range-based for loops.
Definition: elem.h:3439
bool has_children() const
Definition: elem.h:2929
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ replace_child()

void libMesh::Elem::replace_child ( Elem elem,
unsigned int  c 
)
inherited

Replaces the child pointer at the specified index in the child array.

Definition at line 1961 of file elem.C.

References libMesh::Elem::child_ptr(), libMesh::Elem::has_children(), libMesh::libmesh_assert(), and libMesh::Elem::set_child().

Referenced by libMesh::UnstructuredMesh::all_first_order().

1962 {
1963  libmesh_assert(this->has_children());
1964 
1965  libmesh_assert(this->child_ptr(c));
1966 
1967  this->set_child(c, elem);
1968 }
libmesh_assert(ctx)
void set_child(unsigned int c, Elem *elem)
Sets the pointer to the child for this element.
Definition: elem.h:3132
bool has_children() const
Definition: elem.h:2929
const Elem * child_ptr(unsigned int i) const
Definition: elem.h:3113

◆ runtime_topology()

virtual bool libMesh::Elem::runtime_topology ( ) const
inlinevirtualinherited
Returns
true iff this element type can vary in topology (e.g. have different numbers of sides and/or nodes) at runtime. For such general polygons or polyhedra, APIs which assume a fixed topology are not safe to use.

Reimplemented in libMesh::Polygon.

Definition at line 246 of file elem.h.

Referenced by libMesh::FE< Dim, LAGRANGE_VEC >::edge_map(), libMesh::FE< Dim, LAGRANGE_VEC >::edge_reinit(), libMesh::QBase::init(), libMesh::FE< Dim, LAGRANGE_VEC >::reinit(), and libMesh::FE< Dim, LAGRANGE_VEC >::side_map().

246 { return false; }

◆ second_order_adjacent_vertex()

unsigned short int libMesh::Hex20::second_order_adjacent_vertex ( const unsigned int  n,
const unsigned int  v 
) const
overridevirtual
Returns
The element-local number of the v^{th} vertex that defines the n^{th} second-order node.
Note
n uses the numbering shown above, 8 \le n < 20 .

Reimplemented from libMesh::Elem.

Definition at line 291 of file cell_hex20.C.

References libMesh::Hex::_second_order_adjacent_vertices, n_nodes(), and libMesh::Hex::n_vertices().

293 {
294  libmesh_assert_greater_equal (n, this->n_vertices());
295  libmesh_assert_less (n, this->n_nodes());
296  libmesh_assert_less (v, 2);
297  /*
298  * the _second_order_adjacent_vertices matrix is
299  * stored in cell_hex.C, since this matrix is identical
300  * for Hex20 and Hex27 (for the first 12 higher-order nodes)
301  */
302  return _second_order_adjacent_vertices[n-this->n_vertices()][v];
303 }
static const unsigned short int _second_order_adjacent_vertices[12][2]
Matrix that tells which vertices define the location of mid-side (or second-order) nodes...
Definition: cell_hex.h:215
virtual unsigned int n_nodes() const override
Definition: cell_hex20.h:96
virtual unsigned int n_vertices() const override final
Definition: cell_hex.h:85

◆ second_order_child_vertex()

std::pair< unsigned short int, unsigned short int > libMesh::Hex20::second_order_child_vertex ( const unsigned int  n) const
overridevirtual
Returns
The child number c and element-local index v of the n^{th} second-order node on the parent element. See elem.h for further details.

Reimplemented from libMesh::Elem.

Definition at line 308 of file cell_hex20.C.

References libMesh::Hex::_second_order_vertex_child_index, libMesh::Hex::_second_order_vertex_child_number, n_nodes(), and libMesh::Hex::n_vertices().

309 {
310  libmesh_assert_greater_equal (n, this->n_vertices());
311  libmesh_assert_less (n, this->n_nodes());
312  /*
313  * the _second_order_vertex_child_* vectors are
314  * stored in cell_hex.C, since they are identical
315  * for Hex20 and Hex27 (for the first 12 higher-order nodes)
316  */
317  return std::pair<unsigned short int, unsigned short int>
320 }
virtual unsigned int n_nodes() const override
Definition: cell_hex20.h:96
virtual unsigned int n_vertices() const override final
Definition: cell_hex.h:85
static const unsigned short int _second_order_vertex_child_number[27]
Vector that names a child sharing each second order node.
Definition: cell_hex.h:220
static const unsigned short int _second_order_vertex_child_index[27]
Vector that names the child vertex index for each second order node.
Definition: cell_hex.h:225

◆ second_order_equivalent_type()

ElemType libMesh::Elem::second_order_equivalent_type ( const ElemType  et,
const bool  full_ordered = true 
)
staticinherited
Returns
The ElemType of the associated second-order element (which will be the same as the input if the input is already a second-order ElemType) or INVALID_ELEM for elements that cannot be converted into higher order equivalents.

For example, when this is a TET4, then TET10 is returned.

For some elements, there exist two second-order equivalents, e.g. for Quad4 there is Quad8 and Quad9. When the optional full_ordered is true, then QUAD9 is returned. When full_ordered is false, then QUAD8 is returned.

Definition at line 3006 of file elem.C.

References libMesh::EDGE2, libMesh::EDGE3, libMesh::EDGE4, libMesh::Utility::enum_to_string(), libMesh::HEX20, libMesh::HEX27, libMesh::HEX8, libMesh::INFEDGE2, libMesh::INFHEX16, libMesh::INFHEX18, libMesh::INFHEX8, libMesh::INFPRISM12, libMesh::INFPRISM6, libMesh::INFQUAD4, libMesh::INFQUAD6, libMesh::NODEELEM, libMesh::PRISM15, libMesh::PRISM18, libMesh::PRISM20, libMesh::PRISM21, libMesh::PRISM6, libMesh::PYRAMID13, libMesh::PYRAMID14, libMesh::PYRAMID18, libMesh::PYRAMID5, libMesh::QUAD4, libMesh::QUAD8, libMesh::QUAD9, libMesh::QUADSHELL4, libMesh::QUADSHELL8, libMesh::QUADSHELL9, libMesh::TET10, libMesh::TET14, libMesh::TET4, libMesh::TRI3, libMesh::TRI6, libMesh::TRI7, and libMesh::TRISHELL3.

Referenced by libMesh::UnstructuredMesh::all_second_order_range(), libMesh::Elem::bracketing_nodes(), and libMesh::Elem::parent_bracketing_nodes().

3008 {
3009  switch (et)
3010  {
3011  case NODEELEM:
3012  return NODEELEM;
3013  case EDGE2:
3014  case EDGE3:
3015  {
3016  // full_ordered not relevant
3017  return EDGE3;
3018  }
3019 
3020  case EDGE4:
3021  {
3022  // full_ordered not relevant
3023  return EDGE4;
3024  }
3025 
3026  case TRI3:
3027  case TRI6:
3028  {
3029  // full_ordered not relevant
3030  return TRI6;
3031  }
3032 
3033  case TRI7:
3034  return TRI7;
3035 
3036  // Currently there is no TRISHELL6, so similarly to other types
3037  // where this is the case, we just return the input.
3038  case TRISHELL3:
3039  return TRISHELL3;
3040 
3041  case QUAD4:
3042  case QUAD8:
3043  {
3044  if (full_ordered)
3045  return QUAD9;
3046  else
3047  return QUAD8;
3048  }
3049 
3050  case QUADSHELL4:
3051  case QUADSHELL8:
3052  {
3053  if (full_ordered)
3054  return QUADSHELL9;
3055  else
3056  return QUADSHELL8;
3057  }
3058 
3059  case QUAD9:
3060  {
3061  // full_ordered not relevant
3062  return QUAD9;
3063  }
3064 
3065  case QUADSHELL9:
3066  {
3067  // full_ordered not relevant
3068  return QUADSHELL9;
3069  }
3070 
3071  case TET4:
3072  case TET10:
3073  {
3074  // full_ordered not relevant
3075  return TET10;
3076  }
3077 
3078  case TET14:
3079  return TET14;
3080 
3081  case HEX8:
3082  case HEX20:
3083  {
3084  // see below how this correlates with INFHEX8
3085  if (full_ordered)
3086  return HEX27;
3087  else
3088  return HEX20;
3089  }
3090 
3091  case HEX27:
3092  {
3093  // full_ordered not relevant
3094  return HEX27;
3095  }
3096 
3097  case PRISM6:
3098  case PRISM15:
3099  {
3100  if (full_ordered)
3101  return PRISM18;
3102  else
3103  return PRISM15;
3104  }
3105 
3106  // full_ordered not relevant, already fully second order
3107  case PRISM18:
3108  return PRISM18;
3109  case PRISM20:
3110  return PRISM20;
3111  case PRISM21:
3112  return PRISM21;
3113  case PYRAMID18:
3114  return PYRAMID18;
3115 
3116  case PYRAMID5:
3117  case PYRAMID13:
3118  {
3119  if (full_ordered)
3120  return PYRAMID14;
3121  else
3122  return PYRAMID13;
3123  }
3124 
3125  case PYRAMID14:
3126  {
3127  // full_ordered not relevant
3128  return PYRAMID14;
3129  }
3130 
3131 
3132 
3133 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
3134 
3135  // infinite elements
3136  case INFEDGE2:
3137  {
3138  return INFEDGE2;
3139  }
3140 
3141  case INFQUAD4:
3142  case INFQUAD6:
3143  {
3144  // full_ordered not relevant
3145  return INFQUAD6;
3146  }
3147 
3148  case INFHEX8:
3149  case INFHEX16:
3150  {
3151  /*
3152  * Note that this matches with \p Hex8:
3153  * For full-ordered, \p InfHex18 and \p Hex27
3154  * belong together, and for not full-ordered,
3155  * \p InfHex16 and \p Hex20 belong together.
3156  */
3157  if (full_ordered)
3158  return INFHEX18;
3159  else
3160  return INFHEX16;
3161  }
3162 
3163  case INFHEX18:
3164  {
3165  // full_ordered not relevant
3166  return INFHEX18;
3167  }
3168 
3169  case INFPRISM6:
3170  case INFPRISM12:
3171  {
3172  // full_ordered not relevant
3173  return INFPRISM12;
3174  }
3175 
3176 #endif
3177 
3178 
3179  default:
3180  {
3181  // what did we miss?
3182  libmesh_error_msg("No second order equivalent element type for et = "
3183  << Utility::enum_to_string(et));
3184  }
3185  }
3186 }
std::string enum_to_string(const T e)

◆ set_buffer()

void libMesh::DofObject::set_buffer ( const std::vector< dof_id_type > &  buf)
inlineinherited

Definition at line 717 of file dof_object.h.

References libMesh::DofObject::_idx_buf.

Referenced by DofObjectTest< Node >::testJensEftangBug().

718  { _idx_buf = buf; }
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ set_dof_number()

void libMesh::DofObject::set_dof_number ( const unsigned int  s,
const unsigned int  var,
const unsigned int  comp,
const dof_id_type  dn 
)
inherited

Sets the global degree of freedom number for variable var, component comp for system s associated with this DofObject.

Definition at line 454 of file dof_object.C.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::dof_number(), libMesh::DofObject::invalid_id, libMesh::libmesh_assert(), libMesh::DofObject::n_comp(), libMesh::DofObject::n_comp_group(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_vars(), libMesh::DofObject::start_idx(), libMesh::DofObject::system_var_to_vg_var(), and libMesh::DofObject::var_to_vg().

458 {
459  libmesh_assert_less (s, this->n_systems());
460  libmesh_assert_less (var, this->n_vars(s));
461  libmesh_assert_less (comp, this->n_comp(s,var));
462 
463  const unsigned int
464  vg = this->var_to_vg(s,var),
465 #ifndef NDEBUG
466  ncg = this->n_comp_group(s,vg),
467 #endif
468  vig = this->system_var_to_vg_var(s,vg,var),
469  start_idx_sys = this->start_idx(s);
470 
471  libmesh_assert_less ((start_idx_sys + 2*vg + 1), _idx_buf.size());
472 
473  dof_id_type & base_idx = _idx_buf[start_idx_sys + 2*vg + 1];
474 
475  // We intend to change all dof numbers together or not at all
476  if (comp || vig)
477  libmesh_assert ((dn == invalid_id && base_idx == invalid_id) ||
478  (dn == base_idx + vig*ncg + comp));
479 
480  // only explicitly store the base index for vig==0, comp==0
481  else
482  base_idx = dn;
483 
484  libmesh_assert_equal_to (this->dof_number(s, var, comp), dn);
485 }
unsigned int system_var_to_vg_var(const unsigned int s, const unsigned int vg, const unsigned int var) const
Utility function - for variable var in system s, figure out what variable group it lives in...
Definition: dof_object.h:1359
dof_id_type dof_number(const unsigned int s, const unsigned int var, const unsigned int comp) const
Definition: dof_object.h:1032
unsigned int n_comp(const unsigned int s, const unsigned int var) const
Definition: dof_object.h:1002
unsigned int var_to_vg(const unsigned int s, const unsigned int var) const
Utility function - for variable var in system s, figure out what variable group it lives in...
Definition: dof_object.h:1341
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
libmesh_assert(ctx)
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482
unsigned int start_idx(const unsigned int s) const
The starting index for system s.
Definition: dof_object.h:1249
index_buffer_t _idx_buf
Definition: dof_object.h:680
unsigned int n_comp_group(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:1015
uint8_t dof_id_type
Definition: id_types.h:67

◆ set_extra_datum()

template<typename T >
void libMesh::DofObject::set_extra_datum ( const unsigned int  index,
const T  value 
)
inlineinherited

Sets the value on this object of the extra datum associated with index, which should have been obtained via a call to MeshBase::add_elem_datum or MeshBase::add_node_datum using the same type T.

Definition at line 1126 of file dof_object.h.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::n_extra_integers(), libMesh::DofObject::n_pseudo_systems(), libMesh::DofObject::start_idx_ints(), and value.

Referenced by libMesh::ExodusII_IO::read(), libMesh::DynaIO::read_mesh(), and DofObjectTest< Node >::testAddExtraData().

1128 {
1129 #ifndef NDEBUG
1130  const unsigned int n_more_integers = (sizeof(T)-1)/sizeof(dof_id_type);
1131 #endif
1132  libmesh_assert_less(index+n_more_integers, this->n_extra_integers());
1133  libmesh_assert_less(this->n_pseudo_systems(), _idx_buf.size());
1134 
1135  const unsigned int start_idx_i = this->start_idx_ints();
1136 
1137  libmesh_assert_less(start_idx_i+index+n_more_integers, _idx_buf.size());
1138  std::memcpy(&_idx_buf[start_idx_i+index], &value, sizeof(T));
1139 }
unsigned int n_pseudo_systems() const
Definition: dof_object.h:947
unsigned int start_idx_ints() const
The starting index for an extra_integers pseudosystem.
Definition: dof_object.h:1273
static const bool value
Definition: xdr_io.C:54
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
Definition: dof_object.h:1170
index_buffer_t _idx_buf
Definition: dof_object.h:680
uint8_t dof_id_type
Definition: id_types.h:67

◆ set_extra_integer()

void libMesh::DofObject::set_extra_integer ( const unsigned int  index,
const dof_id_type  value 
)
inlineinherited

Sets the value on this object of the extra integer associated with index, which should have been obtained via a call to MeshBase::add_elem_integer or MeshBase::add_node_integer.

Definition at line 1086 of file dof_object.h.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::n_extra_integers(), libMesh::DofObject::n_pseudo_systems(), libMesh::DofObject::start_idx_ints(), and value.

Referenced by libMesh::SyncElementIntegers::act_on_data(), libMesh::BoundaryInfo::add_elements(), libMesh::UnstructuredMesh::all_first_order(), libMesh::UnstructuredMesh::create_submesh(), libMesh::ExodusII_IO::read(), libMesh::CheckpointIO::read_connectivity(), libMesh::CheckpointIO::read_nodes(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::Elem::refine(), DofObjectTest< Node >::testAddExtraData(), DofObjectTest< Node >::testAddSystemExtraInts(), DofObjectTest< Node >::testSetNSystemsExtraInts(), and DofObjectTest< Node >::testSetNVariableGroupsExtraInts().

1088 {
1089  libmesh_assert_less(index, this->n_extra_integers());
1090  libmesh_assert_less(this->n_pseudo_systems(), _idx_buf.size());
1091 
1092  const unsigned int start_idx_i = this->start_idx_ints();
1093 
1094  libmesh_assert_less(start_idx_i+index, _idx_buf.size());
1095  _idx_buf[start_idx_i+index] = value;
1096 }
unsigned int n_pseudo_systems() const
Definition: dof_object.h:947
unsigned int start_idx_ints() const
The starting index for an extra_integers pseudosystem.
Definition: dof_object.h:1273
static const bool value
Definition: xdr_io.C:54
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
Definition: dof_object.h:1170
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ set_id() [1/2]

dof_id_type & libMesh::DofObject::set_id ( )
inlineinherited

◆ set_id() [2/2]

void libMesh::DofObject::set_id ( const dof_id_type  dofid)
inlineinherited

Sets the id for this DofObject.

Definition at line 201 of file dof_object.h.

References libMesh::DofObject::set_id().

202  { this->set_id() = dofid; }
dof_id_type & set_id()
Definition: dof_object.h:836

◆ set_interior_parent()

void libMesh::Elem::set_interior_parent ( Elem p)
inherited

Sets the pointer to the element's interior_parent.

Dangerous! Only use this if you know what you are doing!

Definition at line 1119 of file elem.C.

References libMesh::Elem::_elemlinks, libMesh::Elem::dim(), libMesh::libmesh_assert(), libMesh::Elem::n_sides(), and libMesh::remote_elem.

Referenced by libMesh::BoundaryInfo::add_elements(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::Edge::Edge(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::Hex::Hex(), libMesh::InfHex::InfHex(), libMesh::InfQuad::InfQuad(), libMesh::NodeElem::NodeElem(), libMesh::Polygon::Polygon(), libMesh::Prism::Prism(), libMesh::Pyramid::Pyramid(), libMesh::Quad::Quad(), libMesh::Tet::Tet(), libMesh::Tri::Tri(), and libMesh::MeshTetInterface::volume_to_surface_mesh().

1120 {
1121  // interior parents make no sense for full-dimensional elements.
1122  libmesh_assert (!p ||
1123  this->dim() < LIBMESH_DIM);
1124 
1125  // If we have an interior_parent, we USED TO assume it was a
1126  // one-higher-dimensional interior element, but we now allow e.g.
1127  // edge elements to have a 3D interior_parent with no
1128  // intermediate 2D element.
1129  // libmesh_assert (!p ||
1130  // p->dim() == (this->dim()+1));
1131  libmesh_assert (!p ||
1132  (p == remote_elem) ||
1133  (p->dim() > this->dim()));
1134 
1135  _elemlinks[1+this->n_sides()] = p;
1136 }
Elem ** _elemlinks
Pointers to this element&#39;s parent and neighbors, and for lower-dimensional elements&#39; interior_parent...
Definition: elem.h:2201
libmesh_assert(ctx)
virtual unsigned int n_sides() const =0
virtual unsigned short dim() const =0
const RemoteElem * remote_elem
Definition: remote_elem.C:57

◆ set_mapping_data()

void libMesh::Elem::set_mapping_data ( const unsigned char  data)
inlineinherited

Sets the value of the mapping data for the element.

Definition at line 3094 of file elem.h.

References libMesh::Elem::_map_data.

Referenced by libMesh::ReplicatedMesh::add_elem(), libMesh::DistributedMesh::add_elem(), libMesh::UnstructuredMesh::all_first_order(), libMesh::ReplicatedMesh::insert_elem(), and libMesh::DistributedMesh::insert_elem().

3095 {
3096  _map_data = data;
3097 }
unsigned char _map_data
Mapping function data; currently used when needed to store the RATIONAL_BERNSTEIN nodal weight data i...
Definition: elem.h:2253

◆ set_mapping_type()

void libMesh::Elem::set_mapping_type ( const ElemMappingType  type)
inlineinherited

Sets the value of the mapping type for the element.

Definition at line 3078 of file elem.h.

References libMesh::Elem::_map_type, and libMesh::Elem::type().

Referenced by libMesh::ReplicatedMesh::add_elem(), libMesh::DistributedMesh::add_elem(), libMesh::UnstructuredMesh::all_first_order(), libMesh::ReplicatedMesh::insert_elem(), and libMesh::DistributedMesh::insert_elem().

3079 {
3080  _map_type = cast_int<unsigned char>(type);
3081 }
unsigned char _map_type
Mapping function type; currently either 0 (LAGRANGE) or 1 (RATIONAL_BERNSTEIN).
Definition: elem.h:2247
virtual ElemType type() const =0

◆ set_n_comp()

void libMesh::DofObject::set_n_comp ( const unsigned int  s,
const unsigned int  var,
const unsigned int  ncomp 
)
inherited

Sets the number of components for Variable var of system s associated with this DofObject.

Definition at line 385 of file dof_object.C.

References libMesh::DofObject::n_systems(), libMesh::DofObject::n_vars(), libMesh::DofObject::set_n_comp_group(), and libMesh::DofObject::var_to_vg().

388 {
389  libmesh_assert_less (s, this->n_systems());
390  libmesh_assert_less (var, this->n_vars(s));
391 
392  this->set_n_comp_group(s, this->var_to_vg(s,var), ncomp);
393 }
unsigned int var_to_vg(const unsigned int s, const unsigned int var) const
Utility function - for variable var in system s, figure out what variable group it lives in...
Definition: dof_object.h:1341
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
void set_n_comp_group(const unsigned int s, const unsigned int vg, const unsigned int ncomp)
Sets the number of components for VariableGroup vg of system s associated with this DofObject...
Definition: dof_object.C:397

◆ set_n_comp_group()

void libMesh::DofObject::set_n_comp_group ( const unsigned int  s,
const unsigned int  vg,
const unsigned int  ncomp 
)
inherited

Sets the number of components for VariableGroup vg of system s associated with this DofObject.

Definition at line 397 of file dof_object.C.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::invalid_id, libMesh::DofObject::n_comp_group(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), libMesh::DofObject::n_vars(), libMesh::DofObject::ncv_magic, and libMesh::DofObject::start_idx().

Referenced by libMesh::DofMap::reinit(), libMesh::DofObject::set_n_comp(), libMesh::DofObject::set_n_vars_per_group(), libMesh::DofMap::set_nonlocal_dof_objects(), and DofObjectTest< Node >::testManualDofCalculation().

400 {
401  libmesh_assert_less (s, this->n_systems());
402  libmesh_assert_less (vg, this->n_var_groups(s));
403 
404  // Check for trivial return
405  if (ncomp == this->n_comp_group(s,vg)) return;
406 
407 #ifndef NDEBUG
408  if (ncomp >= ncv_magic)
409  {
410  const index_t ncvm = ncv_magic;
411  libmesh_error_msg("ERROR: ncomp must be less than DofObject::ncv_magic!\n" \
412  << "ncomp = " \
413  << ncomp \
414  << ", ncv_magic = " \
415  << ncvm \
416  << "\nrecompile and try again!");
417  }
418 #endif
419 
420  const unsigned int
421  start_idx_sys = this->start_idx(s),
422  n_vars_group = this->n_vars(s,vg),
423  base_offset = start_idx_sys + 2*vg;
424 
425  libmesh_assert_less ((base_offset + 1), _idx_buf.size());
426 
427  // if (ncomp)
428  // libMesh::out << "s,vg,ncomp="
429  // << s << ","
430  // << vg << ","
431  // << ncomp << '\n';
432 
433  // set the number of components, maintaining the number
434  // of variables in the group
435  _idx_buf[base_offset] = ncv_magic*n_vars_group + ncomp;
436 
437  // We use (invalid_id - 1) to signify no
438  // components for this object
439  _idx_buf[base_offset + 1] = (ncomp == 0) ? invalid_id - 1 : invalid_id;
440 
441  // this->debug_buffer();
442  // libMesh::out << "s,vg = " << s << "," << vg << '\n'
443  // << "base_offset=" << base_offset << '\n'
444  // << "this->n_comp(s,vg)=" << this->n_comp(s,vg) << '\n'
445  // << "this->n_comp_group(s,vg)=" << this->n_comp_group(s,vg) << '\n'
446  // << "this->n_vars(s,vg)=" << this->n_vars(s,vg) << '\n'
447  // << "this->n_var_groups(s)=" << this->n_var_groups(s) << '\n';
448 
449  libmesh_assert_equal_to (ncomp, this->n_comp_group(s,vg));
450 }
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
dof_id_type index_t
DoF index information.
Definition: dof_object.h:678
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482
unsigned int start_idx(const unsigned int s) const
The starting index for system s.
Definition: dof_object.h:1249
index_buffer_t _idx_buf
Definition: dof_object.h:680
unsigned int n_comp_group(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:1015
static const index_t ncv_magic
Above we introduced the chimera ncv, which is a hybrid of the form ncv = ncv_magic*nv + nc where nv a...
Definition: dof_object.h:691

◆ set_n_systems()

void libMesh::DofObject::set_n_systems ( const unsigned int  s)
inherited

Sets the number of systems for this DofObject.

If this number is a change, also clears all variable count and DoF indexing associated with this DofObject.

If any extra integers are associated with this DofObject, their count and values are unchanged.

Definition at line 150 of file dof_object.C.

References libMesh::DofObject::_idx_buf, libMesh::make_range(), libMesh::DofObject::n_extra_integers(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), libMesh::DofObject::n_vars(), and libMesh::DofObject::start_idx_ints().

Referenced by libMesh::DofObject::add_system(), libMesh::DofObject::clear_dofs(), libMesh::Elem::refine(), DofObjectTest< Node >::testManualDofCalculation(), DofObjectTest< Node >::testSetNSystems(), DofObjectTest< Node >::testSetNSystemsExtraInts(), DofObjectTest< Node >::testSetNVariableGroups(), and DofObjectTest< Node >::testSetNVariableGroupsExtraInts().

151 {
152  const unsigned int old_ns = this->n_systems();
153 
154  // Check for trivial return
155  if (ns == old_ns)
156  return;
157 
158  const unsigned int nei = this->n_extra_integers();
159  const dof_id_type header_size = ns + bool(nei);
160  const dof_id_type hdr = nei ?
161  static_cast<dof_id_type>(-static_cast<std::ptrdiff_t>(header_size))
162  : header_size;
163  index_buffer_t new_buf(header_size + nei, hdr);
164  if (nei)
165  {
166  const unsigned int start_idx_ints = old_ns ?
167  cast_int<unsigned int>(_idx_buf[old_ns]) :
168  1;
169  libmesh_assert_less(start_idx_ints, _idx_buf.size());
170  std::copy(_idx_buf.begin()+start_idx_ints,
171  _idx_buf.end(),
172  new_buf.begin()+header_size);
173  if (ns)
174  std::fill(new_buf.begin()+1, new_buf.begin()+ns+1, ns+1);
175  }
176 
177  // vector swap trick to force deallocation when shrinking
178  new_buf.swap(_idx_buf);
179 
180 #ifdef DEBUG
181  libmesh_assert_equal_to(nei, this->n_extra_integers());
182 
183  // check that all systems now exist and that they have 0 size
184  libmesh_assert_equal_to (ns, this->n_systems());
185  for (auto s : make_range(this->n_systems()))
186  {
187  libmesh_assert_equal_to (this->n_vars(s), 0);
188  libmesh_assert_equal_to (this->n_var_groups(s), 0);
189  }
190 #endif
191 }
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
unsigned int start_idx_ints() const
The starting index for an extra_integers pseudosystem.
Definition: dof_object.h:1273
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
std::vector< index_t > index_buffer_t
Definition: dof_object.h:679
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
Definition: dof_object.h:1170
index_buffer_t _idx_buf
Definition: dof_object.h:680
uint8_t dof_id_type
Definition: id_types.h:67

◆ set_n_vars_per_group()

void libMesh::DofObject::set_n_vars_per_group ( const unsigned int  s,
const std::vector< unsigned int > &  nvpg 
)
inherited

Sets number of variables in each group associated with system s for this DofObject.

Implicit in this is also setting the number of VariableGroup variable groups for the system. Has the effect of setting the number of components to 0 even when called even with (nvg == this->n_var_groups(s)).

Definition at line 247 of file dof_object.C.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::end_idx(), libMesh::DofObject::get_extra_integer(), libMesh::DofObject::has_extra_integers(), libMesh::DofObject::invalid_id, libMesh::make_range(), libMesh::DofObject::n_comp(), libMesh::DofObject::n_comp_group(), libMesh::DofObject::n_extra_integers(), libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), libMesh::DofObject::n_vars(), libMesh::DofObject::ncv_magic, libMesh::DofObject::set_n_comp_group(), and libMesh::DofObject::start_idx().

Referenced by DofObjectTest< Node >::testManualDofCalculation(), DofObjectTest< Node >::testSetNVariableGroups(), and DofObjectTest< Node >::testSetNVariableGroupsExtraInts().

249 {
250  const unsigned int n_sys = this->n_systems();
251 
252  libmesh_assert_less (s, n_sys);
253 
254  // number of variable groups for this system - inferred
255  const unsigned int nvg = cast_int<unsigned int>(nvpg.size());
256 
257  // BSK - note that for compatibility with the previous implementation
258  // calling this method when (nvars == this->n_vars()) requires that
259  // we invalidate the DOF indices and set the number of components to 0.
260  // Note this was a bit of a surprise to me - there was no quick return in
261  // the old method, which caused removal and readdition of the DOF indices
262  // even in the case of (nvars == this->n_vars()), resulting in n_comp(s,v)
263  // implicitly becoming 0 regardless of any previous value.
264  // quick return?
265  if (nvg == this->n_var_groups(s))
266  {
267  for (unsigned int vg=0; vg<nvg; vg++)
268  {
269  this->set_n_comp_group(s,vg,0);
270  libmesh_assert_equal_to (this->n_vars(s,vg), nvpg[vg]);
271  }
272  return;
273  }
274 
275  const bool hei = this->has_extra_integers();
276 
277  // since there is ample opportunity to screw up other systems, let us
278  // cache their current sizes and later assert that they are unchanged.
279 #ifdef DEBUG
280  const unsigned int nei = this->n_extra_integers();
281 
282  DofObject::index_buffer_t old_system_sizes, old_extra_integers;
283  old_system_sizes.reserve(n_sys);
284  old_extra_integers.reserve(nei);
285 
286  for (unsigned int s_ctr=0; s_ctr<n_sys; s_ctr++)
287  old_system_sizes.push_back(this->n_var_groups(s_ctr));
288 
289  for (unsigned int ei=0; ei != nei; ++ei)
290  old_extra_integers.push_back(this->get_extra_integer(ei));
291 #endif
292 
293  // remove current indices if we have some
294  if (this->n_var_groups(s) != 0)
295  {
296  const unsigned int old_nvg_s = this->n_var_groups(s);
297 
298  DofObject::index_buffer_t::iterator
299  it = _idx_buf.begin(),
300  end = _idx_buf.begin();
301 
302  std::advance(it, this->start_idx(s));
303  std::advance(end, this->end_idx(s));
304  _idx_buf.erase(it,end);
305 
306  for (unsigned int ctr=(s+1); ctr<n_sys; ctr++)
307  _idx_buf[ctr] -= 2*old_nvg_s;
308 
309  if (hei)
310  _idx_buf[n_sys] -= 2*old_nvg_s;
311  }
312 
313  // better not have any now!
314  libmesh_assert_equal_to (this->n_var_groups(s), 0);
315 
316  // Make sure we didn't screw up any of our sizes!
317 #ifdef DEBUG
318  for (auto s_ctr : make_range(this->n_systems()))
319  if (s_ctr != s)
320  libmesh_assert_equal_to (this->n_var_groups(s_ctr), old_system_sizes[s_ctr]);
321 
322  libmesh_assert_equal_to (nei, this->n_extra_integers());
323 
324  for (unsigned int ei=0; ei != nei; ++ei)
325  libmesh_assert_equal_to(old_extra_integers[ei], this->get_extra_integer(ei));
326 #endif
327 
328  // OK, if the user requested 0 that is what we have
329  if (nvg == 0)
330  return;
331 
332  {
333  // array to hold new indices
334  DofObject::index_buffer_t var_idxs(2*nvg);
335  for (unsigned int vg=0; vg<nvg; vg++)
336  {
337  var_idxs[2*vg ] = ncv_magic*nvpg[vg] + 0;
338  var_idxs[2*vg + 1] = invalid_id - 1;
339  }
340 
341  DofObject::index_buffer_t::iterator it = _idx_buf.begin();
342  std::advance(it, this->end_idx(s));
343  _idx_buf.insert(it, var_idxs.begin(), var_idxs.end());
344 
345  for (unsigned int ctr=(s+1); ctr<n_sys; ctr++)
346  _idx_buf[ctr] += 2*nvg;
347 
348  if (hei)
349  _idx_buf[n_sys] += 2*nvg;
350 
351  // resize _idx_buf to fit so no memory is wasted.
353  }
354 
355  libmesh_assert_equal_to (nvg, this->n_var_groups(s));
356 
357 #ifdef DEBUG
358 
359  libmesh_assert_equal_to (this->n_var_groups(s), nvpg.size());
360 
361  for (auto vg : make_range(this->n_var_groups(s)))
362  {
363  libmesh_assert_equal_to (this->n_vars(s,vg), nvpg[vg]);
364  libmesh_assert_equal_to (this->n_comp_group(s,vg), 0);
365  }
366 
367  for (auto v : make_range(this->n_vars(s)))
368  libmesh_assert_equal_to (this->n_comp(s,v), 0);
369 
370  // again, all other system sizes should be unchanged!
371  for (auto s_ctr : make_range(this->n_systems()))
372  if (s_ctr != s)
373  libmesh_assert_equal_to (this->n_var_groups(s_ctr), old_system_sizes[s_ctr]);
374 
375  // Extra integers count and values should also be unchanged!
376  libmesh_assert_equal_to (nei, this->n_extra_integers());
377 
378  for (unsigned int ei=0; ei != nei; ++ei)
379  libmesh_assert_equal_to(old_extra_integers[ei], this->get_extra_integer(ei));
380 #endif
381 }
unsigned int n_comp(const unsigned int s, const unsigned int var) const
Definition: dof_object.h:1002
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
unsigned int end_idx(const unsigned int s) const
The ending index for system s.
Definition: dof_object.h:1260
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967
unsigned int n_systems() const
Definition: dof_object.h:937
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition: dof_object.h:482
bool has_extra_integers() const
Returns whether extra integers are associated to the DofObject.
Definition: dof_object.h:1188
std::vector< index_t > index_buffer_t
Definition: dof_object.h:679
void set_n_comp_group(const unsigned int s, const unsigned int vg, const unsigned int ncomp)
Sets the number of components for VariableGroup vg of system s associated with this DofObject...
Definition: dof_object.C:397
unsigned int start_idx(const unsigned int s) const
The starting index for system s.
Definition: dof_object.h:1249
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
Definition: dof_object.h:1170
index_buffer_t _idx_buf
Definition: dof_object.h:680
unsigned int n_comp_group(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:1015
dof_id_type get_extra_integer(const unsigned int index) const
Gets the value on this object of the extra integer associated with index, which should have been obta...
Definition: dof_object.h:1102
static const index_t ncv_magic
Above we introduced the chimera ncv, which is a hybrid of the form ncv = ncv_magic*nv + nc where nv a...
Definition: dof_object.h:691

◆ set_neighbor()

void libMesh::Elem::set_neighbor ( const unsigned int  i,
Elem n 
)
inlineinherited

◆ set_node()

Node *& libMesh::Elem::set_node ( const unsigned int  i)
inlinevirtualinherited
Returns
The pointer to local Node i as a writable reference.

Reimplemented in libMesh::RemoteElem.

Definition at line 2494 of file elem.h.

References libMesh::Elem::_nodes, and libMesh::Elem::n_nodes().

Referenced by LinearElasticityWithContact::add_contact_edge_elements(), add_cube_convex_hull_to_mesh(), libMesh::UnstructuredMesh::all_first_order(), AllSecondOrderTest::allCompleteOrderMixed(), AllSecondOrderTest::allCompleteOrderRange(), AllSecondOrderTest::allSecondOrderMixed(), AllSecondOrderTest::allSecondOrderRange(), libMesh::TetGenMeshInterface::assign_nodes_to_elem(), libMesh::MeshTools::Generation::build_cube(), GetBoundaryPointsTest::build_mesh(), MixedDimensionMeshTest::build_mesh(), MeshfunctionDFEM::build_mesh(), SlitMeshTest::build_mesh(), MixedDimensionNonUniformRefinement::build_mesh(), MixedDimensionNonUniformRefinementTriangle::build_mesh(), MixedDimensionNonUniformRefinement3D::build_mesh(), OverlappingTestBase::build_quad_mesh(), libMesh::TriangleWrapper::copy_tri_to_mesh(), libMesh::UnstructuredMesh::create_submesh(), libMesh::C0Polygon::permute(), libMesh::Nemesis_IO::read(), libMesh::ExodusII_IO::read(), libMesh::AbaqusIO::read_elements(), libMesh::GmshIO::read_mesh(), libMesh::DynaIO::read_mesh(), libMesh::MatlabIO::read_stream(), libMesh::RemoteElem::set_node(), PerElemTest< elem_type >::setUp(), libMesh::FE< Dim, LAGRANGE_VEC >::shape(), libMesh::UnstructuredMesh::stitching_helper(), libMesh::MeshTools::Generation::surface_octahedron(), libMesh::Elem::swap2nodes(), SystemsTest::testDofCouplingWithVarGroups(), MeshTriangulationTest::testEdgesMesh(), MeshTriangulationTest::testHalfDomain(), NodalNeighborsTest::testOrientation(), MeshTriangulationTest::testPoly2TriBad1DMultiBoundary(), MeshTriangulationTest::testPoly2TriBad2DMultiBoundary(), MeshTriangulationTest::testPoly2TriBadEdges(), EquationSystemsTest::testPostInitAddElem(), SystemsTest::testProjectMatrix3D(), InfFERadialTest::testRefinement(), EquationSystemsTest::testReinitWithNodeElem(), BoundaryInfoTest::testShellFaceConstraints(), InfFERadialTest::testSides(), MeshTetTest::testTetsToTets(), MeshSubdomainIDTest::testUnpartitioned(), and libMesh::Poly2TriTriangulator::triangulate_current_points().

2495 {
2496  libmesh_assert_less (i, this->n_nodes());
2497 
2498  return _nodes[i];
2499 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
virtual unsigned int n_nodes() const =0

◆ set_old_dof_object()

void libMesh::DofObject::set_old_dof_object ( )
inherited

Sets the old_dof_object to a copy of this.

Definition at line 135 of file dof_object.C.

References libMesh::DofObject::clear_old_dof_object(), libMesh::DofObject::construct(), libMesh::libmesh_assert(), and libMesh::DofObject::old_dof_object.

136 {
137  this->clear_old_dof_object();
138 
140 
141  // Make a new DofObject, assign a copy of \p this.
142  // Make sure the copy ctor for DofObject works!!
143  this->old_dof_object = this->construct(this);
144 }
std::unique_ptr< DofObject > construct(const DofObject *other=nullptr)
Convenient factory function that calls either the (deep) copy constructor or the default constructor ...
Definition: dof_object.h:741
void clear_old_dof_object()
Sets the old_dof_object to nullptr.
Definition: dof_object.C:128
libmesh_assert(ctx)
std::unique_ptr< DofObject > old_dof_object
This object on the last mesh.
Definition: dof_object.h:88

◆ set_p_level()

void libMesh::Elem::set_p_level ( const unsigned int  p)
inherited

Sets the value of the p-refinement level for the element.

The following functions only apply when AMR is enabled and thus are not present otherwise.

Note
The maximum p-refinement level is currently 255.

Definition at line 41 of file elem_refinement.C.

References libMesh::Elem::_p_level, libMesh::Elem::child_ref_range(), libMesh::Elem::hack_p_level(), libMesh::Elem::JUST_COARSENED, libMesh::Elem::JUST_REFINED, libMesh::Elem::p_level(), libMesh::Elem::parent(), libMesh::Elem::set_p_level(), and libMesh::Elem::set_p_refinement_flag().

Referenced by libMesh::UnstructuredMesh::all_first_order(), libMesh::Elem::coarsen(), libMesh::Elem::Elem(), libMesh::Polygon::Polygon(), libMesh::Elem::refine(), libMesh::Elem::set_p_level(), and VolumeTest::testHex20PLevelTrueCentroid().

42 {
43  // Maintain the parent's p level as the minimum of it's children
44  if (this->parent() != nullptr)
45  {
46  unsigned int parent_p_level = this->parent()->p_level();
47 
48  // If our new p level is less than our parents, our parents drops
49  if (parent_p_level > p)
50  {
51  this->parent()->set_p_level(p);
52 
53  // And we should keep track of the drop, in case we need to
54  // do a projection later.
56  }
57  // If we are the lowest p level and it increases, so might
58  // our parent's, but we have to check every other child to see
59  else if (parent_p_level == _p_level && _p_level < p)
60  {
61  _p_level = cast_int<unsigned char>(p);
62  parent_p_level = cast_int<unsigned char>(p);
63  for (auto & c : this->parent()->child_ref_range())
64  parent_p_level = std::min(parent_p_level,
65  c.p_level());
66 
67  // When its children all have a higher p level, the parent's
68  // should rise
69  if (parent_p_level > this->parent()->p_level())
70  {
71  this->parent()->set_p_level(parent_p_level);
72 
73  // And we should keep track of the rise, in case we need to
74  // do a projection later.
76  }
77 
78  return;
79  }
80  }
81 
82  this->hack_p_level(p);
83 }
void set_p_level(const unsigned int p)
Sets the value of the p-refinement level for the element.
const Elem * parent() const
Definition: elem.h:2980
unsigned char _p_level
p refinement level - the difference between the polynomial degree on this element and the minimum pol...
Definition: elem.h:2240
unsigned int p_level() const
Definition: elem.h:3058
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
Definition: elem.h:2296
void set_p_refinement_flag(const RefinementState pflag)
Sets the value of the p-refinement flag for the element.
Definition: elem.h:3184
void hack_p_level(const unsigned int p)
Sets the value of the p-refinement level for the element without altering the p-level of its ancestor...
Definition: elem.h:3214

◆ set_p_refinement_flag()

void libMesh::Elem::set_p_refinement_flag ( const RefinementState  pflag)
inlineinherited

Sets the value of the p-refinement flag for the element.

Definition at line 3184 of file elem.h.

References libMesh::Elem::_pflag, libMesh::Elem::JUST_REFINED, and libMesh::Elem::p_level().

Referenced by libMesh::UnstructuredMesh::all_first_order(), libMesh::MeshRefinement::enforce_mismatch_limit_prior_to_refinement(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshRefinement::make_flags_parallel_consistent(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::Elem::refine(), and libMesh::Elem::set_p_level().

3185 {
3186  if (this->p_level() == 0)
3187  libmesh_assert_not_equal_to
3188  (pflag, Elem::JUST_REFINED);
3189 
3190  _pflag = cast_int<unsigned char>(pflag);
3191 }
unsigned char _pflag
p refinement flag.
Definition: elem.h:2230
unsigned int p_level() const
Definition: elem.h:3058

◆ set_parent()

void libMesh::Elem::set_parent ( Elem p)
inlineinherited

Sets the pointer to the element's parent.

Dangerous! Only use this if you know what you are doing!

Definition at line 2996 of file elem.h.

References libMesh::Elem::_elemlinks, and libMesh::Elem::dim().

Referenced by libMesh::BoundaryInfo::add_elements(), and libMesh::UnstructuredMesh::all_first_order().

2997 {
2998  // We no longer support using parent() as interior_parent()
2999  libmesh_assert_equal_to(this->dim(), p ? p->dim() : this->dim());
3000  _elemlinks[0] = p;
3001 }
Elem ** _elemlinks
Pointers to this element&#39;s parent and neighbors, and for lower-dimensional elements&#39; interior_parent...
Definition: elem.h:2201
virtual unsigned short dim() const =0

◆ set_refinement_flag()

void libMesh::Elem::set_refinement_flag ( const RefinementState  rflag)
inlineinherited

◆ set_unique_id() [1/2]

unique_id_type & libMesh::DofObject::set_unique_id ( )
inlineinherited

◆ set_unique_id() [2/2]

void libMesh::DofObject::set_unique_id ( unique_id_type  new_id)
inlineinherited

Sets the unique_id for this DofObject.

Definition at line 872 of file dof_object.h.

References libMesh::DofObject::_unique_id, and libMesh::libmesh_ignore().

873 {
874 #ifdef LIBMESH_ENABLE_UNIQUE_ID
875  _unique_id = new_id;
876 #else
877  libmesh_ignore(new_id);
878  libmesh_not_implemented();
879 #endif
880 }
unique_id_type _unique_id
A globally unique id, guaranteed not to change as the mesh is repartitioned or adapted.
Definition: dof_object.h:577
void libmesh_ignore(const Args &...)

◆ set_vg_dof_base()

void libMesh::DofObject::set_vg_dof_base ( const unsigned int  s,
const unsigned int  vg,
const dof_id_type  db 
)
inlineinherited

VariableGroup DoF indices are indexed as id = base + var_in_vg*ncomp + comp This method allows for direct access to the base.

Definition at line 1297 of file dof_object.h.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), libMesh::DofObject::start_idx(), and libMesh::DofObject::vg_dof_base().

Referenced by libMesh::DofMap::distribute_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::DofObject::invalidate_dofs(), libMesh::DofMap::reinit(), libMesh::DofMap::set_nonlocal_dof_objects(), and DofObjectTest< Node >::testManualDofCalculation().

1300 {
1301  libmesh_assert_less (s, this->n_systems());
1302  libmesh_assert_less (vg, this->n_var_groups(s));
1303 
1304  const unsigned int
1305  start_idx_sys = this->start_idx(s);
1306 
1307  libmesh_assert_less ((start_idx_sys + 2*vg + 1), _idx_buf.size());
1308 
1309  _idx_buf[start_idx_sys + 2*vg + 1] = db;
1310 
1311  libmesh_assert_equal_to (this->vg_dof_base(s,vg), db);
1312 }
dof_id_type vg_dof_base(const unsigned int s, const unsigned int vg) const
VariableGroup DoF indices are indexed as id = base + var_in_vg*ncomp + comp This method allows for di...
Definition: dof_object.h:1317
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
unsigned int n_systems() const
Definition: dof_object.h:937
unsigned int start_idx(const unsigned int s) const
The starting index for system s.
Definition: dof_object.h:1249
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ side_index_range()

IntRange< unsigned short > libMesh::Elem::side_index_range ( ) const
inlineinherited
Returns
An integer range from 0 up to (but not including) the number of sides this element has.

Definition at line 2623 of file elem.h.

References libMesh::Elem::n_sides().

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::MeshTools::Subdivision::add_boundary_ghosts(), libMesh::BoundaryInfo::add_elements(), libMesh::MeshTools::Modification::all_tri(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::FEGenericBase< FEOutputType< T >::type >::coarsened_dof_values(), compute_enriched_soln(), libMesh::FEAbstract::compute_node_constraints(), libMesh::FEAbstract::compute_periodic_node_constraints(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints(), libMesh::BoundaryInfo::copy_boundary_ids(), libMesh::BoundaryInfo::edge_boundary_ids(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::MeshTools::Modification::flatten(), libMesh::ReplicatedMesh::get_disconnected_subdomains(), libMesh::Elem::get_info(), libMesh::BoundaryInfo::get_side_and_node_maps(), libMesh::Elem::has_topological_neighbor(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_constraints(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_node_constraints(), libMesh::LaplaceMeshSmoother::init(), libMesh::Elem::libmesh_assert_valid_neighbors(), libMesh::Elem::nullify_neighbors(), libMesh::PostscriptIO::plot_quadratic_elem(), libMesh::MeshTools::Modification::smooth(), libMesh::UnstructuredMesh::stitching_helper(), MeshBaseTest::testMeshBaseVerifyIsPrepared(), and libMesh::MeshTetInterface::volume_to_surface_mesh().

2624 {
2625  return {0, cast_int<unsigned short>(this->n_sides())};
2626 }
virtual unsigned int n_sides() const =0

◆ side_ptr() [1/4]

std::unique_ptr< Elem > libMesh::Hex::side_ptr ( const unsigned int  i)
finaloverridevirtualinherited
Returns
A primitive (4-noded) quad for face i.

Implements libMesh::Elem.

Definition at line 148 of file cell_hex.C.

References libMesh::Hex::n_sides(), libMesh::Elem::node_ptr(), and libMesh::Hex8::side_nodes_map.

149 {
150  libmesh_assert_less (i, this->n_sides());
151 
152  std::unique_ptr<Elem> face = std::make_unique<Quad4>();
153 
154  for (auto n : face->node_index_range())
155  face->set_node(n) = this->node_ptr(Hex8::side_nodes_map[i][n]);
156 
157  return face;
158 }
static const unsigned int side_nodes_map[num_sides][nodes_per_side]
This maps the node of the side to element node numbers.
Definition: cell_hex8.h:171
virtual unsigned int n_sides() const override final
Definition: cell_hex.h:80
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444

◆ side_ptr() [2/4]

void libMesh::Hex::side_ptr ( std::unique_ptr< Elem > &  side,
const unsigned int  i 
)
finaloverridevirtualinherited

Rebuilds a primitive (4-noded) quad for face i.

Implements libMesh::Elem.

Definition at line 162 of file cell_hex.C.

References libMesh::QUAD4.

164 {
165  this->simple_side_ptr<Hex,Hex8>(side, i, QUAD4);
166 }

◆ side_ptr() [3/4]

std::unique_ptr< const Elem > libMesh::Elem::side_ptr ( unsigned int  i) const
inlineinherited

Definition at line 2632 of file elem.h.

References libMesh::Elem::side_ptr().

2633 {
2634  // Call the non-const version of this function, return the result as
2635  // a std::unique_ptr<const Elem>.
2636  Elem * me = const_cast<Elem *>(this);
2637  const Elem * s = const_cast<const Elem *>(me->side_ptr(i).release());
2638  return std::unique_ptr<const Elem>(s);
2639 }
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328

◆ side_ptr() [4/4]

void libMesh::Elem::side_ptr ( std::unique_ptr< const Elem > &  side,
const unsigned int  i 
) const
inlineinherited

Definition at line 2645 of file elem.h.

References libMesh::Elem::side_ptr().

2647 {
2648  // Hand off to the non-const version of this function
2649  Elem * me = const_cast<Elem *>(this);
2650  std::unique_ptr<Elem> e {const_cast<Elem *>(elem.release())};
2651  me->side_ptr(e, i);
2652  elem = std::move(e);
2653 }
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328

◆ side_type()

ElemType libMesh::Hex20::side_type ( const unsigned int  s) const
finaloverridevirtual
Returns
The type of element for side s.

Implements libMesh::Elem.

Definition at line 784 of file cell_hex20.C.

References libMesh::QUAD8.

785 {
786  libmesh_assert_less (s, 6);
787  return QUAD8;
788 }

◆ sides_on_edge()

std::vector< unsigned int > libMesh::Hex::sides_on_edge ( const unsigned int  int) const
finaloverridevirtualinherited
Returns
the (local) side numbers that touch the specified edge

Implements libMesh::Elem.

Definition at line 202 of file cell_hex.C.

References libMesh::Hex::edge_sides_map, and libMesh::Hex::n_edges().

203 {
204  libmesh_assert_less(e, this->n_edges());
205 
206  return {edge_sides_map[e][0], edge_sides_map[e][1]};
207 }
virtual unsigned int n_edges() const override final
Definition: cell_hex.h:90
static const unsigned int edge_sides_map[12][2]
This maps each edge to the sides that contain said edge.
Definition: cell_hex.h:196

◆ simple_build_edge_ptr() [1/2]

template<typename Edgeclass , typename Subclass >
std::unique_ptr< Elem > libMesh::Elem::simple_build_edge_ptr ( const unsigned int  i)
inlineprotectedinherited

An implementation for simple (all edges equal) elements.

Definition at line 2808 of file elem.h.

References libMesh::Elem::mapping_type(), libMesh::Elem::n_edges(), libMesh::Elem::node_ptr(), libMesh::Elem::p_level(), and libMesh::Elem::subdomain_id().

2809 {
2810  libmesh_assert_less (i, this->n_edges());
2811 
2812  std::unique_ptr<Elem> edge = std::make_unique<Edgeclass>(this);
2813 
2814  for (auto n : edge->node_index_range())
2815  edge->set_node(n) = this->node_ptr(Subclass::edge_nodes_map[i][n]);
2816 
2817  edge->set_interior_parent(this);
2818  edge->set_mapping_type(this->mapping_type());
2819  edge->subdomain_id() = this->subdomain_id();
2820 #ifdef LIBMESH_ENABLE_AMR
2821  edge->set_p_level(this->p_level());
2822 #endif
2823 
2824  return edge;
2825 }
unsigned int p_level() const
Definition: elem.h:3058
ElemMappingType mapping_type() const
Definition: elem.h:3070
virtual unsigned int n_edges() const =0
subdomain_id_type subdomain_id() const
Definition: elem.h:2504
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444

◆ simple_build_edge_ptr() [2/2]

template<typename Subclass >
void libMesh::Elem::simple_build_edge_ptr ( std::unique_ptr< Elem > &  edge,
const unsigned int  i,
ElemType  edgetype 
)
inlineprotectedinherited

An implementation for simple (all edges equal) elements.

Definition at line 2833 of file elem.h.

References libMesh::Elem::mapping_type(), libMesh::Elem::n_edges(), libMesh::Elem::node_ptr(), libMesh::Elem::p_level(), and libMesh::Elem::subdomain_id().

2836 {
2837  libmesh_assert_less (i, this->n_edges());
2838 
2839  if (!edge.get() || edge->type() != edgetype)
2840  {
2841  Subclass & real_me = cast_ref<Subclass&>(*this);
2842  edge = real_me.Subclass::build_edge_ptr(i);
2843  }
2844  else
2845  {
2846  edge->set_mapping_type(this->mapping_type());
2847  edge->subdomain_id() = this->subdomain_id();
2848 #ifdef LIBMESH_ENABLE_AMR
2849  edge->set_p_level(this->p_level());
2850 #endif
2851  for (auto n : edge->node_index_range())
2852  edge->set_node(n) = this->node_ptr(Subclass::edge_nodes_map[i][n]);
2853  }
2854 }
unsigned int p_level() const
Definition: elem.h:3058
ElemMappingType mapping_type() const
Definition: elem.h:3070
virtual unsigned int n_edges() const =0
subdomain_id_type subdomain_id() const
Definition: elem.h:2504
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444

◆ simple_build_side_ptr() [1/2]

template<typename Sideclass , typename Subclass >
std::unique_ptr< Elem > libMesh::Elem::simple_build_side_ptr ( const unsigned int  i,
bool  proxy 
)
inlineprotectedinherited

An implementation for simple (all sides equal) elements.

Definition at line 2687 of file elem.h.

References libMesh::Elem::mapping_type(), libMesh::Elem::n_sides(), libMesh::Elem::node_ptr(), libMesh::Elem::p_level(), and libMesh::Elem::subdomain_id().

2689 {
2690  libmesh_assert_less (i, this->n_sides());
2691 
2692  std::unique_ptr<Elem> face;
2693  if (proxy)
2694  {
2695 #ifdef LIBMESH_ENABLE_DEPRECATED
2696  face = std::make_unique<Side<Sideclass,Subclass>>(this,i);
2697  libmesh_deprecated();
2698 #else
2699  libmesh_error();
2700 #endif
2701  }
2702  else
2703  {
2704  face = std::make_unique<Sideclass>(this);
2705  for (auto n : face->node_index_range())
2706  face->set_node(n) = this->node_ptr(Subclass::side_nodes_map[i][n]);
2707  }
2708 
2709 #ifdef LIBMESH_ENABLE_DEPRECATED
2710  if (!proxy) // proxy sides used to leave parent() set
2711 #endif
2712  face->set_parent(nullptr);
2713  face->set_interior_parent(this);
2714 
2715  face->set_mapping_type(this->mapping_type());
2716  face->subdomain_id() = this->subdomain_id();
2717 #ifdef LIBMESH_ENABLE_AMR
2718  face->set_p_level(this->p_level());
2719 #endif
2720 
2721  return face;
2722 }
unsigned int p_level() const
Definition: elem.h:3058
ElemMappingType mapping_type() const
Definition: elem.h:3070
virtual unsigned int n_sides() const =0
subdomain_id_type subdomain_id() const
Definition: elem.h:2504
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444

◆ simple_build_side_ptr() [2/2]

template<typename Subclass >
void libMesh::Elem::simple_build_side_ptr ( std::unique_ptr< Elem > &  side,
const unsigned int  i,
ElemType  sidetype 
)
inlineprotectedinherited

An implementation for simple (all sides equal) elements.

Definition at line 2729 of file elem.h.

References libMesh::Elem::mapping_type(), libMesh::Elem::n_sides(), libMesh::Elem::node_ptr(), libMesh::Elem::p_level(), and libMesh::Elem::subdomain_id().

2732 {
2733  libmesh_assert_less (i, this->n_sides());
2734 
2735  if (!side.get() || side->type() != sidetype)
2736  {
2737  Subclass & real_me = cast_ref<Subclass&>(*this);
2738  side = real_me.Subclass::build_side_ptr(i, false);
2739  }
2740  else
2741  {
2742  side->subdomain_id() = this->subdomain_id();
2743  side->set_mapping_type(this->mapping_type());
2744 #ifdef LIBMESH_ENABLE_AMR
2745  side->set_p_level(this->p_level());
2746 #endif
2747  for (auto n : side->node_index_range())
2748  side->set_node(n) = this->node_ptr(Subclass::side_nodes_map[i][n]);
2749  }
2750 }
unsigned int p_level() const
Definition: elem.h:3058
ElemMappingType mapping_type() const
Definition: elem.h:3070
virtual unsigned int n_sides() const =0
subdomain_id_type subdomain_id() const
Definition: elem.h:2504
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444

◆ simple_side_ptr()

template<typename Subclass , typename Mapclass >
void libMesh::Elem::simple_side_ptr ( std::unique_ptr< Elem > &  side,
const unsigned int  i,
ElemType  sidetype 
)
inlineprotectedinherited

An implementation for simple (all sides equal) elements.

Definition at line 2757 of file elem.h.

References libMesh::Elem::n_sides(), libMesh::Elem::node_ptr(), and libMesh::Elem::subdomain_id().

2760 {
2761  libmesh_assert_less (i, this->n_sides());
2762 
2763  if (!side.get() || side->type() != sidetype)
2764  {
2765  Subclass & real_me = cast_ref<Subclass&>(*this);
2766  side = real_me.Subclass::side_ptr(i);
2767  }
2768  else
2769  {
2770  side->subdomain_id() = this->subdomain_id();
2771 
2772  for (auto n : side->node_index_range())
2773  side->set_node(n) = this->node_ptr(Mapclass::side_nodes_map[i][n]);
2774  }
2775 }
virtual unsigned int n_sides() const =0
subdomain_id_type subdomain_id() const
Definition: elem.h:2504
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444

◆ subactive()

bool libMesh::Elem::subactive ( ) const
inlineinherited
Returns
true if the element is subactive (i.e. has no active descendants), false otherwise or if AMR is disabled.

Definition at line 2909 of file elem.h.

References libMesh::Elem::active(), libMesh::Elem::has_children(), and libMesh::Elem::parent().

Referenced by libMesh::HPCoarsenTest::add_projection(), libMesh::Elem::ancestor(), libMesh::FEAbstract::compute_node_constraints(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::Elem::get_info(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_constraints(), libMesh::InfFE< Dim, T_radial, T_map >::inf_compute_node_constraints(), libMesh::Elem::libmesh_assert_valid_neighbors(), libMesh::Elem::make_links_to_me_local(), libMesh::Elem::make_links_to_me_remote(), libMesh::Elem::max_descendant_p_level(), libMesh::Elem::min_new_p_level_by_neighbor(), libMesh::Elem::min_p_level_by_neighbor(), libMesh::Elem::refine(), libMesh::Elem::remove_links_to_me(), and libMesh::UnstructuredMesh::stitching_helper().

2910 {
2911 #ifdef LIBMESH_ENABLE_AMR
2912  if (this->active())
2913  return false;
2914  if (!this->has_children())
2915  return true;
2916  for (const Elem * my_ancestor = this->parent();
2917  my_ancestor != nullptr;
2918  my_ancestor = my_ancestor->parent())
2919  if (my_ancestor->active())
2920  return true;
2921 #endif
2922 
2923  return false;
2924 }
const Elem * parent() const
Definition: elem.h:2980
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
bool active() const
Definition: elem.h:2891
bool has_children() const
Definition: elem.h:2929

◆ subdomain_id() [1/2]

subdomain_id_type libMesh::Elem::subdomain_id ( ) const
inlineinherited
Returns
The subdomain that this element belongs to.

Definition at line 2504 of file elem.h.

References libMesh::Elem::_sbd_id.

Referenced by libMesh::DofMap::_dof_indices(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::SyncSubdomainIds::act_on_data(), LinearElasticityWithContact::add_contact_edge_elements(), libMesh::UnstructuredMesh::all_first_order(), libMesh::MeshTools::Modification::all_tri(), AllSecondOrderTest::allCompleteOrderRange(), AllSecondOrderTest::allSecondOrderRange(), libMesh::AbaqusIO::assign_subdomain_ids(), libMesh::EquationSystems::build_discontinuous_solution_vector(), libMesh::InfHex8::build_edge_ptr(), libMesh::InfPrism6::build_edge_ptr(), libMesh::InfHex18::build_edge_ptr(), libMesh::InfPrism12::build_edge_ptr(), libMesh::InfHex16::build_edge_ptr(), MixedDimensionMeshTest::build_mesh(), MixedDimensionNonUniformRefinement::build_mesh(), MixedDimensionNonUniformRefinementTriangle::build_mesh(), MixedDimensionNonUniformRefinement3D::build_mesh(), OverlappingTestBase::build_quad_mesh(), libMesh::InfQuad4::build_side_ptr(), libMesh::InfHex8::build_side_ptr(), libMesh::InfPrism6::build_side_ptr(), libMesh::InfHex18::build_side_ptr(), libMesh::Pyramid5::build_side_ptr(), libMesh::InfQuad6::build_side_ptr(), libMesh::Prism6::build_side_ptr(), libMesh::InfPrism12::build_side_ptr(), libMesh::InfHex16::build_side_ptr(), libMesh::C0Polygon::build_side_ptr(), libMesh::Pyramid13::build_side_ptr(), libMesh::Prism15::build_side_ptr(), libMesh::Prism18::build_side_ptr(), libMesh::Pyramid14::build_side_ptr(), libMesh::Prism20::build_side_ptr(), libMesh::Prism21::build_side_ptr(), libMesh::Pyramid18::build_side_ptr(), libMesh::MeshTools::Modification::change_subdomain_id(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints(), libMesh::TriangleWrapper::copy_tri_to_mesh(), libMesh::Elem::disconnected_clone(), libMesh::DofMap::dof_indices(), libMesh::Elem::Elem(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::MeshTools::Modification::flatten(), libMesh::SyncSubdomainIds::gather_data(), libMesh::Elem::get_info(), MeshExtruderTest::QueryElemSubdomainID::get_subdomain_for_layer(), libMesh::UNVIO::groups_in(), libMesh::DofMap::old_dof_indices(), libMesh::PointLocatorNanoflann::operator()(), libMesh::XdrIO::pack_element(), libMesh::Polygon::Polygon(), libMesh::CheckpointIO::read_connectivity(), libMesh::GmshIO::read_mesh(), libMesh::DynaIO::read_mesh(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::Prism::side_ptr(), libMesh::Pyramid::side_ptr(), libMesh::Edge::side_ptr(), libMesh::Polygon::side_ptr(), libMesh::InfPrism::side_ptr(), libMesh::InfHex::side_ptr(), libMesh::InfQuad::side_ptr(), libMesh::Elem::simple_build_edge_ptr(), libMesh::Elem::simple_build_side_ptr(), libMesh::Elem::simple_side_ptr(), SystemsTest::testDofCouplingWithVarGroups(), MeshExtruderTest::testExtruder(), and SystemsTest::tripleValueTest().

2505 {
2506  return _sbd_id;
2507 }
subdomain_id_type _sbd_id
The subdomain to which this element belongs.
Definition: elem.h:2217

◆ subdomain_id() [2/2]

subdomain_id_type & libMesh::Elem::subdomain_id ( )
inlineinherited
Returns
The subdomain that this element belongs to as a writable reference.

Definition at line 2512 of file elem.h.

References libMesh::Elem::_sbd_id.

2513 {
2514  return _sbd_id;
2515 }
subdomain_id_type _sbd_id
The subdomain to which this element belongs.
Definition: elem.h:2217

◆ supported_nodal_order()

virtual Order libMesh::Elem::supported_nodal_order ( ) const
inlinevirtualinherited
Returns
The maximum supported approximation order for nodal (Lagrange or Rational Bezier-Bernstein) variables on this element type. This is usually the same as the default order.

Reimplemented in libMesh::NodeElem.

Definition at line 965 of file elem.h.

References libMesh::Elem::default_order().

Referenced by libMesh::MeshBase::copy_constraint_rows().

965 { return default_order(); }
virtual Order default_order() const =0

◆ swap2boundaryedges()

void libMesh::Elem::swap2boundaryedges ( unsigned short  e1,
unsigned short  e2,
BoundaryInfo boundary_info 
) const
protectedinherited

Swaps two edges in boundary_info, if it is non-null.

Definition at line 3421 of file elem.C.

References libMesh::BoundaryInfo::add_edge(), libMesh::BoundaryInfo::edge_boundary_ids(), and libMesh::BoundaryInfo::remove_edge().

Referenced by libMesh::InfQuad4::flip(), libMesh::InfPrism6::flip(), libMesh::InfHex8::flip(), libMesh::Quad4::flip(), libMesh::InfQuad6::flip(), libMesh::C0Polygon::flip(), libMesh::Pyramid5::flip(), libMesh::Tri3::flip(), libMesh::Prism6::flip(), libMesh::InfPrism12::flip(), libMesh::Quad8::flip(), libMesh::Hex8::flip(), libMesh::Quad9::flip(), libMesh::InfHex16::flip(), libMesh::Tri7::flip(), libMesh::Tri6::flip(), libMesh::Pyramid13::flip(), libMesh::InfHex18::flip(), flip(), libMesh::Tet14::flip(), libMesh::Tet10::flip(), libMesh::Prism15::flip(), libMesh::Tet4::flip(), libMesh::Pyramid14::flip(), libMesh::Pyramid18::flip(), libMesh::Hex27::flip(), libMesh::Prism18::flip(), libMesh::Prism20::flip(), and libMesh::Prism21::flip().

3424 {
3425  std::vector<boundary_id_type> ids1, ids2;
3426  boundary_info->edge_boundary_ids(this, e1, ids1);
3427  boundary_info->edge_boundary_ids(this, e2, ids2);
3428  boundary_info->remove_edge(this, e1);
3429  boundary_info->remove_edge(this, e2);
3430  if (!ids1.empty())
3431  boundary_info->add_edge(this, e2, ids1);
3432  if (!ids2.empty())
3433  boundary_info->add_edge(this, e1, ids2);
3434 }

◆ swap2boundarysides()

void libMesh::Elem::swap2boundarysides ( unsigned short  s1,
unsigned short  s2,
BoundaryInfo boundary_info 
) const
protectedinherited

Swaps two sides in boundary_info, if it is non-null.

Definition at line 3405 of file elem.C.

References libMesh::BoundaryInfo::add_side(), libMesh::BoundaryInfo::boundary_ids(), and libMesh::BoundaryInfo::remove_side().

Referenced by libMesh::InfQuad4::flip(), libMesh::InfPrism6::flip(), libMesh::InfHex8::flip(), libMesh::Edge2::flip(), libMesh::Quad4::flip(), libMesh::InfQuad6::flip(), libMesh::C0Polygon::flip(), libMesh::Pyramid5::flip(), libMesh::Edge4::flip(), libMesh::Tri3::flip(), libMesh::Prism6::flip(), libMesh::Edge3::flip(), libMesh::InfPrism12::flip(), libMesh::Quad8::flip(), libMesh::Hex8::flip(), libMesh::Quad9::flip(), libMesh::InfHex16::flip(), libMesh::Tri7::flip(), libMesh::Tri6::flip(), libMesh::Pyramid13::flip(), libMesh::InfHex18::flip(), flip(), libMesh::Tet10::flip(), libMesh::Tet14::flip(), libMesh::Prism15::flip(), libMesh::Tet4::flip(), libMesh::Pyramid14::flip(), libMesh::Pyramid18::flip(), libMesh::Hex27::flip(), libMesh::Prism20::flip(), libMesh::Prism18::flip(), and libMesh::Prism21::flip().

3408 {
3409  std::vector<boundary_id_type> ids1, ids2;
3410  boundary_info->boundary_ids(this, s1, ids1);
3411  boundary_info->boundary_ids(this, s2, ids2);
3412  boundary_info->remove_side(this, s1);
3413  boundary_info->remove_side(this, s2);
3414  if (!ids1.empty())
3415  boundary_info->add_side(this, s2, ids1);
3416  if (!ids2.empty())
3417  boundary_info->add_side(this, s1, ids2);
3418 }

◆ swap2neighbors()

void libMesh::Elem::swap2neighbors ( unsigned int  n1,
unsigned int  n2 
)
inlineprotectedinherited

Swaps two neighbor_ptrs.

Definition at line 2051 of file elem.h.

References libMesh::Elem::neighbor_ptr(), and libMesh::Elem::set_neighbor().

Referenced by libMesh::InfQuad4::flip(), libMesh::InfPrism6::flip(), libMesh::InfHex8::flip(), libMesh::Quad4::flip(), libMesh::Edge2::flip(), libMesh::InfQuad6::flip(), libMesh::C0Polygon::flip(), libMesh::Pyramid5::flip(), libMesh::Edge4::flip(), libMesh::Tri3::flip(), libMesh::Prism6::flip(), libMesh::Edge3::flip(), libMesh::InfPrism12::flip(), libMesh::Quad8::flip(), libMesh::Hex8::flip(), libMesh::Quad9::flip(), libMesh::Tri7::flip(), libMesh::InfHex16::flip(), libMesh::Tri6::flip(), libMesh::Pyramid13::flip(), libMesh::InfHex18::flip(), flip(), libMesh::Tet14::flip(), libMesh::Tet10::flip(), libMesh::Prism15::flip(), libMesh::Tet4::flip(), libMesh::Pyramid14::flip(), libMesh::Pyramid18::flip(), libMesh::Hex27::flip(), libMesh::Prism18::flip(), libMesh::Prism20::flip(), libMesh::Prism21::flip(), libMesh::Prism6::permute(), libMesh::Hex8::permute(), permute(), libMesh::Prism15::permute(), libMesh::Hex27::permute(), libMesh::Prism20::permute(), libMesh::Prism18::permute(), libMesh::Prism21::permute(), libMesh::Elem::swap3neighbors(), and libMesh::Elem::swap4neighbors().

2052  {
2053  Elem * temp = this->neighbor_ptr(n1);
2054  this->set_neighbor(n1, this->neighbor_ptr(n2));
2055  this->set_neighbor(n2, temp);
2056  }
void set_neighbor(const unsigned int i, Elem *n)
Assigns n as the neighbor.
Definition: elem.h:2540
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
const Elem * neighbor_ptr(unsigned int i) const
Definition: elem.h:2520

◆ swap2nodes()

void libMesh::Elem::swap2nodes ( unsigned int  n1,
unsigned int  n2 
)
inlineprotectedinherited

Swaps two node_ptrs.

Definition at line 2041 of file elem.h.

References libMesh::Elem::node_ptr(), and libMesh::Elem::set_node().

Referenced by libMesh::InfQuad4::flip(), libMesh::InfPrism6::flip(), libMesh::InfHex8::flip(), libMesh::Quad4::flip(), libMesh::Edge2::flip(), libMesh::InfQuad6::flip(), libMesh::C0Polygon::flip(), libMesh::Pyramid5::flip(), libMesh::Edge4::flip(), libMesh::Tri3::flip(), libMesh::Prism6::flip(), libMesh::Edge3::flip(), libMesh::InfPrism12::flip(), libMesh::Quad8::flip(), libMesh::Hex8::flip(), libMesh::Quad9::flip(), libMesh::Tri7::flip(), libMesh::InfHex16::flip(), libMesh::Tri6::flip(), libMesh::Pyramid13::flip(), libMesh::InfHex18::flip(), flip(), libMesh::Tet14::flip(), libMesh::Tet10::flip(), libMesh::Prism15::flip(), libMesh::Tet4::flip(), libMesh::Pyramid14::flip(), libMesh::Pyramid18::flip(), libMesh::Hex27::flip(), libMesh::Prism18::flip(), libMesh::Prism20::flip(), libMesh::Prism21::flip(), libMesh::Prism6::permute(), libMesh::Hex8::permute(), permute(), libMesh::Prism15::permute(), libMesh::Hex27::permute(), libMesh::Prism20::permute(), libMesh::Prism18::permute(), libMesh::Prism21::permute(), libMesh::Elem::swap3nodes(), and libMesh::Elem::swap4nodes().

2042  {
2043  Node * temp = this->node_ptr(n1);
2044  this->set_node(n1) = this->node_ptr(n2);
2045  this->set_node(n2) = temp;
2046  }
virtual Node *& set_node(const unsigned int i)
Definition: elem.h:2494
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:2444

◆ swap3neighbors()

void libMesh::Elem::swap3neighbors ( unsigned int  n1,
unsigned int  n2,
unsigned int  n3 
)
inlineprotectedinherited

◆ swap3nodes()

void libMesh::Elem::swap3nodes ( unsigned int  n1,
unsigned int  n2,
unsigned int  n3 
)
inlineprotectedinherited

◆ swap4neighbors()

void libMesh::Elem::swap4neighbors ( unsigned int  n1,
unsigned int  n2,
unsigned int  n3,
unsigned int  n4 
)
inlineprotectedinherited

Swaps four neighbor_ptrs, "rotating" them.

Definition at line 2102 of file elem.h.

References libMesh::Elem::swap2neighbors(), and libMesh::Elem::swap3neighbors().

Referenced by libMesh::InfHex8::permute(), libMesh::Quad4::permute(), libMesh::Pyramid5::permute(), libMesh::Hex8::permute(), libMesh::Quad8::permute(), libMesh::Quad9::permute(), libMesh::InfHex16::permute(), libMesh::Pyramid13::permute(), libMesh::InfHex18::permute(), permute(), libMesh::Pyramid14::permute(), libMesh::Pyramid18::permute(), and libMesh::Hex27::permute().

2104  {
2105  swap3neighbors(n1, n2, n3);
2106  swap2neighbors(n3, n4);
2107  }
void swap3neighbors(unsigned int n1, unsigned int n2, unsigned int n3)
Swaps three neighbor_ptrs, "rotating" them.
Definition: elem.h:2082
void swap2neighbors(unsigned int n1, unsigned int n2)
Swaps two neighbor_ptrs.
Definition: elem.h:2051

◆ swap4nodes()

void libMesh::Elem::swap4nodes ( unsigned int  n1,
unsigned int  n2,
unsigned int  n3,
unsigned int  n4 
)
inlineprotectedinherited

Swaps four node_ptrs, "rotating" them.

Definition at line 2092 of file elem.h.

References libMesh::Elem::swap2nodes(), and libMesh::Elem::swap3nodes().

Referenced by libMesh::InfHex8::permute(), libMesh::Quad4::permute(), libMesh::Pyramid5::permute(), libMesh::Hex8::permute(), libMesh::Quad8::permute(), libMesh::Quad9::permute(), libMesh::InfHex16::permute(), libMesh::Pyramid13::permute(), libMesh::InfHex18::permute(), permute(), libMesh::Pyramid14::permute(), libMesh::Pyramid18::permute(), and libMesh::Hex27::permute().

2094  {
2095  swap3nodes(n1, n2, n3);
2096  swap2nodes(n3, n4);
2097  }
void swap3nodes(unsigned int n1, unsigned int n2, unsigned int n3)
Swaps three node_ptrs, "rotating" them.
Definition: elem.h:2073
void swap2nodes(unsigned int n1, unsigned int n2)
Swaps two node_ptrs.
Definition: elem.h:2041

◆ top_parent()

const Elem * libMesh::Elem::top_parent ( ) const
inlineinherited
Returns
A pointer to the element's top-most (i.e. level-0) parent.

That is, this if this is a level-0 element, this element's parent if this is a level-1 element, this element's grandparent if this is a level-2 element, etc...

Definition at line 3006 of file elem.h.

References libMesh::Elem::level(), libMesh::libmesh_assert(), and libMesh::Elem::parent().

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::BoundaryInfo::add_elements(), libMesh::BoundaryInfo::boundary_ids(), libMesh::BoundaryInfo::edge_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_amr_interior_parents(), libMesh::ExodusII_IO::read_elemental_variable(), libMesh::BoundaryInfo::side_with_boundary_id(), libMesh::BoundaryInfo::sides_with_boundary_id(), and ExtraIntegersTest::test_final_integers().

3007 {
3008  const Elem * tp = this;
3009 
3010  // Keep getting the element's parent
3011  // until that parent is at level-0
3012  while (tp->parent() != nullptr)
3013  tp = tp->parent();
3014 
3015  libmesh_assert(tp);
3016  libmesh_assert_equal_to (tp->level(), 0);
3017 
3018  return tp;
3019 }
libmesh_assert(ctx)
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328

◆ topological_neighbor() [1/2]

const Elem * libMesh::Elem::topological_neighbor ( const unsigned int  i,
const MeshBase mesh,
const PointLocatorBase point_locator,
const PeriodicBoundaries pb 
) const
inherited
Returns
A pointer to the i^{th} neighbor of this element for interior elements. If an element is on a periodic boundary, it will return a corresponding element on the opposite side.

Definition at line 1184 of file elem.C.

References libMesh::PeriodicBoundaries::boundary(), libMesh::Elem::level(), mesh, libMesh::Elem::n_neighbors(), libMesh::PeriodicBoundaries::neighbor(), libMesh::Elem::neighbor_ptr(), and libMesh::Elem::parent().

Referenced by libMesh::Elem::has_topological_neighbor(), libMesh::GhostPointNeighbors::operator()(), libMesh::DefaultCoupling::operator()(), and libMesh::MeshRefinement::topological_neighbor().

1188 {
1189  libmesh_assert_less (i, this->n_neighbors());
1190 
1191  const Elem * neighbor_i = this->neighbor_ptr(i);
1192  if (neighbor_i != nullptr)
1193  return neighbor_i;
1194 
1195  if (pb)
1196  {
1197  // Since the neighbor is nullptr it must be on a boundary. We need
1198  // see if this is a periodic boundary in which case it will have a
1199  // topological neighbor
1200  std::vector<boundary_id_type> bc_ids;
1201  mesh.get_boundary_info().boundary_ids(this, cast_int<unsigned short>(i), bc_ids);
1202  for (const auto & id : bc_ids)
1203  if (pb->boundary(id))
1204  {
1205  neighbor_i = pb->neighbor(id, point_locator, this, i);
1206 
1207  // Since coarse elements do not have more refined
1208  // neighbors we need to make sure that we don't return one
1209  // of these types of neighbors.
1210  if (neighbor_i)
1211  while (level() < neighbor_i->level())
1212  neighbor_i = neighbor_i->parent();
1213  return neighbor_i;
1214  }
1215  }
1216 
1217  return nullptr;
1218 }
MeshBase & mesh
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
const Elem * neighbor_ptr(unsigned int i) const
Definition: elem.h:2520
unsigned int level() const
Definition: elem.h:3024
unsigned int n_neighbors() const
Definition: elem.h:692

◆ topological_neighbor() [2/2]

Elem * libMesh::Elem::topological_neighbor ( const unsigned int  i,
MeshBase mesh,
const PointLocatorBase point_locator,
const PeriodicBoundaries pb 
)
inherited
Returns
A writable pointer to the i^{th} neighbor of this element for interior elements. If an element is on a periodic boundary, it will return a corresponding element on the opposite side.

Definition at line 1142 of file elem.C.

References libMesh::PeriodicBoundaries::boundary(), libMesh::Elem::level(), mesh, libMesh::Elem::n_neighbors(), libMesh::PeriodicBoundaries::neighbor(), libMesh::Elem::neighbor_ptr(), and libMesh::Elem::parent().

1146 {
1147  libmesh_assert_less (i, this->n_neighbors());
1148 
1149  Elem * neighbor_i = this->neighbor_ptr(i);
1150  if (neighbor_i != nullptr)
1151  return neighbor_i;
1152 
1153  if (pb)
1154  {
1155  // Since the neighbor is nullptr it must be on a boundary. We need
1156  // see if this is a periodic boundary in which case it will have a
1157  // topological neighbor
1158  std::vector<boundary_id_type> bc_ids;
1159  mesh.get_boundary_info().boundary_ids(this, cast_int<unsigned short>(i), bc_ids);
1160  for (const auto & id : bc_ids)
1161  if (pb->boundary(id))
1162  {
1163  // Since the point locator inside of periodic boundaries
1164  // returns a const pointer we will retrieve the proper
1165  // pointer directly from the mesh object.
1166  const Elem * const cn = pb->neighbor(id, point_locator, this, i);
1167  neighbor_i = const_cast<Elem *>(cn);
1168 
1169  // Since coarse elements do not have more refined
1170  // neighbors we need to make sure that we don't return one
1171  // of these types of neighbors.
1172  if (neighbor_i)
1173  while (level() < neighbor_i->level())
1174  neighbor_i = neighbor_i->parent();
1175  return neighbor_i;
1176  }
1177  }
1178 
1179  return nullptr;
1180 }
MeshBase & mesh
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
const Elem * neighbor_ptr(unsigned int i) const
Definition: elem.h:2520
unsigned int level() const
Definition: elem.h:3024
unsigned int n_neighbors() const
Definition: elem.h:692

◆ topologically_equal()

bool libMesh::Elem::topologically_equal ( const Elem rhs) const
inherited
Returns
true if two elements have equal topologies, false otherwise. This is true if the elements connect to nodes of the same id in the same order, and neighbors of the same id on each side, the same id on any parent and/or interior_parent link, etc.

Definition at line 674 of file elem.C.

References libMesh::DofObject::id(), libMesh::Elem::interior_parent(), libMesh::make_range(), libMesh::Elem::n_neighbors(), libMesh::Elem::n_nodes(), libMesh::Elem::neighbor_ptr(), libMesh::Elem::node_id(), libMesh::Elem::parent(), and libMesh::Elem::type().

675 {
676  // If the elements aren't the same type, they aren't equal
677  if (this->type() != rhs.type())
678  return false;
679 
680  libmesh_assert_equal_to(this->n_nodes(), rhs.n_nodes());
681 
682  for (auto n : make_range(this->n_nodes()))
683  if (this->node_id(n) != rhs.node_id(n))
684  return false;
685 
686  for (auto neigh : make_range(this->n_neighbors()))
687  {
688  if (!this->neighbor_ptr(neigh))
689  {
690  if (rhs.neighbor_ptr(neigh))
691  return false;
692  continue;
693  }
694  if (!rhs.neighbor_ptr(neigh) ||
695  this->neighbor_ptr(neigh)->id() !=
696  rhs.neighbor_ptr(neigh)->id())
697  return false;
698  }
699 
700  if (this->parent())
701  {
702  if (!rhs.parent())
703  return false;
704  if (this->parent()->id() != rhs.parent()->id())
705  return false;
706  }
707  else if (rhs.parent())
708  return false;
709 
710  if (this->interior_parent())
711  {
712  if (!rhs.interior_parent())
713  return false;
714  if (this->interior_parent()->id() !=
715  rhs.interior_parent()->id())
716  return false;
717  }
718  else if (rhs.interior_parent())
719  return false;
720 
721  return true;
722 }
const Elem * parent() const
Definition: elem.h:2980
const Elem * interior_parent() const
Definition: elem.C:1057
dof_id_type id() const
Definition: dof_object.h:828
virtual unsigned int n_nodes() const =0
const Elem * neighbor_ptr(unsigned int i) const
Definition: elem.h:2520
unsigned int n_neighbors() const
Definition: elem.h:692
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140
virtual ElemType type() const =0
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:2412

◆ total_family_tree() [1/2]

void libMesh::Elem::total_family_tree ( std::vector< const Elem *> &  family,
bool  reset = true 
) const
inherited

Same as the family_tree() member, but also adds any subactive descendants.

Definition at line 1988 of file elem.C.

References libMesh::ElemInternal::total_family_tree().

Referenced by libMesh::Partitioner::set_parent_processor_ids().

1990 {
1991  ElemInternal::total_family_tree(this, family, reset);
1992 }
void total_family_tree(T elem, std::vector< T > &family, bool reset)
Definition: elem_internal.h:67

◆ total_family_tree() [2/2]

void libMesh::Elem::total_family_tree ( std::vector< Elem *> &  family,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 1996 of file elem.C.

References libMesh::ElemInternal::total_family_tree().

1998 {
1999  ElemInternal::total_family_tree(this, family, reset);
2000 }
void total_family_tree(T elem, std::vector< T > &family, bool reset)
Definition: elem_internal.h:67

◆ total_family_tree_by_neighbor() [1/2]

void libMesh::Elem::total_family_tree_by_neighbor ( std::vector< const Elem *> &  family,
const Elem neighbor,
bool  reset = true 
) const
inherited

Same as the family_tree_by_neighbor() member, but also adds any subactive descendants.

Definition at line 2074 of file elem.C.

References libMesh::ElemInternal::total_family_tree_by_neighbor().

2077 {
2078  ElemInternal::total_family_tree_by_neighbor(this, family, neighbor, reset);
2079 }
void total_family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)

◆ total_family_tree_by_neighbor() [2/2]

void libMesh::Elem::total_family_tree_by_neighbor ( std::vector< Elem *> &  family,
Elem neighbor,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 2083 of file elem.C.

References libMesh::ElemInternal::total_family_tree_by_neighbor().

2086 {
2087  ElemInternal::total_family_tree_by_neighbor(this, family, neighbor, reset);
2088 }
void total_family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)

◆ total_family_tree_by_subneighbor() [1/2]

void libMesh::Elem::total_family_tree_by_subneighbor ( std::vector< const Elem *> &  family,
const Elem neighbor,
const Elem subneighbor,
bool  reset = true 
) const
inherited

Same as the family_tree_by_subneighbor() member, but also adds any subactive descendants.

Definition at line 2112 of file elem.C.

References libMesh::ElemInternal::total_family_tree_by_subneighbor().

2116 {
2117  ElemInternal::total_family_tree_by_subneighbor(this, family, neighbor, subneighbor, reset);
2118 }
void total_family_tree_by_subneighbor(T elem, std::vector< T > &family, T neighbor_in, T subneighbor, bool reset=true)

◆ total_family_tree_by_subneighbor() [2/2]

void libMesh::Elem::total_family_tree_by_subneighbor ( std::vector< Elem *> &  family,
Elem neighbor,
Elem subneighbor,
bool  reset = true 
)
inherited

Non-const version of function above; fills a vector of non-const pointers.

Definition at line 2122 of file elem.C.

References libMesh::ElemInternal::total_family_tree_by_subneighbor().

2126 {
2127  ElemInternal::total_family_tree_by_subneighbor(this, family, neighbor, subneighbor, reset);
2128 }
void total_family_tree_by_subneighbor(T elem, std::vector< T > &family, T neighbor_in, T subneighbor, bool reset=true)

◆ true_centroid()

Point libMesh::Elem::true_centroid ( ) const
virtualinherited
Returns
The "true" geometric centroid of the element, c=(cx, cy, cz), where:

[cx] [ x dV] [cy] := (1/V) * [ y dV] [cz] [ z dV]

This method is virtual since some derived elements might want to use shortcuts to compute their centroid. For most element types, this method is more expensive than calling vertex_average(), so if you only need a point which is located "somewhere" in the interior of the element, consider calling vertex_average() instead.

Reimplemented in libMesh::Tet4, libMesh::Hex8, libMesh::Prism6, libMesh::C0Polygon, libMesh::Pyramid5, libMesh::Tri3, libMesh::Quad4, and libMesh::Edge2.

Definition at line 465 of file elem.C.

References libMesh::Elem::_nodes, libMesh::FEGenericBase< OutputType >::build(), libMesh::Elem::default_order(), libMesh::FEType::default_quadrature_order(), libMesh::Elem::dim(), libMesh::Elem::disconnected_clone(), libMesh::index_range(), libMesh::make_range(), libMesh::FEMap::map_fe_type(), libMesh::Elem::n_nodes(), libMesh::Elem::node_index_range(), libMesh::Elem::p_level(), libMesh::Elem::point(), libMesh::Real, and libMesh::QBase::size().

Referenced by VolumeTest::testHex20PLevelTrueCentroid(), VolumeTest::testPyramid5TrueCentroid(), VolumeTest::testQuad4TrueCentroid(), VolumeTest::testTri3TrueCentroid(), and libMesh::C0Polygon::true_centroid().

466 {
467  // The base class implementation builds a finite element of the correct
468  // order and computes the centroid, c=(cx, cy, cz), where:
469  //
470  // [cx] [\int x dV]
471  // [cy] := (1/V) * [\int y dV]
472  // [cz] [\int z dV]
473  //
474  // using quadrature. Note that we can expand "x" in the FE space as:
475  //
476  // x = \sum_i x_i \phi_i
477  //
478  // where x_i are the nodal positions of the element and \phi_i are the
479  // associated Lagrange shape functions. This allows us to write the
480  // integrals above as e.g.:
481  //
482  // \int x dV = \sum_i x_i \int \phi_i dV
483  //
484  // Defining:
485  //
486  // V_i := \int \phi_i dV
487  //
488  // we then have:
489  //
490  // [cx] [\sum_i x_i V_i]
491  // [cy] = (1/V) * [\sum_i y_i V_i]
492  // [cz] [\sum_i z_i V_i]
493  //
494  // where:
495  // V = \sum_i V_i
496  //
497  // Derived element types can overload this method to compute
498  // the centroid more efficiently when possible.
499 
500  // If this Elem has an elevated p_level, then we need to generate a
501  // barebones copy of it with zero p_level and call true_centroid()
502  // on that instead. This workaround allows us to avoid issues with
503  // calling FE::reinit() with a default_order() FEType, and then
504  // having that order incorrectly boosted by p_level.
505  if (this->p_level())
506  {
507  auto elem_copy = this->disconnected_clone();
508 #ifdef LIBMESH_ENABLE_AMR
509  elem_copy->set_p_level(0);
510 #endif
511 
512  // Set node pointers
513  for (auto n : this->node_index_range())
514  elem_copy->set_node(n) = _nodes[n];
515 
516  return elem_copy->true_centroid();
517  }
518 
519  const FEFamily mapping_family = FEMap::map_fe_type(*this);
520  const FEType fe_type(this->default_order(), mapping_family);
521 
522  // Build FE and attach quadrature rule. The default quadrature rule
523  // integrates the mass matrix exactly, thus it is overkill to
524  // integrate the basis functions, but this is convenient.
525  std::unique_ptr<FEBase> fe = FEBase::build(this->dim(), fe_type);
526  QGauss qrule (this->dim(), fe_type.default_quadrature_order());
527  fe->attach_quadrature_rule(&qrule);
528 
529  // Pre-request required data
530  const auto & JxW = fe->get_JxW();
531  const auto & phi = fe->get_phi();
532 
533  // Re-compute element-specific values
534  fe->reinit(this);
535 
536  // Number of basis functions
537  auto N = phi.size();
538  libmesh_assert_equal_to(N, this->n_nodes());
539 
540  // Compute V_i
541  std::vector<Real> V(N);
542  for (auto qp : index_range(JxW))
543  for (auto i : make_range(N))
544  V[i] += JxW[qp] * phi[i][qp];
545 
546  // Compute centroid
547  Point cp;
548  Real vol = 0.;
549 
550  for (auto i : make_range(N))
551  {
552  cp += this->point(i) * V[i];
553  vol += V[i];
554  }
555 
556  return cp / vol;
557 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
unsigned int p_level() const
Definition: elem.h:3058
virtual unsigned int n_nodes() const =0
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
virtual std::unique_ptr< Elem > disconnected_clone() const
Definition: elem.C:287
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual unsigned short dim() const =0
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140
IntRange< unsigned short > node_index_range() const
Definition: elem.h:2605
FEFamily
defines an enum for finite element families.
virtual Order default_order() const =0
const Point & point(const unsigned int i) const
Definition: elem.h:2390
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:117
static FEFamily map_fe_type(const Elem &elem)
Definition: fe_map.C:46

◆ type()

virtual ElemType libMesh::Hex20::type ( ) const
inlineoverridevirtual
Returns
HEX20.

Implements libMesh::Elem.

Definition at line 91 of file cell_hex20.h.

References libMesh::HEX20.

91 { return HEX20; }

◆ unique_id()

unique_id_type libMesh::DofObject::unique_id ( ) const
inlineinherited
Returns
The globally unique_id for this DofObject

Definition at line 844 of file dof_object.h.

References libMesh::DofObject::_unique_id, libMesh::DofObject::invalid_unique_id, libMesh::libmesh_assert(), and libMesh::DofObject::valid_unique_id().

Referenced by libMesh::ReplicatedMesh::add_elem(), libMesh::DistributedMesh::add_elem(), libMesh::ReplicatedMesh::add_node(), libMesh::DistributedMesh::add_node(), libMesh::ReplicatedMesh::add_point(), libMesh::MeshTools::Modification::all_tri(), libMesh::Elem::disconnected_clone(), libMesh::MeshTools::Modification::flatten(), libMesh::Elem::get_info(), libMesh::ReplicatedMesh::insert_elem(), libMesh::DistributedMesh::insert_elem(), libMesh::ReplicatedMesh::insert_node(), libMesh::XdrIO::pack_element(), libMesh::ExodusII_IO::read_elemental_variable(), SlitMeshRefinedSystemTest::testRestart(), and libMesh::XdrIO::write_serialized_nodes().

845 {
846 #ifdef LIBMESH_ENABLE_UNIQUE_ID
848  return _unique_id;
849 #else
850  return invalid_unique_id;
851 #endif
852 }
unique_id_type _unique_id
A globally unique id, guaranteed not to change as the mesh is repartitioned or adapted.
Definition: dof_object.h:577
static const unique_id_type invalid_unique_id
An invalid unique_id to distinguish an uninitialized DofObject.
Definition: dof_object.h:487
libmesh_assert(ctx)
bool valid_unique_id() const
Definition: dof_object.h:893

◆ unpack_indexing()

void libMesh::DofObject::unpack_indexing ( std::vector< largest_id_type >::const_iterator  begin)
inherited

A method for creating our index buffer from packed data - basically with our current implementation we investigate the size term and then copy.

Definition at line 595 of file dof_object.C.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::clear_old_dof_object(), libMesh::DofObject::construct(), libMesh::libmesh_assert(), and libMesh::DofObject::old_dof_object.

596 {
597  _idx_buf.clear();
598 
599 #ifdef LIBMESH_ENABLE_AMR
600  this->clear_old_dof_object();
601  const bool has_old_dof_object = cast_int<bool>(*begin++);
602 #endif
603 
604  const largest_id_type size = *begin++;
605  _idx_buf.reserve(size);
606  std::copy(begin, begin+size, back_inserter(_idx_buf));
607 
608  // Check as best we can for internal consistency now
609  libmesh_assert(_idx_buf.empty() ||
610  (std::abs(dof_id_signed_type(_idx_buf[0])) <=
611  cast_int<dof_id_signed_type>(_idx_buf.size())));
612 #ifdef DEBUG
613  if (!_idx_buf.empty())
614  {
615  const int hdr = cast_int<int>(dof_id_signed_type(_idx_buf[0]));
616  const unsigned int ns = hdr >= 0 ? hdr : (-hdr-1);
617  for (unsigned int i=1; i < ns; ++i)
618  {
619  if (hdr > 0 || i > 1)
620  libmesh_assert_greater_equal (_idx_buf[i], _idx_buf[i-1]);
621  else
622  libmesh_assert_greater_equal (_idx_buf[i], ns);
623  libmesh_assert_equal_to ((_idx_buf[i] - _idx_buf[i-1])%2, 0);
624  libmesh_assert_less_equal (_idx_buf[i], _idx_buf.size());
625  }
626  if (hdr < 0 && ns > 0)
627  libmesh_assert_less_equal(_idx_buf[ns], _idx_buf.size());
628  }
629 #endif
630 
631 #ifdef LIBMESH_ENABLE_AMR
632  if (has_old_dof_object)
633  {
634  this->old_dof_object = this->construct();
635  this->old_dof_object->unpack_indexing(begin+size);
636  }
637 #endif
638 }
std::unique_ptr< DofObject > construct(const DofObject *other=nullptr)
Convenient factory function that calls either the (deep) copy constructor or the default constructor ...
Definition: dof_object.h:741
uint64_t largest_id_type
Definition: id_types.h:148
void clear_old_dof_object()
Sets the old_dof_object to nullptr.
Definition: dof_object.C:128
libmesh_assert(ctx)
int8_t dof_id_signed_type
Definition: id_types.h:68
std::unique_ptr< DofObject > old_dof_object
This object on the last mesh.
Definition: dof_object.h:88
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ unpackable_indexing_size()

unsigned int libMesh::DofObject::unpackable_indexing_size ( std::vector< largest_id_type >::const_iterator  begin)
staticinherited

If we have indices packed into an buffer for communications, how much of that buffer applies to this dof object?

Definition at line 575 of file dof_object.C.

576 {
577 #ifdef LIBMESH_ENABLE_AMR
578  const bool has_old_dof_object = cast_int<bool>(*begin++);
579 
580  static const int dof_header_size = 2;
581 #else
582  static const bool has_old_dof_object = false;
583  static const int dof_header_size = 1;
584 #endif
585 
586  const largest_id_type this_indexing_size = *begin++;
587 
588  return cast_int<unsigned int>
589  (dof_header_size + this_indexing_size +
590  (has_old_dof_object ?
591  unpackable_indexing_size(begin+this_indexing_size) : 0));
592 }
static unsigned int unpackable_indexing_size(std::vector< largest_id_type >::const_iterator begin)
If we have indices packed into an buffer for communications, how much of that buffer applies to this ...
Definition: dof_object.C:575
uint64_t largest_id_type
Definition: id_types.h:148

◆ valid_id()

bool libMesh::DofObject::valid_id ( ) const
inlineinherited

◆ valid_processor_id()

bool libMesh::DofObject::valid_processor_id ( ) const
inlineinherited
Returns
true if this DofObject has a valid id set, false otherwise.

Definition at line 929 of file dof_object.h.

References libMesh::DofObject::_processor_id, and libMesh::DofObject::invalid_processor_id.

Referenced by DofObjectTest< Node >::testInvalidateProcId(), and DofObjectTest< Node >::testValidProcId().

930 {
932 }
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:493
processor_id_type _processor_id
The processor_id of the DofObject.
Definition: dof_object.h:594

◆ valid_unique_id()

bool libMesh::DofObject::valid_unique_id ( ) const
inlineinherited
Returns
true if this DofObject has a valid unique_id set, false otherwise.

Definition at line 893 of file dof_object.h.

References libMesh::DofObject::_unique_id, and libMesh::DofObject::invalid_unique_id.

Referenced by libMesh::ReplicatedMesh::add_elem(), libMesh::DistributedMesh::add_elem(), libMesh::ReplicatedMesh::add_node(), libMesh::DistributedMesh::add_node(), libMesh::ReplicatedMesh::add_point(), libMesh::Elem::get_info(), libMesh::ReplicatedMesh::insert_elem(), libMesh::DistributedMesh::insert_elem(), libMesh::ReplicatedMesh::insert_node(), and libMesh::DofObject::unique_id().

894 {
895 #ifdef LIBMESH_ENABLE_UNIQUE_ID
897 #else
898  return false;
899 #endif
900 }
unique_id_type _unique_id
A globally unique id, guaranteed not to change as the mesh is repartitioned or adapted.
Definition: dof_object.h:577
static const unique_id_type invalid_unique_id
An invalid unique_id to distinguish an uninitialized DofObject.
Definition: dof_object.h:487

◆ var_to_vg_and_offset()

std::pair< unsigned int, unsigned int > libMesh::DofObject::var_to_vg_and_offset ( const unsigned int  s,
const unsigned int  var 
) const
inlineinherited
Returns
A pair consisting of the variable group number and the offset index from the start of that group for variable var on system s associated with this DofObject

Definition at line 1200 of file dof_object.h.

References libMesh::DofObject::n_var_groups(), and libMesh::DofObject::n_vars().

Referenced by libMesh::DofMap::_dof_indices(), libMesh::DofMap::_node_dof_indices(), libMesh::DofObject::dof_number(), libMesh::OldSolutionCoefs< Output, point_output >::eval_old_dofs(), and libMesh::OldSolutionValue< Output, point_output >::eval_old_dofs().

1202 {
1203  std::pair<unsigned int, unsigned int> returnval(0,0);
1204 
1205  unsigned int & vg = returnval.first;
1206  unsigned int & offset = returnval.second;
1207 
1208  unsigned int vg_start = 0;
1209  for (; ; vg++)
1210  {
1211  libmesh_assert_less(vg, this->n_var_groups(s));
1212 
1213  const unsigned int vg_end = vg_start + this->n_vars(s,vg);
1214  if (var < vg_end)
1215  {
1216  offset = var - vg_start;
1217  return returnval;
1218  }
1219  vg_start = vg_end;
1220  }
1221 }
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
Definition: dof_object.h:967

◆ vertex_average()

Point libMesh::Elem::vertex_average ( ) const
inherited
Returns
A Point at the average of the elment's vertices.
Note
This used to be the base class centroid() implementation, but the centroid is only equal to the vertex average in some special cases. The centroid() implementation now returns the "true" centroid of the element (up to quadrature error).

Definition at line 559 of file elem.C.

References libMesh::TypeVector< T >::add(), and libMesh::Elem::n_vertices().

Referenced by libMesh::Elem::centroid(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::BoundaryInfo::get_side_and_node_maps(), libMesh::Poly2TriTriangulator::insert_refinement_points(), A0::interior_assembly(), A1::interior_assembly(), OutputAssembly::interior_assembly(), SlitFunc::operator()(), libMesh::LocationMap< T >::point_of(), libMesh::RBParametrizedFunction::preevaluate_parametrized_function_on_mesh(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::C0Polygon::retriangulate(), libMesh::FE< Dim, LAGRANGE_VEC >::shape_deriv(), libMesh::FE< Dim, LAGRANGE_VEC >::shape_second_deriv(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), libMesh::Tri3::true_centroid(), and libMesh::Tet4::true_centroid().

560 {
561  Point cp;
562 
563  const auto n_vertices = this->n_vertices();
564 
565  for (unsigned int n=0; n<n_vertices; n++)
566  cp.add (this->point(n));
567 
568  return (cp /= static_cast<Real>(n_vertices));
569 }
virtual unsigned int n_vertices() const =0

◆ vg_dof_base()

dof_id_type libMesh::DofObject::vg_dof_base ( const unsigned int  s,
const unsigned int  vg 
) const
inlineinherited

VariableGroup DoF indices are indexed as id = base + var_in_vg*ncomp + comp This method allows for direct access to the base.

Definition at line 1317 of file dof_object.h.

References libMesh::DofObject::_idx_buf, libMesh::DofObject::n_systems(), libMesh::DofObject::n_var_groups(), and libMesh::DofObject::start_idx().

Referenced by libMesh::DofMap::distribute_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::DofMap::reinit(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::DofObject::set_vg_dof_base(), and DofObjectTest< Node >::testManualDofCalculation().

1319 {
1320  libmesh_assert_less (s, this->n_systems());
1321  libmesh_assert_less (vg, this->n_var_groups(s));
1322 
1323  const unsigned int
1324  start_idx_sys = this->start_idx(s);
1325 
1326  libmesh_assert_less ((start_idx_sys + 2*vg + 1), _idx_buf.size());
1327 
1328  // #ifdef DEBUG
1329  // std::cout << " [ ";
1330  // for (auto i : _idx_buf)
1331  // std::cout << i << " ";
1332  // std::cout << "]\n";
1333  // #endif
1334 
1335  return _idx_buf[start_idx_sys + 2*vg + 1];
1336 }
unsigned int n_var_groups(const unsigned int s) const
Definition: dof_object.h:957
unsigned int n_systems() const
Definition: dof_object.h:937
unsigned int start_idx(const unsigned int s) const
The starting index for system s.
Definition: dof_object.h:1249
index_buffer_t _idx_buf
Definition: dof_object.h:680

◆ volume()

Real libMesh::Hex20::volume ( ) const
overridevirtual

A specialization for computing the volume of a Hex20.

Reimplemented from libMesh::Elem.

Definition at line 324 of file cell_hex20.C.

References libMesh::LAGRANGE_MAP, libMesh::Elem::mapping_type(), libMesh::Elem::point(), libMesh::Real, libMesh::triple_product(), and libMesh::Elem::volume().

325 {
326  // This specialization is good for Lagrange mappings only
327  if (this->mapping_type() != LAGRANGE_MAP)
328  return this->Elem::volume();
329 
330  // Make copies of our points. It makes the subsequent calculations a bit
331  // shorter and avoids dereferencing the same pointer multiple times.
332  Point
333  x0 = point(0), x1 = point(1), x2 = point(2), x3 = point(3), x4 = point(4),
334  x5 = point(5), x6 = point(6), x7 = point(7), x8 = point(8), x9 = point(9),
335  x10 = point(10), x11 = point(11), x12 = point(12), x13 = point(13), x14 = point(14),
336  x15 = point(15), x16 = point(16), x17 = point(17), x18 = point(18), x19 = point(19);
337 
338  // The constant components of the dx/dxi vector,
339  // dx/dxi = \vec{a000} + \vec{a001}*zeta + \vec{a002}*zeta^2 + ...
340  // These were copied directly from the output of a Python script.
341  // There are at most 17 terms with total degree <=3, but only 12
342  // of them are non-zero for each direction.
343  Point dx_dxi[17] =
344  {
345  x0/8 - x1/8 - x11/4 - x12/4 + x13/4 + x14/4 - x15/4 + x17/4 - x19/4 - x2/8 + x3/8 + x4/8 - x5/8 - x6/8 + x7/8 + x9/4,
346  x11/4 + x17/4 - x19/4 - x9/4,
347  -x0/8 + x1/8 + x12/4 - x13/4 - x14/4 + x15/4 + x2/8 - x3/8 - x4/8 + x5/8 + x6/8 - x7/8,
348  x12/4 - x13/4 + x14/4 - x15/4,
349  -x0/8 + x1/8 - x2/8 + x3/8 + x4/8 - x5/8 + x6/8 - x7/8,
350  x0/8 - x1/8 - x12/4 + x13/4 - x14/4 + x15/4 + x2/8 - x3/8 + x4/8 - x5/8 + x6/8 - x7/8,
351  -x0/8 + x1/8 + x11/4 - x17/4 + x19/4 + x2/8 - x3/8 - x4/8 + x5/8 + x6/8 - x7/8 - x9/4,
352  x0/8 - x1/8 - x11/4 - x17/4 + x19/4 - x2/8 + x3/8 - x4/8 + x5/8 + x6/8 - x7/8 + x9/4,
353  x0/4 + x1/4 - x10/2 - x16/2 - x18/2 + x2/4 + x3/4 + x4/4 + x5/4 + x6/4 + x7/4 - x8/2,
354  -x0/4 - x1/4 + x10/2 - x16/2 - x18/2 - x2/4 - x3/4 + x4/4 + x5/4 + x6/4 + x7/4 + x8/2,
355  Point(0,0,0),
356  -x0/4 - x1/4 - x10/2 + x16/2 - x18/2 + x2/4 + x3/4 - x4/4 - x5/4 + x6/4 + x7/4 + x8/2,
357  x0/4 + x1/4 + x10/2 + x16/2 - x18/2 - x2/4 - x3/4 - x4/4 - x5/4 + x6/4 + x7/4 - x8/2,
358  Point(0,0,0),
359  Point(0,0,0),
360  Point(0,0,0),
361  Point(0,0,0)
362  };
363 
364  // The constant components of the dx/deta vector. These were copied
365  // directly from the output of a Python script. There are at most
366  // 17 terms with total degree <=3, but only 12 of them are non-zero
367  // for each direction.
368  Point dx_deta[17] =
369  {
370  x0/8 + x1/8 + x10/4 - x12/4 - x13/4 + x14/4 + x15/4 - x16/4 + x18/4 - x2/8 - x3/8 + x4/8 + x5/8 - x6/8 - x7/8 - x8/4,
371  -x10/4 - x16/4 + x18/4 + x8/4,
372  -x0/8 - x1/8 + x12/4 + x13/4 - x14/4 - x15/4 + x2/8 + x3/8 - x4/8 - x5/8 + x6/8 + x7/8,
373  x0/4 + x1/4 - x11/2 - x17/2 - x19/2 + x2/4 + x3/4 + x4/4 + x5/4 + x6/4 + x7/4 - x9/2,
374  -x0/4 - x1/4 + x11/2 - x17/2 - x19/2 - x2/4 - x3/4 + x4/4 + x5/4 + x6/4 + x7/4 + x9/2,
375  Point(0,0,0),
376  Point(0,0,0),
377  Point(0,0,0),
378  x12/4 - x13/4 + x14/4 - x15/4,
379  -x0/8 + x1/8 - x2/8 + x3/8 + x4/8 - x5/8 + x6/8 - x7/8,
380  x0/8 - x1/8 - x12/4 + x13/4 - x14/4 + x15/4 + x2/8 - x3/8 + x4/8 - x5/8 + x6/8 - x7/8,
381  -x0/4 + x1/4 + x11/2 - x17/2 + x19/2 + x2/4 - x3/4 - x4/4 + x5/4 + x6/4 - x7/4 - x9/2,
382  x0/4 - x1/4 - x11/2 - x17/2 + x19/2 - x2/4 + x3/4 - x4/4 + x5/4 + x6/4 - x7/4 + x9/2,
383  Point(0,0,0),
384  -x0/8 - x1/8 - x10/4 + x16/4 - x18/4 + x2/8 + x3/8 - x4/8 - x5/8 + x6/8 + x7/8 + x8/4,
385  x0/8 + x1/8 + x10/4 + x16/4 - x18/4 - x2/8 - x3/8 - x4/8 - x5/8 + x6/8 + x7/8 - x8/4,
386  Point(0,0,0)
387  };
388 
389  // The constant components of the dx/dzeta vector. These were copied
390  // directly from the output of a Python script. There are at most
391  // 17 terms with total degree <=3, but only 12 of them are non-zero
392  // for each direction.
393  Point dx_dzeta[17] =
394  {
395  x0/8 + x1/8 - x10/4 - x11/4 + x16/4 + x17/4 + x18/4 + x19/4 + x2/8 + x3/8 - x4/8 - x5/8 - x6/8 - x7/8 - x8/4 - x9/4,
396  x0/4 + x1/4 - x12/2 - x13/2 - x14/2 - x15/2 + x2/4 + x3/4 + x4/4 + x5/4 + x6/4 + x7/4,
397  Point(0,0,0),
398  -x10/4 - x16/4 + x18/4 + x8/4,
399  -x0/4 - x1/4 + x12/2 + x13/2 - x14/2 - x15/2 + x2/4 + x3/4 - x4/4 - x5/4 + x6/4 + x7/4,
400  Point(0,0,0),
401  -x0/8 - x1/8 + x11/4 - x17/4 - x19/4 - x2/8 - x3/8 + x4/8 + x5/8 + x6/8 + x7/8 + x9/4,
402  Point(0,0,0),
403  x11/4 + x17/4 - x19/4 - x9/4,
404  -x0/4 + x1/4 + x12/2 - x13/2 - x14/2 + x15/2 + x2/4 - x3/4 - x4/4 + x5/4 + x6/4 - x7/4,
405  Point(0,0,0),
406  -x0/8 + x1/8 - x2/8 + x3/8 + x4/8 - x5/8 + x6/8 - x7/8,
407  x0/4 - x1/4 - x12/2 + x13/2 - x14/2 + x15/2 + x2/4 - x3/4 + x4/4 - x5/4 + x6/4 - x7/4,
408  x0/8 - x1/8 - x11/4 - x17/4 + x19/4 - x2/8 + x3/8 - x4/8 + x5/8 + x6/8 - x7/8 + x9/4,
409  -x0/8 - x1/8 + x10/4 - x16/4 - x18/4 - x2/8 - x3/8 + x4/8 + x5/8 + x6/8 + x7/8 + x8/4,
410  Point(0,0,0),
411  x0/8 + x1/8 + x10/4 + x16/4 - x18/4 - x2/8 - x3/8 - x4/8 - x5/8 + x6/8 + x7/8 - x8/4,
412  };
413 
414  // The integer exponents for each term.
415  static const int exponents[17][3] =
416  {
417  {0, 0, 0},
418  {0, 0, 1},
419  {0, 0, 2},
420  {0, 1, 0},
421  {0, 1, 1},
422  {0, 1, 2},
423  {0, 2, 0},
424  {0, 2, 1},
425  {1, 0, 0},
426  {1, 0, 1},
427  {1, 0, 2},
428  {1, 1, 0},
429  {1, 1, 1},
430  {1, 2, 0},
431  {2, 0, 0},
432  {2, 0, 1},
433  {2, 1, 0}
434  };
435 
436 
437  // 3x3 quadrature, exact for bi-quintics
438  const int N = 3;
439  const Real w[N] = {5./9, 8./9, 5./9};
440 
441  // Quadrature point locations raised to powers. q[0][2] is
442  // quadrature point 0, squared, q[1][1] is quadrature point 1 to the
443  // first power, etc.
444  const Real q[N][N] =
445  {
446  //^0 ^1 ^2
447  { 1., -std::sqrt(15)/5., 15./25},
448  { 1., 0., 0.},
449  { 1., std::sqrt(15)/5., 15./25}
450  };
451 
452 
453  Real vol = 0.;
454  for (int i=0; i<N; ++i)
455  for (int j=0; j<N; ++j)
456  for (int k=0; k<N; ++k)
457  {
458  // Compute dx_dxi, dx_deta, dx_dzeta at the current quadrature point.
459  Point dx_dxi_q, dx_deta_q, dx_dzeta_q;
460  for (int c=0; c<17; ++c)
461  {
462  Real coeff =
463  q[i][exponents[c][0]] *
464  q[j][exponents[c][1]] *
465  q[k][exponents[c][2]];
466 
467  dx_dxi_q += coeff * dx_dxi[c];
468  dx_deta_q += coeff * dx_deta[c];
469  dx_dzeta_q += coeff * dx_dzeta[c];
470  }
471 
472  // Compute scalar triple product, multiply by weight, and accumulate volume.
473  vol += w[i] * w[j] * w[k] * triple_product(dx_dxi_q, dx_deta_q, dx_dzeta_q);
474  }
475 
476  return vol;
477 }
T triple_product(const TypeVector< T > &a, const TypeVector< T > &b, const TypeVector< T > &c)
Definition: type_vector.h:1029
ElemMappingType mapping_type() const
Definition: elem.h:3070
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual Real volume() const
Definition: elem.C:3300
const Point & point(const unsigned int i) const
Definition: elem.h:2390

◆ which_child_am_i()

unsigned int libMesh::Elem::which_child_am_i ( const Elem e) const
inlineinherited
Returns
The child index which e corresponds to.

I.e. if c = a->which_child_am_i(e); then a->child_ptr(c) will be e.

Definition at line 3142 of file elem.h.

References libMesh::Elem::child_ptr(), libMesh::Elem::has_children(), libMesh::invalid_uint, libMesh::libmesh_assert(), and libMesh::Elem::n_children().

Referenced by libMesh::BoundaryInfo::boundary_ids(), libMesh::BoundaryInfo::edge_boundary_ids(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::Elem::make_links_to_me_remote(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::ProjectVertices::operator()(), libMesh::BoundaryInfo::side_with_boundary_id(), libMesh::BoundaryInfo::sides_with_boundary_id(), libMesh::MeshTools::Modification::smooth(), and libMesh::Parallel::sync_element_data_by_parent_id().

3143 {
3144  libmesh_assert(e);
3145  libmesh_assert (this->has_children());
3146 
3147  unsigned int nc = this->n_children();
3148  for (unsigned int c=0; c != nc; c++)
3149  if (this->child_ptr(c) == e)
3150  return c;
3151 
3152  libmesh_error_msg("ERROR: which_child_am_i() was called with a non-child!");
3153 
3154  return libMesh::invalid_uint;
3155 }
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:293
virtual unsigned int n_children() const =0
libmesh_assert(ctx)
bool has_children() const
Definition: elem.h:2929
const Elem * child_ptr(unsigned int i) const
Definition: elem.h:3113

◆ which_neighbor_am_i()

unsigned int libMesh::Elem::which_neighbor_am_i ( const Elem e) const
inlineinherited

This function tells you which neighbor e is.

I.e. if s = a->which_neighbor_am_i(e); then a->neighbor(s) will be an ancestor of e.

Definition at line 2869 of file elem.h.

References libMesh::invalid_uint, libMesh::Elem::level(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::Elem::n_sides(), libMesh::Elem::neighbor_ptr(), and libMesh::Elem::parent().

Referenced by assemble_ellipticdg(), libMesh::EquationSystems::build_discontinuous_solution_vector(), libMesh::BoundaryInfo::clear_stitched_boundary_side_ids(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints(), libMesh::MeshTools::find_hanging_nodes_and_parents(), libMesh::Poly2TriTriangulator::insert_refinement_points(), libMesh::Elem::libmesh_assert_valid_neighbors(), libMesh::Elem::nullify_neighbors(), and MeshBaseTest::testMeshBaseVerifyIsPrepared().

2870 {
2871  libmesh_assert(e);
2872 
2873  const Elem * eparent = e;
2874 
2875  while (eparent->level() > this->level())
2876  {
2877  eparent = eparent->parent();
2878  libmesh_assert(eparent);
2879  }
2880 
2881  for (auto s : make_range(this->n_sides()))
2882  if (this->neighbor_ptr(s) == eparent)
2883  return s;
2884 
2885  return libMesh::invalid_uint;
2886 }
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:293
libmesh_assert(ctx)
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
Constructor.
Definition: elem.h:2328
virtual unsigned int n_sides() const =0
const Elem * neighbor_ptr(unsigned int i) const
Definition: elem.h:2520
unsigned int level() const
Definition: elem.h:3024
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140

◆ which_node_am_i()

unsigned int libMesh::Elem::which_node_am_i ( unsigned int  side,
unsigned int  side_node 
) const
inherited

This function is deprecated, call local_side_node(side, side_node) instead.

Definition at line 795 of file elem.C.

References libMesh::Elem::local_side_node().

797 {
798  libmesh_deprecated();
799  return local_side_node(side, side_node);
800 }
virtual unsigned int local_side_node(unsigned int side, unsigned int side_node) const =0

◆ which_side_am_i()

unsigned int libMesh::Elem::which_side_am_i ( const Elem e) const
inherited

This function tells you which side the boundary element e is.

I.e. if e = a->build_side_ptr(s) or e = a->side_ptr(s); then a->which_side_am_i(e) will be s.

Note
An exact floating point comparison of the nodal positions of e is made with the nodal positions of this in order to perform this test. The idea is that the test will return a valid side id if e either directly shares Node pointers with this, or was created by exactly copying some of the nodes of this (e.g. through BoundaryMesh::sync()). In these circumstances, non-fuzzy floating point equality is expected.
Returns
The side of this the element which e is, otherwise invalid_uint.

Definition at line 741 of file elem.C.

References libMesh::invalid_uint, libMesh::Elem::is_node_on_side(), libMesh::libmesh_assert(), libMesh::Elem::n_nodes(), libMesh::Elem::n_sides(), and libMesh::Elem::point().

742 {
743  libmesh_assert(e);
744 
745  const unsigned int ns = this->n_sides();
746  const unsigned int nn = this->n_nodes();
747 
748  const unsigned int en = e->n_nodes();
749 
750  // e might be on any side until proven otherwise
751  std::vector<bool> might_be_side(ns, true);
752 
753  for (unsigned int i=0; i != en; ++i)
754  {
755  Point side_point = e->point(i);
756  unsigned int local_node_id = libMesh::invalid_uint;
757 
758  // Look for a node of this that's contiguous with node i of
759  // e. Note that the exact floating point comparison of Point
760  // positions is intentional, see the class documentation for
761  // this function.
762  for (unsigned int j=0; j != nn; ++j)
763  if (this->point(j) == side_point)
764  local_node_id = j;
765 
766  // If a node of e isn't contiguous with some node of this, then
767  // e isn't a side of this.
768  if (local_node_id == libMesh::invalid_uint)
769  return libMesh::invalid_uint;
770 
771  // If a node of e isn't contiguous with some node on side s of
772  // this, then e isn't on side s.
773  for (unsigned int s=0; s != ns; ++s)
774  if (!this->is_node_on_side(local_node_id, s))
775  might_be_side[s] = false;
776  }
777 
778  for (unsigned int s=0; s != ns; ++s)
779  if (might_be_side[s])
780  {
781 #ifdef DEBUG
782  for (unsigned int s2=s+1; s2 < ns; ++s2)
783  libmesh_assert (!might_be_side[s2]);
784 #endif
785  return s;
786  }
787 
788  // Didn't find any matching side
789  return libMesh::invalid_uint;
790 }
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:293
virtual bool is_node_on_side(const unsigned int n, const unsigned int s) const =0
virtual unsigned int n_nodes() const =0
libmesh_assert(ctx)
virtual unsigned int n_sides() const =0
const Point & point(const unsigned int i) const
Definition: elem.h:2390

◆ write_connectivity()

void libMesh::Elem::write_connectivity ( std::ostream &  out,
const IOPackage  iop 
) const
inherited

Writes the element connectivity for various IO packages to the passed ostream "out".

Not virtual, since it is implemented in the base class.

Definition at line 1602 of file elem.C.

References libMesh::Elem::_nodes, libMesh::Elem::connectivity(), libMesh::INVALID_IO_PACKAGE, libMesh::libmesh_assert(), libMesh::make_range(), libMesh::Elem::n_sub_elem(), libMesh::Elem::node_id(), libMesh::Elem::node_index_range(), libMesh::TECPLOT, and libMesh::UCD.

1604 {
1605  libmesh_assert (out_stream.good());
1607  libmesh_assert_not_equal_to (iop, INVALID_IO_PACKAGE);
1608 
1609  switch (iop)
1610  {
1611  case TECPLOT:
1612  {
1613  // This connectivity vector will be used repeatedly instead
1614  // of being reconstructed inside the loop.
1615  std::vector<dof_id_type> conn;
1616  for (auto sc : make_range(this->n_sub_elem()))
1617  {
1618  this->connectivity(sc, TECPLOT, conn);
1619 
1620  std::copy(conn.begin(),
1621  conn.end(),
1622  std::ostream_iterator<dof_id_type>(out_stream, " "));
1623 
1624  out_stream << '\n';
1625  }
1626  return;
1627  }
1628 
1629  case UCD:
1630  {
1631  for (auto i : this->node_index_range())
1632  out_stream << this->node_id(i)+1 << "\t";
1633 
1634  out_stream << '\n';
1635  return;
1636  }
1637 
1638  default:
1639  libmesh_error_msg("Unsupported IO package " << iop);
1640  }
1641 }
Node ** _nodes
Pointers to the nodes we are connected to.
Definition: elem.h:2195
libmesh_assert(ctx)
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:140
virtual void connectivity(const unsigned int sc, const IOPackage iop, std::vector< dof_id_type > &conn) const =0
IntRange< unsigned short > node_index_range() const
Definition: elem.h:2605
virtual unsigned int n_sub_elem() const =0
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:2412

Member Data Documentation

◆ _child_node_lookup

const int libMesh::Hex::_child_node_lookup
staticprotectedinherited

Lookup table from child id, child node id to "possible node location" (a simple dictionary-index in a 5x5x5 grid)

Definition at line 236 of file cell_hex.h.

◆ _children

std::unique_ptr<Elem *[]> libMesh::Elem::_children
protectedinherited

unique_ptr to array of this element's children.

A Mesh ultimately owns the child Elems so we are not responsible for deleting them, but we are responsible for cleaning up the array allocated to hold those Elems, hence the unique_ptr.

Definition at line 2211 of file elem.h.

Referenced by libMesh::Elem::add_child(), libMesh::Elem::child_ptr(), libMesh::Elem::child_ref_range(), libMesh::Elem::contract(), libMesh::Elem::has_ancestor_children(), libMesh::Elem::has_children(), libMesh::Elem::raw_child_ptr(), libMesh::Elem::refine(), and libMesh::Elem::set_child().

◆ _counts [1/2]

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::get_info().

◆ _counts [2/2]

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::get_info().

◆ _elemlinks

Elem** libMesh::Elem::_elemlinks
protectedinherited

◆ _elemlinks_data

Elem* libMesh::Hex::_elemlinks_data[7+(LIBMESH_DIM >3)]
protectedinherited

Data for links to parent/neighbor/interior_parent elements.

Definition at line 206 of file cell_hex.h.

◆ _embedding_matrix

const Real libMesh::Hex20::_embedding_matrix
staticprotected

Matrix that computes new nodal locations/solution values from current nodes/solution.

Definition at line 263 of file cell_hex20.h.

Referenced by embedding_matrix().

◆ _enable_print_counter [1/2]

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _enable_print_counter [2/2]

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _map_data

unsigned char libMesh::Elem::_map_data
protectedinherited

Mapping function data; currently used when needed to store the RATIONAL_BERNSTEIN nodal weight data index.

Definition at line 2253 of file elem.h.

Referenced by libMesh::Elem::Elem(), libMesh::Elem::mapping_data(), libMesh::Polygon::Polygon(), and libMesh::Elem::set_mapping_data().

◆ _map_type

unsigned char libMesh::Elem::_map_type
protectedinherited

Mapping function type; currently either 0 (LAGRANGE) or 1 (RATIONAL_BERNSTEIN).

Definition at line 2247 of file elem.h.

Referenced by libMesh::Elem::Elem(), libMesh::Elem::mapping_type(), libMesh::Polygon::Polygon(), and libMesh::Elem::set_mapping_type().

◆ _master_points

const Real libMesh::Hex::_master_points
staticprotectedinherited
Initial value:
=
{
{-1, -1, -1},
{1, -1, -1},
{1, 1, -1},
{-1, 1, -1},
{-1, -1, 1},
{1, -1, 1},
{1, 1, 1},
{-1, 1, 1},
{0, -1, -1},
{1, 0, -1},
{0, 1, -1},
{-1, 0, -1},
{-1, -1, 0},
{1, -1, 0},
{1, 1, 0},
{-1, 1, 0},
{0, -1, 1},
{1, 0, 1},
{0, 1, 1},
{-1, 0, 1},
{0, 0, -1},
{0, -1, 0},
{1, 0, 0},
{0, 1, 0},
{-1, 0, 0},
{0, 0, 1}
}

Master element node locations.

Definition at line 230 of file cell_hex.h.

Referenced by libMesh::Hex::master_point().

◆ _mutex [1/2]

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _mutex [2/2]

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _n_objects [1/2]

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 132 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _n_objects [2/2]

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 132 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _nodelinks_data

Node* libMesh::Hex20::_nodelinks_data[num_nodes]
protected

Data for links to nodes.

Definition at line 245 of file cell_hex20.h.

◆ _nodes

Node** libMesh::Elem::_nodes
protectedinherited

◆ _p_level

unsigned char libMesh::Elem::_p_level
protectedinherited

p refinement level - the difference between the polynomial degree on this element and the minimum polynomial degree on the mesh.

This is stored as an unsigned char to save space. In theory, these last four bytes might have been padding anyway.

Definition at line 2240 of file elem.h.

Referenced by libMesh::Elem::hack_p_level(), libMesh::Elem::max_descendant_p_level(), libMesh::Elem::p_level(), and libMesh::Elem::set_p_level().

◆ _pflag

unsigned char libMesh::Elem::_pflag
protectedinherited

p refinement flag.

This is stored as an unsigned char to save space.

Definition at line 2230 of file elem.h.

Referenced by libMesh::Elem::hack_p_level_and_refinement_flag(), libMesh::Elem::p_refinement_flag(), and libMesh::Elem::set_p_refinement_flag().

◆ _rflag

unsigned char libMesh::Elem::_rflag
protectedinherited

h refinement flag.

This is stored as an unsigned char to save space.

Definition at line 2224 of file elem.h.

Referenced by libMesh::Elem::refinement_flag(), and libMesh::Elem::set_refinement_flag().

◆ _sbd_id

subdomain_id_type libMesh::Elem::_sbd_id
protectedinherited

The subdomain to which this element belongs.

Definition at line 2217 of file elem.h.

Referenced by libMesh::Elem::subdomain_id().

◆ _second_order_adjacent_vertices

const unsigned short int libMesh::Hex::_second_order_adjacent_vertices
staticprotectedinherited
Initial value:
=
{
{ 0, 1},
{ 1, 2},
{ 2, 3},
{ 0, 3},
{ 0, 4},
{ 1, 5},
{ 2, 6},
{ 3, 7},
{ 4, 5},
{ 5, 6},
{ 6, 7},
{ 4, 7}
}

Matrix that tells which vertices define the location of mid-side (or second-order) nodes.

This matrix is kept here, since the matrix (for the first 12 higher-order nodes) is identical for Hex20 and Hex27.

Definition at line 215 of file cell_hex.h.

Referenced by second_order_adjacent_vertex(), and libMesh::Hex27::second_order_adjacent_vertex().

◆ _second_order_vertex_child_index

const unsigned short int libMesh::Hex::_second_order_vertex_child_index
staticprotectedinherited
Initial value:
=
{
99,99,99,99,99,99,99,99,
1,2,3,3,4,5,6,7,5,6,7,7,
2,5,6,7,7,6,
6
}

Vector that names the child vertex index for each second order node.

Definition at line 225 of file cell_hex.h.

Referenced by second_order_child_vertex(), and libMesh::Hex27::second_order_child_vertex().

◆ _second_order_vertex_child_number

const unsigned short int libMesh::Hex::_second_order_vertex_child_number
staticprotectedinherited
Initial value:
=
{
99,99,99,99,99,99,99,99,
0,1,2,0,0,1,2,3,4,5,6,5,
0,0,1,2,0,4,
0
}

Vector that names a child sharing each second order node.

Definition at line 220 of file cell_hex.h.

Referenced by second_order_child_vertex(), and libMesh::Hex27::second_order_child_vertex().

◆ adjacent_edges_map

const unsigned int libMesh::Hex::adjacent_edges_map
staticprotectedinherited
Initial value:
=
{
{0, 3, 4},
{0, 1, 5},
{1, 2, 6},
{2, 3, 7},
{4, 8, 11},
{5, 8, 9},
{6, 9, 10},
{7, 10, 11}
}

This maps the j^{th} node to the (in this case) 3 edge ids adjacent to the node.

The edge numbering matches the one used in the derived classes' edge_nodes_map. This data structure is used in the Hex::edges_adjacent_to_node() override and is shared by all the derived Hex types.

Definition at line 245 of file cell_hex.h.

Referenced by libMesh::Hex::edges_adjacent_to_node().

◆ affine_tol

constexpr Real libMesh::Elem::affine_tol = TOLERANCE*TOLERANCE
staticprotectedinherited

◆ edge_nodes_map

const unsigned int libMesh::Hex20::edge_nodes_map
static
Initial value:
=
{
{0, 1, 8},
{1, 2, 9},
{2, 3, 10},
{0, 3, 11},
{0, 4, 12},
{1, 5, 13},
{2, 6, 14},
{3, 7, 15},
{4, 5, 16},
{5, 6, 17},
{6, 7, 18},
{4, 7, 19}
}

This maps the j^{th} node of the i^{th} edge to element node numbers.

Definition at line 227 of file cell_hex20.h.

Referenced by is_node_on_edge(), local_edge_node(), and nodes_on_edge().

◆ edge_sides_map

const unsigned int libMesh::Hex::edge_sides_map
staticinherited
Initial value:
=
{
{0, 1},
{0, 2},
{0, 3},
{0, 4},
{1, 4},
{1, 2},
{2, 3},
{3, 4},
{1, 5},
{2, 5},
{3, 5},
{4, 5}
}

This maps each edge to the sides that contain said edge.

Definition at line 196 of file cell_hex.h.

Referenced by libMesh::Hex::is_edge_on_side(), and libMesh::Hex::sides_on_edge().

◆ invalid_id

const dof_id_type libMesh::DofObject::invalid_id = static_cast<dof_id_type>(-1)
staticinherited

An invalid id to distinguish an uninitialized DofObject.

Definition at line 482 of file dof_object.h.

Referenced by libMesh::DofMap::_dof_indices(), libMesh::DofMap::_node_dof_indices(), libMesh::Node::active(), libMesh::MeshBase::add_elem_datum(), libMesh::MeshBase::add_elem_integers(), libMesh::DofObject::add_extra_integers(), libMesh::StaticCondensation::add_matrix(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::TopologyMap::add_node(), libMesh::MeshRefinement::add_node(), libMesh::MeshBase::add_node_datum(), libMesh::MeshBase::add_node_integers(), libMesh::ReplicatedMesh::add_point(), libMesh::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::DofMap::assert_no_nodes_missed(), libMesh::Elem::bracketing_nodes(), ExtraIntegersTest::checkpoint_helper(), libMesh::StaticCondensation::clear(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_periodic_constraints(), libMesh::FEGenericBase< FEOutputType< T >::type >::compute_proj_constraints(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::DofMap::dof_indices(), libMesh::DofObject::dof_number(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_nodes(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::OldSolutionValue< Output, point_output >::eval_old_dofs(), libMesh::TopologyMap::find(), libMesh::DofMap::gather_constraints(), libMesh::MeshBase::get_elemset_code(), libMesh::StaticCondensation::init(), libMesh::ReplicatedMesh::insert_node(), libMesh::Poly2TriTriangulator::insert_refinement_points(), libMesh::Elem::interior_parent(), libMesh::DofObject::invalidate_dofs(), libMesh::DofObject::invalidate_id(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::Node::Node(), libMesh::Elem::node_id(), libMesh::DofMap::old_dof_indices(), libMesh::DistributedMesh::own_node(), libMesh::XdrIO::pack_element(), libMesh::SFCPartitioner::partition_range(), libMesh::Elem::point(), libMesh::ExodusII_IO::read(), libMesh::System::read_legacy_data(), libMesh::DynaIO::read_mesh(), libMesh::System::read_parallel_data(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::DofMap::SCALAR_dof_indices(), libMesh::DofObject::set_dof_number(), libMesh::DofObject::set_n_comp_group(), libMesh::DofObject::set_n_vars_per_group(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Parallel::sync_node_data_by_element_id_once(), ExtraIntegersTest::test_and_set_initial_data(), DofObjectTest< Node >::testAddExtraData(), DofObjectTest< Node >::testAddSystemExtraInts(), NodalNeighborsTest::testEdge2(), NodalNeighborsTest::testEdge3(), NodalNeighborsTest::testEdge4(), ExtraIntegersTest::testExtraIntegersExodusReading(), InfFERadialTest::testRefinement(), DofObjectTest< Node >::testSetNSystemsExtraInts(), DofObjectTest< Node >::testSetNVariableGroupsExtraInts(), MeshTetTest::testTetInterfaceBase(), DofObjectTest< Node >::testValidId(), WriteElemsetData::testWriteImpl(), libMesh::Poly2TriTriangulator::triangulate_current_points(), libMesh::DofObject::valid_id(), libMesh::System::write_parallel_data(), and libMesh::XdrIO::write_serialized_connectivity().

◆ invalid_processor_id

const processor_id_type libMesh::DofObject::invalid_processor_id = static_cast<processor_id_type>(-1)
staticinherited

An invalid processor_id to distinguish DoFs that have not been assigned to a processor.

Definition at line 493 of file dof_object.h.

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::DistributedMesh::add_elem(), libMesh::DistributedMesh::add_node(), libMesh::MeshRefinement::add_node(), libMesh::MeshCommunication::allgather(), libMesh::Node::choose_processor_id(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubProjector::construct_projection(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshTools::create_bounding_box(), libMesh::MeshTools::create_nodal_bounding_box(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::Elem::Elem(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::MeshCommunication::find_global_indices(), libMesh::MeshBase::get_info(), libMesh::DistributedMesh::insert_elem(), libMesh::DofObject::invalidate_processor_id(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::MeshCommunication::make_new_node_proc_ids_parallel_consistent(), libMesh::DistributedMesh::n_active_elem(), libMesh::MeshBase::n_constraint_rows(), libMesh::MeshBase::n_elem_on_proc(), libMesh::MeshBase::n_nodes_on_proc(), libMesh::MeshBase::n_unpartitioned_elem(), libMesh::MeshBase::n_unpartitioned_nodes(), libMesh::SparsityPattern::Build::operator()(), libMesh::Partitioner::processor_pairs_to_interface_nodes(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), OverlappingFunctorTest::run_coupling_functor_test(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::send_and_insert_dof_values(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Partitioner::set_parent_processor_ids(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::Parallel::sync_dofobject_data_by_id(), libMesh::Parallel::sync_dofobject_data_by_xyz(), libMesh::Parallel::sync_element_data_by_parent_id(), libMesh::Parallel::sync_node_data_by_element_id_once(), DofObjectTest< Node >::testValidProcId(), libMesh::MeshTools::total_weight(), libMesh::DofObject::valid_processor_id(), and libMesh::CheckpointIO::write().

◆ invalid_subdomain_id

const subdomain_id_type libMesh::Elem::invalid_subdomain_id = std::numeric_limits<subdomain_id_type>::max()
staticinherited

A static integral constant representing an invalid subdomain id.

See also DofObject::{invalid_id, invalid_unique_id, invalid_processor_id}.

Note
We don't use the static_cast(-1) trick here since subdomain_id_type is sometimes a signed integer for compatibility reasons (see libmesh/id_types.h).
Normally you can declare static const integral types directly in the header file (C++ standard, 9.4.2/4) but std::numeric_limits<T>::max() is not considered a "constant expression". This one is therefore defined in elem.C. http://stackoverflow.com/questions/2738435/using-numeric-limitsmax-in-constant-expressions

Definition at line 238 of file elem.h.

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::BoundaryInfo::add_elements(), libMesh::ReplicatedMesh::get_disconnected_subdomains(), libMesh::MeshBase::get_id_by_name(), libMesh::BoundaryInfo::sync(), and MeshSubdomainIDTest::testMultiple().

◆ invalid_unique_id

const unique_id_type libMesh::DofObject::invalid_unique_id = static_cast<unique_id_type>(-1)
staticinherited

An invalid unique_id to distinguish an uninitialized DofObject.

Definition at line 487 of file dof_object.h.

Referenced by libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DofObject::unique_id(), and libMesh::DofObject::valid_unique_id().

◆ LIBMESH_ENABLE_TOPOLOGY_CACHES

libMesh::Hex20::LIBMESH_ENABLE_TOPOLOGY_CACHES
protected

Definition at line 265 of file cell_hex20.h.

◆ max_n_nodes

const unsigned int libMesh::Elem::max_n_nodes = 27
staticinherited

The maximum number of nodes any element can contain.

This is useful for replacing heap vectors with stack arrays.

Definition at line 639 of file elem.h.

Referenced by libMesh::Elem::Elem(), and ElemTest< elem_type >::test_static_data().

◆ nodes_per_edge

const int libMesh::Hex20::nodes_per_edge = 3
static

Definition at line 215 of file cell_hex20.h.

Referenced by local_edge_node().

◆ nodes_per_side

const int libMesh::Hex20::nodes_per_side = 8
static

Definition at line 214 of file cell_hex20.h.

Referenced by local_side_node().

◆ num_children

const int libMesh::Hex::num_children = 8
staticinherited

Definition at line 75 of file cell_hex.h.

◆ num_edges

const int libMesh::Hex::num_edges = 12
staticinherited

Definition at line 74 of file cell_hex.h.

◆ num_nodes

const int libMesh::Hex20::num_nodes = 20
static

Geometric constants for Hex20.

Definition at line 213 of file cell_hex20.h.

Referenced by n_nodes().

◆ num_sides

const int libMesh::Hex::num_sides = 6
staticinherited

Geometric constants for all Hexes.

Definition at line 73 of file cell_hex.h.

Referenced by libMesh::Hex27::center_node_on_side().

◆ old_dof_object

std::unique_ptr<DofObject> libMesh::DofObject::old_dof_object
protectedinherited

This object on the last mesh.

Useful for projecting solutions from one mesh to another.

Public access to old_dof_object is now officially deprecated and will be removed in future libMesh versions. Use the get_old_dof_object() accessor instead.

Definition at line 88 of file dof_object.h.

Referenced by libMesh::DofObject::clear_old_dof_object(), libMesh::DofObject::get_old_dof_object(), libMesh::DofObject::get_old_dof_object_ref(), libMesh::DofObject::operator=(), libMesh::DofObject::pack_indexing(), libMesh::DofObject::packed_indexing_size(), libMesh::DofObject::set_old_dof_object(), and libMesh::DofObject::unpack_indexing().

◆ side_nodes_map

const unsigned int libMesh::Hex20::side_nodes_map
static
Initial value:
=
{
{0, 3, 2, 1, 11, 10, 9, 8},
{0, 1, 5, 4, 8, 13, 16, 12},
{1, 2, 6, 5, 9, 14, 17, 13},
{2, 3, 7, 6, 10, 15, 18, 14},
{3, 0, 4, 7, 11, 12, 19, 15},
{4, 5, 6, 7, 16, 17, 18, 19}
}

This maps the j^{th} node of the i^{th} side to element node numbers.

Definition at line 221 of file cell_hex20.h.

Referenced by is_node_on_side(), local_side_node(), and nodes_on_side().

◆ type_to_n_edges_map

const unsigned int libMesh::Elem::type_to_n_edges_map
staticinherited

This array maps the integer representation of the ElemType enum to the number of edges on the element.

This is only usable for simple types for which the node number is fixed; for more general types like Polygon subclasses an actual instantiated Elem must be queried.

Definition at line 721 of file elem.h.

Referenced by ElemTest< elem_type >::test_static_data().

◆ type_to_n_nodes_map

const unsigned int libMesh::Elem::type_to_n_nodes_map
staticinherited

This array maps the integer representation of the ElemType enum to the number of nodes in the element.

This is only usable for simple types for which the node number is fixed; for more general types like Polygon subclasses an actual instantiated Elem must be queried.

Definition at line 628 of file elem.h.

Referenced by libMesh::DynaIO::ElementDefinition::ElementDefinition(), libMesh::FEAbstract::get_refspace_nodes(), libMesh::XdrIO::pack_element(), libMesh::CheckpointIO::read_connectivity(), libMesh::XdrIO::read_serialized_connectivity(), ElemTest< elem_type >::test_static_data(), MeshGenerationTest::testBuildCube(), MeshGenerationTest::testBuildLine(), and libMesh::ExodusII_IO_Helper::write_elements().

◆ type_to_n_sides_map

const unsigned int libMesh::Elem::type_to_n_sides_map
staticinherited

This array maps the integer representation of the ElemType enum to the number of sides on the element.

This is only usable for simple types for which the node number is fixed; for more general types like Polygon subclasses an actual instantiated Elem must be queried.

Definition at line 663 of file elem.h.

Referenced by ElemTest< elem_type >::test_static_data(), MeshGenerationTest::testBuildCube(), and MeshGenerationTest::testBuildSquare().


The documentation for this class was generated from the following files: