55 VTK_QUADRATIC_EDGE = 21,
56 VTK_QUADRATIC_TRIANGLE = 22,
57 VTK_QUADRATIC_QUAD = 23,
58 VTK_QUADRATIC_TETRA = 24,
59 VTK_QUADRATIC_HEXAHEDRON = 25,
60 VTK_QUADRATIC_WEDGE = 26,
61 VTK_QUADRATIC_PYRAMID = 27,
63 VTK_LAGRANGE_CURVE = 68,
64 VTK_LAGRANGE_TRIANGLE = 69,
65 VTK_LAGRANGE_QUADRILATERAL = 70,
66 VTK_LAGRANGE_TETRAHEDRON = 71,
67 VTK_LAGRANGE_HEXAHEDRON = 72,
68 VTK_LAGRANGE_WEDGE = 73,
69 VTK_LAGRANGE_PYRAMID = 74,
84 if constexpr (dim == 0)
90 case ReferenceCells::Invalid<dim>:
96 else if constexpr (dim == 1)
102 case ReferenceCells::Invalid<dim>:
108 else if constexpr (dim == 2)
116 case ReferenceCells::Invalid<dim>:
122 else if constexpr (dim == 3)
134 case ReferenceCells::Invalid<dim>:
157 const unsigned int child_no,
158 const unsigned int vertex_no,
161 if constexpr (dim > 1)
167 [[maybe_unused]]
const auto V = [](
const unsigned int d) {
171 switch (reference_cell)
179 if constexpr (dim == 1)
182 isotropic_child_vertices = {{
184 {{0.5 *
V(0),
V(0)}},
186 return isotropic_child_vertices[child_no][vertex_no];
195 if constexpr (dim == 2)
198 isotropic_child_vertices = {{
199 {{V0, 0.5 *
V(0), 0.5 *
V(1)}},
200 {{0.5 *
V(0),
V(0), 0.5 * (
V(0) +
V(1))}},
201 {{0.5 *
V(1), 0.5 *
V(0) + 0.5 *
V(1),
V(1)}},
202 {{0.5 *
V(0), 0.5 *
V(0) + 0.5 *
V(1), 0.5 *
V(1)}},
204 return isotropic_child_vertices[child_no][vertex_no];
211 if constexpr (dim == 2)
213 static constexpr Point<2> M = 0.5 * (
V(0) +
V(1));
217 {{V0, 0.5 *
V(0),
V(1),
V(1) + 0.5 *
V(0)}},
218 {{0.5 *
V(0),
V(0), 0.5 *
V(0) +
V(1),
V(0) +
V(1)}},
223 {{V0, V(0), 0.5 * V(1), V(0) + 0.5 * V(1)}},
224 {{0.5 * V(1), V(0) + 0.5 * V(1), V(1), V(0) + V(1)}},
228 isotropic_child_vertices = {{
229 {{V0, 0.5 *
V(0), 0.5 *
V(1), M}},
230 {{0.5 *
V(0),
V(0), M,
V(0) + 0.5 *
V(1)}},
231 {{0.5 *
V(1), M,
V(1),
V(1) + 0.5 *
V(0)}},
232 {{M,
V(0) + 0.5 *
V(1),
V(1) + 0.5 *
V(0),
V(0) +
V(1)}},
235 switch (refinement_case)
238 return cut_x_child_vertices[child_no][vertex_no];
240 return cut_y_child_vertices[child_no][vertex_no];
242 return isotropic_child_vertices[child_no][vertex_no];
268 const unsigned int face_no,
269 const unsigned int subface_no,
270 const unsigned int subface_vertex_no,
274 if constexpr (dim > 1)
277 face_reference_cell(face_no).n_children(
278 face_refinement_case));
280 ExcMessage(
"This function may only be called for subfaces."));
283 face_reference_cell(face_no).n_vertices());
286 for (
const unsigned int vertex_no :
288 p += face_vertex_location(face_no, vertex_no) *
289 face_reference_cell(face_no).d_linear_shape_function(
290 child_vertex(face_reference_cell(face_no),
293 face_refinement_case),
306 const unsigned int subface_no)
const
319 if constexpr (dim == 1)
327 if constexpr (dim == 2)
332 face_reference_cell(0).n_isotropic_children());
333 return std::make_pair(combined_face_orientation ==
339 else if constexpr (dim == 3)
403 static const unsigned int
427 static const RefinementCase<dim - 1> rotated_refinement_case[4] = {
432 const auto [face_orientation, face_rotation, face_flip] =
435 const auto equivalent_refinement_case =
436 equivalent_refine_case[subface_case][subface_no];
437 const unsigned int equivalent_subface_no =
438 equivalent_subface_number[subface_case][subface_no];
445 (face_orientation == face_rotation ?
446 rotated_refinement_case[equivalent_refinement_case] :
447 equivalent_refinement_case);
449 const unsigned int final_subface_no =
451 final_refinement_case),
453 equivalent_subface_no,
457 equivalent_refinement_case);
459 return std::make_pair(final_subface_no, final_refinement_case);
463 (void)combined_face_orientation;
475template <
int spacedim>
476std::unique_ptr<Mapping<dim, spacedim>>
480 return std::make_unique<MappingQ<dim, spacedim>>(degree);
481 else if (is_simplex())
483 return std::make_unique<MappingP1<dim, spacedim>>();
485 return std::make_unique<MappingFE<dim, spacedim>>(
487 else if constexpr (dim == 3)
491 return std::make_unique<MappingFE<dim, spacedim>>(
494 return std::make_unique<MappingFE<dim, spacedim>>(
505template <
int spacedim>
511 else if (is_simplex())
516 else if constexpr (dim == 3)
545 else if (is_simplex())
547 else if constexpr (dim == 3)
570 std::vector<Point<dim>> vertices(reference_cell.n_vertices());
571 for (
const unsigned int v : reference_cell.vertex_indices())
572 vertices[v] = reference_cell.vertex(v);
582 else if (is_simplex())
587 else if constexpr (dim == 3)
613 const unsigned int vertex_n)
const
617 if constexpr (dim == 0)
619 else if constexpr (dim == 1)
621 else if constexpr (dim == 2)
629 constexpr std::array<unsigned int, 4> exodus_to_deal{
631 return exodus_to_deal[vertex_n];
635 else if constexpr (dim == 3)
643 constexpr std::array<unsigned int, 8> exodus_to_deal{
644 {0, 1, 3, 2, 4, 5, 7, 6}};
645 return exodus_to_deal[vertex_n];
649 constexpr std::array<unsigned int, 6> exodus_to_deal{
651 return exodus_to_deal[vertex_n];
655 constexpr std::array<unsigned int, 5> exodus_to_deal{
657 return exodus_to_deal[vertex_n];
675 if constexpr (dim == 0)
677 else if constexpr (dim == 1)
679 else if constexpr (dim == 2)
687 constexpr std::array<unsigned int, 4> exodus_to_deal{
689 return exodus_to_deal[face_n];
693 else if constexpr (dim == 3)
699 constexpr std::array<unsigned int, 4> exodus_to_deal{
701 return exodus_to_deal[face_n];
705 constexpr std::array<unsigned int, 6> exodus_to_deal{
707 return exodus_to_deal[face_n];
711 constexpr std::array<unsigned int, 6> exodus_to_deal{
713 return exodus_to_deal[face_n];
717 constexpr std::array<unsigned int, 5> exodus_to_deal{
719 return exodus_to_deal[face_n];
741 if constexpr (dim == 1)
745 else if constexpr (dim == 2)
755 else if constexpr (dim == 3)
761 constexpr std::array<unsigned int, 4> ucd_to_deal_tet{
763 return ucd_to_deal_tet[vertex_n];
767 constexpr std::array<unsigned int, 5> ucd_to_deal_pyr{
769 return ucd_to_deal_pyr[vertex_n];
773 constexpr std::array<unsigned int, 6> ucd_to_deal_wedge{
775 return ucd_to_deal_wedge[vertex_n];
804 if constexpr (dim == 1)
806 else if constexpr (dim == 2)
810 constexpr std::array<unsigned int, 4> unv_to_deal{{1, 0, 2, 3}};
811 return unv_to_deal[vertex_n];
814 else if constexpr (dim == 3)
818 constexpr std::array<unsigned int, 8> unv_to_deal{
819 {6, 7, 5, 4, 2, 3, 1, 0}};
820 return unv_to_deal[vertex_n];
835 if constexpr (dim == 0)
836 return VTKCellType::VTK_VERTEX;
837 else if constexpr (dim == 1)
838 return VTKCellType::VTK_LINE;
839 else if constexpr (dim == 2)
844 return VTKCellType::VTK_TRIANGLE;
846 return VTKCellType::VTK_QUAD;
849 else if constexpr (dim == 3)
854 return VTKCellType::VTK_TETRA;
856 return VTKCellType::VTK_PYRAMID;
858 return VTKCellType::VTK_WEDGE;
860 return VTKCellType::VTK_HEXAHEDRON;
865 return VTKCellType::VTK_INVALID;
874 if constexpr (dim == 0)
875 return VTKCellType::VTK_VERTEX;
876 else if constexpr (dim == 1)
877 return VTKCellType::VTK_QUADRATIC_EDGE;
878 else if constexpr (dim == 2)
883 return VTKCellType::VTK_QUADRATIC_TRIANGLE;
885 return VTKCellType::VTK_QUADRATIC_QUAD;
888 else if constexpr (dim == 3)
893 return VTKCellType::VTK_QUADRATIC_TETRA;
895 return VTKCellType::VTK_QUADRATIC_PYRAMID;
897 return VTKCellType::VTK_QUADRATIC_WEDGE;
899 return VTKCellType::VTK_QUADRATIC_HEXAHEDRON;
904 return VTKCellType::VTK_INVALID;
913 if constexpr (dim == 0)
914 return VTKCellType::VTK_VERTEX;
915 else if constexpr (dim == 1)
916 return VTKCellType::VTK_LAGRANGE_CURVE;
917 else if constexpr (dim == 2)
922 return VTKCellType::VTK_LAGRANGE_TRIANGLE;
924 return VTKCellType::VTK_LAGRANGE_QUADRILATERAL;
927 else if constexpr (dim == 3)
932 return VTKCellType::VTK_LAGRANGE_TETRAHEDRON;
934 return VTKCellType::VTK_LAGRANGE_PYRAMID;
936 return VTKCellType::VTK_LAGRANGE_WEDGE;
938 return VTKCellType::VTK_LAGRANGE_HEXAHEDRON;
943 return VTKCellType::VTK_INVALID;
951 const std::array<unsigned, dim> &node_indices,
952 const std::array<unsigned, dim> &nodes_per_direction,
953 const bool legacy_format)
const
957 if constexpr (dim == 0)
962 else if constexpr (dim == 1)
968 const unsigned int i = node_indices[0];
970 const bool ibdy = (i == 0 || i == nodes_per_direction[0]);
972 const int nbdy = (ibdy ? 1 : 0);
979 const int offset = 2;
980 return (i - 1) + offset;
982 else if constexpr (dim == 2)
990 const unsigned int i = node_indices[0];
991 const unsigned int j = node_indices[1];
993 const bool ibdy = (i == 0 || i == nodes_per_direction[0]);
994 const bool jbdy = (j == 0 || j == nodes_per_direction[1]);
996 const int nbdy = (ibdy ? 1 : 0) + (jbdy ? 1 : 0);
1000 return (i != 0u ? (j != 0u ? 2 : 1) : (j != 0u ? 3 : 0));
1009 (j != 0u ? nodes_per_direction[0] - 1 +
1010 nodes_per_direction[1] - 1 :
1018 (i != 0u ? nodes_per_direction[0] - 1 :
1019 2 * (nodes_per_direction[0] - 1) +
1020 nodes_per_direction[1] - 1) +
1025 offset += 2 * (nodes_per_direction[0] - 1 + nodes_per_direction[1] - 1);
1027 return offset + (i - 1) + (nodes_per_direction[0] - 1) * ((j - 1));
1029 else if constexpr (dim == 3)
1043 const unsigned int i = node_indices[0];
1044 const unsigned int j = node_indices[1];
1045 const unsigned int k = node_indices[2];
1047 const bool ibdy = (i == 0 || i == nodes_per_direction[0]);
1048 const bool jbdy = (j == 0 || j == nodes_per_direction[1]);
1049 const bool kbdy = (k == 0 || k == nodes_per_direction[2]);
1051 const int nbdy = (ibdy ? 1 : 0) + (jbdy ? 1 : 0) + (kbdy ? 1 : 0);
1055 return (i != 0u ? (j != 0u ? 2 : 1) : (j != 0u ? 3 : 0)) +
1065 (j != 0u ? nodes_per_direction[0] - 1 +
1066 nodes_per_direction[1] - 1 :
1068 (k != 0u ? 2 * (nodes_per_direction[0] - 1 +
1069 nodes_per_direction[1] - 1) :
1076 (i != 0u ? nodes_per_direction[0] - 1 :
1077 2 * (nodes_per_direction[0] - 1) +
1078 nodes_per_direction[1] - 1) +
1079 (k != 0u ? 2 * (nodes_per_direction[0] - 1 +
1080 nodes_per_direction[1] - 1) :
1086 4 * (nodes_per_direction[0] - 1) + 4 * (nodes_per_direction[1] - 1);
1089 (nodes_per_direction[2] - 1) *
1090 (i != 0u ? (j != 0u ? 3 : 1) : (j != 0u ? 2 : 0)) +
1094 (nodes_per_direction[2] - 1) *
1095 (i != 0u ? (j != 0u ? 2 : 1) : (j != 0u ? 3 : 0)) +
1099 offset += 4 * (nodes_per_direction[0] - 1 + nodes_per_direction[1] - 1 +
1100 nodes_per_direction[2] - 1);
1104 return (j - 1) + ((nodes_per_direction[1] - 1) * (k - 1)) +
1105 (i != 0u ? (nodes_per_direction[1] - 1) *
1106 (nodes_per_direction[2] - 1) :
1110 2 * (nodes_per_direction[1] - 1) * (nodes_per_direction[2] - 1);
1112 return (i - 1) + ((nodes_per_direction[0] - 1) * (k - 1)) +
1113 (j != 0u ? (nodes_per_direction[2] - 1) *
1114 (nodes_per_direction[0] - 1) :
1118 2 * (nodes_per_direction[2] - 1) * (nodes_per_direction[0] - 1);
1120 return (i - 1) + ((nodes_per_direction[0] - 1) * (j - 1)) +
1121 (k != 0u ? (nodes_per_direction[0] - 1) *
1122 (nodes_per_direction[1] - 1) :
1129 2 * ((nodes_per_direction[1] - 1) * (nodes_per_direction[2] - 1) +
1130 (nodes_per_direction[2] - 1) * (nodes_per_direction[0] - 1) +
1131 (nodes_per_direction[0] - 1) * (nodes_per_direction[1] - 1));
1132 return offset + (i - 1) +
1133 (nodes_per_direction[0] - 1) *
1134 ((j - 1) + (nodes_per_direction[1] - 1) * ((k - 1)));
1146 const unsigned int vertex_index)
const
1156 if constexpr (dim == 0)
1157 return vertex_index;
1158 else if constexpr (dim == 1)
1159 return vertex_index;
1160 else if constexpr (dim == 2)
1165 return vertex_index;
1168 static constexpr std::array<unsigned int, 4>
1169 index_translation_table = {{0, 1, 3, 2}};
1170 return index_translation_table[vertex_index];
1174 else if constexpr (dim == 3)
1179 return vertex_index;
1182 static constexpr std::array<unsigned int, 5>
1183 index_translation_table = {{0, 1, 3, 2, 4}};
1184 return index_translation_table[vertex_index];
1187 return vertex_index;
1190 static constexpr std::array<unsigned int, 8>
1191 index_translation_table = {{0, 1, 3, 2, 4, 5, 7, 6}};
1192 return index_translation_table[vertex_index];
1260 if constexpr (dim == 0)
1262 else if constexpr (dim == 1)
1264 else if constexpr (dim == 2)
1274 else if constexpr (dim == 3)
1300 std::pair<Point<dim>,
double>
1311 const double t = ((x1 - x0) * (p - x0)) / ((x1 - x0).norm_square());
1319 const auto p2 = x0 + t * (x1 - x0);
1320 return std::make_pair(p2, p2.distance_square(p));
1331 std::pair<Point<dim>,
double>
1332 project_to_quad(
const std::array<
Point<dim>, 3> & ,
1338 std::numeric_limits<double>::signaling_NaN());
1359 std::pair<Point<3>,
double>
1360 project_to_quad(
const std::array<
Point<3>, 3> &vertices,
1371 std::array<Point<3>, 3> shifted_vertices = vertices;
1373 for (
Point<3> &shifted_vertex : shifted_vertices)
1374 shifted_vertex +=
shift;
1383 const Point<3> vertex = shifted_vertices[0];
1393 e0 = shifted_vertices[1] - shifted_vertices[0];
1394 e1 = shifted_vertices[2] - shifted_vertices[0];
1399 e0 = shifted_vertices[1] - shifted_vertices[0];
1400 e1 = shifted_vertices[2] - shifted_vertices[0];
1405 const double c0 = e0 * (shifted_p - vertex) / e0.
norm_square();
1406 const double c1 = e1 * (shifted_p - vertex) / e1.norm_square();
1407 const Point<3> projected_shifted_p = vertex + c0 * e0 + c1 * e1;
1409 bool in_quad =
false;
1413 for (
unsigned int i = 0; i < 3; ++i)
1414 shifted_vertex_matrix[i] = shifted_vertices[i];
1417 bool is_convex_combination =
true;
1418 for (
unsigned int i = 0; i < 3; ++i)
1419 is_convex_combination = is_convex_combination &&
1420 (0.0 <= combination_coordinates[i]) &&
1421 (combination_coordinates[i] <= 1.0);
1422 in_quad = is_convex_combination;
1425 in_quad = (0.0 <= c0 && c0 <= 1.0 && 0.0 <= c1 && c1 <= 1.0);
1428 return std::make_pair(projected_shifted_p - shift,
1431 return std::make_pair(
Point<3>(), std::numeric_limits<double>::max());
1445 if constexpr (dim == 0)
1448 if (contains_point(p, 0.0))
1451 if constexpr (dim == 1)
1452 return project_to_line(vertex(0), vertex(1), p).
first;
1458 unsigned int closest_vertex_no = 0;
1460 for (
unsigned int i = 1; i < n_vertices(); ++i)
1462 const double new_vertex_distance_square =
1464 if (new_vertex_distance_square < closest_vertex_distance_square)
1466 closest_vertex_no = i;
1467 closest_vertex_distance_square = new_vertex_distance_square;
1471 double min_distance_square = std::numeric_limits<double>::max();
1472 if constexpr (dim == 2)
1474 for (
const unsigned int face_no :
1475 faces_for_given_vertex(closest_vertex_no))
1477 const Point<dim> v0 = vertex(line_to_cell_vertices(face_no, 0));
1478 const Point<dim> v1 = vertex(line_to_cell_vertices(face_no, 1));
1480 auto pair = project_to_line(
v0,
v1, p);
1481 if (pair.second < min_distance_square)
1483 result = pair.first;
1484 min_distance_square = pair.second;
1503 const std::array<unsigned int, 5> all_pyramid_faces{{0, 1, 2, 3, 4}};
1507 faces_for_given_vertex(closest_vertex_no);
1508 for (
const unsigned int face_no : faces)
1510 auto face_cell = face_reference_cell(face_no);
1513 std::array<Point<dim>, 3> vertices;
1514 for (
unsigned int vertex_no = 0; vertex_no < 3; ++vertex_no)
1515 vertices[vertex_no] = vertex(face_to_cell_vertices(
1518 auto pair = project_to_quad(vertices, p, face_cell);
1519 if (pair.second < min_distance_square)
1521 result = pair.first;
1522 min_distance_square = pair.second;
1526 for (
const unsigned int face_no :
1527 faces_for_given_vertex(closest_vertex_no))
1529 auto face_cell = face_reference_cell(face_no);
1530 for (
const unsigned int face_line_no : face_cell.line_indices())
1532 const auto cell_line_no =
1533 face_to_cell_lines(face_no,
1537 vertex(line_to_cell_vertices(cell_line_no, 0));
1539 vertex(line_to_cell_vertices(cell_line_no, 1));
1540 auto pair = project_to_line(
v0,
v1, p);
1541 if (pair.second < min_distance_square)
1543 result = pair.first;
1544 min_distance_square = pair.second;
1550 Assert(min_distance_square < std::numeric_limits<double>::max(),
1558 if (!contains_point(result, 0.0))
1560 if constexpr (dim == 2)
1567 for (
unsigned int d = 0; d < dim; ++d)
1568 result[d] = std::clamp(result[d], 0.0, 1.0);
1573 result[0] = std::clamp(result[0], 0.0, 1.0);
1574 result[1] = std::clamp(result[1], 0.0, 1.0 - result[0]);
1581 else if constexpr (dim == 3)
1588 for (
unsigned int d = 0; d < dim; ++d)
1589 result[d] = std::clamp(result[d], 0.0, 1.0);
1594 result[0] = std::clamp(result[0], 0.0, 1.0);
1595 result[1] = std::clamp(result[1], 0.0, 1.0 - result[0]);
1597 std::clamp(result[2], 0.0, 1.0 - result[0] - result[1]);
1602 result[0] = std::clamp(result[0], 0.0, 1.0);
1603 result[1] = std::clamp(result[1], 0.0, 1.0 - result[0]);
1604 result[2] = std::clamp(result[2], 0.0, 1.0);
1609 result[0] = std::clamp(result[0], -1.0, 1.0);
1610 result[1] = std::clamp(result[1], -1.0, 1.0);
1613 const auto x_abs =
std::abs(result[0]);
1614 const auto y_abs =
std::abs(result[1]);
1617 result[2] = std::clamp(result[2], 0.0, 1.0 - x_abs);
1619 result[2] = std::clamp(result[2], 0.0, 1.0 - y_abs);
1633 Assert(contains_point(result,
1634 4.0 * std::numeric_limits<double>::epsilon()),
1651 out << static_cast<unsigned int>(reference_cell.kind);
1666 reference_cell.kind =
static_cast<decltype(reference_cell.kind)
>(value);
1678 (reference_cell == ReferenceCells::Invalid<dim>),
1680 "The reference cell kind just read does not correspond to one of the "
1681 "valid choices. There must be an error."));
1687#include "grid/reference_cell.inst"
1695template unsigned int
1698template unsigned int
1701template unsigned int
1704template unsigned int
1706 const unsigned int vertex_index)
const;
1714template std::ostream &
1717template std::istream &
Implementation of the classic affine transformation mapping used for simplices.
Abstract base class for mapping classes.
constexpr numbers::NumberTraits< Number >::real_type distance_square(const Point< dim, Number > &p) const
static constexpr Point< dim, Number > unit_vector(const unsigned int i)
unsigned int unv_vertex_to_deal_vertex(const unsigned int vertex_n) const
const Quadrature< dim > & get_nodal_type_quadrature() const
unsigned int ucd_vertex_to_deal_vertex(const unsigned int vertex_n) const
unsigned int vtk_quadratic_type() const
Point< dim > closest_point(const Point< dim > &p) const
unsigned int vtk_lagrange_type() const
Quadrature< dim > get_gauss_type_quadrature(const unsigned n_points_1d) const
unsigned int vtk_vertex_to_deal_vertex(const unsigned int vertex_index) const
std::pair< unsigned int, RefinementCase< dim - 1 > > equivalent_refinement_case(const types::geometric_orientation combined_face_orientation, const internal::SubfaceCase< dim > subface_case, const unsigned int subface_no) const
std::unique_ptr< Mapping< dim, spacedim > > get_default_mapping(const unsigned int degree) const
std::string to_string() const
unsigned int vtk_lexicographic_to_node_index(const std::array< unsigned, dim > &node_indices, const std::array< unsigned, dim > &nodes_per_direction, const bool legacy_format) const
unsigned int gmsh_element_type() const
unsigned int exodusii_vertex_to_deal_vertex(const unsigned int vertex_n) const
const Mapping< dim, spacedim > & get_default_linear_mapping() const
Point< dim > subface_vertex_location(const unsigned int face_no, const unsigned int subface_no, const unsigned int subface_vertex_no, const RefinementCase< dim - 1 > face_refinement_case) const
unsigned int exodusii_face_to_deal_face(const unsigned int face_n) const
unsigned int vtk_linear_type() const
constexpr numbers::NumberTraits< Number >::real_type norm_square() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ASSERT_UNREACHABLE()
#define DEAL_II_NOT_IMPLEMENTED()
static ::ExceptionBase & ExcIO()
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
constexpr ReferenceCell< 3 > Hexahedron
constexpr ReferenceCell< 2 > Quadrilateral
constexpr ReferenceCell< 1 > Line
constexpr ReferenceCell< 2 > Triangle
constexpr ReferenceCell< 3 > Tetrahedron
constexpr ReferenceCell< 3 > Pyramid
constexpr ReferenceCell< 3 > Wedge
constexpr ReferenceCell< 0 > Vertex
std::tuple< bool, bool, bool > split_face_orientation(const types::geometric_orientation combined_orientation)
constexpr unsigned int invalid_unsigned_int
constexpr types::geometric_orientation reverse_line_orientation
constexpr types::geometric_orientation default_geometric_orientation
::VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &)
std::uint8_t geometric_orientation
typename internal::ndarray::HelperArray< T, Ns... >::type ndarray
std::istream & operator>>(std::istream &in, ReferenceCell< dim > &reference_cell)
std::ostream & operator<<(std::ostream &out, const ReferenceCell< dim > &reference_cell)
static unsigned int child_cell_on_face(const RefinementCase< dim > &ref_case, const unsigned int face, const unsigned int subface, const bool face_orientation=true, const bool face_flip=false, const bool face_rotation=false, const RefinementCase< dim - 1 > &face_refinement_case=RefinementCase< dim - 1 >::isotropic_refinement)
constexpr SymmetricTensor< 2, dim, Number > invert(const SymmetricTensor< 2, dim, Number > &)