15#ifndef dealii_block_sparsity_pattern_h
16#define dealii_block_sparsity_pattern_h
36template <
typename number>
78template <
typename SparsityPatternType>
156 SparsityPatternType &
163 const SparsityPatternType &
238 template <
typename ForwardIterator>
241 ForwardIterator begin,
243 const bool indices_are_sorted =
false);
253 const bool indices_are_sorted =
false)
override;
303 print(std::ostream &out)
const;
340 "The number of rows and columns (returned by n_rows() and n_cols()) does "
341 "not match their directly computed values. This typically means that a "
342 "call to collect_sizes() is missing.");
352 <<
"The blocks [" << arg1 <<
',' << arg2 <<
"] and [" << arg3
353 <<
',' << arg4 <<
"] have differing row numbers.");
362 <<
"The blocks [" << arg1 <<
',' << arg2 <<
"] and [" << arg3
363 <<
',' << arg4 <<
"] have differing column numbers.");
421 template <
typename number>
474 const std::vector<std::vector<unsigned int>> &row_lengths);
573 const std::vector<size_type> &col_block_sizes);
602 reinit(
const std::vector<size_type> &row_block_sizes,
603 const std::vector<size_type> &col_block_sizes);
610 reinit(
const std::vector<IndexSet> &partitioning);
636#ifdef DEAL_II_WITH_TRILINOS
688 const std::vector<size_type> &col_block_sizes);
698 const MPI_Comm communicator = MPI_COMM_WORLD);
712 const std::vector<IndexSet> &row_parallel_partitioning,
713 const std::vector<IndexSet> &column_parallel_partitioning,
714 const std::vector<IndexSet> &writeable_rows,
715 const MPI_Comm communicator = MPI_COMM_WORLD);
727 reinit(
const std::vector<size_type> &row_block_sizes,
728 const std::vector<size_type> &col_block_sizes);
735 reinit(
const std::vector<IndexSet> ¶llel_partitioning,
736 const MPI_Comm communicator = MPI_COMM_WORLD);
744 reinit(
const std::vector<IndexSet> &row_parallel_partitioning,
745 const std::vector<IndexSet> &column_parallel_partitioning,
746 const MPI_Comm communicator = MPI_COMM_WORLD);
757 reinit(
const std::vector<IndexSet> &row_parallel_partitioning,
758 const std::vector<IndexSet> &column_parallel_partitioning,
759 const std::vector<IndexSet> &writeable_rows,
760 const MPI_Comm communicator = MPI_COMM_WORLD);
778template <
typename SparsityPatternType>
779inline SparsityPatternType &
790template <
typename SparsityPatternType>
791inline const SparsityPatternType &
803template <
typename SparsityPatternType>
812template <
typename SparsityPatternType>
821template <
typename SparsityPatternType>
829 const std::pair<size_type, size_type> row_index =
833 sub_objects[row_index.first][col_index.first]->add(row_index.second,
839template <
typename SparsityPatternType>
840template <
typename ForwardIterator>
844 ForwardIterator begin,
846 const bool indices_are_sorted)
855 if (indices_are_sorted &&
n_cols > 0)
859 const std::pair<size_type, size_type> row_index =
868 current_block == n_blocks - 1 ?
872 for (
auto it = begin; it < end; ++it)
877 if (*it >= next_start_index)
881 sub_objects[row_index.first][current_block]->add_entries(
889 current_block = block_and_col.first;
892 current_block == n_blocks - 1 ?
896 const size_type local_index = *it - current_start_index;
903 Assert(current_block == check_block_and_col.first,
905 Assert(local_index == check_block_and_col.second,
911 sub_objects[row_index.first][current_block]->add_entries(
937 for (
size_type i = 0; i < this->n_block_cols(); ++i)
949 for (ForwardIterator it = begin; it != end; ++it)
953 const std::pair<size_type, size_type> col_index =
966 const std::pair<size_type, size_type> row_index =
972 sub_objects[row_index.first][block_col]->add_entries(
984template <
typename SparsityPatternType>
989 const bool indices_are_sorted)
996template <
typename SparsityPatternType>
1004 const std::pair<size_type, size_type> row_index =
1008 return sub_objects[row_index.first][col_index.first]->exists(
1009 row_index.second, col_index.second);
1014template <
typename SparsityPatternType>
1019 const std::pair<size_type, size_type> row_index =
1025 c +=
sub_objects[row_index.first][b]->row_length(row_index.second);
1032template <
typename SparsityPatternType>
1041template <
typename SparsityPatternType>
1051 const unsigned int index)
const
1054 const std::pair<size_type, size_type> row_index =
1061 for (
unsigned int b = 0; b < this->
n_block_cols(); ++b)
1063 unsigned int rowlen =
1064 sub_objects[row_index.first][b]->row_length(row_index.second);
1065 if (index < c + rowlen)
1067 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
const SparsityPatternType & block(const size_type row, const size_type column) const
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
#define DEAL_II_NAMESPACE_CLOSE
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()
#define DEAL_II_ASSERT_UNREACHABLE()
const types::global_dof_index invalid_dof_index
unsigned int global_dof_index