16 #ifndef dealii_sparsity_pattern_h 17 #define dealii_sparsity_pattern_h 30 #include <boost/version.hpp> 31 #if BOOST_VERSION >= 106400 32 # include <boost/serialization/array_wrapper.hpp> 34 # include <boost/serialization/array.hpp> 36 #include <boost/serialization/split_member.hpp> 50 template <
typename number>
52 template <
typename number>
54 template <
typename number>
56 template <
typename number>
71 namespace SparsityPatternTools
91 template <
typename value>
100 template <
typename value>
203 is_valid_entry()
const;
223 "The instance of this class was initialized" 224 " without SparsityPattern object, which" 225 " means that it is a dummy accessor that can" 226 " not do any operations.");
411 const std::vector<unsigned int> &row_lengths);
524 max_entries_per_row()
const;
547 n_nonzero_elements()
const;
553 is_compressed()
const;
600 column_number(
const size_type row,
const unsigned int index)
const;
623 std::pair<size_type, size_type>
639 print(std::ostream &out)
const;
655 print_gnuplot(std::ostream &out)
const;
665 print_svg(std::ostream &out)
const;
671 template <
class Archive>
673 save(Archive &ar,
const unsigned int version)
const;
679 template <
class Archive>
681 load(Archive &ar,
const unsigned int version);
688 template <
class Archive>
690 serialize(Archive &archive,
const unsigned int version);
694 BOOST_SERIALIZATION_SPLIT_MEMBER()
710 "The operation you attempted is only allowed after the SparsityPattern " 711 "has been set up and compress() was called.");
719 <<
"Upon entering a new entry to row " << arg1
720 <<
": there was no free entry any more. " << std::endl
721 <<
"(Maximum number of entries for this row: " << arg2
722 <<
"; maybe the matrix is already compressed?)");
729 ExcMatrixIsCompressed,
730 "The operation you attempted changes the structure of the SparsityPattern " 731 "and is not possible after compress() has been called.");
817 template <
typename number>
819 template <
typename number>
821 template <
typename number>
823 template <
typename number>
935 const unsigned int max_per_row);
948 const std::vector<unsigned int> &row_lengths);
968 const std::vector<unsigned int> &row_lengths);
993 const unsigned int max_per_row,
1111 template <
typename ForwardIterator>
1115 const ForwardIterator
begin,
1116 const ForwardIterator
end);
1139 template <
typename number>
1149 template <
typename ForwardIterator>
1152 ForwardIterator
begin,
1153 ForwardIterator
end,
1154 const bool indices_are_sorted =
false);
1182 stores_only_added_elements()
const;
1238 block_write(std::ostream &out)
const;
1254 block_read(std::istream &in);
1260 template <
class Archive>
1262 save(Archive &ar,
const unsigned int version)
const;
1268 template <
class Archive>
1270 load(Archive &ar,
const unsigned int version);
1277 template <
class Archive>
1279 serialize(Archive &archive,
const unsigned int version);
1283 BOOST_SERIALIZATION_SPLIT_MEMBER()
1298 <<
"The iterators denote a range of " << arg1
1299 <<
" elements, but the given number of rows was " << arg2);
1305 <<
"The number of partitions you gave is " << arg1
1306 <<
", but must be greater than zero.");
1315 template <
typename number>
1317 template <
typename number>
1319 template <
typename number>
1321 template <
typename number>
1343 const std::size_t i)
1344 : container(sparsity_pattern)
1351 : container(sparsity_pattern)
1358 : container(nullptr)
1365 Accessor::is_valid_entry()
const 1367 Assert(container !=
nullptr, DummyAccessor());
1368 return (linear_index < container->
rowstart[container->rows] &&
1375 Accessor::row()
const 1379 const std::size_t *insert_point =
1380 std::upper_bound(container->rowstart.get(),
1381 container->rowstart.get() + container->rows + 1,
1383 return insert_point - container->rowstart.get() - 1;
1389 Accessor::column()
const 1393 return (container->colnums[linear_index]);
1399 Accessor::index()
const 1403 return linear_index - container->rowstart[row()];
1413 return linear_index;
1421 Assert(container !=
nullptr, DummyAccessor());
1422 Assert(other.container !=
nullptr, DummyAccessor());
1423 return (container == other.container && linear_index == other.linear_index);
1431 Assert(container !=
nullptr, DummyAccessor());
1432 Assert(other.container !=
nullptr, DummyAccessor());
1435 return linear_index < other.linear_index;
1443 Assert(container !=
nullptr, DummyAccessor());
1451 const std::size_t linear_index)
1482 return {
nullptr, 0};
1550 const unsigned int index)
const 1574 template <
class Archive>
1579 ar &boost::serialization::base_object<const Subscriptor>(*this);
1589 template <
class Archive>
1594 ar &boost::serialization::base_object<Subscriptor>(*this);
1602 ar &boost::serialization::make_array(colnums.get(),
max_vec_len);
1607 template <
class Archive>
1612 ar &boost::serialization::base_object<const SparsityPatternBase>(*this);
1618 template <
class Archive>
1623 ar &boost::serialization::base_object<SparsityPatternBase>(*this);
1644 if (colnums[i] != sp2.
colnums[i])
1655 return (static_cast<const SparsityPatternBase &>(*
this) == sp2) &&
1663 namespace SparsityPatternTools
1678 template <
typename value>
1687 template <
typename value>
1698 template <
typename ForwardIterator>
1702 const ForwardIterator
begin,
1703 const ForwardIterator
end)
1705 Assert(static_cast<size_type>(std::distance(begin, end)) == n_rows,
1712 const bool is_square = (n_rows ==
n_cols);
1713 std::vector<unsigned int> row_lengths;
1714 row_lengths.reserve(n_rows);
1715 for (ForwardIterator i = begin; i !=
end; ++i)
1716 row_lengths.push_back(std::distance(i->begin(), i->end()) +
1717 (is_square ? 1 : 0));
1718 reinit(n_rows, n_cols, row_lengths);
1726 using inner_iterator =
1727 typename std::iterator_traits<ForwardIterator>::value_type::const_iterator;
1728 for (ForwardIterator i = begin; i !=
end; ++i, ++row)
1730 size_type *
cols = &colnums[rowstart[row]] + (is_square ? 1 : 0);
1731 const inner_iterator end_of_row = i->end();
1732 for (inner_iterator j = i->begin(); j != end_of_row; ++j)
1738 if ((col != row) || !is_square)
const types::global_dof_index invalid_size_type
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)
#define DeclException2(Exception2, type1, type2, outsequence)
unsigned int max_row_length
Contents is actually a matrix.
constexpr SymmetricTensor< 2, dim, Number > symmetrize(const Tensor< 2, dim, Number > &t)
void load(Archive &ar, const unsigned int version)
#define AssertIndexRange(index, range)
types::global_dof_index size_type
bool operator<(const SynchronousIterators< Iterators > &a, const SynchronousIterators< Iterators > &b)
bool operator==(const SparsityPatternBase &) const
bool operator==(const AlignedVector< T > &lhs, const AlignedVector< T > &rhs)
void reinit(const size_type m, const size_type n, const unsigned int max_per_row)
std::unique_ptr< std::size_t[]> rowstart
static ::ExceptionBase & ExcNotCompressed()
static ::ExceptionBase & ExcInvalidIterator()
static ::ExceptionBase & ExcInvalidNumberOfPartitions(int arg1)
virtual void reinit(const size_type m, const size_type n, const ArrayView< const unsigned int > &row_lengths) override
std::string compress(const std::string &input)
#define DeclException1(Exception1, type1, outsequence)
Accessor(const ChunkSparsityPattern *matrix, const size_type row)
#define Assert(cond, exc)
#define DeclExceptionMsg(Exception, defaulttext)
#define DEAL_II_NAMESPACE_CLOSE
VectorType::value_type * end(VectorType &V)
SparsityPatternIterators::Iterator const_iterator
void load(Archive &ar, const unsigned int version)
void copy_from(const size_type n_rows, const size_type n_cols, const ForwardIterator begin, const ForwardIterator end)
std::size_t n_nonzero_elements() const
MatrixTableIterators::Accessor< TransposeTable< T >, Constness, MatrixTableIterators::Storage::column_major > Accessor
static ::ExceptionBase & ExcIteratorPastEnd()
std::unique_ptr< size_type[]> colnums
unsigned int global_dof_index
MatrixTableIterators::Iterator< TransposeTable< T >, Constness, MatrixTableIterators::Storage::column_major > Iterator
void advance(std::tuple< I1, I2 > &t, const unsigned int n)
bool is_compressed() const
bool operator==(const SparsityPattern &) const
bool stores_only_added_elements() const
bool store_diagonal_first_in_row
void save(Archive &ar, const unsigned int version) const
#define DEAL_II_NAMESPACE_OPEN
VectorType::value_type * begin(VectorType &V)
TrilinosWrappers::types::int_type global_index(const Epetra_BlockMap &map, const ::types::global_dof_index i)
static const size_type invalid_entry
types::global_dof_index size_type
static ::ExceptionBase & ExcIteratorRange(int arg1, int arg2)
size_type column_number(const size_type row, const unsigned int index) const
void save(Archive &ar, const unsigned int version) const
unsigned int row_length(const size_type row) const
const SparsityPatternBase * container
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
static ::ExceptionBase & ExcInternalError()
SparsityPatternIterators::Iterator iterator