16 #ifndef dealii_trilinos_sparsity_pattern_h 17 # define dealii_trilinos_sparsity_pattern_h 22 # ifdef DEAL_II_WITH_TRILINOS 29 # include <Epetra_FECrsGraph.h> 30 # include <Epetra_Map.h> 35 # ifdef DEAL_II_WITH_MPI 36 # include <Epetra_MpiComm.h> 39 # include <Epetra_SerialComm.h> 124 <<
"You tried to access row " << arg1
125 <<
" of a distributed sparsity pattern, " 126 <<
" but only rows " << arg2 <<
" through " << arg3
127 <<
" are stored locally and can be accessed.");
246 <<
"Attempt to access element " << arg2 <<
" of row " 247 << arg1 <<
" which doesn't have that many elements.");
329 const std::vector<size_type> &n_entries_per_row);
375 const std::vector<size_type> &n_entries_per_row);
389 template <
typename SparsityPatternType>
391 copy_from(
const SparsityPatternType &nontrilinos_sparsity_pattern);
442 const MPI_Comm &communicator = MPI_COMM_WORLD,
456 const MPI_Comm & communicator,
457 const std::vector<size_type> &n_entries_per_row);
474 const IndexSet &col_parallel_partitioning,
475 const MPI_Comm &communicator = MPI_COMM_WORLD,
490 const IndexSet & col_parallel_partitioning,
491 const MPI_Comm & communicator,
492 const std::vector<size_type> &n_entries_per_row);
521 const IndexSet &col_parallel_partitioning,
523 const MPI_Comm &communicator = MPI_COMM_WORLD,
543 const MPI_Comm &communicator = MPI_COMM_WORLD,
558 const MPI_Comm & communicator,
559 const std::vector<size_type> &n_entries_per_row);
579 const IndexSet &col_parallel_partitioning,
580 const MPI_Comm &communicator = MPI_COMM_WORLD,
610 const IndexSet &col_parallel_partitioning,
612 const MPI_Comm &communicator = MPI_COMM_WORLD,
621 const IndexSet & col_parallel_partitioning,
622 const MPI_Comm & communicator,
623 const std::vector<size_type> &n_entries_per_row);
634 template <
typename SparsityPatternType>
637 const IndexSet & col_parallel_partitioning,
638 const SparsityPatternType &nontrilinos_sparsity_pattern,
639 const MPI_Comm & communicator = MPI_COMM_WORLD,
640 const bool exchange_data =
false);
650 template <
typename SparsityPatternType>
653 const SparsityPatternType &nontrilinos_sparsity_pattern,
654 const MPI_Comm & communicator = MPI_COMM_WORLD,
655 const bool exchange_data =
false);
667 is_compressed()
const;
673 max_entries_per_row()
const;
707 std::pair<size_type, size_type>
715 in_local_range(
const size_type index)
const;
721 n_nonzero_elements()
const;
762 row_is_stored_locally(
const size_type i)
const;
786 template <
typename ForwardIterator>
789 ForwardIterator
begin,
791 const bool indices_are_sorted =
false);
802 const Epetra_FECrsGraph &
803 trilinos_sparsity_pattern()
const;
812 domain_partitioner()
const;
821 range_partitioner()
const;
827 get_mpi_communicator()
const;
841 locally_owned_domain_indices()
const;
849 locally_owned_range_indices()
const;
914 print(std::ostream &out,
915 const bool write_extended_trilinos_info =
false)
const;
932 print_gnuplot(std::ostream &out)
const;
944 <<
"An error with error number " << arg1
945 <<
" occurred while calling a Trilinos function");
953 <<
"The entry with index <" << arg1 <<
',' << arg2
954 <<
"> does not exist.");
960 ExcSourceEqualsDestination,
961 "You are attempting an operation on two sparsity patterns that " 962 "are the same object, but the operation requires that the " 963 "two objects are in fact different.");
973 <<
"You tried to access element (" << arg1 <<
"/" << arg2
975 <<
" of a distributed matrix, but only rows " << arg3
976 <<
" through " << arg4
977 <<
" are stored locally and can be accessed.");
985 <<
"You tried to access element (" << arg1 <<
"/" << arg2
987 <<
" of a sparse matrix, but it appears to not" 988 <<
" exist in the Trilinos sparsity pattern.");
1002 std::unique_ptr<Epetra_FECrsGraph>
graph;
1033 visit_present_row();
1039 Accessor::row()
const 1042 ExcBeyondEndOfSparsityPattern());
1049 Accessor::column()
const 1052 ExcBeyondEndOfSparsityPattern());
1053 return (*colnum_cache)[a_index];
1059 Accessor::index()
const 1062 ExcBeyondEndOfSparsityPattern());
1071 : accessor(sp, row, index)
1083 Assert(accessor.a_row < accessor.sparsity_pattern->n_rows(),
1090 if (accessor.a_index >= accessor.colnum_cache->size())
1092 accessor.a_index = 0;
1095 while (accessor.a_row < accessor.sparsity_pattern->n_rows())
1098 accessor.sparsity_pattern->row_length(accessor.a_row);
1100 !accessor.sparsity_pattern->row_is_stored_locally(
1107 accessor.visit_present_row();
1131 inline const Accessor *Iterator::operator->()
const 1141 return (accessor.a_row == other.accessor.a_row &&
1142 accessor.a_index == other.accessor.a_index);
1150 return !(*
this == other);
1158 return (accessor.row() < other.accessor.row() ||
1159 (accessor.row() == other.accessor.row() &&
1160 accessor.index() < other.accessor.index()));
1219 # ifndef DEAL_II_WITH_64BIT_INDICES 1220 begin =
graph->RowMap().MinMyGID();
1221 end =
graph->RowMap().MaxMyGID() + 1;
1223 begin =
graph->RowMap().MinMyGID64();
1224 end =
graph->RowMap().MaxMyGID64() + 1;
1227 return ((index >= static_cast<size_type>(begin)) &&
1228 (index < static_cast<size_type>(end)));
1236 return graph->Filled();
1257 template <
typename ForwardIterator>
1260 ForwardIterator begin,
1261 ForwardIterator end,
1280 const_cast<typename std::decay<decltype(*begin)>::type *
>(&*
begin));
1289 graph->InsertGlobalIndices(trilinos_row_index, n_cols, col_index_ptr);
1296 static_cast<TrilinosWrappers::types::int_type>(row)) != -1,
1297 ExcMessage(
"Attempted to write into off-processor matrix row " 1298 "that has not be specified as being writable upon " 1305 ierr =
graph->InsertGlobalIndices(1,
1306 &trilinos_row_index,
1315 inline const Epetra_FECrsGraph &
1344 # endif // DEAL_II_WITH_TRILINOS static ::ExceptionBase & ExcTrilinosError(int arg1)
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)
#define DeclException2(Exception2, type1, type2, outsequence)
#define AssertDimension(dim1, dim2)
types::global_dof_index size_type
std::shared_ptr< const std::vector< size_type > > colnum_cache
::types::global_dof_index size_type
size_type row_length(const size_type row) const
bool operator!=(const AlignedVector< T > &lhs, const AlignedVector< T > &rhs)
IndexSet locally_owned_range_indices() const
const Epetra_FECrsGraph & trilinos_sparsity_pattern() const
#define AssertIndexRange(index, range)
bool operator<(const SynchronousIterators< Iterators > &a, const SynchronousIterators< Iterators > &b)
static ::ExceptionBase & ExcAccessToNonlocalRow(std::size_t arg1, std::size_t arg2, std::size_t arg3)
#define AssertThrow(cond, exc)
void add(const size_type i, const size_type j)
void add_entries(const size_type row, ForwardIterator begin, ForwardIterator end, const bool indices_are_sorted=false)
SparsityPatternIterators::Iterator const_iterator
bool operator==(const AlignedVector< T > &lhs, const AlignedVector< T > &rhs)
std::unique_ptr< Epetra_CrsGraph > nonlocal_graph
const_iterator begin() const
static ::ExceptionBase & ExcTrilinosError(int arg1)
SparsityPattern * sparsity_pattern
static ::ExceptionBase & ExcMessage(std::string arg1)
std::string compress(const std::string &input)
::types::global_dof_index size_type
#define DeclException1(Exception1, type1, outsequence)
std::unique_ptr< Epetra_Map > column_space_map
#define Assert(cond, exc)
#define DeclExceptionMsg(Exception, defaulttext)
#define DeclException0(Exception0)
#define DEAL_II_NAMESPACE_CLOSE
VectorType::value_type * end(VectorType &V)
SynchronousIterators< Iterators > operator++(SynchronousIterators< Iterators > &a)
const_iterator end() const
bool is_compressed() const
MatrixTableIterators::Accessor< TransposeTable< T >, Constness, MatrixTableIterators::Storage::column_major > Accessor
static ::ExceptionBase & ExcIteratorPastEnd()
unsigned int global_dof_index
MatrixTableIterators::Iterator< TransposeTable< T >, Constness, MatrixTableIterators::Storage::column_major > Iterator
#define DEAL_II_NAMESPACE_OPEN
VectorType::value_type * begin(VectorType &V)
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
static ::ExceptionBase & ExcNotImplemented()
#define DeclException3(Exception3, type1, type2, type3, outsequence)
std::enable_if< std::is_floating_point< T >::value &&std::is_floating_point< U >::value, typename ProductType< std::complex< T >, std::complex< U > >::type >::type operator*(const std::complex< T > &left, const std::complex< U > &right)
bool in_local_range(const size_type index) const
IndexSet locally_owned_domain_indices() const
std::pair< size_type, size_type > local_range() const
std::unique_ptr< Epetra_FECrsGraph > graph
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
::types::global_dof_index size_type
Accessor(const SparsityPattern *sparsity_pattern, const size_type row, const size_type index)
bool row_is_stored_locally(const size_type i) const