43 #ifndef IFPACK2_CONTAINER_DECL_HPP
44 #define IFPACK2_CONTAINER_DECL_HPP
49 #include "Ifpack2_ConfigDefs.hpp"
50 #include "Tpetra_RowMatrix.hpp"
51 #include "Teuchos_Describable.hpp"
52 #include <Tpetra_Map.hpp>
53 #include <Tpetra_BlockCrsMatrix.hpp>
57 #ifndef DOXYGEN_SHOULD_SKIP_THIS
62 #endif // DOXYGEN_SHOULD_SKIP_THIS
111 template<
class MatrixType>
115 using scalar_type =
typename MatrixType::scalar_type;
116 using local_ordinal_type =
typename MatrixType::local_ordinal_type;
117 using global_ordinal_type =
typename MatrixType::global_ordinal_type;
118 using node_type =
typename MatrixType::node_type;
119 using SC = scalar_type;
120 using LO = local_ordinal_type;
121 using GO = global_ordinal_type;
122 using NO = node_type;
123 using import_type = Tpetra::Import<LO, GO, NO>;
124 using mv_type = Tpetra::MultiVector<SC, LO, GO, NO>;
125 using vector_type = Tpetra::Vector<SC, LO, GO, NO>;
126 using map_type = Tpetra::Map<LO, GO, NO>;
127 using crs_matrix_type = Tpetra::CrsMatrix<SC, LO, GO, NO>;
128 using block_crs_matrix_type = Tpetra::BlockCrsMatrix<SC, LO, GO, NO>;
129 using row_matrix_type = Tpetra::RowMatrix<SC, LO, GO, NO>;
131 static_assert(std::is_same<MatrixType, row_matrix_type>::value,
132 "Ifpack2::Container: Please use MatrixType = Tpetra::RowMatrix.");
135 using ISC =
typename Kokkos::Details::ArithTraits<SC>::val_type;
139 using HostView =
typename mv_type::dual_view_type::t_host;
189 void getMatDiag()
const;
259 virtual void applyMV (mv_type& X, mv_type& Y)
const;
264 vector_type& W)
const;
266 virtual void clearBlocks();
269 virtual std::ostream&
print (std::ostream& os)
const = 0;
279 SC dampingFactor, LO i)
const;
328 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
341 template<
class MatrixType,
class LocalScalarType>
347 using local_scalar_type = LocalScalarType;
348 using SC =
typename Container<MatrixType>::scalar_type;
349 using LO =
typename Container<MatrixType>::local_ordinal_type;
350 using GO =
typename Container<MatrixType>::global_ordinal_type;
351 using NO =
typename Container<MatrixType>::node_type;
353 using typename Container<MatrixType>::import_type;
354 using typename Container<MatrixType>::row_matrix_type;
355 using typename Container<MatrixType>::crs_matrix_type;
356 using typename Container<MatrixType>::block_crs_matrix_type;
357 using typename Container<MatrixType>::mv_type;
358 using typename Container<MatrixType>::vector_type;
359 using typename Container<MatrixType>::map_type;
362 using LSC = LocalScalarType;
363 using LISC =
typename Kokkos::Details::ArithTraits<LSC>::val_type;
365 using local_mv_type = Tpetra::MultiVector<LSC, LO, GO, NO>;
368 using HostViewLocal =
typename local_mv_type::dual_view_type::t_host;
369 using HostSubviewLocal = Kokkos::View<LISC**, Kokkos::LayoutStride, typename HostViewLocal::memory_space>;
371 static_assert(std::is_same<MatrixType, row_matrix_type>::value,
372 "Ifpack2::Container: Please use MatrixType = Tpetra::RowMatrix.");
469 void applyMV (mv_type& X, mv_type& Y)
const;
474 vector_type& W)
const;
476 virtual void clearBlocks();
479 virtual std::ostream&
print (std::ostream& os)
const = 0;
488 SC dampingFactor, LO i)
const;
501 const LSC beta)
const;
505 mutable HostViewLocal Y_local_;
532 template<
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
typename Node>
533 struct StridedRowView
536 using LO = LocalOrdinal;
538 StridedRowView(
const SC* vals_,
const LO* inds_,
int blockSize_,
size_t nnz_);
543 SC val(
size_t i)
const;
544 LO ind(
size_t i)
const;
562 template <
class MatrixType>
563 std::ostream& operator<<(std::ostream& os, const Ifpack2::Container<MatrixType>& obj);
571 template<
class MatrixType>
575 static std::string name () {
576 return std::string (
"Ifpack2::Container<") +
580 static std::string concreteName (const ::Ifpack2::Container<MatrixType>&) {
587 #endif // IFPACK2_CONTAINER_HPP
virtual void applyInverseJacobi(const mv_type &, mv_type &, SC dampingFactor, bool, int) const =0
Compute Y := (1 - a) Y + a D^{-1} (X - R*Y).
virtual void weightedApply(HostView X, HostView Y, HostView D, int blockIndex, Teuchos::ETransp mode=Teuchos::NO_TRANS, SC alpha=Teuchos::ScalarTraits< SC >::one(), SC beta=Teuchos::ScalarTraits< SC >::zero()) const =0
Compute Y := alpha * diag(D) * M^{-1} (diag(D) * X) + beta*Y.
virtual void initialize()=0
Do all set-up operations that only require matrix structure.
bool isComputed() const
Whether the container has been successfully computed.
Definition: Ifpack2_Container_def.hpp:170
std::vector< HostSubviewLocal > X_localBlocks_
Views for holding pieces of X corresponding to each block.
Definition: Ifpack2_Container_decl.hpp:520
Teuchos::Array< LO > blockRows_
Local indices of the rows of the input matrix that belong to this block.
Definition: Ifpack2_Container_decl.hpp:293
void setBlockSizes(const Teuchos::Array< Teuchos::Array< LO > > &partitions)
Initialize arrays with information about block sizes.
Definition: Ifpack2_Container_def.hpp:125
bool IsInitialized_
If true, the container has been successfully initialized.
Definition: Ifpack2_Container_decl.hpp:319
Teuchos::Array< LO > blockSizes_
Number of rows in each block.
Definition: Ifpack2_Container_decl.hpp:295
void applyMV(mv_type &X, mv_type &Y) const
Wrapper for apply with MVs, used in unit tests (never called by BlockRelaxation)
Definition: Ifpack2_Container_def.hpp:492
std::vector< HostSubviewLocal > Y_localBlocks_
Views for holding pieces of Y corresponding to each block.
Definition: Ifpack2_Container_decl.hpp:523
virtual void initialize()=0
Do all set-up operations that only require matrix structure.
bool pointIndexed_
(If hasBlockCrs_) Whether the blocks are described using sub-block row indices instead of full block ...
Definition: Ifpack2_Container_decl.hpp:313
int numBlocks_
The number of blocks (partitions) in the container.
Definition: Ifpack2_Container_decl.hpp:291
The implementation of the numerical features of Container (Jacobi, Gauss-Seidel, SGS). This class allows a custom scalar type (LocalScalarType) to be used for storing blocks and solving the block systems. Hiding this template parameter from the Container interface simplifies the BlockRelaxation and ContainerFactory classes.
Definition: Ifpack2_Container_decl.hpp:342
virtual void setParameters(const Teuchos::ParameterList &List)
Set parameters, if any.
Definition: Ifpack2_Container_def.hpp:478
bool isInitialized() const
Whether the container has been successfully initialized.
Definition: Ifpack2_Container_def.hpp:165
LO scalarsPerRow_
Definition: Ifpack2_Container_decl.hpp:316
virtual ~Container()
Destructor.
Definition: Ifpack2_Container_def.hpp:114
bool hasBlockCrs_
Whether the input matrix is a BlockCRS matrix.
Definition: Ifpack2_Container_decl.hpp:309
Details::StridedRowView< SC, LO, GO, NO > getInputRowView(LO row) const
View a row of the input matrix.
Definition: Ifpack2_Container_def.hpp:846
HostViewLocal weightedApplyScratch_
Definition: Ifpack2_Container_decl.hpp:517
virtual void compute()=0
Extract the local diagonal blocks and prepare the solver.
virtual void apply(HostView X, HostView Y, int blockIndex, Teuchos::ETransp mode=Teuchos::NO_TRANS, SC alpha=Teuchos::ScalarTraits< SC >::one(), SC beta=Teuchos::ScalarTraits< SC >::zero()) const
Compute Y := alpha * M^{-1} X + beta*Y.
Definition: Ifpack2_Container_def.hpp:576
InverseType::scalar_type LSC
The internal representation of LocalScalarType in Kokkos::View.
Definition: Ifpack2_Container_decl.hpp:362
typename Kokkos::Details::ArithTraits< SC >::val_type ISC
Internal representation of Scalar in Kokkos::View.
Definition: Ifpack2_Container_decl.hpp:135
Container(const Teuchos::RCP< const row_matrix_type > &matrix, const Teuchos::Array< Teuchos::Array< LO > > &partitions, bool pointIndexed)
Constructor.
Definition: Ifpack2_Container_def.hpp:54
int bcrsBlockSize_
If hasBlockCrs_, the number of DOFs per vertex. Otherwise 1.
Definition: Ifpack2_Container_decl.hpp:311
virtual void DoGSBlock(HostView X, HostView Y, HostView Y2, HostView Resid, SC dampingFactor, LO i) const
Do one step of Gauss-Seidel on block i (used by DoGaussSeidel and DoSGS)
Definition: Ifpack2_Container_def.hpp:196
StridedRowView(const SC *vals_, const LO *inds_, int blockSize_, size_t nnz_)
Constructor for row views (preferred)
Definition: Ifpack2_Container_def.hpp:893
LO translateRowToCol(LO row)
Definition: Ifpack2_Container_def.hpp:533
HostViewLocal X_local_
Scratch vectors used in apply().
Definition: Ifpack2_Container_decl.hpp:504
Teuchos::RCP< const block_crs_matrix_type > inputBlockMatrix_
The input matrix, dynamic cast to BlockCrsMatrix. May be null.
Definition: Ifpack2_Container_decl.hpp:288
Teuchos::RCP< const row_matrix_type > inputMatrix_
The input matrix to the constructor.
Definition: Ifpack2_Container_decl.hpp:282
virtual void applyInverseJacobi(const mv_type &, mv_type &, SC dampingFactor, bool, int) const
Compute Y := (1 - a) Y + a D^{-1} (X - R*Y).
Definition: Ifpack2_Container_def.hpp:482
typename mv_type::dual_view_type::t_host HostView
Definition: Ifpack2_Container_decl.hpp:139
virtual void weightedApplyMV(mv_type &X, mv_type &Y, vector_type &W) const
Wrapper for weightedApply with MultiVector.
Definition: Ifpack2_Container_def.hpp:183
virtual void solveBlock(HostSubviewLocal X, HostSubviewLocal Y, int blockIndex, Teuchos::ETransp mode, const LSC alpha, const LSC beta) const
Definition: Ifpack2_Container_def.hpp:520
Teuchos::RCP< vector_type > Diag_
Diagonal elements.
Definition: Ifpack2_Container_decl.hpp:299
virtual void applyMV(mv_type &X, mv_type &Y) const
Wrapper for apply with MultiVector.
Definition: Ifpack2_Container_def.hpp:176
virtual ~ContainerImpl()
Destructor.
Definition: Ifpack2_Container_def.hpp:474
bool IsParallel_
Whether the problem is distributed across multiple MPI processes.
Definition: Ifpack2_Container_decl.hpp:301
void DoGSBlock(HostView X, HostView Y, HostView Y2, HostView Resid, SC dampingFactor, LO i) const
Do one step of Gauss-Seidel on block i (used by DoGaussSeidel and DoSGS)
Definition: Ifpack2_Container_def.hpp:252
virtual void weightedApply(HostView X, HostView Y, HostView D, int blockIndex, Teuchos::ETransp mode=Teuchos::NO_TRANS, SC alpha=Teuchos::ScalarTraits< SC >::one(), SC beta=Teuchos::ScalarTraits< SC >::zero()) const
Compute Y := alpha * diag(D) * M^{-1} (diag(D) * X) + beta*Y.
Definition: Ifpack2_Container_def.hpp:687
static std::string getName()
Definition: Ifpack2_Container_def.hpp:513
virtual void apply(HostView X, HostView Y, int blockIndex, Teuchos::ETransp mode=Teuchos::NO_TRANS, SC alpha=Teuchos::ScalarTraits< SC >::one(), SC beta=Teuchos::ScalarTraits< SC >::zero()) const =0
Compute Y := alpha * M^{-1} X + beta*Y.
bool IsComputed_
If true, the container has been successfully computed.
Definition: Ifpack2_Container_decl.hpp:321
virtual void compute()=0
Extract the local diagonal blocks and prepare the solver.
Interface for creating and solving a set of local linear problems.
Definition: Ifpack2_Container_decl.hpp:112
Teuchos::ArrayView< const LO > getBlockRows(int blockIndex) const
Local indices of the rows of the input matrix that belong to this block.
Definition: Ifpack2_Container_def.hpp:118
virtual void extract()=0
Extract the submatrices identified by the local indices set by the constructor. BlockMatrix may be an...
virtual void setParameters(const Teuchos::ParameterList &List)=0
Set parameters, if any.
Structure for read-only views of general matrix rows.
Definition: Ifpack2_Container_decl.hpp:329
void weightedApplyMV(mv_type &X, mv_type &Y, vector_type &W) const
Wrapper for weightedApply with MVs, used in unit tests (never called by BlockRelaxation) ...
Definition: Ifpack2_Container_def.hpp:501
virtual std::ostream & print(std::ostream &os) const =0
Print basic information about the container to os.
static std::string getName()
Definition: Ifpack2_Container_def.hpp:190
GO NumGlobalRows_
Number of global rows in input matrix.
Definition: Ifpack2_Container_decl.hpp:305
GO NumGlobalNonzeros_
Number of nonzeros in input matrix.
Definition: Ifpack2_Container_decl.hpp:307
LO NumLocalRows_
Number of local rows in input matrix.
Definition: Ifpack2_Container_decl.hpp:303
Teuchos::Array< LO > blockOffsets_
Starting index in blockRows_ of local row indices for each block.
Definition: Ifpack2_Container_decl.hpp:297
virtual std::ostream & print(std::ostream &os) const =0
Print basic information about the container to os.
static std::string name()
Teuchos::RCP< const crs_matrix_type > inputCrsMatrix_
The input matrix, dynamic cast to CrsMatrix. May be null.
Definition: Ifpack2_Container_decl.hpp:285