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> 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);
137 const std::size_t index_within_sparsity);
148 size_type row ()
const;
154 size_type index ()
const;
160 size_type column ()
const;
171 bool is_valid_entry ()
const;
176 bool operator == (
const Accessor &)
const;
185 bool operator < (
const Accessor &)
const;
264 const std::size_t index_within_sparsity);
284 const Accessor *operator-> ()
const;
289 bool operator == (
const Iterator &)
const;
294 bool operator != (
const Iterator &)
const;
303 bool operator < (
const Iterator &)
const;
311 int operator - (
const Iterator &p)
const;
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,
548 const size_type extra_off_diagonals);
573 void reinit (
const size_type m,
575 const unsigned int max_per_row,
586 void reinit (
const size_type m,
588 const unsigned int max_per_row);
607 void reinit (
const size_type m,
609 const std::vector<unsigned int> &row_lengths,
626 void reinit (
const size_type m,
628 const std::vector<unsigned int> &row_lengths);
636 void reinit (
const size_type m,
638 const VectorSlice<
const std::vector<unsigned int> > &row_lengths,
644 void reinit (
const size_type m,
646 const VectorSlice<
const std::vector<unsigned int> > &row_lengths);
741 template <
typename ForwardIterator>
742 void copy_from (
const size_type n_rows,
743 const size_type n_cols,
744 const ForwardIterator begin,
745 const ForwardIterator end,
824 template <
typename ForwardIterator>
825 void copy_from (
const size_type n_rows,
826 const size_type n_cols,
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>
893 void add (
const size_type i,
902 template <
typename ForwardIterator>
903 void add_entries (
const size_type row,
904 ForwardIterator begin,
906 const bool indices_are_sorted =
false);
940 iterator begin (
const size_type r)
const;
950 iterator end (
const size_type r)
const;
999 size_type max_entries_per_row ()
const;
1007 size_type bandwidth ()
const;
1017 size_type n_nonzero_elements ()
const;
1022 bool is_compressed ()
const;
1028 size_type n_rows ()
const;
1034 size_type n_cols ()
const;
1039 unsigned int row_length (
const size_type row)
const;
1048 bool optimize_diagonal () const DEAL_II_DEPRECATED;
1062 bool stores_only_added_elements () const;
1068 std::
size_t memory_consumption () const;
1097 size_type operator() (const size_type i,
1098 const size_type j) const;
1111 std::pair<size_type, size_type>
1112 matrix_position (const size_type global_index) const;
1117 bool exists (const size_type i,
1118 const size_type j) const;
1127 size_type row_position(const size_type i,
1128 const size_type j) const;
1141 size_type column_number (const size_type row,
1142 const
unsigned int index) const;
1160 void block_write (
std::ostream &out) const;
1175 void block_read (
std::istream &in);
1182 void print (
std::ostream &out) const;
1197 void print_gnuplot (
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,
1254 std::vector<
unsigned int> &partition_indices) const DEAL_II_DEPRECATED;
1275 const
std::
size_t *get_rowstart_indices () const DEAL_II_DEPRECATED;
1294 const size_type *get_column_numbers () const DEAL_II_DEPRECATED;
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.");
1369 size_type max_vec_len;
1378 unsigned int max_row_length;
1427 bool store_diagonal_first_in_row;
1434 template <typename number> friend class
SparseILU;
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])
1491 return (index_within_sparsity < sparsity_pattern->rowstart[sparsity_pattern->
rows]
1493 sparsity_pattern->
colnums[index_within_sparsity]
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;
1518 return (sparsity_pattern->
colnums[index_within_sparsity]);
1524 Accessor::index()
const 1528 return index_within_sparsity - sparsity_pattern->
rowstart[row()];
1538 return (sparsity_pattern == other.sparsity_pattern &&
1539 index_within_sparsity == other.index_within_sparsity);
1548 Assert (sparsity_pattern == other.sparsity_pattern,
1551 return index_within_sparsity < other.index_within_sparsity;
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)
1589 accessor.advance ();
1599 const Iterator iter = *
this;
1600 accessor.advance ();
1627 return (accessor == other.accessor);
1636 return ! (*
this == other);
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]);
1682 Assert (r<n_rows(), ExcIndexRangeType<size_type>(r,0,n_rows()));
1684 return iterator(
this, rowstart[r]);
1693 Assert (r<n_rows(), ExcIndexRangeType<size_type>(r,0,n_rows()));
1695 return iterator(
this, rowstart[r+1]);
1704 Assert (r<n_rows(), ExcIndexRangeType<size_type>(r,0,n_rows()));
1705 return &colnums[rowstart[r]];
1714 Assert (r<n_rows(), ExcIndexRangeType<size_type>(r,0,n_rows()));
1715 return &colnums[rowstart[r+1]];
1748 return store_diagonal_first_in_row;
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>
1818 ar &max_dim &rows &cols &max_vec_len &max_row_length &compressed &store_diagonal_first_in_row;
1820 ar &boost::serialization::make_array(rowstart, max_dim + 1);
1821 ar &boost::serialization::make_array(colnums, max_vec_len);
1826 template <
class Archive>
1834 ar &max_dim &rows &cols &max_vec_len &max_row_length &compressed &store_diagonal_first_in_row;
1836 rowstart =
new std::size_t [max_dim + 1];
1837 colnums =
new size_type [max_vec_len];
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>
1915 const size_type n_cols,
1916 const ForwardIterator begin,
1917 const ForwardIterator end,
1920 copy_from (n_rows, n_cols, begin, end);
1925 template <
typename ForwardIterator>
1928 const size_type n_cols,
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
std::size_t index_within_sparsity
#define DeclException2(Exception2, type1, type2, outsequence)
Iterator(const ChunkSparsityPattern *sp, const unsigned int row)
const size_type * row_iterator
types::global_dof_index size_type
void save(Archive &ar, const unsigned int version) const
bool operator==(const Accessor &) const
const size_type * get_column_numbers() const DEAL_II_DEPRECATED
size_type n_nonzero_elements() const
const Accessor * operator->() const
#define DeclException1(Exception1, type1, outsequence)
unsigned int global_dof_index
#define Assert(cond, exc)
::ExceptionBase & ExcEmptyObject()
bool operator<(const Accessor &) const
#define DeclException0(Exception0)
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)
::ExceptionBase & ExcInvalidConstructorCall()
bool stores_only_added_elements() const
BlockCompressedSparsityPattern CompressedBlockSparsityPattern DEAL_II_DEPRECATED
void load(Archive &ar, const unsigned int version)
bool operator<(const Iterator &) const
SparsityPatternIterators::Iterator const_iterator
row_iterator row_begin(const size_type r) const DEAL_II_DEPRECATED
Accessor(const ChunkSparsityPattern *matrix, const unsigned int row)
::ExceptionBase & ExcIteratorPastEnd()
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 operator==(const Iterator &) const
bool store_diagonal_first_in_row
const SparsityPattern * sparsity_pattern
bool operator==(const SparsityPattern &) const
bool is_valid_entry() const
::ExceptionBase & ExcInvalidIterator()
bool operator!=(const Iterator &) const
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
const Accessor & operator*() const
bool optimize_diagonal() const DEAL_II_DEPRECATED
unsigned int column() const
static const size_type invalid_entry