692 const std::vector<size_type> &col_block_sizes);
702 const MPI_Comm communicator = MPI_COMM_WORLD);
716 const std::vector<IndexSet> &row_parallel_partitioning,
717 const std::vector<IndexSet> &column_parallel_partitioning,
718 const std::vector<IndexSet> &writable_rows,
719 const MPI_Comm communicator = MPI_COMM_WORLD);
731 reinit(
const std::vector<size_type> &row_block_sizes,
732 const std::vector<size_type> &col_block_sizes);
739 reinit(
const std::vector<IndexSet> ¶llel_partitioning,
740 const MPI_Comm communicator = MPI_COMM_WORLD);
748 reinit(
const std::vector<IndexSet> &row_parallel_partitioning,
749 const std::vector<IndexSet> &column_parallel_partitioning,
750 const MPI_Comm communicator = MPI_COMM_WORLD);
761 reinit(
const std::vector<IndexSet> &row_parallel_partitioning,
762 const std::vector<IndexSet> &column_parallel_partitioning,
763 const std::vector<IndexSet> &writable_rows,
764 const MPI_Comm communicator = MPI_COMM_WORLD);
848 ForwardIterator
begin,
850 const bool indices_are_sorted)
854 Assert(n_rows() == compute_n_rows(), ExcNeedsCollectSizes());
855 Assert(n_cols() == compute_n_cols(), ExcNeedsCollectSizes());
859 if (indices_are_sorted && n_cols > 0)
861 block_column_indices[0].resize(0);
865 const std::pair<size_type, size_type> row_index =
866 this->row_indices.global_to_local(row);
867 const auto n_blocks = column_indices.size();
872 size_type current_start_index = column_indices.block_start(current_block);
874 current_block == n_blocks - 1 ?
876 column_indices.block_start(current_block + 1);
878 for (
auto it =
begin; it <
end; ++it)
883 if (*it >= next_start_index)
887 sub_objects[row_index.first][current_block]->add_entries(
889 block_column_indices[0].begin(),
890 block_column_indices[0].end(),
892 block_column_indices[0].clear();
894 auto block_and_col = column_indices.global_to_local(*it);
895 current_block = block_and_col.first;
896 current_start_index = column_indices.block_start(current_block);
898 current_block == n_blocks - 1 ?
900 column_indices.block_start(current_block + 1);
902 const size_type local_index = *it - current_start_index;
903 block_column_indices[0].push_back(local_index);
909 auto check_block_and_col = column_indices.global_to_local(*it);
910 Assert(current_block == check_block_and_col.first,
912 Assert(local_index == check_block_and_col.second,
918 sub_objects[row_index.first][current_block]->add_entries(
920 block_column_indices[0].begin(),
921 block_column_indices[0].end(),
938 if (block_column_indices[0].
size() < n_cols)
939 for (
size_type i = 0; i < this->n_block_cols(); ++i)
940 block_column_indices[i].resize(n_cols);
944 for (
size_type i = 0; i < this->n_block_cols(); ++i)
945 counter_within_block[i] = 0;
956 for (ForwardIterator it =
begin; it !=
end; ++it)
960 const std::pair<size_type, size_type> col_index =
961 this->column_indices.global_to_local(col);
963 const size_type local_index = counter_within_block[col_index.first]++;
965 block_column_indices[col_index.first][local_index] = col_index.second;
973 const std::pair<size_type, size_type> row_index =
974 this->row_indices.global_to_local(row);
975 for (
size_type block_col = 0; block_col < n_block_cols(); ++block_col)
977 if (counter_within_block[block_col] == 0)
979 sub_objects[row_index.first][block_col]->add_entries(
981 block_column_indices[block_col].begin(),
982 block_column_indices[block_col].begin() +
983 counter_within_block[block_col],