Tempus  Version of the Day
Time Integration
Thyra_AdjointPreconditioner.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ****************************************************************************
3 // Tempus: Copyright (2017) Sandia Corporation
4 //
5 // Distributed under BSD 3-clause license (See accompanying file Copyright.txt)
6 // ****************************************************************************
7 // @HEADER
8 
9 #ifndef Thyra_AdjointPreconditioner_hpp
10 #define Thyra_AdjointPreconditioner_hpp
11 
12 #include "Thyra_PreconditionerBase.hpp"
13 #include "Teuchos_ConstNonconstObjectContainer.hpp"
14 #include "Thyra_DefaultScaledAdjointLinearOp.hpp"
15 
16 namespace Thyra {
17 
18 /** \brief Concrete <tt>PreconditionerBase</tt> subclass that
19  * wraps a preconditioner operator in MultiVectorLinearOp.
20  */
21 template<class Scalar>
22 class AdjointPreconditioner : virtual public PreconditionerBase<Scalar>
23 {
24 public:
25 
26  /** @name Constructors/initializers/accessors */
27  //@{
28 
29  /** \brief Construct to uninitialized. */
31 
33  const RCP<PreconditionerBase<Scalar> > &prec) {
34  validateInitialize(prec);
35  prec_ = prec;
36  }
37 
38  void initialize(
39  const RCP<const PreconditionerBase<Scalar> > &prec) {
40  validateInitialize(prec);
41  prec_ = prec;
42  }
43 
44  RCP<PreconditionerBase<Scalar> >
45  getNonconstPreconditioner() { return prec_.getNonconstObj(); }
46 
47  RCP<const PreconditionerBase<Scalar> >
48  getPreconditioner() const { return prec_.getConstObj(); }
49 
50  void uninitialize() {
51  prec_.uninitialize();
52  }
53 
54  //@}
55 
56  /** @name Overridden from PreconditionerBase */
57  //@{
58 
59  bool isLeftPrecOpConst() const
60  { return prec_.getConstObj()->isLeftPrecOpConst(); }
61 
62  Teuchos::RCP<LinearOpBase<Scalar> > getNonconstLeftPrecOp()
63  { return nonconstAdjoint(prec_.getNonconstObj()->getNonconstLeftPrecOp()); }
64 
65  Teuchos::RCP<const LinearOpBase<Scalar> > getLeftPrecOp() const
66  { return adjoint(prec_.getConstObj()->getLeftPrecOp()); }
67 
68  bool isRightPrecOpConst() const
69  { return prec_.getConstObj()->isRightPrecOpConst(); }
70 
71  Teuchos::RCP<LinearOpBase<Scalar> > getNonconstRightPrecOp()
72  { return nonconstAdjoint(prec_.getNonconstObj()->getNonconstRightPrecOp()); }
73 
74  Teuchos::RCP<const LinearOpBase<Scalar> > getRightPrecOp() const
75  { return adjoint(prec_.getConstObj()->getRightPrecOp()); }
76 
78  { return prec_.getConstObj()->isUnspecifiedPrecOpConst(); }
79 
80  Teuchos::RCP<LinearOpBase<Scalar> > getNonconstUnspecifiedPrecOp()
81  { return nonconstAdjoint(
82  prec_.getNonconstObj()->getNonconstUnspecifiedPrecOp()); }
83 
84  Teuchos::RCP<const LinearOpBase<Scalar> > getUnspecifiedPrecOp() const
85  { return adjoint(prec_.getNonconstObj()->getUnspecifiedPrecOp()); }
86 
87  //@}
88 
89 private:
90 
91  // //////////////////////////////
92  // Private types
93 
94  typedef Teuchos::ConstNonconstObjectContainer<PreconditionerBase<Scalar> > CNPB;
95 
96  // //////////////////////////////
97  // Private data members
98 
100 
101  // //////////////////////////////
102  // Private member functions
103 
104  static void validateInitialize(
105  const RCP<const PreconditionerBase<Scalar> > &prec) {
106 #ifdef TEUCHOS_DEBUG
107  TEUCHOS_TEST_FOR_EXCEPT(is_null(prec));
108 #endif
109  }
110 
111 };
112 
113 /** \brief Nonmember constructor function.
114  *
115  * \relates AdjointPreconditioner
116  */
117 template<class Scalar>
118 RCP<AdjointPreconditioner<Scalar> >
120 {
121  return Teuchos::rcp(new AdjointPreconditioner<Scalar>());
122 }
123 
124 /** \brief Nonmember constructor function.
125  *
126  * \relates AdjointPreconditioner
127  */
128 template<class Scalar>
129 RCP<AdjointPreconditioner<Scalar> >
131  const RCP<PreconditionerBase<Scalar> > &prec
132  )
133 {
134  RCP<AdjointPreconditioner<Scalar> >
135  aprec = Teuchos::rcp(new AdjointPreconditioner<Scalar>());
136  aprec->nonconstInitialize(prec);
137  return aprec;
138 }
139 
140 /** \brief Nonmember constructor function.
141  *
142  * \relates AdjointPreconditioner
143  */
144 template<class Scalar>
145 RCP<AdjointPreconditioner<Scalar> >
147  const RCP<const PreconditionerBase<Scalar> > &prec
148  )
149 {
150  RCP<AdjointPreconditioner<Scalar> >
151  aprec = Teuchos::rcp(new AdjointPreconditioner<Scalar>());
152  aprec->initialize(prec);
153  return aprec;
154 }
155 
156 } // end namespace Thyra
157 
158 #endif
Thyra::AdjointPreconditioner::isUnspecifiedPrecOpConst
bool isUnspecifiedPrecOpConst() const
Definition: Thyra_AdjointPreconditioner.hpp:77
Thyra::AdjointPreconditioner::AdjointPreconditioner
AdjointPreconditioner()
Construct to uninitialized.
Definition: Thyra_AdjointPreconditioner.hpp:30
Thyra::AdjointPreconditioner
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
Definition: Thyra_AdjointPreconditioner.hpp:22
Thyra::AdjointPreconditioner::CNPB
Teuchos::ConstNonconstObjectContainer< PreconditionerBase< Scalar > > CNPB
Definition: Thyra_AdjointPreconditioner.hpp:94
Thyra::AdjointPreconditioner::getRightPrecOp
Teuchos::RCP< const LinearOpBase< Scalar > > getRightPrecOp() const
Definition: Thyra_AdjointPreconditioner.hpp:74
Thyra::AdjointPreconditioner::validateInitialize
static void validateInitialize(const RCP< const PreconditionerBase< Scalar > > &prec)
Definition: Thyra_AdjointPreconditioner.hpp:104
Thyra::AdjointPreconditioner::isLeftPrecOpConst
bool isLeftPrecOpConst() const
Definition: Thyra_AdjointPreconditioner.hpp:59
Thyra::AdjointPreconditioner::getNonconstLeftPrecOp
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstLeftPrecOp()
Definition: Thyra_AdjointPreconditioner.hpp:62
Thyra::AdjointPreconditioner::getNonconstUnspecifiedPrecOp
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstUnspecifiedPrecOp()
Definition: Thyra_AdjointPreconditioner.hpp:80
Thyra::AdjointPreconditioner::nonconstAdjointPreconditioner
RCP< AdjointPreconditioner< Scalar > > nonconstAdjointPreconditioner(const RCP< PreconditionerBase< Scalar > > &prec)
Nonmember constructor function.
Definition: Thyra_AdjointPreconditioner.hpp:130
Thyra::AdjointPreconditioner::getUnspecifiedPrecOp
Teuchos::RCP< const LinearOpBase< Scalar > > getUnspecifiedPrecOp() const
Definition: Thyra_AdjointPreconditioner.hpp:84
Thyra::AdjointPreconditioner::getNonconstPreconditioner
RCP< PreconditionerBase< Scalar > > getNonconstPreconditioner()
Definition: Thyra_AdjointPreconditioner.hpp:45
Thyra::AdjointPreconditioner::prec_
CNPB prec_
Definition: Thyra_AdjointPreconditioner.hpp:99
Thyra::AdjointPreconditioner::nonconstInitialize
void nonconstInitialize(const RCP< PreconditionerBase< Scalar > > &prec)
Definition: Thyra_AdjointPreconditioner.hpp:32
Thyra::AdjointPreconditioner::uninitialize
void uninitialize()
Definition: Thyra_AdjointPreconditioner.hpp:50
Thyra::AdjointPreconditioner::initialize
void initialize(const RCP< const PreconditionerBase< Scalar > > &prec)
Definition: Thyra_AdjointPreconditioner.hpp:38
Thyra::AdjointPreconditioner::getNonconstRightPrecOp
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstRightPrecOp()
Definition: Thyra_AdjointPreconditioner.hpp:71
Thyra::AdjointPreconditioner::getLeftPrecOp
Teuchos::RCP< const LinearOpBase< Scalar > > getLeftPrecOp() const
Definition: Thyra_AdjointPreconditioner.hpp:65
Thyra::AdjointPreconditioner::adjointPreconditioner
RCP< AdjointPreconditioner< Scalar > > adjointPreconditioner(const RCP< const PreconditionerBase< Scalar > > &prec)
Nonmember constructor function.
Definition: Thyra_AdjointPreconditioner.hpp:146
Thyra::AdjointPreconditioner::getPreconditioner
RCP< const PreconditionerBase< Scalar > > getPreconditioner() const
Definition: Thyra_AdjointPreconditioner.hpp:48
Thyra::AdjointPreconditioner::isRightPrecOpConst
bool isRightPrecOpConst() const
Definition: Thyra_AdjointPreconditioner.hpp:68
Thyra::AdjointPreconditioner::adjointPreconditioner
RCP< AdjointPreconditioner< Scalar > > adjointPreconditioner()
Nonmember constructor function.
Definition: Thyra_AdjointPreconditioner.hpp:119
Thyra
Definition: Thyra_AdjointLinearOpWithSolveFactory.hpp:19