17 #include <deal.II/lac/chunk_sparsity_pattern.h> 18 #include <deal.II/lac/dynamic_sparsity_pattern.h> 19 #include <deal.II/lac/full_matrix.h> 22 DEAL_II_NAMESPACE_OPEN
38 Assert (s.
rows == 0, ExcInvalidConstructorCall());
39 Assert (s.
cols == 0, ExcInvalidConstructorCall());
51 Assert (chunk_size > 0, ExcInvalidNumber (chunk_size));
53 reinit (m,n,max_per_row, chunk_size);
61 const std::vector<size_type> &row_lengths,
64 Assert (chunk_size > 0, ExcInvalidNumber (chunk_size));
66 reinit (m, n, row_lengths, chunk_size);
75 reinit (n, n, max_per_row, chunk_size);
82 const std::vector<size_type > &row_lengths,
85 Assert (chunk_size > 0, ExcInvalidNumber (chunk_size));
87 reinit (m, m, row_lengths, chunk_size);
100 Assert (s.
rows == 0, ExcInvalidConstructorCall());
101 Assert (s.
cols == 0, ExcInvalidConstructorCall());
117 Assert (chunk_size > 0, ExcInvalidNumber (chunk_size));
120 const std::vector<size_type> row_lengths (m, max_per_row);
121 reinit (m, n, row_lengths, chunk_size);
130 const VectorSlice<
const std::vector<size_type> > &row_lengths,
133 Assert (row_lengths.size() == m, ExcInvalidNumber (m));
134 Assert (chunk_size > 0, ExcInvalidNumber (chunk_size));
145 const size_type m_chunks = (m+chunk_size-1) / chunk_size,
154 std::vector<unsigned int> chunk_row_lengths (m_chunks, 0);
156 chunk_row_lengths[i/chunk_size] += row_lengths[i];
161 if (m != n && m_chunks == n_chunks)
162 for (
unsigned int i=0; i<m_chunks; ++i)
163 ++chunk_row_lengths[i];
180 template <
typename SparsityPatternType>
185 Assert (chunk_size > 0, ExcInvalidNumber (chunk_size));
200 const size_type m_chunks = (dsp.n_rows()+chunk_size-1) / chunk_size,
201 n_chunks = (dsp.n_cols()+chunk_size-1) / chunk_size;
204 for (
size_type row = 0; row<dsp.n_rows(); ++row)
211 for (
typename SparsityPatternType::iterator col_num = dsp.begin(row);
212 col_num != dsp.end(row); ++col_num)
213 temporary_sp.
add (reduced_row, col_num->column()/
chunk_size);
222 template <
typename number>
226 Assert (chunk_size > 0, ExcInvalidNumber (chunk_size));
232 std::vector<size_type> entries_per_row (matrix.
m(), 0);
236 if (matrix(row,col) != 0)
237 ++entries_per_row[row];
239 if ((matrix.
m() == matrix.
n())
241 (matrix(row,row) == 0))
242 ++entries_per_row[row];
252 if (matrix(row,col) != 0)
265 const std::vector<size_type> &row_lengths,
268 Assert (chunk_size > 0, ExcInvalidNumber (chunk_size));
270 reinit(m, n, make_slice(row_lengths), chunk_size);
279 template <
typename SparsityPatternType>
280 void copy_sparsity (
const SparsityPatternType &src,
296 template <
typename Sparsity>
299 (
const unsigned int m,
300 const unsigned int n,
301 const Sparsity &sparsity_pattern_for_chunks,
302 const unsigned int chunk_size_in,
305 Assert (m > (sparsity_pattern_for_chunks.n_rows()-1) * chunk_size_in &&
306 m <= sparsity_pattern_for_chunks.n_rows() * chunk_size_in,
307 ExcMessage(
"Number of rows m is not compatible with chunk size " 308 "and number of rows in sparsity pattern for the chunks."));
309 Assert (n > (sparsity_pattern_for_chunks.n_cols()-1) * chunk_size_in &&
310 n <= sparsity_pattern_for_chunks.n_cols() * chunk_size_in,
311 ExcMessage(
"Number of columns m is not compatible with chunk size " 312 "and number of columns in sparsity pattern for the chunks."));
390 for ( ; p !=
end; ++p)
491 out <<
']' << std::endl;
610 return (
sizeof(*
this) +
621 void ChunkSparsityPattern::create_from<SparsityPattern>
628 void ChunkSparsityPattern::create_from<DynamicSparsityPattern>
631 const DynamicSparsityPattern &,
641 DEAL_II_NAMESPACE_CLOSE
void block_write(std::ostream &out) const
void block_write(std::ostream &out) const
void copy_from(const size_type n_rows, const size_type n_cols, const ForwardIterator begin, const ForwardIterator end, const size_type chunk_size)
std::size_t memory_consumption() const
static const size_type invalid_entry
void add(const size_type i, const size_type j)
::ExceptionBase & ExcMessage(std::string arg1)
std::size_t memory_consumption() const
void block_read(std::istream &in)
bool exists(const size_type i, const size_type j) const
bool exists(const size_type i, const size_type j) const
#define AssertThrow(cond, exc)
void add(const size_type i, const size_type j)
SparsityPattern sparsity_pattern
size_type bandwidth() const
void add(const size_type i, const size_type j)
#define Assert(cond, exc)
size_type row_length(const size_type row) const
size_type max_entries_per_row() const
size_type n_nonzero_elements() const
void copy_from(const size_type n_rows, const size_type n_cols, const ForwardIterator begin, const ForwardIterator end)
size_type n_nonzero_elements() const
ChunkSparsityPattern & operator=(const ChunkSparsityPattern &)
void reinit(const size_type m, const size_type n, const unsigned int max_per_row)
types::global_dof_index size_type
bool stores_only_added_elements() const
void block_read(std::istream &in)
size_type bandwidth() const
bool stores_only_added_elements() const
void print(std::ostream &out) const
void create_from(const unsigned int m, const unsigned int n, const Sparsity &sparsity_pattern_for_chunks, const unsigned int chunk_size, const bool optimize_diagonal=true)
void print_gnuplot(std::ostream &out) const
void reinit(const size_type m, const size_type n, const size_type max_per_row, const size_type chunk_size)
unsigned int row_length(const size_type row) const
size_type max_entries_per_row() const