libMesh
trilinos_preconditioner.h
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2019 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 
19 
20 #ifndef LIBMESH_TRILINOS_PRECONDITIONER_H
21 #define LIBMESH_TRILINOS_PRECONDITIONER_H
22 
23 #include "libmesh/libmesh_config.h"
24 
25 #ifdef LIBMESH_TRILINOS_HAVE_EPETRA
26 
27 // Local includes
28 #include "libmesh/preconditioner.h"
29 #include "libmesh/libmesh_common.h"
30 #include "libmesh/reference_counted_object.h"
31 #include "libmesh/libmesh.h"
32 
33 // Trilinos includes. Ignore many unused parameter warnings coming
34 // from these headers.
35 #include "libmesh/ignore_warnings.h"
36 #include "Epetra_Operator.h"
37 #include "Epetra_FECrsMatrix.h"
38 #include "Teuchos_ParameterList.hpp"
39 #include "libmesh/restore_warnings.h"
40 
41 #ifdef LIBMESH_FORWARD_DECLARE_ENUMS
42 namespace libMesh
43 {
44 enum PreconditionerType : int;
45 }
46 #else
47 #include "libmesh/enum_preconditioner_type.h"
48 #endif
49 
50 // C++ includes
51 #include <cstddef>
52 
53 namespace libMesh
54 {
55 
56 // forward declarations
57 template <typename T> class SparseMatrix;
58 template <typename T> class NumericVector;
59 template <typename T> class ShellMatrix;
60 
69 template <typename T>
71  public Preconditioner<T>,
72  public Epetra_Operator
73 {
74 public:
75 
79  TrilinosPreconditioner (const libMesh::Parallel::Communicator & comm);
80 
84  virtual ~TrilinosPreconditioner ();
85 
86  virtual void apply(const NumericVector<T> & x, NumericVector<T> & y) override;
87 
88  virtual void clear () override {}
89 
90  virtual void init () override;
91 
95  void set_params(Teuchos::ParameterList & list);
96 
100  Epetra_FECrsMatrix * mat() { return _mat; }
101 
107  void set_preconditioner_type (const PreconditionerType & preconditioner_type);
108 
112  void compute();
113 
114 protected:
115 
119  Epetra_Operator * _prec;
120 
124  Epetra_FECrsMatrix * _mat;
125 
129  Teuchos::ParameterList _param_list;
130 
131  // Epetra_Operator interface
132  virtual int SetUseTranspose(bool UseTranspose) override;
133  virtual int Apply(const Epetra_MultiVector & X, Epetra_MultiVector & Y) const override;
134  virtual int ApplyInverse(const Epetra_MultiVector & r, Epetra_MultiVector & z) const override;
135  virtual double NormInf() const override;
136  virtual const char * Label() const override;
137  virtual bool UseTranspose() const override;
138  virtual bool HasNormInf() const override;
139  virtual const Epetra_Comm & Comm() const override;
140  virtual const Epetra_Map & OperatorDomainMap() const override;
141  virtual const Epetra_Map & OperatorRangeMap() const override;
142 };
143 
144 
145 
146 
147 /*----------------------- inline functions ----------------------------------*/
148 template <typename T>
149 inline
150 TrilinosPreconditioner<T>::TrilinosPreconditioner (const libMesh::Parallel::Communicator & comm) :
151  Preconditioner<T>(comm),
152  _prec(nullptr),
153  _mat(nullptr)
154 {
155 }
156 
157 
158 
159 template <typename T>
160 inline
162 {
163  this->clear ();
164 }
165 
166 } // namespace libMesh
167 
168 #endif // LIBMESH_TRILINOS_HAVE_EPETRA
169 #endif // LIBMESH_TRILINOS_PRECONDITIONER_H
libMesh::TrilinosPreconditioner::_prec
Epetra_Operator * _prec
Trilinos preconditioner.
Definition: trilinos_preconditioner.h:119
libMesh::TrilinosPreconditioner::clear
virtual void clear() override
Release all memory and clear data structures.
Definition: trilinos_preconditioner.h:88
libMesh::TrilinosPreconditioner::_param_list
Teuchos::ParameterList _param_list
Parameter list to be used for building the preconditioner.
Definition: trilinos_preconditioner.h:129
libMesh::TrilinosPreconditioner
This class provides an interface to the suite of preconditioners available from Trilinos.
Definition: trilinos_preconditioner.h:70
libMesh::TrilinosPreconditioner::HasNormInf
virtual bool HasNormInf() const override
Definition: trilinos_preconditioner.C:233
libMesh::TrilinosPreconditioner::Label
virtual const char * Label() const override
Definition: trilinos_preconditioner.C:219
libMesh::TrilinosPreconditioner::apply
virtual void apply(const NumericVector< T > &x, NumericVector< T > &y) override
Computes the preconditioned vector y based on input vector x.
Definition: trilinos_preconditioner.C:49
libMesh::TrilinosPreconditioner::mat
Epetra_FECrsMatrix * mat()
Definition: trilinos_preconditioner.h:100
libMesh
The libMesh namespace provides an interface to certain functionality in the library.
Definition: factoryfunction.C:55
libMesh::TrilinosPreconditioner::SetUseTranspose
virtual int SetUseTranspose(bool UseTranspose) override
Definition: trilinos_preconditioner.C:191
libMesh::ParallelObject::comm
const Parallel::Communicator & comm() const
Definition: parallel_object.h:94
libMesh::TrilinosPreconditioner::compute
void compute()
Compute the preconditioner.
Definition: trilinos_preconditioner.C:86
libMesh::TrilinosPreconditioner::Apply
virtual int Apply(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const override
Definition: trilinos_preconditioner.C:198
libMesh::NumericVector
Provides a uniform interface to vector storage schemes for different linear algebra libraries.
Definition: vector_fe_ex5.C:43
libMesh::TrilinosPreconditioner::~TrilinosPreconditioner
virtual ~TrilinosPreconditioner()
Destructor.
Definition: trilinos_preconditioner.h:161
libMesh::TrilinosPreconditioner::NormInf
virtual double NormInf() const override
Definition: trilinos_preconditioner.C:212
libMesh::TrilinosPreconditioner::set_params
void set_params(Teuchos::ParameterList &list)
Stores a copy of the ParameterList list internally.
Definition: trilinos_preconditioner.C:78
libMesh::TrilinosPreconditioner::ApplyInverse
virtual int ApplyInverse(const Epetra_MultiVector &r, Epetra_MultiVector &z) const override
Definition: trilinos_preconditioner.C:205
libMesh::TrilinosPreconditioner::Comm
virtual const Epetra_Comm & Comm() const override
Definition: trilinos_preconditioner.C:240
libMesh::TrilinosPreconditioner::UseTranspose
virtual bool UseTranspose() const override
Definition: trilinos_preconditioner.C:226
libMesh::TrilinosPreconditioner::set_preconditioner_type
void set_preconditioner_type(const PreconditionerType &preconditioner_type)
Sets the Trilinos preconditioner to use based on the libMesh PreconditionerType.
Definition: trilinos_preconditioner.C:126
libMesh::Preconditioner
This class provides a uniform interface for preconditioners.
Definition: preconditioner.h:66
libMesh::TrilinosPreconditioner::OperatorDomainMap
virtual const Epetra_Map & OperatorDomainMap() const override
Definition: trilinos_preconditioner.C:247
libMesh::TrilinosPreconditioner::_mat
Epetra_FECrsMatrix * _mat
Trilinos matrix that's been pulled out of the _matrix object.
Definition: trilinos_preconditioner.h:124
libMesh::PreconditionerType
PreconditionerType
Defines an enum for preconditioner types.
Definition: enum_preconditioner_type.h:33
libMesh::TrilinosPreconditioner::OperatorRangeMap
virtual const Epetra_Map & OperatorRangeMap() const override
Definition: trilinos_preconditioner.C:254
libMesh::TrilinosPreconditioner::TrilinosPreconditioner
TrilinosPreconditioner(const libMesh::Parallel::Communicator &comm)
Constructor.
Definition: trilinos_preconditioner.h:150
libMesh::TrilinosPreconditioner::init
virtual void init() override
Initialize data structures if not done so already.
Definition: trilinos_preconditioner.C:58
int
void ErrorVector unsigned int
Definition: adjoints_ex3.C:360