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));
685 Real h_min=std::numeric_limits<Real>::max();
690 for (
unsigned int n_outer=0; n_outer<
n_vertices; n_outer++)
691 for (
unsigned int n_inner=n_outer+1; n_inner<
n_vertices; n_inner++)
693 const auto diff = (this->
point(n_outer) - this->
point(n_inner));
695 h_min = std::min(h_min, diff.norm_sq());
698 return std::sqrt(h_min);
710 for (
unsigned int n_outer=0; n_outer<
n_vertices; n_outer++)
711 for (
unsigned int n_inner=n_outer+1; n_inner<
n_vertices; n_inner++)
713 const auto diff = (this->
point(n_outer) - this->
point(n_inner));
715 h_max = std::max(h_max, diff.norm_sq());
718 return std::sqrt(h_max);
724 const unsigned int n2)
const 726 libmesh_assert_less ( n1, this->
n_vertices() );
727 libmesh_assert_less ( n2, this->
n_vertices() );
729 return (this->
point(n1) - this->
point(n2)).norm();
736 const unsigned short n_n = this->
n_nodes();
738 std::array<dof_id_type, Elem::max_n_nodes> node_ids;
740 for (
unsigned short n=0; n != n_n; ++n)
741 node_ids[n] = this->
node_id(n);
745 std::sort (node_ids.begin(), node_ids.begin()+n_n);
758 const unsigned short n_n = this->
n_nodes();
759 libmesh_assert_equal_to(n_n, rhs.
n_nodes());
763 std::array<dof_id_type, Elem::max_n_nodes> this_ids, rhs_ids;
765 for (
unsigned short n = 0; n != n_n; n++)
767 this_ids[n] = this->
node_id(n);
772 std::sort(this_ids.begin(), this_ids.begin()+n_n);
773 std::sort(rhs_ids.begin(), rhs_ids.begin()+n_n);
776 for (
unsigned short n = 0; n != n_n; ++n)
777 if (this_ids[n] != rhs_ids[n])
838 std::set<const Elem *> point_neighbors;
842 for (
const auto & elem : point_neighbors)
843 if (elem->processor_id() == my_pid)
855 const unsigned int ns = this->
n_sides();
856 const unsigned int nn = this->
n_nodes();
858 const unsigned int en = e->
n_nodes();
861 std::vector<bool> might_be_side(ns,
true);
863 for (
unsigned int i=0; i != en; ++i)
872 for (
unsigned int j=0; j != nn; ++j)
873 if (this->
point(j) == side_point)
883 for (
unsigned int s=0; s != ns; ++s)
885 might_be_side[s] =
false;
888 for (
unsigned int s=0; s != ns; ++s)
889 if (might_be_side[s])
892 for (
unsigned int s2=s+1; s2 < ns; ++s2)
908 const unsigned int my_nv = this->
n_vertices();
916 if (&this->
node_ref(my_n) == vertex)
923 const unsigned int l = this->
level();
924 const unsigned int el = e->
level();
944 unsigned int num_contained_edges = 0;
951 num_contained_edges++;
952 if (num_contained_edges>=2)
964 std::set<const Elem *> & neighbor_set)
const 969 neighbor_set.clear();
970 neighbor_set.insert(
this);
972 std::set<const Elem *> untested_set, next_untested_set;
973 untested_set.insert(
this);
975 #ifdef LIBMESH_ENABLE_AMR 976 std::vector<const Elem *> active_neighbor_children;
977 #endif // #ifdef LIBMESH_ENABLE_AMR 979 while (!untested_set.empty())
983 for (
const auto & elem : untested_set)
984 for (
auto current_neighbor : elem->neighbor_ptr_range())
986 if (current_neighbor &&
989 if (current_neighbor->active())
991 auto it = neighbor_set.lower_bound(current_neighbor);
992 if ((it == neighbor_set.end() || *it != current_neighbor) &&
993 current_neighbor->contains_point(p))
996 next_untested_set.insert(current_neighbor);
997 neighbor_set.emplace_hint(it, current_neighbor);
1000 #ifdef LIBMESH_ENABLE_AMR 1004 active_neighbor_children.clear();
1005 current_neighbor->active_family_tree_by_neighbor
1006 (active_neighbor_children, elem);
1008 for (
const auto & current_child : active_neighbor_children)
1010 auto it = neighbor_set.lower_bound(current_child);
1011 if ((it == neighbor_set.end() || *it != current_child) &&
1012 current_child->contains_point(p))
1015 next_untested_set.insert(current_child);
1016 neighbor_set.emplace_hint(it, current_child);
1020 #endif // #ifdef LIBMESH_ENABLE_AMR 1023 untested_set.swap(next_untested_set);
1024 next_untested_set.clear();
1038 const Elem * start_elem)
const 1055 std::set<const Elem *> & neighbor_set)
const 1064 std::set<const Elem *>::iterator it = neighbor_set.begin();
1065 const std::set<const Elem *>::iterator end = neighbor_set.end();
1071 if (!(*it)->contains_point(p2))
1072 it = neighbor_set.erase(it);
1082 neighbor_set.clear();
1083 neighbor_set.insert(
this);
1085 std::set<const Elem *> untested_set, next_untested_set;
1086 untested_set.insert(
this);
1088 while (!untested_set.empty())
1092 for (
const auto & elem : untested_set)
1094 for (
auto current_neighbor : elem->neighbor_ptr_range())
1096 if (current_neighbor &&
1099 if (current_neighbor->active())
1102 || current_neighbor->contains_edge_of(
this))
1105 if (!neighbor_set.count(current_neighbor))
1106 next_untested_set.insert (current_neighbor);
1109 neighbor_set.insert (current_neighbor);
1112 #ifdef LIBMESH_ENABLE_AMR 1116 std::vector<const Elem *> active_neighbor_children;
1118 current_neighbor->active_family_tree_by_neighbor
1119 (active_neighbor_children, elem);
1121 for (
const auto & current_child : active_neighbor_children)
1122 if (this->
contains_edge_of(current_child) || current_child->contains_edge_of(
this))
1125 if (!neighbor_set.count(current_child))
1126 next_untested_set.insert (current_child);
1128 neighbor_set.insert (current_child);
1131 #endif // #ifdef LIBMESH_ENABLE_AMR 1135 untested_set.swap(next_untested_set);
1136 next_untested_set.clear();
1159 if (this->
dim() >= LIBMESH_DIM)
1180 (interior_p->
dim() > this->
dim()));
1193 (this->
level() == 0 &&
1204 if (this->
dim() >= LIBMESH_DIM)
1211 (interior_p->
dim() > this->
dim()));
1222 this->
dim() < LIBMESH_DIM);
1232 (p->
dim() > this->
dim()));
1239 #ifdef LIBMESH_ENABLE_PERIODIC 1249 if (neighbor_i !=
nullptr)
1257 std::vector<boundary_id_type> bc_ids;
1258 mesh.get_boundary_info().boundary_ids(
this, cast_int<unsigned short>(i), bc_ids);
1259 for (
const auto &
id : bc_ids)
1265 const Elem *
const cn = pb->
neighbor(
id, point_locator,
this, i);
1266 neighbor_i =
const_cast<Elem *
>(cn);
1273 neighbor_i = neighbor_i->
parent();
1291 if (neighbor_i !=
nullptr)
1299 std::vector<boundary_id_type> bc_ids;
1300 mesh.get_boundary_info().boundary_ids(
this, cast_int<unsigned short>(i), bc_ids);
1301 for (
const auto &
id : bc_ids)
1304 neighbor_i = pb->
neighbor(
id, point_locator,
this, i);
1311 neighbor_i = neighbor_i->
parent();
1369 const Elem * elem =
this;
1377 for (elem =
this; !elem->active();
1378 elem = elem->parent())
1391 elem = elem->parent();
1399 for (; elem != nn; elem = elem->
parent())
1415 (my_parent->
dim() == this->
dim()))
1433 const unsigned int this_level = this->
level();
1434 const unsigned int neigh_level = neigh->
level();
1437 libmesh_assert_less_equal (neigh_level, this_level);
1460 std::vector<Elem *> neigh_family;
1461 #ifdef LIBMESH_ENABLE_AMR 1464 neigh_family.push_back(neigh);
1468 std::unique_ptr<Elem> my_side, neigh_side;
1471 for (
auto & neigh_family_member : neigh_family)
1474 const bool member_subactive = neigh_family_member->subactive();
1475 if (this->
subactive() && !member_subactive)
1482 const unsigned int member_level = neigh_family_member->level();
1483 if (member_level < this_level)
1493 #ifdef LIBMESH_ENABLE_AMR 1495 (neigh_family_member->neighbor_ptr(nn)->active() ||
1497 neigh_family_member->neighbor_ptr(nn)->is_ancestor_of(
this))) ||
1498 (neigh_family_member->neighbor_ptr(nn) ==
remote_elem) ||
1500 (this->
parent() !=
nullptr) &&
1501 (neigh_family_member->neighbor_ptr(nn) == this->
parent())));
1503 libmesh_assert((neigh_family_member->neighbor_ptr(nn) ==
this) ||
1504 (neigh_family_member->neighbor_ptr(nn) ==
remote_elem));
1510 if (member_level > this_level)
1521 if (neigh_level < this_level &&
1522 member_level > neigh_level)
1527 neigh_family_member->side_ptr(neigh_side, nn);
1529 if (*my_side != *neigh_side)
1533 neigh_family_member->set_neighbor(nn,
this);
1543 #if defined(LIBMESH_ENABLE_AMR) && defined(DEBUG) 1556 libmesh_assert_greater_equal (this->
level(), neigh->level());
1558 if (this->
level() == neigh->level() &&
1559 neigh->has_neighbor(
this))
1561 #ifdef LIBMESH_ENABLE_AMR 1564 std::vector<Elem *> family;
1565 neigh->total_family_tree_by_neighbor (family,
this);
1569 for (
auto & n : family)
1574 unsigned int my_s = n->which_neighbor_am_i(
this);
1575 libmesh_assert_less (my_s, n->n_neighbors());
1576 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1577 n->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1580 unsigned int my_s = neigh->which_neighbor_am_i(
this);
1581 libmesh_assert_less (my_s, neigh->n_neighbors());
1582 libmesh_assert_equal_to (neigh->neighbor_ptr(my_s),
this);
1583 neigh->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1586 #ifdef LIBMESH_ENABLE_AMR 1589 else if (neigh->has_children())
1600 while (!neigh->has_neighbor(my_ancestor))
1602 my_ancestor = my_ancestor->parent();
1608 std::vector<Elem *> family;
1609 neigh->total_family_tree_by_subneighbor (family, my_ancestor,
this);
1611 for (
auto & n : family)
1616 unsigned int my_s = n->which_neighbor_am_i(
this);
1617 libmesh_assert_less (my_s, n->n_neighbors());
1618 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1620 n->set_neighbor(my_s, const_cast<RemoteElem *>(
remote_elem));
1627 #ifdef LIBMESH_ENABLE_AMR 1634 this->
dim() == my_parent->
dim())
1637 libmesh_assert_equal_to (my_parent->
child_ptr(me),
this);
1649 #ifdef LIBMESH_ENABLE_AMR 1660 libmesh_assert_greater_equal (this->
level(), neigh->level());
1662 if (this->
level() == neigh->level() &&
1663 neigh->has_neighbor(
this))
1665 #ifdef LIBMESH_ENABLE_AMR 1668 std::vector<Elem *> family;
1669 neigh->total_family_tree_by_neighbor (family,
this);
1671 for (
auto & n : family)
1676 unsigned int my_s = n->which_neighbor_am_i(
this);
1677 libmesh_assert_less (my_s, n->n_neighbors());
1678 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1679 n->set_neighbor(my_s,
nullptr);
1682 unsigned int my_s = neigh->which_neighbor_am_i(
this);
1683 libmesh_assert_less (my_s, neigh->n_neighbors());
1684 libmesh_assert_equal_to (neigh->neighbor_ptr(my_s),
this);
1685 neigh->set_neighbor(my_s,
nullptr);
1688 #ifdef LIBMESH_ENABLE_AMR 1691 else if (neigh->has_children())
1702 while (!neigh->has_neighbor(my_ancestor))
1704 my_ancestor = my_ancestor->parent();
1710 std::vector<Elem *> family;
1711 neigh->total_family_tree_by_subneighbor (family, my_ancestor,
this);
1713 for (
auto & n : family)
1718 unsigned int my_s = n->which_neighbor_am_i(
this);
1719 libmesh_assert_less (my_s, n->n_neighbors());
1720 libmesh_assert_equal_to (n->neighbor_ptr(my_s),
this);
1721 n->set_neighbor(my_s,
nullptr);
1728 #ifdef LIBMESH_ENABLE_AMR 1749 std::vector<dof_id_type> conn;
1754 std::copy(conn.begin(),
1756 std::ostream_iterator<dof_id_type>(out_stream,
" "));
1766 out_stream << this->
node_id(i)+1 <<
"\t";
1773 libmesh_error_msg(
"Unsupported IO package " << iop);
1787 if (this->
dim() < 2)
1790 std::vector<Real> edge_lengths(this->
n_edges());
1796 std::minmax_element(edge_lengths.begin(), edge_lengths.end());
1809 if (this->
dim() < 2)
1813 Real min_angle = std::numeric_limits<Real>::max();
1814 Real max_angle = -std::numeric_limits<Real>::max();
1824 auto N = adjacent_edge_ids.size();
1829 for (
unsigned int first = 0; first < N-1; ++first)
1830 for (
unsigned int second = first+1; second < N; ++second)
1833 auto first_edge = adjacent_edge_ids[first];
1834 auto second_edge = adjacent_edge_ids[second];
1843 if (first_edge_node_0 != n)
1844 std::swap(first_edge_node_0, first_edge_node_1);
1845 if (second_edge_node_0 != n)
1846 std::swap(second_edge_node_0, second_edge_node_1);
1848 libmesh_assert_equal_to(first_edge_node_0, n);
1849 libmesh_assert_equal_to(second_edge_node_0, n);
1853 first_ev = this->
point(first_edge_node_1) - this->
point(first_edge_node_0),
1854 second_ev = this->
point(second_edge_node_1) - this->
point(second_edge_node_0);
1857 Real theta = std::acos(first_ev.
unit() * second_ev.
unit());
1860 min_angle = std::min(theta, min_angle);
1861 max_angle = std::max(theta, max_angle);
1873 if (this->
dim() < 3)
1877 Real min_angle = std::numeric_limits<Real>::max();
1878 Real max_angle = -std::numeric_limits<Real>::max();
1897 libmesh_assert_equal_to(adjacent_side_ids.size(), 2);
1900 const auto side_0_node_ids = this->
nodes_on_side(adjacent_side_ids[0]);
1901 const auto side_1_node_ids = this->
nodes_on_side(adjacent_side_ids[1]);
1904 libmesh_assert_greater_equal(side_0_node_ids.size(), 3);
1905 libmesh_assert_greater_equal(side_1_node_ids.size(), 3);
1908 const auto side_0_normal =
1909 (this->
point(side_0_node_ids[2]) - this->
point(side_0_node_ids[0])).cross
1910 (this->
point(side_0_node_ids[1]) - this->
point(side_0_node_ids[0])).unit();
1911 const auto side_1_normal =
1912 (this->
point(side_1_node_ids[2]) - this->
point(side_1_node_ids[0])).cross
1913 (this->
point(side_1_node_ids[1]) - this->
point(side_1_node_ids[0])).unit();
1920 Real theta = std::acos(std::abs(side_0_normal * side_1_normal));
1923 min_angle = std::min(theta, min_angle);
1924 max_angle = std::max(theta, max_angle);
1936 const auto N = this->
dim();
1941 Real min_node_area = std::numeric_limits<Real>::max();
1956 if (adjacent_edge_ids.size() != N)
1960 std::vector<Point> oriented_edges(N);
1966 std::swap(node_0, node_1);
1967 oriented_edges[i] = this->
point(node_1) - this->
point(node_0);
1974 Real node_area = (N == 2) ?
1975 cross_norm(oriented_edges[0], oriented_edges[1]) :
1976 std::abs(
triple_product(oriented_edges[0], oriented_edges[1], oriented_edges[2]));
1984 Real len_i = oriented_edges[i].norm();
1985 node_area = (len_i == 0.) ? 0. : (node_area / len_i);
1989 min_node_area = std::min(node_area, min_node_area);
1992 return min_node_area;
1998 libmesh_do_once( libmesh_here();
2002 <<
" not implemented on element type " 2017 #ifdef LIBMESH_ENABLE_AMR 2020 const bool is_ancestor =
2047 #ifdef LIBMESH_ENABLE_AMR 2055 _children = std::make_unique<Elem *[]>(nc);
2057 for (
unsigned int c = 0; c != nc; c++)
2061 for (
unsigned int c = 0; c != nc; c++)
2065 libmesh_assert_equal_to (
this, elem->
parent());
2071 libmesh_error_msg(
"Error: Tried to add a child to an element with full children array");
2081 _children = std::make_unique<Elem *[]>(nc);
2083 for (
unsigned int i = 0; i != nc; i++)
2209 const Elem * neighbor,
2227 const Elem * neighbor,
2245 const Elem * neighbor,
2246 const Elem * subneighbor,
2265 const Elem * neighbor,
2266 const Elem * subneighbor,
2285 const Elem * neighbor,
2303 const Elem * neighbor,
2310 mesh, point_locator, pb,
2324 mesh, point_locator, pb,
2330 const unsigned int e)
const 2333 libmesh_assert_less (e, this->
n_edges());
2340 return (child_edge->node_id(0) == my_edge->node_id(0) ||
2341 child_edge->node_id(1) == my_edge->node_id(1));
2347 unsigned int current_min)
const 2354 return std::min(current_min, this->
p_level());
2361 if (current_min <= this->
p_level())
2364 unsigned int min_p_level = current_min;
2369 c.min_p_level_by_neighbor(neighbor_in, min_p_level);
2376 unsigned int current_min)
const 2384 unsigned int new_p_level = this->
p_level();
2389 libmesh_assert_greater (new_p_level, 0);
2392 return std::min(current_min, new_p_level);
2397 unsigned int min_p_level = current_min;
2402 c.min_new_p_level_by_neighbor(neighbor_in, min_p_level);
2410 unsigned int child_node)
const 2413 libmesh_assert_less(child, nc);
2417 std::vector<std::vector<std::vector<signed char>>> &
2426 if (em_vers >= cached_parent_indices.size())
2427 cached_parent_indices.resize(em_vers+1);
2429 if (child >= cached_parent_indices[em_vers].size())
2431 const signed char nn = cast_int<signed char>(this->
n_nodes());
2433 cached_parent_indices[em_vers].resize(nc);
2435 for (
unsigned int c = 0; c != nc; ++c)
2438 cached_parent_indices[em_vers][c].resize(ncn);
2439 for (
unsigned int cn = 0; cn != ncn; ++cn)
2441 for (
signed char n = 0; n != nn; ++n)
2447 cached_parent_indices[em_vers][c][cn] = n;
2453 cached_parent_indices[em_vers][c][cn] =
2460 libmesh_assert_not_equal_to (n+1, nn);
2466 const signed char cache_val =
2467 cached_parent_indices[em_vers][child][child_node];
2468 if (cache_val == -1)
2471 return cached_parent_indices[em_vers][child][child_node];
2476 const std::vector<std::pair<unsigned char, unsigned char>> &
2478 unsigned int child_node)
const 2482 std::vector<std::vector<std::vector<std::vector<std::pair<unsigned char, unsigned char>>>>> &
2491 if (cached_bracketing_nodes.size() <= em_vers)
2492 cached_bracketing_nodes.resize(em_vers+1);
2498 if (cached_bracketing_nodes[em_vers].size() < nc)
2509 libmesh_assert_equal_to
2516 std::unique_ptr<Elem> full_elem =
Elem::build(full_type);
2521 libmesh_assert_equal_to(em_vers, 0);
2527 full_elem->parent_bracketing_nodes(0,0);
2536 cached_bracketing_nodes =
2537 full_elem->_get_bracketing_node_cache();
2540 return cached_bracketing_nodes[em_vers][child][child_node];
2543 cached_bracketing_nodes[em_vers].resize(nc);
2545 const unsigned int nn = this->
n_nodes();
2548 for (
unsigned int c = 0; c != nc; ++c)
2552 cached_bracketing_nodes[em_vers][c].resize(ncn);
2555 for (
unsigned int n = 0; n != ncn; ++n)
2561 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
2570 for (
unsigned int pn = 0; pn != nn; ++pn)
2575 libmesh_assert_not_equal_to (em_val, 1);
2582 for (
unsigned int n1 = 0; n1 != ncn; ++n1)
2587 unsigned int parent_n1 =
2595 for (
unsigned int n2 = n1+1; n2 < nn; ++n2)
2600 unsigned int parent_n2 =
2608 Point pmid = (p1 + p2)/2;
2610 if (pmid == bracketed_pt)
2612 cached_bracketing_nodes[em_vers][c][n].emplace_back(parent_n1, parent_n2);
2633 for (
unsigned int pn = 0; pn != nn; ++pn)
2638 libmesh_assert_not_equal_to (em_val, 1);
2647 for (
unsigned int n1 = 0; n1 != nn; ++n1)
2649 if (n1 == parent_node)
2654 for (
unsigned int n2 = n1+1; n2 < nn; ++n2)
2656 if (n2 == parent_node)
2661 if (pmid == bracketed_pt)
2663 cached_bracketing_nodes[em_vers][c][n].emplace_back(n1, n2);
2675 return cached_bracketing_nodes[em_vers][child][child_node];
2679 const std::vector<std::pair<dof_id_type, dof_id_type>>
2681 unsigned int child_node)
const 2683 std::vector<std::pair<dof_id_type, dof_id_type>> returnval;
2685 const std::vector<std::pair<unsigned char, unsigned char>> & pbc =
2688 for (
const auto & pb : pbc)
2690 const unsigned short n_n = this->
n_nodes();
2691 if (pb.first < n_n && pb.second < n_n)
2692 returnval.emplace_back(this->
node_id(pb.first), this->node_id(pb.second));
2697 libmesh_assert_not_equal_to
2700 libmesh_assert_equal_to
2709 std::unique_ptr<Elem> full_elem =
Elem::build(full_type);
2719 for (
unsigned int c=0; c <= child; ++c)
2727 if (c == child && n == child_node)
2730 if (pb.first == full_elem->as_parent_node(c,n))
2739 if (pb.second == full_elem->as_parent_node(c,n))
2769 returnval.emplace_back(pt1, pt2);
2775 #endif // #ifdef LIBMESH_ENABLE_AMR 2790 <<
"WARNING: Resizing bounding box to match user-specified tolerance!\n" 2791 <<
"In the future, calls to Elem::contains_point() with tol > TOLERANCE\n" 2792 <<
"will be more optimized, but should not be used\n" 2793 <<
"to search for points 'close to' elements!\n" 2794 <<
"Instead, use Elem::close_to_point() for this purpose.\n" 2819 libmesh_assert_greater (box_tol, 0.);
2820 libmesh_assert_greater (map_tol, 0.);
2830 point_above_min_z =
false,
2831 point_below_max_z =
false,
2834 point_above_min_y =
false,
2835 point_below_max_y =
false,
2837 point_above_min_x =
false,
2838 point_below_max_x =
false;
2845 point_above_min_x = point_above_min_x || (n(0) - my_hmax*box_tol <= p(0));
2846 point_below_max_x = point_below_max_x || (n(0) + my_hmax*box_tol >= p(0));
2848 point_above_min_y = point_above_min_y || (n(1) - my_hmax*box_tol <= p(1));
2849 point_below_max_y = point_below_max_y || (n(1) + my_hmax*box_tol >= p(1));
2852 point_above_min_z = point_above_min_z || (n(2) - my_hmax*box_tol <= p(2));
2853 point_below_max_z = point_below_max_z || (n(2) + my_hmax*box_tol >= p(2));
2859 !point_above_min_z ||
2860 !point_below_max_z ||
2863 !point_above_min_y ||
2864 !point_below_max_y ||
2866 !point_above_min_x ||
2887 if (this->
dim() < 3)
2900 if (dist > this->
hmax() * map_tol)
2918 qnodal.allow_nodal_pyramid_quadrature =
true;
2920 auto & qp = qnodal.get_points();
2921 libmesh_assert_equal_to(qp.size(), this->
n_nodes());
2923 std::vector<Point> one_point(1);
2924 std::vector<Real> one_weight(1,1);
2930 one_point[0] = qp[i];
2954 std::ostringstream oss;
2956 oss <<
" Elem Information" <<
'\n' 2964 #ifdef LIBMESH_ENABLE_UNIQUE_ID 2965 oss <<
", unique_id()=";
2973 oss <<
", processor_id()=" << this->
processor_id() <<
'\n';
2976 <<
" dim()=" << this->
dim() <<
'\n' 2977 <<
" n_nodes()=" << this->
n_nodes() <<
'\n';
2983 oss <<
" " << n << this->
node_ref(n);
2986 const unsigned char datum_index = this->
mapping_data();
2987 oss <<
" weight=" <<
2992 oss <<
" n_sides()=" << this->
n_sides() <<
'\n';
2996 oss <<
" neighbor(" << s <<
")=";
3005 oss <<
" hmin()=" << this->
hmin()
3006 <<
", hmax()=" << this->
hmax() <<
'\n' 3007 <<
" volume()=" << this->
volume() <<
'\n';
3009 oss <<
" active()=" << this->
active()
3010 <<
", ancestor()=" << this->
ancestor()
3011 <<
", subactive()=" << this->
subactive()
3015 oss << this->
parent()->
id() <<
'\n';
3018 oss <<
" level()=" << this->
level()
3019 <<
", p_level()=" << this->
p_level() <<
'\n' 3020 #ifdef LIBMESH_ENABLE_AMR 3024 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3025 <<
" infinite()=" << this->
infinite() <<
'\n';
3027 oss <<
" origin()=" << this->
origin() <<
'\n' 3035 oss <<
'(' << s <<
'/' << v <<
'/' << this->
dof_number(s,v,c) <<
") ";
3050 if (current_neighbor && current_neighbor !=
remote_elem)
3055 if (current_neighbor->
level() == this->
level())
3058 libmesh_assert_less (w_n_a_i, current_neighbor->
n_neighbors());
3078 const unsigned int)
const 3086 std::pair<unsigned short int, unsigned short int>
3090 return std::pair<unsigned short int, unsigned short int>(0,0);
3139 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3165 const bool full_ordered)
3291 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3340 libmesh_error_msg(
"No second order equivalent element type for et = " 3408 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 3427 #endif // LIBMESH_ENABLE_INFINITE_ELEMENTS 3432 libmesh_error_msg(
"No complete order equivalent element type for et = " 3472 fe->get_fe_map().set_jacobian_tolerance(std::numeric_limits<Real>::lowest());
3474 const std::vector<Real> & JxW = fe->get_JxW();
3480 fe->attach_quadrature_rule(&qrule);
3485 for (
auto jxw : JxW)
3499 unsigned int n_points = this->
n_nodes();
3500 for (
unsigned int p=0; p != n_points; ++p)
3501 for (
unsigned d=0; d<LIBMESH_DIM; ++d)
3504 if (pmin(d) > pt(d))
3507 if (pmax(d) < pt(d))
3517 unsigned int dim = this->
dim();
3518 const std::unique_ptr<const Elem> face = this->
build_side_ptr(s);
3519 std::unique_ptr<libMesh::FEBase> fe(
3521 const std::vector<Point> & normals = fe->get_normals();
3522 std::vector<Point> ref_side_vertex_average_v = {face->reference_elem()->vertex_average()};
3523 fe->reinit(
this, s,
TOLERANCE, &ref_side_vertex_average_v);
3528 unsigned int n)
const 3530 #ifdef LIBMESH_ENABLE_AMR 3532 unsigned int my_n_vertices = this->
n_vertices();
3533 for (
unsigned int n_parent = 0; n_parent != my_n_vertices;
3543 libmesh_error_msg(
"ERROR: AMR disabled, how did we get here?");
3554 libmesh_not_implemented();
3560 const unsigned int )
const 3563 libmesh_not_implemented();
3569 libmesh_assert_less (side, this->
n_sides());
3578 std::vector<boundary_id_type> ids1, ids2;
3584 boundary_info->
add_side(
this, s2, ids1);
3586 boundary_info->
add_side(
this, s1, ids2);
3594 std::vector<boundary_id_type> ids1, ids2;
3600 boundary_info->
add_edge(
this, e2, ids1);
3602 boundary_info->
add_edge(
this, e1, ids2);
3608 switch (this->
dim())
3623 libmesh_error_msg(
"impossible element dimension " << std::to_string(this->
dim()));
3631 libmesh_assert_less (i, this->
n_edges());
3640 libmesh_assert_less (i, this->
n_faces());
3647 const std::vector<unsigned int> nodes = this->
nodes_on_side(i);
3649 auto cmp = [&](
const unsigned int & m,
const unsigned int & n) ->
bool 3653 std::min_element(nodes.begin(), nodes.begin() + N, cmp));
3655 return cmp(nodes[(v - 1 + N) % N], nodes[(v + 1) % N]);
3661 libmesh_assert_less (e, this->
n_edges());
3662 libmesh_assert_less (s, this->
n_faces());
3668 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