29#include <Kokkos_Macros.hpp>
40template <
typename SparsityPatternType>
48template <
typename SparsityPatternType>
59template <
typename SparsityPatternType>
66 "This constructor can only be called if the provided argument "
67 "is the sparsity pattern for an empty matrix. This constructor can "
68 "not be used to copy-construct a non-empty sparsity pattern."));
73template <
typename SparsityPatternType>
79 sub_objects.reinit(0, 0);
81 block_rows = new_block_rows;
82 block_columns = new_block_columns;
84 sub_objects.reinit(block_rows, block_columns);
85 for (
size_type i = 0; i < n_block_rows(); ++i)
86 for (
size_type j = 0; j < n_block_cols(); ++j)
87 sub_objects[i][j] = std::make_unique<SparsityPatternType>();
91template <
typename SparsityPatternType>
99 for (
size_type i = 0; i < n_block_rows(); ++i)
110template <
typename SparsityPatternType>
117 for (
size_type r = 0; r < n_block_rows(); ++r)
118 count += sub_objects[r][0]->n_rows();
124template <
typename SparsityPatternType>
131 for (
size_type c = 0; c < n_block_cols(); ++c)
132 count += sub_objects[0][c]->n_cols();
138template <
typename SparsityPatternType>
144 std::vector<size_type> row_sizes(n_block_rows());
145 std::vector<size_type> col_sizes(n_block_cols());
150 row_sizes[r] = sub_objects[r][0]->n_rows();
154 for (
size_type c = 1; c < n_block_cols(); ++c)
155 for (
size_type r = 0; r < n_block_rows(); ++r)
156 Assert(row_sizes[r] == sub_objects[r][c]->n_rows(),
157 ExcIncompatibleRowNumbers(r, 0, r, c));
161 row_indices.reinit(row_sizes);
165 for (
size_type c = 0; c < n_block_cols(); ++c)
166 col_sizes[c] = sub_objects[0][c]->n_cols();
167 for (
size_type r = 1; r < n_block_rows(); ++r)
168 for (
size_type c = 0; c < n_block_cols(); ++c)
169 Assert(col_sizes[c] == sub_objects[r][c]->n_cols(),
170 ExcIncompatibleRowNumbers(0, c, r, c));
174 column_indices.reinit(col_sizes);
177 block_column_indices.resize(n_block_cols());
178 counter_within_block.resize(n_block_cols());
183template <
typename SparsityPatternType>
187 for (
size_type i = 0; i < n_block_rows(); ++i)
188 for (
size_type j = 0; j < n_block_cols(); ++j)
189 sub_objects[i][j]->compress();
194template <
typename SparsityPatternType>
198 for (
size_type i = 0; i < n_block_rows(); ++i)
199 for (
size_type j = 0; j < n_block_cols(); ++j)
200 if (sub_objects[i][j]->empty() ==
false)
207template <
typename SparsityPatternType>
212 for (
size_type block_row = 0; block_row < n_block_rows(); ++block_row)
215 for (
size_type c = 0; c < n_block_cols(); ++c)
216 this_row += sub_objects[block_row][c]->max_entries_per_row();
218 if (this_row > max_entries)
219 max_entries = this_row;
226template <
typename SparsityPatternType>
231 for (
size_type i = 0; i < n_block_rows(); ++i)
232 for (
size_type j = 0; j < n_block_cols(); ++j)
233 count += sub_objects[i][j]->n_nonzero_elements();
239template <
typename SparsityPatternType>
244 for (
size_type ib = 0; ib < n_block_rows(); ++ib)
246 for (
size_type i = 0; i < block(ib, 0).n_rows(); ++i)
250 for (
size_type jb = 0; jb < n_block_cols(); ++jb)
252 const SparsityPatternType &b = block(ib, jb);
253 for (
size_type j = 0; j < b.n_cols(); ++j)
258 out <<
']' << std::endl;
260 k += block(ib, 0).n_rows();
271 for (size_type ib = 0; ib < n_block_rows(); ++ib)
273 for (size_type i = 0; i < block(ib, 0).n_rows(); ++i)
277 for (size_type jb = 0; jb < n_block_cols(); ++jb)
280 if (b.row_index_set().size() == 0 ||
281 b.row_index_set().is_element(i))
282 for (size_type j = 0; j < b.n_cols(); ++j)
287 out <<
']' << std::endl;
289 k += block(ib, 0).n_rows();
296template <
typename SparsityPatternType>
299 std::ostream &out)
const
302 for (
size_type ib = 0; ib < n_block_rows(); ++ib)
304 for (
size_type i = 0; i < block(ib, 0).n_rows(); ++i)
309 const SparsityPatternType &b = block(ib, jb);
310 for (
size_type j = 0; j < b.n_cols(); ++j)
312 out << l + j <<
" " << -
static_cast<signed int>(i + k)
317 k += block(ib, 0).n_rows();
323template <
typename SparsityPatternType>
326 std::ostream &out)
const
328 const unsigned int m = this->n_rows();
329 const unsigned int n = this->n_cols();
331 <<
"<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 "
332 << n + 2 <<
" " << m + 2
334 "<style type=\"text/css\" >\n"
342 << n + 2 <<
"\" height=\"" << m + 2
343 <<
"\" fill=\"rgb(128, 128, 128)\"/>\n"
344 " <rect x=\"1\" y=\"1\" width=\""
345 << n + 0.1 <<
"\" height=\"" << m + 0.1
346 <<
"\" fill=\"rgb(255, 255, 255)\"/>\n\n";
348 for (
unsigned int block_i = 0; block_i < n_block_rows(); ++block_i)
349 for (
unsigned int block_j = 0; block_j < n_block_cols(); ++block_j)
350 for (
const auto &entry : block(block_i, block_j))
352 out <<
" <rect class=\"pixel\" x=\""
353 << column_indices.local_to_global(block_j, entry.column()) + 1
355 << row_indices.local_to_global(block_i, entry.row()) + 1
356 <<
"\" width=\".9\" height=\".9\"/>\n";
359 out <<
"</svg>" << std::endl;
364template <
typename SparsityPatternType>
374 for (
size_type r = 0; r < n_block_rows(); ++r)
375 for (
size_type c = 0; c < n_block_cols(); ++c)
393 const std::vector<std::vector<unsigned int>> &row_lengths)
404 if (row_lengths[j].
size() == 1)
411 row_lengths[j].
end(),
467 const std::vector<size_type> &row_indices,
468 const std::vector<size_type> &col_indices)
473 for (
size_type j = 0; j < col_indices.size(); ++j)
481 const std::vector<IndexSet> &partitioning)
485 for (
size_type i = 0; i < partitioning.size(); ++i)
486 for (
size_type j = 0; j < partitioning.size(); ++j)
488 partitioning[j].
size(),
506 const std::vector<size_type> &row_block_sizes,
507 const std::vector<size_type> &col_block_sizes)
510 row_block_sizes.size(), col_block_sizes.size());
511 for (
size_type i = 0; i < row_block_sizes.size(); ++i)
512 for (
size_type j = 0; j < col_block_sizes.size(); ++j)
513 this->
block(i, j).
reinit(row_block_sizes[i], col_block_sizes[j]);
523 partitioning.size());
524 for (
size_type i = 0; i < partitioning.size(); ++i)
525 for (
size_type j = 0; j < partitioning.size(); ++j)
527 partitioning[j].
size(),
548#ifdef DEAL_II_TRILINOS_WITH_EPETRA
559 const std::vector<size_type> &row_indices,
560 const std::vector<size_type> &col_indices)
565 for (
size_type j = 0; j < col_indices.size(); ++j)
573 const std::vector<IndexSet> ¶llel_partitioning,
576 parallel_partitioning.
size())
578 for (
size_type i = 0; i < parallel_partitioning.size(); ++i)
579 for (
size_type j = 0; j < parallel_partitioning.size(); ++j)
581 parallel_partitioning[j],
590 const std::vector<IndexSet> &row_parallel_partitioning,
591 const std::vector<IndexSet> &col_parallel_partitioning,
592 const std::vector<IndexSet> &writable_rows,
595 row_parallel_partitioning.
size(),
596 col_parallel_partitioning.
size())
598 for (
size_type i = 0; i < row_parallel_partitioning.size(); ++i)
599 for (
size_type j = 0; j < col_parallel_partitioning.size(); ++j)
600 this->
block(i, j).
reinit(row_parallel_partitioning[i],
601 col_parallel_partitioning[j],
612 const std::vector<size_type> &col_block_sizes)
615 row_block_sizes.size(), col_block_sizes.size());
616 for (
size_type i = 0; i < row_block_sizes.size(); ++i)
617 for (
size_type j = 0; j < col_block_sizes.size(); ++j)
618 this->
block(i, j).
reinit(row_block_sizes[i], col_block_sizes[j], 0);
626 const std::vector<IndexSet> ¶llel_partitioning,
630 parallel_partitioning.size(), parallel_partitioning.size());
631 for (
size_type i = 0; i < parallel_partitioning.size(); ++i)
632 for (
size_type j = 0; j < parallel_partitioning.size(); ++j)
634 parallel_partitioning[j],
644 const std::vector<IndexSet> &row_parallel_partitioning,
645 const std::vector<IndexSet> &col_parallel_partitioning,
649 row_parallel_partitioning.size(), col_parallel_partitioning.size());
650 for (
size_type i = 0; i < row_parallel_partitioning.size(); ++i)
651 for (
size_type j = 0; j < col_parallel_partitioning.size(); ++j)
652 this->
block(i, j).
reinit(row_parallel_partitioning[i],
653 col_parallel_partitioning[j],
663 const std::vector<IndexSet> &row_parallel_partitioning,
664 const std::vector<IndexSet> &col_parallel_partitioning,
665 const std::vector<IndexSet> &writable_rows,
668 AssertDimension(writable_rows.size(), row_parallel_partitioning.size());
670 row_parallel_partitioning.size(), col_parallel_partitioning.size());
671 for (
size_type i = 0; i < row_parallel_partitioning.size(); ++i)
672 for (
size_type j = 0; j < col_parallel_partitioning.size(); ++j)
673 this->
block(i, j).
reinit(row_parallel_partitioning[i],
674 col_parallel_partitioning[j],
687#ifdef DEAL_II_TRILINOS_WITH_EPETRA
void reinit(const std::vector< size_type > &row_block_sizes, const std::vector< size_type > &col_block_sizes)
BlockDynamicSparsityPattern()=default
size_type block_size(const unsigned int i) const
unsigned int size() const
void print_gnuplot(std::ostream &out) const
size_type n_block_rows() const
BlockSparsityPatternBase()
Table< 2, std::unique_ptr< SparsityPatternType > > sub_objects
SparsityPattern & block(const size_type row, const size_type column)
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
BlockSparsityPatternBase & operator=(const BlockSparsityPatternBase &)
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
void reinit(const size_type m, const size_type n, const IndexSet &rowset=IndexSet())
virtual void resize(const size_type rows, const size_type cols)
void reinit(const size_type m, const size_type n, const ArrayView< const unsigned int > &row_lengths)
void copy_from(const size_type n_rows, const size_type n_cols, const ForwardIterator begin, const ForwardIterator end)
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
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
std::vector< index_type > data
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)