18#ifdef DEAL_II_WITH_TRILINOS
30# include <boost/container/small_vector.hpp>
32# ifdef DEAL_II_TRILINOS_WITH_EPETRAEXT
33# include <EpetraExt_MatrixMatrix.h>
35# include <Epetra_Export.h>
36# include <Teuchos_RCP.hpp>
37# include <ml_epetra_utils.h>
38# include <ml_struct.h>
48 template <
typename VectorType>
49 typename VectorType::value_type *
55 template <
typename VectorType>
56 const typename VectorType::value_type *
62 template <
typename VectorType>
63 typename VectorType::value_type *
69 template <
typename VectorType>
70 const typename VectorType::value_type *
71 end(
const VectorType &V)
104# ifdef DEAL_II_TRILINOS_WITH_TPETRA
105 template <
typename Number,
typename MemorySpace>
112 template <
typename Number,
typename MemorySpace>
119 template <
typename Number,
typename MemorySpace>
127 template <
typename Number,
typename MemorySpace>
164 value_cache = std::make_shared<std::vector<TrilinosScalar>>(colnums);
165 colnum_cache = std::make_shared<std::vector<size_type>>(colnums);
205 : column_space_map(
new Epetra_Map(0, 0,
Utilities::Trilinos::comm_self()))
207 new Epetra_FECrsMatrix(View, *column_space_map, *column_space_map, 0))
233 matrix(
new Epetra_FECrsMatrix(
254 , matrix(
new Epetra_FECrsMatrix(
272 : column_space_map(
new Epetra_Map(
274 , matrix(
new Epetra_FECrsMatrix(
Copy,
287 : column_space_map(
new Epetra_Map(
289 , matrix(
new Epetra_FECrsMatrix(
Copy,
305 : column_space_map(
new Epetra_Map(
307 , matrix(
new Epetra_FECrsMatrix(
322 : column_space_map(
new Epetra_Map(
324 , matrix(
new Epetra_FECrsMatrix(
337 : column_space_map(
new Epetra_Map(sparsity_pattern.domain_partitioner()))
340 sparsity_pattern.trilinos_sparsity_pattern(),
347 "The Trilinos sparsity pattern has not been compressed."));
354 : column_space_map(std::move(
other.column_space_map))
355 , matrix(std::move(
other.matrix))
356 , nonlocal_matrix(std::move(
other.nonlocal_matrix))
357 , nonlocal_matrix_exporter(std::move(
other.nonlocal_matrix_exporter))
358 , last_action(
other.last_action)
359 , compressed(
other.compressed)
362 other.compressed =
false;
380 !
matrix->RowMap().SameAs(
rhs.matrix->RowMap()) ||
381 !
matrix->ColMap().SameAs(
rhs.matrix->ColMap()) ||
382 !
matrix->DomainMap().SameAs(
rhs.matrix->DomainMap()) ||
412 std::memcmp(
static_cast<void *
>(
index_ptr),
428 std::make_unique<Epetra_Map>(
rhs.trilinos_matrix().DomainMap());
431 matrix = std::make_unique<Epetra_FECrsMatrix>(*
rhs.matrix);
436 if (
rhs.nonlocal_matrix.get() !=
nullptr)
438 std::make_unique<Epetra_CrsMatrix>(
Copy,
rhs.nonlocal_matrix->Graph());
445 template <
typename SparsityPatternType>
452 std::unique_ptr<Epetra_Map> &column_space_map,
453 std::unique_ptr<Epetra_FECrsMatrix> &matrix,
454 std::unique_ptr<Epetra_CrsMatrix> &nonlocal_matrix,
455 std::unique_ptr<Epetra_Export> &nonlocal_matrix_exporter)
459 nonlocal_matrix.reset();
460 nonlocal_matrix_exporter.reset();
462 column_space_map = std::make_unique<Epetra_Map>(
465 if (column_space_map->Comm().MyPID() == 0)
488 matrix = std::make_unique<Epetra_FECrsMatrix>(
518 std::unique_ptr<Epetra_CrsGraph> graph;
520 graph = std::make_unique<Epetra_CrsGraph>(
Copy,
525 graph = std::make_unique<Epetra_CrsGraph>(
Copy,
536 std::vector<TrilinosWrappers::types::int_type> row_indices;
540 const int row_length = sparsity_pattern.row_length(row);
544 row_indices.resize(row_length, -1);
546 typename SparsityPatternType::iterator p =
547 sparsity_pattern.begin(row);
549 p != sparsity_pattern.end(row);
551 row_indices[col] = p->column();
553 graph->Epetra_CrsGraph::InsertGlobalIndices(row,
563 graph->OptimizeStorage();
571 matrix = std::make_unique<Epetra_FECrsMatrix>(
Copy, *graph,
false);
583 class Epetra_CrsGraphMod :
public Epetra_CrsGraph
586 Epetra_CrsGraphMod(
const Epetra_Map &
row_map,
594 this->Epetra_CrsGraph::SetIndicesAreGlobal(
true);
609 std::unique_ptr<Epetra_Map> &column_space_map,
610 std::unique_ptr<Epetra_FECrsMatrix> &matrix,
611 std::unique_ptr<Epetra_CrsMatrix> &nonlocal_matrix,
612 std::unique_ptr<Epetra_Export> &nonlocal_matrix_exporter)
615 nonlocal_matrix.reset();
616 nonlocal_matrix_exporter.reset();
618 column_space_map = std::make_unique<Epetra_Map>(
642 "Locally relevant rows of sparsity pattern must contain "
643 "all locally owned rows"));
649 const std::vector<::types::global_dof_index> indices =
663 std::vector<TrilinosWrappers::types::int_type>
ghost_rows;
674 else if (sparsity_pattern.
row_length(global_row) > 0)
691 std::unique_ptr<Epetra_CrsGraph> graph;
692 std::unique_ptr<Epetra_CrsGraphMod> nonlocal_graph;
696 std::make_unique<Epetra_CrsGraph>(
Copy,
703 nonlocal_graph = std::make_unique<Epetra_CrsGraphMod>(
708 std::make_unique<Epetra_CrsGraph>(
Copy,
717 std::vector<TrilinosWrappers::types::int_type> row_indices;
721 const int row_length = sparsity_pattern.
row_length(global_row);
725 row_indices.resize(row_length, -1);
726 for (
int col = 0; col < row_length; ++col)
727 row_indices[col] = sparsity_pattern.
column_number(global_row, col);
731 graph->InsertGlobalIndices(global_row,
737 nonlocal_graph->InsertGlobalIndices(global_row,
744 if (nonlocal_graph.get() !=
nullptr)
750 nonlocal_graph->SetIndicesAreGlobal();
751 Assert(nonlocal_graph->IndicesAreGlobal() ==
true,
753 nonlocal_graph->FillComplete(*column_space_map,
row_space_map);
754 nonlocal_graph->OptimizeStorage();
766 std::make_unique<Epetra_CrsMatrix>(
Copy, *nonlocal_graph);
770 graph->OptimizeStorage();
775 matrix = std::make_unique<Epetra_FECrsMatrix>(
Copy, *graph,
false);
781 template <
typename SparsityPatternType>
798 template <
typename SparsityPatternType>
799 inline std::enable_if_t<
800 !std::is_same_v<SparsityPatternType, ::SparseMatrix<double>>>
834 matrix = std::make_unique<Epetra_FECrsMatrix>(
839 std::make_unique<Epetra_CrsMatrix>(
Copy,
857 std::make_unique<Epetra_Map>(
sparse_matrix.trilinos_matrix().DomainMap());
860 matrix = std::make_unique<Epetra_FECrsMatrix>(
875 template <
typename number>
884 const ::SparsityPattern *use_this_sparsity)
890 if (use_this_sparsity ==
nullptr)
910 const ::SparsityPattern &sparsity_pattern =
911 (use_this_sparsity !=
nullptr) ?
915 if (
matrix.get() ==
nullptr ||
m() != n_rows ||
934 for (
size_type row = 0; row < n_rows; ++row)
939 sparsity_pattern.begin(row);
940 typename ::SparseMatrix<number>::const_iterator
it =
943 if (sparsity_pattern.n_rows() == sparsity_pattern.n_cols())
949 values[col] =
it->value();
950 row_indices[col++] =
it->column();
970 values[col] =
it->value();
971 row_indices[col++] =
it->column();
978 reinterpret_cast<size_type *
>(row_indices.data()),
987 template <
typename number>
993 const ::SparsityPattern *use_this_sparsity)
1011 ExcMessage(
"Input CrsMatrix has not called FillComplete()!"));
1020 matrix = std::make_unique<Epetra_FECrsMatrix>(
Copy, *graph,
false);
1055 "compress() can only be called with VectorOperation add, insert, or unknown"));
1062 ExcMessage(
"Operation and argument to compress() do not match"));
1157 for (
const auto row : rows)
1356 return static_cast<unsigned int>(
ncols);
1367 Assert(row_indices.size() == values.m(),
1372 for (
size_type i = 0; i < row_indices.size(); ++i)
1385 const std::vector<TrilinosScalar> &values,
1402 SparseMatrix::set<TrilinosScalar>(
const size_type row,
1428 boost::container::small_vector<TrilinosWrappers::types::int_type, 200>
1452 const double value = values[
j];
1474 if (
matrix->RowMap().MyGID(
1477 if (
matrix->Filled() ==
false)
1479 ierr =
matrix->Epetra_CrsMatrix::InsertGlobalValues(
1489 ierr =
matrix->Epetra_CrsMatrix::ReplaceGlobalValues(row,
1504 if (
matrix->Filled() ==
false)
1511 Epetra_FECrsMatrix::ROW_MAJOR);
1521 Epetra_FECrsMatrix::ROW_MAJOR);
1540 Assert(indices.size() == values.m(),
1544 for (
size_type i = 0; i < indices.size(); ++i)
1560 Assert(row_indices.size() == values.m(),
1565 for (
size_type i = 0; i < row_indices.size(); ++i)
1578 const std::vector<TrilinosScalar> &values,
1625 boost::container::small_vector<TrilinosWrappers::types::int_type, 100>
1653 const double value = values[
j];
1675 if (
matrix->RowMap().MyGID(
1678 ierr =
matrix->Epetra_CrsMatrix::SumIntoGlobalValues(row,
1692 ExcMessage(
"Attempted to write into off-processor matrix row "
1693 "that has not be specified as being writable upon "
1716 Epetra_FECrsMatrix::ROW_MAJOR);
1723 std::cout <<
"------------------------------------------" << std::endl;
1724 std::cout <<
"Got error " <<
ierr <<
" in row " << row <<
" of proc "
1725 <<
matrix->RowMap().Comm().MyPID()
1726 <<
" when trying to add the columns:" << std::endl;
1729 std::cout << std::endl << std::endl;
1730 std::cout <<
"Matrix row "
1731 << (
matrix->RowMap().MyGID(
1736 <<
" has the following indices:" << std::endl;
1737 std::vector<TrilinosWrappers::types::int_type> indices;
1738 const Epetra_CrsGraph *graph =
1745 indices.resize(graph->NumGlobalIndices(row));
1747 graph->ExtractGlobalRowCopy(row,
1754 std::cout << indices[i] <<
" ";
1755 std::cout << std::endl << std::endl;
1798 ExcMessage(
"Can only add matrices with same distribution of rows"));
1800 ExcMessage(
"Addition of matrices only allowed if matrices are "
1801 "filled, i.e., compress() has been called"));
1859 "Adding the entries from the other matrix "
1860 "failed, because the sparsity pattern "
1861 "of that matrix includes more elements than the "
1862 "calling matrix, which is not allowed."));
1881 if (!
matrix->UseTranspose())
1927 return matrix->NormOne();
1936 return matrix->NormInf();
1945 return matrix->NormFrobenius();
1952 namespace SparseMatrixImplementation
1954 template <
typename VectorType>
1967 ExcMessage(
"The column partitioning of a matrix does not match "
1968 "the partitioning of a vector you are trying to "
1969 "multiply it with. Are you multiplying the "
1970 "matrix with a vector that has ghost elements?"));
1972 ExcMessage(
"The row partitioning of a matrix does not match "
1973 "the partitioning of a vector you are trying to "
1974 "put the result of a matrix-vector product in. "
1975 "Are you trying to put the product of the "
1976 "matrix with a vector into a vector that has "
1977 "ghost elements?"));
1986 template <
typename VectorType>
1988 std::is_same_v<typename VectorType::value_type, TrilinosScalar>>
2020 template <
typename VectorType>
2022 !std::is_same_v<typename VectorType::value_type, TrilinosScalar>>
2030 template <
typename VectorType>
2032 std::is_same_v<typename VectorType::value_type, TrilinosScalar>>
2061 template <
typename VectorType>
2063 !std::is_same_v<typename VectorType::value_type, TrilinosScalar>>
2071 template <
typename VectorType>
2087 template <
typename VectorType>
2151 ExcMessage(
"Parallel partitioning of A and B does not fit."));
2159 ExcMessage(
"Parallel partitioning of A and B does not fit."));
2180 new Epetra_CrsMatrix(
Copy,
inputright.trilinos_sparsity_pattern()),
2185 ExcMessage(
"Parallel distribution of matrix B and vector V "
2186 "does not match."));
2189 for (
int i = 0; i <
local_N; ++i)
2194 inputright.trilinos_matrix().ExtractMyRowView(i,
2205 inputleft.locally_owned_domain_indices() :
2206 inputleft.locally_owned_range_indices(),
2210# ifdef DEAL_II_TRILINOS_WITH_EPETRAEXT
2211 EpetraExt::MatrixMatrix::Multiply(
inputleft.trilinos_matrix(),
2215 const_cast<Epetra_CrsMatrix &
>(
2219 ExcMessage(
"This function requires that the Trilinos "
2220 "installation found while running the deal.II "
2221 "CMake scripts contains the optional Trilinos "
2222 "package 'EpetraExt'. However, this optional "
2223 "part of Trilinos was not found."));
2273 for (
int i = 0; i <
matrix->NumMyRows(); ++i)
2284 <<
") " << values[
j] << std::endl;
2297 sizeof(*this) +
sizeof(*matrix) +
sizeof(*
matrix->Graph().DataPtr());
2300 matrix->NumMyNonzeros() +
2309 const Epetra_MpiComm *mpi_comm =
2310 dynamic_cast<const Epetra_MpiComm *
>(&
matrix->RangeMap().Comm());
2312 return mpi_comm->Comm();
2321 namespace LinearOperatorImplementation
2326 : use_transpose(
false)
2328 , domain_map(
IndexSet().make_trilinos_map(communicator.Comm()))
2329 , range_map(
IndexSet().make_trilinos_map(communicator.Comm()))
2333 ExcMessage(
"Uninitialized TrilinosPayload::vmult called "
2334 "(Default constructor)"));
2339 ExcMessage(
"Uninitialized TrilinosPayload::Tvmult called "
2340 "(Default constructor)"));
2345 ExcMessage(
"Uninitialized TrilinosPayload::inv_vmult called "
2346 "(Default constructor)"));
2351 ExcMessage(
"Uninitialized TrilinosPayload::inv_Tvmult called "
2352 "(Default constructor)"));
2362 matrix.trilinos_matrix()),
2377 matrix.trilinos_matrix()),
2404 preconditioner.trilinos_operator(),
2430 , inv_vmult(
payload.inv_vmult)
2431 , inv_Tvmult(
payload.inv_Tvmult)
2432 , use_transpose(
payload.use_transpose)
2433 , communicator(
payload.communicator)
2434 , domain_map(
payload.domain_map)
2435 , range_map(
payload.range_map)
2444 : use_transpose(
false)
2447 communicator(
first_op.communicator)
2499 ExcMessage(
"Cannot compute inverse of null operator"));
2508 ExcMessage(
"Cannot compute inverse of null operator"));
2610 return "TrilinosPayload";
2666 second_op.locally_owned_domain_indices(),
2668 "Operators are set to work on incompatible IndexSets."));
2670 second_op.locally_owned_range_indices(),
2672 "Operators are set to work on incompatible IndexSets."));
2846 second_op.locally_owned_range_indices(),
2848 "Operators are set to work on incompatible IndexSets."));
3010# include "trilinos_sparse_matrix.inst"
3025 const ::SparsityPattern &,
3041 const ::Vector<double> &)
const;
3046 const ::LinearAlgebra::distributed::Vector<double, MemorySpace::Host>
3052 const ::LinearAlgebra::distributed::Vector<float, MemorySpace::Host>
3055# ifdef DEAL_II_TRILINOS_WITH_TPETRA
3056# if defined(HAVE_TPETRA_INST_DOUBLE)
3060 const ::LinearAlgebra::TpetraWrappers::Vector<
double,
3067 const ::LinearAlgebra::TpetraWrappers::Vector<
double,
3072# if defined(HAVE_TPETRA_INST_FLOAT)
3076 const ::LinearAlgebra::TpetraWrappers::Vector<
float,
3083 const ::LinearAlgebra::TpetraWrappers::Vector<
float,
3092 const ::LinearAlgebra::EpetraWrappers::Vector &)
const;
3099 const ::Vector<double> &)
const;
3104 const ::LinearAlgebra::distributed::Vector<double, MemorySpace::Host>
3107# ifdef DEAL_II_TRILINOS_WITH_TPETRA
3108# if defined(HAVE_TPETRA_INST_DOUBLE)
3112 const ::LinearAlgebra::TpetraWrappers::Vector<
double,
3119 const ::LinearAlgebra::TpetraWrappers::Vector<
double,
3124# if defined(HAVE_TPETRA_INST_FLOAT)
3128 const ::LinearAlgebra::TpetraWrappers::Vector<
float,
3135 const ::LinearAlgebra::TpetraWrappers::Vector<
float,
3144 const ::LinearAlgebra::EpetraWrappers::Vector &)
const;
3151 const ::Vector<double> &)
const;
3156 const ::LinearAlgebra::distributed::Vector<double, MemorySpace::Host>
3159# ifdef DEAL_II_TRILINOS_WITH_TPETRA
3160# if defined(HAVE_TPETRA_INST_DOUBLE)
3164 const ::LinearAlgebra::TpetraWrappers::Vector<
double,
3171 const ::LinearAlgebra::TpetraWrappers::Vector<
double,
3176# if defined(HAVE_TPETRA_INST_FLOAT)
3180 const ::LinearAlgebra::TpetraWrappers::Vector<
float,
3187 const ::LinearAlgebra::TpetraWrappers::Vector<
float,
3196 const ::LinearAlgebra::EpetraWrappers::Vector &)
const;
3203 const ::Vector<double> &)
const;
3208 const ::LinearAlgebra::distributed::Vector<double, MemorySpace::Host>
3214 const ::LinearAlgebra::distributed::Vector<float, MemorySpace::Host>
3218# ifdef DEAL_II_TRILINOS_WITH_TPETRA
3219# if defined(HAVE_TPETRA_INST_DOUBLE)
3223 const ::LinearAlgebra::TpetraWrappers::Vector<
double,
3230 const ::LinearAlgebra::TpetraWrappers::Vector<
double,
3235# if defined(HAVE_TPETRA_INST_FLOAT)
3239 const ::LinearAlgebra::TpetraWrappers::Vector<
float,
3246 const ::LinearAlgebra::TpetraWrappers::Vector<
float,
3255 const ::LinearAlgebra::EpetraWrappers::Vector &)
const;
const IndexSet & row_index_set() const
size_type row_length(const size_type row) const
size_type column_number(const size_type row, const size_type index) const
const Epetra_FEVector & trilinos_vector() const
const TpetraTypes::VectorType< Number, MemorySpace > & trilinos_vector() const
const Epetra_BlockMap & trilinos_partitioner() const
size_type size() const override
const Epetra_MultiVector & trilinos_vector() const
std::pair< size_type, size_type > local_range() const
std::shared_ptr< std::vector< TrilinosScalar > > value_cache
std::shared_ptr< std::vector< size_type > > colnum_cache
void set(const size_type i, const size_type j, const TrilinosScalar value)
std::unique_ptr< Epetra_Map > column_space_map
MPI_Comm get_mpi_communicator() const
SparseMatrix & operator*=(const TrilinosScalar factor)
void mmult(SparseMatrix &C, const SparseMatrix &B, const MPI::Vector &V=MPI::Vector()) const
std::unique_ptr< Epetra_Export > nonlocal_matrix_exporter
TrilinosScalar l1_norm() const
void compress(VectorOperation::values operation)
std::unique_ptr< Epetra_FECrsMatrix > matrix
TrilinosScalar linfty_norm() const
const Epetra_CrsMatrix & trilinos_matrix() const
size_type memory_consumption() const
TrilinosScalar matrix_norm_square(const MPI::Vector &v) const
Epetra_CombineMode last_action
IndexSet locally_owned_range_indices() const
void print(std::ostream &out, const bool write_extended_trilinos_info=false) const
void Tmmult(SparseMatrix &C, const SparseMatrix &B, const MPI::Vector &V=MPI::Vector()) const
std::enable_if_t< std::is_same_v< typename VectorType::value_type, TrilinosScalar > > Tvmult(VectorType &dst, const VectorType &src) const
void clear_row(const size_type row, const TrilinosScalar new_diag_value=0)
void clear_rows(const ArrayView< const size_type > &rows, const TrilinosScalar new_diag_value=0)
void reinit(const SparsityPatternType &sparsity_pattern)
void vmult_add(VectorType &dst, const VectorType &src) const
SparseMatrix & operator=(const SparseMatrix &)=delete
SparseMatrix & operator/=(const TrilinosScalar factor)
void Tvmult_add(VectorType &dst, const VectorType &src) const
TrilinosScalar el(const size_type i, const size_type j) const
bool in_local_range(const size_type index) const
void copy_from(const SparseMatrix &source)
unsigned int row_length(const size_type row) const
TrilinosScalar frobenius_norm() const
std::uint64_t n_nonzero_elements() const
std::enable_if_t< std::is_same_v< typename VectorType::value_type, TrilinosScalar > > vmult(VectorType &dst, const VectorType &src) const
TrilinosScalar diag_element(const size_type i) const
void add(const size_type i, const size_type j, const TrilinosScalar value)
unsigned int local_size() const
TrilinosScalar operator()(const size_type i, const size_type j) const
TrilinosScalar matrix_scalar_product(const MPI::Vector &u, const MPI::Vector &v) const
std::pair< size_type, size_type > local_range() const
std::unique_ptr< Epetra_CrsMatrix > nonlocal_matrix
std::unique_ptr< Epetra_CrsGraph > nonlocal_graph
const Epetra_Map & domain_partitioner() const
const Epetra_FECrsGraph & trilinos_sparsity_pattern() const
::types::global_dof_index size_type
Epetra_MpiComm communicator
std::function< void(VectorType &, const VectorType &)> inv_Tvmult
virtual int SetUseTranspose(bool UseTranspose) override
virtual bool UseTranspose() const override
virtual const Epetra_Map & OperatorDomainMap() const override
IndexSet locally_owned_range_indices() const
TrilinosPayload transpose_payload() const
Epetra_MultiVector VectorType
MPI_Comm get_mpi_communicator() const
virtual int ApplyInverse(const VectorType &Y, VectorType &X) const override
std::function< void(VectorType &, const VectorType &)> Tvmult
virtual int Apply(const VectorType &X, VectorType &Y) const override
std::function< void(VectorType &, const VectorType &)> vmult
virtual const Epetra_Map & OperatorRangeMap() const override
std::function< void(VectorType &, const VectorType &)> inv_vmult
virtual const char * Label() const override
IndexSet locally_owned_domain_indices() const
virtual const Epetra_Comm & Comm() const override
virtual bool HasNormInf() const override
TrilinosPayload identity_payload() const
virtual double NormInf() const override
TrilinosPayload null_payload() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcIO()
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcScalarAssignmentOnlyForZeroValue()
static ::ExceptionBase & ExcInvalidIndex(size_type arg1, size_type arg2)
#define Assert(cond, exc)
static ::ExceptionBase & ExcAccessToNonPresentElement(size_type arg1, size_type arg2)
#define AssertIsFinite(number)
static ::ExceptionBase & ExcAccessToNonlocalRow(std::size_t arg1)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDivideByZero()
static ::ExceptionBase & ExcSourceEqualsDestination()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcNotQuadratic()
static ::ExceptionBase & ExcMatrixNotCompressed()
static ::ExceptionBase & ExcTrilinosError(int arg1)
static ::ExceptionBase & ExcAccessToNonLocalElement(size_type arg1, size_type arg2, size_type arg3, size_type arg4)
static ::ExceptionBase & ExcMessage(std::string arg1)
static ::ExceptionBase & ExcTrilinosError(int arg1)
#define AssertThrow(cond, exc)
#define DEAL_II_NOT_IMPLEMENTED()
IndexSet complete_index_set(const IndexSet::size_type N)
std::vector< index_type > data
@ matrix
Contents is actually a matrix.
TrilinosPayload operator+(const TrilinosPayload &first_op, const TrilinosPayload &second_op)
TrilinosPayload operator*(const TrilinosPayload &first_op, const TrilinosPayload &second_op)
void check_vector_map_equality(const Epetra_CrsMatrix &, const VectorType &, const VectorType &)
VectorType::value_type * end(VectorType &V)
VectorType::value_type * begin(VectorType &V)
void perform_mmult(const SparseMatrix &inputleft, const SparseMatrix &inputright, SparseMatrix &result, const MPI::Vector &V, const bool transpose_left)
TrilinosWrappers::types::int_type min_my_gid(const Epetra_BlockMap &map)
TrilinosWrappers::types::int64_type n_global_elements(const Epetra_BlockMap &map)
TrilinosWrappers::types::int_type global_column_index(const Epetra_CrsMatrix &matrix, const ::types::global_dof_index i)
TrilinosWrappers::types::int_type max_my_gid(const Epetra_BlockMap &map)
TrilinosWrappers::types::int_type global_row_index(const Epetra_CrsMatrix &matrix, const ::types::global_dof_index i)
TrilinosWrappers::types::int_type n_global_cols(const Epetra_CrsGraph &graph)
const Epetra_Comm & comm_self()
Iterator lower_bound(Iterator first, Iterator last, const T &val)