16#ifndef dealii_tria_connectivity_h
17#define dealii_tria_connectivity_h
33 namespace TriangulationImplementation
61 virtual ::ArrayView<const unsigned int>
74 virtual ::ReferenceCell
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}}}};
208 virtual ::ReferenceCell
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}}}};
265 virtual ::ReferenceCell
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}}}};
330 virtual ::ReferenceCell
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 = {
441 virtual ::ReferenceCell
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 = {
567 virtual ::ReferenceCell
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 = {
695 virtual ::ReferenceCell
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>
825 const std::vector<::ReferenceCell> &
cell_types)
830 inline std::vector<unsigned char> &
841 inline const std::vector<unsigned char> &
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 key_length,
typename FU>
1000 const unsigned int d,
1001 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1002 const std::vector<::ReferenceCell> & cell_types_index,
1006 std::vector<unsigned char> & orientations,
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)
1038 std::tuple<std::array<unsigned int, key_length>,
unsigned int>>
1041 std::vector<std::array<unsigned int, key_length>> ad_entity_vertices;
1042 std::vector<::ReferenceCell> ad_entity_types;
1043 std::vector<std::array<unsigned int, key_length>> 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(
d);
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;
e < cell_type->n_entities(
d);
e++)
1071 const auto &local_entity_vertices =
1072 cell_type->vertices_of_entity(
d,
e);
1074 std::array<unsigned int, key_length> 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, key_length> 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(cell_type->type_of_entity(
d,
e));
1090 if (compatibility_mode)
1091 ad_compatibility.emplace_back(
1092 second_key_function(entity_vertices, cell_type, c,
e));
1096 col_d.resize(keys.size());
1097 orientations.resize(keys.size());
1101 std::sort(keys.begin(), keys.end());
1104 if (compatibility_mode)
1106 unsigned int n_unique_entities = 0;
1107 unsigned int n_unique_entity_vertices = 0;
1109 std::array<unsigned int, key_length> ref_key, new_key;
1110 std::fill(ref_key.begin(), ref_key.end(), 0);
1111 for (
unsigned int i = 0; i < keys.size(); ++i)
1113 const auto offset_i = std::get<1>(keys[i]);
1115 if (ref_key != std::get<0>(keys[i]))
1117 ref_key = std::get<0>(keys[i]);
1119 n_unique_entities++;
1120 n_unique_entity_vertices +=
1122 ad_entity_types[offset_i])]
1125 new_key = ad_compatibility[offset_i];
1128 std::get<0>(keys[i]) = new_key;
1131 std::sort(keys.begin(), keys.end());
1133 ptr_0.reserve(n_unique_entities);
1134 col_0.reserve(n_unique_entity_vertices);
1138 std::array<unsigned int, key_length> ref_key;
1139 std::array<unsigned int, key_length> ref_indices;
1140 std::fill(ref_key.begin(), ref_key.end(), 0);
1146 const auto offset_i = std::get<1>(keys[i]);
1148 if (ref_key != std::get<0>(keys[i]))
1152 ref_key = std::get<0>(keys[i]);
1153 ref_indices = ad_entity_vertices[offset_i];
1155 ptr_0.push_back(col_0.size());
1156 for (
const auto j : ad_entity_vertices[offset_i])
1158 col_0.push_back(j - offset);
1161 col_d[offset_i] = counter;
1162 orientations[offset_i] = 1;
1166 col_d[offset_i] = counter;
1167 orientations[offset_i] =
1168 ad_entity_types[offset_i].compute_orientation(
1169 ad_entity_vertices[offset_i], ref_indices);
1172 ptr_0.push_back(col_0.size());
1181 template <
typename FU>
1184 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1185 const std::vector<::ReferenceCell> &cell_types_index,
1189 std::vector<unsigned char> & orientations,
1190 const FU & second_key_function)
1192 std::size_t key_length = 0;
1194 for (
const auto &c : cell_types_index)
1196 const auto &cell_type =
1198 for (
unsigned int e = 0;
e < cell_type->n_entities(
d);
e++)
1200 std::max(key_length, cell_type->vertices_of_entity(
d,
e).size());
1203 if (key_length == 2)
1204 build_entity_templated<2>(
d,
1211 second_key_function);
1212 else if (key_length == 3)
1213 build_entity_templated<3>(
d,
1220 second_key_function);
1221 else if (key_length == 4)
1222 build_entity_templated<4>(
d,
1229 second_key_function);
1245 const std::vector<std::shared_ptr<CellTypeBase>> &cell_types,
1246 const std::vector<::ReferenceCell> & cell_types_index,
1252 const std::vector<unsigned char> & ori_cq,
1254 std::vector<unsigned char> & ori_ql,
1255 std::vector<::ReferenceCell> & quad_t_id
1263 con_ql.
ptr.resize(con_qv.
ptr.size());
1266 quad_t_id.resize(con_qv.
ptr.size() - 1);
1269 for (
unsigned int c = 0; c < con_cq.
ptr.size() - 1; ++c)
1271 const auto &cell_type =
1273 cell_types_index[c])];
1276 for (
unsigned int f_ = con_cq.
ptr[c], f_index = 0;
1277 f_ < con_cq.
ptr[c + 1];
1280 const unsigned int f = con_cq.
col[f_];
1282 con_ql.
ptr[f + 1] = cell_type->n_lines_of_surface(f_index);
1287 for (
unsigned int i = 0; i < con_ql.
ptr.size() - 1; ++i)
1288 con_ql.
ptr[i + 1] += con_ql.
ptr[i];
1291 con_ql.
col.resize(con_ql.
ptr.back());
1292 ori_ql.resize(con_ql.
ptr.back());
1295 for (
unsigned int c = 0; c < con_cq.
ptr.size() - 1; ++c)
1297 const auto &cell_type =
1299 cell_types_index[c])];
1302 for (
unsigned int f_ = con_cq.
ptr[c], f_index = 0;
1303 f_ < con_cq.
ptr[c + 1];
1306 const unsigned int f = con_cq.
col[f_];
1309 if (ori_cq[f_] != 1)
1313 quad_t_id[f] = cell_type->type_of_entity(2, f_index);
1316 for (
unsigned int l = 0;
1317 l < cell_type->n_lines_of_surface(f_index);
1321 const unsigned int local_line_index =
1322 cell_type->nth_line_of_surface(
l, f_index);
1323 const unsigned int global_line_index =
1324 con_cl.
col[con_cl.
ptr[c] + local_line_index];
1325 con_ql.
col[con_ql.
ptr[f] +
l] = global_line_index;
1328 const auto line_vertices_1_ref =
1329 cell_type->vertices_of_nth_line_of_surface(
l, f_index);
1332 for (
unsigned int v = 0; v < line_vertices_1_ref.size(); ++v)
1333 if (con_cv.
col[con_cv.
ptr[c] + line_vertices_1_ref[v]] !=
1334 con_lv.
col[con_lv.
ptr[global_line_index] + v])
1341 ori_ql[con_ql.
ptr[f] +
l] = (same ? 1 : 0);
1357 template <
typename T>
1360 const std::vector<std::shared_ptr<CellTypeBase>> &cell_t,
1361 const std::vector<::ReferenceCell> &cell_t_id,
1371 if (dim == 2 || dim == 3)
1373 std::vector<unsigned char> dummy;
1382 [](
auto key,
const auto &,
const auto &,
const auto &) {
1398 [&](
auto key,
const auto &cell_type,
const auto &c,
const auto &f) {
1400 AssertIndexRange(cell_type->n_lines_of_surface(f),
1405 for (; l < cell_type->n_lines_of_surface(f); ++l)
1408 .col[temp1.ptr[c] + cell_type->nth_line_of_surface(l, f)] +
1411 for (; l < key.size(); ++l)
1435 return connectivity;
1443 template <
typename T,
int dim>
1450 std::vector<std::shared_ptr<CellTypeBase>> cell_types_impl(8);
1475 std::vector<T> cell_vertices;
1476 cell_vertices.reserve(
1477 std::accumulate(cells.begin(),
1480 [](
const auto &result,
const auto &cell) {
1481 return result + cell.vertices.size();
1484 std::vector<std::size_t> cell_vertices_ptr;
1485 cell_vertices_ptr.reserve(cells.size() + 1);
1486 cell_vertices_ptr.push_back(0);
1488 std::vector<::ReferenceCell> cell_types_indices;
1489 cell_types_indices.reserve(cells.size());
1492 for (
const auto &cell : cells)
1496 cell.vertices.size());
1502 cell_types_impl.size());
1511 for (
const auto &vertex : cell.vertices)
1512 cell_vertices.push_back(vertex);
1514 cell_vertices_ptr.push_back(cell_vertices.size());
1518 return build_connectivity<T>(dim,
1521 {cell_vertices_ptr, cell_vertices});
static ReferenceCell n_vertices_to_type(const int dim, const unsigned int n_vertices)
#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)
graph_traits< Graph >::vertex_descriptor Vertex
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell &reference_cell)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
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 Line
void determine_neighbors(const CRS< T > &con_cf, CRS< T > &con_cc)
void build_entity_templated(const unsigned int d, 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, std::vector< unsigned char > &orientations, const FU &second_key_function)
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 std::vector< unsigned char > &ori_cq, CRS< unsigned int > &con_ql, std::vector< unsigned char > &ori_ql, std::vector<::ReferenceCell > &quad_t_id)
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_entity(const unsigned int d, 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, std::vector< unsigned char > &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 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 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
::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 n_entities(const unsigned int d) const override
unsigned int n_lines_of_surface(const unsigned int surface) const override
virtual ::ReferenceCell type_of_entity(const unsigned int d, const unsigned int e) 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
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 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
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
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
std::vector<::ReferenceCell > quad_types
const CRS< T > & entity_to_entities(const unsigned int from, const unsigned int to) const
std::vector<::ReferenceCell > & entity_types(const unsigned int structdim)
Connectivity(const unsigned int dim, const std::vector<::ReferenceCell > &cell_types)
CRS< T > & entity_to_entities(const unsigned int from, const unsigned int to)
std::vector< unsigned char > & entity_orientations(const unsigned int structdim)
const std::vector< unsigned char > & entity_orientations(const unsigned int structdim) const
std::vector<::ReferenceCell > cell_types
const std::vector<::ReferenceCell > & entity_types(const unsigned int structdim) const
std::vector< unsigned char > quad_orientation
std::vector< unsigned char > line_orientation