Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Thyra_AdjointPreconditioner.hpp
Go to the documentation of this file.
1 //@HEADER
2 // *****************************************************************************
3 // Tempus: Time Integration and Sensitivity Analysis Package
4 //
5 // Copyright 2017 NTESS and the Tempus contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 //@HEADER
9 
10 #ifndef Thyra_AdjointPreconditioner_hpp
11 #define Thyra_AdjointPreconditioner_hpp
12 
13 #include "Thyra_PreconditionerBase.hpp"
14 #include "Teuchos_ConstNonconstObjectContainer.hpp"
15 #include "Thyra_DefaultScaledAdjointLinearOp.hpp"
16 
17 namespace Thyra {
18 
22 template <class Scalar>
23 class AdjointPreconditioner : virtual public PreconditionerBase<Scalar> {
24  public:
27 
30 
32  {
33  validateInitialize(prec);
34  prec_ = prec;
35  }
36 
37  void initialize(const RCP<const PreconditionerBase<Scalar> > &prec)
38  {
39  validateInitialize(prec);
40  prec_ = prec;
41  }
42 
43  RCP<PreconditionerBase<Scalar> > getNonconstPreconditioner()
44  {
45  return prec_.getNonconstObj();
46  }
47 
48  RCP<const PreconditionerBase<Scalar> > getPreconditioner() const
49  {
50  return prec_.getConstObj();
51  }
52 
54 
56 
59 
60  bool isLeftPrecOpConst() const
61  {
62  return prec_.getConstObj()->isLeftPrecOpConst();
63  }
64 
66  {
67  return nonconstAdjoint(prec_.getNonconstObj()->getNonconstLeftPrecOp());
68  }
69 
71  {
72  return adjoint(prec_.getConstObj()->getLeftPrecOp());
73  }
74 
75  bool isRightPrecOpConst() const
76  {
77  return prec_.getConstObj()->isRightPrecOpConst();
78  }
79 
81  {
82  return nonconstAdjoint(prec_.getNonconstObj()->getNonconstRightPrecOp());
83  }
84 
86  {
87  return adjoint(prec_.getConstObj()->getRightPrecOp());
88  }
89 
91  {
92  return prec_.getConstObj()->isUnspecifiedPrecOpConst();
93  }
94 
96  {
97  return nonconstAdjoint(
98  prec_.getNonconstObj()->getNonconstUnspecifiedPrecOp());
99  }
100 
102  {
103  return adjoint(prec_.getNonconstObj()->getUnspecifiedPrecOp());
104  }
105 
107 
108  private:
109  // //////////////////////////////
110  // Private types
111 
114 
115  // //////////////////////////////
116  // Private data members
117 
119 
120  // //////////////////////////////
121  // Private member functions
122 
123  static void validateInitialize(
124  const RCP<const PreconditionerBase<Scalar> > &prec)
125  {
126 #ifdef TEUCHOS_DEBUG
128 #else
129  (void)prec;
130 #endif
131  }
132 };
133 
138 template <class Scalar>
139 RCP<AdjointPreconditioner<Scalar> > adjointPreconditioner()
140 {
142 }
143 
148 template <class Scalar>
149 RCP<AdjointPreconditioner<Scalar> > nonconstAdjointPreconditioner(
150  const RCP<PreconditionerBase<Scalar> > &prec)
151 {
152  RCP<AdjointPreconditioner<Scalar> > aprec =
154  aprec->nonconstInitialize(prec);
155  return aprec;
156 }
157 
162 template <class Scalar>
163 RCP<AdjointPreconditioner<Scalar> > adjointPreconditioner(
164  const RCP<const PreconditionerBase<Scalar> > &prec)
165 {
166  RCP<AdjointPreconditioner<Scalar> > aprec =
168  aprec->initialize(prec);
169  return aprec;
170 }
171 
172 } // end namespace Thyra
173 
174 #endif
bool is_null(const boost::shared_ptr< T > &p)
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
RCP< AdjointPreconditioner< Scalar > > adjointPreconditioner()
Nonmember constructor function.
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstRightPrecOp()
RCP< AdjointPreconditioner< Scalar > > adjointPreconditioner(const RCP< const PreconditionerBase< Scalar > > &prec)
Nonmember constructor function.
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstLeftPrecOp()
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
void initialize(const RCP< const PreconditionerBase< Scalar > > &prec)
Teuchos::RCP< const LinearOpBase< Scalar > > getRightPrecOp() const
RCP< const ObjType > getConstObj() const
AdjointPreconditioner()
Construct to uninitialized.
void nonconstInitialize(const RCP< PreconditionerBase< Scalar > > &prec)
Teuchos::RCP< const LinearOpBase< Scalar > > getLeftPrecOp() const
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstUnspecifiedPrecOp()
static void validateInitialize(const RCP< const PreconditionerBase< Scalar > > &prec)
RCP< ObjType > getNonconstObj() const
RCP< PreconditionerBase< Scalar > > getNonconstPreconditioner()
Teuchos::RCP< const LinearOpBase< Scalar > > getUnspecifiedPrecOp() const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
Teuchos::ConstNonconstObjectContainer< PreconditionerBase< Scalar > > CNPB
RCP< AdjointPreconditioner< Scalar > > nonconstAdjointPreconditioner(const RCP< PreconditionerBase< Scalar > > &prec)
Nonmember constructor function.
RCP< const PreconditionerBase< Scalar > > getPreconditioner() const