Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Thyra_MultiVectorPreconditioner.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_MultiVectorPreconditioner_hpp
10 #define Thyra_MultiVectorPreconditioner_hpp
11 
12 #include "Thyra_PreconditionerBase.hpp"
13 #include "Teuchos_ConstNonconstObjectContainer.hpp"
15 #include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
16 
17 namespace Thyra {
18 
22 template <class Scalar>
23 class MultiVectorPreconditioner : virtual public PreconditionerBase<Scalar> {
24  public:
27 
30 
32  const RCP<PreconditionerBase<Scalar> > &prec,
34  &multiVecRange,
36  &multiVecDomain)
37  {
38  validateInitialize(prec, multiVecRange, multiVecDomain);
39  prec_ = prec;
40  multiVecRange_ = multiVecRange;
41  multiVecDomain_ = multiVecDomain;
42  }
43 
44  void initialize(const RCP<const PreconditionerBase<Scalar> > &prec,
46  &multiVecRange,
48  &multiVecDomain)
49  {
50  validateInitialize(prec, multiVecRange, multiVecDomain);
51  prec_ = prec;
52  multiVecRange_ = multiVecRange;
53  multiVecDomain_ = multiVecDomain;
54  }
55 
56  RCP<PreconditionerBase<Scalar> > getNonconstPreconditioner()
57  {
58  return prec_.getNonconstObj();
59  }
60 
61  RCP<const PreconditionerBase<Scalar> > getPreconditioner() const
62  {
63  return prec_.getConstObj();
64  }
65 
66  void uninitialize()
67  {
69  multiVecRange_ = Teuchos::null;
70  multiVecDomain_ = Teuchos::null;
71  }
72 
74 
77 
78  bool isLeftPrecOpConst() const
79  {
80  return prec_.getConstObj()->isLeftPrecOpConst();
81  }
82 
84  {
85  return nonconstMultiVectorLinearOp(
86  prec_.getNonconstObj()->getNonconstLeftPrecOp(), multiVecRange_,
88  }
89 
91  {
92  return multiVectorLinearOp(prec_.getConstObj()->getLeftPrecOp(),
94  }
95 
96  bool isRightPrecOpConst() const
97  {
98  return prec_.getConstObj()->isRightPrecOpConst();
99  }
100 
102  {
103  return nonconstMultiVectorLinearOp(
104  prec_.getNonconstObj()->getNonconstRightPrecOp(), multiVecRange_,
106  }
107 
109  {
110  return multiVectorLinearOp(prec_.getConstObj()->getRightPrecOp(),
112  }
113 
115  {
116  return prec_.getConstObj()->isUnspecifiedPrecOpConst();
117  }
118 
120  {
121  return nonconstMultiVectorLinearOp(
122  prec_.getNonconstObj()->getNonconstUnspecifiedPrecOp(), multiVecRange_,
124  }
125 
127  {
128  return multiVectorLinearOp(prec_.getNonconstObj()->getUnspecifiedPrecOp(),
130  }
131 
133 
134  private:
135  // //////////////////////////////
136  // Private types
137 
140 
141  // //////////////////////////////
142  // Private data members
143 
145  RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecRange_;
146  RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecDomain_;
147 
148  // //////////////////////////////
149  // Private member functions
150 
151  static void validateInitialize(
152  const RCP<const PreconditionerBase<Scalar> > &prec,
154  &multiVecRange,
156  &multiVecDomain)
157  {
158 #ifdef TEUCHOS_DEBUG
160  TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecRange));
161  TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecDomain));
162  TEUCHOS_TEST_FOR_EXCEPT(multiVecRange->numBlocks() !=
163  multiVecDomain->numBlocks());
164 #else
165  (void)prec;
166  (void)multiVecRange;
167  (void)multiVecDomain;
168 #endif
169  }
170 };
171 
176 template <class Scalar>
177 RCP<MultiVectorPreconditioner<Scalar> > multiVectorPreconditioner()
178 {
180 }
181 
186 template <class Scalar>
187 RCP<MultiVectorPreconditioner<Scalar> > nonconstMultiVectorPreconditioner(
188  const RCP<PreconditionerBase<Scalar> > &prec,
190  &multiVecRange,
192  &multiVecDomain)
193 {
194  RCP<MultiVectorPreconditioner<Scalar> > mvprec =
196  mvprec->nonconstInitialize(prec, multiVecRange, multiVecDomain);
197  return mvprec;
198 }
199 
204 template <class Scalar>
205 RCP<MultiVectorPreconditioner<Scalar> > multiVectorPreconditioner(
206  const RCP<const PreconditionerBase<Scalar> > &prec,
208  &multiVecRange,
210  &multiVecDomain)
211 {
212  RCP<MultiVectorPreconditioner<Scalar> > mvprec =
214  mvprec->initialize(prec, multiVecRange, multiVecDomain);
215  return mvprec;
216 }
217 
218 } // end namespace Thyra
219 
220 #endif
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstLeftPrecOp()
bool is_null(const boost::shared_ptr< T > &p)
RCP< PreconditionerBase< Scalar > > getNonconstPreconditioner()
void nonconstInitialize(const RCP< PreconditionerBase< Scalar > > &prec, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Teuchos::RCP< const LinearOpBase< Scalar > > getLeftPrecOp() const
RCP< MultiVectorPreconditioner< Scalar > > multiVectorPreconditioner()
Nonmember constructor function.
RCP< const PreconditionerBase< Scalar > > getPreconditioner() const
Teuchos::ConstNonconstObjectContainer< PreconditionerBase< Scalar > > CNPB
RCP< MultiVectorPreconditioner< Scalar > > nonconstMultiVectorPreconditioner(const RCP< PreconditionerBase< Scalar > > &prec, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
Teuchos::RCP< const LinearOpBase< Scalar > > getRightPrecOp() const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
static void validateInitialize(const RCP< const PreconditionerBase< Scalar > > &prec, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
RCP< const ObjType > getConstObj() const
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstRightPrecOp()
RCP< MultiVectorPreconditioner< Scalar > > multiVectorPreconditioner(const RCP< const PreconditionerBase< Scalar > > &prec, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
Teuchos::RCP< const LinearOpBase< Scalar > > getUnspecifiedPrecOp() const
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstUnspecifiedPrecOp()
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
MultiVectorPreconditioner()
Construct to uninitialized.
RCP< ObjType > getNonconstObj() const
void initialize(const RCP< const PreconditionerBase< Scalar > > &prec, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)