15#ifndef dealii_tria_connectivity_h
16#define dealii_tria_connectivity_h
35 namespace TriangulationImplementation
63 virtual ::ArrayView<const unsigned int>
103 const unsigned int face)
const
115 virtual const std::array<unsigned int, 2> &
117 const unsigned int face)
const
123 const static std::array<unsigned int, 2> table = {};
138 const unsigned int e)
const override
144 static const std::array<unsigned int, 2> table = {{0, 1}};
172 static std::array<unsigned int, 2> table = {{2, 1}};
186 const unsigned int e)
const override
190 static const std::array<unsigned int, 3> table = {{0, 1, 2}};
199 static const ::ndarray<unsigned int, 3, 2> table = {
200 {{{0, 1}}, {{1, 2}}, {{2, 0}}}};
229 static std::array<unsigned int, 3> table = {{3, 3, 1}};
243 const unsigned int e)
const override
247 static const std::array<unsigned int, 4> table = {{0, 1, 2, 3}};
256 static const ::ndarray<unsigned int, 4, 2> table = {
257 {{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}};
286 static std::array<unsigned int, 3> table = {{4, 4, 1}};
300 const unsigned int e)
const override
304 static const std::array<unsigned int, 4> table = {{0, 1, 2, 3}};
313 static const ::ndarray<unsigned int, 4, 3> table = {
314 {{{0, 1, 2}}, {{1, 0, 3}}, {{0, 2, 3}}, {{2, 1, 3}}}};
321 static const ::ndarray<unsigned int, 6, 2> table = {
322 {{{0, 1}}, {{1, 2}}, {{2, 0}}, {{0, 3}}, {{1, 3}}, {{2, 3}}}};
354 static std::array<unsigned int, 4> table = {{4, 6, 4, 1}};
367 const unsigned int face)
const override
369 const static ::ndarray<unsigned int, 4, 3> table = {
370 {{{0, 1, 2}}, {{0, 3, 4}}, {{2, 5, 3}}, {{1, 4, 5}}}};
372 return table[face][line];
375 const std::array<unsigned int, 2> &
377 const unsigned int face)
const override
379 const static ::ndarray<unsigned int, 4, 3, 2> table = {
380 {{{{{0, 1}}, {{1, 2}}, {{2, 0}}}},
381 {{{{1, 0}}, {{0, 3}}, {{3, 1}}}},
382 {{{{0, 2}}, {{2, 3}}, {{3, 0}}}},
383 {{{{2, 1}}, {{1, 3}}, {{3, 2}}}}}};
385 return table[face][line];
398 const unsigned int e)
const override
402 static const std::array<unsigned int, 5> table = {{0, 1, 2, 3, 4}};
413 static const std::array<unsigned int, 4> table = {{0, 1, 2, 3}};
417 static const ::ndarray<unsigned int, 4, 3> table = {
418 {{{0, 2, 4}}, {{3, 1, 4}}, {{1, 0, 4}}, {{2, 3, 4}}}};
420 return {table[e - 1]};
425 static const ::ndarray<unsigned int, 8, 2> table = {
451 if (d == 2 && e == 0)
467 static std::array<unsigned int, 4> table = {{5, 8, 5, 1}};
482 const unsigned int face)
const override
484 const static ::ndarray<unsigned int, 5, 4> table = {
491 return table[face][line];
494 const std::array<unsigned int, 2> &
496 const unsigned int face)
const override
498 static const unsigned int X =
static_cast<unsigned int>(-1);
500 const static ::ndarray<unsigned int, 5, 4, 2> table = {
501 {{{{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}},
502 {{{{0, 2}}, {{2, 4}}, {{4, 0}}, {{X, X}}}},
503 {{{{3, 1}}, {{1, 4}}, {{4, 3}}, {{X, X}}}},
504 {{{{1, 0}}, {{0, 4}}, {{4, 1}}, {{X, X}}}},
505 {{{{2, 3}}, {{3, 4}}, {{4, 2}}, {{X, X}}}}}};
507 return table[face][line];
520 const unsigned int e)
const override
524 static const std::array<unsigned int, 6> table = {
534 if (e == 0 || e == 1)
536 static const ::ndarray<unsigned int, 2, 3> table = {
537 {{{1, 0, 2}}, {{3, 4, 5}}}};
542 static const ::ndarray<unsigned int, 3, 4> table = {
543 {{{0, 1, 3, 4}}, {{1, 2, 4, 5}}, {{2, 0, 5, 3}}}};
545 return {table[e - 2]};
550 static const ::ndarray<unsigned int, 9, 2> table = {
593 static std::array<unsigned int, 4> table = {{6, 9, 5, 1}};
608 const unsigned int face)
const override
610 static const unsigned int X =
static_cast<unsigned int>(-1);
612 const static ::ndarray<unsigned int, 5, 4> table = {
619 return table[face][line];
622 const std::array<unsigned int, 2> &
624 const unsigned int face)
const override
626 static const unsigned int X =
static_cast<unsigned int>(-1);
628 const static ::ndarray<unsigned int, 5, 4, 2> table = {
629 {{{{{1, 0}}, {{0, 2}}, {{2, 1}}, {{X, X}}}},
630 {{{{3, 4}}, {{4, 5}}, {{5, 3}}, {{X, X}}}},
631 {{{{0, 3}}, {{1, 4}}, {{0, 1}}, {{3, 4}}}},
632 {{{{1, 4}}, {{2, 5}}, {{1, 2}}, {{4, 5}}}},
633 {{{{2, 5}}, {{0, 3}}, {{2, 0}}, {{5, 3}}}}}};
635 return table[face][line];
648 const unsigned int e)
const override
652 static const std::array<unsigned int, 8> table = {
653 {0, 1, 2, 3, 4, 5, 6, 7}};
662 static const ::ndarray<unsigned int, 6, 4> table = {
675 static const ::ndarray<unsigned int, 12, 2> table = {
719 static std::array<unsigned int, 4> table = {{8, 12, 6, 1}};
732 const unsigned int face)
const override
734 const static ::ndarray<unsigned int, 6, 4> table = {
742 return table[face][line];
745 const std::array<unsigned int, 2> &
747 const unsigned int face)
const override
749 const static ::ndarray<unsigned int, 6, 4, 2> table = {
750 {{{{{0, 4}}, {{2, 6}}, {{0, 2}}, {{4, 6}}}},
751 {{{{1, 5}}, {{3, 7}}, {{1, 3}}, {{5, 7}}}},
752 {{{{0, 1}}, {{4, 5}}, {{0, 4}}, {{1, 5}}}},
753 {{{{2, 3}}, {{6, 7}}, {{2, 6}}, {{3, 7}}}},
754 {{{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}},
755 {{{{4, 6}}, {{5, 7}}, {{4, 5}}, {{6, 7}}}}}};
757 return table[face][line];
769 template <
typename T =
unsigned int>
781 CRS(
const std::vector<std::size_t> &
ptr,
const std::vector<T> &
col)
787 std::vector<std::size_t>
ptr;
823 template <
typename T =
unsigned int>
854 inline std::vector<ReferenceCell> &
857 if (structdim ==
dim)
867 inline const std::vector<ReferenceCell> &
870 if (structdim ==
dim)
883 if (from ==
dim && to ==
dim)
885 else if (from ==
dim && to ==
dim - 1)
887 else if (
dim == 3 && from == 2 && to == 0)
889 else if (
dim == 3 && from == 2 && to == 1)
891 else if (from == 1 && to == 0)
902 if (from ==
dim && to ==
dim)
904 else if (from ==
dim && to ==
dim - 1)
906 else if (
dim == 3 && from == 2 && to == 0)
908 else if (
dim == 3 && from == 2 && to == 1)
910 else if (from == 1 && to == 0)
946 template <
typename T>
950 const auto &col_cf = con_cf.
col;
951 const auto &ptr_cf = con_cf.
ptr;
953 auto &col_cc = con_cc.
col;
954 auto &ptr_cc = con_cc.
ptr;
956 const unsigned int n_faces =
957 *std::max_element(col_cf.begin(), col_cf.end()) + 1;
961 col_cc = std::vector<T>(col_cf.size(), -1);
964 std::vector<std::pair<T, unsigned int>> neighbors(n_faces, {-1, -1});
967 for (
unsigned int i_0 = 0; i_0 < ptr_cf.size() - 1; ++i_0)
970 for (std::size_t j_0 = ptr_cf[i_0]; j_0 < ptr_cf[i_0 + 1]; ++j_0)
972 if (neighbors[col_cf[j_0]].
first ==
static_cast<unsigned int>(-1))
976 neighbors[col_cf[j_0]] = std::pair<T, unsigned int>(i_0, j_0);
983 col_cc[j_0] = neighbors[col_cf[j_0]].first;
984 col_cc[neighbors[col_cf[j_0]].second] = i_0;
999 template <
int max_n_vertices,
typename FU>
1002 const unsigned int face_dimensionality,
1003 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1004 const std::vector<ReferenceCell> &cell_types_index,
1009 const FU &second_key_function)
1011 const bool compatibility_mode =
true;
1013 const std::vector<std::size_t> &cell_ptr = crs.
ptr;
1014 const std::vector<unsigned int> &cell_vertices = crs.
col;
1015 std::vector<std::size_t> &ptr_d = crs_d.
ptr;
1016 std::vector<unsigned int> &col_d = crs_d.
col;
1020 std::vector<std::size_t> &ptr_0 = crs_0.
ptr;
1021 std::vector<unsigned int> &col_0 = crs_0.
col;
1027 unsigned int n_entities = 0;
1029 for (
const auto &c : cell_types_index)
1030 n_entities += cell_types[c]->n_entities(face_dimensionality);
1038 std::tuple<std::array<unsigned int, max_n_vertices>,
unsigned int>>
1041 std::vector<std::array<unsigned int, max_n_vertices>> ad_entity_vertices;
1042 std::vector<ReferenceCell> ad_entity_types;
1043 std::vector<std::array<unsigned int, max_n_vertices>> ad_compatibility;
1045 keys.reserve(n_entities);
1046 ad_entity_vertices.reserve(n_entities);
1047 ad_entity_types.reserve(n_entities);
1048 ad_compatibility.reserve(n_entities);
1050 ptr_d.resize(cell_types_index.size() + 1);
1053 static const unsigned int offset = 1;
1056 for (
unsigned int c = 0, counter = 0; c < cell_types_index.size(); ++c)
1058 const auto &cell_type = cell_types[cell_types_index[c]];
1059 ptr_d[c + 1] = ptr_d[c] + cell_type->n_entities(face_dimensionality);
1062 const ::ArrayView<const unsigned int> cell_vertice(
1063 cell_vertices.data() + cell_ptr[c], cell_ptr[c + 1] - cell_ptr[c]);
1066 for (
unsigned int e = 0;
1067 e < cell_type->n_entities(face_dimensionality);
1071 const auto &local_entity_vertices =
1072 cell_type->vertices_of_entity(face_dimensionality, e);
1074 std::array<unsigned int, max_n_vertices> entity_vertices;
1075 std::fill(entity_vertices.begin(), entity_vertices.end(), 0);
1077 for (
unsigned int i = 0; i < local_entity_vertices.size(); ++i)
1078 entity_vertices[i] =
1079 cell_vertice[local_entity_vertices[i]] + offset;
1082 std::array<unsigned int, max_n_vertices> key = entity_vertices;
1083 std::sort(key.begin(), key.end());
1084 keys.emplace_back(key, counter++);
1086 ad_entity_vertices.emplace_back(entity_vertices);
1088 ad_entity_types.emplace_back(
1089 cell_type->type_of_entity(face_dimensionality, e));
1091 if (compatibility_mode)
1092 ad_compatibility.emplace_back(
1093 second_key_function(entity_vertices, cell_type, c, e));
1097 col_d.resize(keys.size());
1098 orientations.
reinit(keys.size());
1102 std::sort(keys.begin(), keys.end());
1105 if (compatibility_mode)
1107 unsigned int n_unique_entities = 0;
1108 unsigned int n_unique_entity_vertices = 0;
1110 std::array<unsigned int, max_n_vertices> ref_key, new_key;
1111 std::fill(ref_key.begin(), ref_key.end(), 0);
1112 for (
unsigned int i = 0; i < keys.size(); ++i)
1114 const auto offset_i = std::get<1>(keys[i]);
1116 if (ref_key != std::get<0>(keys[i]))
1118 ref_key = std::get<0>(keys[i]);
1120 ++n_unique_entities;
1121 n_unique_entity_vertices +=
1122 cell_types[ad_entity_types[offset_i]]->n_entities(0);
1124 new_key = ad_compatibility[offset_i];
1127 std::get<0>(keys[i]) = new_key;
1130 std::sort(keys.begin(), keys.end());
1132 ptr_0.reserve(n_unique_entities + 1);
1133 col_0.reserve(n_unique_entity_vertices);
1137 std::array<unsigned int, max_n_vertices> ref_key;
1138 std::array<unsigned int, max_n_vertices> ref_indices;
1139 std::fill(ref_key.begin(), ref_key.end(), 0);
1142 for (
unsigned int i = 0; i < keys.size(); i++)
1144 const auto offset_i = std::get<1>(keys[i]);
1146 if (ref_key != std::get<0>(keys[i]))
1150 ref_key = std::get<0>(keys[i]);
1151 ref_indices = ad_entity_vertices[offset_i];
1153 ptr_0.push_back(col_0.size());
1154 for (
const auto j : ad_entity_vertices[offset_i])
1156 col_0.push_back(j - offset);
1164 ad_entity_types[offset_i]
1165 .
template get_combined_orientation<unsigned int>(
1167 ad_entity_vertices[offset_i].begin() +
1168 ad_entity_types[offset_i].n_vertices()),
1170 ref_indices.begin() +
1171 ad_entity_types[offset_i].n_vertices())));
1173 col_d[offset_i] = counter;
1175 ptr_0.push_back(col_0.size());
1184 template <
typename FU>
1187 const unsigned int face_dimensionality,
1188 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1189 const std::vector<ReferenceCell> &cell_types_index,
1194 const FU &second_key_function)
1196 std::size_t max_n_vertices = 0;
1198 for (
const auto &c : cell_types_index)
1200 const auto &cell_type = cell_types[c];
1201 for (
unsigned int e = 0;
1202 e < cell_type->n_entities(face_dimensionality);
1206 cell_type->vertices_of_entity(face_dimensionality, e).size());
1209 if (max_n_vertices == 2)
1210 build_face_entities_templated<2>(face_dimensionality,
1217 second_key_function);
1218 else if (max_n_vertices == 3)
1219 build_face_entities_templated<3>(face_dimensionality,
1226 second_key_function);
1227 else if (max_n_vertices == 4)
1228 build_face_entities_templated<4>(face_dimensionality,
1235 second_key_function);
1251 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1252 const std::vector<ReferenceCell> &cell_types_index,
1261 std::vector<ReferenceCell> &quad_t_id
1268 con_ql.
ptr.resize(con_qv.
ptr.size());
1271 quad_t_id.resize(con_qv.
ptr.size() - 1);
1274 for (
unsigned int c = 0; c < con_cq.
ptr.size() - 1; ++c)
1276 const auto &cell_type = cell_types[cell_types_index[c]];
1279 for (
unsigned int f_ = con_cq.
ptr[c], f_index = 0;
1280 f_ < con_cq.
ptr[c + 1];
1283 const unsigned int f = con_cq.
col[f_];
1285 con_ql.
ptr[f + 1] = cell_type->n_lines_of_surface(f_index);
1290 for (
unsigned int i = 0; i < con_ql.
ptr.size() - 1; ++i)
1291 con_ql.
ptr[i + 1] += con_ql.
ptr[i];
1294 con_ql.
col.resize(con_ql.
ptr.back());
1298 for (
unsigned int c = 0; c < con_cq.
ptr.size() - 1; ++c)
1300 const auto &cell_type = cell_types[cell_types_index[c]];
1303 for (
unsigned int f_ = con_cq.
ptr[c], f_index = 0;
1304 f_ < con_cq.
ptr[c + 1];
1307 const unsigned int f = con_cq.
col[f_];
1315 quad_t_id[f] = cell_type->type_of_entity(2, f_index);
1318 for (
unsigned int l = 0;
1319 l < cell_type->n_lines_of_surface(f_index);
1323 const unsigned int local_line_index =
1324 cell_type->nth_line_of_surface(l, f_index);
1325 const unsigned int global_line_index =
1326 con_cl.
col[con_cl.
ptr[c] + local_line_index];
1327 con_ql.
col[con_ql.
ptr[f] + l] = global_line_index;
1330 const auto line_vertices_1_ref =
1331 cell_type->vertices_of_nth_line_of_surface(l, f_index);
1334 for (
unsigned int v = 0; v < line_vertices_1_ref.size(); ++v)
1335 if (con_cv.
col[con_cv.
ptr[c] + line_vertices_1_ref[v]] !=
1336 con_lv.
col[con_lv.
ptr[global_line_index] + v])
1362 template <
typename T>
1365 const std::vector<std::shared_ptr<CellTypeBase>> &cell_t,
1366 const std::vector<ReferenceCell> &cell_t_id,
1376 if (dim == 2 || dim == 3)
1388 [](
auto key,
const auto &,
const auto &,
const auto &) {
1404 [&](
auto key,
const auto &cell_type,
const auto &c,
const auto &f) {
1406 AssertIndexRange(cell_type->n_lines_of_surface(f),
1411 for (; l < cell_type->n_lines_of_surface(f); ++l)
1414 .col[temp1.ptr[c] + cell_type->nth_line_of_surface(l, f)] +
1417 for (; l < key.size(); ++l)
1441 return connectivity;
1449 template <
typename T,
int dim>
1456 std::vector<std::shared_ptr<CellTypeBase>> cell_types_impl(8);
1460 std::make_shared<CellTypeTriangle>();
1462 std::make_shared<CellTypeQuadrilateral>();
1464 std::make_shared<CellTypeTetrahedron>();
1466 std::make_shared<CellTypePyramid>();
1468 std::make_shared<CellTypeWedge>();
1470 std::make_shared<CellTypeHexahedron>();
1473 std::vector<T> cell_vertices;
1474 cell_vertices.reserve(
1475 std::accumulate(cells.begin(),
1478 [](
const auto &result,
const auto &cell) {
1479 return result + cell.vertices.size();
1482 std::vector<std::size_t> cell_vertices_ptr;
1483 cell_vertices_ptr.reserve(cells.size() + 1);
1484 cell_vertices_ptr.push_back(0);
1486 std::vector<ReferenceCell> cell_types_indices;
1487 cell_types_indices.reserve(cells.size());
1490 for (
const auto &cell : cells)
1493 auto vertices_unique = cell.vertices;
1494 std::sort(vertices_unique.begin(), vertices_unique.end());
1495 vertices_unique.erase(std::unique(vertices_unique.begin(),
1496 vertices_unique.end()),
1497 vertices_unique.end());
1499 Assert(vertices_unique.size() == cell.vertices.size(),
1501 "The definition of a cell refers to the same vertex several "
1502 "times. This is not possible. A common reason is that "
1503 "CellData::vertices has a size that does not match the "
1504 "size expected from the reference cell. Please resize "
1505 "CellData::vertices or use the appropriate constructor of "
1515 cell_types_impl.size());
1516 Assert(cell_types_impl[reference_cell].get() !=
nullptr,
1519 cell_types_indices.push_back(reference_cell);
1522 for (
const auto &vertex : cell.vertices)
1523 cell_vertices.push_back(vertex);
1525 cell_vertices_ptr.push_back(cell_vertices.size());
1529 return build_connectivity<T>(dim,
1532 {cell_vertices_ptr, cell_vertices});
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
static ReferenceCell n_vertices_to_type(const int dim, const unsigned int n_vertices)
void reinit(const unsigned int n_objects)
types::geometric_orientation get_combined_orientation(const unsigned int object) const
void set_combined_orientation(const unsigned int object, const types::geometric_orientation value)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
#define DEAL_II_NOT_IMPLEMENTED()
constexpr const ReferenceCell Tetrahedron
constexpr const ReferenceCell Quadrilateral
constexpr const ReferenceCell Wedge
constexpr const ReferenceCell Pyramid
constexpr const ReferenceCell Invalid
constexpr const ReferenceCell Triangle
constexpr const ReferenceCell Hexahedron
constexpr const ReferenceCell Vertex
constexpr const ReferenceCell Line
void determine_neighbors(const CRS< T > &con_cf, CRS< T > &con_cc)
void build_intersection(const std::vector< std::shared_ptr< CellTypeBase > > &cell_types, const std::vector< ReferenceCell > &cell_types_index, const CRS< unsigned int > &con_cv, const CRS< unsigned int > &con_cl, const CRS< unsigned int > &con_lv, const CRS< unsigned int > &con_cq, const CRS< unsigned int > &con_qv, const TriaObjectsOrientations &ori_cq, CRS< unsigned int > &con_ql, TriaObjectsOrientations &ori_ql, std::vector< ReferenceCell > &quad_t_id)
void build_face_entities_templated(const unsigned int face_dimensionality, const std::vector< std::shared_ptr< CellTypeBase > > &cell_types, const std::vector< ReferenceCell > &cell_types_index, const CRS< unsigned int > &crs, CRS< unsigned int > &crs_d, CRS< unsigned int > &crs_0, TriaObjectsOrientations &orientations, const FU &second_key_function)
Connectivity< T > build_connectivity(const unsigned int dim, const std::vector< std::shared_ptr< CellTypeBase > > &cell_t, const std::vector< ReferenceCell > &cell_t_id, const CRS< T > &con_cv)
void build_face_entities(const unsigned int face_dimensionality, const std::vector< std::shared_ptr< CellTypeBase > > &cell_types, const std::vector< ReferenceCell > &cell_types_index, const CRS< unsigned int > &crs, CRS< unsigned int > &crs_d, CRS< unsigned int > &crs_0, TriaObjectsOrientations &orientations, const FU &second_key_function)
constexpr unsigned int invalid_unsigned_int
constexpr types::geometric_orientation reverse_line_orientation
constexpr types::geometric_orientation default_geometric_orientation
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
std::vector< std::size_t > ptr
CRS(const std::vector< std::size_t > &ptr, const std::vector< T > &col)
virtual unsigned int n_entities(const unsigned int d) const
virtual ::ArrayView< const unsigned int > vertices_of_entity(const unsigned int d, const unsigned int e) const
virtual ReferenceCell type_of_entity(const unsigned int d, const unsigned int e) const
virtual const std::array< unsigned int, 2 > & vertices_of_nth_line_of_surface(const unsigned int line, const unsigned int face) const
virtual unsigned int n_lines_of_surface(const unsigned int face) const
virtual ~CellTypeBase()=default
virtual unsigned int nth_line_of_surface(const unsigned int line, const unsigned int face) const
virtual ReferenceCell type_of_entity(const unsigned int d, const unsigned int e) const override
::ArrayView< const unsigned int > vertices_of_entity(const unsigned int d, const unsigned int e) const override
unsigned int nth_line_of_surface(const unsigned int line, const unsigned int face) const override
unsigned int n_entities(const unsigned int d) const override
const std::array< unsigned int, 2 > & vertices_of_nth_line_of_surface(const unsigned int line, const unsigned int face) const override
unsigned int n_lines_of_surface(const unsigned int surface) const override
::ArrayView< const unsigned int > vertices_of_entity(const unsigned int d, const unsigned int e) const override
unsigned int n_entities(const unsigned int d) const override
ReferenceCell type_of_entity(const unsigned int d, const unsigned int e) const override
unsigned int n_lines_of_surface(const unsigned int surface) const override
const std::array< unsigned int, 2 > & vertices_of_nth_line_of_surface(const unsigned int line, const unsigned int face) const override
::ArrayView< const unsigned int > vertices_of_entity(const unsigned int d, const unsigned int e) const override
unsigned int n_entities(const unsigned int d) const override
unsigned int nth_line_of_surface(const unsigned int line, const unsigned int face) const override
virtual ReferenceCell type_of_entity(const unsigned int d, const unsigned int e) const override
virtual ReferenceCell type_of_entity(const unsigned int d, const unsigned int e) const override
unsigned int n_entities(const unsigned int d) const override
::ArrayView< const unsigned int > vertices_of_entity(const unsigned int d, const unsigned int e) const override
unsigned int nth_line_of_surface(const unsigned int line, const unsigned int face) const override
unsigned int n_lines_of_surface(const unsigned int line) const override
::ArrayView< const unsigned int > vertices_of_entity(const unsigned int d, const unsigned int e) const override
unsigned int n_entities(const unsigned int d) const override
const std::array< unsigned int, 2 > & vertices_of_nth_line_of_surface(const unsigned int line, const unsigned int face) const override
virtual ReferenceCell type_of_entity(const unsigned int d, const unsigned int e) const override
unsigned int n_entities(const unsigned int d) const override
::ArrayView< const unsigned int > vertices_of_entity(const unsigned int d, const unsigned int e) const override
virtual ReferenceCell type_of_entity(const unsigned int d, const unsigned int e) const override
unsigned int n_entities(const unsigned int d) const override
unsigned int n_lines_of_surface(const unsigned int surface) const override
::ArrayView< const unsigned int > vertices_of_entity(const unsigned int d, const unsigned int e) const override
virtual ReferenceCell type_of_entity(const unsigned int d, const unsigned int e) const override
unsigned int nth_line_of_surface(const unsigned int line, const unsigned int face) const override
const std::array< unsigned int, 2 > & vertices_of_nth_line_of_surface(const unsigned int line, const unsigned int face) const override
const CRS< T > & entity_to_entities(const unsigned int from, const unsigned int to) const
CRS< T > & entity_to_entities(const unsigned int from, const unsigned int to)
TriaObjectsOrientations line_orientation
std::vector< ReferenceCell > & entity_types(const unsigned int structdim)
const std::vector< ReferenceCell > & entity_types(const unsigned int structdim) const
TriaObjectsOrientations quad_orientation
std::vector< ReferenceCell > quad_types
Connectivity(const unsigned int dim, const std::vector< ReferenceCell > &cell_types)
std::vector< ReferenceCell > cell_types
TriaObjectsOrientations & entity_orientations(const unsigned int structdim)
const TriaObjectsOrientations & entity_orientations(const unsigned int structdim) const