Ifpack2 Templated Preconditioning Package Version 1.0
Loading...
Searching...
No Matches
Ifpack2_Chebyshev_decl.hpp
Go to the documentation of this file.
1/*
2@HEADER
3// ***********************************************************************
4//
5// Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
6// Copyright (2009) Sandia Corporation
7//
8// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9// license for use of this work by or on behalf of the U.S. Government.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
39//
40// ***********************************************************************
41//@HEADER
42*/
43
50
51#ifndef IFPACK2_CHEBYSHEV_DECL_HPP
52#define IFPACK2_CHEBYSHEV_DECL_HPP
53
56
57// FIXME (mfh 20 Nov 2013) We really shouldn't have to include this.
58// We should handle the implementation by pointer instead of by value.
59#include "Ifpack2_Details_Chebyshev.hpp"
60
61// We only need the declaration here, and only for the method
62// getCrsMatrix. I would very much prefer that this method not exist.
63// Furthermore, it is both unsafe (MatrixType need not be CrsMatrix)
64// and completely redundant (just call getMatrix() and do the
65// dynamic_cast yourself).
66#include "Tpetra_CrsMatrix_decl.hpp"
67
68#include <type_traits>
69
70namespace Ifpack2 {
71
198template<class MatrixType>
200 virtual public Ifpack2::Preconditioner<typename MatrixType::scalar_type,
201 typename MatrixType::local_ordinal_type,
202 typename MatrixType::global_ordinal_type,
203 typename MatrixType::node_type>,
204 virtual public Ifpack2::Details::CanChangeMatrix<Tpetra::RowMatrix<typename MatrixType::scalar_type,
205 typename MatrixType::local_ordinal_type,
206 typename MatrixType::global_ordinal_type,
207 typename MatrixType::node_type> >
208{
209public:
211
212
214 typedef MatrixType matrix_type;
215
217 typedef typename MatrixType::scalar_type scalar_type;
218
220 typedef typename MatrixType::local_ordinal_type local_ordinal_type;
221
223 typedef typename MatrixType::global_ordinal_type global_ordinal_type;
224
226 typedef typename MatrixType::node_type::device_type device_type;
227
229 typedef typename MatrixType::node_type node_type;
230
232 typedef typename Teuchos::ScalarTraits<scalar_type>::magnitudeType magnitude_type;
233
238 typedef Tpetra::RowMatrix<scalar_type, local_ordinal_type,
240
241 static_assert (std::is_same<MatrixType, row_matrix_type>::value,
242 "Ifpack2::Chebyshev: MatrixType must be a Tpetra::RowMatrix "
243 "specialization. Don't use Tpetra::CrsMatrix here.");
244
246 typedef Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> map_type;
247
253 typedef Tpetra::Vector<scalar_type, local_ordinal_type,
255
257 // \name Constructors and destructors
259
281 explicit Chebyshev (const Teuchos::RCP<const row_matrix_type>& A);
282
284 virtual ~Chebyshev ();
285
287
289
426 void setParameters (const Teuchos::ParameterList& params);
427
428 bool supportsZeroStartingSolution() { return true; }
429
430 void setZeroStartingSolution (bool zeroStartingSolution);
431
438 void initialize();
439
442 inline bool isInitialized() const {
443 return IsInitialized_;
444 }
445
478 void compute ();
479
489 inline bool isComputed() const {
490 return IsComputed_;
491 }
492
494
496
519 virtual void
520 setMatrix (const Teuchos::RCP<const row_matrix_type>& A);
521
523
525
554 void
555 apply (const Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& X,
556 Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& Y,
557 Teuchos::ETransp mode = Teuchos::NO_TRANS,
558 scalar_type alpha = Teuchos::ScalarTraits<scalar_type>::one(),
559 scalar_type beta = Teuchos::ScalarTraits<scalar_type>::zero()) const;
560
562 Teuchos::RCP<const map_type> getDomainMap() const;
563
565 Teuchos::RCP<const map_type> getRangeMap() const;
566
568 bool hasTransposeApply() const;
569
590 void
591 applyMat (const Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& X,
592 Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& Y,
593 Teuchos::ETransp mode = Teuchos::NO_TRANS) const;
594
596
598
600 Teuchos::RCP<const Teuchos::Comm<int> > getComm() const;
601
603 Teuchos::RCP<const row_matrix_type> getMatrix() const;
604
609 Teuchos::RCP<const Tpetra::CrsMatrix<scalar_type, local_ordinal_type, global_ordinal_type, node_type> >
610 getCrsMatrix() const;
611
613 double getComputeFlops() const;
614
616 double getApplyFlops() const;
617
619 int getNumInitialize() const;
620
622 int getNumCompute() const;
623
625 int getNumApply() const;
626
628 double getInitializeTime() const;
629
631 double getComputeTime() const;
632
634 double getApplyTime() const;
635
637 size_t getNodeSmootherComplexity() const;
638
640 typename MatrixType::scalar_type getLambdaMaxForApply() const;
641
643
645
647 std::string description() const;
648
650 void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const;
651
653
654private:
655
657 typedef Teuchos::ScalarTraits<typename MatrixType::scalar_type> STS;
658
660 typedef Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type> MV;
661
664
667
675 void
676 applyImpl (const MV& X,
677 MV& Y,
678 Teuchos::ETransp mode,
679 scalar_type alpha,
680 scalar_type beta) const;
681
683
684
693
695 bool IsInitialized_;
697 bool IsComputed_;
699 int NumInitialize_;
701 int NumCompute_;
706 mutable int NumApply_;
708 double InitializeTime_;
710 double ComputeTime_;
715 mutable double ApplyTime_;
717 double ComputeFlops_;
722 mutable double ApplyFlops_;
723
725}; // class Chebyshev
726
727} // namespace Ifpack2
728
729#endif // IFPACK2_CHEBYSHEV_DECL_HPP
730
Declaration of interface for preconditioners that can change their matrix after construction.
Diagonally scaled Chebyshev iteration for Tpetra sparse matrices.
Definition Ifpack2_Chebyshev_decl.hpp:208
MatrixType::global_ordinal_type global_ordinal_type
The type of global indices in the input MatrixType.
Definition Ifpack2_Chebyshev_decl.hpp:223
double getInitializeTime() const
The total time spent in all calls to initialize().
Definition Ifpack2_Chebyshev_def.hpp:194
void compute()
(Re)compute the left scaling, and (if applicable) estimate max and min eigenvalues of D_inv * A.
Definition Ifpack2_Chebyshev_def.hpp:311
std::string description() const
A simple one-line description of this object.
Definition Ifpack2_Chebyshev_def.hpp:338
Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > map_type
The Tpetra::Map specialization matching MatrixType.
Definition Ifpack2_Chebyshev_decl.hpp:246
Chebyshev(const Teuchos::RCP< const row_matrix_type > &A)
Constructor.
Definition Ifpack2_Chebyshev_def.hpp:58
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with some verbosity level to a Teuchos::FancyOStream.
Definition Ifpack2_Chebyshev_def.hpp:367
Teuchos::RCP< const map_type > getRangeMap() const
The Tpetra::Map representing the range of this operator.
Definition Ifpack2_Chebyshev_def.hpp:158
void applyMat(const Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &X, Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS) const
Compute Y = Op(A)*X, where Op(A) is either A, , or .
Definition Ifpack2_Chebyshev_def.hpp:277
void initialize()
Initialize the preconditioner.
Definition Ifpack2_Chebyshev_def.hpp:296
Teuchos::RCP< const row_matrix_type > getMatrix() const
The matrix for which this is a preconditioner.
Definition Ifpack2_Chebyshev_def.hpp:123
int getNumApply() const
The total number of successful calls to apply().
Definition Ifpack2_Chebyshev_def.hpp:188
Teuchos::ScalarTraits< scalar_type >::magnitudeType magnitude_type
The type of the magnitude (absolute value) of a matrix entry.
Definition Ifpack2_Chebyshev_decl.hpp:232
MatrixType::node_type::device_type device_type
The Kokkos::Device specialization used by the input MatrixType.
Definition Ifpack2_Chebyshev_decl.hpp:226
MatrixType::local_ordinal_type local_ordinal_type
The type of local indices in the input MatrixType.
Definition Ifpack2_Chebyshev_decl.hpp:220
bool isInitialized() const
Definition Ifpack2_Chebyshev_decl.hpp:442
MatrixType::node_type node_type
The Node type used by the input MatrixType.
Definition Ifpack2_Chebyshev_decl.hpp:229
size_t getNodeSmootherComplexity() const
Get a rough estimate of cost per iteration.
Definition Ifpack2_Chebyshev_def.hpp:223
Tpetra::Vector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > vector_type
The Tpetra::Vector specialization matching MatrixType.
Definition Ifpack2_Chebyshev_decl.hpp:254
MatrixType::scalar_type scalar_type
The type of the entries of the input MatrixType.
Definition Ifpack2_Chebyshev_decl.hpp:217
virtual void setMatrix(const Teuchos::RCP< const row_matrix_type > &A)
Change the matrix to be preconditioned.
Definition Ifpack2_Chebyshev_def.hpp:81
Tpetra::RowMatrix< scalar_type, local_ordinal_type, global_ordinal_type, node_type > row_matrix_type
The Tpetra::RowMatrix specialization matching MatrixType.
Definition Ifpack2_Chebyshev_decl.hpp:239
bool isComputed() const
Definition Ifpack2_Chebyshev_decl.hpp:489
int getNumCompute() const
The total number of successful calls to compute().
Definition Ifpack2_Chebyshev_def.hpp:182
void setParameters(const Teuchos::ParameterList &params)
Set (or reset) parameters.
Definition Ifpack2_Chebyshev_def.hpp:93
double getComputeFlops() const
The total number of floating-point operations taken by all calls to compute().
Definition Ifpack2_Chebyshev_def.hpp:212
double getComputeTime() const
The total time spent in all calls to compute().
Definition Ifpack2_Chebyshev_def.hpp:200
Teuchos::RCP< const Tpetra::CrsMatrix< scalar_type, local_ordinal_type, global_ordinal_type, node_type > > getCrsMatrix() const
Attempt to return the matrix A as a Tpetra::CrsMatrix.
Definition Ifpack2_Chebyshev_def.hpp:134
void setZeroStartingSolution(bool zeroStartingSolution)
Set this preconditioner's parameters.
Definition Ifpack2_Chebyshev_def.hpp:102
Teuchos::RCP< const map_type > getDomainMap() const
The Tpetra::Map representing the domain of this operator.
Definition Ifpack2_Chebyshev_def.hpp:144
int getNumInitialize() const
The total number of successful calls to initialize().
Definition Ifpack2_Chebyshev_def.hpp:176
virtual ~Chebyshev()
Destructor.
Definition Ifpack2_Chebyshev_def.hpp:76
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
The communicator over which the matrix is distributed.
Definition Ifpack2_Chebyshev_def.hpp:109
double getApplyFlops() const
The total number of floating-point operations taken by all calls to apply().
Definition Ifpack2_Chebyshev_def.hpp:218
MatrixType matrix_type
The template parameter of this class.
Definition Ifpack2_Chebyshev_decl.hpp:214
void apply(const Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &X, Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, scalar_type alpha=Teuchos::ScalarTraits< scalar_type >::one(), scalar_type beta=Teuchos::ScalarTraits< scalar_type >::zero()) const
Apply the preconditioner to X, returning the result in Y.
Definition Ifpack2_Chebyshev_def.hpp:238
MatrixType::scalar_type getLambdaMaxForApply() const
The estimate of the maximum eigenvalue used in the apply().
Definition Ifpack2_Chebyshev_def.hpp:501
bool hasTransposeApply() const
Whether it's possible to apply the transpose of this operator.
Definition Ifpack2_Chebyshev_def.hpp:170
double getApplyTime() const
The total time spent in all calls to apply().
Definition Ifpack2_Chebyshev_def.hpp:206
Mix-in interface for preconditioners that can change their matrix after construction.
Definition Ifpack2_Details_CanChangeMatrix.hpp:93
Left-scaled Chebyshev iteration.
Definition Ifpack2_Details_Chebyshev_decl.hpp:106
Interface for all Ifpack2 preconditioners.
Definition Ifpack2_Preconditioner.hpp:108
Preconditioners and smoothers for Tpetra sparse matrices.
Definition Ifpack2_AdditiveSchwarz_decl.hpp:74