Ifpack2 Templated Preconditioning Package  Version 1.0
Ifpack2_BlockRelaxation_decl.hpp
Go to the documentation of this file.
1 /*@HEADER
2 // ***********************************************************************
3 //
4 // Ifpack2: Tempated Object-Oriented Algebraic Preconditioner Package
5 // Copyright (2009) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 //@HEADER
41 */
42 
43 #ifndef IFPACK2_BLOCKRELAXATION_DECL_HPP
44 #define IFPACK2_BLOCKRELAXATION_DECL_HPP
45 
48 
50 #include "Ifpack2_Partitioner.hpp"
52 #include "Ifpack2_Details_ContainerFactory.hpp"
53 #include "Teuchos_Time.hpp"
54 #include "Tpetra_Experimental_BlockCrsMatrix_decl.hpp"
55 #include <type_traits>
56 
57 namespace Ifpack2 {
58 
82 template<class MatrixType, class ContainerType = Container<MatrixType> >
84  virtual public Ifpack2::Preconditioner<typename MatrixType::scalar_type,
85  typename MatrixType::local_ordinal_type,
86  typename MatrixType::global_ordinal_type,
87  typename MatrixType::node_type>,
88  virtual public Ifpack2::Details::CanChangeMatrix<Tpetra::RowMatrix<typename MatrixType::scalar_type,
89  typename MatrixType::local_ordinal_type,
90  typename MatrixType::global_ordinal_type,
91  typename MatrixType::node_type> >
92 {
93 public:
95 
96 
98  typedef typename MatrixType::scalar_type scalar_type;
99 
101  typedef typename MatrixType::local_ordinal_type local_ordinal_type;
102 
104  typedef typename MatrixType::global_ordinal_type global_ordinal_type;
106  typedef typename MatrixType::node_type node_type;
107 
109  typedef typename Teuchos::ScalarTraits<scalar_type>::magnitudeType magnitude_type;
110 
112  typedef Tpetra::RowMatrix<scalar_type, local_ordinal_type, global_ordinal_type, node_type> row_matrix_type;
113 
114  static_assert (std::is_same<MatrixType, row_matrix_type>::value,
115  "Ifpack2::BlockRelaxation: Please use MatrixType = Tpetra::RowMatrix.");
116  static_assert (std::is_same<ContainerType, Container<row_matrix_type> >::value,
117  "Ifpack2::BlockRelaxation: Do NOT specify the (second) "
118  "ContainerType template parameter explicitly. The default "
119  "value is fine. Please instead specify the container type to "
120  "use by setting the \"relaxation: container\" parameter.");
121 
123  typedef Tpetra::Import<local_ordinal_type, global_ordinal_type, node_type> import_type;
124 
125 private:
126  void computeImporter() const;
127 
129 
130  typedef Tpetra::MultiVector<scalar_type, local_ordinal_type,
132  typedef Tpetra::Vector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> vector_type;
133  typedef Teuchos::ScalarTraits<scalar_type> STS;
134  typedef Teuchos::ScalarTraits<magnitude_type> STM;
135  typedef Tpetra::Experimental::BlockCrsMatrix<scalar_type, local_ordinal_type,
136  global_ordinal_type, node_type> block_crs_matrix_type;
137  typedef Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> map_type;
138 public:
140 
141  // \name Constructors and Destructors
143 
173  explicit BlockRelaxation (const Teuchos::RCP<const row_matrix_type>& Matrix);
174 
176  virtual ~BlockRelaxation ();
177 
179 
181 
183 
210  void setParameters(const Teuchos::ParameterList& params);
211 
213  void initialize();
214 
216  inline bool isInitialized() const {
217  return(IsInitialized_);
218  }
219 
220  void computeBlockCrs();
221 
223  void compute();
224 
226  inline bool isComputed() const {
227  return(IsComputed_);
228  }
229 
231 
233 
256  virtual void
257  setMatrix (const Teuchos::RCP<const row_matrix_type>& A);
258 
260 
262 
264 
274  void apply(const MV& X,
275  MV& Y,
276  Teuchos::ETransp mode = Teuchos::NO_TRANS,
277  scalar_type alpha = Teuchos::ScalarTraits<scalar_type>::one(),
278  scalar_type beta = Teuchos::ScalarTraits<scalar_type>::zero()) const;
279 
281  Teuchos::RCP<const map_type> getDomainMap() const;
282 
284  Teuchos::RCP<const map_type> getRangeMap() const;
285 
286  bool hasTransposeApply() const;
287 
289 
295  void applyMat(const MV& X,
296  MV& Y,
297  Teuchos::ETransp mode = Teuchos::NO_TRANS) const;
298 
300 
302 
304  Teuchos::RCP<const Teuchos::Comm<int> > getComm() const;
305 
307  Teuchos::RCP<const row_matrix_type> getMatrix() const;
308 
310  int getNumInitialize() const;
311 
313  int getNumCompute() const;
314 
316  int getNumApply() const;
317 
319  double getInitializeTime() const;
320 
322  double getComputeTime() const;
323 
325  double getApplyTime() const;
326 
328 
330 
332  std::string description() const;
333 
335  void
336  describe (Teuchos::FancyOStream& out,
337  const Teuchos::EVerbosityLevel verbLevel =
338  Teuchos::Describable::verbLevel_default) const;
339 
341 
343  Teuchos::RCP<Ifpack2::Partitioner<Tpetra::RowGraph<local_ordinal_type,global_ordinal_type,node_type> > > getPartitioner(){return Partitioner_;}
344 
345 private:
346 
349 
352  operator= (const BlockRelaxation<MatrixType, ContainerType>& RHS);
353 
354  virtual void ApplyInverseJacobi (const MV& X, MV& Y) const;
355 
356  virtual void ApplyInverseGS (const MV& X, MV& Y) const;
357 
358  virtual void ApplyInverseSGS (const MV& X, MV& Y) const;
359 
361  void ExtractSubmatrices();
362 
364 
366 
368  Teuchos::RCP<const row_matrix_type> A_;
369 
371  Teuchos::RCP<Teuchos::Time> Time_;
372 
374  mutable Teuchos::RCP<Container<row_matrix_type> > Container_;
375 
376  // FIXME (mfh 06 Oct 2014) This doesn't comply with the naming
377  // convention for instance members of a class. Furthermore, the
378  // class should keep the Vector, not the ArrayRCP to the data _in_
379  // the Vector.
380  // FIXED! (amk 10 Nov 2015)
381  mutable Teuchos::RCP<vector_type> DiagRCP_;
382 
384  Teuchos::RCP<Ifpack2::Partitioner<Tpetra::RowGraph<local_ordinal_type,global_ordinal_type,node_type> > > Partitioner_;
385 
388  std::string PartitionerType_;
389 
391  Teuchos::ParameterList List_;
392 
394  int NumSweeps_;
395 
397  local_ordinal_type NumLocalBlocks_;
398 
400  std::string containerType_;
401 
403  Details::RelaxationType PrecType_;
404 
406  bool IsParallel_;
407 
409  bool ZeroStartingSolution_;
410 
413  bool hasBlockCrsMatrix_;
414 
416  bool DoBackwardGS_;
417 
419  int OverlapLevel_;
420 
422  scalar_type DampingFactor_;
423 
425  bool IsInitialized_;
426 
428  bool IsComputed_;
429 
431  int NumInitialize_;
432 
434  int NumCompute_;
435 
437  mutable int NumApply_;
438 
440  double InitializeTime_;
441 
443  double ComputeTime_;
444 
446  mutable double ApplyTime_;
447 
449  local_ordinal_type NumLocalRows_;
450 
452  global_ordinal_type NumGlobalRows_;
453 
455  global_ordinal_type NumGlobalNonzeros_;
456 
459  Teuchos::RCP<vector_type> W_;
460 
461  mutable Teuchos::RCP<const Tpetra::Import<local_ordinal_type, global_ordinal_type, node_type>> Importer_;
462 
464 }; //class BlockRelaxation
465 
466 }//namespace Ifpack2
467 
468 #endif // IFPACK2_BLOCKRELAXATION_DECL_HPP
469 
Mix-in interface for preconditioners that can change their matrix after construction.
Definition: Ifpack2_Details_CanChangeMatrix.hpp:93
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
The communicator over which the input matrix is distributed.
Definition: Ifpack2_BlockRelaxation_def.hpp:262
double getApplyTime() const
Returns the time spent in apply().
Definition: Ifpack2_BlockRelaxation_def.hpp:357
MatrixType::global_ordinal_type global_ordinal_type
The type of global indices in the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:104
double getComputeTime() const
Returns the time spent in compute().
Definition: Ifpack2_BlockRelaxation_def.hpp:349
int getNumInitialize() const
Returns the number of calls to initialize().
Definition: Ifpack2_BlockRelaxation_def.hpp:318
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:901
double getInitializeTime() const
Returns the time spent in initialize().
Definition: Ifpack2_BlockRelaxation_def.hpp:341
Teuchos::RCP< const row_matrix_type > getMatrix() const
The input matrix of this preconditioner&#39;s constructor.
Definition: Ifpack2_BlockRelaxation_def.hpp:276
Teuchos::RCP< const map_type > getDomainMap() const
Returns the Tpetra::Map object associated with the domain of this operator.
Definition: Ifpack2_BlockRelaxation_def.hpp:285
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:365
std::string description() const
A one-line description of this object.
Definition: Ifpack2_BlockRelaxation_def.hpp:856
Teuchos::RCP< const map_type > getRangeMap() const
Returns the Tpetra::Map object associated with the range of this operator.
Definition: Ifpack2_BlockRelaxation_def.hpp:299
void setParameters(const Teuchos::ParameterList &params)
Sets all the parameters for the preconditioner.
Definition: Ifpack2_BlockRelaxation_def.hpp:122
bool isInitialized() const
Returns true if the preconditioner has been successfully initialized.
Definition: Ifpack2_BlockRelaxation_decl.hpp:216
void compute()
compute the preconditioner for the specified matrix, diagonal perturbation thresholds and relaxation ...
Definition: Ifpack2_BlockRelaxation_def.hpp:580
Block relaxation preconditioners (or smoothers) for Tpetra::RowMatrix and Tpetra::CrsMatrix sparse ma...
Definition: Ifpack2_BlockRelaxation_decl.hpp:83
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:451
Teuchos::ScalarTraits< scalar_type >::magnitudeType magnitude_type
The type of the magnitude (absolute value) of a matrix entry.
Definition: Ifpack2_BlockRelaxation_decl.hpp:109
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:112
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:115
virtual void setMatrix(const Teuchos::RCP< const row_matrix_type > &A)
Change the matrix to be preconditioned.
Definition: Ifpack2_BlockRelaxation_def.hpp:57
virtual ~BlockRelaxation()
Destructor.
Definition: Ifpack2_BlockRelaxation_def.hpp:116
Interface for all Ifpack2 preconditioners.
Definition: Ifpack2_Preconditioner.hpp:107
Declaration of interface for preconditioners that can change their matrix after construction.
void initialize()
Initialize.
Definition: Ifpack2_BlockRelaxation_def.hpp:467
bool isComputed() const
Return true if compute() has been called.
Definition: Ifpack2_BlockRelaxation_decl.hpp:226
MatrixType::node_type node_type
Node type of the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:106
MatrixType::local_ordinal_type local_ordinal_type
The type of local indices in the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:101
int getNumCompute() const
Returns the number of calls to compute().
Definition: Ifpack2_BlockRelaxation_def.hpp:325
int getNumApply() const
Returns the number of calls to apply().
Definition: Ifpack2_BlockRelaxation_def.hpp:333
MatrixType::scalar_type scalar_type
The type of the entries of the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:98
Interface for creating and solving a local linear problem.
Definition: Ifpack2_Container.hpp:114
Preconditioners and smoothers for Tpetra sparse matrices.
Definition: Ifpack2_AdditiveSchwarz_decl.hpp:72
Teuchos::RCP< Ifpack2::Partitioner< Tpetra::RowGraph< local_ordinal_type, global_ordinal_type, node_type > > > getPartitioner()
For diagnostic purposes.
Definition: Ifpack2_BlockRelaxation_decl.hpp:343
BlockRelaxation(const Teuchos::RCP< const row_matrix_type > &Matrix)
Constructor.
Definition: Ifpack2_BlockRelaxation_def.hpp:83