Ifpack2 Templated Preconditioning Package  Version 1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Ifpack2_BlockRelaxation_decl.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
4 //
5 // Copyright 2009 NTESS and the Ifpack2 contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef IFPACK2_BLOCKRELAXATION_DECL_HPP
11 #define IFPACK2_BLOCKRELAXATION_DECL_HPP
12 
15 
17 #include "Ifpack2_Partitioner.hpp"
19 #include "Ifpack2_ContainerFactory.hpp"
20 #include "Tpetra_BlockCrsMatrix.hpp"
21 #include <type_traits>
22 
23 namespace Ifpack2 {
24 
48 template<class MatrixType, class ContainerType = Container<MatrixType> >
50  virtual public Ifpack2::Preconditioner<typename MatrixType::scalar_type,
51  typename MatrixType::local_ordinal_type,
52  typename MatrixType::global_ordinal_type,
53  typename MatrixType::node_type>,
54  virtual public Ifpack2::Details::CanChangeMatrix<Tpetra::RowMatrix<typename MatrixType::scalar_type,
55  typename MatrixType::local_ordinal_type,
56  typename MatrixType::global_ordinal_type,
57  typename MatrixType::node_type> >
58 {
59 public:
61 
62 
64  typedef typename MatrixType::scalar_type scalar_type;
65 
67  typedef typename MatrixType::local_ordinal_type local_ordinal_type;
68 
70  typedef typename MatrixType::global_ordinal_type global_ordinal_type;
72  typedef typename MatrixType::node_type node_type;
73 
76 
78  typedef Tpetra::RowMatrix<scalar_type, local_ordinal_type, global_ordinal_type, node_type> row_matrix_type;
79 
80  static_assert (std::is_same<MatrixType, row_matrix_type>::value,
81  "Ifpack2::BlockRelaxation: Please use MatrixType = Tpetra::RowMatrix.");
82 
83  static_assert (std::is_same<ContainerType, Container<row_matrix_type> >::value,
84  "Ifpack2::BlockRelaxation: Do NOT specify the (second) "
85  "ContainerType template parameter explicitly. The default "
86  "value is fine. Please instead specify the container type to "
87  "use by setting the \"relaxation: container\" parameter.");
88 
90  typedef Tpetra::Import<local_ordinal_type, global_ordinal_type, node_type> import_type;
91 
92 private:
93 
98  void setParametersImpl(Teuchos::ParameterList& params);
99 
100  void computeImporter() const;
101 
103 
104  typedef Tpetra::MultiVector<scalar_type, local_ordinal_type,
106  typedef Tpetra::Vector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> vector_type;
109  typedef Tpetra::CrsMatrix<scalar_type, local_ordinal_type,
110  global_ordinal_type, node_type> crs_matrix_type;
111  typedef Tpetra::BlockCrsMatrix<scalar_type, local_ordinal_type,
112  global_ordinal_type, node_type> block_crs_matrix_type;
113  typedef Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> map_type;
114 public:
116 
117  // \name Constructors and Destructors
119 
149  explicit BlockRelaxation (const Teuchos::RCP<const row_matrix_type>& Matrix);
150 
152  virtual ~BlockRelaxation ();
153 
155 
157 
159 
186  void setParameters(const Teuchos::ParameterList& params);
187 
188  bool supportsZeroStartingSolution() { return true; }
189 
190  void setZeroStartingSolution (bool zeroStartingSolution) { ZeroStartingSolution_ = zeroStartingSolution; };
191 
194  getValidParameters () const;
195 
197  void initialize();
198 
200  inline bool isInitialized() const {
201  return(IsInitialized_);
202  }
203 
205  void compute();
206 
208  inline bool isComputed() const {
209  return(IsComputed_);
210  }
211 
213 
215 
238  virtual void
240 
242 
244 
246 
256  void apply(const MV& X,
257  MV& Y,
261 
264 
267 
268  bool hasTransposeApply() const;
269 
271 
277  void applyMat(const MV& X,
278  MV& Y,
279  Teuchos::ETransp mode = Teuchos::NO_TRANS) const;
280 
282 
284 
287 
290 
292  int getNumInitialize() const;
293 
295  int getNumCompute() const;
296 
298  int getNumApply() const;
299 
301  double getInitializeTime() const;
302 
304  double getComputeTime() const;
305 
307  double getApplyTime() const;
308 
310  size_t getNodeSmootherComplexity() const;
311 
313 
315 
317  std::string description() const;
318 
320  void
322  const Teuchos::EVerbosityLevel verbLevel =
324 
326 
329 
330 private:
331 
334 
337  operator= (const BlockRelaxation<MatrixType, ContainerType>& RHS);
338 
339  virtual void ApplyInverseJacobi (const MV& X, MV& Y) const;
340 
341  virtual void ApplyInverseGS (const MV& X, MV& Y) const;
342 
343  virtual void ApplyInverseSGS (const MV& X, MV& Y) const;
344 
347  void ExtractSubmatricesStructure();
348 
350 
352 
355 
357  mutable Teuchos::RCP<Container<row_matrix_type> > Container_;
358 
359  // FIXME (mfh 06 Oct 2014) This doesn't comply with the naming
360  // convention for instance members of a class. Furthermore, the
361  // class should keep the Vector, not the ArrayRCP to the data _in_
362  // the Vector.
363  // FIXED! (amk 10 Nov 2015)
364  mutable Teuchos::RCP<vector_type> DiagRCP_;
365 
368 
371  std::string PartitionerType_;
372 
375 
377  int NumSweeps_;
378 
380  local_ordinal_type NumLocalBlocks_;
381 
383  std::string containerType_;
384 
386  Details::RelaxationType PrecType_;
387 
389  bool IsParallel_;
390 
392  bool ZeroStartingSolution_;
393 
396  bool hasBlockCrsMatrix_;
397 
399  bool DoBackwardGS_;
400 
402  int OverlapLevel_;
403 
405  //only valid with block Jacobi relaxation and overlapping blocks (e.g., defined by "partitioner: type" "user" and "parts: " or "global ID parts:"). Average solutions in overlapped regions (i.e., after summing different solutions divide by number of blocks contain this dof). When false (the default) symmetric averaging performed (i.e., average residuals and solutions).
406  bool nonsymCombine_;
407 
409  std::string schwarzCombineMode_;
410 
412  scalar_type DampingFactor_;
413 
415  bool decouple_;
416 
418  bool IsInitialized_;
419 
421  bool IsComputed_;
422 
424  int NumInitialize_;
425 
427  int NumCompute_;
428 
430  bool TimerForApply_;
431 
433  mutable int NumApply_;
434 
436  double InitializeTime_;
437 
439  double ComputeTime_;
440 
442  mutable double ApplyTime_;
443 
445  local_ordinal_type NumLocalRows_;
446 
448  global_ordinal_type NumGlobalRows_;
449 
451  global_ordinal_type NumGlobalNonzeros_;
452 
456 
458 
460 }; //class BlockRelaxation
461 
462 }//namespace Ifpack2
463 
464 #endif // IFPACK2_BLOCKRELAXATION_DECL_HPP
465 
void setZeroStartingSolution(bool zeroStartingSolution)
Set this preconditioner&#39;s parameters.
Definition: Ifpack2_BlockRelaxation_decl.hpp:190
Mix-in interface for preconditioners that can change their matrix after construction.
Definition: Ifpack2_Details_CanChangeMatrix.hpp:60
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
The communicator over which the input matrix is distributed.
Definition: Ifpack2_BlockRelaxation_def.hpp:346
MatrixType::global_ordinal_type global_ordinal_type
The type of global indices in the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:70
std::string description() const
A one-line description of this object.
Definition: Ifpack2_BlockRelaxation_def.hpp:1093
double getApplyTime() const
Returns the time spent in apply().
Definition: Ifpack2_BlockRelaxation_def.hpp:441
int getNumApply() const
Returns the number of calls to apply().
Definition: Ifpack2_BlockRelaxation_def.hpp:417
Teuchos::RCP< const map_type > getRangeMap() const
Returns the Tpetra::Map object associated with the range of this operator.
Definition: Ifpack2_BlockRelaxation_def.hpp:383
int getNumCompute() const
Returns the number of calls to compute().
Definition: Ifpack2_BlockRelaxation_def.hpp:409
void setParameters(const Teuchos::ParameterList &params)
Sets all the parameters for the preconditioner.
Definition: Ifpack2_BlockRelaxation_def.hpp:161
void compute()
compute the preconditioner for the specified matrix, diagonal perturbation thresholds and relaxation ...
Definition: Ifpack2_BlockRelaxation_def.hpp:778
Block relaxation preconditioners (or smoothers) for Tpetra::RowMatrix and Tpetra::CrsMatrix sparse ma...
Definition: Ifpack2_BlockRelaxation_decl.hpp:49
double getInitializeTime() const
Returns the time spent in initialize().
Definition: Ifpack2_BlockRelaxation_def.hpp:425
double getComputeTime() const
Returns the time spent in compute().
Definition: Ifpack2_BlockRelaxation_def.hpp:433
bool isComputed() const
Return true if compute() has been called.
Definition: Ifpack2_BlockRelaxation_decl.hpp:208
size_t getNodeSmootherComplexity() const
Get a rough estimate of cost per iteration.
Definition: Ifpack2_BlockRelaxation_def.hpp:448
Teuchos::ScalarTraits< scalar_type >::magnitudeType magnitude_type
The type of the magnitude (absolute value) of a matrix entry.
Definition: Ifpack2_BlockRelaxation_decl.hpp:75
Tpetra::RowMatrix< scalar_type, local_ordinal_type, global_ordinal_type, node_type > row_matrix_type
Tpetra::RowMatrix specialization corresponding to MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:78
Tpetra::Import< local_ordinal_type, global_ordinal_type, node_type > import_type
Tpetra::Importer specialization for use with MatrixType and compatible MultiVectors.
Definition: Ifpack2_BlockRelaxation_decl.hpp:81
virtual void setMatrix(const Teuchos::RCP< const row_matrix_type > &A)
Change the matrix to be preconditioned.
Definition: Ifpack2_BlockRelaxation_def.hpp:31
virtual ~BlockRelaxation()
Destructor.
Definition: Ifpack2_BlockRelaxation_def.hpp:94
Interface for all Ifpack2 preconditioners.
Definition: Ifpack2_Preconditioner.hpp:74
Teuchos::RCP< const map_type > getDomainMap() const
Returns the Tpetra::Map object associated with the domain of this operator.
Definition: Ifpack2_BlockRelaxation_def.hpp:369
bool isInitialized() const
Returns true if the preconditioner has been successfully initialized.
Definition: Ifpack2_BlockRelaxation_decl.hpp:200
int getNumInitialize() const
Returns the number of calls to initialize().
Definition: Ifpack2_BlockRelaxation_def.hpp:402
Declaration of interface for preconditioners that can change their matrix after construction.
void initialize()
Initialize.
Definition: Ifpack2_BlockRelaxation_def.hpp:584
static const EVerbosityLevel verbLevel_default
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with some verbosity level to an FancyOStream object.
Definition: Ifpack2_BlockRelaxation_def.hpp:1157
MatrixType::node_type node_type
Node type of the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:72
MatrixType::local_ordinal_type local_ordinal_type
The type of local indices in the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:67
void applyMat(const MV &X, MV &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS) const
Applies the matrix to a Tpetra::MultiVector.
Definition: Ifpack2_BlockRelaxation_def.hpp:568
MatrixType::scalar_type scalar_type
The type of the entries of the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:64
Interface for creating and solving a set of local linear problems.
Definition: Ifpack2_Container_decl.hpp:79
Teuchos::RCP< const row_matrix_type > getMatrix() const
The input matrix of this preconditioner&#39;s constructor.
Definition: Ifpack2_BlockRelaxation_def.hpp:360
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Return a list of all the parameters that this class accepts.
Definition: Ifpack2_BlockRelaxation_def.hpp:100
void apply(const MV &X, MV &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, scalar_type alpha=Teuchos::ScalarTraits< scalar_type >::one(), scalar_type beta=Teuchos::ScalarTraits< scalar_type >::zero()) const
Applies the preconditioner to X, returns the result in Y.
Definition: Ifpack2_BlockRelaxation_def.hpp:465
Teuchos::RCP< Ifpack2::Partitioner< Tpetra::RowGraph< local_ordinal_type, global_ordinal_type, node_type > > > getPartitioner()
For diagnostic purposes.
Definition: Ifpack2_BlockRelaxation_decl.hpp:328
BlockRelaxation(const Teuchos::RCP< const row_matrix_type > &Matrix)
Constructor.
Definition: Ifpack2_BlockRelaxation_def.hpp:59