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/index_set.h>
25 # include <deal.II/base/subscriptor.h>
27 # include <deal.II/lac/exceptions.h>
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>
43 DEAL_II_NAMESPACE_OPEN
118 <<
"You tried to access row " << arg1
119 <<
" of a distributed sparsity pattern, "
120 <<
" but only rows " << arg2 <<
" through " << arg3
121 <<
" are stored locally and can be accessed.");
242 <<
"Attempt to access element " << arg2 <<
" of row "
243 << arg1 <<
" which doesn't have that many elements.");
325 const std::vector<size_type> &n_entries_per_row);
371 const std::vector<size_type> &n_entries_per_row);
385 template <
typename SparsityPatternType>
387 copy_from(
const SparsityPatternType &nontrilinos_sparsity_pattern);
457 const std::vector<size_type> &n_entries_per_row);
479 const Epetra_Map &col_parallel_partitioning,
497 const Epetra_Map & col_parallel_partitioning,
498 const std::vector<size_type> &n_entries_per_row);
518 reinit(
const Epetra_Map ¶llel_partitioning,
535 reinit(
const Epetra_Map & parallel_partitioning,
536 const std::vector<size_type> &n_entries_per_row);
558 reinit(
const Epetra_Map &row_parallel_partitioning,
559 const Epetra_Map &col_parallel_partitioning,
577 reinit(
const Epetra_Map & row_parallel_partitioning,
578 const Epetra_Map & col_parallel_partitioning,
579 const std::vector<size_type> &n_entries_per_row);
591 template <
typename SparsityPatternType>
592 DEAL_II_DEPRECATED
void
593 reinit(
const Epetra_Map & row_parallel_partitioning,
594 const Epetra_Map & col_parallel_partitioning,
595 const SparsityPatternType &nontrilinos_sparsity_pattern,
596 const bool exchange_data =
false);
608 template <
typename SparsityPatternType>
609 DEAL_II_DEPRECATED
void
610 reinit(
const Epetra_Map & parallel_partitioning,
611 const SparsityPatternType &nontrilinos_sparsity_pattern,
612 const bool exchange_data =
false);
631 const MPI_Comm &communicator = MPI_COMM_WORLD,
645 const MPI_Comm & communicator,
646 const std::vector<size_type> &n_entries_per_row);
663 const IndexSet &col_parallel_partitioning,
664 const MPI_Comm &communicator = MPI_COMM_WORLD,
679 const IndexSet & col_parallel_partitioning,
680 const MPI_Comm & communicator,
681 const std::vector<size_type> &n_entries_per_row);
710 const IndexSet &col_parallel_partitioning,
712 const MPI_Comm &communicator = MPI_COMM_WORLD,
732 const MPI_Comm &communicator = MPI_COMM_WORLD,
747 const MPI_Comm & communicator,
748 const std::vector<size_type> &n_entries_per_row);
768 const IndexSet &col_parallel_partitioning,
769 const MPI_Comm &communicator = MPI_COMM_WORLD,
799 const IndexSet &col_parallel_partitioning,
801 const MPI_Comm &communicator = MPI_COMM_WORLD,
810 const IndexSet & col_parallel_partitioning,
811 const MPI_Comm & communicator,
812 const std::vector<size_type> &n_entries_per_row);
823 template <
typename SparsityPatternType>
826 const IndexSet & col_parallel_partitioning,
827 const SparsityPatternType &nontrilinos_sparsity_pattern,
828 const MPI_Comm & communicator = MPI_COMM_WORLD,
829 const bool exchange_data =
false);
839 template <
typename SparsityPatternType>
842 const SparsityPatternType &nontrilinos_sparsity_pattern,
843 const MPI_Comm & communicator = MPI_COMM_WORLD,
844 const bool exchange_data =
false);
896 std::pair<size_type, size_type>
975 template <
typename ForwardIterator>
978 ForwardIterator
begin,
980 const bool indices_are_sorted =
false);
991 const Epetra_FECrsGraph &
1142 print(std::ostream &out,
1143 const bool write_extended_trilinos_info =
false)
const;
1172 <<
"An error with error number " << arg1
1173 <<
" occurred while calling a Trilinos function");
1181 <<
"The entry with index <" << arg1 <<
',' << arg2
1182 <<
"> does not exist.");
1189 "You are attempting an operation on two sparsity patterns that "
1190 "are the same object, but the operation requires that the "
1191 "two objects are in fact different.");
1201 <<
"You tried to access element (" << arg1 <<
"/" << arg2
1203 <<
" of a distributed matrix, but only rows " << arg3
1204 <<
" through " << arg4
1205 <<
" are stored locally and can be accessed.");
1213 <<
"You tried to access element (" << arg1 <<
"/" << arg2
1215 <<
" of a sparse matrix, but it appears to not"
1216 <<
" exist in the Trilinos sparsity pattern.");
1230 std::unique_ptr<Epetra_FECrsGraph>
graph;
1261 visit_present_row();
1267 Accessor::row()
const
1269 Assert(a_row < sparsity_pattern->n_rows(),
1270 ExcBeyondEndOfSparsityPattern());
1277 Accessor::column()
const
1279 Assert(a_row < sparsity_pattern->n_rows(),
1280 ExcBeyondEndOfSparsityPattern());
1281 return (*colnum_cache)[a_index];
1287 Accessor::index()
const
1289 Assert(a_row < sparsity_pattern->n_rows(),
1290 ExcBeyondEndOfSparsityPattern());
1299 : accessor(sp, row, index)
1304 inline Iterator::Iterator(
const Iterator &) =
default;
1309 Iterator::operator++()
1311 Assert(accessor.a_row < accessor.sparsity_pattern->n_rows(),
1318 if (accessor.a_index >= accessor.colnum_cache->size())
1320 accessor.a_index = 0;
1323 while (accessor.a_row < accessor.sparsity_pattern->n_rows())
1325 const auto row_length =
1326 accessor.sparsity_pattern->row_length(accessor.a_row);
1327 if (row_length == 0 ||
1328 !accessor.sparsity_pattern->row_is_stored_locally(
1335 accessor.visit_present_row();
1343 Iterator::operator++(
int)
1359 inline const Accessor *Iterator::operator->()
const
1369 return (accessor.a_row == other.accessor.a_row &&
1370 accessor.a_index == other.accessor.a_index);
1378 return !(*
this == other);
1386 return (accessor.row() < other.accessor.row() ||
1387 (accessor.row() == other.accessor.row() &&
1388 accessor.index() < other.accessor.index()));
1398 const size_type first_valid_row = this->local_range().first;
1444 SparsityPattern::in_local_range(
const size_type index)
const
1446 TrilinosWrappers::types::int_type
begin,
end;
1447 # ifndef DEAL_II_WITH_64BIT_INDICES
1448 begin = graph->RowMap().MinMyGID();
1449 end = graph->RowMap().MaxMyGID() + 1;
1451 begin = graph->RowMap().MinMyGID64();
1452 end = graph->RowMap().MaxMyGID64() + 1;
1455 return ((index >= static_cast<size_type>(
begin)) &&
1456 (index < static_cast<size_type>(
end)));
1464 return graph->Filled();
1485 template <
typename ForwardIterator>
1488 ForwardIterator begin,
1489 ForwardIterator end,
1503 Assert(
sizeof(TrilinosWrappers::types::int_type) ==
sizeof((*
begin) * 2),
1506 TrilinosWrappers::types::int_type *col_index_ptr =
1507 reinterpret_cast<TrilinosWrappers::types::int_type *>(
1508 const_cast<typename std::decay<decltype(*
begin)
>::type *>(&*
begin));
1511 TrilinosWrappers::types::int_type trilinos_row_index = row;
1515 if (row_is_stored_locally(row))
1517 graph->InsertGlobalIndices(trilinos_row_index,
n_cols, col_index_ptr);
1518 else if (nonlocal_graph.get() !=
nullptr)
1523 Assert(nonlocal_graph->RowMap().LID(
1524 static_cast<TrilinosWrappers::types::int_type>(row)) != -1,
1525 ExcMessage(
"Attempted to write into off-processor matrix row "
1526 "that has not be specified as being writable upon "
1528 ierr = nonlocal_graph->InsertGlobalIndices(trilinos_row_index,
1533 ierr = graph->InsertGlobalIndices(1,
1534 &trilinos_row_index,
1543 inline const Epetra_FECrsGraph &
1544 SparsityPattern::trilinos_sparsity_pattern()
const
1552 SparsityPattern::locally_owned_domain_indices()
const
1554 return IndexSet(graph->DomainMap());
1560 SparsityPattern::locally_owned_range_indices()
const
1562 return IndexSet(graph->RangeMap());
1569 DEAL_II_NAMESPACE_CLOSE
1572 # endif // DEAL_II_WITH_TRILINOS