17 #include <deal.II/base/memory_consumption.h> 18 #include <deal.II/base/vector_slice.h> 20 #include <deal.II/lac/block_sparsity_pattern.h> 22 DEAL_II_NAMESPACE_OPEN
25 template <
class SparsityPatternBase>
33 template <
class SparsityPatternBase>
40 reinit(n_block_rows, n_block_columns);
45 template <
class SparsityPatternBase>
55 "This constructor can only be called if the provided argument " 56 "is the sparsity pattern for an empty matrix. This constructor can " 57 "not be used to copy-construct a non-empty sparsity pattern."));
62 template <
class SparsityPatternBase>
76 template <
class SparsityPatternBase>
96 columns = n_block_columns;
103 SparsityPatternBase *p =
new SparsityPatternBase;
109 template <
class SparsityPatternBase>
128 template <
class SparsityPatternBase>
132 std::vector<size_type> row_sizes(
rows);
133 std::vector<size_type> col_sizes(
columns);
167 template <
class SparsityPatternBase>
178 template <
class SparsityPatternBase>
191 template <
class SparsityPatternBase>
202 if (this_row > max_entries)
203 max_entries = this_row;
210 template <
class SparsityPatternBase>
224 template <
class SparsityPatternBase>
238 template <
class SparsityPatternBase>
251 template <
class SparsityPatternBase>
264 const SparsityPatternBase &b =
block(ib, jb);
265 for (
size_type j = 0; j < b.n_cols(); ++j)
270 out <<
']' << std::endl;
272 k +=
block(ib, 0).n_rows();
298 out <<
']' << std::endl;
300 k +=
block(ib, 0).n_rows();
305 template <
class SparsityPatternBase>
308 std::ostream &out)
const 318 const SparsityPatternBase &b =
block(ib, jb);
319 for (
size_type j = 0; j < b.n_cols(); ++j)
321 out << l + j <<
" " << -static_cast<signed int>(i + k)
326 k +=
block(ib, 0).n_rows();
342 const std::vector<std::vector<unsigned int>> &row_lengths)
353 if (row_lengths[j].size() == 1)
360 row_lengths[j], start, length);
430 const std::vector<size_type> &col_indices)
434 for (
size_type i = 0; i < row_indices.size(); ++i)
435 for (
size_type j = 0; j < col_indices.size(); ++j)
436 this->
block(i, j).
reinit(row_indices[i], col_indices[j]);
442 const std::vector<IndexSet> &partitioning)
446 for (
size_type i = 0; i < partitioning.size(); ++i)
447 for (
size_type j = 0; j < partitioning.size(); ++j)
449 partitioning[j].size(),
459 reinit(row_indices, col_indices);
465 const std::vector<size_type> &row_block_sizes,
466 const std::vector<size_type> &col_block_sizes)
469 row_block_sizes.size(), col_block_sizes.size());
470 for (
size_type i = 0; i < row_block_sizes.size(); ++i)
471 for (
size_type j = 0; j < col_block_sizes.size(); ++j)
472 this->
block(i, j).
reinit(row_block_sizes[i], col_block_sizes[j]);
480 partitioning.size());
481 for (
size_type i = 0; i < partitioning.size(); ++i)
482 for (
size_type j = 0; j < partitioning.size(); ++j)
484 partitioning[j].size(),
503 #ifdef DEAL_II_WITH_TRILINOS 515 const std::vector<size_type> &col_indices)
519 for (
size_type i = 0; i < row_indices.size(); ++i)
520 for (
size_type j = 0; j < col_indices.size(); ++j)
521 this->
block(i, j).
reinit(row_indices[i], col_indices[j]);
528 const std::vector<Epetra_Map> ¶llel_partitioning)
530 parallel_partitioning.size())
532 for (
size_type i = 0; i < parallel_partitioning.size(); ++i)
533 for (
size_type j = 0; j < parallel_partitioning.size(); ++j)
535 parallel_partitioning[j]);
542 const std::vector<IndexSet> ¶llel_partitioning,
543 const MPI_Comm & communicator)
545 parallel_partitioning.size())
547 for (
size_type i = 0; i < parallel_partitioning.size(); ++i)
548 for (
size_type j = 0; j < parallel_partitioning.size(); ++j)
550 parallel_partitioning[j],
558 const std::vector<IndexSet> &row_parallel_partitioning,
559 const std::vector<IndexSet> &col_parallel_partitioning,
560 const std::vector<IndexSet> &writable_rows,
561 const MPI_Comm & communicator)
563 row_parallel_partitioning.size(),
564 col_parallel_partitioning.size())
566 for (
size_type i = 0; i < row_parallel_partitioning.size(); ++i)
567 for (
size_type j = 0; j < col_parallel_partitioning.size(); ++j)
568 this->
block(i, j).
reinit(row_parallel_partitioning[i],
569 col_parallel_partitioning[j],
579 const std::vector<size_type> &col_block_sizes)
582 row_block_sizes.size(), col_block_sizes.size());
583 for (
size_type i = 0; i < row_block_sizes.size(); ++i)
584 for (
size_type j = 0; j < col_block_sizes.size(); ++j)
585 this->
block(i, j).
reinit(row_block_sizes[i], col_block_sizes[j]);
593 const std::vector<Epetra_Map> ¶llel_partitioning)
596 parallel_partitioning.size(), parallel_partitioning.size());
597 for (
size_type i = 0; i < parallel_partitioning.size(); ++i)
598 for (
size_type j = 0; j < parallel_partitioning.size(); ++j)
600 parallel_partitioning[j]);
608 const std::vector<IndexSet> ¶llel_partitioning,
609 const MPI_Comm & communicator)
612 parallel_partitioning.size(), parallel_partitioning.size());
613 for (
size_type i = 0; i < parallel_partitioning.size(); ++i)
614 for (
size_type j = 0; j < parallel_partitioning.size(); ++j)
616 parallel_partitioning[j],
625 const std::vector<IndexSet> &row_parallel_partitioning,
626 const std::vector<IndexSet> &col_parallel_partitioning,
627 const MPI_Comm & communicator)
630 row_parallel_partitioning.size(), col_parallel_partitioning.size());
631 for (
size_type i = 0; i < row_parallel_partitioning.size(); ++i)
632 for (
size_type j = 0; j < col_parallel_partitioning.size(); ++j)
633 this->
block(i, j).
reinit(row_parallel_partitioning[i],
634 col_parallel_partitioning[j],
643 const std::vector<IndexSet> &row_parallel_partitioning,
644 const std::vector<IndexSet> &col_parallel_partitioning,
645 const std::vector<IndexSet> &writable_rows,
646 const MPI_Comm & communicator)
648 AssertDimension(writable_rows.size(), row_parallel_partitioning.size());
650 row_parallel_partitioning.size(), col_parallel_partitioning.size());
651 for (
size_type i = 0; i < row_parallel_partitioning.size(); ++i)
652 for (
size_type j = 0; j < col_parallel_partitioning.size(); ++j)
653 this->
block(i, j).
reinit(row_parallel_partitioning[i],
654 col_parallel_partitioning[j],
666 #ifdef DEAL_II_WITH_TRILINOS 670 DEAL_II_NAMESPACE_CLOSE
static::ExceptionBase & ExcIncompatibleRowNumbers(int arg1, int arg2, int arg3, int arg4)
void reinit(const std::vector< size_type > &row_block_sizes, const std::vector< size_type > &col_block_sizes)
size_type n_block_cols() const
BlockIndices column_indices
bool exists(const size_type i, const size_type j) const
#define AssertDimension(dim1, dim2)
void print(std::ostream &out) const
void reinit(const std::vector< size_type > &row_block_sizes, const std::vector< size_type > &col_block_sizes)
BlockSparsityPatternBase()
std::size_t memory_consumption() const
bool is_compressed() const
size_type n_nonzero_elements() const
SparsityPatternType & block(const size_type row, const size_type column)
void reinit(const size_type n_block_rows, const size_type n_block_columns)
void reinit(const size_type n_block_rows, const size_type n_block_columns)
static::ExceptionBase & ExcMessage(std::string arg1)
const IndexSet & row_index_set() const
void reinit(const TableIndices< N > &new_size, const bool omit_default_initialization=false)
#define Assert(cond, exc)
void reinit(const size_type m, const size_type n, const IndexSet &rowset=IndexSet())
static::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
void reinit(const unsigned int n_blocks, const size_type n_elements_per_block)
BlockSparsityPatternBase & operator=(const BlockSparsityPatternBase &)
BlockDynamicSparsityPattern()=default
size_type n_block_rows() const
size_type max_entries_per_row() const
void copy_from(const size_type n_rows, const size_type n_cols, const ForwardIterator begin, const ForwardIterator end)
size_type block_size(const unsigned int i) const
~BlockSparsityPatternBase() override
void reinit(const size_type m, const size_type n, const unsigned int max_per_row)
Table< 2, SmartPointer< SparsityPatternType, BlockSparsityPatternBase< SparsityPatternType > > > sub_objects
BlockSparsityPattern()=default
void print_gnuplot(std::ostream &out) const
bool is_element(const size_type index) const
unsigned int size() const
void copy_from(const BlockDynamicSparsityPattern &dsp)
types::global_dof_index size_type
size_type local_to_global(const unsigned int block, const size_type index) const
BlockSparsityPattern()=default
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
static::ExceptionBase & ExcInternalError()