16 #ifndef dealii__trilinos_sparsity_pattern_h 17 #define dealii__trilinos_sparsity_pattern_h 20 #include <deal.II/base/config.h> 22 #ifdef DEAL_II_WITH_TRILINOS 24 # include <deal.II/base/subscriptor.h> 25 # include <deal.II/base/index_set.h> 26 # include <deal.II/lac/exceptions.h> 32 # include <deal.II/base/std_cxx11/shared_ptr.h> 34 DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
35 # include <Epetra_FECrsGraph.h> 36 # include <Epetra_Map.h> 37 # ifdef DEAL_II_WITH_MPI 38 # include <Epetra_MpiComm.h> 41 # include "Epetra_SerialComm.h" 43 DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
46 DEAL_II_NAMESPACE_OPEN
89 const size_type
index);
94 size_type
row()
const;
99 size_type
index()
const;
115 size_type, size_type, size_type,
116 <<
"You tried to access row " << arg1
117 <<
" of a distributed sparsity pattern, " 118 <<
" but only rows " << arg2 <<
" through " << arg3
119 <<
" are stored locally and can be accessed.");
183 const size_type
index);
208 const Accessor *operator-> ()
const;
214 bool operator == (
const Iterator &)
const;
219 bool operator != (
const Iterator &)
const;
226 bool operator < (
const Iterator &)
const;
232 size_type, size_type,
233 <<
"Attempt to access element " << arg2
234 <<
" of row " << arg1
235 <<
" which doesn't have that many elements.");
306 const size_type n_entries_per_row = 0);
318 const std::vector<size_type> &n_entries_per_row);
343 reinit (
const size_type m,
345 const size_type n_entries_per_row = 0);
356 reinit (
const size_type m,
358 const std::vector<size_type> &n_entries_per_row);
372 template<
typename SparsityPatternType>
374 copy_from (
const SparsityPatternType &nontrilinos_sparsity_pattern);
424 const size_type n_entries_per_row = 0) DEAL_II_DEPRECATED;
439 const
std::vector<size_type> &n_entries_per_row) DEAL_II_DEPRECATED;
460 const Epetra_Map &col_parallel_partitioning,
461 const size_type n_entries_per_row = 0) DEAL_II_DEPRECATED;
477 const Epetra_Map &col_parallel_partitioning,
478 const
std::vector<size_type> &n_entries_per_row) DEAL_II_DEPRECATED;
497 reinit (const Epetra_Map ¶llel_partitioning,
498 const size_type n_entries_per_row = 0) DEAL_II_DEPRECATED;
513 reinit (const Epetra_Map ¶llel_partitioning,
514 const
std::vector<size_type> &n_entries_per_row) DEAL_II_DEPRECATED;
535 reinit (const Epetra_Map &row_parallel_partitioning,
536 const Epetra_Map &col_parallel_partitioning,
537 const size_type n_entries_per_row = 0) DEAL_II_DEPRECATED;
553 reinit (const Epetra_Map &row_parallel_partitioning,
554 const Epetra_Map &col_parallel_partitioning,
555 const
std::vector<size_type> &n_entries_per_row) DEAL_II_DEPRECATED;
567 template<typename SparsityPatternType>
569 reinit (const Epetra_Map &row_parallel_partitioning,
570 const Epetra_Map &col_parallel_partitioning,
571 const SparsityPatternType &nontrilinos_sparsity_pattern,
572 const
bool exchange_data = false) DEAL_II_DEPRECATED;
584 template<typename SparsityPatternType>
586 reinit (const Epetra_Map ¶llel_partitioning,
587 const SparsityPatternType &nontrilinos_sparsity_pattern,
588 const
bool exchange_data = false) DEAL_II_DEPRECATED;
607 const MPI_Comm &communicator = MPI_COMM_WORLD,
608 const size_type n_entries_per_row = 0);
621 const MPI_Comm &communicator,
622 const
std::vector<size_type> &n_entries_per_row);
639 const
IndexSet &col_parallel_partitioning,
640 const MPI_Comm &communicator = MPI_COMM_WORLD,
641 const size_type n_entries_per_row = 0);
655 const
IndexSet &col_parallel_partitioning,
656 const MPI_Comm &communicator,
657 const
std::vector<size_type> &n_entries_per_row);
686 const
IndexSet &col_parallel_partitioning,
688 const MPI_Comm &communicator = MPI_COMM_WORLD,
689 const size_type n_entries_per_row = 0);
707 reinit (const
IndexSet ¶llel_partitioning,
708 const MPI_Comm &communicator = MPI_COMM_WORLD,
709 const size_type n_entries_per_row = 0);
722 reinit (const
IndexSet ¶llel_partitioning,
723 const MPI_Comm &communicator,
724 const
std::vector<size_type> &n_entries_per_row);
743 reinit (const
IndexSet &row_parallel_partitioning,
744 const
IndexSet &col_parallel_partitioning,
745 const MPI_Comm &communicator = MPI_COMM_WORLD,
746 const size_type n_entries_per_row = 0);
774 reinit (const
IndexSet &row_parallel_partitioning,
775 const
IndexSet &col_parallel_partitioning,
777 const MPI_Comm &communicator = MPI_COMM_WORLD,
778 const size_type n_entries_per_row = 0);
785 reinit (const
IndexSet &row_parallel_partitioning,
786 const
IndexSet &col_parallel_partitioning,
787 const MPI_Comm &communicator,
788 const
std::vector<size_type> &n_entries_per_row);
799 template<typename SparsityPatternType>
801 reinit (const
IndexSet &row_parallel_partitioning,
802 const
IndexSet &col_parallel_partitioning,
803 const SparsityPatternType &nontrilinos_sparsity_pattern,
804 const MPI_Comm &communicator = MPI_COMM_WORLD,
805 const
bool exchange_data = false);
815 template<typename SparsityPatternType>
817 reinit (const
IndexSet ¶llel_partitioning,
818 const SparsityPatternType &nontrilinos_sparsity_pattern,
819 const MPI_Comm &communicator = MPI_COMM_WORLD,
820 const
bool exchange_data = false);
831 bool is_compressed () const;
836 unsigned int max_entries_per_row () const;
841 size_type n_rows () const;
846 size_type n_cols () const;
857 unsigned int local_size () const;
867 std::pair<size_type, size_type>
868 local_range () const;
874 bool in_local_range (const size_type
index) const;
879 size_type n_nonzero_elements () const;
884 size_type row_length (const size_type
row) const;
892 size_type bandwidth () const;
904 bool exists (const size_type i,
905 const size_type j) const;
911 std::
size_t memory_consumption () const;
921 void add (const size_type i,
928 template <typename ForwardIterator>
929 void add_entries (const size_type
row,
930 ForwardIterator begin,
932 const
bool indices_are_sorted = false);
943 const Epetra_FECrsGraph &trilinos_sparsity_pattern () const;
953 const Epetra_Map &domain_partitioner () const DEAL_II_DEPRECATED;
963 const Epetra_Map &range_partitioner () const DEAL_II_DEPRECATED;
972 const Epetra_Map &row_partitioner () const DEAL_II_DEPRECATED;
983 const Epetra_Map &col_partitioner () const DEAL_II_DEPRECATED;
990 const Epetra_Comm &trilinos_communicator () const DEAL_II_DEPRECATED;
995 MPI_Comm get_mpi_communicator () const;
1008 IndexSet locally_owned_domain_indices() const;
1015 IndexSet locally_owned_range_indices() const;
1027 const_iterator begin () const;
1032 const_iterator end () const;
1042 const_iterator begin (const size_type r) const;
1052 const_iterator end (const size_type r) const;
1065 void write_ascii ();
1074 void print (
std::ostream &out,
1075 const
bool write_extended_trilinos_info = false) const;
1091 void print_gnuplot (
std::ostream &out) const;
1103 << "An error with error number " << arg1
1104 << " occurred while calling a Trilinos function");
1110 size_type, size_type,
1111 << "The entry with
index <" << arg1 << ',' << arg2
1112 << "> does not exist.");
1123 size_type, size_type, size_type, size_type,
1124 << "You tried to access element (" << arg1
1125 << "/" << arg2 << ")"
1126 << " of a distributed matrix, but only rows "
1127 << arg3 << " through " << arg4
1128 << " are stored locally and can be accessed.");
1134 size_type, size_type,
1135 << "You tried to access element (" << arg1
1136 << "/" << arg2 << ")"
1137 << " of a sparse matrix, but it appears to not"
1138 << " exist in the Trilinos sparsity pattern.");
1180 const size_type row,
1181 const size_type
index)
1224 const size_type row,
1225 const size_type index)
1227 accessor(sp, row, index)
1234 accessor(i.accessor)
1243 Assert (accessor.a_row < accessor.sparsity_pattern->n_rows(),
1252 if (accessor.a_index >= accessor.colnum_cache->size())
1254 accessor.a_index = 0;
1257 while ((accessor.a_row < accessor.sparsity_pattern->n_rows())
1259 (accessor.sparsity_pattern->row_length(accessor.a_row) == 0))
1262 accessor.visit_present_row();
1273 const Iterator old_state = *
this;
1302 return (accessor.a_row == other.accessor.a_row &&
1303 accessor.a_index == other.accessor.a_index);
1312 return ! (*
this == other);
1321 return (accessor.row() < other.accessor.row() ||
1322 (accessor.row() == other.accessor.row() &&
1323 accessor.index() < other.accessor.index()));
1334 return const_iterator(
this, 0, 0);
1343 return const_iterator(
this, n_rows(), 0);
1352 Assert (r < n_rows(), ExcIndexRangeType<size_type>(r, 0, n_rows()));
1353 if (row_length(r) > 0)
1354 return const_iterator(
this, r, 0);
1365 Assert (r < n_rows(), ExcIndexRangeType<size_type>(r, 0, n_rows()));
1370 for (size_type i=r+1; i<n_rows(); ++i)
1371 if (row_length(i) > 0)
1372 return const_iterator(
this, i, 0);
1385 TrilinosWrappers::types::int_type begin, end;
1386 #ifndef DEAL_II_WITH_64BIT_INDICES 1387 begin = graph->RowMap().MinMyGID();
1388 end = graph->RowMap().MaxMyGID()+1;
1390 begin = graph->RowMap().MinMyGID64();
1391 end = graph->RowMap().MaxMyGID64()+1;
1394 return ((index >= static_cast<size_type>(begin)) &&
1395 (index < static_cast<size_type>(end)));
1404 return graph->Filled();
1413 return ((n_rows() == 0) && (n_cols() == 0));
1423 add_entries (i, &j, &j+1);
1428 template <
typename ForwardIterator>
1432 ForwardIterator begin,
1433 ForwardIterator end,
1447 Assert (
sizeof(TrilinosWrappers::types::int_type) ==
1451 TrilinosWrappers::types::int_type *col_index_ptr =
1452 (TrilinosWrappers::types::int_type *)(&*begin);
1453 const int n_cols =
static_cast<int>(end - begin);
1456 if ( graph->RowMap().LID(static_cast<TrilinosWrappers::types::int_type>(row)) != -1)
1457 ierr = graph->InsertGlobalIndices (row, n_cols, col_index_ptr);
1458 else if (nonlocal_graph.get() != 0)
1463 Assert (nonlocal_graph->RowMap().LID(static_cast<TrilinosWrappers::types::int_type>(row)) != -1,
1464 ExcMessage(
"Attempted to write into off-processor matrix row " 1465 "that has not be specified as being writable upon " 1467 ierr = nonlocal_graph->InsertGlobalIndices (row, n_cols, col_index_ptr);
1470 ierr = graph->InsertGlobalIndices
1471 (1, (TrilinosWrappers::types::int_type *)&row, n_cols, col_index_ptr);
1479 const Epetra_FECrsGraph &
1491 return IndexSet(static_cast<const Epetra_Map &>(graph->DomainMap()));
1500 return IndexSet(static_cast<const Epetra_Map &>(graph->RangeMap()));
1507 DEAL_II_NAMESPACE_CLOSE
1510 #endif // DEAL_II_WITH_TRILINOS static::ExceptionBase & ExcTrilinosError(int arg1)
#define DeclException2(Exception2, type1, type2, outsequence)
static::ExceptionBase & ExcBeyondEndOfSparsityPattern()
const_iterator end() const
::types::global_dof_index size_type
bool operator<(const Iterator &) const
bool in_local_range(const size_type index) const
const Accessor & operator*() const
#define AssertThrow(cond, exc)
const Epetra_FECrsGraph & trilinos_sparsity_pattern() const
void add(const size_type i, const size_type j)
::types::global_dof_index size_type
void add_entries(const size_type row, ForwardIterator begin, ForwardIterator end, const bool indices_are_sorted=false)
SparsityPattern * sparsity_pattern
static::ExceptionBase & ExcMessage(std::string arg1)
const_iterator begin() const
#define DeclException1(Exception1, type1, outsequence)
IndexSet locally_owned_range_indices() const
std_cxx11::shared_ptr< const std::vector< size_type > > colnum_cache
#define Assert(cond, exc)
#define DeclException0(Exception0)
const Accessor * operator->() const
::types::global_dof_index size_type
bool operator==(const Iterator &) const
bool operator!=(const Iterator &) const
SparsityPatternIterators::Iterator const_iterator
IndexSet locally_owned_domain_indices() const
bool is_compressed() const
static::ExceptionBase & ExcIteratorPastEnd()
Iterator(const SparsityPattern *sparsity_pattern, const size_type row, const size_type index)
static::ExceptionBase & ExcAccessToNonlocalRow(size_type arg1, size_type arg2, size_type arg3)
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
static::ExceptionBase & ExcNotImplemented()
#define DeclException3(Exception3, type1, type2, type3, outsequence)
Accessor(const SparsityPattern *sparsity_pattern, const size_type row, const size_type index)