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 //
4 // Ifpack2: Templated 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_ContainerFactory.hpp"
53 #include "Tpetra_BlockCrsMatrix.hpp"
54 #include <type_traits>
55 
56 namespace Ifpack2 {
57 
81 template<class MatrixType, class ContainerType = Container<MatrixType> >
83  virtual public Ifpack2::Preconditioner<typename MatrixType::scalar_type,
84  typename MatrixType::local_ordinal_type,
85  typename MatrixType::global_ordinal_type,
86  typename MatrixType::node_type>,
87  virtual public Ifpack2::Details::CanChangeMatrix<Tpetra::RowMatrix<typename MatrixType::scalar_type,
88  typename MatrixType::local_ordinal_type,
89  typename MatrixType::global_ordinal_type,
90  typename MatrixType::node_type> >
91 {
92 public:
94 
95 
97  typedef typename MatrixType::scalar_type scalar_type;
98 
100  typedef typename MatrixType::local_ordinal_type local_ordinal_type;
101 
103  typedef typename MatrixType::global_ordinal_type global_ordinal_type;
105  typedef typename MatrixType::node_type node_type;
106 
109 
111  typedef Tpetra::RowMatrix<scalar_type, local_ordinal_type, global_ordinal_type, node_type> row_matrix_type;
112 
113  static_assert (std::is_same<MatrixType, row_matrix_type>::value,
114  "Ifpack2::BlockRelaxation: Please use MatrixType = Tpetra::RowMatrix.");
115 
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 
131  void setParametersImpl(Teuchos::ParameterList& params);
132 
133  void computeImporter() const;
134 
136 
137  typedef Tpetra::MultiVector<scalar_type, local_ordinal_type,
139  typedef Tpetra::Vector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> vector_type;
142  typedef Tpetra::CrsMatrix<scalar_type, local_ordinal_type,
143  global_ordinal_type, node_type> crs_matrix_type;
144  typedef Tpetra::BlockCrsMatrix<scalar_type, local_ordinal_type,
145  global_ordinal_type, node_type> block_crs_matrix_type;
146  typedef Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> map_type;
147 public:
149 
150  // \name Constructors and Destructors
152 
182  explicit BlockRelaxation (const Teuchos::RCP<const row_matrix_type>& Matrix);
183 
185  virtual ~BlockRelaxation ();
186 
188 
190 
192 
219  void setParameters(const Teuchos::ParameterList& params);
220 
221  bool supportsZeroStartingSolution() { return true; }
222 
223  void setZeroStartingSolution (bool zeroStartingSolution) { ZeroStartingSolution_ = zeroStartingSolution; };
224 
227  getValidParameters () const;
228 
230  void initialize();
231 
233  inline bool isInitialized() const {
234  return(IsInitialized_);
235  }
236 
238  void compute();
239 
241  inline bool isComputed() const {
242  return(IsComputed_);
243  }
244 
246 
248 
271  virtual void
273 
275 
277 
279 
289  void apply(const MV& X,
290  MV& Y,
294 
297 
300 
301  bool hasTransposeApply() const;
302 
304 
310  void applyMat(const MV& X,
311  MV& Y,
312  Teuchos::ETransp mode = Teuchos::NO_TRANS) const;
313 
315 
317 
320 
323 
325  int getNumInitialize() const;
326 
328  int getNumCompute() const;
329 
331  int getNumApply() const;
332 
334  double getInitializeTime() const;
335 
337  double getComputeTime() const;
338 
340  double getApplyTime() const;
341 
343  size_t getNodeSmootherComplexity() const;
344 
346 
348 
350  std::string description() const;
351 
353  void
355  const Teuchos::EVerbosityLevel verbLevel =
357 
359 
362 
363 private:
364 
367 
370  operator= (const BlockRelaxation<MatrixType, ContainerType>& RHS);
371 
372  virtual void ApplyInverseJacobi (const MV& X, MV& Y) const;
373 
374  virtual void ApplyInverseGS (const MV& X, MV& Y) const;
375 
376  virtual void ApplyInverseSGS (const MV& X, MV& Y) const;
377 
380  void ExtractSubmatricesStructure();
381 
383 
385 
388 
390  mutable Teuchos::RCP<Container<row_matrix_type> > Container_;
391 
392  // FIXME (mfh 06 Oct 2014) This doesn't comply with the naming
393  // convention for instance members of a class. Furthermore, the
394  // class should keep the Vector, not the ArrayRCP to the data _in_
395  // the Vector.
396  // FIXED! (amk 10 Nov 2015)
397  mutable Teuchos::RCP<vector_type> DiagRCP_;
398 
401 
404  std::string PartitionerType_;
405 
408 
410  int NumSweeps_;
411 
413  local_ordinal_type NumLocalBlocks_;
414 
416  std::string containerType_;
417 
419  Details::RelaxationType PrecType_;
420 
422  bool IsParallel_;
423 
425  bool ZeroStartingSolution_;
426 
429  bool hasBlockCrsMatrix_;
430 
432  bool DoBackwardGS_;
433 
435  int OverlapLevel_;
436 
438  //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).
439  bool nonsymCombine_;
440 
442  std::string schwarzCombineMode_;
443 
445  scalar_type DampingFactor_;
446 
448  bool decouple_;
449 
451  bool IsInitialized_;
452 
454  bool IsComputed_;
455 
457  int NumInitialize_;
458 
460  int NumCompute_;
461 
463  bool TimerForApply_;
464 
466  mutable int NumApply_;
467 
469  double InitializeTime_;
470 
472  double ComputeTime_;
473 
475  mutable double ApplyTime_;
476 
478  local_ordinal_type NumLocalRows_;
479 
481  global_ordinal_type NumGlobalRows_;
482 
484  global_ordinal_type NumGlobalNonzeros_;
485 
489 
491 
493 }; //class BlockRelaxation
494 
495 }//namespace Ifpack2
496 
497 #endif // IFPACK2_BLOCKRELAXATION_DECL_HPP
498 
void setZeroStartingSolution(bool zeroStartingSolution)
Set this preconditioner&#39;s parameters.
Definition: Ifpack2_BlockRelaxation_decl.hpp:223
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:374
MatrixType::global_ordinal_type global_ordinal_type
The type of global indices in the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:103
std::string description() const
A one-line description of this object.
Definition: Ifpack2_BlockRelaxation_def.hpp:1084
double getApplyTime() const
Returns the time spent in apply().
Definition: Ifpack2_BlockRelaxation_def.hpp:469
int getNumApply() const
Returns the number of calls to apply().
Definition: Ifpack2_BlockRelaxation_def.hpp:445
Teuchos::RCP< const map_type > getRangeMap() const
Returns the Tpetra::Map object associated with the range of this operator.
Definition: Ifpack2_BlockRelaxation_def.hpp:411
int getNumCompute() const
Returns the number of calls to compute().
Definition: Ifpack2_BlockRelaxation_def.hpp:437
void setParameters(const Teuchos::ParameterList &params)
Sets all the parameters for the preconditioner.
Definition: Ifpack2_BlockRelaxation_def.hpp:189
void compute()
compute the preconditioner for the specified matrix, diagonal perturbation thresholds and relaxation ...
Definition: Ifpack2_BlockRelaxation_def.hpp:769
Block relaxation preconditioners (or smoothers) for Tpetra::RowMatrix and Tpetra::CrsMatrix sparse ma...
Definition: Ifpack2_BlockRelaxation_decl.hpp:82
double getInitializeTime() const
Returns the time spent in initialize().
Definition: Ifpack2_BlockRelaxation_def.hpp:453
double getComputeTime() const
Returns the time spent in compute().
Definition: Ifpack2_BlockRelaxation_def.hpp:461
bool isComputed() const
Return true if compute() has been called.
Definition: Ifpack2_BlockRelaxation_decl.hpp:241
size_t getNodeSmootherComplexity() const
Get a rough estimate of cost per iteration.
Definition: Ifpack2_BlockRelaxation_def.hpp:476
Teuchos::ScalarTraits< scalar_type >::magnitudeType magnitude_type
The type of the magnitude (absolute value) of a matrix entry.
Definition: Ifpack2_BlockRelaxation_decl.hpp:108
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:111
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:114
virtual void setMatrix(const Teuchos::RCP< const row_matrix_type > &A)
Change the matrix to be preconditioned.
Definition: Ifpack2_BlockRelaxation_def.hpp:62
virtual ~BlockRelaxation()
Destructor.
Definition: Ifpack2_BlockRelaxation_def.hpp:125
Interface for all Ifpack2 preconditioners.
Definition: Ifpack2_Preconditioner.hpp:107
Teuchos::RCP< const map_type > getDomainMap() const
Returns the Tpetra::Map object associated with the domain of this operator.
Definition: Ifpack2_BlockRelaxation_def.hpp:397
bool isInitialized() const
Returns true if the preconditioner has been successfully initialized.
Definition: Ifpack2_BlockRelaxation_decl.hpp:233
int getNumInitialize() const
Returns the number of calls to initialize().
Definition: Ifpack2_BlockRelaxation_def.hpp:430
Declaration of interface for preconditioners that can change their matrix after construction.
void initialize()
Initialize.
Definition: Ifpack2_BlockRelaxation_def.hpp:612
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:1148
MatrixType::node_type node_type
Node type of the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:105
MatrixType::local_ordinal_type local_ordinal_type
The type of local indices in the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:100
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:596
MatrixType::scalar_type scalar_type
The type of the entries of the input MatrixType.
Definition: Ifpack2_BlockRelaxation_decl.hpp:97
Interface for creating and solving a set of local linear problems.
Definition: Ifpack2_Container_decl.hpp:112
Teuchos::RCP< const row_matrix_type > getMatrix() const
The input matrix of this preconditioner&#39;s constructor.
Definition: Ifpack2_BlockRelaxation_def.hpp:388
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Return a list of all the parameters that this class accepts.
Definition: Ifpack2_BlockRelaxation_def.hpp:131
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:493
Teuchos::RCP< Ifpack2::Partitioner< Tpetra::RowGraph< local_ordinal_type, global_ordinal_type, node_type > > > getPartitioner()
For diagnostic purposes.
Definition: Ifpack2_BlockRelaxation_decl.hpp:361
BlockRelaxation(const Teuchos::RCP< const row_matrix_type > &Matrix)
Constructor.
Definition: Ifpack2_BlockRelaxation_def.hpp:90