13#ifndef dealii_block_sparsity_pattern_h
14#define dealii_block_sparsity_pattern_h
34template <
typename number>
76template <
typename SparsityPatternType>
154 SparsityPatternType &
161 const SparsityPatternType &
239 template <
typename ForwardIterator>
242 ForwardIterator
begin,
244 const bool indices_are_sorted =
false);
257 const bool indices_are_sorted =
false)
override;
307 print(std::ostream &out)
const;
344 "The number of rows and columns (returned by n_rows() and n_cols()) does "
345 "not match their directly computed values. This typically means that a "
346 "call to collect_sizes() is missing.");
356 <<
"The blocks [" << arg1 <<
',' << arg2 <<
"] and [" << arg3
357 <<
',' << arg4 <<
"] have differing row numbers.");
366 <<
"The blocks [" << arg1 <<
',' << arg2 <<
"] and [" << arg3
367 <<
',' << arg4 <<
"] have differing column numbers.");
425 template <
typename number>
478 const std::vector<std::vector<unsigned int>> &row_lengths);
577 const std::vector<size_type> &col_block_sizes);
606 reinit(
const std::vector<size_type> &row_block_sizes,
607 const std::vector<size_type> &col_block_sizes);
614 reinit(
const std::vector<IndexSet> &partitioning);
640#ifdef DEAL_II_WITH_TRILINOS
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);
782template <
typename SparsityPatternType>
783inline SparsityPatternType &
794template <
typename SparsityPatternType>
795inline const SparsityPatternType &
807template <
typename SparsityPatternType>
816template <
typename SparsityPatternType>
825template <
typename SparsityPatternType>
833 const std::pair<size_type, size_type> row_index =
837 sub_objects[row_index.first][col_index.first]->add(row_index.second,
843template <
typename SparsityPatternType>
844template <
typename ForwardIterator>
848 ForwardIterator
begin,
850 const bool indices_are_sorted)
859 if (indices_are_sorted &&
n_cols > 0)
865 const std::pair<size_type, size_type> row_index =
874 current_block == n_blocks - 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(
895 current_block = block_and_col.first;
898 current_block == n_blocks - 1 ?
902 const size_type local_index = *it - current_start_index;
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(
944 for (
size_type i = 0; i < this->n_block_cols(); ++i)
956 for (ForwardIterator it =
begin; it !=
end; ++it)
960 const std::pair<size_type, size_type> col_index =
973 const std::pair<size_type, size_type> row_index =
979 sub_objects[row_index.first][block_col]->add_entries(
991template <
typename SparsityPatternType>
996 const bool indices_are_sorted)
1003template <
typename SparsityPatternType>
1011 const std::pair<size_type, size_type> row_index =
1015 return sub_objects[row_index.first][col_index.first]->exists(
1016 row_index.second, col_index.second);
1021template <
typename SparsityPatternType>
1026 const std::pair<size_type, size_type> row_index =
1032 c +=
sub_objects[row_index.first][b]->row_length(row_index.second);
1039template <
typename SparsityPatternType>
1048template <
typename SparsityPatternType>
1058 const unsigned int index)
const
1061 const std::pair<size_type, size_type> row_index =
1068 for (
unsigned int b = 0; b < this->
n_block_cols(); ++b)
1070 unsigned int rowlen =
1071 sub_objects[row_index.first][b]->row_length(row_index.second);
1072 if (index < c + rowlen)
1074 sub_objects[row_index.first][b]->column_number(row_index.second,
void reinit(const std::vector< size_type > &row_block_sizes, const std::vector< size_type > &col_block_sizes)
BlockDynamicSparsityPattern()=default
size_type column_number(const size_type row, const unsigned int index) const
void print_gnuplot(std::ostream &out) const
static const size_type invalid_entry
std::vector< size_type > counter_within_block
size_type n_block_rows() const
BlockSparsityPatternBase()
Table< 2, std::unique_ptr< SparsityPatternType > > sub_objects
SparsityPatternType & block(const size_type row, const size_type column)
types::global_dof_index size_type
std::vector< std::vector< size_type > > block_column_indices
void add_entries(const size_type row, ForwardIterator begin, ForwardIterator end, const bool indices_are_sorted=false)
const BlockIndices & get_column_indices() const
size_type n_nonzero_elements() const
void print(std::ostream &out) const
std::size_t memory_consumption() const
void print_svg(std::ostream &out) const
size_type max_entries_per_row() const
size_type compute_n_rows() const
void reinit(const size_type n_block_rows, const size_type n_block_columns)
size_type n_block_cols() const
BlockIndices column_indices
const BlockIndices & get_row_indices() const
unsigned int row_length(const size_type row) const
virtual void add_row_entries(const size_type &row, const ArrayView< const size_type > &columns, const bool indices_are_sorted=false) override
void add(const size_type i, const size_type j)
bool exists(const size_type i, const size_type j) const
BlockSparsityPatternBase & operator=(const BlockSparsityPatternBase &)
friend class BlockSparseMatrix
size_type compute_n_cols() const
void copy_from(const BlockDynamicSparsityPattern &dsp)
void reinit(const size_type n_block_rows, const size_type n_block_columns)
BlockSparsityPattern()=default
bool is_compressed() const
virtual void resize(const size_type rows, const size_type cols)
types::global_dof_index size_type
virtual void add_entries(const ArrayView< const std::pair< size_type, size_type > > &entries)
static constexpr size_type invalid_entry
BlockSparsityPattern()=default
void reinit(const std::vector< size_type > &row_block_sizes, const std::vector< size_type > &col_block_sizes)
#define DEAL_II_NAMESPACE_OPEN
constexpr bool running_in_debug_mode()
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ASSERT_UNREACHABLE()
static ::ExceptionBase & ExcNeedsCollectSizes()
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
static ::ExceptionBase & ExcIncompatibleColNumbers(int arg1, int arg2, int arg3, int arg4)
static ::ExceptionBase & ExcIncompatibleRowNumbers(int arg1, int arg2, int arg3, int arg4)
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
#define DeclExceptionMsg(Exception, defaulttext)
static ::ExceptionBase & ExcInternalError()
constexpr types::global_dof_index invalid_dof_index
unsigned int global_dof_index