17 #ifndef __deal2__block_sparsity_pattern_h
18 #define __deal2__block_sparsity_pattern_h
21 #include <deal.II/base/config.h>
23 #include <deal.II/base/table.h>
24 #include <deal.II/base/subscriptor.h>
25 #include <deal.II/base/smartpointer.h>
26 #include <deal.II/lac/sparsity_pattern.h>
27 #include <deal.II/lac/trilinos_sparsity_pattern.h>
28 #include <deal.II/lac/compressed_sparsity_pattern.h>
29 #include <deal.II/lac/compressed_set_sparsity_pattern.h>
30 #include <deal.II/lac/compressed_simple_sparsity_pattern.h>
31 #include <deal.II/lac/block_indices.h>
41 #ifdef DEAL_II_WITH_TRILINOS
86 template <
class SparsityPatternBase>
130 const size_type n_block_columns);
177 const size_type n_block_columns);
207 SparsityPatternBase &
208 block (
const size_type row,
209 const size_type column);
217 const SparsityPatternBase &
218 block (
const size_type row,
219 const size_type column)
const;
295 void add (
const size_type i,
const size_type j);
312 template <
typename ForwardIterator>
314 ForwardIterator begin,
316 const bool indices_are_sorted =
false);
326 size_type
n_rows ()
const;
336 size_type
n_cols ()
const;
342 bool exists (
const size_type i,
const size_type j)
const;
350 unsigned int row_length (
const size_type row)
const;
382 void print (std::ostream &out)
const;
403 <<
"The blocks [" << arg1 <<
',' << arg2 <<
"] and ["
404 << arg3 <<
',' << arg4 <<
"] have differing row numbers.");
410 <<
"The blocks [" << arg1 <<
',' << arg2 <<
"] and ["
411 << arg3 <<
',' << arg4 <<
"] have differing column numbers.");
474 template <
typename number>
548 const std::vector<std::vector<unsigned int> > &row_lengths);
700 const std::vector<size_type> &col_block_sizes);
726 void reinit (
const std::vector<size_type> &row_block_sizes,
727 const std::vector<size_type> &col_block_sizes);
817 const std::vector<size_type> &col_block_sizes);
843 void reinit (
const std::vector<size_type> &row_block_sizes,
844 const std::vector<size_type> &col_block_sizes);
927 const std::vector<size_type> &col_block_sizes);
958 void reinit (
const std::vector<size_type> &row_block_sizes,
959 const std::vector<size_type> &col_block_sizes);
968 void reinit(
const std::vector<IndexSet> &partitioning);
976 const unsigned int index)
const;
989 #ifdef DEAL_II_WITH_TRILINOS
1053 const std::vector<size_type> &col_block_sizes);
1083 const MPI_Comm &communicator = MPI_COMM_WORLD);
1100 void reinit (
const std::vector<size_type> &row_block_sizes,
1101 const std::vector<size_type> &col_block_sizes);
1110 void reinit (
const std::vector<Epetra_Map> ¶llel_partitioning);
1118 void reinit (
const std::vector<IndexSet> ¶llel_partitioning,
1119 const MPI_Comm &communicator = MPI_COMM_WORLD);
1139 template <
class SparsityPatternBase>
1141 SparsityPatternBase &
1147 return *sub_objects[row][column];
1152 template <
class SparsityPatternBase>
1154 const SparsityPatternBase &
1160 return *sub_objects[row][column];
1165 template <
class SparsityPatternBase>
1175 template <
class SparsityPatternBase>
1180 return column_indices;
1185 template <
class SparsityPatternBase>
1194 const std::pair<size_type,size_type>
1195 row_index = row_indices.global_to_local (i),
1196 col_index = column_indices.global_to_local (j);
1197 sub_objects[row_index.first][col_index.first]->add (row_index.second,
1203 template <
class SparsityPatternBase>
1204 template <
typename ForwardIterator>
1207 ForwardIterator begin,
1208 ForwardIterator end,
1209 const bool indices_are_sorted)
1212 if (block_column_indices.size() < this->n_block_cols())
1214 block_column_indices.resize (this->n_block_cols());
1215 counter_within_block.resize (this->n_block_cols());
1230 if (block_column_indices[0].size() < n_cols)
1231 for (
size_type i=0; i<this->n_block_cols(); ++i)
1232 block_column_indices[i].resize(n_cols);
1236 for (
size_type i=0; i<this->n_block_cols(); ++i)
1237 counter_within_block[i] = 0;
1248 for (ForwardIterator it = begin; it != end; ++it)
1252 const std::pair<size_type , size_type>
1253 col_index = this->column_indices.global_to_local(col);
1255 const size_type local_index = counter_within_block[col_index.first]++;
1257 block_column_indices[col_index.first][local_index] = col_index.second;
1264 for (
size_type i=0; i<this->n_block_cols(); ++i)
1265 length += counter_within_block[i];
1274 const std::pair<size_type , size_type>
1275 row_index = this->row_indices.global_to_local (row);
1276 for (
size_type block_col=0; block_col<n_block_cols(); ++block_col)
1278 if (counter_within_block[block_col] == 0)
1280 sub_objects[row_index.first][block_col]->
1281 add_entries (row_index.second,
1282 block_column_indices[block_col].begin(),
1283 block_column_indices[block_col].begin()+counter_within_block[block_col],
1284 indices_are_sorted);
1290 template <
class SparsityPatternBase>
1299 const std::pair<size_type , size_type>
1300 row_index = row_indices.global_to_local (i),
1301 col_index = column_indices.global_to_local (j);
1302 return sub_objects[row_index.first][col_index.first]->exists (row_index.second,
1308 template <
class SparsityPatternBase>
1314 const std::pair<size_type , size_type>
1315 row_index = row_indices.global_to_local (row);
1320 c += sub_objects[row_index.first][b]->row_length (row_index.second);
1327 template <
class SparsityPatternBase>
1337 template <
class SparsityPatternBase>
1349 const unsigned int index)
const
1352 const std::pair<size_type ,size_type >
1359 for (
unsigned int b=0; b<
columns; ++b)
1361 unsigned int rowlen =
sub_objects[row_index.first][b]->row_length (row_index.second);
1363 return block_columns+
sub_objects[row_index.first][b]->column_number(row_index.second, index-c);
1365 block_columns +=
sub_objects[row_index.first][b]->n_cols();
1380 n_block_rows, n_block_columns);
1384 DEAL_II_NAMESPACE_CLOSE
void print(std::ostream &out) const
BlockCompressedSparsityPattern()
size_type column_number(const size_type row, const unsigned int index) const
void add(const size_type i, const size_type j)
BlockSparsityPatternBase()
~BlockSparsityPatternBase()
size_type n_block_rows() const
bool exists(const size_type i, const size_type j) const
BlockIndices column_indices
Table< 2, SmartPointer< SparsityPatternBase, BlockSparsityPatternBase< SparsityPatternBase > > > sub_objects
std::vector< size_type > counter_within_block
Auxiliary class aiding in the handling of block structures like in BlockVector or FESystem...
DeclException4(ExcIncompatibleRowNumbers, int, int, int, int,<< "The blocks ["<< arg1<< ','<< arg2<< "] and ["<< arg3<< ','<< arg4<< "] have differing row numbers.")
std::size_t memory_consumption() const
bool is_compressed() const
void add_entries(const size_type row, ForwardIterator begin, ForwardIterator end, const bool indices_are_sorted=false)
const BlockIndices & get_row_indices() const
void print_gnuplot(std::ostream &out) const
void reinit(const size_type n_block_rows, const size_type n_block_columns)
unsigned int global_dof_index
void reinit(const std::vector< size_type > &row_block_sizes, const std::vector< size_type > &col_block_sizes)
#define Assert(cond, exc)
unsigned int row_length(const size_type row) const
size_type max_entries_per_row() const
::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
::ExceptionBase & ExcInvalidConstructorCall()
size_type n_nonzero_elements() const
BlockCompressedSparsityPattern CompressedBlockSparsityPattern DEAL_II_DEPRECATED
void reinit(const std::vector< size_type > &row_block_sizes, const std::vector< size_type > &col_block_sizes)
std::pair< unsigned int, size_type > global_to_local(const size_type i) const
BlockCompressedSetSparsityPattern()
const BlockIndices & get_column_indices() const
BlockSparsityPatternBase & operator=(const BlockSparsityPatternBase &)
DeclException0(ExcInvalidConstructorCall)
SparsityPatternBase & block(const size_type row, const size_type column)
BlockCompressedSimpleSparsityPattern()
void copy_from(const BlockCompressedSparsityPattern &csp)
void reinit(const std::vector< size_type > &row_block_sizes, const std::vector< size_type > &col_block_sizes)
size_type n_block_cols() const
void reinit(const size_type n_block_rows, const size_type n_block_columns)
::ExceptionBase & ExcInternalError()
std::vector< std::vector< size_type > > block_column_indices
static const size_type invalid_entry
void reinit(const std::vector< size_type > &row_block_sizes, const std::vector< size_type > &col_block_sizes)
types::global_dof_index size_type
static const size_type invalid_entry