Ifpack2 Templated Preconditioning Package Version 1.0
Loading...
Searching...
No Matches
Ifpack2::BlockTriDiContainer< MatrixType, ImplTagType > Class Template Reference

Store and solve local block tridiagonal linear problems. More...

#include <Ifpack2_BlockTriDiContainer_decl.hpp>

Inheritance diagram for Ifpack2::BlockTriDiContainer< MatrixType, ImplTagType >:

Detailed Description

template<typename MatrixType, typename ImplTagType = typename BlockTriDiContainerDetails::ImplTag<typename MatrixType::scalar_type>::type>
class Ifpack2::BlockTriDiContainer< MatrixType, ImplTagType >

Store and solve local block tridiagonal linear problems.

Primary declation

Template Parameters
MatrixTypeA specialization of Tpetra::RowMatrix.

This class can be used as a Container for BlockRelaxation, in which case please refer to the documentation of the Container interface, or standalone. In standalone use, there are special constructor, compute, and applyInverseJacobi functions that may be called, with extra non-ParameterList inputs.

If the partitioner returns an empty set of partitions, then this class performs pure block-Jacobi, i.e., where the preconditioner is the diagonal of little blocks or, in other words, block tridiagonal matrices of size one block.

BlockTriDiContainer requires the Tpetra::RowMatrix to be Tpetra::BlockCrsMatrix.

This class currently assumes the following about the column and row Maps of the input matrix:

  1. The domain and range maps are the same.
  2. On all processes, all off-process indices in the column Map of the input matrix occur after that initial set.

These assumptions may be violated if the input matrix was constructed with a user-provided column Map.

Currently, this class is expected to perform well on conventional CPU and Intel Xeon Phi (reaching the ceiling of the bandwidth utilization) and perform reasonably well on GPU (comparable to Intel Xeon Phi performance). The main performance issue on GPU is block sparse matrix vector multiplication which does not use a SIMD format.

Implementation specific comments:

  • When ETI is not enabled, do not use something like "using namepsace KokkosBatched::Experimental". Albany (or any applications) can use the same struct name (in this case Albany uses Side).
  • Use an impl pointer to hide details. If you use an object inside of an Ifpack container,
    it requires a complete definition of the member object, which needs to expose an impl details header. However, a pointer does not require a complete definition of the member objects.
  • Always test with complex even if this code is not used with complex.
  • Always check a non MPI build to check MPI is guarded by #ifdef HAVE_IFPACK2_MPI
  • Do not trust CMake variables and macros because you see the variables in the file. If you use CMake varialbes and macro definitions, check Ifpack2_config.h.
  • Always better remove warnings (shadows and signed/unsinged comparison). If the code is used by other customers, they may have a different software quality standard. It is better to follow a higher quality standard.

The documentation for this class was generated from the following file: