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" 412 std::unique_ptr<Elem> returnval;
414 switch (this->
type())
417 returnval = std::make_unique<C0Polygon>(this->
n_sides());
424 returnval->set_id() = this->
id();
425 #ifdef LIBMESH_ENABLE_UNIQUE_ID 427 returnval->set_unique_id(this->
unique_id());
431 returnval->add_extra_integers(n_elem_ints);
432 for (
unsigned int i = 0; i != n_elem_ints; ++i)
433 returnval->set_extra_integer(i, this->get_extra_integer(i));
435 returnval->inherit_data_from(*
this);
449 return std::make_unique<NodeElem>(p);
453 return std::make_unique<Edge2>(p);
455 return std::make_unique<Edge3>(p);
457 return std::make_unique<Edge4>(p);
461 return std::make_unique<Tri3>(p);
463 return std::make_unique<TriShell3>(p);
465 return std::make_unique<Tri3Subdivision>(p);
467 return std::make_unique<Tri6>(p);
469 return std::make_unique<Tri7>(p);
471 return std::make_unique<Quad4>(p);
473 return std::make_unique<QuadShell4>(p);
475 return std::make_unique<Quad8>(p);
477 return std::make_unique<QuadShell8>(p);
479 return std::make_unique<Quad9>(p);
481 return std::make_unique<QuadShell9>(p);
485 return std::make_unique<C0Polygon>(6, p);
490 libmesh_not_implemented_msg
491 (
"Polyhedra cannot be built via Elem::build()");
495 return std::make_unique<Tet4>(p);
497 return std::make_unique<Tet10>(p);
499 return std::make_unique<Tet14>(p);
501 return std::make_unique<Hex8>(p);
503 return std::make_unique<Hex20>(p);
505 return std::make_unique<Hex27>(p);
507 return std::make_unique<Prism6>(p);
509 return std::make_unique<Prism15>(p);
511 return std::make_unique<Prism18>(p);
513 return std::make_unique<Prism20>(p);
515 return std::make_unique<Prism21>(p);
517 return std::make_unique<Pyramid5>(p);
519 return std::make_unique<Pyramid13>(p);
521 return std::make_unique<Pyramid14>(p);
523 return std::make_unique<Pyramid18>(p);
525 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 528 return std::make_unique<InfEdge2>(p);
532 return std::make_unique<InfQuad4>(p);
534 return std::make_unique<InfQuad6>(p);
538 return std::make_unique<InfHex8>(p);
540 return std::make_unique<InfHex16>(p);
542 return std::make_unique<InfHex18>(p);
544 return std::make_unique<InfPrism6>(p);
546 return std::make_unique<InfPrism12>(p);
618 #ifdef LIBMESH_ENABLE_AMR 619 elem_copy->set_p_level(0);
624 elem_copy->set_node(n,
_nodes[n]);
626 return elem_copy->true_centroid();
637 fe->attach_quadrature_rule(&qrule);
640 const auto & JxW = fe->get_JxW();
641 const auto & phi = fe->get_phi();
648 libmesh_assert_equal_to(N, this->
n_nodes());
651 std::vector<Real> V(N);
654 V[i] += JxW[qp] * phi[i][qp];
662 cp += this->
point(i) * V[i];
676 cp.
add (this->point(n));
692 Real h_min=std::numeric_limits<Real>::max();
694 for (
unsigned int n_outer=0; n_outer<
n_vertices; n_outer++)
695 for (
unsigned int n_inner=n_outer+1; n_inner<
n_vertices; n_inner++)
697 const auto diff = (this->
point(n_outer) - this->
point(n_inner));
699 h_min = std::min(h_min, diff.norm_sq());
702 return std::sqrt(h_min);
714 for (
unsigned int n_outer=0; n_outer<
n_vertices; n_outer++)
715 for (
unsigned int n_inner=n_outer+1; n_inner<
n_vertices; n_inner++)
717 const auto diff = (this->
point(n_outer) - this->
point(n_inner));
719 h_max = std::max(h_max, diff.norm_sq());
722 return std::sqrt(h_max);
728 const unsigned int n2)
const 730 libmesh_assert_less ( n1, this->
n_vertices() );
731 libmesh_assert_less ( n2, this->
n_vertices() );
733 return (this->
point(n1) - this->
point(n2)).norm();
740 const unsigned short n_n = this->
n_nodes();
742 std::array<dof_id_type, Elem::max_n_nodes> node_ids;
744 for (
unsigned short n=0; n != n_n; ++n)
745 node_ids[n] = this->
node_id(n);
749 std::sort (node_ids.begin(), node_ids.begin()+n_n);
762 const unsigned short n_n = this->
n_nodes();
763 libmesh_assert_equal_to(n_n, rhs.
n_nodes());
767 std::array<dof_id_type, Elem::max_n_nodes> this_ids, rhs_ids;
769 for (
unsigned short n = 0; n != n_n; n++)
771 this_ids[n] = this->
node_id(n);
776 std::sort(this_ids.begin(), this_ids.begin()+n_n);
777 std::sort(rhs_ids.begin(), rhs_ids.begin()+n_n);
780 for (
unsigned short n = 0; n != n_n; ++n)
781 if (this_ids[n] != rhs_ids[n])
842 std::set<const Elem *> point_neighbors;
846 for (
const auto & elem : point_neighbors)
847 if (elem->processor_id() == my_pid)
859 const unsigned int ns = this->
n_sides();
860 const unsigned int nn = this->
n_nodes();
862 const unsigned int en = e->
n_nodes();
865 std::vector<bool> might_be_side(ns,
true);
867 for (
unsigned int i=0; i != en; ++i)
876 for (
unsigned int j=0; j != nn; ++j)
877 if (this->
point(j) == side_point)
887 for (
unsigned int s=0; s != ns; ++s)
889 might_be_side[s] =
false;
892 for (
unsigned int s=0; s != ns; ++s)
893 if (might_be_side[s])
896 for (
unsigned int s2=s+1; s2 < ns; ++s2)
912 const unsigned int my_nv = this->
n_vertices();
920 if (&this->
node_ref(my_n) == vertex)
927 const unsigned int l = this->
level();
928 const unsigned int el = e->
level();
948 unsigned int num_contained_edges = 0;
955 num_contained_edges++;
956 if (num_contained_edges>=2)
968 std::set<const Elem *> & neighbor_set)
const 973 neighbor_set.clear();
974 neighbor_set.insert(
this);
976 std::set<const Elem *> untested_set, next_untested_set;
977 untested_set.insert(
this);
979 #ifdef LIBMESH_ENABLE_AMR 980 std::vector<const Elem *> active_neighbor_children;
981 #endif // #ifdef LIBMESH_ENABLE_AMR 983 while (!untested_set.empty())
987 for (
const auto & elem : untested_set)
988 for (
auto current_neighbor : elem->neighbor_ptr_range())
990 if (current_neighbor &&
993 if (current_neighbor->active())
995 auto it = neighbor_set.lower_bound(current_neighbor);
996 if ((it == neighbor_set.end() || *it != current_neighbor) &&
997 current_neighbor->contains_point(p))
1000 next_untested_set.insert(current_neighbor);
1001 neighbor_set.emplace_hint(it, current_neighbor);
1004 #ifdef LIBMESH_ENABLE_AMR 1008 active_neighbor_children.clear();
1009 current_neighbor->active_family_tree_by_neighbor
1010 (active_neighbor_children, elem);
1012 for (
const auto & current_child : active_neighbor_children)
1014 auto it = neighbor_set.lower_bound(current_child);
1015 if ((it == neighbor_set.end() || *it != current_child) &&
1016 current_child->contains_point(p))
1019 next_untested_set.insert(current_child);
1020 neighbor_set.emplace_hint(it, current_child);
1024 #endif // #ifdef LIBMESH_ENABLE_AMR 1027 untested_set.swap(next_untested_set);
1028 next_untested_set.clear();
1042 const Elem * start_elem)
const 1059 std::set<const Elem *> & neighbor_set)
const 1068 std::set<const Elem *>::iterator it = neighbor_set.begin();
1069 const std::set<const Elem *>::iterator end = neighbor_set.end();
1075 if (!(*it)->contains_point(p2))
1076 it = neighbor_set.erase(it);
1086 neighbor_set.clear();
1087 neighbor_set.insert(
this);
1089 std::set<const Elem *> untested_set, next_untested_set;
1090 untested_set.insert(
this);
1092 while (!untested_set.empty())
1096 for (
const auto & elem : untested_set)
1098 for (
auto current_neighbor : elem->neighbor_ptr_range())
1100 if (current_neighbor &&
1103 if (current_neighbor->active())
1106 || current_neighbor->contains_edge_of(
this))
1109 if (!neighbor_set.count(current_neighbor))
1110 next_untested_set.insert (current_neighbor);
1113 neighbor_set.insert (current_neighbor);
1116 #ifdef LIBMESH_ENABLE_AMR 1120 std::vector<const Elem *> active_neighbor_children;
1122 current_neighbor->active_family_tree_by_neighbor
1123 (active_neighbor_children, elem);
1125 for (
const auto & current_child : active_neighbor_children)
1126 if (this->
contains_edge_of(current_child) || current_child->contains_edge_of(
this))
1129 if (!neighbor_set.count(current_child))
1130 next_untested_set.insert (current_child);
1132 neighbor_set.insert (current_child);
1135 #endif // #ifdef LIBMESH_ENABLE_AMR 1139 untested_set.swap(next_untested_set);
1140 next_untested_set.clear();
1163 if (this->
dim() >= LIBMESH_DIM)
1184 (interior_p->
dim() > this->
dim()));
1197 (this->
level() == 0 &&
1208 if (this->
dim() >= LIBMESH_DIM)
1215 (interior_p->
dim() > this->
dim()));
1226 this->
dim() < LIBMESH_DIM);
1236 (p->
dim() > this->
dim()));
1243 #ifdef LIBMESH_ENABLE_PERIODIC 1253 if (neighbor_i !=
nullptr)
1261 std::vector<boundary_id_type> bc_ids;
1262 mesh.get_boundary_info().boundary_ids(
this, cast_int<unsigned short>(i), bc_ids);
1263 for (
const auto &
id : bc_ids)
1269 const Elem *
const cn = pb->
neighbor(
id, point_locator,
this, i);
1270 neighbor_i =
const_cast<Elem *
>(cn);
1277 neighbor_i = neighbor_i->
parent();
1295 if (neighbor_i !=
nullptr)
1303 std::vector<boundary_id_type> bc_ids;
1304 mesh.get_boundary_info().boundary_ids(
this, cast_int<unsigned short>(i), bc_ids);
1305 for (
const auto &
id : bc_ids)
1308 neighbor_i = pb->
neighbor(
id, point_locator,
this, i);
1315 neighbor_i = neighbor_i->
parent();
1373 const Elem * elem =
this;
1381 for (elem =
this; !elem->active();
1382 elem = elem->parent())
1395 elem = elem->parent();
1403 for (; elem != nn; elem = elem->
parent())
1419 (my_parent->
dim() == this->
dim()))
1437 const unsigned int this_level = this->
level();
1438 const unsigned int neigh_level = neigh->
level();
1441 libmesh_assert_less_equal (neigh_level, this_level);
1464 std::vector<Elem *> neigh_family;
1465 #ifdef LIBMESH_ENABLE_AMR 1468 neigh_family.push_back(neigh);
1472 std::unique_ptr<Elem> my_side, neigh_side;
1475 for (
auto & neigh_family_member : neigh_family)
1478 const bool member_subactive = neigh_family_member->subactive();
1479 if (this->
subactive() && !member_subactive)
1486 const unsigned int member_level = neigh_family_member->level();
1487 if (member_level < this_level)
1497 #ifdef LIBMESH_ENABLE_AMR 1499 (neigh_family_member->neighbor_ptr(nn)->active() ||
1501 neigh_family_member->neighbor_ptr(nn)->is_ancestor_of(
this))) ||
1502 (neigh_family_member->neighbor_ptr(nn) ==
remote_elem) ||
1504 (this->
parent() !=
nullptr) &&
1505 (neigh_family_member->neighbor_ptr(nn) == this->
parent())));
1507 libmesh_assert((neigh_family_member->neighbor_ptr(nn) ==
this) ||
1508 (neigh_family_member->neighbor_ptr(nn) ==
remote_elem));
1514 if (member_level > this_level)
1525 if (neigh_level < this_level &&
1526 member_level > neigh_level)
1531 neigh_family_member->side_ptr(neigh_side, nn);
1533 if (*my_side != *neigh_side)
1537 neigh_family_member->set_neighbor(nn,
this);
1547 #if defined(LIBMESH_ENABLE_AMR) && defined(DEBUG) 1560 libmesh_assert_greater_equal (this->
level(), neigh->level());
1562 if (this->
level() == neigh->level() &&
1563 neigh->has_neighbor(
this))
1565 #ifdef LIBMESH_ENABLE_AMR 1568 std::vector<Elem *> family;
1569 neigh->total_family_tree_by_neighbor (family,
this);
1573 for (
auto & n : family)
1578 unsigned int my_s = n->which_neighbor_am_i(
this);
1579 libmesh_assert_less (my_s, n->n_neighbors());
1580 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1581 n->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1584 unsigned int my_s = neigh->which_neighbor_am_i(
this);
1585 libmesh_assert_less (my_s, neigh->n_neighbors());
1586 libmesh_assert_equal_to (neigh->neighbor_ptr(my_s),
this);
1587 neigh->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1590 #ifdef LIBMESH_ENABLE_AMR 1593 else if (neigh->has_children())
1604 while (!neigh->has_neighbor(my_ancestor))
1606 my_ancestor = my_ancestor->parent();
1612 std::vector<Elem *> family;
1613 neigh->total_family_tree_by_subneighbor (family, my_ancestor,
this);
1615 for (
auto & n : family)
1620 unsigned int my_s = n->which_neighbor_am_i(
this);
1621 libmesh_assert_less (my_s, n->n_neighbors());
1622 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1624 n->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1631 #ifdef LIBMESH_ENABLE_AMR 1638 this->
dim() == my_parent->
dim())
1641 libmesh_assert_equal_to (my_parent->
child_ptr(me),
this);
1653 #ifdef LIBMESH_ENABLE_AMR 1664 libmesh_assert_greater_equal (this->
level(), neigh->level());
1666 if (this->
level() == neigh->level() &&
1667 neigh->has_neighbor(
this))
1669 #ifdef LIBMESH_ENABLE_AMR 1672 std::vector<Elem *> family;
1673 neigh->total_family_tree_by_neighbor (family,
this);
1675 for (
auto & n : family)
1680 unsigned int my_s = n->which_neighbor_am_i(
this);
1681 libmesh_assert_less (my_s, n->n_neighbors());
1682 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1683 n->set_neighbor(my_s,
nullptr);
1686 unsigned int my_s = neigh->which_neighbor_am_i(
this);
1687 libmesh_assert_less (my_s, neigh->n_neighbors());
1688 libmesh_assert_equal_to (neigh->neighbor_ptr(my_s),
this);
1689 neigh->set_neighbor(my_s,
nullptr);
1692 #ifdef LIBMESH_ENABLE_AMR 1695 else if (neigh->has_children())
1706 while (!neigh->has_neighbor(my_ancestor))
1708 my_ancestor = my_ancestor->parent();
1714 std::vector<Elem *> family;
1715 neigh->total_family_tree_by_subneighbor (family, my_ancestor,
this);
1717 for (
auto & n : family)
1722 unsigned int my_s = n->which_neighbor_am_i(
this);
1723 libmesh_assert_less (my_s, n->n_neighbors());
1724 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1725 n->set_neighbor(my_s,
nullptr);
1732 #ifdef LIBMESH_ENABLE_AMR 1753 std::vector<dof_id_type> conn;
1758 std::copy(conn.begin(),
1760 std::ostream_iterator<dof_id_type>(out_stream,
" "));
1770 out_stream << this->
node_id(i)+1 <<
"\t";
1777 libmesh_error_msg(
"Unsupported IO package " << iop);
1791 if (this->
dim() < 2)
1794 std::vector<Real> edge_lengths(this->
n_edges());
1800 std::minmax_element(edge_lengths.begin(), edge_lengths.end());
1813 if (this->
dim() < 2)
1817 Real min_angle = std::numeric_limits<Real>::max();
1818 Real max_angle = -std::numeric_limits<Real>::max();
1828 auto N = adjacent_edge_ids.size();
1833 for (
unsigned int first = 0; first < N-1; ++first)
1834 for (
unsigned int second = first+1; second < N; ++second)
1837 auto first_edge = adjacent_edge_ids[first];
1838 auto second_edge = adjacent_edge_ids[second];
1847 if (first_edge_node_0 != n)
1848 std::swap(first_edge_node_0, first_edge_node_1);
1849 if (second_edge_node_0 != n)
1850 std::swap(second_edge_node_0, second_edge_node_1);
1852 libmesh_assert_equal_to(first_edge_node_0, n);
1853 libmesh_assert_equal_to(second_edge_node_0, n);
1857 first_ev = this->
point(first_edge_node_1) - this->
point(first_edge_node_0),
1858 second_ev = this->
point(second_edge_node_1) - this->
point(second_edge_node_0);
1861 Real theta = std::acos(first_ev.
unit() * second_ev.
unit());
1864 min_angle = std::min(theta, min_angle);
1865 max_angle = std::max(theta, max_angle);
1877 if (this->
dim() < 3)
1881 Real min_angle = std::numeric_limits<Real>::max();
1882 Real max_angle = -std::numeric_limits<Real>::max();
1901 libmesh_assert_equal_to(adjacent_side_ids.size(), 2);
1904 const auto side_0_node_ids = this->
nodes_on_side(adjacent_side_ids[0]);
1905 const auto side_1_node_ids = this->
nodes_on_side(adjacent_side_ids[1]);
1908 libmesh_assert_greater_equal(side_0_node_ids.size(), 3);
1909 libmesh_assert_greater_equal(side_1_node_ids.size(), 3);
1912 const auto side_0_normal =
1913 (this->
point(side_0_node_ids[2]) - this->
point(side_0_node_ids[0])).cross
1914 (this->
point(side_0_node_ids[1]) - this->
point(side_0_node_ids[0])).unit();
1915 const auto side_1_normal =
1916 (this->
point(side_1_node_ids[2]) - this->
point(side_1_node_ids[0])).cross
1917 (this->
point(side_1_node_ids[1]) - this->
point(side_1_node_ids[0])).unit();
1924 Real theta = std::acos(std::abs(side_0_normal * side_1_normal));
1927 min_angle = std::min(theta, min_angle);
1928 max_angle = std::max(theta, max_angle);
1940 const auto N = this->
dim();
1945 Real min_node_area = std::numeric_limits<Real>::max();
1960 if (adjacent_edge_ids.size() != N)
1964 std::vector<Point> oriented_edges(N);
1970 std::swap(node_0, node_1);
1971 oriented_edges[i] = this->
point(node_1) - this->
point(node_0);
1978 Real node_area = (N == 2) ?
1979 cross_norm(oriented_edges[0], oriented_edges[1]) :
1980 std::abs(
triple_product(oriented_edges[0], oriented_edges[1], oriented_edges[2]));
1988 Real len_i = oriented_edges[i].norm();
1989 node_area = (len_i == 0.) ? 0. : (node_area / len_i);
1993 min_node_area = std::min(node_area, min_node_area);
1996 return min_node_area;
2002 libmesh_do_once( libmesh_here();
2006 <<
" not implemented on element type " 2021 #ifdef LIBMESH_ENABLE_AMR 2024 const bool is_ancestor =
2051 #ifdef LIBMESH_ENABLE_AMR 2059 _children = std::make_unique<Elem *[]>(nc);
2061 for (
unsigned int c = 0; c != nc; c++)
2065 for (
unsigned int c = 0; c != nc; c++)
2069 libmesh_assert_equal_to (
this, elem->
parent());
2075 libmesh_error_msg(
"Error: Tried to add a child to an element with full children array");
2085 _children = std::make_unique<Elem *[]>(nc);
2087 for (
unsigned int i = 0; i != nc; i++)
2213 const Elem * neighbor,
2231 const Elem * neighbor,
2249 const Elem * neighbor,
2250 const Elem * subneighbor,
2269 const Elem * neighbor,
2270 const Elem * subneighbor,
2289 const Elem * neighbor,
2307 const Elem * neighbor,
2314 mesh, point_locator, pb,
2328 mesh, point_locator, pb,
2334 const unsigned int e)
const 2337 libmesh_assert_less (e, this->
n_edges());
2344 return (child_edge->node_id(0) == my_edge->node_id(0) ||
2345 child_edge->node_id(1) == my_edge->node_id(1));
2351 unsigned int current_min)
const 2358 return std::min(current_min, this->
p_level());
2365 if (current_min <= this->
p_level())
2368 unsigned int min_p_level = current_min;
2373 c.min_p_level_by_neighbor(neighbor_in, min_p_level);
2380 unsigned int current_min)
const 2388 unsigned int new_p_level = this->
p_level();
2393 libmesh_assert_greater (new_p_level, 0);
2396 return std::min(current_min, new_p_level);
2401 unsigned int min_p_level = current_min;
2406 c.min_new_p_level_by_neighbor(neighbor_in, min_p_level);
2414 unsigned int child_node)
const 2417 libmesh_assert_less(child, nc);
2421 std::vector<std::vector<std::vector<signed char>>> &
2430 if (em_vers >= cached_parent_indices.size())
2431 cached_parent_indices.resize(em_vers+1);
2433 if (child >= cached_parent_indices[em_vers].size())
2435 const signed char nn = cast_int<signed char>(this->
n_nodes());
2437 cached_parent_indices[em_vers].resize(nc);
2439 for (
unsigned int c = 0; c != nc; ++c)
2442 cached_parent_indices[em_vers][c].resize(ncn);
2443 for (
unsigned int cn = 0; cn != ncn; ++cn)
2445 for (
signed char n = 0; n != nn; ++n)
2451 cached_parent_indices[em_vers][c][cn] = n;
2457 cached_parent_indices[em_vers][c][cn] =
2464 libmesh_assert_not_equal_to (n+1, nn);
2470 const signed char cache_val =
2471 cached_parent_indices[em_vers][child][child_node];
2472 if (cache_val == -1)
2475 return cached_parent_indices[em_vers][child][child_node];
2480 const std::vector<std::pair<unsigned char, unsigned char>> &
2482 unsigned int child_node)
const 2486 std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char>>>>> &
2495 if (cached_bracketing_nodes.size() <= em_vers)
2496 cached_bracketing_nodes.resize(em_vers+1);
2502 if (cached_bracketing_nodes[em_vers].size() < nc)
2513 libmesh_assert_equal_to
2520 std::unique_ptr<Elem> full_elem =
Elem::build(full_type);
2525 libmesh_assert_equal_to(em_vers, 0);
2531 full_elem->parent_bracketing_nodes(0,0);
2540 cached_bracketing_nodes =
2541 full_elem->_get_bracketing_node_cache();
2544 return cached_bracketing_nodes[em_vers][child][child_node];
2547 cached_bracketing_nodes[em_vers].resize(nc);
2549 const unsigned int nn = this->
n_nodes();
2552 for (
unsigned int c = 0; c != nc; ++c)
2556 cached_bracketing_nodes[em_vers][c].resize(ncn);
2559 for (
unsigned int n = 0; n != ncn; ++n)
2565 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
2574 for (
unsigned int pn = 0; pn != nn; ++pn)
2579 libmesh_assert_not_equal_to (em_val, 1);
2586 for (
unsigned int n1 = 0; n1 != ncn; ++n1)
2591 unsigned int parent_n1 =
2599 for (
unsigned int n2 = n1+1; n2 < nn; ++n2)
2604 unsigned int parent_n2 =
2612 Point pmid = (p1 + p2)/2;
2614 if (pmid == bracketed_pt)
2616 cached_bracketing_nodes[em_vers][c][n].emplace_back(parent_n1, parent_n2);
2637 for (
unsigned int pn = 0; pn != nn; ++pn)
2642 libmesh_assert_not_equal_to (em_val, 1);
2651 for (
unsigned int n1 = 0; n1 != nn; ++n1)
2653 if (n1 == parent_node)
2658 for (
unsigned int n2 = n1+1; n2 < nn; ++n2)
2660 if (n2 == parent_node)
2665 if (pmid == bracketed_pt)
2667 cached_bracketing_nodes[em_vers][c][n].emplace_back(n1, n2);
2679 return cached_bracketing_nodes[em_vers][child][child_node];
2683 const std::vector<std::pair<dof_id_type, dof_id_type>>
2685 unsigned int child_node)
const 2687 std::vector<std::pair<dof_id_type, dof_id_type>> returnval;
2689 const std::vector<std::pair<unsigned char, unsigned char>> & pbc =
2692 for (
const auto & pb : pbc)
2694 const unsigned short n_n = this->
n_nodes();
2695 if (pb.first < n_n && pb.second < n_n)
2696 returnval.emplace_back(this->
node_id(pb.first), this->node_id(pb.second));
2701 libmesh_assert_not_equal_to
2704 libmesh_assert_equal_to
2713 std::unique_ptr<Elem> full_elem =
Elem::build(full_type);
2723 for (
unsigned int c=0; c <= child; ++c)
2731 if (c == child && n == child_node)
2734 if (pb.first == full_elem->as_parent_node(c,n))
2743 if (pb.second == full_elem->as_parent_node(c,n))
2773 returnval.emplace_back(pt1, pt2);
2779 #endif // #ifdef LIBMESH_ENABLE_AMR 2794 <<
"WARNING: Resizing bounding box to match user-specified tolerance!\n" 2795 <<
"In the future, calls to Elem::contains_point() with tol > TOLERANCE\n" 2796 <<
"will be more optimized, but should not be used\n" 2797 <<
"to search for points 'close to' elements!\n" 2798 <<
"Instead, use Elem::close_to_point() for this purpose.\n" 2823 libmesh_assert_greater (box_tol, 0.);
2824 libmesh_assert_greater (map_tol, 0.);
2834 point_above_min_z =
false,
2835 point_below_max_z =
false,
2838 point_above_min_y =
false,
2839 point_below_max_y =
false,
2841 point_above_min_x =
false,
2842 point_below_max_x =
false;
2849 point_above_min_x = point_above_min_x || (n(0) - my_hmax*box_tol <= p(0));
2850 point_below_max_x = point_below_max_x || (n(0) + my_hmax*box_tol >= p(0));
2852 point_above_min_y = point_above_min_y || (n(1) - my_hmax*box_tol <= p(1));
2853 point_below_max_y = point_below_max_y || (n(1) + my_hmax*box_tol >= p(1));
2856 point_above_min_z = point_above_min_z || (n(2) - my_hmax*box_tol <= p(2));
2857 point_below_max_z = point_below_max_z || (n(2) + my_hmax*box_tol >= p(2));
2863 !point_above_min_z ||
2864 !point_below_max_z ||
2867 !point_above_min_y ||
2868 !point_below_max_y ||
2870 !point_above_min_x ||
2891 if (this->
dim() < 3)
2904 if (dist > this->
hmax() * map_tol)
2922 qnodal.allow_nodal_pyramid_quadrature =
true;
2924 auto & qp = qnodal.get_points();
2925 libmesh_assert_equal_to(qp.size(), this->
n_nodes());
2927 std::vector<Point> one_point(1);
2928 std::vector<Real> one_weight(1,1);
2934 one_point[0] = qp[i];
2958 std::ostringstream oss;
2960 oss <<
" Elem Information" <<
'\n' 2968 #ifdef LIBMESH_ENABLE_UNIQUE_ID 2969 oss <<
", unique_id()=";
2977 oss <<
", processor_id()=" << this->
processor_id() <<
'\n';
2980 <<
" dim()=" << this->
dim() <<
'\n' 2981 <<
" n_nodes()=" << this->
n_nodes() <<
'\n';
2987 oss <<
" " << n << this->
node_ref(n);
2990 const unsigned char datum_index = this->
mapping_data();
2991 oss <<
" weight=" <<
2996 oss <<
" n_sides()=" << this->
n_sides() <<
'\n';
3000 oss <<
" neighbor(" << s <<
")=";
3009 oss <<
" hmin()=" << this->
hmin()
3010 <<
", hmax()=" << this->
hmax() <<
'\n' 3011 <<
" volume()=" << this->
volume() <<
'\n';
3013 oss <<
" active()=" << this->
active()
3014 <<
", ancestor()=" << this->
ancestor()
3015 <<
", subactive()=" << this->
subactive()
3019 oss << this->
parent()->
id() <<
'\n';
3022 oss <<
" level()=" << this->
level()
3023 <<
", p_level()=" << this->
p_level() <<
'\n' 3024 #ifdef LIBMESH_ENABLE_AMR 3028 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3029 <<
" infinite()=" << this->
infinite() <<
'\n';
3031 oss <<
" origin()=" << this->
origin() <<
'\n' 3039 oss <<
'(' << s <<
'/' << v <<
'/' << this->
dof_number(s,v,c) <<
") ";
3054 if (current_neighbor && current_neighbor !=
remote_elem)
3059 if (current_neighbor->
level() == this->
level())
3062 libmesh_assert_less (w_n_a_i, current_neighbor->
n_neighbors());
3082 const unsigned int)
const 3090 std::pair<unsigned short int, unsigned short int>
3094 return std::pair<unsigned short int, unsigned short int>(0,0);
3143 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3169 const bool full_ordered)
3295 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3344 libmesh_error_msg(
"No second order equivalent element type for et = " 3412 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3431 #endif // LIBMESH_ENABLE_INFINITE_ELEMENTS 3436 libmesh_error_msg(
"No complete order equivalent element type for et = " 3476 fe->get_fe_map().set_jacobian_tolerance(std::numeric_limits<Real>::lowest());
3478 const std::vector<Real> & JxW = fe->get_JxW();
3484 fe->attach_quadrature_rule(&qrule);
3489 for (
auto jxw : JxW)
3503 unsigned int n_points = this->
n_nodes();
3504 for (
unsigned int p=0; p != n_points; ++p)
3505 for (
unsigned d=0; d<LIBMESH_DIM; ++d)
3508 if (pmin(d) > pt(d))
3511 if (pmax(d) < pt(d))
3521 unsigned int dim = this->
dim();
3522 const std::unique_ptr<const Elem> face = this->
build_side_ptr(s);
3523 std::unique_ptr<libMesh::FEBase> fe(
3525 fe->add_p_level_in_reinit(
false);
3526 const std::vector<Point> & normals = fe->get_normals();
3527 std::vector<Point> ref_side_vertex_average_v = {face->reference_elem()->vertex_average()};
3528 fe->reinit(
this, s,
TOLERANCE, &ref_side_vertex_average_v);
3533 unsigned int n)
const 3535 #ifdef LIBMESH_ENABLE_AMR 3537 unsigned int my_n_vertices = this->
n_vertices();
3538 for (
unsigned int n_parent = 0; n_parent != my_n_vertices;
3548 libmesh_error_msg(
"ERROR: AMR disabled, how did we get here?");
3559 libmesh_not_implemented();
3565 const unsigned int )
const 3568 libmesh_not_implemented();
3574 libmesh_assert_less (side, this->
n_sides());
3583 std::vector<boundary_id_type> ids1, ids2;
3589 boundary_info->
add_side(
this, s2, ids1);
3591 boundary_info->
add_side(
this, s1, ids2);
3599 std::vector<boundary_id_type> ids1, ids2;
3605 boundary_info->
add_edge(
this, e2, ids1);
3607 boundary_info->
add_edge(
this, e1, ids2);
3613 switch (this->
dim())
3628 libmesh_error_msg(
"impossible element dimension " << std::to_string(this->
dim()));
3636 libmesh_assert_less (i, this->
n_edges());
3645 libmesh_assert_less (i, this->
n_faces());
3652 const std::vector<unsigned int> nodes = this->
nodes_on_side(i);
3654 auto cmp = [&](
const unsigned int & m,
const unsigned int & n) ->
bool 3658 std::min_element(nodes.begin(), nodes.begin() + N, cmp));
3660 return cmp(nodes[(v - 1 + N) % N], nodes[(v + 1) % N]);
3666 libmesh_assert_less (e, this->
n_edges());
3667 libmesh_assert_less (s, this->
n_faces());
3673 for (v = 0; v < N; v++)
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.
bool is_ancestor_of(const Elem *descendant) const
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)
virtual ElemType side_type(const unsigned int s) const =0
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.
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i)=0
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 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
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 total_family_tree_by_side(T elem, std::vector< T > &family, unsigned int s, bool reset)
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 &...)
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
static constexpr dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
virtual unsigned int n_nodes() const =0
virtual unsigned int local_side_node(unsigned int side, unsigned int side_node) const =0
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)
virtual Point side_vertex_average_normal(const unsigned int s) const
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.
void total_family_tree_by_side(std::vector< const Elem *> &family, unsigned int side, bool reset=true) const
Same as the total_family_tree() member, but only adds elements which are next to side.
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
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
bool relative_edge_face_order(const unsigned int e, const unsigned int s) 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