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);
176 void reinit (
const size_type n_block_rows,
177 const size_type n_block_columns);
201 void collect_sizes ();
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;
228 get_row_indices ()
const;
237 get_column_indices ()
const;
252 size_type n_block_rows ()
const;
258 size_type n_block_cols ()
const;
281 size_type max_entries_per_row ()
const;
295 void add (
const size_type i,
const size_type j);
312 template <
typename ForwardIterator>
313 void add_entries (
const size_type row,
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;
371 size_type n_nonzero_elements ()
const;
382 void print (std::ostream &out)
const;
393 void print_gnuplot (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>
521 void reinit (
const size_type n_block_rows,
548 const std::vector<std::vector<unsigned int> > &row_lengths);
557 bool is_compressed ()
const;
564 std::size_t memory_consumption ()
const;
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 >
1353 row_index = row_indices.global_to_local (row);
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
size_type column_number(const size_type row, const unsigned int index) const
BlockIndices column_indices
Auxiliary class aiding in the handling of block structures like in BlockVector or FESystem...
unsigned int row_length(const size_type row) const
void add(const size_type i, const size_type j)
SparsityPatternBase & block(const size_type row, const size_type column)
void reinit(const size_type n_block_rows, const size_type n_block_columns)
Table< 2, SmartPointer< SparsityPatternBase, BlockSparsityPatternBase< SparsityPatternBase > > > sub_objects
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)
types::global_dof_index size_type
const BlockIndices & get_column_indices() const
#define DeclException0(Exception0)
::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
::ExceptionBase & ExcInvalidConstructorCall()
std::vector< size_type > counter_within_block
std::vector< std::vector< size_type > > block_column_indices
BlockCompressedSparsityPattern CompressedBlockSparsityPattern DEAL_II_DEPRECATED
const BlockIndices & get_row_indices() const
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
size_type n_block_rows() const
void add_entries(const size_type row, ForwardIterator begin, ForwardIterator end, const bool indices_are_sorted=false)
::ExceptionBase & ExcInternalError()
size_type n_block_cols() const
bool exists(const size_type i, const size_type j) const
static const size_type invalid_entry