16 #include <deal.II/lac/trilinos_index_access.h> 17 #include <deal.II/lac/trilinos_sparse_matrix.h> 19 #ifdef DEAL_II_WITH_TRILINOS 21 # include <deal.II/base/utilities.h> 23 # include <deal.II/lac/dynamic_sparsity_pattern.h> 24 # include <deal.II/lac/la_parallel_vector.h> 25 # include <deal.II/lac/sparse_matrix.h> 26 # include <deal.II/lac/sparsity_pattern.h> 27 # include <deal.II/lac/sparsity_tools.h> 28 # include <deal.II/lac/trilinos_index_access.h> 29 # include <deal.II/lac/trilinos_precondition.h> 30 # include <deal.II/lac/trilinos_sparsity_pattern.h> 32 # include <boost/container/small_vector.hpp> 34 # include <Epetra_Export.h> 35 # include <Teuchos_RCP.hpp> 36 # include <ml_epetra_utils.h> 37 # include <ml_struct.h> 41 DEAL_II_NAMESPACE_OPEN
47 template <
typename VectorType>
54 template <
typename VectorType>
56 begin(
const VectorType &V)
61 template <
typename VectorType>
68 template <
typename VectorType>
70 end(
const VectorType &V)
75 # ifdef DEAL_II_WITH_MPI 110 AccessorBase::visit_present_row()
118 if ((this->a_row == matrix->m()) ||
119 (matrix->in_local_range(this->a_row) ==
false))
121 colnum_cache.reset();
129 TrilinosWrappers::types::int_type colnums = matrix->n();
130 if (value_cache.get() ==
nullptr)
133 std::make_shared<std::vector<TrilinosScalar>>(matrix->n());
134 colnum_cache = std::make_shared<std::vector<size_type>>(matrix->n());
138 value_cache->resize(matrix->n());
139 colnum_cache->resize(matrix->n());
142 int ierr = matrix->trilinos_matrix().ExtractGlobalRowCopy(
143 (TrilinosWrappers::types::int_type)this->a_row,
146 &((*value_cache)[0]),
147 reinterpret_cast<TrilinosWrappers::types::int_type *>(
148 &((*colnum_cache)[0])));
149 value_cache->resize(ncols);
150 colnum_cache->resize(ncols);
175 : column_space_map(new Epetra_Map(0, 0,
Utilities::Trilinos::comm_self()))
177 new Epetra_FECrsMatrix(View, *column_space_map, *column_space_map, 0))
189 ,
matrix(new Epetra_FECrsMatrix(Copy,
192 n_max_entries_per_row),
201 const std::vector<unsigned int> &n_entries_per_row)
203 ,
matrix(new Epetra_FECrsMatrix(Copy,
205 (int *)const_cast<unsigned int *>(
206 &(n_entries_per_row[0])),
215 const Epetra_Map &input_col_map,
218 ,
matrix(new Epetra_FECrsMatrix(Copy,
221 n_max_entries_per_row),
230 const Epetra_Map & input_col_map,
231 const std::vector<unsigned int> &n_entries_per_row)
233 ,
matrix(new Epetra_FECrsMatrix(Copy,
235 (int *)const_cast<unsigned int *>(
236 &(n_entries_per_row[0])),
246 const unsigned int n_max_entries_per_row)
261 matrix(new Epetra_FECrsMatrix(
267 n_max_entries_per_row,
277 const std::vector<unsigned int> &n_entries_per_row)
282 ,
matrix(new Epetra_FECrsMatrix(
288 (int *)const_cast<unsigned int *>(&(n_entries_per_row[0])),
297 const MPI_Comm & communicator,
298 const unsigned int n_max_entries_per_row)
300 parallel_partitioning.make_trilinos_map(communicator, false)))
301 ,
matrix(new Epetra_FECrsMatrix(Copy,
303 n_max_entries_per_row,
312 const MPI_Comm &communicator,
313 const std::vector<unsigned int> &n_entries_per_row)
315 parallel_partitioning.make_trilinos_map(communicator, false)))
316 ,
matrix(new Epetra_FECrsMatrix(Copy,
318 (int *)const_cast<unsigned int *>(
319 &(n_entries_per_row[0])),
328 const IndexSet &col_parallel_partitioning,
329 const MPI_Comm &communicator,
332 col_parallel_partitioning.make_trilinos_map(communicator, false)))
333 ,
matrix(new Epetra_FECrsMatrix(
335 row_parallel_partitioning.make_trilinos_map(communicator, false),
336 n_max_entries_per_row,
345 const IndexSet &col_parallel_partitioning,
346 const MPI_Comm &communicator,
347 const std::vector<unsigned int> &n_entries_per_row)
349 col_parallel_partitioning.make_trilinos_map(communicator, false)))
350 ,
matrix(new Epetra_FECrsMatrix(
352 row_parallel_partitioning.make_trilinos_map(communicator, false),
353 (int *)const_cast<unsigned int *>(&(n_entries_per_row[0])),
364 new Epetra_FECrsMatrix(Copy,
372 "The Trilinos sparsity pattern has not been compressed."));
386 other.last_action = Zero;
387 other.compressed =
false;
404 bool needs_deep_copy =
409 if (!needs_deep_copy)
416 const int row_local =
matrix->RowMap().LID(
417 static_cast<TrilinosWrappers::types::int_type>(row));
420 int n_entries, rhs_n_entries;
421 TrilinosScalar *value_ptr, *rhs_value_ptr;
422 int * index_ptr, *rhs_index_ptr;
423 int ierr = rhs.
matrix->ExtractMyRowView(row_local,
430 ierr =
matrix->ExtractMyRowView(row_local,
436 if (n_entries != rhs_n_entries ||
437 std::memcmp(static_cast<void *>(index_ptr),
438 static_cast<void *>(rhs_index_ptr),
439 sizeof(
int) * n_entries) != 0)
441 needs_deep_copy =
true;
445 for (
int i = 0; i < n_entries; ++i)
446 value_ptr[i] = rhs_value_ptr[i];
456 matrix = std_cxx14::make_unique<Epetra_FECrsMatrix>(*rhs.
matrix);
463 std_cxx14::make_unique<Epetra_CrsMatrix>(Copy,
473 template <
typename SparsityPatternType>
475 reinit_matrix(
const Epetra_Map & input_row_map,
476 const Epetra_Map & input_col_map,
477 const SparsityPatternType & sparsity_pattern,
478 const bool exchange_data,
480 std::unique_ptr<Epetra_FECrsMatrix> &
matrix,
486 nonlocal_matrix.reset();
487 nonlocal_matrix_exporter.reset();
489 if (input_row_map.Comm().MyPID() == 0)
501 column_space_map = std_cxx14::make_unique<Epetra_Map>(input_col_map);
510 trilinos_sparsity.
reinit(input_row_map,
514 matrix = std_cxx14::make_unique<Epetra_FECrsMatrix>(
523 std::vector<int> n_entries_per_row(last_row - first_row);
525 for (
size_type row = first_row; row < last_row; ++row)
526 n_entries_per_row[row - first_row] = sparsity_pattern.row_length(row);
542 std::unique_ptr<Epetra_CrsGraph> graph;
543 if (input_row_map.Comm().NumProc() > 1)
544 graph = std_cxx14::make_unique<Epetra_CrsGraph>(
545 Copy, input_row_map, n_entries_per_row.data(),
true);
547 graph = std_cxx14::make_unique<Epetra_CrsGraph>(
548 Copy, input_row_map, input_col_map, n_entries_per_row.data(),
true);
555 std::vector<TrilinosWrappers::types::int_type> row_indices;
557 for (
size_type row = first_row; row < last_row; ++row)
559 const int row_length = sparsity_pattern.row_length(row);
563 row_indices.resize(row_length, -1);
565 typename SparsityPatternType::iterator p =
566 sparsity_pattern.begin(row);
567 for (
size_type col = 0; p != sparsity_pattern.end(row); ++p, ++col)
568 row_indices[col] = p->column();
570 graph->Epetra_CrsGraph::InsertGlobalIndices(row,
579 graph->FillComplete(input_col_map, input_row_map);
580 graph->OptimizeStorage();
589 matrix = std_cxx14::make_unique<Epetra_FECrsMatrix>(Copy, *graph,
false);
601 class Epetra_CrsGraphMod :
public Epetra_CrsGraph
604 Epetra_CrsGraphMod(
const Epetra_Map &row_map,
605 const int * n_entries_per_row)
606 : Epetra_CrsGraph(Copy, row_map, n_entries_per_row,
true){};
609 SetIndicesAreGlobal()
611 this->Epetra_CrsGraph::SetIndicesAreGlobal(
true);
620 reinit_matrix(
const Epetra_Map & input_row_map,
621 const Epetra_Map & input_col_map,
623 const bool exchange_data,
624 std::unique_ptr<Epetra_Map> & column_space_map,
625 std::unique_ptr<Epetra_FECrsMatrix> &matrix,
626 std::unique_ptr<Epetra_CrsMatrix> & nonlocal_matrix,
627 std::unique_ptr<Epetra_Export> & nonlocal_matrix_exporter)
630 nonlocal_matrix.reset();
631 nonlocal_matrix_exporter.reset();
640 column_space_map = std_cxx14::make_unique<Epetra_Map>(input_col_map);
644 if (relevant_rows.size() == 0)
648 relevant_rows.add_range(
651 relevant_rows.compress();
652 Assert(relevant_rows.n_elements() >=
653 static_cast<unsigned int>(input_row_map.NumMyElements()),
655 "Locally relevant rows of sparsity pattern must contain " 656 "all locally owned rows"));
661 bool have_ghost_rows =
false;
663 std::vector<::types::global_dof_index> indices;
664 relevant_rows.fill_index_vector(indices);
665 Epetra_Map relevant_map(
666 TrilinosWrappers::types::int_type(-1),
667 TrilinosWrappers::types::int_type(relevant_rows.n_elements()),
670 reinterpret_cast<TrilinosWrappers::types::int_type *
>(
673 input_row_map.Comm());
674 if (relevant_map.SameAs(input_row_map))
675 have_ghost_rows =
false;
677 have_ghost_rows =
true;
680 const unsigned int n_rows = relevant_rows.n_elements();
681 std::vector<TrilinosWrappers::types::int_type> ghost_rows;
682 std::vector<int> n_entries_per_row(input_row_map.NumMyElements());
683 std::vector<int> n_entries_per_ghost_row;
684 for (
unsigned int i = 0, own = 0; i < n_rows; ++i)
686 const TrilinosWrappers::types::int_type global_row =
687 relevant_rows.nth_index_in_set(i);
688 if (input_row_map.MyGID(global_row))
689 n_entries_per_row[own++] = sparsity_pattern.
row_length(global_row);
690 else if (sparsity_pattern.
row_length(global_row) > 0)
692 ghost_rows.push_back(global_row);
693 n_entries_per_ghost_row.push_back(
698 Epetra_Map off_processor_map(-1,
700 (ghost_rows.size() > 0) ?
701 (ghost_rows.data()) :
704 input_row_map.Comm());
706 std::unique_ptr<Epetra_CrsGraph> graph;
707 std::unique_ptr<Epetra_CrsGraphMod> nonlocal_graph;
708 if (input_row_map.Comm().NumProc() > 1)
710 graph = std_cxx14::make_unique<Epetra_CrsGraph>(
713 (n_entries_per_row.size() > 0) ? (n_entries_per_row.data()) :
715 exchange_data ?
false :
true);
716 if (have_ghost_rows ==
true)
717 nonlocal_graph = std_cxx14::make_unique<Epetra_CrsGraphMod>(
718 off_processor_map, n_entries_per_ghost_row.data());
721 graph = std_cxx14::make_unique<Epetra_CrsGraph>(
725 (n_entries_per_row.size() > 0) ? (n_entries_per_row.data()) :
nullptr,
729 std::vector<TrilinosWrappers::types::int_type> row_indices;
731 for (
unsigned int i = 0; i < n_rows; ++i)
733 const TrilinosWrappers::types::int_type global_row =
734 relevant_rows.nth_index_in_set(i);
739 row_indices.resize(row_length, -1);
741 row_indices[col] = sparsity_pattern.
column_number(global_row, col);
743 if (input_row_map.MyGID(global_row))
744 graph->InsertGlobalIndices(global_row,
750 nonlocal_graph->InsertGlobalIndices(global_row,
757 if (nonlocal_graph.get() !=
nullptr)
763 nonlocal_graph->SetIndicesAreGlobal();
764 Assert(nonlocal_graph->IndicesAreGlobal() ==
true,
766 nonlocal_graph->FillComplete(input_col_map, input_row_map);
767 nonlocal_graph->OptimizeStorage();
772 Epetra_Export exporter(nonlocal_graph->RowMap(), input_row_map);
773 int ierr = graph->Export(*nonlocal_graph, exporter, Add);
779 std_cxx14::make_unique<Epetra_CrsMatrix>(Copy, *nonlocal_graph);
782 graph->FillComplete(input_col_map, input_row_map);
783 graph->OptimizeStorage();
789 matrix = std_cxx14::make_unique<Epetra_FECrsMatrix>(Copy, *graph,
false);
795 template <
typename SparsityPatternType>
799 const Epetra_Map rows(static_cast<TrilinosWrappers::types::int_type>(
800 sparsity_pattern.n_rows()),
803 const Epetra_Map columns(static_cast<TrilinosWrappers::types::int_type>(
804 sparsity_pattern.n_cols()),
820 template <
typename SparsityPatternType>
823 const SparsityPatternType &sparsity_pattern,
824 const bool exchange_data)
826 reinit_matrix(input_map,
838 template <
typename SparsityPatternType>
841 const IndexSet & col_parallel_partitioning,
842 const SparsityPatternType &sparsity_pattern,
843 const MPI_Comm & communicator,
844 const bool exchange_data)
850 reinit_matrix(row_map,
867 template <
typename SparsityPatternType>
870 const Epetra_Map & col_map,
871 const SparsityPatternType &sparsity_pattern,
872 const bool exchange_data)
874 reinit_matrix(row_map,
900 matrix = std_cxx14::make_unique<Epetra_FECrsMatrix>(
918 if (
this == &sparse_matrix)
925 matrix = std_cxx14::make_unique<Epetra_FECrsMatrix>(
940 template <
typename number>
943 const IndexSet & row_parallel_partitioning,
944 const IndexSet & col_parallel_partitioning,
945 const ::SparseMatrix<number> &dealii_sparse_matrix,
946 const MPI_Comm & communicator,
947 const double drop_tolerance,
948 const bool copy_values,
949 const ::SparsityPattern * use_this_sparsity)
951 if (copy_values ==
false)
955 if (use_this_sparsity ==
nullptr)
956 reinit(row_parallel_partitioning,
957 col_parallel_partitioning,
958 dealii_sparse_matrix.get_sparsity_pattern(),
962 reinit(row_parallel_partitioning,
963 col_parallel_partitioning,
970 const size_type n_rows = dealii_sparse_matrix.m();
975 const ::SparsityPattern &sparsity_pattern =
976 (use_this_sparsity !=
nullptr) ?
978 dealii_sparse_matrix.get_sparsity_pattern();
980 if (
matrix.get() ==
nullptr ||
m() != n_rows ||
983 reinit(row_parallel_partitioning,
984 col_parallel_partitioning,
996 std::vector<size_type> row_indices(maximum_row_length);
997 std::vector<TrilinosScalar> values(maximum_row_length);
999 for (
size_type row = 0; row < n_rows; ++row)
1001 if (row_parallel_partitioning.
is_element(row) ==
true)
1004 sparsity_pattern.begin(row);
1005 typename ::SparseMatrix<number>::const_iterator it =
1006 dealii_sparse_matrix.begin(row);
1008 if (sparsity_pattern.n_rows() == sparsity_pattern.n_cols())
1012 if (std::fabs(it->value()) > drop_tolerance)
1014 values[col] = it->value();
1015 row_indices[col++] = it->column();
1021 while (it != dealii_sparse_matrix.end(row) &&
1022 select_index != sparsity_pattern.end(row))
1024 while (select_index->
column() < it->column() &&
1025 select_index != sparsity_pattern.end(row))
1027 while (it->column() < select_index->
column() &&
1028 it != dealii_sparse_matrix.end(row))
1031 if (it == dealii_sparse_matrix.end(row))
1033 if (std::fabs(it->value()) > drop_tolerance)
1035 values[col] = it->value();
1036 row_indices[col++] = it->column();
1043 reinterpret_cast<size_type *
>(row_indices.data()),
1052 template <
typename number>
1055 const ::SparseMatrix<number> &dealii_sparse_matrix,
1056 const double drop_tolerance,
1057 const bool copy_values,
1058 const ::SparsityPattern * use_this_sparsity)
1060 reinit(complete_index_set(dealii_sparse_matrix.m()),
1061 complete_index_set(dealii_sparse_matrix.n()),
1062 dealii_sparse_matrix,
1071 template <
typename number>
1074 const Epetra_Map & input_map,
1075 const ::SparseMatrix<number> &dealii_sparse_matrix,
1076 const double drop_tolerance,
1077 const bool copy_values,
1078 const ::SparsityPattern * use_this_sparsity)
1082 dealii_sparse_matrix,
1091 template <
typename number>
1094 const Epetra_Map & input_row_map,
1095 const Epetra_Map & input_col_map,
1096 const ::SparseMatrix<number> &dealii_sparse_matrix,
1097 const double drop_tolerance,
1098 const bool copy_values,
1099 const ::SparsityPattern * use_this_sparsity)
1103 dealii_sparse_matrix,
1114 const bool copy_values)
1116 Assert(input_matrix.Filled() ==
true,
1117 ExcMessage(
"Input CrsMatrix has not called FillComplete()!"));
1120 std_cxx14::make_unique<Epetra_Map>(input_matrix.DomainMap());
1122 const Epetra_CrsGraph *graph = &input_matrix.Graph();
1127 matrix = std_cxx14::make_unique<Epetra_FECrsMatrix>(Copy, *graph,
false);
1129 matrix->FillComplete(*column_space_map, input_matrix.RangeMap(),
true);
1131 if (copy_values ==
true)
1135 const TrilinosScalar *in_values = input_matrix[0];
1136 TrilinosScalar * values = (*matrix)[0];
1137 const size_type my_nonzeros = input_matrix.NumMyNonzeros();
1138 std::memcpy(values, in_values, my_nonzeros *
sizeof(TrilinosScalar));
1162 "compress() can only be called with VectorOperation add, insert, or unknown"));
1170 ExcMessage(
"Operation and argument to compress() do not match"));
1196 ierr =
matrix->OptimizeStorage();
1213 std_cxx14::make_unique<Epetra_Map>(0,
1221 matrix->FillComplete();
1230 const TrilinosScalar new_diag_value)
1237 matrix->LRID(static_cast<TrilinosWrappers::types::int_type>(row));
1240 TrilinosScalar *values;
1244 matrix->ExtractMyRowView(local_row, num_entries, values, col_indices);
1250 std::find(col_indices, col_indices + num_entries, local_row);
1251 int diag_index = (int)(diag_find - col_indices);
1253 for (TrilinosWrappers::types::int_type j = 0; j < num_entries; ++j)
1254 if (diag_index != j || new_diag_value == 0)
1257 if (diag_find && std::fabs(values[diag_index]) == 0.0 &&
1258 new_diag_value != 0.0)
1259 values[diag_index] = new_diag_value;
1267 const TrilinosScalar new_diag_value)
1269 for (
size_type row = 0; row < rows.size(); ++row)
1281 matrix->LRID(static_cast<TrilinosWrappers::types::int_type>(i)),
1283 matrix->LCID(static_cast<TrilinosWrappers::types::int_type>(j));
1284 TrilinosScalar value = 0.;
1292 if (trilinos_i == -1)
1307 int nnz_present =
matrix->NumMyEntries(trilinos_i);
1310 TrilinosScalar *values;
1316 int ierr =
matrix->ExtractMyRowView(trilinos_i,
1323 Assert(nnz_present == nnz_extracted,
1331 std::find(col_indices, col_indices + nnz_present, trilinos_j);
1333 int local_col_index = (int)(el_find - col_indices);
1343 if (local_col_index == nnz_present)
1348 value = values[local_col_index];
1362 matrix->LRID(static_cast<TrilinosWrappers::types::int_type>(i)),
1364 matrix->LCID(static_cast<TrilinosWrappers::types::int_type>(j));
1365 TrilinosScalar value = 0.;
1374 if ((trilinos_i == -1) || (trilinos_j == -1))
1385 int nnz_present =
matrix->NumMyEntries(trilinos_i);
1388 TrilinosScalar *values;
1393 int ierr =
matrix->ExtractMyRowView(trilinos_i,
1400 Assert(nnz_present == nnz_extracted,
1407 std::find(col_indices, col_indices + nnz_present, trilinos_j);
1409 int local_col_index = (int)(el_find - col_indices);
1419 if (local_col_index == nnz_present)
1422 value = values[local_col_index];
1460 matrix->LRID(static_cast<TrilinosWrappers::types::int_type>(row));
1468 int ierr =
matrix->NumMyRowEntries(local_row, ncols);
1472 return static_cast<unsigned int>(ncols);
1479 const std::vector<size_type> & col_indices,
1481 const bool elide_zero_values)
1483 Assert(row_indices.size() == values.
m(),
1485 Assert(col_indices.size() == values.
n(),
1488 for (
size_type i = 0; i < row_indices.size(); ++i)
1500 const std::vector<size_type> & col_indices,
1501 const std::vector<TrilinosScalar> &values,
1502 const bool elide_zero_values)
1504 Assert(col_indices.size() == values.size(),
1520 const TrilinosScalar *values,
1521 const bool elide_zero_values)
1536 TrilinosWrappers::types::int_type *col_index_ptr;
1537 TrilinosScalar * col_value_ptr;
1538 TrilinosWrappers::types::int_type n_columns;
1540 boost::container::small_vector<TrilinosScalar, 200> local_value_array(
1542 boost::container::small_vector<TrilinosWrappers::types::int_type, 200>
1543 local_index_array(n_cols);
1548 if (elide_zero_values ==
false)
1550 col_index_ptr = (TrilinosWrappers::types::int_type *)col_indices;
1551 col_value_ptr =
const_cast<TrilinosScalar *
>(values);
1558 col_index_ptr = local_index_array.data();
1559 col_value_ptr = local_value_array.data();
1564 const double value = values[j];
1568 col_index_ptr[n_columns] = col_indices[j];
1569 col_value_ptr[n_columns] = value;
1574 Assert(n_columns <= (TrilinosWrappers::types::int_type)n_cols,
1587 if (
matrix->RowMap().MyGID(
1588 static_cast<TrilinosWrappers::types::int_type>(row)) ==
true)
1590 if (
matrix->Filled() ==
false)
1592 ierr =
matrix->Epetra_CrsMatrix::InsertGlobalValues(
1593 static_cast<TrilinosWrappers::types::int_type>(row),
1594 static_cast<int>(n_columns),
1595 const_cast<double *>(col_value_ptr),
1605 ierr =
matrix->Epetra_CrsMatrix::ReplaceGlobalValues(row,
1620 if (
matrix->Filled() ==
false)
1622 ierr =
matrix->InsertGlobalValues(
1624 (TrilinosWrappers::types::int_type *)&row,
1628 Epetra_FECrsMatrix::ROW_MAJOR);
1633 ierr =
matrix->ReplaceGlobalValues(
1635 (TrilinosWrappers::types::int_type *)&row,
1639 Epetra_FECrsMatrix::ROW_MAJOR);
1656 const bool elide_zero_values)
1658 Assert(indices.size() == values.
m(),
1662 for (
size_type i = 0; i < indices.size(); ++i)
1674 const std::vector<size_type> & col_indices,
1676 const bool elide_zero_values)
1678 Assert(row_indices.size() == values.
m(),
1680 Assert(col_indices.size() == values.
n(),
1683 for (
size_type i = 0; i < row_indices.size(); ++i)
1695 const std::vector<size_type> & col_indices,
1696 const std::vector<TrilinosScalar> &values,
1697 const bool elide_zero_values)
1699 Assert(col_indices.size() == values.size(),
1715 const TrilinosScalar *values,
1716 const bool elide_zero_values,
1733 TrilinosWrappers::types::int_type *col_index_ptr;
1734 TrilinosScalar * col_value_ptr;
1735 TrilinosWrappers::types::int_type n_columns;
1737 boost::container::small_vector<TrilinosScalar, 100> local_value_array(
1739 boost::container::small_vector<TrilinosWrappers::types::int_type, 100>
1740 local_index_array(n_cols);
1745 if (elide_zero_values ==
false)
1747 col_index_ptr = (TrilinosWrappers::types::int_type *)col_indices;
1748 col_value_ptr =
const_cast<TrilinosScalar *
>(values);
1759 col_index_ptr = local_index_array.data();
1760 col_value_ptr = local_value_array.data();
1765 const double value = values[j];
1770 col_index_ptr[n_columns] = col_indices[j];
1771 col_value_ptr[n_columns] = value;
1776 Assert(n_columns <= (TrilinosWrappers::types::int_type)n_cols,
1788 if (
matrix->RowMap().MyGID(
1789 static_cast<TrilinosWrappers::types::int_type>(row)) ==
true)
1791 ierr =
matrix->Epetra_CrsMatrix::SumIntoGlobalValues(row,
1804 static_cast<TrilinosWrappers::types::int_type>(row)) != -1,
1805 ExcMessage(
"Attempted to write into off-processor matrix row " 1806 "that has not be specified as being writable upon " 1825 matrix->SumIntoGlobalValues(1,
1826 (TrilinosWrappers::types::int_type *)&row,
1830 Epetra_FECrsMatrix::ROW_MAJOR);
1837 std::cout <<
"------------------------------------------" << std::endl;
1838 std::cout <<
"Got error " << ierr <<
" in row " << row <<
" of proc " 1839 <<
matrix->RowMap().Comm().MyPID()
1840 <<
" when trying to add the columns:" << std::endl;
1841 for (TrilinosWrappers::types::int_type i = 0; i < n_columns; ++i)
1842 std::cout << col_index_ptr[i] <<
" ";
1843 std::cout << std::endl << std::endl;
1844 std::cout <<
"Matrix row " 1845 << (
matrix->RowMap().MyGID(
1846 static_cast<TrilinosWrappers::types::int_type>(row)) ==
1850 <<
" has the following indices:" << std::endl;
1851 std::vector<TrilinosWrappers::types::int_type> indices;
1852 const Epetra_CrsGraph * graph =
1855 static_cast<TrilinosWrappers::types::int_type>(row)) ==
false) ?
1859 indices.resize(graph->NumGlobalIndices(
1860 static_cast<TrilinosWrappers::types::int_type>(row)));
1862 graph->ExtractGlobalRowCopy(
1863 static_cast<TrilinosWrappers::types::int_type>(row),
1867 AssertDimension(static_cast<unsigned int>(n_indices), indices.size());
1869 for (TrilinosWrappers::types::int_type i = 0; i < n_indices; ++i)
1870 std::cout << indices[i] <<
" ";
1871 std::cout << std::endl << std::endl;
1888 const int ierr =
matrix->PutScalar(d);
1906 ExcMessage(
"Can only add matrices with same distribution of rows"));
1908 ExcMessage(
"Addition of matrices only allowed if matrices are " 1909 "filled, i.e., compress() has been called"));
1911 const bool same_col_map =
matrix->ColMap().SameAs(rhs.
matrix->ColMap());
1915 const int row_local =
matrix->RowMap().LID(
1916 static_cast<TrilinosWrappers::types::int_type>(row));
1923 int n_entries, rhs_n_entries;
1924 TrilinosScalar *value_ptr, *rhs_value_ptr;
1925 int * index_ptr, *rhs_index_ptr;
1926 int ierr = rhs.
matrix->ExtractMyRowView(row_local,
1934 matrix->ExtractMyRowView(row_local, n_entries, value_ptr, index_ptr);
1936 bool expensive_checks = (n_entries != rhs_n_entries || !same_col_map);
1937 if (!expensive_checks)
1941 expensive_checks = std::memcmp(static_cast<void *>(index_ptr),
1942 static_cast<void *>(rhs_index_ptr),
1943 sizeof(
int) * n_entries) != 0;
1944 if (!expensive_checks)
1945 for (
int i = 0; i < n_entries; ++i)
1946 value_ptr[i] += rhs_value_ptr[i] * factor;
1952 if (expensive_checks)
1954 for (
int i = 0; i < rhs_n_entries; ++i)
1956 if (rhs_value_ptr[i] == 0.)
1958 const TrilinosWrappers::types::int_type rhs_global_col =
1960 int local_col =
matrix->ColMap().LID(rhs_global_col);
1962 index_ptr + n_entries,
1964 Assert(local_index != index_ptr + n_entries &&
1965 *local_index == local_col,
1967 "Adding the entries from the other matrix " 1968 "failed, because the sparsity pattern " 1969 "of that matrix includes more elements than the " 1970 "calling matrix, which is not allowed."));
1971 value_ptr[local_index - index_ptr] += factor * rhs_value_ptr[i];
1989 if (!
matrix->UseTranspose())
1991 ierr =
matrix->SetUseTranspose(
true);
1996 ierr =
matrix->SetUseTranspose(
false);
2006 const int ierr =
matrix->Scale(a);
2020 const TrilinosScalar factor = 1. / a;
2022 const int ierr =
matrix->Scale(factor);
2035 return matrix->NormOne();
2044 return matrix->NormInf();
2053 return matrix->NormFrobenius();
2060 namespace SparseMatrixImplementation
2062 template <
typename VectorType>
2064 check_vector_map_equality(
const Epetra_CrsMatrix &,
2070 check_vector_map_equality(
const Epetra_CrsMatrix &
m,
2076 "Column map of matrix does not fit with vector map!"));
2078 ExcMessage(
"Row map of matrix does not fit with vector map!"));
2087 template <
typename VectorType>
2096 internal::SparseMatrixImplementation::check_vector_map_equality(*
matrix,
2099 const size_type dst_local_size = internal::end(dst) - internal::begin(dst);
2101 static_cast<size_type>(
matrix->RangeMap().NumMyPoints()));
2102 const size_type src_local_size = internal::end(src) - internal::begin(src);
2104 static_cast<size_type>(
matrix->DomainMap().NumMyPoints()));
2106 Epetra_MultiVector tril_dst(
2107 View,
matrix->RangeMap(), internal::begin(dst), dst_local_size, 1);
2108 Epetra_MultiVector tril_src(View,
2110 const_cast<TrilinosScalar *
>(
2111 internal::begin(src)),
2115 const int ierr =
matrix->Multiply(
false, tril_src, tril_dst);
2122 template <
typename VectorType>
2129 internal::SparseMatrixImplementation::check_vector_map_equality(*
matrix,
2132 const size_type dst_local_size = internal::end(dst) - internal::begin(dst);
2134 static_cast<size_type>(
matrix->DomainMap().NumMyPoints()));
2135 const size_type src_local_size = internal::end(src) - internal::begin(src);
2137 static_cast<size_type>(
matrix->RangeMap().NumMyPoints()));
2139 Epetra_MultiVector tril_dst(
2140 View,
matrix->DomainMap(), internal::begin(dst), dst_local_size, 1);
2141 Epetra_MultiVector tril_src(View,
2143 const_cast<double *
>(internal::begin(src)),
2147 const int ierr =
matrix->Multiply(
true, tril_src, tril_dst);
2154 template <
typename VectorType>
2162 VectorType tmp_vector;
2163 tmp_vector.reinit(dst,
true);
2164 vmult(tmp_vector, src);
2170 template <
typename VectorType>
2178 VectorType tmp_vector;
2179 tmp_vector.reinit(dst,
true);
2192 temp_vector.
reinit(v,
true);
2194 vmult(temp_vector, v);
2195 return temp_vector * v;
2207 temp_vector.
reinit(v,
true);
2209 vmult(temp_vector, v);
2210 return u * temp_vector;
2238 const bool transpose_left)
2240 # ifdef DEAL_II_WITH_64BIT_INDICES 2243 const bool use_vector = (V.
size() == inputright.
m() ?
true :
false);
2244 if (transpose_left ==
false)
2246 Assert(inputleft.
n() == inputright.
m(),
2250 ExcMessage(
"Parallel partitioning of A and B does not fit."));
2254 Assert(inputleft.
m() == inputright.
m(),
2258 ExcMessage(
"Parallel partitioning of A and B does not fit."));
2269 Teuchos::RCP<Epetra_CrsMatrix> mod_B;
2270 if (use_vector ==
false)
2272 mod_B = Teuchos::rcp(const_cast<Epetra_CrsMatrix *>(
2278 mod_B = Teuchos::rcp(
2284 ExcMessage(
"Parallel distribution of matrix B and vector V " 2285 "does not match."));
2288 for (
int i = 0; i < local_N; ++i)
2291 double *new_data, *B_data;
2292 mod_B->ExtractMyRowView(i, N_entries, new_data);
2297 for (TrilinosWrappers::types::int_type j = 0; j < N_entries; ++j)
2298 new_data[j] = value * B_data[j];
2308 ML_Comm_Create(&comm);
2310 const Epetra_MpiComm *epcomm =
dynamic_cast<const Epetra_MpiComm *
>(
2315 ML_Comm_Set_UsrComm(comm, epcomm->Comm());
2317 ML_Operator *A_ = ML_Operator_Create(comm);
2318 ML_Operator *B_ = ML_Operator_Create(comm);
2319 ML_Operator *C_ = ML_Operator_Create(comm);
2322 if (transpose_left ==
false)
2323 ML_Operator_WrapEpetraCrsMatrix(const_cast<Epetra_CrsMatrix *>(
2334 "Matrix must be partitioned contiguously between procs."));
2339 int num_entries, *indices;
2341 i, num_entries, indices);
2347 for (TrilinosWrappers::types::int_type j = 0; j < num_entries;
2354 sparsity_transposed.compress();
2355 transposed_mat.
reinit(sparsity_transposed);
2360 int num_entries, *indices;
2371 for (TrilinosWrappers::types::int_type j = 0; j < num_entries;
2379 ML_Operator_WrapEpetraCrsMatrix(const_cast<Epetra_CrsMatrix *>(
2384 ML_Operator_WrapEpetraCrsMatrix(mod_B.get(), B_,
false);
2394 ML_Operator * Btmp, *Ctmp, *Ctmp2, *tptr;
2395 ML_CommInfoOP * getrow_comm;
2397 TrilinosWrappers::types::int_type N_input_vector = B_->invec_leng;
2398 getrow_comm = B_->getrow->pre_comm;
2399 if (getrow_comm !=
nullptr)
2400 for (TrilinosWrappers::types::int_type i = 0;
2401 i < getrow_comm->N_neighbors;
2403 for (TrilinosWrappers::types::int_type j = 0;
2404 j < getrow_comm->neighbors[i].N_send;
2406 AssertThrow(getrow_comm->neighbors[i].send_list[j] < N_input_vector,
2409 ML_create_unique_col_id(N_input_vector,
2410 &(B_->getrow->loc_glob_map),
2414 B_->getrow->use_loc_glob_map = ML_YES;
2415 if (A_->getrow->pre_comm !=
nullptr)
2416 ML_exchange_rows(B_, &Btmp, A_->getrow->pre_comm);
2421 ML_matmat_mult(A_, Btmp, &Ctmp);
2425 ML_free(B_->getrow->loc_glob_map);
2426 B_->getrow->loc_glob_map =
nullptr;
2427 B_->getrow->use_loc_glob_map = ML_NO;
2428 if (A_->getrow->pre_comm !=
nullptr)
2431 while ((tptr !=
nullptr) && (tptr->sub_matrix != B_))
2432 tptr = tptr->sub_matrix;
2433 if (tptr !=
nullptr)
2434 tptr->sub_matrix =
nullptr;
2435 ML_RECUR_CSR_MSRdata_Destroy(Btmp);
2436 ML_Operator_Destroy(&Btmp);
2440 if (A_->getrow->post_comm !=
nullptr)
2441 ML_exchange_rows(Ctmp, &Ctmp2, A_->getrow->post_comm);
2445 ML_back_to_csrlocal(Ctmp2, C_, max_per_proc);
2447 ML_RECUR_CSR_MSRdata_Destroy(Ctmp);
2448 ML_Operator_Destroy(&Ctmp);
2450 if (A_->getrow->post_comm !=
nullptr)
2452 ML_RECUR_CSR_MSRdata_Destroy(Ctmp2);
2453 ML_Operator_Destroy(&Ctmp2);
2458 Epetra_CrsMatrix *C_mat;
2459 ML_Operator2EpetraCrsMatrix(C_, C_mat);
2460 C_mat->FillComplete(mod_B->DomainMap(),
2464 C_mat->OptimizeStorage();
2469 ML_Operator_Destroy(&A_);
2470 ML_Operator_Destroy(&B_);
2471 ML_Operator_Destroy(&C_);
2472 ML_Comm_Destroy(&comm);
2482 # ifdef DEAL_II_WITH_64BIT_INDICES 2485 internals::perform_mmult(*
this, B, C, V,
false);
2495 # ifdef DEAL_II_WITH_64BIT_INDICES 2498 internals::perform_mmult(*
this, B, C, V,
true);
2516 const bool print_detailed_trilinos_information)
const 2518 if (print_detailed_trilinos_information ==
true)
2526 for (
int i = 0; i < matrix->NumMyRows(); ++i)
2528 matrix->ExtractMyRowView(i, num_entries, values, indices);
2529 for (TrilinosWrappers::types::int_type j = 0; j < num_entries; ++j)
2533 <<
") " << values[j] << std::endl;
2546 sizeof(*this) +
sizeof(*matrix) +
sizeof(*
matrix->Graph().DataPtr());
2548 (
sizeof(TrilinosScalar) +
sizeof(TrilinosWrappers::types::int_type)) *
2549 matrix->NumMyNonzeros() +
2558 return matrix->DomainMap();
2566 return matrix->RangeMap();
2590 # ifdef DEAL_II_WITH_MPI 2592 const Epetra_MpiComm *mpi_comm =
2593 dynamic_cast<const Epetra_MpiComm *
>(&
matrix->RangeMap().Comm());
2595 return mpi_comm->Comm();
2598 return MPI_COMM_SELF;
2611 # ifndef DEAL_II_WITH_MPI 2613 make_serial_Epetra_map(
const IndexSet &serial_partitioning)
2617 TrilinosWrappers::types::int_type(serial_partitioning.
size()),
2618 TrilinosWrappers::types::int_type(serial_partitioning.
n_elements()),
2620 Epetra_SerialComm());
2625 namespace LinearOperatorImplementation
2627 TrilinosPayload::TrilinosPayload()
2628 : use_transpose(false)
2630 # ifdef DEAL_II_WITH_MPI
2631 communicator(MPI_COMM_SELF)
2632 , domain_map(
IndexSet().make_trilinos_map(communicator.Comm()))
2633 , range_map(
IndexSet().make_trilinos_map(communicator.Comm()))
2641 ExcMessage(
"Uninitialized TrilinosPayload::vmult called" 2642 "(Default constructor)"));
2647 ExcMessage(
"Uninitialized TrilinosPayload::Tvmult called" 2648 "(Default constructor)"));
2653 ExcMessage(
"Uninitialized TrilinosPayload::inv_vmult called" 2654 "(Default constructor)"));
2659 ExcMessage(
"Uninitialized TrilinosPayload::inv_Tvmult called" 2660 "(Default constructor)"));
2671 # ifdef DEAL_II_WITH_MPI
2686 vmult = [&matrix_exemplar, &matrix](
Range & tril_dst,
2687 const Domain &tril_src) {
2689 Assert(&tril_src != &tril_dst,
2693 internal::check_vector_map_equality(
2698 internal::check_vector_map_equality(
2708 Tvmult = [&matrix_exemplar, &matrix](
Domain & tril_dst,
2709 const Range &tril_src) {
2711 Assert(&tril_src != &tril_dst,
2715 internal::check_vector_map_equality(
2720 internal::check_vector_map_equality(
2726 Epetra_CrsMatrix &tril_mtrx_non_const =
2728 tril_mtrx_non_const.SetUseTranspose(
2732 tril_mtrx_non_const.SetUseTranspose(
2738 ExcMessage(
"Uninitialized TrilinosPayload::inv_vmult called" 2739 "(Matrix constructor with matrix exemplar)"));
2744 ExcMessage(
"Uninitialized TrilinosPayload::inv_Tvmult called" 2745 "(Matrix constructor with matrix exemplar)"));
2756 # ifdef DEAL_II_WITH_MPI
2771 vmult = [&matrix_exemplar, &preconditioner](
Range & tril_dst,
2772 const Domain &tril_src) {
2775 Assert(&tril_src != &tril_dst,
2777 internal::check_vector_map_equality(
2782 internal::check_vector_map_equality(
2793 Tvmult = [&matrix_exemplar, &preconditioner](
Domain & tril_dst,
2794 const Range &tril_src) {
2797 Assert(&tril_src != &tril_dst,
2799 internal::check_vector_map_equality(
2804 internal::check_vector_map_equality(
2820 const Range &tril_src) {
2823 Assert(&tril_src != &tril_dst,
2825 internal::check_vector_map_equality(
2830 internal::check_vector_map_equality(
2842 &preconditioner](
Range & tril_dst,
2843 const Domain &tril_src) {
2846 Assert(&tril_src != &tril_dst,
2848 internal::check_vector_map_equality(
2853 internal::check_vector_map_equality(
2875 preconditioner_exemplar.trilinos_operator().
UseTranspose())
2877 # ifdef DEAL_II_WITH_MPI
2890 vmult = [&preconditioner_exemplar,
2891 &preconditioner](
Range &tril_dst,
const Domain &tril_src) {
2894 Assert(&tril_src != &tril_dst,
2896 internal::check_vector_map_equality(
2901 internal::check_vector_map_equality(
2912 Tvmult = [&preconditioner_exemplar,
2913 &preconditioner](
Domain &tril_dst,
const Range &tril_src) {
2916 Assert(&tril_src != &tril_dst,
2918 internal::check_vector_map_equality(
2923 internal::check_vector_map_equality(
2939 &preconditioner](
Domain &tril_dst,
const Range &tril_src) {
2942 Assert(&tril_src != &tril_dst,
2944 internal::check_vector_map_equality(
2949 internal::check_vector_map_equality(
2961 &preconditioner](
Range & tril_dst,
2962 const Domain &tril_src) {
2965 Assert(&tril_src != &tril_dst,
2967 internal::check_vector_map_equality(
2972 internal::check_vector_map_equality(
3023 tril_dst = tril_src;
3027 tril_dst = tril_src;
3031 tril_dst = tril_src;
3035 tril_dst = tril_src;
3049 const int ierr = tril_dst.PutScalar(0.0);
3055 const int ierr = tril_dst.PutScalar(0.0);
3062 ExcMessage(
"Cannot compute inverse of null operator"));
3064 const int ierr = tril_dst.PutScalar(0.0);
3071 ExcMessage(
"Cannot compute inverse of null operator"));
3073 const int ierr = tril_dst.PutScalar(0.0);
3112 # ifdef DEAL_II_WITH_MPI 3115 return MPI_COMM_SELF;
3177 return "TrilinosPayload";
3235 "Operators are set to work on incompatible IndexSets."));
3239 "Operators are set to work on incompatible IndexSets."));
3244 return_op.vmult = [first_op, second_op](
Range & tril_dst,
3245 const Domain &tril_src) {
3253 i->reinit(
IndexSet(first_op_init_map),
3258 const size_type i_local_size = i->end() - i->begin();
3260 static_cast<size_type>(
3261 first_op_init_map.NumMyPoints()));
3264 static_cast<size_type>(
3265 second_op_init_map.NumMyPoints()));
3266 (void)second_op_init_map;
3267 Intermediate tril_int(View,
3269 const_cast<TrilinosScalar *>(i->begin()),
3275 second_op.
Apply(tril_src, tril_int);
3276 first_op.
Apply(tril_src, tril_dst);
3277 const int ierr = tril_dst.Update(1.0, tril_int, 1.0);
3281 return_op.Tvmult = [first_op, second_op](
Domain & tril_dst,
3282 const Range &tril_src) {
3297 i->reinit(
IndexSet(first_op_init_map),
3302 const size_type i_local_size = i->end() - i->begin();
3304 static_cast<size_type>(
3305 first_op_init_map.NumMyPoints()));
3308 static_cast<size_type>(
3309 second_op_init_map.NumMyPoints()));
3310 (void)second_op_init_map;
3311 Intermediate tril_int(View,
3313 const_cast<TrilinosScalar *>(i->begin()),
3319 second_op.
Apply(tril_src, tril_int);
3320 first_op.
Apply(tril_src, tril_dst);
3321 const int ierr = tril_dst.Update(1.0, tril_int, 1.0);
3329 return_op.inv_vmult = [first_op, second_op](
Domain & tril_dst,
3330 const Range &tril_src) {
3338 i->reinit(
IndexSet(first_op_init_map),
3343 const size_type i_local_size = i->end() - i->begin();
3345 static_cast<size_type>(
3346 first_op_init_map.NumMyPoints()));
3349 static_cast<size_type>(
3350 second_op_init_map.NumMyPoints()));
3351 (void)second_op_init_map;
3352 Intermediate tril_int(View,
3354 const_cast<TrilinosScalar *>(i->begin()),
3362 const int ierr = tril_dst.Update(1.0, tril_int, 1.0);
3366 return_op.inv_Tvmult = [first_op, second_op](
Range & tril_dst,
3367 const Domain &tril_src) {
3382 i->reinit(
IndexSet(first_op_init_map),
3387 const size_type i_local_size = i->end() - i->begin();
3389 static_cast<size_type>(
3390 first_op_init_map.NumMyPoints()));
3393 static_cast<size_type>(
3394 second_op_init_map.NumMyPoints()));
3395 (void)second_op_init_map;
3396 Intermediate tril_int(View,
3398 const_cast<TrilinosScalar *>(i->begin()),
3406 const int ierr = tril_dst.Update(1.0, tril_int, 1.0);
3430 "Operators are set to work on incompatible IndexSets."));
3435 return_op.vmult = [first_op, second_op](
Range & tril_dst,
3436 const Domain &tril_src) {
3444 i->reinit(
IndexSet(first_op_init_map),
3449 const size_type i_local_size = i->end() - i->begin();
3451 static_cast<size_type>(
3452 first_op_init_map.NumMyPoints()));
3455 static_cast<size_type>(
3456 second_op_init_map.NumMyPoints()));
3457 (void)second_op_init_map;
3458 Intermediate tril_int(View,
3460 const_cast<TrilinosScalar *>(i->begin()),
3466 second_op.
Apply(tril_src, tril_int);
3467 first_op.
Apply(tril_int, tril_dst);
3470 return_op.Tvmult = [first_op, second_op](
Domain & tril_dst,
3471 const Range &tril_src) {
3486 i->reinit(
IndexSet(first_op_init_map),
3491 const size_type i_local_size = i->end() - i->begin();
3493 static_cast<size_type>(
3494 first_op_init_map.NumMyPoints()));
3497 static_cast<size_type>(
3498 second_op_init_map.NumMyPoints()));
3499 (void)second_op_init_map;
3500 Intermediate tril_int(View,
3502 const_cast<TrilinosScalar *>(i->begin()),
3507 first_op.
Apply(tril_src, tril_int);
3508 second_op.
Apply(tril_int, tril_dst);
3515 return_op.inv_vmult = [first_op, second_op](
Domain & tril_dst,
3516 const Range &tril_src) {
3524 i->reinit(
IndexSet(first_op_init_map),
3529 const size_type i_local_size = i->end() - i->begin();
3531 static_cast<size_type>(
3532 first_op_init_map.NumMyPoints()));
3535 static_cast<size_type>(
3536 second_op_init_map.NumMyPoints()));
3537 (void)second_op_init_map;
3538 Intermediate tril_int(View,
3540 const_cast<TrilinosScalar *>(i->begin()),
3550 return_op.inv_Tvmult = [first_op, second_op](
Range & tril_dst,
3551 const Domain &tril_src) {
3566 i->reinit(
IndexSet(first_op_init_map),
3571 const size_type i_local_size = i->end() - i->begin();
3573 static_cast<size_type>(
3574 first_op_init_map.NumMyPoints()));
3577 static_cast<size_type>(
3578 second_op_init_map.NumMyPoints()));
3579 (void)second_op_init_map;
3580 Intermediate tril_int(View,
3582 const_cast<TrilinosScalar *>(i->begin()),
3608 # include "trilinos_sparse_matrix.inst" 3622 const ::SparsityPattern &,
3631 const ::SparsityPattern &,
3641 const ::SparsityPattern &,
3656 const ::Vector<double> &)
const;
3660 const ::LinearAlgebra::distributed::Vector<double> &)
const;
3661 # ifdef DEAL_II_WITH_MPI 3665 const ::LinearAlgebra::EpetraWrappers::Vector &)
const;
3671 const ::Vector<double> &)
const;
3675 const ::LinearAlgebra::distributed::Vector<double> &)
const;
3676 # ifdef DEAL_II_WITH_MPI 3680 const ::LinearAlgebra::EpetraWrappers::Vector &)
const;
3686 const ::Vector<double> &)
const;
3690 const ::LinearAlgebra::distributed::Vector<double> &)
const;
3691 # ifdef DEAL_II_WITH_MPI 3695 const ::LinearAlgebra::EpetraWrappers::Vector &)
const;
3701 const ::Vector<double> &)
const;
3705 const ::LinearAlgebra::distributed::Vector<double> &)
const;
3706 # ifdef DEAL_II_WITH_MPI 3710 const ::LinearAlgebra::EpetraWrappers::Vector &)
const;
3714 DEAL_II_NAMESPACE_CLOSE
3716 #endif // DEAL_II_WITH_TRILINOS size_type row_length(const size_type row) const
Iterator lower_bound(Iterator first, Iterator last, const T &val)
static::ExceptionBase & ExcTrilinosError(int arg1)
const Epetra_Map & row_partitioner() const
virtual double NormInf() const override
const Epetra_Map & domain_partitioner() const
#define AssertDimension(dim1, dim2)
size_type memory_consumption() const
void Tmmult(SparseMatrix &C, const SparseMatrix &B, const MPI::Vector &V=MPI::Vector()) const
MPI_Comm get_mpi_communicator() const
TrilinosScalar frobenius_norm() const
TrilinosScalar matrix_norm_square(const MPI::Vector &v) const
virtual int SetUseTranspose(bool UseTranspose) override
static::ExceptionBase & ExcSourceEqualsDestination()
const Epetra_CrsMatrix & trilinos_matrix() const
static::ExceptionBase & ExcIO()
void clear_row(const size_type row, const TrilinosScalar new_diag_value=0)
const Epetra_FEVector & trilinos_vector() const
static::ExceptionBase & ExcScalarAssignmentOnlyForZeroValue()
Epetra_MultiVector VectorType
void vmult(VectorType &dst, const VectorType &src) const
std::function< void(VectorType &, const VectorType &)> inv_Tvmult
Epetra_CombineMode last_action
void reinit(const Vector &v, const bool omit_zeroing_entries=false, const bool allow_different_maps=false)
IndexSet locally_owned_domain_indices() const
#define AssertIndexRange(index, range)
void mmult(SparseMatrix &C, const SparseMatrix &B, const MPI::Vector &V=MPI::Vector()) const
size_type n_elements() const
TrilinosWrappers::types::int_type min_my_gid(const Epetra_BlockMap &map)
virtual const char * Label() const override
TrilinosScalar diag_element(const size_type i) const
std::function< void(VectorType &, const VectorType &)> Tvmult
std::pair< size_type, size_type > local_range() const
TrilinosPayload null_payload() const
static::ExceptionBase & ExcInvalidIndex(size_type arg1, size_type arg2)
#define AssertThrow(cond, exc)
const Epetra_FECrsGraph & trilinos_sparsity_pattern() const
static::ExceptionBase & ExcAccessToNonPresentElement(size_type arg1, size_type arg2)
SymmetricTensor< rank_, dim, typename ProductType< Number, OtherNumber >::type > operator+(const SymmetricTensor< rank_, dim, Number > &left, const SymmetricTensor< rank_, dim, OtherNumber > &right)
const Epetra_Comm & comm_self()
static::ExceptionBase & ExcTrilinosError(int arg1)
TrilinosScalar linfty_norm() const
SymmetricTensor< rank_, dim, Number > operator*(const SymmetricTensor< rank_, dim, Number > &t, const Number &factor)
std::unique_ptr< Epetra_CrsGraph > nonlocal_graph
static::ExceptionBase & ExcDivideByZero()
unsigned long long int global_dof_index
void clear_rows(const std::vector< size_type > &rows, const TrilinosScalar new_diag_value=0)
SparseMatrix & operator*=(const TrilinosScalar factor)
std::unique_ptr< Epetra_FECrsMatrix > matrix
TrilinosScalar matrix_scalar_product(const MPI::Vector &u, const MPI::Vector &v) const
virtual int Apply(const VectorType &X, VectorType &Y) const override
SparseMatrix & operator=(const SparseMatrix &)=delete
static::ExceptionBase & ExcAccessToNonlocalRow(std::size_t arg1)
::types::global_dof_index size_type
static::ExceptionBase & ExcMessage(std::string arg1)
virtual const Epetra_Map & OperatorRangeMap() const override
TrilinosScalar el(const size_type i, const size_type j) const
const IndexSet & row_index_set() const
void add(const size_type i, const size_type j, const TrilinosScalar value)
TrilinosPayload identity_payload() const
const Epetra_Map & domain_partitioner() const
#define Assert(cond, exc)
real_type l2_norm() const
static::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
std::unique_ptr< Epetra_Export > nonlocal_matrix_exporter
TrilinosWrappers::types::int_type n_global_cols(const Epetra_CrsGraph &graph)
TrilinosWrappers::types::int_type global_row_index(const Epetra_CrsMatrix &matrix, const ::types::global_dof_index i)
Epetra_MpiComm communicator
void Tvmult(VectorType &dst, const VectorType &src) const
std::function< void(VectorType &, const VectorType &)> inv_vmult
unsigned int local_size() const
TrilinosScalar operator()(const size_type i, const size_type j) const
const Epetra_Map & vector_partitioner() const
virtual int ApplyInverse(const VectorType &Y, VectorType &X) const override
virtual bool UseTranspose() const override
TrilinosWrappers::types::int_type global_column_index(const Epetra_CrsMatrix &matrix, const ::types::global_dof_index i)
Epetra_Map make_trilinos_map(const MPI_Comm &communicator=MPI_COMM_WORLD, const bool overlapping=false) const
TrilinosPayload transpose_payload() const
virtual const Epetra_Map & OperatorDomainMap() const override
size_type column_number(const size_type row, const size_type index) const
static::ExceptionBase & ExcNotQuadratic()
TrilinosWrappers::types::int_type n_global_elements(const Epetra_BlockMap &map)
void swap(Vector< Number > &u, Vector< Number > &v)
void set_size(const size_type size)
const Epetra_Map & range_partitioner() const
Epetra_Operator & trilinos_operator() const
size_type n_nonzero_elements() const
void reinit(const SparsityPatternType &sparsity_pattern)
const Epetra_CrsGraph & trilinos_sparsity_pattern() const
void copy_from(const SparseMatrix &source)
MPI_Comm get_mpi_communicator() const
void vmult_add(VectorType &dst, const VectorType &src) const
std::function< void(VectorType &, const VectorType &)> vmult
SparseMatrix & operator/=(const TrilinosScalar factor)
unsigned int row_length(const size_type row) const
TrilinosScalar l1_norm() const
TrilinosWrappers::types::int_type max_my_gid(const Epetra_BlockMap &map)
virtual const Epetra_Comm & Comm() const override
const Epetra_Map & col_partitioner() const
static::ExceptionBase & ExcNotImplemented()
bool is_element(const size_type index) const
TrilinosWrappers::types::int_type global_index(const Epetra_BlockMap &map, const ::types::global_dof_index i)
static::ExceptionBase & ExcMatrixNotCompressed()
IndexSet locally_owned_range_indices() const
std::unique_ptr< Epetra_Map > column_space_map
virtual bool HasNormInf() const override
void compress(::VectorOperation::values operation)
void print(std::ostream &out, const bool write_extended_trilinos_info=false) const
TrilinosScalar residual(MPI::Vector &dst, const MPI::Vector &x, const MPI::Vector &b) const
static::ExceptionBase & ExcAccessToNonLocalElement(size_type arg1, size_type arg2, size_type arg3, size_type arg4)
std::unique_ptr< Epetra_CrsMatrix > nonlocal_matrix
IndexSet locally_owned_range_indices() const
void reinit(const size_type m, const size_type n, const size_type n_entries_per_row=0)
void set(const size_type i, const size_type j, const TrilinosScalar value)
std::pair< size_type, size_type > local_range() const
void Tvmult_add(VectorType &dst, const VectorType &src) const
#define AssertIsFinite(number)
const Epetra_MultiVector & trilinos_vector() const
static::ExceptionBase & ExcInternalError()