689 const std::vector<size_type> &col_block_sizes);
699 const MPI_Comm communicator = MPI_COMM_WORLD);
713 const std::vector<IndexSet> &row_parallel_partitioning,
714 const std::vector<IndexSet> &column_parallel_partitioning,
715 const std::vector<IndexSet> &writeable_rows,
716 const MPI_Comm communicator = MPI_COMM_WORLD);
728 reinit(
const std::vector<size_type> &row_block_sizes,
729 const std::vector<size_type> &col_block_sizes);
736 reinit(
const std::vector<IndexSet> ¶llel_partitioning,
737 const MPI_Comm communicator = MPI_COMM_WORLD);
745 reinit(
const std::vector<IndexSet> &row_parallel_partitioning,
746 const std::vector<IndexSet> &column_parallel_partitioning,
747 const MPI_Comm communicator = MPI_COMM_WORLD);
758 reinit(
const std::vector<IndexSet> &row_parallel_partitioning,
759 const std::vector<IndexSet> &column_parallel_partitioning,
760 const std::vector<IndexSet> &writeable_rows,
761 const MPI_Comm communicator = MPI_COMM_WORLD);
845 ForwardIterator begin,
847 const bool indices_are_sorted)
851 Assert(n_rows() == compute_n_rows(), ExcNeedsCollectSizes());
852 Assert(n_cols() == compute_n_cols(), ExcNeedsCollectSizes());
856 if (indices_are_sorted && n_cols > 0)
858 block_column_indices[0].resize(0);
860 const std::pair<size_type, size_type> row_index =
861 this->row_indices.global_to_local(row);
862 const auto n_blocks = column_indices.size();
867 size_type current_start_index = column_indices.block_start(current_block);
869 current_block == n_blocks - 1 ?
871 column_indices.block_start(current_block + 1);
873 for (
auto it = begin; it < end; ++it)
878 if (*it >= next_start_index)
882 sub_objects[row_index.first][current_block]->add_entries(
884 block_column_indices[0].begin(),
885 block_column_indices[0].end(),
887 block_column_indices[0].clear();
889 auto block_and_col = column_indices.global_to_local(*it);
890 current_block = block_and_col.first;
891 current_start_index = column_indices.block_start(current_block);
893 current_block == n_blocks - 1 ?
895 column_indices.block_start(current_block + 1);
897 const size_type local_index = *it - current_start_index;
898 block_column_indices[0].push_back(local_index);
903 auto check_block_and_col = column_indices.global_to_local(*it);
904 Assert(current_block == check_block_and_col.first,
906 Assert(local_index == check_block_and_col.second,
912 sub_objects[row_index.first][current_block]->add_entries(
914 block_column_indices[0].begin(),
915 block_column_indices[0].end(),
932 if (block_column_indices[0].size() < n_cols)
933 for (
size_type i = 0; i < this->n_block_cols(); ++i)
934 block_column_indices[i].resize(n_cols);
938 for (
size_type i = 0; i < this->n_block_cols(); ++i)
939 counter_within_block[i] = 0;
950 for (ForwardIterator it = begin; it != end; ++it)
954 const std::pair<size_type, size_type> col_index =
955 this->column_indices.global_to_local(col);
957 const size_type local_index = counter_within_block[col_index.first]++;
959 block_column_indices[col_index.first][local_index] = col_index.second;
967 const std::pair<size_type, size_type> row_index =
968 this->row_indices.global_to_local(row);
969 for (
size_type block_col = 0; block_col < n_block_cols(); ++block_col)
971 if (counter_within_block[block_col] == 0)
973 sub_objects[row_index.first][block_col]->add_entries(
975 block_column_indices[block_col].begin(),
976 block_column_indices[block_col].begin() +
977 counter_within_block[block_col],