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" 289 std::unique_ptr<Elem> returnval;
291 switch (this->
type())
294 returnval = std::make_unique<C0Polygon>(this->
n_sides());
301 returnval->set_id() = this->
id();
302 #ifdef LIBMESH_ENABLE_UNIQUE_ID 303 returnval->set_unique_id(this->
unique_id());
309 returnval->add_extra_integers(n_elem_ints);
310 for (
unsigned int i = 0; i != n_elem_ints; ++i)
311 returnval->set_extra_integer(i, this->get_extra_integer(i));
328 return std::make_unique<NodeElem>(p);
332 return std::make_unique<Edge2>(p);
334 return std::make_unique<Edge3>(p);
336 return std::make_unique<Edge4>(p);
340 return std::make_unique<Tri3>(p);
342 return std::make_unique<TriShell3>(p);
344 return std::make_unique<Tri3Subdivision>(p);
346 return std::make_unique<Tri6>(p);
348 return std::make_unique<Tri7>(p);
350 return std::make_unique<Quad4>(p);
352 return std::make_unique<QuadShell4>(p);
354 return std::make_unique<Quad8>(p);
356 return std::make_unique<QuadShell8>(p);
358 return std::make_unique<Quad9>(p);
360 return std::make_unique<QuadShell9>(p);
364 return std::make_unique<C0Polygon>(6, p);
368 return std::make_unique<Tet4>(p);
370 return std::make_unique<Tet10>(p);
372 return std::make_unique<Tet14>(p);
374 return std::make_unique<Hex8>(p);
376 return std::make_unique<Hex20>(p);
378 return std::make_unique<Hex27>(p);
380 return std::make_unique<Prism6>(p);
382 return std::make_unique<Prism15>(p);
384 return std::make_unique<Prism18>(p);
386 return std::make_unique<Prism20>(p);
388 return std::make_unique<Prism21>(p);
390 return std::make_unique<Pyramid5>(p);
392 return std::make_unique<Pyramid13>(p);
394 return std::make_unique<Pyramid14>(p);
396 return std::make_unique<Pyramid18>(p);
398 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 401 return std::make_unique<InfEdge2>(p);
405 return std::make_unique<InfQuad4>(p);
407 return std::make_unique<InfQuad6>(p);
411 return std::make_unique<InfHex8>(p);
413 return std::make_unique<InfHex16>(p);
415 return std::make_unique<InfHex18>(p);
417 return std::make_unique<InfPrism6>(p);
419 return std::make_unique<InfPrism12>(p);
448 #ifdef LIBMESH_ENABLE_DEPRECATED 452 <<
"Elem::centroid() has been deprecated. Replace with either " 453 <<
"Elem::vertex_average() to maintain existing behavior, or " 454 <<
"the more expensive Elem::true_centroid() " 455 <<
"in cases where the true 'geometric' centroid is required." 457 libmesh_deprecated();
461 #endif // LIBMESH_ENABLE_DEPRECATED 508 #ifdef LIBMESH_ENABLE_AMR 509 elem_copy->set_p_level(0);
514 elem_copy->set_node(n) =
_nodes[n];
516 return elem_copy->true_centroid();
527 fe->attach_quadrature_rule(&qrule);
530 const auto & JxW = fe->get_JxW();
531 const auto & phi = fe->get_phi();
538 libmesh_assert_equal_to(N, this->
n_nodes());
541 std::vector<Real> V(N);
544 V[i] += JxW[qp] * phi[i][qp];
552 cp += this->
point(i) * V[i];
566 cp.
add (this->point(n));
575 Real h_min=std::numeric_limits<Real>::max();
580 for (
unsigned int n_outer=0; n_outer<
n_vertices; n_outer++)
581 for (
unsigned int n_inner=n_outer+1; n_inner<
n_vertices; n_inner++)
583 const auto diff = (this->
point(n_outer) - this->
point(n_inner));
585 h_min = std::min(h_min, diff.norm_sq());
588 return std::sqrt(h_min);
600 for (
unsigned int n_outer=0; n_outer<
n_vertices; n_outer++)
601 for (
unsigned int n_inner=n_outer+1; n_inner<
n_vertices; n_inner++)
603 const auto diff = (this->
point(n_outer) - this->
point(n_inner));
605 h_max = std::max(h_max, diff.norm_sq());
608 return std::sqrt(h_max);
614 const unsigned int n2)
const 616 libmesh_assert_less ( n1, this->
n_vertices() );
617 libmesh_assert_less ( n2, this->
n_vertices() );
619 return (this->
point(n1) - this->
point(n2)).norm();
626 const unsigned short n_n = this->
n_nodes();
628 std::array<dof_id_type, Elem::max_n_nodes> node_ids;
630 for (
unsigned short n=0; n != n_n; ++n)
631 node_ids[n] = this->
node_id(n);
635 std::sort (node_ids.begin(), node_ids.begin()+n_n);
648 const unsigned short n_n = this->
n_nodes();
649 libmesh_assert_equal_to(n_n, rhs.
n_nodes());
653 std::array<dof_id_type, Elem::max_n_nodes> this_ids, rhs_ids;
655 for (
unsigned short n = 0; n != n_n; n++)
657 this_ids[n] = this->
node_id(n);
662 std::sort(this_ids.begin(), this_ids.begin()+n_n);
663 std::sort(rhs_ids.begin(), rhs_ids.begin()+n_n);
666 for (
unsigned short n = 0; n != n_n; ++n)
667 if (this_ids[n] != rhs_ids[n])
728 std::set<const Elem *> point_neighbors;
732 for (
const auto & elem : point_neighbors)
733 if (elem->processor_id() == my_pid)
745 const unsigned int ns = this->
n_sides();
746 const unsigned int nn = this->
n_nodes();
748 const unsigned int en = e->
n_nodes();
751 std::vector<bool> might_be_side(ns,
true);
753 for (
unsigned int i=0; i != en; ++i)
762 for (
unsigned int j=0; j != nn; ++j)
763 if (this->
point(j) == side_point)
773 for (
unsigned int s=0; s != ns; ++s)
775 might_be_side[s] =
false;
778 for (
unsigned int s=0; s != ns; ++s)
779 if (might_be_side[s])
782 for (
unsigned int s2=s+1; s2 < ns; ++s2)
794 #ifdef LIBMESH_ENABLE_DEPRECATED 796 unsigned int side_node)
const 798 libmesh_deprecated();
801 #endif // LIBMESH_ENABLE_DEPRECATED 809 const unsigned int my_nv = this->
n_vertices();
817 if (&this->
node_ref(my_n) == vertex)
824 const unsigned int l = this->
level();
825 const unsigned int el = e->
level();
845 unsigned int num_contained_edges = 0;
852 num_contained_edges++;
853 if (num_contained_edges>=2)
865 std::set<const Elem *> & neighbor_set)
const 870 neighbor_set.clear();
871 neighbor_set.insert(
this);
873 std::set<const Elem *> untested_set, next_untested_set;
874 untested_set.insert(
this);
876 #ifdef LIBMESH_ENABLE_AMR 877 std::vector<const Elem *> active_neighbor_children;
878 #endif // #ifdef LIBMESH_ENABLE_AMR 880 while (!untested_set.empty())
884 for (
const auto & elem : untested_set)
885 for (
auto current_neighbor : elem->neighbor_ptr_range())
887 if (current_neighbor &&
890 if (current_neighbor->active())
892 auto it = neighbor_set.lower_bound(current_neighbor);
893 if ((it == neighbor_set.end() || *it != current_neighbor) &&
894 current_neighbor->contains_point(p))
897 next_untested_set.insert(current_neighbor);
898 neighbor_set.emplace_hint(it, current_neighbor);
901 #ifdef LIBMESH_ENABLE_AMR 905 active_neighbor_children.clear();
906 current_neighbor->active_family_tree_by_neighbor
907 (active_neighbor_children, elem);
909 for (
const auto & current_child : active_neighbor_children)
911 auto it = neighbor_set.lower_bound(current_child);
912 if ((it == neighbor_set.end() || *it != current_child) &&
913 current_child->contains_point(p))
916 next_untested_set.insert(current_child);
917 neighbor_set.emplace_hint(it, current_child);
921 #endif // #ifdef LIBMESH_ENABLE_AMR 924 untested_set.swap(next_untested_set);
925 next_untested_set.clear();
939 const Elem * start_elem)
const 956 std::set<const Elem *> & neighbor_set)
const 965 std::set<const Elem *>::iterator it = neighbor_set.begin();
966 const std::set<const Elem *>::iterator end = neighbor_set.end();
972 if (!(*it)->contains_point(p2))
973 it = neighbor_set.erase(it);
983 neighbor_set.clear();
984 neighbor_set.insert(
this);
986 std::set<const Elem *> untested_set, next_untested_set;
987 untested_set.insert(
this);
989 while (!untested_set.empty())
993 for (
const auto & elem : untested_set)
995 for (
auto current_neighbor : elem->neighbor_ptr_range())
997 if (current_neighbor &&
1000 if (current_neighbor->active())
1003 || current_neighbor->contains_edge_of(
this))
1006 if (!neighbor_set.count(current_neighbor))
1007 next_untested_set.insert (current_neighbor);
1010 neighbor_set.insert (current_neighbor);
1013 #ifdef LIBMESH_ENABLE_AMR 1017 std::vector<const Elem *> active_neighbor_children;
1019 current_neighbor->active_family_tree_by_neighbor
1020 (active_neighbor_children, elem);
1022 for (
const auto & current_child : active_neighbor_children)
1023 if (this->
contains_edge_of(current_child) || current_child->contains_edge_of(
this))
1026 if (!neighbor_set.count(current_child))
1027 next_untested_set.insert (current_child);
1029 neighbor_set.insert (current_child);
1032 #endif // #ifdef LIBMESH_ENABLE_AMR 1036 untested_set.swap(next_untested_set);
1037 next_untested_set.clear();
1060 if (this->
dim() >= LIBMESH_DIM)
1081 (interior_p->
dim() > this->
dim()));
1094 (this->
level() == 0 &&
1105 if (this->
dim() >= LIBMESH_DIM)
1112 (interior_p->
dim() > this->
dim()));
1123 this->
dim() < LIBMESH_DIM);
1133 (p->
dim() > this->
dim()));
1140 #ifdef LIBMESH_ENABLE_PERIODIC 1150 if (neighbor_i !=
nullptr)
1158 std::vector<boundary_id_type> bc_ids;
1159 mesh.get_boundary_info().boundary_ids(
this, cast_int<unsigned short>(i), bc_ids);
1160 for (
const auto &
id : bc_ids)
1166 const Elem *
const cn = pb->
neighbor(
id, point_locator,
this, i);
1167 neighbor_i =
const_cast<Elem *
>(cn);
1174 neighbor_i = neighbor_i->
parent();
1192 if (neighbor_i !=
nullptr)
1200 std::vector<boundary_id_type> bc_ids;
1201 mesh.get_boundary_info().boundary_ids(
this, cast_int<unsigned short>(i), bc_ids);
1202 for (
const auto &
id : bc_ids)
1205 neighbor_i = pb->
neighbor(
id, point_locator,
this, i);
1212 neighbor_i = neighbor_i->
parent();
1270 const Elem * elem =
this;
1278 for (elem =
this; !elem->active();
1279 elem = elem->parent())
1292 elem = elem->parent();
1300 for (; elem != nn; elem = elem->
parent())
1316 (my_parent->
dim() == this->
dim()))
1335 libmesh_assert_less_equal (neigh->
level(), this->
level());
1364 std::vector<Elem *> neigh_family;
1365 #ifdef LIBMESH_ENABLE_AMR 1370 neigh_family.push_back(neigh);
1373 for (
auto & neigh_family_member : neigh_family)
1376 if (this->
subactive() && !neigh_family_member->subactive())
1386 #ifdef LIBMESH_ENABLE_AMR 1388 (neigh_family_member->neighbor_ptr(nn)->active() ||
1389 neigh_family_member->neighbor_ptr(nn)->is_ancestor_of(
this))) ||
1390 (neigh_family_member->neighbor_ptr(nn) ==
remote_elem) ||
1392 (this->
parent() !=
nullptr) &&
1393 (neigh_family_member->neighbor_ptr(nn) == this->
parent())));
1395 libmesh_assert((neigh_family_member->neighbor_ptr(nn) ==
this) ||
1396 (neigh_family_member->neighbor_ptr(nn) ==
remote_elem));
1399 neigh_family_member->set_neighbor(nn,
this);
1409 #if defined(LIBMESH_ENABLE_AMR) && defined(DEBUG) 1422 libmesh_assert_greater_equal (this->
level(), neigh->level());
1424 if (this->
level() == neigh->level() &&
1425 neigh->has_neighbor(
this))
1427 #ifdef LIBMESH_ENABLE_AMR 1430 std::vector<Elem *> family;
1431 neigh->total_family_tree_by_neighbor (family,
this);
1435 for (
auto & n : family)
1440 unsigned int my_s = n->which_neighbor_am_i(
this);
1441 libmesh_assert_less (my_s, n->n_neighbors());
1442 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1443 n->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1446 unsigned int my_s = neigh->which_neighbor_am_i(
this);
1447 libmesh_assert_less (my_s, neigh->n_neighbors());
1448 libmesh_assert_equal_to (neigh->neighbor_ptr(my_s),
this);
1449 neigh->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1452 #ifdef LIBMESH_ENABLE_AMR 1455 else if (neigh->has_children())
1466 while (!neigh->has_neighbor(my_ancestor))
1468 my_ancestor = my_ancestor->parent();
1474 std::vector<Elem *> family;
1475 neigh->total_family_tree_by_subneighbor (family, my_ancestor,
this);
1477 for (
auto & n : family)
1482 unsigned int my_s = n->which_neighbor_am_i(
this);
1483 libmesh_assert_less (my_s, n->n_neighbors());
1484 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1486 n->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1493 #ifdef LIBMESH_ENABLE_AMR 1500 this->
dim() == my_parent->
dim())
1503 libmesh_assert_equal_to (my_parent->
child_ptr(me),
this);
1515 #ifdef LIBMESH_ENABLE_AMR 1526 libmesh_assert_greater_equal (this->
level(), neigh->level());
1528 if (this->
level() == neigh->level() &&
1529 neigh->has_neighbor(
this))
1531 #ifdef LIBMESH_ENABLE_AMR 1534 std::vector<Elem *> family;
1535 neigh->total_family_tree_by_neighbor (family,
this);
1537 for (
auto & n : family)
1542 unsigned int my_s = n->which_neighbor_am_i(
this);
1543 libmesh_assert_less (my_s, n->n_neighbors());
1544 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1545 n->set_neighbor(my_s,
nullptr);
1548 unsigned int my_s = neigh->which_neighbor_am_i(
this);
1549 libmesh_assert_less (my_s, neigh->n_neighbors());
1550 libmesh_assert_equal_to (neigh->neighbor_ptr(my_s),
this);
1551 neigh->set_neighbor(my_s,
nullptr);
1554 #ifdef LIBMESH_ENABLE_AMR 1557 else if (neigh->has_children())
1568 while (!neigh->has_neighbor(my_ancestor))
1570 my_ancestor = my_ancestor->parent();
1576 std::vector<Elem *> family;
1577 neigh->total_family_tree_by_subneighbor (family, my_ancestor,
this);
1579 for (
auto & n : family)
1584 unsigned int my_s = n->which_neighbor_am_i(
this);
1585 libmesh_assert_less (my_s, n->n_neighbors());
1586 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1587 n->set_neighbor(my_s,
nullptr);
1594 #ifdef LIBMESH_ENABLE_AMR 1615 std::vector<dof_id_type> conn;
1620 std::copy(conn.begin(),
1622 std::ostream_iterator<dof_id_type>(out_stream,
" "));
1632 out_stream << this->
node_id(i)+1 <<
"\t";
1639 libmesh_error_msg(
"Unsupported IO package " << iop);
1653 if (this->
dim() < 2)
1656 std::vector<Real> edge_lengths(this->
n_edges());
1662 std::minmax_element(edge_lengths.begin(), edge_lengths.end());
1675 if (this->
dim() < 2)
1679 Real min_angle = std::numeric_limits<Real>::max();
1680 Real max_angle = -std::numeric_limits<Real>::max();
1690 auto N = adjacent_edge_ids.size();
1695 for (
unsigned int first = 0; first < N-1; ++first)
1696 for (
unsigned int second = first+1; second < N; ++second)
1699 auto first_edge = adjacent_edge_ids[first];
1700 auto second_edge = adjacent_edge_ids[second];
1709 if (first_edge_node_0 != n)
1710 std::swap(first_edge_node_0, first_edge_node_1);
1711 if (second_edge_node_0 != n)
1712 std::swap(second_edge_node_0, second_edge_node_1);
1714 libmesh_assert_equal_to(first_edge_node_0, n);
1715 libmesh_assert_equal_to(second_edge_node_0, n);
1719 first_ev = this->
point(first_edge_node_1) - this->
point(first_edge_node_0),
1720 second_ev = this->
point(second_edge_node_1) - this->
point(second_edge_node_0);
1723 Real theta = std::acos(first_ev.
unit() * second_ev.
unit());
1726 min_angle = std::min(theta, min_angle);
1727 max_angle = std::max(theta, max_angle);
1739 if (this->
dim() < 3)
1743 Real min_angle = std::numeric_limits<Real>::max();
1744 Real max_angle = -std::numeric_limits<Real>::max();
1763 libmesh_assert_equal_to(adjacent_side_ids.size(), 2);
1766 auto side_0_node_ids = this->
nodes_on_side(adjacent_side_ids[0]);
1767 auto side_1_node_ids = this->
nodes_on_side(adjacent_side_ids[1]);
1770 libmesh_assert_greater_equal(side_0_node_ids.size(), 3);
1771 libmesh_assert_greater_equal(side_1_node_ids.size(), 3);
1774 auto side_0_normal =
1775 (this->
point(side_0_node_ids[2]) - this->
point(side_0_node_ids[0])).cross
1776 (this->
point(side_0_node_ids[1]) - this->
point(side_0_node_ids[0])).unit();
1777 auto side_1_normal =
1778 (this->
point(side_1_node_ids[2]) - this->
point(side_1_node_ids[0])).cross
1779 (this->
point(side_1_node_ids[1]) - this->
point(side_1_node_ids[0])).unit();
1786 Real theta = std::acos(std::abs(side_0_normal * side_1_normal));
1789 min_angle = std::min(theta, min_angle);
1790 max_angle = std::max(theta, max_angle);
1802 const auto N = this->
dim();
1807 Real min_node_area = std::numeric_limits<Real>::max();
1822 if (adjacent_edge_ids.size() != N)
1826 std::vector<Point> oriented_edges(N);
1832 std::swap(node_0, node_1);
1833 oriented_edges[i] = this->
point(node_1) - this->
point(node_0);
1840 Real node_area = (N == 2) ?
1841 cross_norm(oriented_edges[0], oriented_edges[1]) :
1842 std::abs(
triple_product(oriented_edges[0], oriented_edges[1], oriented_edges[2]));
1850 Real len_i = oriented_edges[i].norm();
1851 node_area = (len_i == 0.) ? 0. : (node_area / len_i);
1855 min_node_area = std::min(node_area, min_node_area);
1858 return min_node_area;
1864 libmesh_do_once( libmesh_here();
1868 <<
" not implemented on element type " 1883 #ifdef LIBMESH_ENABLE_AMR 1886 const bool is_ancestor =
1913 #ifdef LIBMESH_ENABLE_AMR 1921 _children = std::make_unique<Elem *[]>(nc);
1923 for (
unsigned int c = 0; c != nc; c++)
1927 for (
unsigned int c = 0; c != nc; c++)
1931 libmesh_assert_equal_to (
this, elem->
parent());
1937 libmesh_error_msg(
"Error: Tried to add a child to an element with full children array");
1947 _children = std::make_unique<Elem *[]>(nc);
1949 for (
unsigned int i = 0; i != nc; i++)
2057 const Elem * neighbor,
2075 const Elem * neighbor,
2093 const Elem * neighbor,
2094 const Elem * subneighbor,
2113 const Elem * neighbor,
2114 const Elem * subneighbor,
2133 const Elem * neighbor,
2151 const Elem * neighbor,
2158 mesh, point_locator, pb,
2172 mesh, point_locator, pb,
2178 const unsigned int e)
const 2181 libmesh_assert_less (e, this->
n_edges());
2188 return (child_edge->node_id(0) == my_edge->node_id(0) ||
2189 child_edge->node_id(1) == my_edge->node_id(1));
2195 unsigned int current_min)
const 2202 return std::min(current_min, this->
p_level());
2209 if (current_min <= this->
p_level())
2212 unsigned int min_p_level = current_min;
2217 c.min_p_level_by_neighbor(neighbor_in, min_p_level);
2224 unsigned int current_min)
const 2232 unsigned int new_p_level = this->
p_level();
2237 libmesh_assert_greater (new_p_level, 0);
2240 return std::min(current_min, new_p_level);
2245 unsigned int min_p_level = current_min;
2250 c.min_new_p_level_by_neighbor(neighbor_in, min_p_level);
2258 unsigned int child_node)
const 2261 libmesh_assert_less(child, nc);
2265 std::vector<std::vector<std::vector<signed char>>> &
2274 if (em_vers >= cached_parent_indices.size())
2275 cached_parent_indices.resize(em_vers+1);
2277 if (child >= cached_parent_indices[em_vers].size())
2279 const signed char nn = cast_int<signed char>(this->
n_nodes());
2281 cached_parent_indices[em_vers].resize(nc);
2283 for (
unsigned int c = 0; c != nc; ++c)
2286 cached_parent_indices[em_vers][c].resize(ncn);
2287 for (
unsigned int cn = 0; cn != ncn; ++cn)
2289 for (
signed char n = 0; n != nn; ++n)
2295 cached_parent_indices[em_vers][c][cn] = n;
2301 cached_parent_indices[em_vers][c][cn] =
2308 libmesh_assert_not_equal_to (n+1, nn);
2314 const signed char cache_val =
2315 cached_parent_indices[em_vers][child][child_node];
2316 if (cache_val == -1)
2319 return cached_parent_indices[em_vers][child][child_node];
2324 const std::vector<std::pair<unsigned char, unsigned char>> &
2326 unsigned int child_node)
const 2330 std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char>>>>> &
2339 if (cached_bracketing_nodes.size() <= em_vers)
2340 cached_bracketing_nodes.resize(em_vers+1);
2346 if (cached_bracketing_nodes[em_vers].size() < nc)
2357 libmesh_assert_equal_to
2364 std::unique_ptr<Elem> full_elem =
Elem::build(full_type);
2369 libmesh_assert_equal_to(em_vers, 0);
2375 full_elem->parent_bracketing_nodes(0,0);
2384 cached_bracketing_nodes =
2385 full_elem->_get_bracketing_node_cache();
2388 return cached_bracketing_nodes[em_vers][child][child_node];
2391 cached_bracketing_nodes[em_vers].resize(nc);
2393 const unsigned int nn = this->
n_nodes();
2396 for (
unsigned int c = 0; c != nc; ++c)
2400 cached_bracketing_nodes[em_vers][c].resize(ncn);
2403 for (
unsigned int n = 0; n != ncn; ++n)
2409 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
2418 for (
unsigned int pn = 0; pn != nn; ++pn)
2423 libmesh_assert_not_equal_to (em_val, 1);
2430 for (
unsigned int n1 = 0; n1 != ncn; ++n1)
2435 unsigned int parent_n1 =
2443 for (
unsigned int n2 = n1+1; n2 < nn; ++n2)
2448 unsigned int parent_n2 =
2456 Point pmid = (p1 + p2)/2;
2458 if (pmid == bracketed_pt)
2460 cached_bracketing_nodes[em_vers][c][n].emplace_back(parent_n1, parent_n2);
2481 for (
unsigned int pn = 0; pn != nn; ++pn)
2486 libmesh_assert_not_equal_to (em_val, 1);
2495 for (
unsigned int n1 = 0; n1 != nn; ++n1)
2497 if (n1 == parent_node)
2502 for (
unsigned int n2 = n1+1; n2 < nn; ++n2)
2504 if (n2 == parent_node)
2509 if (pmid == bracketed_pt)
2511 cached_bracketing_nodes[em_vers][c][n].emplace_back(n1, n2);
2523 return cached_bracketing_nodes[em_vers][child][child_node];
2527 const std::vector<std::pair<dof_id_type, dof_id_type>>
2529 unsigned int child_node)
const 2531 std::vector<std::pair<dof_id_type, dof_id_type>> returnval;
2533 const std::vector<std::pair<unsigned char, unsigned char>> & pbc =
2536 for (
const auto & pb : pbc)
2538 const unsigned short n_n = this->
n_nodes();
2539 if (pb.first < n_n && pb.second < n_n)
2540 returnval.emplace_back(this->
node_id(pb.first), this->node_id(pb.second));
2545 libmesh_assert_not_equal_to
2548 libmesh_assert_equal_to
2557 std::unique_ptr<Elem> full_elem =
Elem::build(full_type);
2567 for (
unsigned int c=0; c <= child; ++c)
2570 if (c == child && n == child_node)
2573 if (pb.first == full_elem->as_parent_node(c,n))
2582 if (pb.second == full_elem->as_parent_node(c,n))
2611 returnval.emplace_back(pt1, pt2);
2617 #endif // #ifdef LIBMESH_ENABLE_AMR 2632 <<
"WARNING: Resizing bounding box to match user-specified tolerance!\n" 2633 <<
"In the future, calls to Elem::contains_point() with tol > TOLERANCE\n" 2634 <<
"will be more optimized, but should not be used\n" 2635 <<
"to search for points 'close to' elements!\n" 2636 <<
"Instead, use Elem::close_to_point() for this purpose.\n" 2661 libmesh_assert_greater (box_tol, 0.);
2662 libmesh_assert_greater (map_tol, 0.);
2672 point_above_min_z =
false,
2673 point_below_max_z =
false,
2676 point_above_min_y =
false,
2677 point_below_max_y =
false,
2679 point_above_min_x =
false,
2680 point_below_max_x =
false;
2687 point_above_min_x = point_above_min_x || (n(0) - my_hmax*box_tol <= p(0));
2688 point_below_max_x = point_below_max_x || (n(0) + my_hmax*box_tol >= p(0));
2690 point_above_min_y = point_above_min_y || (n(1) - my_hmax*box_tol <= p(1));
2691 point_below_max_y = point_below_max_y || (n(1) + my_hmax*box_tol >= p(1));
2694 point_above_min_z = point_above_min_z || (n(2) - my_hmax*box_tol <= p(2));
2695 point_below_max_z = point_below_max_z || (n(2) + my_hmax*box_tol >= p(2));
2701 !point_above_min_z ||
2702 !point_below_max_z ||
2705 !point_above_min_y ||
2706 !point_below_max_y ||
2708 !point_above_min_x ||
2729 if (this->
dim() < 3)
2742 if (dist > this->
hmax() * map_tol)
2760 qnodal.allow_nodal_pyramid_quadrature =
true;
2762 auto & qp = qnodal.get_points();
2763 libmesh_assert_equal_to(qp.size(), this->
n_nodes());
2765 std::vector<Point> one_point(1);
2766 std::vector<Real> one_weight(1,1);
2772 one_point[0] = qp[i];
2796 std::ostringstream oss;
2798 oss <<
" Elem Information" <<
'\n' 2806 #ifdef LIBMESH_ENABLE_UNIQUE_ID 2807 oss <<
", unique_id()=";
2815 oss <<
", processor_id()=" << this->
processor_id() <<
'\n';
2818 <<
" dim()=" << this->
dim() <<
'\n' 2819 <<
" n_nodes()=" << this->
n_nodes() <<
'\n';
2825 oss <<
" " << n << this->
node_ref(n);
2828 const unsigned char datum_index = this->
mapping_data();
2829 oss <<
" weight=" <<
2834 oss <<
" n_sides()=" << this->
n_sides() <<
'\n';
2838 oss <<
" neighbor(" << s <<
")=";
2847 oss <<
" hmin()=" << this->
hmin()
2848 <<
", hmax()=" << this->
hmax() <<
'\n' 2849 <<
" volume()=" << this->
volume() <<
'\n';
2851 oss <<
" active()=" << this->
active()
2852 <<
", ancestor()=" << this->
ancestor()
2853 <<
", subactive()=" << this->
subactive()
2857 oss << this->
parent()->
id() <<
'\n';
2860 oss <<
" level()=" << this->
level()
2861 <<
", p_level()=" << this->
p_level() <<
'\n' 2862 #ifdef LIBMESH_ENABLE_AMR 2866 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 2867 <<
" infinite()=" << this->
infinite() <<
'\n';
2869 oss <<
" origin()=" << this->
origin() <<
'\n' 2877 oss <<
'(' << s <<
'/' << v <<
'/' << this->
dof_number(s,v,c) <<
") ";
2892 if (current_neighbor && current_neighbor !=
remote_elem)
2897 if (current_neighbor->
level() == this->
level())
2900 libmesh_assert_less (w_n_a_i, current_neighbor->
n_neighbors());
2920 const unsigned int)
const 2928 std::pair<unsigned short int, unsigned short int>
2932 return std::pair<unsigned short int, unsigned short int>(0,0);
2981 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3007 const bool full_ordered)
3133 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3182 libmesh_error_msg(
"No second order equivalent element type for et = " 3250 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3269 #endif // LIBMESH_ENABLE_INFINITE_ELEMENTS 3274 libmesh_error_msg(
"No complete order equivalent element type for et = " 3314 fe->get_fe_map().set_jacobian_tolerance(std::numeric_limits<Real>::lowest());
3316 const std::vector<Real> & JxW = fe->get_JxW();
3322 fe->attach_quadrature_rule(&qrule);
3327 for (
auto jxw : JxW)
3341 unsigned int n_points = this->
n_nodes();
3342 for (
unsigned int p=0; p != n_points; ++p)
3343 for (
unsigned d=0; d<LIBMESH_DIM; ++d)
3346 if (pmin(d) > pt(d))
3349 if (pmax(d) < pt(d))
3359 unsigned int n)
const 3361 #ifdef LIBMESH_ENABLE_AMR 3363 unsigned int my_n_vertices = this->
n_vertices();
3364 for (
unsigned int n_parent = 0; n_parent != my_n_vertices;
3374 libmesh_error_msg(
"ERROR: AMR disabled, how did we get here?");
3385 libmesh_not_implemented();
3391 const unsigned int )
const 3394 libmesh_not_implemented();
3400 libmesh_assert_less (side, this->
n_sides());
3409 std::vector<boundary_id_type> ids1, ids2;
3415 boundary_info->
add_side(
this, s2, ids1);
3417 boundary_info->
add_side(
this, s1, ids2);
3425 std::vector<boundary_id_type> ids1, ids2;
3431 boundary_info->
add_edge(
this, e2, ids1);
3433 boundary_info->
add_edge(
this, e1, ids2);
3439 switch (this->
dim())
3454 libmesh_error_msg(
"impossible element dimension " << std::to_string(this->
dim()));
3462 libmesh_assert_less (i, this->
n_edges());
3471 libmesh_assert_less (i, this->
n_faces());
3477 const unsigned int N = side_i->n_sides();
3479 const std::vector<unsigned int> nodes = this->
nodes_on_side(i);
3480 std::vector<Point> vertices(N);
3481 std::transform(nodes.begin(), nodes.begin() + N, vertices.begin(),
3482 [&](
unsigned int n) {
return this->
point(n); });
3484 for (
unsigned int j = 0; j < N - 3; j++)
3486 std::min_element(vertices.begin() + j, vertices.end()),
3489 unsigned int cnt = 0;
3490 for (
unsigned int j = N - 3; j < N; j++)
3491 for (
unsigned int k = j + 1; k < N; k++)
3492 if (vertices[j] > vertices[k])
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
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
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...
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
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