13#ifndef dealii_trilinos_sparse_matrix_h
14# define dealii_trilinos_sparse_matrix_h
19# ifndef DEAL_II_TRILINOS_WITH_EPETRA
25# ifdef DEAL_II_TRILINOS_WITH_EPETRA
39# include <Epetra_Comm.h>
40# include <Epetra_CrsGraph.h>
41# include <Epetra_Export.h>
42# include <Epetra_FECrsMatrix.h>
43# include <Epetra_Map.h>
44# include <Epetra_MpiComm.h>
45# include <Epetra_MultiVector.h>
46# include <Epetra_Operator.h>
52# include <type_traits>
59# ifdef DEAL_II_TRILINOS_WITH_EPETRA
62template <
typename MatrixType>
65template <
typename number>
77 template <
bool Constness>
102 <<
"You tried to access row " << arg1
103 <<
" of a distributed sparsity pattern, "
104 <<
" but only rows " << arg2 <<
" through " << arg3
105 <<
" are stored locally and can be accessed.");
203 template <
bool Constess>
244 template <
bool Other>
341 friend class Reference;
357 template <
bool Constness>
393 template <
bool Other>
424 template <
bool OtherConstness>
431 template <
bool OtherConstness>
440 template <
bool OtherConstness>
447 template <
bool OtherConstness>
457 <<
"Attempt to access element " << arg2 <<
" of row "
458 << arg1 <<
" which doesn't have that many elements.");
466 template <
bool Other>
477 template <
bool Constness>
483 typename ::TrilinosWrappers::SparseMatrixIterators::Iterator<
486 typename ::TrilinosWrappers::SparseMatrixIterators::Iterator<
569 <<
"You tried to access row " << arg1
570 <<
" of a non-contiguous locally owned row set."
571 <<
" The row " << arg1
572 <<
" is not stored locally and can't be accessed.");
623 const unsigned int n_max_entries_per_row);
634 const std::vector<unsigned int> &n_entries_per_row);
678 template <
typename SparsityPatternType>
680 reinit(
const SparsityPatternType &sparsity_pattern);
728 template <
typename number>
730 reinit(const ::SparseMatrix<number> &dealii_sparse_matrix,
731 const double drop_tolerance = 1e-13,
732 const bool copy_values =
true,
733 const ::SparsityPattern *use_this_sparsity =
nullptr);
741 reinit(
const Epetra_CrsMatrix &input_matrix,
const bool copy_values =
true);
762 const unsigned int n_max_entries_per_row);
765 "Use the overload specifying the number of entries per row!")
770 "Use the overload specifying the MPI communicator and the number of entries per row!")
782 const
std::vector<
unsigned int> &n_entries_per_row);
799 const
IndexSet &col_parallel_partitioning,
804 "Use the overload specifying the number of entries per row!")
806 const
IndexSet &col_parallel_partitioning,
810 "Use the overload specifying the MPI communicator and the number of entries per row!")
812 const
IndexSet &col_parallel_partitioning);
829 const
IndexSet &col_parallel_partitioning,
831 const
std::vector<
unsigned int> &n_entries_per_row);
853 template <typename SparsityPatternType>
856 const SparsityPatternType &sparsity_pattern,
857 const
MPI_Comm communicator = MPI_COMM_WORLD,
858 const
bool exchange_data = false);
872 template <typename SparsityPatternType>
876 const
IndexSet &col_parallel_partitioning,
877 const SparsityPatternType &sparsity_pattern,
878 const
MPI_Comm communicator = MPI_COMM_WORLD,
879 const
bool exchange_data = false);
897 template <typename number>
901 const
MPI_Comm communicator = MPI_COMM_WORLD,
902 const
double drop_tolerance = 1e-13,
903 const
bool copy_values = true,
919 template <typename number>
922 const
IndexSet &col_parallel_partitioning,
924 const
MPI_Comm communicator = MPI_COMM_WORLD,
925 const
double drop_tolerance = 1e-13,
926 const
bool copy_values = true,
1027 operator=(const
double d);
1128 const
bool elide_zero_values = false);
1139 const
bool elide_zero_values = false);
1172 const
bool elide_zero_values = false);
1201 template <typename Number>
1206 const Number *values,
1207 const
bool elide_zero_values = false);
1242 const
bool elide_zero_values = true);
1253 const
bool elide_zero_values = true);
1272 const
bool elide_zero_values = true);
1292 const
bool elide_zero_values = true,
1293 const
bool col_indices_are_sorted = false);
1465 template <typename VectorType>
1467 vmult(VectorType &dst, const VectorType &src) const;
1479 template <typename VectorType>
1481 Tvmult(VectorType &dst, const VectorType &src) const;
1492 template <typename VectorType>
1494 vmult_add(VectorType &dst, const VectorType &src) const;
1506 template <typename VectorType>
1508 Tvmult_add(VectorType &dst, const VectorType &src) const;
1572 template <typename VectorType>
1574 residual(VectorType &dst, const VectorType &x, const VectorType &b) const;
1661 const Epetra_CrsMatrix &
1668 const Epetra_CrsGraph &
1818 const
bool write_extended_trilinos_info = false) const;
1831 << "An error with error number " << arg1
1832 << " occurred while calling a Trilinos function. "
1834 "For historical reasons, many Trilinos functions express "
1835 "errors by returning specific integer values to indicate "
1836 "certain errors. Unfortunately, different Trilinos functions "
1837 "often use the same integer values
for different kinds of "
1838 "errors, and in most cases it is also not documented what "
1839 "each error code actually means. As a consequence, it is often "
1840 "difficult to say what a particular error (in this case, "
1841 "the error with integer code '"
1843 << "') represents and how one should fix a code to avoid it. "
1844 "The best one can often do is to look up the call stack to "
1845 "see which deal.II function generated the error, and which "
1846 "Trilinos function the error code had originated from; "
1847 "then look up the Trilinos source code of that function (
for "
1848 "example on github) to see what code path
set that error "
1849 "code. Short of going through all of that, the only other "
1850 "option is to guess the cause of the error from "
1851 "the context in which the error appeared.");
1860 << "The entry with index <" << arg1 << ',' << arg2
1861 << "> does not exist.");
1867 "You are attempting an operation on two vectors that "
1868 "are the same
object, but the operation requires that the "
1869 "two objects are in fact different.");
1884 << "You tried to access element (" << arg1 << '/' << arg2
1886 << " of a distributed
matrix, but only rows in range ["
1887 << arg3 << ',' << arg4
1888 << "] are stored locally and can be accessed.");
1896 << "You tried to access element (" << arg1 << '/' << arg2
1897 << ')' << " of a sparse
matrix, but it appears to not"
1898 << " exist in the Trilinos sparsity pattern.");
1988 const Epetra_MultiVector &src,
1989 const Epetra_MultiVector &dst,
1994 Assert(src.Map().SameAs(mtrx.DomainMap()) ==
true,
1996 "Column map of matrix does not fit with vector map!"));
1997 Assert(dst.Map().SameAs(mtrx.RangeMap()) ==
true,
1998 ExcMessage(
"Row map of matrix does not fit with vector map!"));
2002 Assert(src.Map().SameAs(mtrx.RangeMap()) ==
true,
2004 "Column map of matrix does not fit with vector map!"));
2005 Assert(dst.Map().SameAs(mtrx.DomainMap()) ==
true,
2006 ExcMessage(
"Row map of matrix does not fit with vector map!"));
2012 const Epetra_MultiVector &src,
2013 const Epetra_MultiVector &dst,
2018 Assert(src.Map().SameAs(op.OperatorDomainMap()) ==
true,
2020 "Column map of operator does not fit with vector map!"));
2021 Assert(dst.Map().SameAs(op.OperatorRangeMap()) ==
true,
2023 "Row map of operator does not fit with vector map!"));
2027 Assert(src.Map().SameAs(op.OperatorRangeMap()) ==
true,
2029 "Column map of operator does not fit with vector map!"));
2030 Assert(dst.Map().SameAs(op.OperatorDomainMap()) ==
true,
2032 "Row map of operator does not fit with vector map!"));
2037 namespace LinearOperatorImplementation
2152 identity_payload()
const;
2158 null_payload()
const;
2164 transpose_payload()
const;
2182 template <
typename Solver,
typename Preconditioner>
2184 std::is_base_of_v<TrilinosWrappers::SolverBase, Solver> &&
2207 template <
typename Solver,
typename Preconditioner>
2209 !(std::is_base_of_v<TrilinosWrappers::SolverBase, Solver> &&
2228 locally_owned_domain_indices()
const;
2236 locally_owned_range_indices()
const;
2242 get_mpi_communicator()
const;
2305 UseTranspose()
const override;
2323 SetUseTranspose(
bool UseTranspose)
override;
2372 virtual const char *
2373 Label()
const override;
2382 virtual const Epetra_Comm &
2383 Comm()
const override;
2392 virtual const Epetra_Map &
2393 OperatorDomainMap()
const override;
2403 virtual const Epetra_Map &
2404 OperatorRangeMap()
const override;
2417 template <
typename EpetraOpType>
2419 const bool supports_inverse_operations,
2420 const bool use_transpose,
2422 const IndexSet &locally_owned_domain_indices,
2423 const IndexSet &locally_owned_range_indices);
2458 HasNormInf()
const override;
2468 NormInf()
const override;
2498 inline AccessorBase::AccessorBase(
SparseMatrix *matrix,
2505 visit_present_row();
2509 inline AccessorBase::size_type
2510 AccessorBase::row()
const
2512 Assert(a_row < matrix->m(), ExcBeyondEndOfMatrix());
2517 inline AccessorBase::size_type
2518 AccessorBase::column()
const
2521 return (*colnum_cache)[a_index];
2525 inline AccessorBase::size_type
2526 AccessorBase::index()
const
2533 inline Accessor<true>::Accessor(MatrixType *matrix,
2540 template <
bool Other>
2541 inline Accessor<true>::Accessor(
const Accessor<Other> &other)
2542 : AccessorBase(other)
2547 Accessor<true>::value()
const
2550 return (*value_cache)[a_index];
2554 inline Accessor<false>::Reference::Reference(
const Accessor<false> &acc)
2555 : accessor(const_cast<Accessor<false> &>(acc))
2559 inline Accessor<false>::Reference::operator
TrilinosScalar()
const
2561 return (*accessor.value_cache)[accessor.a_index];
2564 inline const Accessor<false>::Reference &
2565 Accessor<false>::Reference::operator=(
const TrilinosScalar n)
const
2567 (*accessor.value_cache)[accessor.a_index] = n;
2568 accessor.matrix->set(accessor.row(),
2575 inline const Accessor<false>::Reference &
2576 Accessor<false>::Reference::operator+=(
const TrilinosScalar n)
const
2578 (*accessor.value_cache)[accessor.a_index] += n;
2579 accessor.matrix->set(accessor.row(),
2586 inline const Accessor<false>::Reference &
2587 Accessor<false>::Reference::operator-=(
const TrilinosScalar n)
const
2589 (*accessor.value_cache)[accessor.a_index] -= n;
2590 accessor.matrix->set(accessor.row(),
2597 inline const Accessor<false>::Reference &
2598 Accessor<false>::Reference::operator*=(
const TrilinosScalar n)
const
2600 (*accessor.value_cache)[accessor.a_index] *= n;
2601 accessor.matrix->set(accessor.row(),
2608 inline const Accessor<false>::Reference &
2609 Accessor<false>::Reference::operator/=(
const TrilinosScalar n)
const
2611 (*accessor.value_cache)[accessor.a_index] /= n;
2612 accessor.matrix->set(accessor.row(),
2619 inline Accessor<false>::Accessor(MatrixType *matrix,
2626 inline Accessor<false>::Reference
2627 Accessor<false>::value()
const
2635 template <
bool Constness>
2636 inline Iterator<Constness>::Iterator(MatrixType *matrix,
2643 template <
bool Constness>
2644 template <
bool Other>
2645 inline Iterator<Constness>::Iterator(
const Iterator<Other> &other)
2646 : accessor(other.accessor)
2650 template <
bool Constness>
2651 inline Iterator<Constness> &
2652 Iterator<Constness>::operator++()
2662 if (accessor.a_index >= accessor.colnum_cache->size())
2664 accessor.a_index = 0;
2667 while ((accessor.a_row < accessor.matrix->m()) &&
2668 ((accessor.matrix->in_local_range(accessor.a_row) ==
false) ||
2669 (accessor.matrix->row_length(accessor.a_row) == 0)))
2672 accessor.visit_present_row();
2678 template <
bool Constness>
2679 inline Iterator<Constness>
2680 Iterator<Constness>::operator++(
int)
2682 const Iterator<Constness> old_state = *
this;
2689 template <
bool Constness>
2690 inline const Accessor<Constness> &
2691 Iterator<Constness>::operator*()
const
2698 template <
bool Constness>
2699 inline const Accessor<Constness> *
2700 Iterator<Constness>::operator->()
const
2707 template <
bool Constness>
2708 template <
bool OtherConstness>
2710 Iterator<Constness>::operator==(
const Iterator<OtherConstness> &other)
const
2712 return (accessor.a_row == other.accessor.a_row &&
2713 accessor.a_index == other.accessor.a_index);
2718 template <
bool Constness>
2719 template <
bool OtherConstness>
2721 Iterator<Constness>::operator!=(
const Iterator<OtherConstness> &other)
const
2723 return !(*
this == other);
2728 template <
bool Constness>
2729 template <
bool OtherConstness>
2731 Iterator<Constness>::operator<(
const Iterator<OtherConstness> &other)
const
2733 return (accessor.row() < other.accessor.row() ||
2734 (accessor.row() == other.accessor.row() &&
2735 accessor.index() < other.accessor.index()));
2739 template <
bool Constness>
2740 template <
bool OtherConstness>
2742 Iterator<Constness>::operator>(
const Iterator<OtherConstness> &other)
const
2744 return (other < *
this);
2769 if (in_local_range(r) && (row_length(r) > 0))
2784 for (size_type i = r + 1; i < m(); ++i)
2785 if (in_local_range(i) && (row_length(i) > 0))
2812 if (in_local_range(r) && (row_length(r) > 0))
2827 for (size_type i = r + 1; i < m(); ++i)
2828 if (in_local_range(i) && (row_length(i) > 0))
2841# ifndef DEAL_II_WITH_64BIT_INDICES
2846 end =
matrix->RowMap().MaxMyGID64() + 1;
2866 void SparseMatrix::set<TrilinosScalar>(
const size_type row,
2867 const size_type n_cols,
2868 const size_type *col_indices,
2870 const bool elide_zero_values);
2874 template <
typename Number>
2876 const size_type n_cols,
2877 const size_type *col_indices,
2878 const Number *values,
2879 const bool elide_zero_values)
2881 std::vector<TrilinosScalar> trilinos_values(n_cols);
2882 std::copy(values, values + n_cols, trilinos_values.begin());
2884 row, n_cols, col_indices, trilinos_values.data(), elide_zero_values);
2895 set(i, 1, &j, &value,
false);
2902 const bool elide_zero_values)
2908 for (size_type i = 0; i < indices.size(); ++i)
2932 if (last_action == Insert)
2934 const int ierr =
matrix->GlobalAssemble(*column_space_map,
2946 add(i, 1, &j, &value,
false);
2955# ifndef DEAL_II_WITH_64BIT_INDICES
2956 return matrix->NumGlobalRows();
2958 return matrix->NumGlobalRows64();
2977 return matrix->NumMyRows();
2982 inline std::pair<SparseMatrix::size_type, SparseMatrix::size_type>
2986# ifndef DEAL_II_WITH_64BIT_INDICES
2991 end =
matrix->RowMap().MaxMyGID64() + 1;
3005 return static_cast<std::uint64_t
>(
matrix->NumGlobalNonzeros64());
3010 template <
typename SparsityPatternType>
3012 const SparsityPatternType &sparsity_pattern,
3014 const bool exchange_data)
3016 reinit(parallel_partitioning,
3017 parallel_partitioning,
3025 template <
typename number>
3027 const IndexSet ¶llel_partitioning,
3028 const ::SparseMatrix<number> &sparse_matrix,
3030 const double drop_tolerance,
3031 const bool copy_values,
3032 const ::SparsityPattern *use_this_sparsity)
3036 reinit(parallel_partitioning,
3037 parallel_partitioning,
3048 return static_cast<const Epetra_CrsMatrix &
>(*matrix);
3088 template <
typename VectorType>
3090 const VectorType &x,
3091 const VectorType &b)
const
3097 return dst.l2_norm();
3103 namespace LinearOperatorImplementation
3105 template <
typename EpetraOpType>
3106 TrilinosPayload::TrilinosPayload(
3108 const bool supports_inverse_operations,
3109 const bool use_transpose,
3111 const IndexSet &locally_owned_domain_indices,
3112 const IndexSet &locally_owned_range_indices)
3113 : use_transpose(use_transpose)
3114 , communicator(mpi_communicator)
3116 locally_owned_domain_indices.make_trilinos_map(communicator.Comm()))
3118 locally_owned_range_indices.make_trilinos_map(communicator.Comm()))
3123 Assert(&tril_src != &tril_dst,
3130 const int ierr = op.Apply(tril_src, tril_dst);
3137 Assert(&tril_src != &tril_dst,
3142 !op.UseTranspose());
3144 op.SetUseTranspose(!op.UseTranspose());
3145 const int ierr = op.Apply(tril_src, tril_dst);
3147 op.SetUseTranspose(!op.UseTranspose());
3150 if (supports_inverse_operations)
3156 &tril_src != &tril_dst,
3161 !op.UseTranspose());
3163 const int ierr = op.ApplyInverse(tril_src, tril_dst);
3171 &tril_src != &tril_dst,
3178 op.SetUseTranspose(!op.UseTranspose());
3179 const int ierr = op.ApplyInverse(tril_src, tril_dst);
3181 op.SetUseTranspose(!op.UseTranspose());
3189 "Uninitialized TrilinosPayload::inv_vmult called. "
3190 "The operator does not support inverse operations."));
3196 "Uninitialized TrilinosPayload::inv_Tvmult called. "
3197 "The operator does not support inverse operations."));
3203 template <
typename Solver,
typename Preconditioner>
3205 std::is_base_of_v<TrilinosWrappers::SolverBase, Solver> &&
3206 std::is_base_of_v<TrilinosWrappers::PreconditionBase, Preconditioner>,
3210 const Preconditioner &preconditioner)
const
3212 const auto &payload = *
this;
3218 return_op.inv_vmult = [payload, &solver, &preconditioner](
3223 Assert(&tril_src != &tril_dst,
3228 !payload.UseTranspose());
3229 solver.solve(payload, tril_dst, tril_src, preconditioner);
3232 return_op.inv_Tvmult = [payload, &solver, &preconditioner](
3237 Assert(&tril_src != &tril_dst,
3242 payload.UseTranspose());
3245 solver.solve(payload, tril_dst, tril_src, preconditioner);
3251 if (return_op.UseTranspose() ==
true)
3252 std::swap(return_op.inv_vmult, return_op.inv_Tvmult);
3257 template <
typename Solver,
typename Preconditioner>
3259 !(std::is_base_of_v<TrilinosWrappers::SolverBase, Solver> &&
3265 TrilinosPayload return_op(*
this);
3270 ExcMessage(
"Payload inv_vmult disabled because of "
3271 "incompatible solver/preconditioner choice."));
3277 ExcMessage(
"Payload inv_vmult disabled because of "
3278 "incompatible solver/preconditioner choice."));
3287 void SparseMatrix::set<TrilinosScalar>(
const size_type row,
3288 const size_type n_cols,
3289 const size_type *col_indices,
3291 const bool elide_zero_values);
*Â *Â for(const auto &cell :triangulation.active_cell_iterators())
*Â x_component_mask set(0, true)
*Â *Â reference operator*() const
std::ptrdiff_t difference_type
*Â *Â const_iterator()=default
Epetra_Map make_trilinos_map(const MPI_Comm communicator=MPI_COMM_WORLD, const bool overlapping=false) const
AccessorBase(SparseMatrix *matrix, const size_type row, const size_type index)
std::shared_ptr< std::vector< TrilinosScalar > > value_cache
std::shared_ptr< std::vector< size_type > > colnum_cache
Reference(const Accessor< false > &accessor)
const Reference & operator-=(const TrilinosScalar n) const
const Reference & operator*=(const TrilinosScalar n) const
const Reference & operator+=(const TrilinosScalar n) const
const Reference & operator/=(const TrilinosScalar n) const
const Reference & operator=(const TrilinosScalar n) const
Accessor(MatrixType *matrix, const size_type row, const size_type index)
Accessor(const Accessor< Other > &a)
Accessor(MatrixType *matrix, const size_type row, const size_type index)
TrilinosScalar value() const
TrilinosScalar value() const
const Accessor< Constness > & operator*() const
const Accessor< Constness > * operator->() const
typename Accessor< Constness >::MatrixType MatrixType
bool operator==(const Iterator< OtherConstness > &) const
bool operator!=(const Iterator< OtherConstness > &) const
bool operator<(const Iterator< OtherConstness > &) const
Iterator(const Iterator< Other > &other)
TrilinosScalar value_type
bool operator>(const Iterator< OtherConstness > &) const
Iterator(MatrixType *matrix, const size_type row, const size_type index)
Accessor< Constness > accessor
Iterator< Constness > & operator++()
Iterator< Constness > operator++(int)
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
TrilinosScalar residual(VectorType &dst, const VectorType &x, const VectorType &b) const
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
void vmult(VectorType &dst, const VectorType &src) const
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
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)
const_iterator begin() const
void reinit(const SparsityPatternType &sparsity_pattern)
void vmult_add(VectorType &dst, const VectorType &src) const
SparseMatrix & operator=(const SparseMatrix &)=delete
void Tvmult_add(VectorType &dst, const VectorType &src) const
bool is_compressed() const
TrilinosScalar el(const size_type i, const size_type j) const
IndexSet locally_owned_domain_indices() 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
void Tvmult(VectorType &dst, const VectorType &src) const
std::uint64_t n_nonzero_elements() const
const Epetra_CrsGraph & trilinos_sparsity_pattern() const
SparseMatrix(const SparseMatrix &)=delete
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
virtual ~SparseMatrix() override=default
TrilinosScalar matrix_scalar_product(const MPI::Vector &u, const MPI::Vector &v) const
const_iterator end() const
std::pair< size_type, size_type > local_range() const
std::unique_ptr< Epetra_CrsMatrix > nonlocal_matrix
TrilinosScalar value_type
Epetra_MpiComm communicator
std::function< void(VectorType &, const VectorType &)> inv_Tvmult
std::enable_if_t< std::is_base_of_v< TrilinosWrappers::SolverBase, Solver > &&std::is_base_of_v< TrilinosWrappers::PreconditionBase, Preconditioner >, TrilinosPayload > inverse_payload(Solver &, const Preconditioner &) const
Epetra_MultiVector VectorType
virtual ~TrilinosPayload() override=default
std::function< void(VectorType &, const VectorType &)> Tvmult
std::function< void(VectorType &, const VectorType &)> vmult
std::function< void(VectorType &, const VectorType &)> inv_vmult
TrilinosPayload(EpetraOpType &op, const bool supports_inverse_operations, const bool use_transpose, const MPI_Comm mpi_communicator, const IndexSet &locally_owned_domain_indices, const IndexSet &locally_owned_range_indices)
std::enable_if_t< !(std::is_base_of_v< TrilinosWrappers::SolverBase, Solver > &&std::is_base_of_v< TrilinosWrappers::PreconditionBase, Preconditioner >), TrilinosPayload > inverse_payload(Solver &, const Preconditioner &) const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
#define DEAL_II_DEPRECATED_WITH_COMMENT(comment)
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
static ::ExceptionBase & ExcInvalidIndexWithinRow(size_type arg1, size_type arg2)
#define DeclException0(Exception0)
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
static ::ExceptionBase & ExcAccessToNonlocalRow(std::size_t arg1, std::size_t arg2, std::size_t arg3)
static ::ExceptionBase & ExcInvalidIndex(size_type arg1, size_type arg2)
#define Assert(cond, exc)
static ::ExceptionBase & ExcIteratorPastEnd()
static ::ExceptionBase & ExcAccessToNonPresentElement(size_type arg1, size_type arg2)
#define AssertIsFinite(number)
static ::ExceptionBase & ExcAccessToNonlocalRow(std::size_t arg1)
static ::ExceptionBase & ExcBeyondEndOfMatrix()
#define DeclException2(Exception2, type1, type2, outsequence)
#define AssertIndexRange(index, range)
#define DeclExceptionMsg(Exception, defaulttext)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcSourceEqualsDestination()
#define DeclException3(Exception3, type1, type2, type3, outsequence)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcNotQuadratic()
#define DeclException1(Exception1, type1, outsequence)
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)
types::global_dof_index size_type
@ matrix
Contents is actually a matrix.
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
VectorTraits::size_type size_type
void check_vector_map_equality(const Epetra_CrsMatrix &mtrx, const Epetra_MultiVector &src, const Epetra_MultiVector &dst, const bool transpose)
TrilinosWrappers::types::int64_type n_global_elements(const Epetra_BlockMap &map)
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)
unsigned int global_dof_index
BarycentricPolynomial< dim, Number1 > operator+(const Number2 &a, const BarycentricPolynomial< dim, Number1 > &bp)
static const bool zero_addition_can_be_elided
typename ::TrilinosWrappers::SparseMatrixIterators::Iterator< Constness >::value_type value_type
forward_iterator_tag iterator_category
typename ::TrilinosWrappers::SparseMatrixIterators::Iterator< Constness >::difference_type difference_type