13 #ifndef IFPACK2_MDF_DECL_HPP
14 #define IFPACK2_MDF_DECL_HPP
18 #include "Tpetra_CrsMatrix_decl.hpp"
21 #include "Ifpack2_LocalSparseTriangularSolver_decl.hpp"
22 #include "KokkosSparse_mdf.hpp"
24 #include <type_traits>
49 template <
class MatrixType>
51 typename MatrixType::local_ordinal_type,
52 typename MatrixType::global_ordinal_type,
53 typename MatrixType::node_type>,
55 typename MatrixType::local_ordinal_type,
56 typename MatrixType::global_ordinal_type,
57 typename MatrixType::node_type> > {
87 static_assert(std::is_same<MatrixType, row_matrix_type>::value,
"Ifpack2::MDF: The template parameter MatrixType must be a Tpetra::RowMatrix specialization. Please don't use Tpetra::CrsMatrix (a subclass of Tpetra::RowMatrix) here anymore.");
99 template <
class NewMatrixType>
102 typedef typename crs_matrix_type::global_inds_host_view_type global_inds_host_view_type;
103 typedef typename crs_matrix_type::local_inds_host_view_type local_inds_host_view_type;
104 typedef typename crs_matrix_type::values_host_view_type values_host_view_type;
106 typedef typename crs_matrix_type::nonconst_global_inds_host_view_type nonconst_global_inds_host_view_type;
107 typedef typename crs_matrix_type::nonconst_local_inds_host_view_type nonconst_local_inds_host_view_type;
108 typedef typename crs_matrix_type::nonconst_values_host_view_type nonconst_values_host_view_type;
114 typedef typename crs_matrix_type::local_matrix_device_type local_matrix_device_type;
115 typedef typename local_matrix_device_type::StaticCrsGraphType::row_map_type lno_row_view_t;
116 typedef typename local_matrix_device_type::StaticCrsGraphType::entries_type lno_nonzero_view_t;
117 typedef typename local_matrix_device_type::values_type scalar_nonzero_view_t;
118 typedef typename local_matrix_device_type::StaticCrsGraphType::device_type::memory_space TemporaryMemorySpace;
119 typedef typename local_matrix_device_type::StaticCrsGraphType::device_type::memory_space PersistentMemorySpace;
120 typedef typename local_matrix_device_type::StaticCrsGraphType::device_type::execution_space HandleExecSpace;
121 typedef typename KokkosKernels::Experimental::KokkosKernelsHandle<
typename lno_row_view_t::const_value_type,
typename lno_nonzero_view_t::const_value_type,
typename scalar_nonzero_view_t::value_type,
122 HandleExecSpace, TemporaryMemorySpace, PersistentMemorySpace>
146 virtual ~MDF() =
default;
171 return isInitialized_;
180 return numInitialize_;
193 return initializeTime_;
284 apply(
const Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& X,
285 Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& Y,
293 void apply_impl(
const Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& X,
294 Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& Y,
321 multiply(
const Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& X,
322 Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& Y,
326 using MDF_handle_device_type = KokkosSparse::Experimental::MDF_handle<local_matrix_device_type>;
338 true, std::logic_error,
339 "Ifpack2::MDF::SetOverlapMode: "
340 "MDF no longer implements overlap on its own. "
341 "Use MDF with AdditiveSchwarz if you want overlap.");
346 return getL().getGlobalNumEntries() +
getU().getGlobalNumEntries();
365 typedef Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type> MV;
369 void allocateSolvers();
370 void allocatePermutations(
bool force =
false);
383 typedef Tpetra::Vector<scalar_type, local_ordinal_type, global_ordinal_type, node_type> vec_type;
395 lno_row_view_t A_local_rowmap_;
396 lno_nonzero_view_t A_local_entries_;
397 scalar_nonzero_view_t A_local_values_;
425 mutable int numApply_;
427 double initializeTime_;
429 mutable double applyTime_;
Tpetra::CrsMatrix< scalar_type, local_ordinal_type, global_ordinal_type, node_type > crs_matrix_type
Tpetra::CrsMatrix specialization used by this class for representing L and U.
Definition: Ifpack2_MDF_decl.hpp:87
virtual ~MDF()=default
Destructor (declared virtual for memory safety).
Mix-in interface for preconditioners that can change their matrix after construction.
Definition: Ifpack2_Details_CanChangeMatrix.hpp:60
Declaration and definition of IlukGraph.
Ifpack2::ScalingType enumerable type.
void compute()
Compute the (numeric) incomplete factorization.
Definition: Ifpack2_MDF_def.hpp:504
MatrixType::local_ordinal_type local_ordinal_type
The type of local indices in the input MatrixType.
Definition: Ifpack2_MDF_decl.hpp:63
MDF (incomplete LU factorization with minimum discarded fill reordering) of a Tpetra sparse matrix...
Definition: Ifpack2_MDF_decl.hpp:50
bool isComputed() const
Whether compute() has been called on this object.
Definition: Ifpack2_MDF_decl.hpp:174
permutations_type permutations_
The computed permuations from MDF factorization.
Definition: Ifpack2_MDF_decl.hpp:409
Teuchos::RCP< const row_matrix_type > A_
The (original) input matrix for which to compute ILU(k).
Definition: Ifpack2_MDF_decl.hpp:386
permutations_type & getReversePermutations() const
Return the reverse permutations of the MDF factorization.
Definition: Ifpack2_MDF_def.hpp:238
crs_matrix_type::impl_scalar_type impl_scalar_type
Scalar type stored in Kokkos::Views (CrsMatrix and MultiVector)
Definition: Ifpack2_MDF_decl.hpp:97
int getNumInitialize() const
Number of successful initialize() calls for this object.
Definition: Ifpack2_MDF_decl.hpp:179
MatrixType::node_type node_type
The Node type used by the input MatrixType.
Definition: Ifpack2_MDF_decl.hpp:69
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
permutations_type reversePermutations_
The reverse permuations from MDF factorization.
Definition: Ifpack2_MDF_decl.hpp:412
std::string description() const
A one-line description of this object.
Definition: Ifpack2_MDF_def.hpp:696
Teuchos::RCP< const Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > > getRangeMap() const
Returns the Tpetra::Map object associated with the range of this operator.
Definition: Ifpack2_MDF_def.hpp:300
int getLevelOfFill() const
Get level of fill (the "k" in ILU(k)).
Definition: Ifpack2_MDF_decl.hpp:333
MatrixType::global_ordinal_type global_ordinal_type
The type of global indices in the input MatrixType.
Definition: Ifpack2_MDF_decl.hpp:66
Teuchos::RCP< const crs_matrix_type > getCrsMatrix() const
Return the input matrix A as a Tpetra::CrsMatrix, if possible; else throws.
Definition: Ifpack2_MDF_def.hpp:374
size_t getNodeSmootherComplexity() const
Get a rough estimate of cost per iteration.
Definition: Ifpack2_MDF_def.hpp:263
node_type::device_type device_type
The Kokkos device type of the input MatrixType.
Definition: Ifpack2_MDF_decl.hpp:75
Tpetra::CombineMode getOverlapMode()
Get overlap mode type.
Definition: Ifpack2_MDF_decl.hpp:336
Teuchos::RCP< crs_matrix_type > U_
The U (upper triangular) factor of ILU(k).
Definition: Ifpack2_MDF_decl.hpp:404
permutations_type & getPermutations() const
Return the permutations of the MDF factorization.
Definition: Ifpack2_MDF_def.hpp:226
Teuchos::RCP< LocalSparseTriangularSolver< row_matrix_type > > L_solver_
Sparse triangular solver for L.
Definition: Ifpack2_MDF_decl.hpp:402
Teuchos::ScalarTraits< scalar_type >::magnitudeType magnitude_type
The type of the magnitude (absolute value) of a matrix entry.
Definition: Ifpack2_MDF_decl.hpp:72
Teuchos::RCP< crs_matrix_type > L_
The L (lower triangular) factor of ILU(k).
Definition: Ifpack2_MDF_decl.hpp:400
int getNumApply() const
Number of successful apply() calls for this object.
Definition: Ifpack2_MDF_decl.hpp:187
node_type::execution_space execution_space
The Kokkos execution space of the input MatrixType.
Definition: Ifpack2_MDF_decl.hpp:78
Interface for all Ifpack2 preconditioners.
Definition: Ifpack2_Preconditioner.hpp:74
virtual void setMatrix(const Teuchos::RCP< const row_matrix_type > &A)
Change the matrix to be preconditioned.
Definition: Ifpack2_MDF_def.hpp:179
void setParameters(const Teuchos::ParameterList ¶ms)
Definition: Ifpack2_MDF_def.hpp:318
double getApplyTime() const
Total time in seconds taken by all successful apply() calls for this object.
Definition: Ifpack2_MDF_decl.hpp:200
Declaration of interface for preconditioners that can change their matrix after construction.
double getInitializeTime() const
Total time in seconds taken by all successful initialize() calls for this object. ...
Definition: Ifpack2_MDF_decl.hpp:192
const crs_matrix_type & getL() const
Return the L factor of the MDF factorization.
Definition: Ifpack2_MDF_def.hpp:213
int getNumCompute() const
Number of successful compute() calls for this object.
Definition: Ifpack2_MDF_decl.hpp:183
Teuchos::RCP< const Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > > getDomainMap() const
Returns the Tpetra::Map object associated with the domain of this operator.
Definition: Ifpack2_MDF_def.hpp:280
Tpetra::RowMatrix< scalar_type, local_ordinal_type, global_ordinal_type, node_type > row_matrix_type
Tpetra::RowMatrix specialization used by this class.
Definition: Ifpack2_MDF_decl.hpp:85
MatrixType::scalar_type scalar_type
The type of the entries of the input MatrixType.
Definition: Ifpack2_MDF_decl.hpp:60
Teuchos::RCP< const row_matrix_type > A_local_
The matrix whos numbers are used to to compute ILU(k). The graph may be computed using a crs_matrix_t...
Definition: Ifpack2_MDF_decl.hpp:394
Teuchos::RCP< const row_matrix_type > getMatrix() const
Get the input matrix.
Definition: Ifpack2_MDF_def.hpp:368
const crs_matrix_type & getU() const
Return the U factor of the MDF factorization.
Definition: Ifpack2_MDF_def.hpp:251
Teuchos::RCP< LocalSparseTriangularSolver< row_matrix_type > > U_solver_
Sparse triangular solver for U.
Definition: Ifpack2_MDF_decl.hpp:406
void initialize()
Initialize by computing the symbolic incomplete factorization.
Definition: Ifpack2_MDF_def.hpp:410
bool isInitialized() const
Whether initialize() has been called on this object.
Definition: Ifpack2_MDF_decl.hpp:170
double getComputeTime() const
Total time in seconds taken by all successful compute() calls for this object.
Definition: Ifpack2_MDF_decl.hpp:196
Tpetra::global_size_t getGlobalNumEntries() const
Returns the number of nonzero entries in the global graph.
Definition: Ifpack2_MDF_decl.hpp:345
void apply(const Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &X, Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, scalar_type alpha=Teuchos::ScalarTraits< scalar_type >::one(), scalar_type beta=Teuchos::ScalarTraits< scalar_type >::zero()) const
Apply the (inverse of the) incomplete factorization to X, resulting in Y.
Definition: Ifpack2_MDF_def.hpp:626