20 #ifndef LIBMESH_ELEM_H 21 #define LIBMESH_ELEM_H 39 #ifdef LIBMESH_FORWARD_DECLARE_ENUMS 68 #ifdef LIBMESH_ENABLE_PERIODIC 69 class PeriodicBoundaries;
70 class PointLocatorBase;
114 Elem ** elemlinkdata,
115 Node ** nodelinkdata);
141 const Point &
point (
const unsigned int i)
const;
165 #ifdef LIBMESH_ENABLE_DEPRECATED 211 #ifdef LIBMESH_ENABLE_DEPRECATED 316 #ifdef LIBMESH_ENABLE_DEPRECATED 338 #ifdef LIBMESH_ENABLE_PERIODIC 443 unsigned int side_node)
const = 0;
475 std::set<const Elem *> & neighbor_set)
const;
490 const Elem * start_elem)
const;
499 std::set<const Elem *> & neighbor_set)
const;
564 std::vector<dof_id_type> & conn)
const = 0;
583 virtual unsigned short dim ()
const = 0;
594 virtual unsigned int n_nodes ()
const = 0;
627 virtual unsigned int n_sides ()
const = 0;
657 virtual unsigned int n_edges ()
const = 0;
675 virtual unsigned int n_faces ()
const = 0;
686 virtual bool is_vertex(
const unsigned int i)
const = 0;
695 unsigned int n)
const 703 unsigned int n)
const;
708 virtual bool is_edge(
const unsigned int i)
const = 0;
713 virtual bool is_face(
const unsigned int i)
const = 0;
720 const unsigned int s)
const = 0;
725 virtual std::vector<unsigned int>
nodes_on_side(
const unsigned int )
const = 0;
732 const unsigned int e)
const = 0;
738 const unsigned int s)
const = 0;
744 virtual unsigned int opposite_side(
const unsigned int s)
const;
752 const unsigned int s)
const;
775 virtual std::unique_ptr<Elem>
side_ptr (
unsigned int i) = 0;
776 std::unique_ptr<const Elem>
side_ptr (
unsigned int i)
const;
793 virtual void side_ptr (std::unique_ptr<Elem> &
side,
const unsigned int i) = 0;
794 void side_ptr (std::unique_ptr<const Elem> &
side,
const unsigned int i)
const;
805 #ifdef LIBMESH_ENABLE_DEPRECATED 806 std::unique_ptr<Elem>
side (
const unsigned int i)
const;
830 virtual std::unique_ptr<Elem>
build_side_ptr (
const unsigned int i,
bool proxy=
true) = 0;
831 std::unique_ptr<const Elem>
build_side_ptr (
const unsigned int i,
bool proxy=
true)
const;
859 #ifdef LIBMESH_ENABLE_DEPRECATED 860 std::unique_ptr<Elem>
build_side (
const unsigned int i,
bool proxy=
true)
const;
876 virtual std::unique_ptr<Elem>
build_edge_ptr (
const unsigned int i) = 0;
877 std::unique_ptr<const Elem>
build_edge_ptr (
const unsigned int i)
const;
887 #ifdef LIBMESH_ENABLE_DEPRECATED 888 std::unique_ptr<Elem>
build_edge (
const unsigned int i)
const;
949 { libmesh_not_implemented();
return std::make_pair(0.,0.); }
1103 const unsigned int n2)
const;
1126 const unsigned int v)
const;
1143 virtual std::pair<unsigned short int, unsigned short int>
1159 const bool full_ordered=
true);
1178 unsigned int level ()
const;
1185 unsigned int p_level ()
const;
1191 const unsigned int s)
const = 0;
1193 #ifdef LIBMESH_ENABLE_AMR 1231 #ifdef LIBMESH_ENABLE_DEPRECATED 1232 Elem *
child (
const unsigned int i)
const;
1240 class ConstChildRefIter;
1273 const unsigned int e)
const;
1307 void family_tree (std::vector<const Elem *> & family,
1308 const bool reset=
true)
const;
1315 const bool reset=
true)
const;
1324 const bool reset=
true)
const;
1331 const unsigned int side,
1332 const bool reset=
true)
const;
1339 const unsigned int side,
1340 const bool reset=
true)
const;
1348 const bool reset=
true)
const;
1356 const bool reset=
true)
const;
1366 const Elem * subneighbor,
1367 const bool reset=
true)
const;
1375 const Elem * subneighbor,
1376 const bool reset=
true)
const;
1384 const bool reset=
true)
const;
1396 const bool reset=
true)
const;
1430 unsigned int current_min)
const;
1438 unsigned int current_min)
const;
1529 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 1535 virtual bool infinite ()
const = 0;
1545 { libmesh_assert (!this->
infinite());
return false; }
1566 #ifdef LIBMESH_ENABLE_AMR 1574 unsigned int n)
const;
1581 const std::vector<std::pair<unsigned char, unsigned char>> &
1583 unsigned int n)
const;
1590 const std::vector<std::pair<dof_id_type, dof_id_type>>
1592 unsigned int n)
const;
1599 const unsigned int child_node_num,
1600 const unsigned int parent_node_num)
const = 0;
1611 #endif // LIBMESH_ENABLE_AMR 1645 template <
typename Sub
class>
1647 const unsigned int i,
1650 #ifdef LIBMESH_ENABLE_AMR 1658 std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char>>>>> &
1661 static std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char>>>>> c;
1672 std::vector<std::vector<std::vector<signed char>>> &
1675 static std::vector<std::vector<std::vector<signed char>>> c;
1680 #endif // LIBMESH_ENABLE_AMR 1703 #ifdef LIBMESH_ENABLE_AMR 1715 #ifdef LIBMESH_ENABLE_AMR 1761 #ifdef LIBMESH_ENABLE_AMR 1792 #endif // LIBMESH_ENABLE_AMR 1812 const unsigned int ns,
1814 Elem ** elemlinkdata,
1815 Node ** nodelinkdata) :
1816 _nodes(nodelinkdata),
1817 _elemlinks(elemlinkdata),
1818 #ifdef LIBMESH_ENABLE_AMR
1822 #ifdef LIBMESH_ENABLE_AMR
1824 _rflag(
Elem::DO_NOTHING),
1825 _pflag(
Elem::DO_NOTHING),
1837 for (
unsigned int n=0; n<nn; n++)
1848 for (
unsigned int n=1; n<ns+1; n++)
1853 if (this->
parent() !=
nullptr)
1859 #ifdef LIBMESH_ENABLE_AMR 1879 #ifdef LIBMESH_ENABLE_AMR 1894 libmesh_assert_less (i, this->
n_nodes());
1895 libmesh_assert(
_nodes[i]);
1906 libmesh_assert_less (i, this->
n_nodes());
1916 libmesh_assert_less (i, this->
n_nodes());
1917 libmesh_assert(
_nodes[i]);
1925 #ifdef LIBMESH_ENABLE_DEPRECATED 1929 libmesh_deprecated();
1939 for (
unsigned int n=0; n != this->
n_nodes(); ++n)
1959 libmesh_assert_less (i, this->
n_nodes());
1960 libmesh_assert(
_nodes[i]);
1970 libmesh_assert_less (i, this->
n_nodes());
1971 libmesh_assert(
_nodes[i]);
1994 #ifdef LIBMESH_ENABLE_DEPRECATED 2004 libmesh_deprecated();
2014 for (
unsigned int n=0; n != this->
n_nodes(); ++n)
2026 libmesh_assert_less (i, this->
n_nodes());
2069 #ifdef LIBMESH_ENABLE_DEPRECATED 2075 libmesh_deprecated();
2108 if (n && n->parent() ==
this)
2120 if (n && n->parent() ==
this)
2150 return {0, cast_int<unsigned short>(this->
n_nodes())};
2159 return {0, cast_int<unsigned short>(this->
n_edges())};
2168 return {0, cast_int<unsigned short>(this->
n_sides())};
2179 Elem * me =
const_cast<Elem *
>(
this);
2181 return std::unique_ptr<const Elem>(s);
2189 const unsigned int i)
const 2192 Elem * me =
const_cast<Elem *
>(
this);
2193 std::unique_ptr<Elem> e {
const_cast<Elem *
>(elem.release())};
2195 elem.reset(e.release());
2200 #ifdef LIBMESH_ENABLE_DEPRECATED 2205 libmesh_deprecated();
2207 return std::unique_ptr<Elem>(s);
2214 std::unique_ptr<const Elem>
2219 Elem * me =
const_cast<Elem *
>(
this);
2221 return std::unique_ptr<const Elem>(s);
2229 const unsigned int i)
const 2232 Elem * me =
const_cast<Elem *
>(
this);
2233 std::unique_ptr<Elem> e {
const_cast<Elem *
>(elem.release())};
2235 elem.reset(e.release());
2240 #ifdef LIBMESH_ENABLE_DEPRECATED 2242 std::unique_ptr<Elem>
2246 libmesh_deprecated();
2248 return std::unique_ptr<Elem>(s);
2254 template <
typename Sub
class>
2258 const unsigned int i,
2261 libmesh_assert_less (i, this->
n_sides());
2263 if (!side.get() ||
side->type() != sidetype)
2269 for (
auto n :
side->node_index_range())
2270 side->set_node(n) = this->
node_ptr(Subclass::side_nodes_map[i][n]);
2277 std::unique_ptr<const Elem>
2282 Elem * me =
const_cast<Elem *
>(
this);
2284 return std::unique_ptr<const Elem>(e);
2289 #ifdef LIBMESH_ENABLE_DEPRECATED 2291 std::unique_ptr<Elem>
2295 libmesh_deprecated();
2297 return std::unique_ptr<Elem>(e);
2318 const Elem * eparent = e;
2322 eparent = eparent->
parent();
2323 libmesh_assert(eparent);
2326 for (
unsigned int s=0, n_s = this->
n_sides(); s != n_s; ++s)
2340 const unsigned int ns = this->
n_sides();
2341 const unsigned int nn = this->
n_nodes();
2343 const unsigned int en = e->
n_nodes();
2346 std::vector<bool> might_be_side(ns,
true);
2348 for (
unsigned int i=0; i != en; ++i)
2357 for (
unsigned int j=0; j != nn; ++j)
2358 if (this->
point(j) == side_point)
2368 for (
unsigned int s=0; s != ns; ++s)
2370 might_be_side[s] =
false;
2373 for (
unsigned int s=0; s != ns; ++s)
2374 if (might_be_side[s])
2377 for (
unsigned int s2=s+1; s2 < ns; ++s2)
2378 libmesh_assert (!might_be_side[s2]);
2392 #ifdef LIBMESH_ENABLE_AMR 2410 #ifdef LIBMESH_ENABLE_AMR 2415 for (
const Elem * my_ancestor = this->
parent();
2416 my_ancestor !=
nullptr;
2417 my_ancestor = my_ancestor->
parent())
2418 if (my_ancestor->active())
2430 #ifdef LIBMESH_ENABLE_AMR 2444 #ifdef LIBMESH_ENABLE_AMR 2449 if (c.has_children())
2459 #ifdef LIBMESH_ENABLE_AMR
2464 #ifdef LIBMESH_ENABLE_AMR 2465 const Elem * e = descendant;
2505 const Elem * tp =
this;
2509 while (tp->
parent() !=
nullptr)
2513 libmesh_assert_equal_to (tp->
level(), 0);
2523 #ifdef LIBMESH_ENABLE_AMR 2529 if (this->
parent() ==
nullptr)
2557 #ifdef LIBMESH_ENABLE_AMR 2566 #ifdef LIBMESH_ENABLE_AMR 2596 #ifdef LIBMESH_ENABLE_DEPRECATED 2602 libmesh_deprecated();
2626 for (
unsigned int c=0; c != nc; c++)
2630 libmesh_error_msg(
"ERROR: which_child_am_i() was called with a non-child!");
2648 _rflag = cast_int<RefinementState>(rflag);
2665 libmesh_assert_not_equal_to
2668 _pflag = cast_int<unsigned char>(pflag);
2682 unsigned int max_p_level =
_p_level;
2684 max_p_level =
std::max(max_p_level,
2685 c.max_descendant_p_level());
2695 if (this->
parent() !=
nullptr)
2700 if (parent_p_level > p)
2712 _p_level = cast_int<unsigned char>(p);
2713 parent_p_level = cast_int<unsigned char>(p);
2715 parent_p_level =
std::min(parent_p_level,
2733 _p_level = cast_int<unsigned char>(p);
2742 libmesh_assert_not_equal_to
2745 _p_level = cast_int<unsigned char>(p);
2750 #endif // ifdef LIBMESH_ENABLE_AMR 2799 libmesh_assert ((n0 < n1) && (n1 < n2));
2829 libmesh_assert ((n0 < n1) && (n1 < n2) && (n2 < n3));
2901 this->_parent == other.
_parent);
2978 template <
typename PredType,
typename IterType>
2981 const PredType & p ) :
3006 #define LIBMESH_ENABLE_TOPOLOGY_CACHES \ 3008 std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char>>>>> & \ 3009 _get_bracketing_node_cache() const override \ 3011 static std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char>>>>> c; \ 3016 std::vector<std::vector<std::vector<signed char>>> & \ 3017 _get_parent_indices_cache() const override \ 3019 static std::vector<std::vector<std::vector<signed char>>> c; \ 3024 #endif // LIBMESH_ELEM_H void total_family_tree_by_subneighbor(std::vector< const Elem *> &family, const Elem *neighbor, const Elem *subneighbor, const bool reset=true) const
bool has_neighbor(const Elem *elem) const
void set_p_level(const unsigned int p)
virtual bool is_vertex_on_parent(unsigned int c, unsigned int n) const
RefinementState refinement_flag() const
void write_connectivity(std::ostream &out, const IOPackage iop) const
const Elem * parent() const
virtual const std::vector< std::pair< dof_id_type, dof_id_type > > bracketing_nodes(unsigned int c, unsigned int n) const
void print_info(std::ostream &os=libMesh::out) const
virtual Node *& set_node(const unsigned int i)
A geometric point in (x,y,z) space associated with a DOF.
bool is_ancestor_of(const Elem *descendant) const
void family_tree_by_neighbor(std::vector< const Elem *> &family, const Elem *neighbor, const bool reset=true) const
Elem * child_neighbor(Elem *elem)
variant_filter_iterator(const IterType &d, const IterType &e, const PredType &p)
Predicates::multi_predicate Predicate
virtual Point origin() const
const unsigned int invalid_uint
unsigned int get_node_index(const Node *node_ptr) const
std::string get_info() const
static const unsigned int type_to_n_sides_map[INVALID_ELEM]
const Elem * interior_parent() const
const Elem * topological_neighbor(const unsigned int i, const MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb) const
virtual bool is_face(const unsigned int i) const =0
bool is_semilocal(const processor_id_type my_pid) const
IntRange< unsigned short > side_index_range() const
void libmesh_assert_valid_node_pointers() const
virtual dof_id_type key() const
const Elem * top_parent() const
Maps between boundary ids and PeriodicBoundaryBase objects.
virtual bool is_edge_on_side(const unsigned int e, const unsigned int s) const =0
virtual unsigned int embedding_matrix_version() const
unsigned int which_side_am_i(const Elem *e) const
virtual bool is_child_on_side(const unsigned int c, const unsigned int s) const =0
SideIter(const unsigned int side_number, Elem *parent)
RefinementState p_refinement_flag() const
virtual bool has_affine_map() const
void find_interior_neighbors(std::set< const Elem *> &neighbor_set) const
bool operator==(const SideIter &other) const
The base class for all geometric element types.
uint8_t processor_id_type
void add_child(Elem *elem)
virtual BoundingBox loose_bounding_box() const
SideIter & operator=(const SideIter &other)
unsigned int min_new_p_level_by_neighbor(const Elem *neighbor, unsigned int current_min) const
void set_refinement_flag(const RefinementState rflag)
virtual bool is_node_on_side(const unsigned int n, const unsigned int s) const =0
virtual float 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_children() const =0
ChildRefIter(Elem *const *childpp)
unsigned int _side_number
unsigned int p_level() const
void find_edge_neighbors(const Point &p1, const Point &p2, std::set< const Elem *> &neighbor_set) const
side_iterator boundary_sides_end()
static const Real TOLERANCE
void active_family_tree(std::vector< const Elem *> &active_family, const bool reset=true) const
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, const bool reset=true) const
void make_links_to_me_remote()
std::unique_ptr< Elem > build_side(const unsigned int i, bool proxy=true) const
virtual Real hmax() const
virtual bool is_linear() const
long double max(long double a, double b)
dof_id_type node(const unsigned int i) const
unsigned int min_p_level_by_neighbor(const Elem *neighbor, unsigned int current_min) const
void set_interior_parent(Elem *p)
static const unsigned int type_to_n_nodes_map[INVALID_ELEM]
void total_family_tree(std::vector< const Elem *> &active_family, const bool reset=true) const
SimpleRange< ChildRefIter > child_ref_range()
void family_tree_by_side(std::vector< const Elem *> &family, const unsigned int side, const bool reset=true) const
bool has_topological_neighbor(const Elem *elem, const MeshBase &mesh, const PointLocatorBase &point_locator, const PeriodicBoundaries *pb) const
IntRange< unsigned short > edge_index_range() const
side_iterator boundary_sides_begin()
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i, bool proxy=true)=0
Elem *& operator*() const
virtual void refine(MeshRefinement &mesh_refinement)
const Elem *const * ConstNeighborPtrIter
virtual bool is_node_on_edge(const unsigned int n, const unsigned int e) const =0
uint32_t hashword(const uint32_t *k, size_t length, uint32_t initval=0)
void total_family_tree_by_neighbor(std::vector< const Elem *> &family, const Elem *neighbor, const bool reset=true) const
void replace_child(Elem *elem, unsigned int c)
std::unique_ptr< Elem > build_edge(const unsigned int i) const
static const subdomain_id_type invalid_subdomain_id
void remove_links_to_me()
virtual std::vector< std::vector< std::vector< signed char > > > & _get_parent_indices_cache() const
Elem *const * NeighborPtrIter
virtual bool contains_point(const Point &p, Real tol=TOLERANCE) const
Responsible for mesh refinement algorithms and data.
Real length(const unsigned int n1, const unsigned int n2) const
void active_family_tree_by_side(std::vector< const Elem *> &family, const unsigned int side, const bool reset=true) const
Elem & operator=(const Elem &)=delete
const Node & node_ref(const unsigned int i) const
virtual Real hmin() const
virtual unsigned int n_nodes() const =0
static const processor_id_type invalid_processor_id
static const unsigned int type_to_n_edges_map[INVALID_ELEM]
bool contains_edge_of(const Elem *e) const
unsigned int which_neighbor_am_i(const Elem *e) const
virtual unsigned int as_parent_node(unsigned int c, unsigned int n) const
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
virtual unsigned int opposite_node(const unsigned int n, const unsigned int s) const
virtual std::pair< unsigned short int, unsigned short int > second_order_child_vertex(const unsigned int n) const
void find_point_neighbors(const Point &p, std::set< const Elem *> &neighbor_set) const
const Node *const * get_nodes() const
bool point_test(const Point &p, Real box_tol, Real map_tol) const
void _update_side_ptr() const
bool side_on_boundary() const
void family_tree(std::vector< const Elem *> &family, const bool reset=true) const
static const dof_id_type invalid_id
const Elem * reference_elem() const
void libmesh_assert_valid_neighbors() const
virtual bool is_remote() const
virtual unsigned int n_edges() const =0
virtual unsigned int n_second_order_adjacent_vertices(const unsigned int n) const
void set_neighbor(const unsigned int i, Elem *n)
subdomain_id_type _sbd_id
static ElemType second_order_equivalent_type(const ElemType et, const bool full_ordered=true)
Elem * neighbor(const unsigned int i) const
Elem(const unsigned int n_nodes, const unsigned int n_sides, Elem *parent, Elem **elemlinkdata, Node **nodelinkdata)
unsigned int which_child_am_i(const Elem *e) const
unsigned int max_descendant_p_level() const
bool contains_vertex_of(const Elem *e) const
virtual unsigned int which_node_am_i(unsigned int side, unsigned int side_node) const =0
void active_family_tree_by_neighbor(std::vector< const Elem *> &family, const Elem *neighbor, const bool reset=true) const
Elem * child(const unsigned int i) const
SimpleRange< NodeRefIter > node_ref_range()
virtual unsigned int is_vertex_on_child(unsigned int, unsigned int n) const
std::unique_ptr< Elem > _side
ConstNodeRefIter(const Node *const *nodepp)
virtual unsigned int n_sides() const =0
const Elem * neighbor_ptr(unsigned int i) const
virtual bool close_to_point(const Point &p, Real tol) const
unsigned int level() const
const Elem * raw_child_ptr(unsigned int i) const
virtual unsigned int n_vertices() const =0
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual std::unique_ptr< Elem > side_ptr(unsigned int i)=0
subdomain_id_type subdomain_id() const
virtual unsigned short dim() const =0
const Node * node_ptr(const unsigned int i) const
SideIter(const SideIter &other)
virtual bool is_vertex(const unsigned int i) const =0
void swap(Iterator &lhs, Iterator &rhs)
virtual Point master_point(const unsigned int i) const =0
unsigned int n_neighbors() const
virtual Real quality(const ElemQuality q) const
virtual unsigned short int second_order_adjacent_vertex(const unsigned int n, const unsigned int v) const
virtual Real volume() const
uint32_t hashword2(const uint32_t &first, const uint32_t &second, uint32_t initval=0)
void set_child(unsigned int c, Elem *elem)
virtual void connectivity(const unsigned int sc, const IOPackage iop, std::vector< dof_id_type > &conn) const =0
bool has_ancestor_children() const
IntRange< unsigned short > node_index_range() const
unsigned int local_node(const dof_id_type i) const
SimpleRange< NeighborPtrIter > neighbor_ptr_range()
void set_p_refinement_flag(const RefinementState pflag)
virtual unsigned int n_faces() const =0
virtual bool infinite() const =0
virtual std::pair< Real, Real > qual_bounds(const ElemQuality) const
static dof_id_type compute_key(dof_id_type n0)
virtual unsigned int n_sub_elem() const =0
virtual std::unique_ptr< Elem > build_edge_ptr(const unsigned int i)=0
void make_links_to_me_local(unsigned int n)
ConstChildRefIter(const Elem *const *childpp)
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
virtual std::vector< std::vector< std::vector< std::vector< std::pair< unsigned char, unsigned char > > > > > & _get_bracketing_node_cache() const
virtual unsigned int opposite_side(const unsigned int s) const
OStreamProxy out(std::cout)
void hack_p_level(const unsigned int p)
void simple_build_side_ptr(std::unique_ptr< Elem > &side, const unsigned int i, ElemType sidetype)
static ElemType first_order_equivalent_type(const ElemType et)
processor_id_type processor_id() const
virtual ElemType type() const =0
std::ostream & operator<<(std::ostream &os, const FEAbstract &fe)
long double min(long double a, double b)
A geometric point in (x,y,z) space.
dof_id_type node_id(const unsigned int i) const
const Point & point(const unsigned int i) const
virtual Point centroid() const
bool operator==(const Elem &rhs) const
side_iterator(const IterType &d, const IterType &e, const PredType &p)
bool has_children() const
NodeRefIter(Node *const *nodepp)
virtual bool is_child_on_edge(const unsigned int c, const unsigned int e) const
virtual bool is_edge(const unsigned int i) const =0
virtual std::vector< unsigned int > nodes_on_side(const unsigned int) const =0
std::unique_ptr< Elem > side(const unsigned int i) const
virtual unsigned int n_nodes_in_child(unsigned int) const
Node * get_node(const unsigned int i) const
static const unsigned int max_n_nodes
const Elem * child_ptr(unsigned int i) const
void family_tree_by_subneighbor(std::vector< const Elem *> &family, const Elem *neighbor, const Elem *subneighbor, const bool reset=true) const
virtual bool is_mid_infinite_edge_node(const unsigned int) const