17 #ifndef __deal2__sparsity_pattern_h
18 #define __deal2__sparsity_pattern_h
21 #include <deal.II/base/config.h>
23 #include <deal.II/base/subscriptor.h>
24 #include <boost/serialization/array.hpp>
25 #include <boost/serialization/split_member.hpp>
30 DEAL_II_NAMESPACE_OPEN
45 namespace ChunkSparsityPatternIterators
57 namespace SparsityPatternTools
70 get_column_index_from_iterator (
const size_type i);
77 template <
typename value>
79 get_column_index_from_iterator (
const std::pair<size_type, value> &i);
86 template <
typename value>
88 get_column_index_from_iterator (
const std::pair<const size_type, value> &i);
97 namespace SparsityPatternIterators
264 const std::size_t index_within_sparsity);
445 const unsigned int max_per_row,
457 const unsigned int max_per_row);
473 const std::vector<unsigned int> &row_lengths,
486 const std::vector<unsigned int> &row_lengths);
497 const unsigned int max_per_row);
511 const std::vector<unsigned int> &row_lengths,
522 const std::vector<unsigned int> &row_lengths);
547 const unsigned int max_per_row,
575 const unsigned int max_per_row,
588 const unsigned int max_per_row);
609 const std::vector<unsigned int> &row_lengths,
628 const std::vector<unsigned int> &row_lengths);
638 const VectorSlice<
const std::vector<unsigned int> > &row_lengths,
646 const VectorSlice<
const std::vector<unsigned int> > &row_lengths);
741 template <
typename ForwardIterator>
744 const ForwardIterator
begin,
745 const ForwardIterator
end,
824 template <
typename ForwardIterator>
827 const ForwardIterator
begin,
828 const ForwardIterator
end);
839 template <
typename CompressedSparsityType>
840 void copy_from (
const CompressedSparsityType &csp,
851 template <
typename CompressedSparsityType>
852 void copy_from (
const CompressedSparsityType &csp);
864 template <
typename number>
875 template <
typename number>
902 template <
typename ForwardIterator>
904 ForwardIterator
begin,
906 const bool indices_are_sorted =
false);
1117 bool exists (const size_type i,
1118 const size_type j) const;
1128 const size_type j) const;
1142 const
unsigned int index) const;
1182 void print (std::ostream &out) const;
1203 template <class Archive>
1204 void save (Archive &ar, const
unsigned int version) const;
1210 template <class Archive>
1211 void load (Archive &ar, const
unsigned int version);
1253 void partition (const
unsigned int n_partitions,
1296 BOOST_SERIALIZATION_SPLIT_MEMBER()
1305 << "Upon entering a new entry to row " << arg1
1306 << ": there was no free entry any more. " << std::endl
1307 << "(Maximum number of entries for this row: "
1308 << arg2 << "; maybe the matrix is already
compressed?)");
1334 << "The iterators denote a range of " << arg1
1335 << " elements, but the given number of
rows was " << arg2);
1341 << "The number of partitions you gave is " << arg1
1342 << ", but must be greater than zero.");
1434 template <typename number> friend class
SparseILU;
1443 friend class SparsityPatternIterators::Iterator;
1444 friend class SparsityPatternIterators::Accessor;
1445 friend class ChunkSparsityPatternIterators::Accessor;
1455 namespace SparsityPatternIterators
1463 sparsity_pattern(sparsity_pattern),
1464 index_within_sparsity(sparsity_pattern->
rowstart[r]+i)
1471 const std::size_t i)
1473 sparsity_pattern(sparsity_pattern),
1474 index_within_sparsity(i)
1482 sparsity_pattern(sparsity_pattern),
1483 index_within_sparsity(sparsity_pattern->
rowstart[sparsity_pattern->
rows])
1489 Accessor::is_valid_entry ()
const
1491 return (index_within_sparsity < sparsity_pattern->rowstart[sparsity_pattern->
rows]
1493 sparsity_pattern->
colnums[index_within_sparsity]
1500 Accessor::row()
const
1504 const std::size_t *insert_point =
1505 std::upper_bound(sparsity_pattern->
rowstart,
1506 sparsity_pattern->
rowstart + sparsity_pattern->
rows + 1,
1507 index_within_sparsity);
1508 return insert_point - sparsity_pattern->
rowstart - 1;
1514 Accessor::column()
const
1518 return (sparsity_pattern->
colnums[index_within_sparsity]);
1524 Accessor::index()
const
1528 return index_within_sparsity - sparsity_pattern->
rowstart[row()];
1536 Accessor::operator == (
const Accessor &other)
const
1538 return (sparsity_pattern == other.sparsity_pattern &&
1539 index_within_sparsity == other.index_within_sparsity);
1546 Accessor::operator < (
const Accessor &other)
const
1548 Assert (sparsity_pattern == other.sparsity_pattern,
1551 return index_within_sparsity < other.index_within_sparsity;
1557 Accessor::advance ()
1559 Assert (index_within_sparsity < sparsity_pattern->rowstart[sparsity_pattern->
rows],
1561 ++index_within_sparsity;
1571 accessor(sparsity_pattern, sparsity_pattern->
rowstart[r]+i)
1578 const std::size_t i)
1580 accessor(sparsity_pattern, i)
1587 Iterator::operator++ ()
1589 accessor.advance ();
1597 Iterator::operator++ (
int)
1599 const Iterator iter = *
this;
1600 accessor.advance ();
1608 Iterator::operator* ()
const
1617 Iterator::operator-> ()
const
1625 Iterator::operator == (
const Iterator &other)
const
1627 return (accessor == other.accessor);
1634 Iterator::operator != (
const Iterator &other)
const
1636 return ! (*
this == other);
1642 Iterator::operator < (
const Iterator &other)
const
1644 return accessor < other.accessor;
1650 Iterator::operator - (
const Iterator &other)
const
1652 Assert (accessor.sparsity_pattern == other.accessor.sparsity_pattern,
1655 return (*this)->index_within_sparsity - other->index_within_sparsity;
1665 return iterator(
this, rowstart[0]);
1673 return iterator(
this, rowstart[rows]);
1684 return iterator(
this, rowstart[r]);
1695 return iterator(
this, rowstart[r+1]);
1705 return &colnums[rowstart[r]];
1715 return &colnums[rowstart[r+1]];
1756 return (store_diagonal_first_in_row ==
false);
1781 Assert(row<rows, ExcIndexRangeType<size_type>(row,0,rows));
1782 return rowstart[row+1]-rowstart[row];
1790 const unsigned int index)
const
1792 Assert(row<rows, ExcIndexRangeType<size_type>(row,0,rows));
1795 return colnums[rowstart[row]+index];
1804 Assert (compressed, ExcNotCompressed());
1805 return rowstart[
rows]-rowstart[0];
1810 template <
class Archive>
1820 ar &boost::serialization::make_array(rowstart, max_dim + 1);
1821 ar &boost::serialization::make_array(colnums, max_vec_len);
1826 template <
class Archive>
1836 rowstart =
new std::size_t [max_dim + 1];
1839 ar &boost::serialization::make_array(rowstart, max_dim + 1);
1840 ar &boost::serialization::make_array(colnums, max_vec_len);
1853 if (rows != sp2.
rows ||
1859 for (size_type i = 0; i < rows+1; ++i)
1860 if (rowstart[i] != sp2.
rowstart[i])
1863 for (size_type i = 0; i < rowstart[
rows]; ++i)
1864 if (colnums[i] != sp2.
colnums[i])
1874 namespace SparsityPatternTools
1883 get_column_index_from_iterator (
const size_type i)
1890 template <
typename value>
1893 get_column_index_from_iterator (
const std::pair<size_type, value> &i)
1900 template <
typename value>
1903 get_column_index_from_iterator (
const std::pair<const size_type, value> &i)
1912 template <
typename ForwardIterator>
1916 const ForwardIterator
begin,
1917 const ForwardIterator
end,
1925 template <
typename ForwardIterator>
1929 const ForwardIterator
begin,
1930 const ForwardIterator
end)
1932 Assert (static_cast<size_type>(std::distance (begin, end)) == n_rows,
1933 ExcIteratorRange (std::distance (begin, end), n_rows));
1939 const bool is_square = (n_rows ==
n_cols);
1940 std::vector<unsigned int> row_lengths;
1941 row_lengths.reserve(n_rows);
1942 for (ForwardIterator i=begin; i!=
end; ++i)
1943 row_lengths.push_back (std::distance (i->begin(), i->end())
1945 (is_square ? 1 : 0));
1946 reinit (n_rows, n_cols, row_lengths);
1954 typedef typename std::iterator_traits<ForwardIterator>::value_type::const_iterator inner_iterator;
1955 for (ForwardIterator i=begin; i!=
end; ++i, ++row)
1957 size_type *cols = &colnums[rowstart[row]] + (is_square ? 1 : 0);
1958 const inner_iterator end_of_row = i->end();
1959 for (inner_iterator j=i->begin(); j!=end_of_row; ++j)
1962 = internal::SparsityPatternTools::get_column_index_from_iterator(*j);
1965 if ((col!=row) || !is_square)
1977 DEAL_II_NAMESPACE_CLOSE
const types::global_dof_index invalid_size_type
SparsityPatternIterators::Iterator iterator
void add_entries(const size_type row, ForwardIterator begin, ForwardIterator end, const bool indices_are_sorted=false)
int operator-(const Iterator &p) const
std::size_t index_within_sparsity
std::pair< size_type, size_type > matrix_position(const size_type global_index) const
size_type row_position(const size_type i, const size_type j) const
std::size_t memory_consumption() const
const size_type * row_iterator
bool operator<(const Accessor &) const
types::global_dof_index size_type
bool operator==(const Accessor &) const
void print_gnuplot(std::ostream &out) const
void save(Archive &ar, const unsigned int version) const
const size_type * get_column_numbers() const DEAL_II_DEPRECATED
DeclException2(ExcNotEnoughSpace, int, int,<< "Upon entering a new entry to row "<< arg1<< ": there was no free entry any more. "<< std::endl<< "(Maximum number of entries for this row: "<< arg2<< "; maybe the matrix is already compressed?)")
void partition(const unsigned int n_partitions, std::vector< unsigned int > &partition_indices) const DEAL_II_DEPRECATED
size_type bandwidth() const
size_type n_nonzero_elements() const
SparsityPattern & operator=(const SparsityPattern &)
const Accessor & operator*() const
bool is_valid_entry() const
Iterator(const SparsityPattern *sp, const size_type row, const size_type index) DEAL_II_DEPRECATED
void add(const size_type i, const size_type j)
unsigned int global_dof_index
void block_write(std::ostream &out) const
#define Assert(cond, exc)
::ExceptionBase & ExcEmptyObject()
unsigned int row_length(const size_type row) const
size_type column_number(const size_type row, const unsigned int index) const
::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
bool operator==(const Iterator &) const
::ExceptionBase & ExcInvalidConstructorCall()
DeclException1(ExcInvalidNumberOfPartitions, int,<< "The number of partitions you gave is "<< arg1<< ", but must be greater than zero.")
bool stores_only_added_elements() const
BlockCompressedSparsityPattern CompressedBlockSparsityPattern DEAL_II_DEPRECATED
void load(Archive &ar, const unsigned int version)
SparsityPatternIterators::Iterator const_iterator
void reinit(const size_type m, const size_type n, const unsigned int max_per_row, const bool optimize_diagonal) DEAL_II_DEPRECATED
row_iterator row_begin(const size_type r) const DEAL_II_DEPRECATED
unsigned int max_row_length
::ExceptionBase & ExcIteratorPastEnd()
size_type max_entries_per_row() const
Accessor(const SparsityPattern *matrix, const size_type row, const size_type index) DEAL_II_DEPRECATED
void copy_from(const size_type n_rows, const size_type n_cols, const ForwardIterator begin, const ForwardIterator end, const bool optimize_diagonal) DEAL_II_DEPRECATED
types::global_dof_index size_type
bool store_diagonal_first_in_row
const SparsityPattern * sparsity_pattern
void print(std::ostream &out) const
bool operator<(const Iterator &) const
void block_read(std::istream &in)
DeclException0(ExcNotCompressed)
bool exists(const size_type i, const size_type j) const
bool operator==(const SparsityPattern &) const
::ExceptionBase & ExcInvalidIterator()
row_iterator row_end(const size_type r) const DEAL_II_DEPRECATED
const std::size_t * get_rowstart_indices() const DEAL_II_DEPRECATED
::ExceptionBase & ExcInternalError()
bool is_compressed() const
bool operator!=(const Iterator &) const
const Accessor * operator->() const
bool optimize_diagonal() const DEAL_II_DEPRECATED
static const size_type invalid_entry