16#ifndef dealii_tria_connectivity_h
17#define dealii_tria_connectivity_h
34 namespace TriangulationImplementation
62 virtual ::ArrayView<const unsigned int>
102 const unsigned int face)
const
114 virtual const std::array<unsigned int, 2> &
116 const unsigned int face)
const
122 const static std::array<unsigned int, 2> table = {};
137 const unsigned int e)
const override
143 static const std::array<unsigned int, 2> table = {{0, 1}};
171 static std::array<unsigned int, 2> table = {{2, 1}};
185 const unsigned int e)
const override
189 static const std::array<unsigned int, 3> table = {{0, 1, 2}};
198 static const ::ndarray<unsigned int, 3, 2> table = {
199 {{{0, 1}}, {{1, 2}}, {{2, 0}}}};
228 static std::array<unsigned int, 3> table = {{3, 3, 1}};
242 const unsigned int e)
const override
246 static const std::array<unsigned int, 4> table = {{0, 1, 2, 3}};
255 static const ::ndarray<unsigned int, 4, 2> table = {
256 {{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}};
285 static std::array<unsigned int, 3> table = {{4, 4, 1}};
299 const unsigned int e)
const override
303 static const std::array<unsigned int, 4> table = {{0, 1, 2, 3}};
312 static const ::ndarray<unsigned int, 4, 3> table = {
313 {{{0, 1, 2}}, {{1, 0, 3}}, {{0, 2, 3}}, {{2, 1, 3}}}};
320 static const ::ndarray<unsigned int, 6, 2> table = {
321 {{{0, 1}}, {{1, 2}}, {{2, 0}}, {{0, 3}}, {{1, 3}}, {{2, 3}}}};
353 static std::array<unsigned int, 4> table = {{4, 6, 4, 1}};
366 const unsigned int face)
const override
368 const static ::ndarray<unsigned int, 4, 3> table = {
369 {{{0, 1, 2}}, {{0, 3, 4}}, {{2, 5, 3}}, {{1, 4, 5}}}};
371 return table[face][line];
374 const std::array<unsigned int, 2> &
376 const unsigned int face)
const override
378 const static ::ndarray<unsigned int, 4, 3, 2> table = {
379 {{{{{0, 1}}, {{1, 2}}, {{2, 0}}}},
380 {{{{1, 0}}, {{0, 3}}, {{3, 1}}}},
381 {{{{0, 2}}, {{2, 3}}, {{3, 0}}}},
382 {{{{2, 1}}, {{1, 3}}, {{3, 2}}}}}};
384 return table[face][line];
397 const unsigned int e)
const override
401 static const std::array<unsigned int, 5> table = {{0, 1, 2, 3, 4}};
412 static const std::array<unsigned int, 4> table = {{0, 1, 2, 3}};
416 static const ::ndarray<unsigned int, 4, 3> table = {
417 {{{0, 2, 4}}, {{3, 1, 4}}, {{1, 0, 4}}, {{2, 3, 4}}}};
419 return {table[e - 1]};
424 static const ::ndarray<unsigned int, 8, 2> table = {
450 if (d == 2 && e == 0)
466 static std::array<unsigned int, 4> table = {{5, 8, 5, 1}};
481 const unsigned int face)
const override
483 const static ::ndarray<unsigned int, 5, 4> table = {
490 return table[face][line];
493 const std::array<unsigned int, 2> &
495 const unsigned int face)
const override
497 static const unsigned int X =
static_cast<unsigned int>(-1);
499 const static ::ndarray<unsigned int, 5, 4, 2> table = {
500 {{{{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}},
501 {{{{0, 2}}, {{2, 4}}, {{4, 0}}, {{X, X}}}},
502 {{{{3, 1}}, {{1, 4}}, {{4, 3}}, {{X, X}}}},
503 {{{{1, 0}}, {{0, 4}}, {{4, 1}}, {{X, X}}}},
504 {{{{2, 3}}, {{3, 4}}, {{4, 2}}, {{X, X}}}}}};
506 return table[face][line];
519 const unsigned int e)
const override
523 static const std::array<unsigned int, 6> table = {
533 if (e == 0 || e == 1)
535 static const ::ndarray<unsigned int, 2, 3> table = {
536 {{{1, 0, 2}}, {{3, 4, 5}}}};
541 static const ::ndarray<unsigned int, 3, 4> table = {
542 {{{0, 1, 3, 4}}, {{1, 2, 4, 5}}, {{2, 0, 5, 3}}}};
544 return {table[e - 2]};
549 static const ::ndarray<unsigned int, 9, 2> table = {
592 static std::array<unsigned int, 4> table = {{6, 9, 5, 1}};
607 const unsigned int face)
const override
609 static const unsigned int X =
static_cast<unsigned int>(-1);
611 const static ::ndarray<unsigned int, 5, 4> table = {
618 return table[face][line];
621 const std::array<unsigned int, 2> &
623 const unsigned int face)
const override
625 static const unsigned int X =
static_cast<unsigned int>(-1);
627 const static ::ndarray<unsigned int, 5, 4, 2> table = {
628 {{{{{1, 0}}, {{0, 2}}, {{2, 1}}, {{X, X}}}},
629 {{{{3, 4}}, {{4, 5}}, {{5, 3}}, {{X, X}}}},
630 {{{{0, 3}}, {{1, 4}}, {{0, 1}}, {{3, 4}}}},
631 {{{{1, 4}}, {{2, 5}}, {{1, 2}}, {{4, 5}}}},
632 {{{{2, 5}}, {{0, 3}}, {{2, 0}}, {{5, 3}}}}}};
634 return table[face][line];
647 const unsigned int e)
const override
651 static const std::array<unsigned int, 8> table = {
652 {0, 1, 2, 3, 4, 5, 6, 7}};
661 static const ::ndarray<unsigned int, 6, 4> table = {
674 static const ::ndarray<unsigned int, 12, 2> table = {
718 static std::array<unsigned int, 4> table = {{8, 12, 6, 1}};
731 const unsigned int face)
const override
733 const static ::ndarray<unsigned int, 6, 4> table = {
741 return table[face][line];
744 const std::array<unsigned int, 2> &
746 const unsigned int face)
const override
748 const static ::ndarray<unsigned int, 6, 4, 2> table = {
749 {{{{{0, 4}}, {{2, 6}}, {{0, 2}}, {{4, 6}}}},
750 {{{{1, 5}}, {{3, 7}}, {{1, 3}}, {{5, 7}}}},
751 {{{{0, 1}}, {{4, 5}}, {{0, 4}}, {{1, 5}}}},
752 {{{{2, 3}}, {{6, 7}}, {{2, 6}}, {{3, 7}}}},
753 {{{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}},
754 {{{{4, 6}}, {{5, 7}}, {{4, 5}}, {{6, 7}}}}}};
756 return table[face][line];
768 template <
typename T =
unsigned int>
780 CRS(
const std::vector<std::size_t> &
ptr,
const std::vector<T> &
col)
786 std::vector<std::size_t>
ptr;
822 template <
typename T =
unsigned int>
853 inline std::vector<ReferenceCell> &
856 if (structdim ==
dim)
866 inline const std::vector<ReferenceCell> &
869 if (structdim ==
dim)
882 if (from ==
dim && to ==
dim)
884 else if (from ==
dim && to ==
dim - 1)
886 else if (
dim == 3 && from == 2 && to == 0)
888 else if (
dim == 3 && from == 2 && to == 1)
890 else if (from == 1 && to == 0)
901 if (from ==
dim && to ==
dim)
903 else if (from ==
dim && to ==
dim - 1)
905 else if (
dim == 3 && from == 2 && to == 0)
907 else if (
dim == 3 && from == 2 && to == 1)
909 else if (from == 1 && to == 0)
945 template <
typename T>
949 const auto &col_cf = con_cf.
col;
950 const auto &ptr_cf = con_cf.
ptr;
952 auto &col_cc = con_cc.
col;
953 auto &ptr_cc = con_cc.
ptr;
955 const unsigned int n_faces =
956 *std::max_element(col_cf.begin(), col_cf.end()) + 1;
960 col_cc = std::vector<T>(col_cf.size(), -1);
963 std::vector<std::pair<T, unsigned int>> neighbors(n_faces, {-1, -1});
966 for (
unsigned int i_0 = 0; i_0 < ptr_cf.size() - 1; ++i_0)
969 for (std::size_t j_0 = ptr_cf[i_0]; j_0 < ptr_cf[i_0 + 1]; ++j_0)
971 if (neighbors[col_cf[j_0]].
first ==
static_cast<unsigned int>(-1))
975 neighbors[col_cf[j_0]] = std::pair<T, unsigned int>(i_0, j_0);
982 col_cc[j_0] = neighbors[col_cf[j_0]].first;
983 col_cc[neighbors[col_cf[j_0]].second] = i_0;
998 template <
int max_n_vertices,
typename FU>
1001 const unsigned int face_dimensionality,
1002 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1003 const std::vector<ReferenceCell> & cell_types_index,
1008 const FU & second_key_function)
1010 const bool compatibility_mode =
true;
1012 const std::vector<std::size_t> & cell_ptr = crs.
ptr;
1013 const std::vector<unsigned int> &cell_vertices = crs.
col;
1014 std::vector<std::size_t> & ptr_d = crs_d.
ptr;
1015 std::vector<unsigned int> & col_d = crs_d.
col;
1019 std::vector<std::size_t> & ptr_0 = crs_0.
ptr;
1020 std::vector<unsigned int> &col_0 = crs_0.
col;
1026 unsigned int n_entities = 0;
1028 for (
const auto &c : cell_types_index)
1031 face_dimensionality);
1039 std::tuple<std::array<unsigned int, max_n_vertices>,
unsigned int>>
1042 std::vector<std::array<unsigned int, max_n_vertices>> ad_entity_vertices;
1043 std::vector<ReferenceCell> ad_entity_types;
1044 std::vector<std::array<unsigned int, max_n_vertices>> ad_compatibility;
1046 keys.reserve(n_entities);
1047 ad_entity_vertices.reserve(n_entities);
1048 ad_entity_types.reserve(n_entities);
1049 ad_compatibility.reserve(n_entities);
1051 ptr_d.resize(cell_types_index.size() + 1);
1054 static const unsigned int offset = 1;
1057 for (
unsigned int c = 0, counter = 0; c < cell_types_index.size(); ++c)
1059 const auto &cell_type =
1061 cell_types_index[c])];
1062 ptr_d[c + 1] = ptr_d[c] + cell_type->n_entities(face_dimensionality);
1065 const ::ArrayView<const unsigned int> cell_vertice(
1066 cell_vertices.data() + cell_ptr[c], cell_ptr[c + 1] - cell_ptr[c]);
1069 for (
unsigned int e = 0;
1070 e < cell_type->n_entities(face_dimensionality);
1074 const auto &local_entity_vertices =
1075 cell_type->vertices_of_entity(face_dimensionality, e);
1077 std::array<unsigned int, max_n_vertices> entity_vertices;
1078 std::fill(entity_vertices.begin(), entity_vertices.end(), 0);
1080 for (
unsigned int i = 0; i < local_entity_vertices.size(); ++i)
1081 entity_vertices[i] =
1082 cell_vertice[local_entity_vertices[i]] + offset;
1085 std::array<unsigned int, max_n_vertices> key = entity_vertices;
1086 std::sort(key.begin(), key.end());
1087 keys.emplace_back(key, counter++);
1089 ad_entity_vertices.emplace_back(entity_vertices);
1091 ad_entity_types.emplace_back(
1092 cell_type->type_of_entity(face_dimensionality, e));
1094 if (compatibility_mode)
1095 ad_compatibility.emplace_back(
1096 second_key_function(entity_vertices, cell_type, c, e));
1100 col_d.resize(keys.size());
1101 orientations.
reinit(keys.size());
1105 std::sort(keys.begin(), keys.end());
1108 if (compatibility_mode)
1110 unsigned int n_unique_entities = 0;
1111 unsigned int n_unique_entity_vertices = 0;
1113 std::array<unsigned int, max_n_vertices> ref_key, new_key;
1114 std::fill(ref_key.begin(), ref_key.end(), 0);
1115 for (
unsigned int i = 0; i < keys.size(); ++i)
1117 const auto offset_i = std::get<1>(keys[i]);
1119 if (ref_key != std::get<0>(keys[i]))
1121 ref_key = std::get<0>(keys[i]);
1123 n_unique_entities++;
1124 n_unique_entity_vertices +=
1126 ad_entity_types[offset_i])]
1129 new_key = ad_compatibility[offset_i];
1132 std::get<0>(keys[i]) = new_key;
1135 std::sort(keys.begin(), keys.end());
1137 ptr_0.reserve(n_unique_entities + 1);
1138 col_0.reserve(n_unique_entity_vertices);
1142 std::array<unsigned int, max_n_vertices> ref_key;
1143 std::array<unsigned int, max_n_vertices> ref_indices;
1144 std::fill(ref_key.begin(), ref_key.end(), 0);
1147 for (
unsigned int i = 0; i < keys.size(); i++)
1149 const auto offset_i = std::get<1>(keys[i]);
1151 if (ref_key != std::get<0>(keys[i]))
1155 ref_key = std::get<0>(keys[i]);
1156 ref_indices = ad_entity_vertices[offset_i];
1158 ptr_0.push_back(col_0.size());
1159 for (
const auto j : ad_entity_vertices[offset_i])
1161 col_0.push_back(j - offset);
1169 ad_entity_types[offset_i]
1170 .
template get_combined_orientation<unsigned int>(
1172 ad_entity_vertices[offset_i].begin() +
1173 ad_entity_types[offset_i].n_vertices()),
1175 ref_indices.begin() +
1176 ad_entity_types[offset_i].n_vertices())));
1178 col_d[offset_i] = counter;
1180 ptr_0.push_back(col_0.size());
1189 template <
typename FU>
1192 const unsigned int face_dimensionality,
1193 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1194 const std::vector<ReferenceCell> & cell_types_index,
1199 const FU & second_key_function)
1201 std::size_t max_n_vertices = 0;
1203 for (
const auto &c : cell_types_index)
1205 const auto &cell_type =
1207 for (
unsigned int e = 0;
1208 e < cell_type->n_entities(face_dimensionality);
1212 cell_type->vertices_of_entity(face_dimensionality, e).size());
1215 if (max_n_vertices == 2)
1216 build_face_entities_templated<2>(face_dimensionality,
1223 second_key_function);
1224 else if (max_n_vertices == 3)
1225 build_face_entities_templated<3>(face_dimensionality,
1232 second_key_function);
1233 else if (max_n_vertices == 4)
1234 build_face_entities_templated<4>(face_dimensionality,
1241 second_key_function);
1257 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1258 const std::vector<ReferenceCell> & cell_types_index,
1267 std::vector<ReferenceCell> & quad_t_id
1274 con_ql.
ptr.resize(con_qv.
ptr.size());
1277 quad_t_id.resize(con_qv.
ptr.size() - 1);
1280 for (
unsigned int c = 0; c < con_cq.
ptr.size() - 1; ++c)
1282 const auto &cell_type =
1284 cell_types_index[c])];
1287 for (
unsigned int f_ = con_cq.
ptr[c], f_index = 0;
1288 f_ < con_cq.
ptr[c + 1];
1291 const unsigned int f = con_cq.
col[f_];
1293 con_ql.
ptr[f + 1] = cell_type->n_lines_of_surface(f_index);
1298 for (
unsigned int i = 0; i < con_ql.
ptr.size() - 1; ++i)
1299 con_ql.
ptr[i + 1] += con_ql.
ptr[i];
1302 con_ql.
col.resize(con_ql.
ptr.back());
1306 for (
unsigned int c = 0; c < con_cq.
ptr.size() - 1; ++c)
1308 const auto &cell_type =
1310 cell_types_index[c])];
1313 for (
unsigned int f_ = con_cq.
ptr[c], f_index = 0;
1314 f_ < con_cq.
ptr[c + 1];
1317 const unsigned int f = con_cq.
col[f_];
1325 quad_t_id[f] = cell_type->type_of_entity(2, f_index);
1328 for (
unsigned int l = 0;
1329 l < cell_type->n_lines_of_surface(f_index);
1333 const unsigned int local_line_index =
1334 cell_type->nth_line_of_surface(l, f_index);
1335 const unsigned int global_line_index =
1336 con_cl.
col[con_cl.
ptr[c] + local_line_index];
1337 con_ql.
col[con_ql.
ptr[f] + l] = global_line_index;
1340 const auto line_vertices_1_ref =
1341 cell_type->vertices_of_nth_line_of_surface(l, f_index);
1344 for (
unsigned int v = 0; v < line_vertices_1_ref.size(); ++v)
1345 if (con_cv.
col[con_cv.
ptr[c] + line_vertices_1_ref[v]] !=
1346 con_lv.
col[con_lv.
ptr[global_line_index] + v])
1372 template <
typename T>
1375 const std::vector<std::shared_ptr<CellTypeBase>> &cell_t,
1376 const std::vector<ReferenceCell> &cell_t_id,
1386 if (dim == 2 || dim == 3)
1398 [](
auto key,
const auto &,
const auto &,
const auto &) {
1414 [&](
auto key,
const auto &cell_type,
const auto &c,
const auto &f) {
1416 AssertIndexRange(cell_type->n_lines_of_surface(f),
1421 for (; l < cell_type->n_lines_of_surface(f); ++l)
1424 .col[temp1.ptr[c] + cell_type->nth_line_of_surface(l, f)] +
1427 for (; l < key.size(); ++l)
1451 return connectivity;
1459 template <
typename T,
int dim>
1466 std::vector<std::shared_ptr<CellTypeBase>> cell_types_impl(8);
1474 std::make_shared<CellTypeQuadrilateral>();
1485 std::vector<T> cell_vertices;
1486 cell_vertices.reserve(
1487 std::accumulate(cells.begin(),
1490 [](
const auto &result,
const auto &cell) {
1491 return result + cell.vertices.size();
1494 std::vector<std::size_t> cell_vertices_ptr;
1495 cell_vertices_ptr.reserve(cells.size() + 1);
1496 cell_vertices_ptr.push_back(0);
1498 std::vector<ReferenceCell> cell_types_indices;
1499 cell_types_indices.reserve(cells.size());
1502 for (
const auto &cell : cells)
1505 auto vertices_unique = cell.vertices;
1506 std::sort(vertices_unique.begin(), vertices_unique.end());
1507 vertices_unique.erase(std::unique(vertices_unique.begin(),
1508 vertices_unique.end()),
1509 vertices_unique.end());
1511 Assert(vertices_unique.size() == cell.vertices.size(),
1513 "The definition of a cell refers to the same vertex several "
1514 "times. This is not possible. A common reason is that "
1515 "CellData::vertices has a size that does not match the "
1516 "size expected from the reference cell. Please resize "
1517 "CellData::vertices or use the appropriate constructor of "
1528 cell_types_impl.size());
1534 cell_types_indices.push_back(reference_cell);
1537 for (
const auto &vertex : cell.vertices)
1538 cell_vertices.push_back(vertex);
1540 cell_vertices_ptr.push_back(cell_vertices.size());
1544 return build_connectivity<T>(dim,
1547 {cell_vertices_ptr, cell_vertices});
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
static constexpr unsigned char default_combined_face_orientation()
static constexpr unsigned char reversed_combined_line_orientation()
static ReferenceCell n_vertices_to_type(const int dim, const unsigned int n_vertices)
void reinit(const unsigned int n_objects)
void set_combined_orientation(const unsigned int object, const unsigned char value)
unsigned char get_combined_orientation(const unsigned int object) const
#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)
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)
static const unsigned int invalid_unsigned_int
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
std::uint8_t geometric_entity_type
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