25#include <deal.II/matrix_free/dof_info.templates.h>
38 static_assert(std::is_same_v<compressed_constraint_kind, std::uint8_t>,
39 "Unexpected type for compressed hanging node indicators!");
68 for (
unsigned int i = 0; i < 3; ++i)
85 const unsigned int cell,
86 const bool apply_constraints)
const
89 const unsigned int fe_index =
97 const unsigned int n_vectorization_actual =
103 my_rows.reserve(n_vectorization * dofs_this_cell);
105 unsigned int total_size = 0;
106 for (
unsigned int v = 0; v < n_vectorization_actual; ++v)
108 const unsigned int ib =
109 (cell * n_vectorization + v) * n_fe_components;
110 const unsigned int ie =
111 (cell * n_vectorization + v + 1) * n_fe_components;
116 const bool has_constraints =
124 auto do_copy = [&](
const unsigned int *begin,
125 const unsigned int *end) {
126 const unsigned int shift = total_size;
127 total_size += (end - begin);
128 my_rows.resize(total_size);
129 std::copy(begin, end, my_rows.begin() + shift);
132 if (!has_constraints || apply_constraints)
134 const unsigned int *begin =
136 const unsigned int *end =
145 const unsigned int *begin =
148 const unsigned int *end = begin + dofs_this_cell;
159 const bool use_vector_data_exchanger_full)
166 const std::size_t n_ghosts =
ghost_dofs.size();
174 std::vector<unsigned int> ghost_numbering(n_ghosts);
178 unsigned int n_unique_ghosts = 0;
182 std::vector<std::pair<types::global_dof_index, unsigned int>>
183 ghost_origin(n_ghosts);
184 for (std::size_t i = 0; i < n_ghosts; ++i)
187 ghost_origin[i].second = i;
189 std::sort(ghost_origin.begin(), ghost_origin.end());
192 ghost_numbering[ghost_origin[0].second] = 0;
193 for (std::size_t i = 1; i < n_ghosts; ++i)
195 if (ghost_origin[i].first > ghost_origin[i - 1].first + 1)
197 ghost_indices.
add_range(last_contiguous_start,
198 ghost_origin[i - 1].first + 1);
199 last_contiguous_start = ghost_origin[i].first;
201 if (ghost_origin[i].first > ghost_origin[i - 1].first)
203 ghost_numbering[ghost_origin[i].second] = n_unique_ghosts;
206 ghost_indices.
add_range(last_contiguous_start,
207 ghost_origin.back().first + 1);
214 for (std::size_t i = 0; i < n_ghosts; ++i)
215 Assert(ghost_numbering[i] ==
224 const unsigned int n_boundary_cells = boundary_cells.size();
225 for (
unsigned int i = 0; i < n_boundary_cells; ++i)
227 unsigned int *data_ptr =
230 const unsigned int *row_end =
233 for (; data_ptr != row_end; ++data_ptr)
234 *data_ptr = ((*data_ptr < n_owned) ?
236 n_owned + ghost_numbering[*data_ptr - n_owned]);
241 bool has_hanging_nodes =
false;
243 const unsigned int fe_index =
254 for (
unsigned int comp = 0; comp <
n_components; ++comp)
258 if (has_hanging_nodes ||
263 unsigned int *data_ptr =
266 const unsigned int *row_end =
268 for (; data_ptr != row_end; ++data_ptr)
270 ((*data_ptr < n_owned) ?
272 n_owned + ghost_numbering[*data_ptr - n_owned]);
278 std::vector<types::global_dof_index> empty;
288 if (use_vector_data_exchanger_full ==
false)
294 std::make_shared<MatrixFreeFunctions::VectorDataExchange::Full>(
303 const std::vector<unsigned int> &renumbering,
304 const std::vector<unsigned int> &constraint_pool_row_index,
305 const std::vector<unsigned char> &irregular_cells)
311 std::vector<unsigned int> new_active_fe_index;
313 unsigned int position_cell = 0;
314 for (
unsigned int cell = 0;
318 const unsigned int n_comp =
319 (irregular_cells[cell] > 0 ? irregular_cells[cell] :
324 unsigned int fe_index =
326 for (
unsigned int j = 1; j < n_comp; ++j)
331 new_active_fe_index.push_back(fe_index);
332 position_cell += n_comp;
342 std::vector<std::pair<unsigned int, unsigned int>> new_row_starts(
346 std::vector<unsigned int> new_dof_indices;
347 std::vector<std::pair<unsigned short, unsigned short>>
348 new_constraint_indicator;
349 std::vector<unsigned int> new_plain_indices, new_rowstart_plain;
350 unsigned int position_cell = 0;
354 std::vector<compressed_constraint_kind> new_hanging_node_constraint_masks;
355 new_hanging_node_constraint_masks.reserve(
375 const unsigned int n_vect =
376 (irregular_cells[i] > 0 ? irregular_cells[i] :
380 this->dofs_per_cell[0];
382 for (
unsigned int j = 0; j < n_vect; ++j)
384 const unsigned int cell_no =
387 bool has_hanging_nodes =
false;
395 new_hanging_node_constraint_masks.push_back(
mask);
398 for (
unsigned int comp = 0; comp <
n_components; ++comp)
403 for (
unsigned int comp = 0; comp <
n_components; ++comp)
407 .first = new_dof_indices.size();
410 .second = new_constraint_indicator.size();
412 new_dof_indices.insert(
413 new_dof_indices.end(),
419 new_constraint_indicator.push_back(
428 new_plain_indices.size();
429 new_plain_indices.insert(
430 new_plain_indices.end(),
439 for (
unsigned int comp = 0; comp <
n_components; ++comp)
443 .first = new_dof_indices.size();
446 .second = new_constraint_indicator.size();
451 new_hanging_node_constraint_masks.push_back(
454 position_cell += n_vect;
461 .first = new_dof_indices.size();
464 .second = new_constraint_indicator.size();
467 new_constraint_indicator.size());
480 const unsigned int index_range =
494 const unsigned int row_length_ind =
502 const std::pair<unsigned short, unsigned short>
510 for (; con_it != end_con; ++con_it)
514 constraint_pool_row_index.size() - 1);
519 unsigned int n_active_cells = 0;
520 for (
unsigned int c = 0;
523 if (irregular_cells[c] > 0)
524 n_active_cells += irregular_cells[c];
537 const std::vector<unsigned char> &irregular_cells)
547 irregular_cells.size());
551 irregular_cells.size());
552 for (
unsigned int i = 0; i < irregular_cells.size(); ++i)
553 if (irregular_cells[i] > 0)
568 std::vector<unsigned int> index_kinds(
569 static_cast<unsigned int>(
573 for (
unsigned int i = 0; i < irregular_cells.size(); ++i)
575 const unsigned int ndofs =
577 const unsigned int n_comp =
581 bool has_constraints =
false;
582 for (
unsigned int j = 0; j < n_comp; ++j)
588 has_constraints =
true;
597 bool indices_are_contiguous = (ndofs > 0);
598 for (
unsigned int j = 0; j < n_comp; ++j)
602 this->dof_indices.data() +
608 for (
unsigned int i = 1; i < ndofs; ++i)
611 indices_are_contiguous =
false;
616 bool indices_are_interleaved_and_contiguous =
621 this->dof_indices.data() +
623 for (
unsigned int k = 0;
624 k < ndofs && indices_are_interleaved_and_contiguous;
626 for (
unsigned int j = 0; j < n_comp; ++j)
630 indices_are_interleaved_and_contiguous =
false;
635 if (indices_are_contiguous ||
636 indices_are_interleaved_and_contiguous)
638 for (
unsigned int j = 0; j < n_comp; ++j)
640 const unsigned int start_index =
653 if (indices_are_interleaved_and_contiguous)
658 for (
unsigned int j = 0; j < n_comp; ++j)
662 else if (indices_are_contiguous)
666 for (
unsigned int j = 0; j < n_comp; ++j)
672 int indices_are_interleaved_and_mixed = 2;
677 for (
unsigned int j = 0; j < n_comp; ++j)
680 for (
unsigned int k = 0;
681 k < ndofs && indices_are_interleaved_and_mixed != 0;
683 for (
unsigned int j = 0; j < n_comp; ++j)
690 indices_are_interleaved_and_mixed = 0;
693 if (indices_are_interleaved_and_mixed == 2)
695 for (
unsigned int j = 0; j < n_comp; ++j)
699 for (
unsigned int j = 0; j < n_comp; ++j)
703 for (
unsigned int j = 0; j < n_comp; ++j)
706 indices_are_interleaved_and_mixed = 1;
709 if (indices_are_interleaved_and_mixed == 1 ||
712 IndexStorageVariants::
713 interleaved_contiguous_mixed_strides;
721 this->dof_indices.data() +
738 bool is_sorted =
true;
739 unsigned int previous = indices[0];
740 for (
unsigned int l = 1; l < n_comp; ++l)
742 const unsigned int current = indices[l * ndofs];
743 if (current <= previous)
750 for (
unsigned int j = 0; j < l; ++j)
751 if (indices[j * ndofs] == current)
767 index_kinds[
static_cast<unsigned int>(
777 auto fix_single_interleaved_indices =
779 if (index_kinds[
static_cast<unsigned int>(
782 index_kinds[
static_cast<unsigned int>(variant)] > 0)
783 for (
unsigned int i = 0; i < irregular_cells.size(); ++i)
795 index_kinds[
static_cast<unsigned int>(
796 IndexStorageVariants::
797 interleaved_contiguous_mixed_strides)]--;
798 index_kinds[
static_cast<unsigned int>(variant)]++;
807 unsigned int n_interleaved =
808 index_kinds[
static_cast<unsigned int>(
810 index_kinds[
static_cast<unsigned int>(
812 index_kinds[
static_cast<unsigned int>(
817 if (n_interleaved > 0 && index_kinds[
static_cast<unsigned int>(
819 for (
unsigned int i = 0; i < irregular_cells.size(); ++i)
825 index_kinds[
static_cast<unsigned int>(
827 index_kinds[
static_cast<unsigned int>(
833 if (n_interleaved > 0 &&
835 index_kinds[
static_cast<unsigned int>(
838 for (
unsigned int i = 0; i < irregular_cells.size(); ++i)
842 index_kinds[
static_cast<unsigned int>(
851 index_kinds[
static_cast<unsigned int>(
856 for (
unsigned int i = 0; i < irregular_cells.size(); ++i)
867 const unsigned int ndofs =
872 unsigned int *interleaved_dof_indices =
876 this->dof_indices_interleaved.size());
886 for (
unsigned int k = 0; k < ndofs; ++k)
888 const unsigned int *my_dof_indices =
dof_indices + k;
889 const unsigned int *end =
891 for (; interleaved_dof_indices != end;
892 ++interleaved_dof_indices, my_dof_indices += ndofs)
893 *interleaved_dof_indices = *my_dof_indices;
903 const unsigned int n_owned_cells,
904 const unsigned int n_lanes,
907 const bool fill_cell_centric,
909 const bool use_vector_data_exchanger_full)
915 std::vector<types::global_dof_index> ghost_indices;
918 for (
unsigned int cell = 0; cell < n_owned_cells; ++cell)
926 const unsigned int fe_index =
935 ghost_indices.push_back(
938 std::sort(ghost_indices.begin(), ghost_indices.end());
940 compressed_set.
add_indices(ghost_indices.begin(), ghost_indices.end());
942 const bool all_ghosts_equal =
948 std::shared_ptr<const Utilities::MPI::Partitioner> temp_0;
950 if (all_ghosts_equal)
954 temp_0 = std::make_shared<Utilities::MPI::Partitioner>(
960 if (use_vector_data_exchanger_full ==
false)
966 std::make_shared<MatrixFreeFunctions::VectorDataExchange::Full>(
967 temp_0, communicator_sm);
971 std::vector<FaceToCellTopology<1>> all_faces(inner_faces);
972 all_faces.insert(all_faces.end(),
973 ghosted_faces.begin(),
974 ghosted_faces.end());
977 2 * shape_info(0, 0).n_dimensions);
979 for (
unsigned int f = 0; f < all_faces.size(); ++f)
981 cell_and_face_to_faces(all_faces[f].cells_interior[0],
982 all_faces[f].interior_face_no) = f;
983 Assert(all_faces[f].cells_exterior[0] !=
986 cell_and_face_to_faces(all_faces[f].cells_exterior[0],
987 all_faces[f].exterior_face_no) = f;
991 const auto loop_over_faces =
992 [&](
const std::function<
993 void(
const unsigned int,
const unsigned int,
const bool)> &fu) {
994 for (
const auto &face : inner_faces)
997 fu(face.cells_exterior[0], face.exterior_face_no,
false );
1001 const auto loop_over_all_faces =
1002 [&](
const std::function<
1003 void(
const unsigned int,
const unsigned int,
const bool)> &fu) {
1004 for (
unsigned int c = 0; c < cell_and_face_to_faces.size(0); ++c)
1005 for (
unsigned int d = 0; d < cell_and_face_to_faces.size(1); ++d)
1007 const unsigned int f = cell_and_face_to_faces(c, d);
1011 const unsigned int cell_m = all_faces[f].cells_interior[0];
1012 const unsigned int cell_p = all_faces[f].cells_exterior[0];
1014 const bool ext = c == cell_m;
1019 const unsigned int p = ext ? cell_p : cell_m;
1020 const unsigned int face_no = ext ?
1021 all_faces[f].exterior_face_no :
1022 all_faces[f].interior_face_no;
1024 fu(p, face_no,
true);
1028 const auto process_values =
1030 std::shared_ptr<const Utilities::MPI::Partitioner>
1031 &vector_partitioner_values,
1032 const std::function<void(
1033 const std::function<
void(
1034 const unsigned int,
const unsigned int,
const bool)> &)> &loop) {
1035 bool all_nodal_and_tensorial = shape_info.size(1) == 1;
1037 if (all_nodal_and_tensorial)
1042 if (!si.nodal_at_cell_boundaries ||
1045 all_nodal_and_tensorial =
false;
1048 if (all_nodal_and_tensorial ==
false)
1052 bool has_noncontiguous_cell =
false;
1054 loop([&](
const unsigned int cell_no,
1055 const unsigned int face_no,
1057 const unsigned int index =
1062 const unsigned int stride =
1070 for (
unsigned int j = 0;
1082 has_noncontiguous_cell =
true;
1084 has_noncontiguous_cell =
1086 has_noncontiguous_cell),
1089 std::sort(ghost_indices.begin(), ghost_indices.end());
1092 ghost_indices.end());
1094 const bool all_ghosts_equal =
1099 if (all_ghosts_equal || has_noncontiguous_cell)
1103 vector_partitioner_values =
1104 std::make_shared<Utilities::MPI::Partitioner>(
1107 vector_partitioner_values.get())
1114 const auto process_gradients =
1116 const std::shared_ptr<const Utilities::MPI::Partitioner>
1117 &vector_partitoner_values,
1118 std::shared_ptr<const Utilities::MPI::Partitioner>
1119 &vector_partitioner_gradients,
1120 const std::function<void(
1121 const std::function<
void(
1122 const unsigned int,
const unsigned int,
const bool)> &)> &loop) {
1123 bool all_hermite = shape_info.size(1) == 1;
1129 all_hermite =
false;
1130 if (all_hermite ==
false ||
1135 loop([&](
const unsigned int cell_no,
1136 const unsigned int face_no,
1138 const unsigned int index =
1143 const unsigned int stride =
1151 for (
unsigned int j = 0;
1163 std::sort(ghost_indices.begin(), ghost_indices.end());
1166 ghost_indices.end());
1168 const bool all_ghosts_equal =
1173 if (all_ghosts_equal)
1177 vector_partitioner_gradients =
1178 std::make_shared<Utilities::MPI::Partitioner>(
1181 vector_partitioner_gradients.get())
1187 std::shared_ptr<const Utilities::MPI::Partitioner> temp_1, temp_2, temp_3,
1191 process_values(temp_1, loop_over_faces);
1194 process_gradients(temp_1, temp_2, loop_over_faces);
1196 if (fill_cell_centric)
1198 ghost_indices.clear();
1200 process_values(temp_3, loop_over_all_faces);
1202 process_gradients(temp_3, temp_4, loop_over_all_faces);
1206 temp_3 = std::make_shared<Utilities::MPI::Partitioner>(
1208 temp_4 = std::make_shared<Utilities::MPI::Partitioner>(
1212 if (use_vector_data_exchanger_full ==
false)
1230 std::make_shared<MatrixFreeFunctions::VectorDataExchange::Full>(
1231 temp_1, communicator_sm);
1233 std::make_shared<MatrixFreeFunctions::VectorDataExchange::Full>(
1234 temp_2, communicator_sm);
1236 std::make_shared<MatrixFreeFunctions::VectorDataExchange::Full>(
1237 temp_3, communicator_sm);
1239 std::make_shared<MatrixFreeFunctions::VectorDataExchange::Full>(
1240 temp_4, communicator_sm);
1248 std::array<std::vector<std::pair<unsigned int, unsigned int>>, 3>
1249 &cell_indices_contiguous_sm)
1253 for (
unsigned int i = 0; i < 3; ++i)
1256 cell_indices_contiguous_sm[i].size());
1258 for (
unsigned int j = 0; j < cell_indices_contiguous_sm[i].size();
1260 if (cell_indices_contiguous_sm[i][j].first !=
1263 cell_indices_contiguous_sm[i][j].first,
1264 cell_indices_contiguous_sm[i][j].second *
dofs_per_cell[0]};
1284 const unsigned int end,
1286 std::vector<std::mutex> &mutexes,
1287 std::vector<unsigned int> &row_lengths)
1289 std::vector<unsigned int> scratch;
1291 for (
unsigned int block = begin; block < end; ++block)
1295 dof_info.
row_starts[block * n_components].first,
1297 dof_info.
row_starts[(block + 1) * n_components].first);
1298 std::sort(scratch.begin(), scratch.end());
1300 const std::vector<unsigned int>::const_iterator end_unique =
1301 std::unique(scratch.begin(), scratch.end());
1302 for (std::vector<unsigned int>::const_iterator it = scratch.begin();
1308 const unsigned int next_bucket =
1311 std::lock_guard<std::mutex> lock(
1313 for (; it != end_unique && *it < next_bucket; ++it)
1324 const unsigned int end,
1326 const std::vector<unsigned int> &row_lengths,
1327 std::vector<std::mutex> &mutexes,
1330 std::vector<unsigned int> scratch;
1332 for (
unsigned int block = begin; block < end; ++block)
1336 dof_info.
row_starts[block * n_components].first,
1338 dof_info.
row_starts[(block + 1) * n_components].first);
1339 std::sort(scratch.begin(), scratch.end());
1341 const std::vector<unsigned int>::const_iterator end_unique =
1342 std::unique(scratch.begin(), scratch.end());
1343 for (std::vector<unsigned int>::const_iterator it = scratch.begin();
1347 const unsigned int next_bucket =
1350 std::lock_guard<std::mutex> lock(
1352 for (; it != end_unique && *it < next_bucket; ++it)
1353 if (row_lengths[*it] > 0)
1354 connectivity_dof.
add(*it, block);
1363 const unsigned int end,
1365 const std::vector<unsigned int> &renumbering,
1366 const ::SparsityPattern &connectivity_dof,
1369 ordered_vector row_entries;
1371 for (
unsigned int block = begin; block < end; ++block)
1373 row_entries.clear();
1377 dof_info.
row_starts[block * n_components].first,
1379 dof_info.
row_starts[(block + 1) * n_components].first;
1380 for (; it != end_cell; ++it)
1383 std::vector<types::global_dof_index>::iterator insert_pos =
1384 row_entries.begin();
1385 for (; sp != connectivity_dof.end(*it); ++sp)
1386 if (sp->column() != block)
1387 row_entries.insert(renumbering[sp->column()], insert_pos);
1390 row_entries.begin(),
1400 const std::vector<unsigned int> &renumbering,
1412 std::vector<unsigned int> row_lengths(n_rows);
1418 [
this, &mutexes, &row_lengths](
const unsigned int begin,
1419 const unsigned int end) {
1420 internal::compute_row_lengths(
1421 begin, end, *this, mutexes, row_lengths);
1427 for (
unsigned int row = 0; row < n_rows; ++row)
1428 if (row_lengths[row] <= 1)
1429 row_lengths[row] = 0;
1440 [
this, &row_lengths, &mutexes, &connectivity_dof](
1441 const unsigned int begin,
const unsigned int end) {
1442 internal::fill_connectivity_dofs(
1443 begin, end, *this, row_lengths, mutexes, connectivity_dof);
1450 std::vector<unsigned int> reverse_numbering(task_info.
n_active_cells);
1460 [
this, &reverse_numbering, &connectivity_dof, &connectivity](
1461 const unsigned int begin,
const unsigned int end) {
1462 internal::fill_connectivity(begin,
1476 std::vector<types::global_dof_index> &renumbering)
1478 const unsigned int locally_owned_size =
1480 renumbering.resize(0);
1485 const unsigned int n_cell_batches =
1490 for (
unsigned int cell_no = 0; cell_no < n_cell_batches; ++cell_no)
1498 const unsigned int ndofs =
1504 const unsigned int *dof_ind =
1507 for (
unsigned int i = 0; i < ndofs; ++i)
1508 for (
unsigned int j = 0;
1511 if (dof_ind[j * ndofs + i] < locally_owned_size)
1512 if (renumbering[dof_ind[j * ndofs + i]] ==
1514 renumbering[dof_ind[j * ndofs + i]] = counter++;
1521 dof_index = counter++;
1535 std::size_t memory =
sizeof(*this);
1537 memory += storage.capacity() *
sizeof(storage[0]);
1539 (
row_starts.capacity() *
sizeof(std::pair<unsigned int, unsigned int>));
1582 namespace MatrixFreeFunctions
1586 const std::vector<types::global_dof_index> &,
1587 const std::vector<types::global_dof_index> &,
1589 const ::AffineConstraints<double> &,
1591 ConstraintValues<double> &,
1596 const std::vector<types::global_dof_index> &,
1597 const std::vector<types::global_dof_index> &,
1599 const ::AffineConstraints<float> &,
1601 ConstraintValues<double> &,
1606 const HangingNodes<1> &,
1607 const std::vector<std::vector<unsigned int>> &,
1610 std::vector<types::global_dof_index> &);
1613 const HangingNodes<2> &,
1614 const std::vector<std::vector<unsigned int>> &,
1617 std::vector<types::global_dof_index> &);
1620 const HangingNodes<3> &,
1621 const std::vector<std::vector<unsigned int>> &,
1624 std::vector<types::global_dof_index> &);
1628 const std::vector<FaceToCellTopology<1>> &,
1632 const std::vector<FaceToCellTopology<2>> &,
1636 const std::vector<FaceToCellTopology<4>> &,
1640 const std::vector<FaceToCellTopology<8>> &,
1644 const std::vector<FaceToCellTopology<16>> &,
1650 const std::vector<FaceToCellTopology<1>> &);
1654 const std::vector<FaceToCellTopology<2>> &);
1658 const std::vector<FaceToCellTopology<4>> &);
1662 const std::vector<FaceToCellTopology<8>> &);
1666 const std::vector<FaceToCellTopology<16>> &);
1678 const std::vector<unsigned int> &,
1679 std::ostream &)
const;
1683 const std::vector<unsigned int> &,
1684 std::ostream &)
const;
void add_entries(const size_type row, ForwardIterator begin, ForwardIterator end, const bool indices_are_unique_and_sorted=false)
size_type index_within_set(const size_type global_index) const
size_type n_elements() const
void subtract_set(const IndexSet &other)
void add_range(const size_type begin, const size_type end)
void add_indices(const ForwardIterator &begin, const ForwardIterator &end)
SparsityPatternIterators::Iterator iterator
void add(const size_type i, const size_type j)
const IndexSet & locally_owned_range() const
const IndexSet & ghost_indices() const
unsigned int locally_owned_size() const
types::global_dof_index local_to_global(const unsigned int local_index) const
virtual MPI_Comm get_mpi_communicator() const override
void set_ghost_indices(const IndexSet &ghost_indices, const IndexSet &larger_ghost_index_set=IndexSet())
types::global_dof_index size() const
#define DEAL_II_NAMESPACE_OPEN
constexpr bool running_in_debug_mode()
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcNotInitialized()
@ tensor_symmetric_hermite
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
T min(const T &t, const MPI_Comm mpi_communicator)
std::vector< Integer > invert_permutation(const std::vector< Integer > &permutation)
void fill_connectivity_dofs(const unsigned int begin, const unsigned int end, const DoFInfo &dof_info, const std::vector< unsigned int > &row_lengths, std::vector< std::mutex > &mutexes, ::SparsityPattern &connectivity_dof)
void fill_connectivity(const unsigned int begin, const unsigned int end, const DoFInfo &dof_info, const std::vector< unsigned int > &renumbering, const ::SparsityPattern &connectivity_dof, DynamicSparsityPattern &connectivity)
void compute_row_lengths(const unsigned int begin, const unsigned int end, const DoFInfo &dof_info, std::vector< std::mutex > &mutexes, std::vector< unsigned int > &row_lengths)
static constexpr unsigned int bucket_size_threading
constexpr compressed_constraint_kind unconstrained_compressed_constraint_kind
constexpr types::global_dof_index invalid_dof_index
constexpr unsigned int invalid_unsigned_int
void apply_to_subranges(const Iterator &begin, const std_cxx20::type_identity_t< Iterator > &end, const Function &f, const unsigned int grainsize)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
unsigned int global_dof_index
void print(const std::vector< Number > &constraint_pool_data, const std::vector< unsigned int > &constraint_pool_row_index, std::ostream &out) const
void reorder_cells(const TaskInfo &task_info, const std::vector< unsigned int > &renumbering, const std::vector< unsigned int > &constraint_pool_row_index, const std::vector< unsigned char > &irregular_cells)
std::vector< std::pair< unsigned short, unsigned short > > constraint_indicator
std::vector< unsigned int > cell_loop_pre_list_index
std::vector< std::pair< unsigned int, unsigned int > > row_starts
unsigned int n_base_elements
std::vector< std::vector< unsigned int > > component_dof_indices_offset
void compute_tight_partitioners(const Table< 2, ShapeInfo< double > > &shape_info, const unsigned int n_owned_cells, const unsigned int n_lanes, const std::vector< FaceToCellTopology< 1 > > &inner_faces, const std::vector< FaceToCellTopology< 1 > > &ghosted_faces, const bool fill_cell_centric, const MPI_Comm communicator_sm, const bool use_vector_data_exchanger_full)
std::vector< std::vector< bool > > hanging_node_constraint_masks_comp
unsigned int global_base_element_offset
unsigned int max_fe_index
void get_dof_indices_on_cell_batch(std::vector< unsigned int > &local_indices, const unsigned int cell_batch, const bool with_constraints=true) const
void compute_cell_index_compression(const std::vector< unsigned char > &irregular_cells)
std::vector< unsigned int > cell_loop_post_list_index
std::vector< unsigned int > dofs_per_cell
void assign_ghosts(const std::vector< unsigned int > &boundary_cells, const MPI_Comm communicator_sm, const bool use_vector_data_exchanger_full)
void compute_dof_renumbering(std::vector< types::global_dof_index > &renumbering)
unsigned int vectorization_length
std::shared_ptr< const internal::MatrixFreeFunctions::VectorDataExchange::Base > vector_exchanger
@ interleaved_contiguous_strided
@ interleaved_contiguous_mixed_strides
std::vector< std::vector< unsigned int > > fe_index_conversion
std::vector< unsigned int > dof_indices
std::vector< std::pair< unsigned int, unsigned int > > vector_zero_range_list
std::shared_ptr< const Utilities::MPI::Partitioner > vector_partitioner
std::vector< compressed_constraint_kind > hanging_node_constraint_masks
std::array< std::vector< unsigned int >, 3 > dof_indices_interleave_strides
std::array< std::vector< std::pair< unsigned int, unsigned int > >, 3 > dof_indices_contiguous_sm
std::vector< unsigned int > row_starts_plain_indices
std::vector< unsigned int > dofs_per_face
std::size_t memory_consumption() const
std::vector< unsigned int > component_to_base_index
void compute_vector_zero_access_pattern(const TaskInfo &task_info, const std::vector< FaceToCellTopology< length > > &faces)
std::vector< unsigned int > n_components
void print_memory_consumption(StreamType &out, const TaskInfo &size_info) const
void compute_face_index_compression(const std::vector< FaceToCellTopology< length > > &faces, bool hold_all_faces_to_owned_cells)
std::vector< std::pair< unsigned int, unsigned int > > cell_loop_pre_list
std::vector< types::global_dof_index > ghost_dofs
void read_dof_indices(const std::vector< types::global_dof_index > &local_indices_resolved, const std::vector< types::global_dof_index > &local_indices, const bool cell_has_hanging_nodes, const ::AffineConstraints< number > &constraints, const unsigned int cell_number, ConstraintValues< double > &constraint_values, bool &cell_at_boundary)
std::array< std::vector< unsigned int >, 3 > dof_indices_contiguous
bool process_hanging_node_constraints(const HangingNodes< dim > &hanging_nodes, const std::vector< std::vector< unsigned int > > &lexicographic_mapping, const unsigned int cell_number, const TriaIterator< DoFCellAccessor< dim, dim, false > > &cell, std::vector< types::global_dof_index > &dof_indices)
std::vector< unsigned int > cell_active_fe_index
std::array< std::shared_ptr< const internal::MatrixFreeFunctions::VectorDataExchange::Base >, 5 > vector_exchanger_face_variants
std::vector< unsigned int > plain_dof_indices
std::array< std::vector< unsigned char >, 3 > n_vectorization_lanes_filled
std::vector< unsigned int > start_components
std::vector< unsigned int > dof_indices_interleaved
std::vector< unsigned int > constrained_dofs
std::array< std::vector< IndexStorageVariants >, 3 > index_storage_variants
void make_connectivity_graph(const TaskInfo &task_info, const std::vector< unsigned int > &renumbering, DynamicSparsityPattern &connectivity) const
std::vector< unsigned int > vector_zero_range_list_index
void compute_shared_memory_contiguous_indices(std::array< std::vector< std::pair< unsigned int, unsigned int > >, 3 > &cell_indices_contiguous_sm)
std::vector< std::pair< unsigned int, unsigned int > > cell_loop_post_list
unsigned int dofs_per_component_on_cell
::Table< 2, unsigned int > face_to_cell_index_nodal
::Table< 2, unsigned int > face_to_cell_index_hermite
unsigned int dofs_per_component_on_face
unsigned int n_active_cells
std::vector< unsigned int > cell_partition_data