20 #include "libmesh/elem.h" 22 #include "libmesh/boundary_info.h" 23 #include "libmesh/fe_type.h" 24 #include "libmesh/fe_interface.h" 25 #include "libmesh/node_elem.h" 26 #include "libmesh/edge_edge2.h" 27 #include "libmesh/edge_edge3.h" 28 #include "libmesh/edge_edge4.h" 29 #include "libmesh/edge_inf_edge2.h" 30 #include "libmesh/face_c0polygon.h" 31 #include "libmesh/face_tri3.h" 32 #include "libmesh/face_tri3_subdivision.h" 33 #include "libmesh/face_tri3_shell.h" 34 #include "libmesh/face_tri6.h" 35 #include "libmesh/face_tri7.h" 36 #include "libmesh/face_quad4.h" 37 #include "libmesh/face_quad4_shell.h" 38 #include "libmesh/face_quad8.h" 39 #include "libmesh/face_quad8_shell.h" 40 #include "libmesh/face_quad9.h" 41 #include "libmesh/face_quad9_shell.h" 42 #include "libmesh/face_inf_quad4.h" 43 #include "libmesh/face_inf_quad6.h" 44 #include "libmesh/cell_tet4.h" 45 #include "libmesh/cell_tet10.h" 46 #include "libmesh/cell_tet14.h" 47 #include "libmesh/cell_hex8.h" 48 #include "libmesh/cell_hex20.h" 49 #include "libmesh/cell_hex27.h" 50 #include "libmesh/cell_inf_hex8.h" 51 #include "libmesh/cell_inf_hex16.h" 52 #include "libmesh/cell_inf_hex18.h" 53 #include "libmesh/cell_prism6.h" 54 #include "libmesh/cell_prism15.h" 55 #include "libmesh/cell_prism18.h" 56 #include "libmesh/cell_prism20.h" 57 #include "libmesh/cell_prism21.h" 58 #include "libmesh/cell_inf_prism6.h" 59 #include "libmesh/cell_inf_prism12.h" 60 #include "libmesh/cell_pyramid5.h" 61 #include "libmesh/cell_pyramid13.h" 62 #include "libmesh/cell_pyramid14.h" 63 #include "libmesh/cell_pyramid18.h" 64 #include "libmesh/fe_base.h" 65 #include "libmesh/mesh_base.h" 66 #include "libmesh/quadrature_nodal.h" 67 #include "libmesh/quadrature_gauss.h" 68 #include "libmesh/remote_elem.h" 69 #include "libmesh/reference_elem.h" 70 #include "libmesh/enum_to_string.h" 71 #include "libmesh/threads.h" 72 #include "libmesh/enum_elem_quality.h" 73 #include "libmesh/enum_io_package.h" 74 #include "libmesh/enum_order.h" 75 #include "libmesh/elem_internal.h" 77 #ifdef LIBMESH_ENABLE_PERIODIC 78 #include "libmesh/mesh.h" 79 #include "libmesh/periodic_boundaries.h" 414 std::unique_ptr<Elem> returnval;
416 switch (this->
type())
419 returnval = std::make_unique<C0Polygon>(this->
n_sides());
426 returnval->set_id() = this->
id();
427 #ifdef LIBMESH_ENABLE_UNIQUE_ID 429 returnval->set_unique_id(this->
unique_id());
433 returnval->add_extra_integers(n_elem_ints);
434 for (
unsigned int i = 0; i != n_elem_ints; ++i)
435 returnval->set_extra_integer(i, this->get_extra_integer(i));
437 returnval->inherit_data_from(*
this);
451 return std::make_unique<NodeElem>(p);
455 return std::make_unique<Edge2>(p);
457 return std::make_unique<Edge3>(p);
459 return std::make_unique<Edge4>(p);
463 return std::make_unique<Tri3>(p);
465 return std::make_unique<TriShell3>(p);
467 return std::make_unique<Tri3Subdivision>(p);
469 return std::make_unique<Tri6>(p);
471 return std::make_unique<Tri7>(p);
473 return std::make_unique<Quad4>(p);
475 return std::make_unique<QuadShell4>(p);
477 return std::make_unique<Quad8>(p);
479 return std::make_unique<QuadShell8>(p);
481 return std::make_unique<Quad9>(p);
483 return std::make_unique<QuadShell9>(p);
487 return std::make_unique<C0Polygon>(6, p);
492 libmesh_not_implemented_msg
493 (
"Polyhedra cannot be built via Elem::build()");
497 return std::make_unique<Tet4>(p);
499 return std::make_unique<Tet10>(p);
501 return std::make_unique<Tet14>(p);
503 return std::make_unique<Hex8>(p);
505 return std::make_unique<Hex20>(p);
507 return std::make_unique<Hex27>(p);
509 return std::make_unique<Prism6>(p);
511 return std::make_unique<Prism15>(p);
513 return std::make_unique<Prism18>(p);
515 return std::make_unique<Prism20>(p);
517 return std::make_unique<Prism21>(p);
519 return std::make_unique<Pyramid5>(p);
521 return std::make_unique<Pyramid13>(p);
523 return std::make_unique<Pyramid14>(p);
525 return std::make_unique<Pyramid18>(p);
527 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 530 return std::make_unique<InfEdge2>(p);
534 return std::make_unique<InfQuad4>(p);
536 return std::make_unique<InfQuad6>(p);
540 return std::make_unique<InfHex8>(p);
542 return std::make_unique<InfHex16>(p);
544 return std::make_unique<InfHex18>(p);
546 return std::make_unique<InfPrism6>(p);
548 return std::make_unique<InfPrism12>(p);
577 #ifdef LIBMESH_ENABLE_DEPRECATED 581 <<
"Elem::centroid() has been deprecated. Replace with either " 582 <<
"Elem::vertex_average() to maintain existing behavior, or " 583 <<
"the more expensive Elem::true_centroid() " 584 <<
"in cases where the true 'geometric' centroid is required." 586 libmesh_deprecated();
590 #endif // LIBMESH_ENABLE_DEPRECATED 637 #ifdef LIBMESH_ENABLE_AMR 638 elem_copy->set_p_level(0);
643 elem_copy->set_node(n,
_nodes[n]);
645 return elem_copy->true_centroid();
656 fe->attach_quadrature_rule(&qrule);
659 const auto & JxW = fe->get_JxW();
660 const auto & phi = fe->get_phi();
667 libmesh_assert_equal_to(N, this->
n_nodes());
670 std::vector<Real> V(N);
673 V[i] += JxW[qp] * phi[i][qp];
681 cp += this->
point(i) * V[i];
695 cp.
add (this->point(n));
704 Real h_min=std::numeric_limits<Real>::max();
709 for (
unsigned int n_outer=0; n_outer<
n_vertices; n_outer++)
710 for (
unsigned int n_inner=n_outer+1; n_inner<
n_vertices; n_inner++)
712 const auto diff = (this->
point(n_outer) - this->
point(n_inner));
714 h_min = std::min(h_min, diff.norm_sq());
717 return std::sqrt(h_min);
729 for (
unsigned int n_outer=0; n_outer<
n_vertices; n_outer++)
730 for (
unsigned int n_inner=n_outer+1; n_inner<
n_vertices; n_inner++)
732 const auto diff = (this->
point(n_outer) - this->
point(n_inner));
734 h_max = std::max(h_max, diff.norm_sq());
737 return std::sqrt(h_max);
743 const unsigned int n2)
const 745 libmesh_assert_less ( n1, this->
n_vertices() );
746 libmesh_assert_less ( n2, this->
n_vertices() );
748 return (this->
point(n1) - this->
point(n2)).norm();
755 const unsigned short n_n = this->
n_nodes();
757 std::array<dof_id_type, Elem::max_n_nodes> node_ids;
759 for (
unsigned short n=0; n != n_n; ++n)
760 node_ids[n] = this->
node_id(n);
764 std::sort (node_ids.begin(), node_ids.begin()+n_n);
777 const unsigned short n_n = this->
n_nodes();
778 libmesh_assert_equal_to(n_n, rhs.
n_nodes());
782 std::array<dof_id_type, Elem::max_n_nodes> this_ids, rhs_ids;
784 for (
unsigned short n = 0; n != n_n; n++)
786 this_ids[n] = this->
node_id(n);
791 std::sort(this_ids.begin(), this_ids.begin()+n_n);
792 std::sort(rhs_ids.begin(), rhs_ids.begin()+n_n);
795 for (
unsigned short n = 0; n != n_n; ++n)
796 if (this_ids[n] != rhs_ids[n])
857 std::set<const Elem *> point_neighbors;
861 for (
const auto & elem : point_neighbors)
862 if (elem->processor_id() == my_pid)
874 const unsigned int ns = this->
n_sides();
875 const unsigned int nn = this->
n_nodes();
877 const unsigned int en = e->
n_nodes();
880 std::vector<bool> might_be_side(ns,
true);
882 for (
unsigned int i=0; i != en; ++i)
891 for (
unsigned int j=0; j != nn; ++j)
892 if (this->
point(j) == side_point)
902 for (
unsigned int s=0; s != ns; ++s)
904 might_be_side[s] =
false;
907 for (
unsigned int s=0; s != ns; ++s)
908 if (might_be_side[s])
911 for (
unsigned int s2=s+1; s2 < ns; ++s2)
923 #ifdef LIBMESH_ENABLE_DEPRECATED 925 unsigned int side_node)
const 927 libmesh_deprecated();
930 #endif // LIBMESH_ENABLE_DEPRECATED 938 const unsigned int my_nv = this->
n_vertices();
946 if (&this->
node_ref(my_n) == vertex)
953 const unsigned int l = this->
level();
954 const unsigned int el = e->
level();
974 unsigned int num_contained_edges = 0;
981 num_contained_edges++;
982 if (num_contained_edges>=2)
994 std::set<const Elem *> & neighbor_set)
const 999 neighbor_set.clear();
1000 neighbor_set.insert(
this);
1002 std::set<const Elem *> untested_set, next_untested_set;
1003 untested_set.insert(
this);
1005 #ifdef LIBMESH_ENABLE_AMR 1006 std::vector<const Elem *> active_neighbor_children;
1007 #endif // #ifdef LIBMESH_ENABLE_AMR 1009 while (!untested_set.empty())
1013 for (
const auto & elem : untested_set)
1014 for (
auto current_neighbor : elem->neighbor_ptr_range())
1016 if (current_neighbor &&
1019 if (current_neighbor->active())
1021 auto it = neighbor_set.lower_bound(current_neighbor);
1022 if ((it == neighbor_set.end() || *it != current_neighbor) &&
1023 current_neighbor->contains_point(p))
1026 next_untested_set.insert(current_neighbor);
1027 neighbor_set.emplace_hint(it, current_neighbor);
1030 #ifdef LIBMESH_ENABLE_AMR 1034 active_neighbor_children.clear();
1035 current_neighbor->active_family_tree_by_neighbor
1036 (active_neighbor_children, elem);
1038 for (
const auto & current_child : active_neighbor_children)
1040 auto it = neighbor_set.lower_bound(current_child);
1041 if ((it == neighbor_set.end() || *it != current_child) &&
1042 current_child->contains_point(p))
1045 next_untested_set.insert(current_child);
1046 neighbor_set.emplace_hint(it, current_child);
1050 #endif // #ifdef LIBMESH_ENABLE_AMR 1053 untested_set.swap(next_untested_set);
1054 next_untested_set.clear();
1068 const Elem * start_elem)
const 1085 std::set<const Elem *> & neighbor_set)
const 1094 std::set<const Elem *>::iterator it = neighbor_set.begin();
1095 const std::set<const Elem *>::iterator end = neighbor_set.end();
1101 if (!(*it)->contains_point(p2))
1102 it = neighbor_set.erase(it);
1112 neighbor_set.clear();
1113 neighbor_set.insert(
this);
1115 std::set<const Elem *> untested_set, next_untested_set;
1116 untested_set.insert(
this);
1118 while (!untested_set.empty())
1122 for (
const auto & elem : untested_set)
1124 for (
auto current_neighbor : elem->neighbor_ptr_range())
1126 if (current_neighbor &&
1129 if (current_neighbor->active())
1132 || current_neighbor->contains_edge_of(
this))
1135 if (!neighbor_set.count(current_neighbor))
1136 next_untested_set.insert (current_neighbor);
1139 neighbor_set.insert (current_neighbor);
1142 #ifdef LIBMESH_ENABLE_AMR 1146 std::vector<const Elem *> active_neighbor_children;
1148 current_neighbor->active_family_tree_by_neighbor
1149 (active_neighbor_children, elem);
1151 for (
const auto & current_child : active_neighbor_children)
1152 if (this->
contains_edge_of(current_child) || current_child->contains_edge_of(
this))
1155 if (!neighbor_set.count(current_child))
1156 next_untested_set.insert (current_child);
1158 neighbor_set.insert (current_child);
1161 #endif // #ifdef LIBMESH_ENABLE_AMR 1165 untested_set.swap(next_untested_set);
1166 next_untested_set.clear();
1189 if (this->
dim() >= LIBMESH_DIM)
1210 (interior_p->
dim() > this->
dim()));
1223 (this->
level() == 0 &&
1234 if (this->
dim() >= LIBMESH_DIM)
1241 (interior_p->
dim() > this->
dim()));
1252 this->
dim() < LIBMESH_DIM);
1262 (p->
dim() > this->
dim()));
1269 #ifdef LIBMESH_ENABLE_PERIODIC 1279 if (neighbor_i !=
nullptr)
1287 std::vector<boundary_id_type> bc_ids;
1288 mesh.get_boundary_info().boundary_ids(
this, cast_int<unsigned short>(i), bc_ids);
1289 for (
const auto &
id : bc_ids)
1295 const Elem *
const cn = pb->
neighbor(
id, point_locator,
this, i);
1296 neighbor_i =
const_cast<Elem *
>(cn);
1303 neighbor_i = neighbor_i->
parent();
1321 if (neighbor_i !=
nullptr)
1329 std::vector<boundary_id_type> bc_ids;
1330 mesh.get_boundary_info().boundary_ids(
this, cast_int<unsigned short>(i), bc_ids);
1331 for (
const auto &
id : bc_ids)
1334 neighbor_i = pb->
neighbor(
id, point_locator,
this, i);
1341 neighbor_i = neighbor_i->
parent();
1399 const Elem * elem =
this;
1407 for (elem =
this; !elem->active();
1408 elem = elem->parent())
1421 elem = elem->parent();
1429 for (; elem != nn; elem = elem->
parent())
1445 (my_parent->
dim() == this->
dim()))
1464 libmesh_assert_less_equal (neigh->
level(), this->
level());
1493 std::vector<Elem *> neigh_family;
1494 #ifdef LIBMESH_ENABLE_AMR 1499 neigh_family.push_back(neigh);
1502 for (
auto & neigh_family_member : neigh_family)
1505 if (this->
subactive() && !neigh_family_member->subactive())
1515 #ifdef LIBMESH_ENABLE_AMR 1517 (neigh_family_member->neighbor_ptr(nn)->active() ||
1518 neigh_family_member->neighbor_ptr(nn)->is_ancestor_of(
this))) ||
1519 (neigh_family_member->neighbor_ptr(nn) ==
remote_elem) ||
1521 (this->
parent() !=
nullptr) &&
1522 (neigh_family_member->neighbor_ptr(nn) == this->
parent())));
1524 libmesh_assert((neigh_family_member->neighbor_ptr(nn) ==
this) ||
1525 (neigh_family_member->neighbor_ptr(nn) ==
remote_elem));
1528 neigh_family_member->set_neighbor(nn,
this);
1538 #if defined(LIBMESH_ENABLE_AMR) && defined(DEBUG) 1551 libmesh_assert_greater_equal (this->
level(), neigh->level());
1553 if (this->
level() == neigh->level() &&
1554 neigh->has_neighbor(
this))
1556 #ifdef LIBMESH_ENABLE_AMR 1559 std::vector<Elem *> family;
1560 neigh->total_family_tree_by_neighbor (family,
this);
1564 for (
auto & n : family)
1569 unsigned int my_s = n->which_neighbor_am_i(
this);
1570 libmesh_assert_less (my_s, n->n_neighbors());
1571 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1572 n->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1575 unsigned int my_s = neigh->which_neighbor_am_i(
this);
1576 libmesh_assert_less (my_s, neigh->n_neighbors());
1577 libmesh_assert_equal_to (neigh->neighbor_ptr(my_s),
this);
1578 neigh->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1581 #ifdef LIBMESH_ENABLE_AMR 1584 else if (neigh->has_children())
1595 while (!neigh->has_neighbor(my_ancestor))
1597 my_ancestor = my_ancestor->parent();
1603 std::vector<Elem *> family;
1604 neigh->total_family_tree_by_subneighbor (family, my_ancestor,
this);
1606 for (
auto & n : family)
1611 unsigned int my_s = n->which_neighbor_am_i(
this);
1612 libmesh_assert_less (my_s, n->n_neighbors());
1613 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1615 n->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1622 #ifdef LIBMESH_ENABLE_AMR 1629 this->
dim() == my_parent->
dim())
1632 libmesh_assert_equal_to (my_parent->
child_ptr(me),
this);
1644 #ifdef LIBMESH_ENABLE_AMR 1655 libmesh_assert_greater_equal (this->
level(), neigh->level());
1657 if (this->
level() == neigh->level() &&
1658 neigh->has_neighbor(
this))
1660 #ifdef LIBMESH_ENABLE_AMR 1663 std::vector<Elem *> family;
1664 neigh->total_family_tree_by_neighbor (family,
this);
1666 for (
auto & n : family)
1671 unsigned int my_s = n->which_neighbor_am_i(
this);
1672 libmesh_assert_less (my_s, n->n_neighbors());
1673 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1674 n->set_neighbor(my_s,
nullptr);
1677 unsigned int my_s = neigh->which_neighbor_am_i(
this);
1678 libmesh_assert_less (my_s, neigh->n_neighbors());
1679 libmesh_assert_equal_to (neigh->neighbor_ptr(my_s),
this);
1680 neigh->set_neighbor(my_s,
nullptr);
1683 #ifdef LIBMESH_ENABLE_AMR 1686 else if (neigh->has_children())
1697 while (!neigh->has_neighbor(my_ancestor))
1699 my_ancestor = my_ancestor->parent();
1705 std::vector<Elem *> family;
1706 neigh->total_family_tree_by_subneighbor (family, my_ancestor,
this);
1708 for (
auto & n : family)
1713 unsigned int my_s = n->which_neighbor_am_i(
this);
1714 libmesh_assert_less (my_s, n->n_neighbors());
1715 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1716 n->set_neighbor(my_s,
nullptr);
1723 #ifdef LIBMESH_ENABLE_AMR 1744 std::vector<dof_id_type> conn;
1749 std::copy(conn.begin(),
1751 std::ostream_iterator<dof_id_type>(out_stream,
" "));
1761 out_stream << this->
node_id(i)+1 <<
"\t";
1768 libmesh_error_msg(
"Unsupported IO package " << iop);
1782 if (this->
dim() < 2)
1785 std::vector<Real> edge_lengths(this->
n_edges());
1791 std::minmax_element(edge_lengths.begin(), edge_lengths.end());
1804 if (this->
dim() < 2)
1808 Real min_angle = std::numeric_limits<Real>::max();
1809 Real max_angle = -std::numeric_limits<Real>::max();
1819 auto N = adjacent_edge_ids.size();
1824 for (
unsigned int first = 0; first < N-1; ++first)
1825 for (
unsigned int second = first+1; second < N; ++second)
1828 auto first_edge = adjacent_edge_ids[first];
1829 auto second_edge = adjacent_edge_ids[second];
1838 if (first_edge_node_0 != n)
1839 std::swap(first_edge_node_0, first_edge_node_1);
1840 if (second_edge_node_0 != n)
1841 std::swap(second_edge_node_0, second_edge_node_1);
1843 libmesh_assert_equal_to(first_edge_node_0, n);
1844 libmesh_assert_equal_to(second_edge_node_0, n);
1848 first_ev = this->
point(first_edge_node_1) - this->
point(first_edge_node_0),
1849 second_ev = this->
point(second_edge_node_1) - this->
point(second_edge_node_0);
1852 Real theta = std::acos(first_ev.
unit() * second_ev.
unit());
1855 min_angle = std::min(theta, min_angle);
1856 max_angle = std::max(theta, max_angle);
1868 if (this->
dim() < 3)
1872 Real min_angle = std::numeric_limits<Real>::max();
1873 Real max_angle = -std::numeric_limits<Real>::max();
1892 libmesh_assert_equal_to(adjacent_side_ids.size(), 2);
1895 const auto side_0_node_ids = this->
nodes_on_side(adjacent_side_ids[0]);
1896 const auto side_1_node_ids = this->
nodes_on_side(adjacent_side_ids[1]);
1899 libmesh_assert_greater_equal(side_0_node_ids.size(), 3);
1900 libmesh_assert_greater_equal(side_1_node_ids.size(), 3);
1903 const auto side_0_normal =
1904 (this->
point(side_0_node_ids[2]) - this->
point(side_0_node_ids[0])).cross
1905 (this->
point(side_0_node_ids[1]) - this->
point(side_0_node_ids[0])).unit();
1906 const auto side_1_normal =
1907 (this->
point(side_1_node_ids[2]) - this->
point(side_1_node_ids[0])).cross
1908 (this->
point(side_1_node_ids[1]) - this->
point(side_1_node_ids[0])).unit();
1915 Real theta = std::acos(std::abs(side_0_normal * side_1_normal));
1918 min_angle = std::min(theta, min_angle);
1919 max_angle = std::max(theta, max_angle);
1931 const auto N = this->
dim();
1936 Real min_node_area = std::numeric_limits<Real>::max();
1951 if (adjacent_edge_ids.size() != N)
1955 std::vector<Point> oriented_edges(N);
1961 std::swap(node_0, node_1);
1962 oriented_edges[i] = this->
point(node_1) - this->
point(node_0);
1969 Real node_area = (N == 2) ?
1970 cross_norm(oriented_edges[0], oriented_edges[1]) :
1971 std::abs(
triple_product(oriented_edges[0], oriented_edges[1], oriented_edges[2]));
1979 Real len_i = oriented_edges[i].norm();
1980 node_area = (len_i == 0.) ? 0. : (node_area / len_i);
1984 min_node_area = std::min(node_area, min_node_area);
1987 return min_node_area;
1993 libmesh_do_once( libmesh_here();
1997 <<
" not implemented on element type " 2012 #ifdef LIBMESH_ENABLE_AMR 2015 const bool is_ancestor =
2042 #ifdef LIBMESH_ENABLE_AMR 2050 _children = std::make_unique<Elem *[]>(nc);
2052 for (
unsigned int c = 0; c != nc; c++)
2056 for (
unsigned int c = 0; c != nc; c++)
2060 libmesh_assert_equal_to (
this, elem->
parent());
2066 libmesh_error_msg(
"Error: Tried to add a child to an element with full children array");
2076 _children = std::make_unique<Elem *[]>(nc);
2078 for (
unsigned int i = 0; i != nc; i++)
2186 const Elem * neighbor,
2204 const Elem * neighbor,
2222 const Elem * neighbor,
2223 const Elem * subneighbor,
2242 const Elem * neighbor,
2243 const Elem * subneighbor,
2262 const Elem * neighbor,
2280 const Elem * neighbor,
2287 mesh, point_locator, pb,
2301 mesh, point_locator, pb,
2307 const unsigned int e)
const 2310 libmesh_assert_less (e, this->
n_edges());
2317 return (child_edge->node_id(0) == my_edge->node_id(0) ||
2318 child_edge->node_id(1) == my_edge->node_id(1));
2324 unsigned int current_min)
const 2331 return std::min(current_min, this->
p_level());
2338 if (current_min <= this->
p_level())
2341 unsigned int min_p_level = current_min;
2346 c.min_p_level_by_neighbor(neighbor_in, min_p_level);
2353 unsigned int current_min)
const 2361 unsigned int new_p_level = this->
p_level();
2366 libmesh_assert_greater (new_p_level, 0);
2369 return std::min(current_min, new_p_level);
2374 unsigned int min_p_level = current_min;
2379 c.min_new_p_level_by_neighbor(neighbor_in, min_p_level);
2387 unsigned int child_node)
const 2390 libmesh_assert_less(child, nc);
2394 std::vector<std::vector<std::vector<signed char>>> &
2403 if (em_vers >= cached_parent_indices.size())
2404 cached_parent_indices.resize(em_vers+1);
2406 if (child >= cached_parent_indices[em_vers].size())
2408 const signed char nn = cast_int<signed char>(this->
n_nodes());
2410 cached_parent_indices[em_vers].resize(nc);
2412 for (
unsigned int c = 0; c != nc; ++c)
2415 cached_parent_indices[em_vers][c].resize(ncn);
2416 for (
unsigned int cn = 0; cn != ncn; ++cn)
2418 for (
signed char n = 0; n != nn; ++n)
2424 cached_parent_indices[em_vers][c][cn] = n;
2430 cached_parent_indices[em_vers][c][cn] =
2437 libmesh_assert_not_equal_to (n+1, nn);
2443 const signed char cache_val =
2444 cached_parent_indices[em_vers][child][child_node];
2445 if (cache_val == -1)
2448 return cached_parent_indices[em_vers][child][child_node];
2453 const std::vector<std::pair<unsigned char, unsigned char>> &
2455 unsigned int child_node)
const 2459 std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char>>>>> &
2468 if (cached_bracketing_nodes.size() <= em_vers)
2469 cached_bracketing_nodes.resize(em_vers+1);
2475 if (cached_bracketing_nodes[em_vers].size() < nc)
2486 libmesh_assert_equal_to
2493 std::unique_ptr<Elem> full_elem =
Elem::build(full_type);
2498 libmesh_assert_equal_to(em_vers, 0);
2504 full_elem->parent_bracketing_nodes(0,0);
2513 cached_bracketing_nodes =
2514 full_elem->_get_bracketing_node_cache();
2517 return cached_bracketing_nodes[em_vers][child][child_node];
2520 cached_bracketing_nodes[em_vers].resize(nc);
2522 const unsigned int nn = this->
n_nodes();
2525 for (
unsigned int c = 0; c != nc; ++c)
2529 cached_bracketing_nodes[em_vers][c].resize(ncn);
2532 for (
unsigned int n = 0; n != ncn; ++n)
2538 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
2547 for (
unsigned int pn = 0; pn != nn; ++pn)
2552 libmesh_assert_not_equal_to (em_val, 1);
2559 for (
unsigned int n1 = 0; n1 != ncn; ++n1)
2564 unsigned int parent_n1 =
2572 for (
unsigned int n2 = n1+1; n2 < nn; ++n2)
2577 unsigned int parent_n2 =
2585 Point pmid = (p1 + p2)/2;
2587 if (pmid == bracketed_pt)
2589 cached_bracketing_nodes[em_vers][c][n].emplace_back(parent_n1, parent_n2);
2610 for (
unsigned int pn = 0; pn != nn; ++pn)
2615 libmesh_assert_not_equal_to (em_val, 1);
2624 for (
unsigned int n1 = 0; n1 != nn; ++n1)
2626 if (n1 == parent_node)
2631 for (
unsigned int n2 = n1+1; n2 < nn; ++n2)
2633 if (n2 == parent_node)
2638 if (pmid == bracketed_pt)
2640 cached_bracketing_nodes[em_vers][c][n].emplace_back(n1, n2);
2652 return cached_bracketing_nodes[em_vers][child][child_node];
2656 const std::vector<std::pair<dof_id_type, dof_id_type>>
2658 unsigned int child_node)
const 2660 std::vector<std::pair<dof_id_type, dof_id_type>> returnval;
2662 const std::vector<std::pair<unsigned char, unsigned char>> & pbc =
2665 for (
const auto & pb : pbc)
2667 const unsigned short n_n = this->
n_nodes();
2668 if (pb.first < n_n && pb.second < n_n)
2669 returnval.emplace_back(this->
node_id(pb.first), this->node_id(pb.second));
2674 libmesh_assert_not_equal_to
2677 libmesh_assert_equal_to
2686 std::unique_ptr<Elem> full_elem =
Elem::build(full_type);
2696 for (
unsigned int c=0; c <= child; ++c)
2699 if (c == child && n == child_node)
2702 if (pb.first == full_elem->as_parent_node(c,n))
2711 if (pb.second == full_elem->as_parent_node(c,n))
2740 returnval.emplace_back(pt1, pt2);
2746 #endif // #ifdef LIBMESH_ENABLE_AMR 2761 <<
"WARNING: Resizing bounding box to match user-specified tolerance!\n" 2762 <<
"In the future, calls to Elem::contains_point() with tol > TOLERANCE\n" 2763 <<
"will be more optimized, but should not be used\n" 2764 <<
"to search for points 'close to' elements!\n" 2765 <<
"Instead, use Elem::close_to_point() for this purpose.\n" 2790 libmesh_assert_greater (box_tol, 0.);
2791 libmesh_assert_greater (map_tol, 0.);
2801 point_above_min_z =
false,
2802 point_below_max_z =
false,
2805 point_above_min_y =
false,
2806 point_below_max_y =
false,
2808 point_above_min_x =
false,
2809 point_below_max_x =
false;
2816 point_above_min_x = point_above_min_x || (n(0) - my_hmax*box_tol <= p(0));
2817 point_below_max_x = point_below_max_x || (n(0) + my_hmax*box_tol >= p(0));
2819 point_above_min_y = point_above_min_y || (n(1) - my_hmax*box_tol <= p(1));
2820 point_below_max_y = point_below_max_y || (n(1) + my_hmax*box_tol >= p(1));
2823 point_above_min_z = point_above_min_z || (n(2) - my_hmax*box_tol <= p(2));
2824 point_below_max_z = point_below_max_z || (n(2) + my_hmax*box_tol >= p(2));
2830 !point_above_min_z ||
2831 !point_below_max_z ||
2834 !point_above_min_y ||
2835 !point_below_max_y ||
2837 !point_above_min_x ||
2858 if (this->
dim() < 3)
2871 if (dist > this->
hmax() * map_tol)
2889 qnodal.allow_nodal_pyramid_quadrature =
true;
2891 auto & qp = qnodal.get_points();
2892 libmesh_assert_equal_to(qp.size(), this->
n_nodes());
2894 std::vector<Point> one_point(1);
2895 std::vector<Real> one_weight(1,1);
2901 one_point[0] = qp[i];
2925 std::ostringstream oss;
2927 oss <<
" Elem Information" <<
'\n' 2935 #ifdef LIBMESH_ENABLE_UNIQUE_ID 2936 oss <<
", unique_id()=";
2944 oss <<
", processor_id()=" << this->
processor_id() <<
'\n';
2947 <<
" dim()=" << this->
dim() <<
'\n' 2948 <<
" n_nodes()=" << this->
n_nodes() <<
'\n';
2954 oss <<
" " << n << this->
node_ref(n);
2957 const unsigned char datum_index = this->
mapping_data();
2958 oss <<
" weight=" <<
2963 oss <<
" n_sides()=" << this->
n_sides() <<
'\n';
2967 oss <<
" neighbor(" << s <<
")=";
2976 oss <<
" hmin()=" << this->
hmin()
2977 <<
", hmax()=" << this->
hmax() <<
'\n' 2978 <<
" volume()=" << this->
volume() <<
'\n';
2980 oss <<
" active()=" << this->
active()
2981 <<
", ancestor()=" << this->
ancestor()
2982 <<
", subactive()=" << this->
subactive()
2986 oss << this->
parent()->
id() <<
'\n';
2989 oss <<
" level()=" << this->
level()
2990 <<
", p_level()=" << this->
p_level() <<
'\n' 2991 #ifdef LIBMESH_ENABLE_AMR 2995 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 2996 <<
" infinite()=" << this->
infinite() <<
'\n';
2998 oss <<
" origin()=" << this->
origin() <<
'\n' 3006 oss <<
'(' << s <<
'/' << v <<
'/' << this->
dof_number(s,v,c) <<
") ";
3021 if (current_neighbor && current_neighbor !=
remote_elem)
3026 if (current_neighbor->
level() == this->
level())
3029 libmesh_assert_less (w_n_a_i, current_neighbor->
n_neighbors());
3049 const unsigned int)
const 3057 std::pair<unsigned short int, unsigned short int>
3061 return std::pair<unsigned short int, unsigned short int>(0,0);
3110 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3136 const bool full_ordered)
3262 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3311 libmesh_error_msg(
"No second order equivalent element type for et = " 3379 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3398 #endif // LIBMESH_ENABLE_INFINITE_ELEMENTS 3403 libmesh_error_msg(
"No complete order equivalent element type for et = " 3443 fe->get_fe_map().set_jacobian_tolerance(std::numeric_limits<Real>::lowest());
3445 const std::vector<Real> & JxW = fe->get_JxW();
3451 fe->attach_quadrature_rule(&qrule);
3456 for (
auto jxw : JxW)
3470 unsigned int n_points = this->
n_nodes();
3471 for (
unsigned int p=0; p != n_points; ++p)
3472 for (
unsigned d=0; d<LIBMESH_DIM; ++d)
3475 if (pmin(d) > pt(d))
3478 if (pmax(d) < pt(d))
3488 unsigned int n)
const 3490 #ifdef LIBMESH_ENABLE_AMR 3492 unsigned int my_n_vertices = this->
n_vertices();
3493 for (
unsigned int n_parent = 0; n_parent != my_n_vertices;
3503 libmesh_error_msg(
"ERROR: AMR disabled, how did we get here?");
3514 libmesh_not_implemented();
3520 const unsigned int )
const 3523 libmesh_not_implemented();
3529 libmesh_assert_less (side, this->
n_sides());
3538 std::vector<boundary_id_type> ids1, ids2;
3544 boundary_info->
add_side(
this, s2, ids1);
3546 boundary_info->
add_side(
this, s1, ids2);
3554 std::vector<boundary_id_type> ids1, ids2;
3560 boundary_info->
add_edge(
this, e2, ids1);
3562 boundary_info->
add_edge(
this, e1, ids2);
3568 switch (this->
dim())
3583 libmesh_error_msg(
"impossible element dimension " << std::to_string(this->
dim()));
3591 libmesh_assert_less (i, this->
n_edges());
3600 libmesh_assert_less (i, this->
n_faces());
3606 const unsigned int N = side_i->n_sides();
3608 const std::vector<unsigned int> nodes = this->
nodes_on_side(i);
3610 auto cmp = [&](
const unsigned int & m,
const unsigned int & n) ->
bool 3614 std::min_element(nodes.begin(), nodes.begin() + N, cmp));
3616 return cmp(nodes[(V + N - 1) % N], nodes[(V + 1) % N]);
virtual Point true_centroid() 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, bool reset=true) const
Same as the active_family_tree_by_neighbor() member, but the neighbor here may be a topological (e...
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
bool has_neighbor(const Elem *elem) const
unsigned char mapping_data() const
virtual bool is_vertex_on_parent(unsigned int c, unsigned int n) const
static const Order type_to_default_order_map[INVALID_ELEM]
This array maps the integer representation of the ElemType enum to the default approximation order of...
RefinementState refinement_flag() const
ElemType
Defines an enum for geometric element types.
void swap2boundaryedges(unsigned short e1, unsigned short e2, BoundaryInfo *boundary_info) const
Swaps two edges in boundary_info, if it is non-null.
void total_family_tree(T elem, std::vector< T > &family, bool reset)
dof_id_type dof_number(const unsigned int s, const unsigned int var, const unsigned int comp) const
void write_connectivity(std::ostream &out, const IOPackage iop) const
Writes the element connectivity for various IO packages to the passed ostream "out".
const Elem * parent() const
void add_scaled(const TypeVector< T2 > &, const T &)
Add a scaled value to this vector without creating a temporary.
virtual const std::vector< std::pair< dof_id_type, dof_id_type > > bracketing_nodes(unsigned int c, unsigned int n) const
Order
defines an enum for polynomial orders.
void print_info(std::ostream &os=libMesh::out) const
Prints relevant information about the element.
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...
void remove_edge(const Elem *elem, const unsigned short int edge)
Removes all boundary conditions associated with edge edge of element elem, if any exist...
A Node is like a Point, but with more information.
Node ** _nodes
Pointers to the nodes we are connected to.
virtual std::vector< unsigned int > sides_on_edge(const unsigned int) const =0
static ElemType complete_order_equivalent_type(const ElemType et)
virtual Point origin() const
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
unsigned int n_comp(const unsigned int s, const unsigned int var) const
virtual void compute_map(const unsigned int dim, const std::vector< Real > &qw, const Elem *elem, bool calculate_d2phi)
Compute the jacobian and some other additional data fields.
std::string get_info() const
Prints relevant information about the element to a string.
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...
void find_interior_neighbors(T this_elem, std::set< T > &neighbor_set)
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
void total_family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)
This class implements nodal quadrature rules for various element types.
IntRange< unsigned short > side_index_range() const
void libmesh_assert_valid_node_pointers() const
Checks for a valid id and pointers to nodes with valid ids on this element.
void active_family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)
virtual dof_id_type key() const
static constexpr Real TOLERANCE
static Point inverse_map(const unsigned int dim, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true, const bool extra_checks=true)
void active_family_tree(T elem, std::vector< T > &active_family, bool reset=true)
We're using a class instead of a typedef to allow forward declarations and future flexibility...
virtual unsigned int embedding_matrix_version() const
unsigned int which_side_am_i(const Elem *e) const
This function tells you which side the boundary element e is.
T cross_norm(const TypeVector< T > &b, const TypeVector< T > &c)
Calls cross_norm_sq() and takes the square root of the result.
RefinementState p_refinement_flag() const
IOPackage
libMesh interfaces with several different software packages for the purposes of creating, reading, and writing mesh files.
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 eleme...
static const unsigned int type_to_dim_map[INVALID_ELEM]
This array maps the integer representation of the ElemType enum to the geometric dimension of the ele...
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.
Threads::spin_mutex parent_indices_mutex
void active_family_tree_by_side(T elem, std::vector< T > &family, unsigned int side, bool reset=true)
void family_tree(std::vector< const Elem *> &family, bool reset=true) const
Fills the vector family with the children of this element, recursively.
This is the base class from which all geometric element types are derived.
PeriodicBoundaryBase * boundary(boundary_id_type id)
void add_child(Elem *elem)
Adds a child pointer to the array of children of this element.
virtual BoundingBox loose_bounding_box() const
virtual bool on_reference_element(const Point &p, const Real eps=TOLERANCE) const =0
unsigned int min_new_p_level_by_neighbor(const Elem *neighbor, unsigned int current_min) const
virtual bool is_node_on_side(const unsigned int n, const unsigned int s) const =0
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.
unique_id_type unique_id() const
void swap2boundarysides(unsigned short s1, unsigned short s2, BoundaryInfo *boundary_info) const
Swaps two sides in boundary_info, if it is non-null.
Order default_quadrature_order() const
virtual unsigned int n_children() const =0
unsigned int p_level() const
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 ...
side_iterator boundary_sides_end()
void boundary_ids(const Node *node, std::vector< boundary_id_type > &vec_to_fill) const
Fills a user-provided std::vector with the boundary ids associated with Node node.
void make_links_to_me_remote()
Resets this element's neighbors' appropriate neighbor pointers and its parent's and children's approp...
The libMesh namespace provides an interface to certain functionality in the library.
virtual Real hmax() const
Real distance(const Point &p)
unsigned int min_p_level_by_neighbor(const Elem *neighbor, unsigned int current_min) const
void set_interior_parent(Elem *p)
Sets the pointer to the element's interior_parent.
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...
bool contains_vertex_of(const Elem *e, bool mesh_connection=false) const
uint8_t processor_id_type
This is the MeshBase class.
SimpleRange< ChildRefIter > child_ref_range()
Returns a range with all children of a parent element, usable in range-based for loops.
void add(const TypeVector< T2 > &)
Add to this vector without creating a temporary.
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()
Iterator accessor functions.
virtual Real embedding_matrix(const unsigned int child_num, const unsigned int child_node_num, const unsigned int parent_node_num) const =0
uint32_t hashword(const uint32_t *k, size_t length, uint32_t initval=0)
The hashword function takes an array of uint32_t's of length 'length' and computes a single key from ...
T triple_product(const TypeVector< T > &a, const TypeVector< T > &b, const TypeVector< T > &c)
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.
void replace_child(Elem *elem, unsigned int c)
Replaces the child pointer at the specified index in the child array.
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.
TypeVector< T > unit() const
void libmesh_ignore(const Args &...)
static const subdomain_id_type invalid_subdomain_id
A static integral constant representing an invalid subdomain id.
void remove_links_to_me()
Resets this element's neighbors' appropriate neighbor pointers and its parent's and children's approp...
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 stat...
virtual bool contains_point(const Point &p, Real tol=TOLERANCE) const
Real length(const unsigned int n1, const unsigned int n2) const
ElemMappingType mapping_type() const
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 ...
const Node & node_ref(const unsigned int i) const
void family_tree_by_neighbor(T elem, std::vector< T > &family, T neighbor_in, bool reset=true)
virtual Real hmin() const
virtual unsigned int n_nodes() const =0
virtual unsigned int local_side_node(unsigned int side, unsigned int side_node) const =0
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.
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...
unsigned int n_vars(const unsigned int s, const unsigned int vg) const
bool contains_edge_of(const Elem *e) const
unsigned int which_neighbor_am_i(const Elem *e) const
This function tells you which neighbor e is.
virtual unsigned int as_parent_node(unsigned int c, unsigned int n) const
virtual std::vector< unsigned int > edges_adjacent_to_node(const unsigned int) const =0
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
unsigned int n_systems() const
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
Elem ** _elemlinks
Pointers to this element's parent and neighbors, and for lower-dimensional elements' interior_parent...
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...
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 ...
The definition of the struct used for iterating over sides.
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.
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
The BoundaryInfo class contains information relevant to boundary conditions including storing faces...
void family_tree(T elem, std::vector< T > &family, bool reset=true)
static const dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Threads::spin_mutex parent_bracketing_nodes_mutex
const Elem * reference_elem() const
void libmesh_assert_valid_neighbors() const
Checks for consistent neighbor links on this element.
virtual bool is_remote() const
const std::vector< Real > & get_jacobian() const
bool valid_unique_id() const
This is the base class for point locators.
virtual unsigned int n_edges() const =0
ElemQuality
Defines an enum for element quality metrics.
virtual std::unique_ptr< Elem > disconnected_clone() const
virtual unsigned int n_second_order_adjacent_vertices(const unsigned int n) const
bool absolute_fuzzy_equals(const TypeVector< T > &rhs, Real tol=TOLERANCE) const
bool positive_edge_orientation(const unsigned int i) const
void set_neighbor(const unsigned int i, Elem *n)
Assigns n as the neighbor.
static ElemType second_order_equivalent_type(const ElemType et, const bool full_ordered=true)
unsigned int which_child_am_i(const Elem *e) const
std::string enum_to_string(const T e)
void init_reference_to_physical_map(const std::vector< Point > &qp, const Elem *elem)
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...
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.
SimpleRange< NodeRefIter > node_ref_range()
Returns a range with all nodes of an element, usable in range-based for loops.
Defines a Cartesian bounding box by the two corner extremum.
virtual unsigned int n_sides() const =0
bool topologically_equal(const Elem &rhs) const
const Elem * neighbor_ptr(unsigned int i) const
void remove_side(const Elem *elem, const unsigned short int side)
Removes all boundary conditions associated with side side of element elem, if any exist...
void family_tree_by_subneighbor(T elem, std::vector< T > &family, T neighbor_in, T subneighbor, bool reset=true)
virtual bool close_to_point(const Point &p, Real tol) const
unsigned int level() 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 bool is_singular_node(unsigned int) const
virtual unsigned short dim() const =0
const Node * node_ptr(const unsigned int i) const
virtual bool is_vertex(const unsigned int i) const =0
static Point map(const unsigned int dim, const Elem *elem, const Point &reference_point)
virtual Point master_point(const unsigned int i) const =0
static std::unique_ptr< Elem > build_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 ...
unsigned int n_neighbors() const
virtual Real quality(const ElemQuality q) const
void add_side(const dof_id_type elem, const unsigned short int side, const boundary_id_type id)
Add side side of element number elem with boundary id id to the boundary information data structure...
virtual unsigned short int second_order_adjacent_vertex(const unsigned int n, const unsigned int v) const
virtual Real volume() const
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...
const Elem * neighbor(boundary_id_type boundary_id, const PointLocatorBase &point_locator, const Elem *e, unsigned int side, unsigned int *neigh_side=nullptr) const
This class implements specific orders of Gauss quadrature.
void set_child(unsigned int c, Elem *elem)
Sets the pointer to the child for this element.
virtual void connectivity(const unsigned int sc, const IOPackage iop, std::vector< dof_id_type > &conn) const =0
unsigned int size() const
Alias for n_points() to enable use in index_range.
virtual bool has_invertible_map(Real tol=TOLERANCE *TOLERANCE) const
IntRange< unsigned short > node_index_range() const
bool positive_face_orientation(const unsigned int i) const
unsigned int n_extra_integers() const
Returns how many extra integers are associated to the DofObject.
virtual bool is_vertex_on_child(unsigned int, unsigned int n) const
void edge_boundary_ids(const Elem *const elem, const unsigned short int edge, std::vector< boundary_id_type > &vec_to_fill) const
void find_point_neighbors(T this_elem, std::set< T > &neighbor_set, T start_elem)
void nullify_neighbors()
Replaces this element with nullptr for all of its neighbors.
SimpleRange< NeighborPtrIter > neighbor_ptr_range()
Returns a range with all neighbors of an element, usable in range-based for loops.
virtual unsigned int n_faces() const =0
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...
virtual bool infinite() const =0
FEFamily
defines an enum for finite element families.
virtual unsigned int n_sub_elem() const =0
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.
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.
virtual std::unique_ptr< Elem > build_edge_ptr(const unsigned int i)=0
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
Elem subclasses which don't do their own bracketing node calculations will need to supply a static ca...
virtual unsigned int opposite_side(const unsigned int s) const
void family_tree_by_side(T elem, std::vector< T > &family, unsigned int s, bool reset)
Class contained in FE that encapsulates mapping (i.e.
static ElemType first_order_equivalent_type(const ElemType et)
processor_id_type processor_id() const
virtual ElemType type() const =0
A Point defines a location in LIBMESH_DIM dimensional Real space.
dof_id_type node_id(const unsigned int i) const
const Point & point(const unsigned int i) const
virtual Point centroid() const
Calls Elem::vertex_average() for backwards compatibility.
bool operator==(const Elem &rhs) const
bool has_children() const
virtual unsigned int center_node_on_side(const unsigned short side) const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
std::unique_ptr< Elem *[]> _children
unique_ptr to array of this element's children.
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
const Elem & get(const ElemType type_in)
void total_family_tree_by_subneighbor(T elem, std::vector< T > &family, T neighbor_in, T subneighbor, bool reset=true)
virtual std::vector< unsigned int > nodes_on_side(const unsigned int) const =0
virtual unsigned int n_nodes_in_child(unsigned int) const
Point vertex_average() const
static const unsigned int max_n_nodes
The maximum number of nodes any element can contain.
const Elem * child_ptr(unsigned int i) const
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)
void add_edge(const dof_id_type elem, const unsigned short int edge, const boundary_id_type id)
Add edge edge of element number elem with boundary id id to the boundary information data structure...
static FEFamily map_fe_type(const Elem &elem)
virtual bool is_mid_infinite_edge_node(const unsigned int) const
Used to iterate over the sides of an element which are on the boundary of the Mesh.
bool is_internal(const unsigned int i) const
SideIter _first_side()
Side iterator helper functions.
const RemoteElem * remote_elem