15#ifndef dealii_tria_connectivity_h
16#define dealii_tria_connectivity_h
33 namespace TriangulationImplementation
61 virtual ::ArrayView<const unsigned int>
101 const unsigned int face)
const
113 virtual const std::array<unsigned int, 2> &
115 const unsigned int face)
const
121 const static std::array<unsigned int, 2> table = {};
136 const unsigned int e)
const override
142 static const std::array<unsigned int, 2> table = {{0, 1}};
170 static std::array<unsigned int, 2> table = {{2, 1}};
184 const unsigned int e)
const override
188 static const std::array<unsigned int, 3> table = {{0, 1, 2}};
197 static const ::ndarray<unsigned int, 3, 2> table = {
198 {{{0, 1}}, {{1, 2}}, {{2, 0}}}};
227 static std::array<unsigned int, 3> table = {{3, 3, 1}};
241 const unsigned int e)
const override
245 static const std::array<unsigned int, 4> table = {{0, 1, 2, 3}};
254 static const ::ndarray<unsigned int, 4, 2> table = {
255 {{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}};
284 static std::array<unsigned int, 3> table = {{4, 4, 1}};
298 const unsigned int e)
const override
302 static const std::array<unsigned int, 4> table = {{0, 1, 2, 3}};
311 static const ::ndarray<unsigned int, 4, 3> table = {
312 {{{0, 1, 2}}, {{1, 0, 3}}, {{0, 2, 3}}, {{2, 1, 3}}}};
319 static const ::ndarray<unsigned int, 6, 2> table = {
320 {{{0, 1}}, {{1, 2}}, {{2, 0}}, {{0, 3}}, {{1, 3}}, {{2, 3}}}};
352 static std::array<unsigned int, 4> table = {{4, 6, 4, 1}};
365 const unsigned int face)
const override
367 const static ::ndarray<unsigned int, 4, 3> table = {
368 {{{0, 1, 2}}, {{0, 3, 4}}, {{2, 5, 3}}, {{1, 4, 5}}}};
370 return table[face][line];
373 const std::array<unsigned int, 2> &
375 const unsigned int face)
const override
377 const static ::ndarray<unsigned int, 4, 3, 2> table = {
378 {{{{{0, 1}}, {{1, 2}}, {{2, 0}}}},
379 {{{{1, 0}}, {{0, 3}}, {{3, 1}}}},
380 {{{{0, 2}}, {{2, 3}}, {{3, 0}}}},
381 {{{{2, 1}}, {{1, 3}}, {{3, 2}}}}}};
383 return table[face][line];
396 const unsigned int e)
const override
400 static const std::array<unsigned int, 5> table = {{0, 1, 2, 3, 4}};
411 static const std::array<unsigned int, 4> table = {{0, 1, 2, 3}};
415 static const ::ndarray<unsigned int, 4, 3> table = {
416 {{{0, 2, 4}}, {{3, 1, 4}}, {{1, 0, 4}}, {{2, 3, 4}}}};
418 return {table[e - 1]};
423 static const ::ndarray<unsigned int, 8, 2> table = {
449 if (d == 2 && e == 0)
465 static std::array<unsigned int, 4> table = {{5, 8, 5, 1}};
480 const unsigned int face)
const override
482 const static ::ndarray<unsigned int, 5, 4> table = {
489 return table[face][line];
492 const std::array<unsigned int, 2> &
494 const unsigned int face)
const override
496 static const unsigned int X =
static_cast<unsigned int>(-1);
498 const static ::ndarray<unsigned int, 5, 4, 2> table = {
499 {{{{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}},
500 {{{{0, 2}}, {{2, 4}}, {{4, 0}}, {{X, X}}}},
501 {{{{3, 1}}, {{1, 4}}, {{4, 3}}, {{X, X}}}},
502 {{{{1, 0}}, {{0, 4}}, {{4, 1}}, {{X, X}}}},
503 {{{{2, 3}}, {{3, 4}}, {{4, 2}}, {{X, X}}}}}};
505 return table[face][line];
518 const unsigned int e)
const override
522 static const std::array<unsigned int, 6> table = {
532 if (e == 0 || e == 1)
534 static const ::ndarray<unsigned int, 2, 3> table = {
535 {{{1, 0, 2}}, {{3, 4, 5}}}};
540 static const ::ndarray<unsigned int, 3, 4> table = {
541 {{{0, 1, 3, 4}}, {{1, 2, 4, 5}}, {{2, 0, 5, 3}}}};
543 return {table[e - 2]};
548 static const ::ndarray<unsigned int, 9, 2> table = {
591 static std::array<unsigned int, 4> table = {{6, 9, 5, 1}};
606 const unsigned int face)
const override
608 static const unsigned int X =
static_cast<unsigned int>(-1);
610 const static ::ndarray<unsigned int, 5, 4> table = {
617 return table[face][line];
620 const std::array<unsigned int, 2> &
622 const unsigned int face)
const override
624 static const unsigned int X =
static_cast<unsigned int>(-1);
626 const static ::ndarray<unsigned int, 5, 4, 2> table = {
627 {{{{{1, 0}}, {{0, 2}}, {{2, 1}}, {{X, X}}}},
628 {{{{3, 4}}, {{4, 5}}, {{5, 3}}, {{X, X}}}},
629 {{{{0, 3}}, {{1, 4}}, {{0, 1}}, {{3, 4}}}},
630 {{{{1, 4}}, {{2, 5}}, {{1, 2}}, {{4, 5}}}},
631 {{{{2, 5}}, {{0, 3}}, {{2, 0}}, {{5, 3}}}}}};
633 return table[face][line];
646 const unsigned int e)
const override
650 static const std::array<unsigned int, 8> table = {
651 {0, 1, 2, 3, 4, 5, 6, 7}};
660 static const ::ndarray<unsigned int, 6, 4> table = {
673 static const ::ndarray<unsigned int, 12, 2> table = {
717 static std::array<unsigned int, 4> table = {{8, 12, 6, 1}};
730 const unsigned int face)
const override
732 const static ::ndarray<unsigned int, 6, 4> table = {
740 return table[face][line];
743 const std::array<unsigned int, 2> &
745 const unsigned int face)
const override
747 const static ::ndarray<unsigned int, 6, 4, 2> table = {
748 {{{{{0, 4}}, {{2, 6}}, {{0, 2}}, {{4, 6}}}},
749 {{{{1, 5}}, {{3, 7}}, {{1, 3}}, {{5, 7}}}},
750 {{{{0, 1}}, {{4, 5}}, {{0, 4}}, {{1, 5}}}},
751 {{{{2, 3}}, {{6, 7}}, {{2, 6}}, {{3, 7}}}},
752 {{{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}},
753 {{{{4, 6}}, {{5, 7}}, {{4, 5}}, {{6, 7}}}}}};
755 return table[face][line];
767 template <
typename T =
unsigned int>
779 CRS(
const std::vector<std::size_t> &
ptr,
const std::vector<T> &
col)
785 std::vector<std::size_t>
ptr;
821 template <
typename T =
unsigned int>
852 inline std::vector<ReferenceCell> &
855 if (structdim ==
dim)
865 inline const std::vector<ReferenceCell> &
868 if (structdim ==
dim)
881 if (from ==
dim && to ==
dim)
883 else if (from ==
dim && to ==
dim - 1)
885 else if (
dim == 3 && from == 2 && to == 0)
887 else if (
dim == 3 && from == 2 && to == 1)
889 else if (from == 1 && to == 0)
900 if (from ==
dim && to ==
dim)
902 else if (from ==
dim && to ==
dim - 1)
904 else if (
dim == 3 && from == 2 && to == 0)
906 else if (
dim == 3 && from == 2 && to == 1)
908 else if (from == 1 && to == 0)
944 template <
typename T>
948 const auto &col_cf = con_cf.
col;
949 const auto &ptr_cf = con_cf.
ptr;
951 auto &col_cc = con_cc.
col;
952 auto &ptr_cc = con_cc.
ptr;
954 const unsigned int n_faces =
955 *std::max_element(col_cf.begin(), col_cf.end()) + 1;
959 col_cc = std::vector<T>(col_cf.size(), -1);
962 std::vector<std::pair<T, unsigned int>> neighbors(n_faces, {-1, -1});
965 for (
unsigned int i_0 = 0; i_0 < ptr_cf.size() - 1; ++i_0)
968 for (std::size_t j_0 = ptr_cf[i_0]; j_0 < ptr_cf[i_0 + 1]; ++j_0)
970 if (neighbors[col_cf[j_0]].
first ==
static_cast<unsigned int>(-1))
974 neighbors[col_cf[j_0]] = std::pair<T, unsigned int>(i_0, j_0);
981 col_cc[j_0] = neighbors[col_cf[j_0]].first;
982 col_cc[neighbors[col_cf[j_0]].second] = i_0;
997 template <
int max_n_vertices,
typename FU>
1000 const unsigned int face_dimensionality,
1001 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1002 const std::vector<ReferenceCell> &cell_types_index,
1007 const FU &second_key_function)
1009 const bool compatibility_mode =
true;
1011 const std::vector<std::size_t> &cell_ptr = crs.
ptr;
1012 const std::vector<unsigned int> &cell_vertices = crs.
col;
1013 std::vector<std::size_t> &ptr_d = crs_d.
ptr;
1014 std::vector<unsigned int> &col_d = crs_d.
col;
1018 std::vector<std::size_t> &ptr_0 = crs_0.
ptr;
1019 std::vector<unsigned int> &col_0 = crs_0.
col;
1025 unsigned int n_entities = 0;
1027 for (
const auto &c : cell_types_index)
1030 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 =
1060 cell_types_index[c])];
1061 ptr_d[c + 1] = ptr_d[c] + cell_type->n_entities(face_dimensionality);
1064 const ::ArrayView<const unsigned int> cell_vertice(
1065 cell_vertices.data() + cell_ptr[c], cell_ptr[c + 1] - cell_ptr[c]);
1068 for (
unsigned int e = 0;
1069 e < cell_type->n_entities(face_dimensionality);
1073 const auto &local_entity_vertices =
1074 cell_type->vertices_of_entity(face_dimensionality, e);
1076 std::array<unsigned int, max_n_vertices> entity_vertices;
1077 std::fill(entity_vertices.begin(), entity_vertices.end(), 0);
1079 for (
unsigned int i = 0; i < local_entity_vertices.size(); ++i)
1080 entity_vertices[i] =
1081 cell_vertice[local_entity_vertices[i]] + offset;
1084 std::array<unsigned int, max_n_vertices> key = entity_vertices;
1085 std::sort(key.begin(), key.end());
1086 keys.emplace_back(key, counter++);
1088 ad_entity_vertices.emplace_back(entity_vertices);
1090 ad_entity_types.emplace_back(
1091 cell_type->type_of_entity(face_dimensionality, e));
1093 if (compatibility_mode)
1094 ad_compatibility.emplace_back(
1095 second_key_function(entity_vertices, cell_type, c, e));
1099 col_d.resize(keys.size());
1100 orientations.
reinit(keys.size());
1104 std::sort(keys.begin(), keys.end());
1107 if (compatibility_mode)
1109 unsigned int n_unique_entities = 0;
1110 unsigned int n_unique_entity_vertices = 0;
1112 std::array<unsigned int, max_n_vertices> ref_key, new_key;
1113 std::fill(ref_key.begin(), ref_key.end(), 0);
1114 for (
unsigned int i = 0; i < keys.size(); ++i)
1116 const auto offset_i = std::get<1>(keys[i]);
1118 if (ref_key != std::get<0>(keys[i]))
1120 ref_key = std::get<0>(keys[i]);
1122 ++n_unique_entities;
1123 n_unique_entity_vertices +=
1125 ad_entity_types[offset_i])]
1128 new_key = ad_compatibility[offset_i];
1131 std::get<0>(keys[i]) = new_key;
1134 std::sort(keys.begin(), keys.end());
1136 ptr_0.reserve(n_unique_entities + 1);
1137 col_0.reserve(n_unique_entity_vertices);
1141 std::array<unsigned int, max_n_vertices> ref_key;
1142 std::array<unsigned int, max_n_vertices> ref_indices;
1143 std::fill(ref_key.begin(), ref_key.end(), 0);
1146 for (
unsigned int i = 0; i < keys.size(); i++)
1148 const auto offset_i = std::get<1>(keys[i]);
1150 if (ref_key != std::get<0>(keys[i]))
1154 ref_key = std::get<0>(keys[i]);
1155 ref_indices = ad_entity_vertices[offset_i];
1157 ptr_0.push_back(col_0.size());
1158 for (
const auto j : ad_entity_vertices[offset_i])
1160 col_0.push_back(j - offset);
1168 ad_entity_types[offset_i]
1169 .
template get_combined_orientation<unsigned int>(
1171 ad_entity_vertices[offset_i].begin() +
1172 ad_entity_types[offset_i].n_vertices()),
1174 ref_indices.begin() +
1175 ad_entity_types[offset_i].n_vertices())));
1177 col_d[offset_i] = counter;
1179 ptr_0.push_back(col_0.size());
1188 template <
typename FU>
1191 const unsigned int face_dimensionality,
1192 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1193 const std::vector<ReferenceCell> &cell_types_index,
1198 const FU &second_key_function)
1200 std::size_t max_n_vertices = 0;
1202 for (
const auto &c : cell_types_index)
1204 const auto &cell_type =
1206 for (
unsigned int e = 0;
1207 e < cell_type->n_entities(face_dimensionality);
1211 cell_type->vertices_of_entity(face_dimensionality, e).size());
1214 if (max_n_vertices == 2)
1215 build_face_entities_templated<2>(face_dimensionality,
1222 second_key_function);
1223 else if (max_n_vertices == 3)
1224 build_face_entities_templated<3>(face_dimensionality,
1231 second_key_function);
1232 else if (max_n_vertices == 4)
1233 build_face_entities_templated<4>(face_dimensionality,
1240 second_key_function);
1256 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1257 const std::vector<ReferenceCell> &cell_types_index,
1266 std::vector<ReferenceCell> &quad_t_id
1273 con_ql.
ptr.resize(con_qv.
ptr.size());
1276 quad_t_id.resize(con_qv.
ptr.size() - 1);
1279 for (
unsigned int c = 0; c < con_cq.
ptr.size() - 1; ++c)
1281 const auto &cell_type =
1283 cell_types_index[c])];
1286 for (
unsigned int f_ = con_cq.
ptr[c], f_index = 0;
1287 f_ < con_cq.
ptr[c + 1];
1290 const unsigned int f = con_cq.
col[f_];
1292 con_ql.
ptr[f + 1] = cell_type->n_lines_of_surface(f_index);
1297 for (
unsigned int i = 0; i < con_ql.
ptr.size() - 1; ++i)
1298 con_ql.
ptr[i + 1] += con_ql.
ptr[i];
1301 con_ql.
col.resize(con_ql.
ptr.back());
1305 for (
unsigned int c = 0; c < con_cq.
ptr.size() - 1; ++c)
1307 const auto &cell_type =
1309 cell_types_index[c])];
1312 for (
unsigned int f_ = con_cq.
ptr[c], f_index = 0;
1313 f_ < con_cq.
ptr[c + 1];
1316 const unsigned int f = con_cq.
col[f_];
1324 quad_t_id[f] = cell_type->type_of_entity(2, f_index);
1327 for (
unsigned int l = 0;
1328 l < cell_type->n_lines_of_surface(f_index);
1332 const unsigned int local_line_index =
1333 cell_type->nth_line_of_surface(l, f_index);
1334 const unsigned int global_line_index =
1335 con_cl.
col[con_cl.
ptr[c] + local_line_index];
1336 con_ql.
col[con_ql.
ptr[f] + l] = global_line_index;
1339 const auto line_vertices_1_ref =
1340 cell_type->vertices_of_nth_line_of_surface(l, f_index);
1343 for (
unsigned int v = 0; v < line_vertices_1_ref.size(); ++v)
1344 if (con_cv.
col[con_cv.
ptr[c] + line_vertices_1_ref[v]] !=
1345 con_lv.
col[con_lv.
ptr[global_line_index] + v])
1371 template <
typename T>
1374 const std::vector<std::shared_ptr<CellTypeBase>> &cell_t,
1375 const std::vector<ReferenceCell> &cell_t_id,
1385 if (dim == 2 || dim == 3)
1397 [](
auto key,
const auto &,
const auto &,
const auto &) {
1413 [&](
auto key,
const auto &cell_type,
const auto &c,
const auto &f) {
1415 AssertIndexRange(cell_type->n_lines_of_surface(f),
1420 for (; l < cell_type->n_lines_of_surface(f); ++l)
1423 .col[temp1.ptr[c] + cell_type->nth_line_of_surface(l, f)] +
1426 for (; l < key.size(); ++l)
1450 return connectivity;
1458 template <
typename T,
int dim>
1465 std::vector<std::shared_ptr<CellTypeBase>> cell_types_impl(8);
1473 std::make_shared<CellTypeQuadrilateral>();
1484 std::vector<T> cell_vertices;
1485 cell_vertices.reserve(
1486 std::accumulate(cells.begin(),
1489 [](
const auto &result,
const auto &cell) {
1490 return result + cell.vertices.size();
1493 std::vector<std::size_t> cell_vertices_ptr;
1494 cell_vertices_ptr.reserve(cells.size() + 1);
1495 cell_vertices_ptr.push_back(0);
1497 std::vector<ReferenceCell> cell_types_indices;
1498 cell_types_indices.reserve(cells.size());
1501 for (
const auto &cell : cells)
1504 auto vertices_unique = cell.vertices;
1505 std::sort(vertices_unique.begin(), vertices_unique.end());
1506 vertices_unique.erase(std::unique(vertices_unique.begin(),
1507 vertices_unique.end()),
1508 vertices_unique.end());
1510 Assert(vertices_unique.size() == cell.vertices.size(),
1512 "The definition of a cell refers to the same vertex several "
1513 "times. This is not possible. A common reason is that "
1514 "CellData::vertices has a size that does not match the "
1515 "size expected from the reference cell. Please resize "
1516 "CellData::vertices or use the appropriate constructor of "
1527 cell_types_impl.size());
1533 cell_types_indices.push_back(reference_cell);
1536 for (
const auto &vertex : cell.vertices)
1537 cell_vertices.push_back(vertex);
1539 cell_vertices_ptr.push_back(cell_vertices.size());
1543 return build_connectivity<T>(dim,
1546 {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 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)
#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)
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