16 #ifndef dealii__block_sparsity_pattern_h 17 #define dealii__block_sparsity_pattern_h 20 #include <deal.II/base/config.h> 21 #include <deal.II/base/exceptions.h> 22 #include <deal.II/base/table.h> 23 #include <deal.II/base/subscriptor.h> 24 #include <deal.II/base/smartpointer.h> 25 #include <deal.II/lac/sparsity_pattern.h> 26 #include <deal.II/lac/trilinos_sparsity_pattern.h> 27 #include <deal.II/lac/compressed_sparsity_pattern.h> 28 #include <deal.II/lac/compressed_set_sparsity_pattern.h> 29 #include <deal.II/lac/compressed_simple_sparsity_pattern.h> 30 #include <deal.II/lac/block_indices.h> 32 DEAL_II_NAMESPACE_OPEN
38 #ifdef DEAL_II_WITH_TRILINOS 82 template <
typename SparsityPatternType>
114 const size_type n_block_columns);
142 void reinit (
const size_type n_block_rows,
143 const size_type n_block_columns);
158 void collect_sizes ();
163 SparsityPatternType &
164 block (
const size_type row,
165 const size_type column);
172 const SparsityPatternType &
173 block (
const size_type row,
174 const size_type column)
const;
181 get_row_indices ()
const;
188 get_column_indices ()
const;
199 size_type n_block_rows ()
const;
204 size_type n_block_cols ()
const;
219 size_type max_entries_per_row ()
const;
230 void add (
const size_type i,
const size_type j);
242 template <
typename ForwardIterator>
243 void add_entries (
const size_type row,
244 ForwardIterator begin,
246 const bool indices_are_sorted =
false);
252 size_type n_rows ()
const;
259 size_type n_cols ()
const;
264 bool exists (
const size_type i,
const size_type j)
const;
270 unsigned int row_length (
const size_type row)
const;
283 size_type n_nonzero_elements ()
const;
290 void print (std::ostream &out)
const;
299 void print_gnuplot (std::ostream &out)
const;
311 <<
"The blocks [" << arg1 <<
',' << arg2 <<
"] and [" 312 << arg3 <<
',' << arg4 <<
"] have differing row numbers.");
318 <<
"The blocks [" << arg1 <<
',' << arg2 <<
"] and [" 319 << arg3 <<
',' << arg4 <<
"] have differing column numbers.");
372 template <
typename number>
406 const size_type n_columns);
411 void reinit (
const size_type n_block_rows,
412 const size_type n_block_columns);
428 const std::vector<std::vector<unsigned int> > &row_lengths);
435 bool is_compressed ()
const;
441 std::size_t memory_consumption ()
const;
512 const size_type n_columns);
521 const std::vector<size_type> &col_block_sizes);
549 void reinit (
const std::vector<size_type> &row_block_sizes,
550 const std::vector<size_type> &col_block_sizes);
556 void reinit(
const std::vector<IndexSet> &partitioning);
569 size_type column_number (
const size_type row,
570 const unsigned int index)
const;
596 #ifdef DEAL_II_WITH_TRILINOS 638 const size_type n_columns);
647 const std::vector<size_type> &col_block_sizes);
669 const MPI_Comm &communicator = MPI_COMM_WORLD);
683 const std::vector<IndexSet> &column_parallel_partitioning,
684 const std::vector<IndexSet> &writeable_rows,
685 const MPI_Comm &communicator = MPI_COMM_WORLD);
696 void reinit (
const std::vector<size_type> &row_block_sizes,
697 const std::vector<size_type> &col_block_sizes);
706 void reinit (
const std::vector<Epetra_Map> ¶llel_partitioning)
DEAL_II_DEPRECATED;
712 void reinit (
const std::vector<IndexSet> ¶llel_partitioning,
713 const MPI_Comm &communicator = MPI_COMM_WORLD);
720 void reinit (
const std::vector<IndexSet> &row_parallel_partitioning,
721 const std::vector<IndexSet> &column_parallel_partitioning,
722 const MPI_Comm &communicator = MPI_COMM_WORLD);
732 void reinit (
const std::vector<IndexSet> &row_parallel_partitioning,
733 const std::vector<IndexSet> &column_parallel_partitioning,
734 const std::vector<IndexSet> &writeable_rows,
735 const MPI_Comm &communicator = MPI_COMM_WORLD);
752 template <
typename SparsityPatternType>
754 SparsityPatternType &
758 Assert (row<rows, ExcIndexRange(row,0,rows));
759 Assert (column<columns, ExcIndexRange(column,0,columns));
760 return *sub_objects[row][column];
765 template <
typename SparsityPatternType>
767 const SparsityPatternType &
771 Assert (row<rows, ExcIndexRange(row,0,rows));
772 Assert (column<columns, ExcIndexRange(column,0,columns));
773 return *sub_objects[row][column];
778 template <
typename SparsityPatternType>
788 template <
typename SparsityPatternType>
793 return column_indices;
798 template <
typename SparsityPatternType>
807 const std::pair<size_type,size_type>
808 row_index = row_indices.global_to_local (i),
809 col_index = column_indices.global_to_local (j);
810 sub_objects[row_index.first][col_index.first]->add (row_index.second,
816 template <
typename SparsityPatternType>
817 template <
typename ForwardIterator>
820 ForwardIterator begin,
822 const bool indices_are_sorted)
825 if (block_column_indices.size() < this->n_block_cols())
827 block_column_indices.resize (this->n_block_cols());
828 counter_within_block.resize (this->n_block_cols());
843 if (block_column_indices[0].size() < n_cols)
844 for (
size_type i=0; i<this->n_block_cols(); ++i)
845 block_column_indices[i].resize(n_cols);
849 for (
size_type i=0; i<this->n_block_cols(); ++i)
850 counter_within_block[i] = 0;
861 for (ForwardIterator it = begin; it != end; ++it)
865 const std::pair<size_type , size_type>
866 col_index = this->column_indices.global_to_local(col);
868 const size_type local_index = counter_within_block[col_index.first]++;
870 block_column_indices[col_index.first][local_index] = col_index.second;
877 for (
size_type i=0; i<this->n_block_cols(); ++i)
878 length += counter_within_block[i];
879 Assert (length == n_cols, ExcInternalError());
887 const std::pair<size_type , size_type>
888 row_index = this->row_indices.global_to_local (row);
889 for (
size_type block_col=0; block_col<n_block_cols(); ++block_col)
891 if (counter_within_block[block_col] == 0)
893 sub_objects[row_index.first][block_col]->
894 add_entries (row_index.second,
895 block_column_indices[block_col].begin(),
896 block_column_indices[block_col].begin()+counter_within_block[block_col],
903 template <
typename SparsityPatternType>
912 const std::pair<size_type , size_type>
913 row_index = row_indices.global_to_local (i),
914 col_index = column_indices.global_to_local (j);
915 return sub_objects[row_index.first][col_index.first]->exists (row_index.second,
921 template <
typename SparsityPatternType>
927 const std::pair<size_type , size_type>
928 row_index = row_indices.global_to_local (row);
933 c += sub_objects[row_index.first][b]->row_length (row_index.second);
940 template <
typename SparsityPatternType>
950 template <
typename SparsityPatternType>
962 const unsigned int index)
const 965 const std::pair<size_type ,size_type >
966 row_index = row_indices.global_to_local (row);
968 Assert(index<row_length(row), ExcIndexRange(index, 0, row_length(row)));
971 size_type block_columns = 0;
972 for (
unsigned int b=0; b<columns; ++b)
974 unsigned int rowlen = sub_objects[row_index.first][b]->row_length (row_index.second);
976 return block_columns+sub_objects[row_index.first][b]->column_number(row_index.second, index-c);
978 block_columns += sub_objects[row_index.first][b]->n_cols();
981 Assert(
false, ExcInternalError());
989 const size_type n_block_rows,
990 const size_type n_block_columns)
993 n_block_rows, n_block_columns);
997 DEAL_II_NAMESPACE_CLOSE
BlockIndices column_indices
size_type column_number(const size_type row, const unsigned int index) const
static const size_type invalid_entry
size_type n_block_cols() const
size_type n_block_rows() const
Auxiliary class aiding in the handling of block structures like in BlockVector or FESystem...
SparsityPatternType & block(const size_type row, const size_type column)
bool exists(const size_type i, const size_type j) const
std::vector< size_type > counter_within_block
void reinit(const size_type n_block_rows, const size_type n_block_columns)
types::global_dof_index size_type
BlockDynamicSparsityPattern BlockCompressedSparsityPattern DEAL_II_DEPRECATED
void reinit(const size_type n_block_rows, const size_type n_block_columns)
void add(const size_type i, const size_type j)
unsigned int global_dof_index
#define Assert(cond, exc)
void add_entries(const size_type row, ForwardIterator begin, ForwardIterator end, const bool indices_are_sorted=false)
#define DeclException0(Exception0)
const BlockIndices & get_row_indices() const
std::vector< std::vector< size_type > > block_column_indices
Table< 2, SmartPointer< SparsityPatternType, BlockSparsityPatternBase< SparsityPatternType > > > sub_objects
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
unsigned int row_length(const size_type row) const
const BlockIndices & get_column_indices() const