Tempus  Version of the Day
Time Integration
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 
19 /** \brief Concrete <tt>PreconditionerBase</tt> subclass that
20  * wraps a preconditioner operator in MultiVectorLinearOp.
21  */
22 template<class Scalar>
23 class MultiVectorPreconditioner : virtual public PreconditionerBase<Scalar>
24 {
25 public:
26 
27  /** @name Constructors/initializers/accessors */
28  //@{
29 
30  /** \brief Construct to uninitialized. */
32 
34  const RCP<PreconditionerBase<Scalar> > &prec,
35  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
36  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
37  ) {
38  validateInitialize(prec,multiVecRange,multiVecDomain);
39  prec_ = prec;
40  multiVecRange_ = multiVecRange;
41  multiVecDomain_ = multiVecDomain;
42  }
43 
44  void initialize(
45  const RCP<const PreconditionerBase<Scalar> > &prec,
46  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
47  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain) {
48  validateInitialize(prec,multiVecRange,multiVecDomain);
49  prec_ = prec;
50  multiVecRange_ = multiVecRange;
51  multiVecDomain_ = multiVecDomain;
52  }
53 
54  RCP<PreconditionerBase<Scalar> >
55  getNonconstPreconditioner() { return prec_.getNonconstObj(); }
56 
57  RCP<const PreconditionerBase<Scalar> >
58  getPreconditioner() const { return prec_.getConstObj(); }
59 
60  void uninitialize() {
61  prec_.uninitialize();
62  multiVecRange_ = Teuchos::null;
63  multiVecDomain_ = Teuchos::null;
64  }
65 
66  //@}
67 
68  /** @name Overridden from PreconditionerBase */
69  //@{
70 
71  bool isLeftPrecOpConst() const
72  { return prec_.getConstObj()->isLeftPrecOpConst(); }
73 
74  Teuchos::RCP<LinearOpBase<Scalar> > getNonconstLeftPrecOp()
75  { return nonconstMultiVectorLinearOp(
76  prec_.getNonconstObj()->getNonconstLeftPrecOp(),
78  multiVecDomain_); }
79 
80  Teuchos::RCP<const LinearOpBase<Scalar> > getLeftPrecOp() const
81  { return multiVectorLinearOp(
82  prec_.getConstObj()->getLeftPrecOp(),
84  multiVecDomain_); }
85 
86  bool isRightPrecOpConst() const
87  { return prec_.getConstObj()->isRightPrecOpConst(); }
88 
89  Teuchos::RCP<LinearOpBase<Scalar> > getNonconstRightPrecOp()
90  { return nonconstMultiVectorLinearOp(
91  prec_.getNonconstObj()->getNonconstRightPrecOp(),
93  multiVecDomain_); }
94 
95  Teuchos::RCP<const LinearOpBase<Scalar> > getRightPrecOp() const
96  { return multiVectorLinearOp(
97  prec_.getConstObj()->getRightPrecOp(),
99  multiVecDomain_); }
100 
102  { return prec_.getConstObj()->isUnspecifiedPrecOpConst(); }
103 
104  Teuchos::RCP<LinearOpBase<Scalar> > getNonconstUnspecifiedPrecOp()
105  { return nonconstMultiVectorLinearOp(
106  prec_.getNonconstObj()->getNonconstUnspecifiedPrecOp(),
108  multiVecDomain_); }
109 
110  Teuchos::RCP<const LinearOpBase<Scalar> > getUnspecifiedPrecOp() const
111  { return multiVectorLinearOp(
112  prec_.getNonconstObj()->getUnspecifiedPrecOp(),
114  multiVecDomain_); }
115 
116  //@}
117 
118 private:
119 
120  // //////////////////////////////
121  // Private types
122 
123  typedef Teuchos::ConstNonconstObjectContainer<PreconditionerBase<Scalar> > CNPB;
124 
125  // //////////////////////////////
126  // Private data members
127 
129  RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecRange_;
130  RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecDomain_;
131 
132  // //////////////////////////////
133  // Private member functions
134 
135  static void validateInitialize(
136  const RCP<const PreconditionerBase<Scalar> > &prec,
137  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
138  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
139  ) {
140 #ifdef TEUCHOS_DEBUG
141  TEUCHOS_TEST_FOR_EXCEPT(is_null(prec));
142  TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecRange));
143  TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecDomain));
144  TEUCHOS_TEST_FOR_EXCEPT( multiVecRange->numBlocks() != multiVecDomain->numBlocks() );
145 #endif
146  }
147 
148 };
149 
150 /** \brief Nonmember constructor function.
151  *
152  * \relates MultiVectorPreconditioner
153  */
154 template<class Scalar>
155 RCP<MultiVectorPreconditioner<Scalar> >
157 {
158  return Teuchos::rcp(new MultiVectorPreconditioner<Scalar>());
159 }
160 
161 /** \brief Nonmember constructor function.
162  *
163  * \relates MultiVectorPreconditioner
164  */
165 template<class Scalar>
166 RCP<MultiVectorPreconditioner<Scalar> >
168  const RCP<PreconditionerBase<Scalar> > &prec,
169  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
170  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
171  )
172 {
173  RCP<MultiVectorPreconditioner<Scalar> >
174  mvprec = Teuchos::rcp(new MultiVectorPreconditioner<Scalar>());
175  mvprec->nonconstInitialize(prec,multiVecRange,multiVecDomain);
176  return mvprec;
177 }
178 
179 /** \brief Nonmember constructor function.
180  *
181  * \relates MultiVectorPreconditioner
182  */
183 template<class Scalar>
184 RCP<MultiVectorPreconditioner<Scalar> >
186  const RCP<const PreconditionerBase<Scalar> > &prec,
187  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
188  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
189  )
190 {
191  RCP<MultiVectorPreconditioner<Scalar> >
192  mvprec = Teuchos::rcp(new MultiVectorPreconditioner<Scalar>());
193  mvprec->initialize(prec,multiVecRange,multiVecDomain);
194  return mvprec;
195 }
196 
197 } // end namespace Thyra
198 
199 #endif
Thyra::MultiVectorPreconditioner::getUnspecifiedPrecOp
Teuchos::RCP< const LinearOpBase< Scalar > > getUnspecifiedPrecOp() const
Definition: Thyra_MultiVectorPreconditioner.hpp:110
Thyra_MultiVectorLinearOp.hpp
Thyra::MultiVectorPreconditioner::getNonconstRightPrecOp
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstRightPrecOp()
Definition: Thyra_MultiVectorPreconditioner.hpp:89
Thyra::MultiVectorPreconditioner::isRightPrecOpConst
bool isRightPrecOpConst() const
Definition: Thyra_MultiVectorPreconditioner.hpp:86
Thyra::MultiVectorPreconditioner::multiVectorPreconditioner
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.
Definition: Thyra_MultiVectorPreconditioner.hpp:185
Thyra::MultiVectorPreconditioner::getNonconstUnspecifiedPrecOp
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstUnspecifiedPrecOp()
Definition: Thyra_MultiVectorPreconditioner.hpp:104
Thyra::MultiVectorPreconditioner::isUnspecifiedPrecOpConst
bool isUnspecifiedPrecOpConst() const
Definition: Thyra_MultiVectorPreconditioner.hpp:101
Thyra::MultiVectorPreconditioner::uninitialize
void uninitialize()
Definition: Thyra_MultiVectorPreconditioner.hpp:60
Thyra::MultiVectorPreconditioner::multiVecDomain_
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
Definition: Thyra_MultiVectorPreconditioner.hpp:130
Thyra::MultiVectorPreconditioner::MultiVectorPreconditioner
MultiVectorPreconditioner()
Construct to uninitialized.
Definition: Thyra_MultiVectorPreconditioner.hpp:31
Thyra::MultiVectorPreconditioner::initialize
void initialize(const RCP< const PreconditionerBase< Scalar > > &prec, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Definition: Thyra_MultiVectorPreconditioner.hpp:44
Thyra::MultiVectorPreconditioner::isLeftPrecOpConst
bool isLeftPrecOpConst() const
Definition: Thyra_MultiVectorPreconditioner.hpp:71
Thyra::MultiVectorPreconditioner::getNonconstLeftPrecOp
Teuchos::RCP< LinearOpBase< Scalar > > getNonconstLeftPrecOp()
Definition: Thyra_MultiVectorPreconditioner.hpp:74
Thyra::MultiVectorPreconditioner::prec_
CNPB prec_
Definition: Thyra_MultiVectorPreconditioner.hpp:128
Thyra::MultiVectorPreconditioner::getRightPrecOp
Teuchos::RCP< const LinearOpBase< Scalar > > getRightPrecOp() const
Definition: Thyra_MultiVectorPreconditioner.hpp:95
Thyra::MultiVectorPreconditioner
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
Definition: Thyra_MultiVectorPreconditioner.hpp:23
Thyra::MultiVectorPreconditioner::getLeftPrecOp
Teuchos::RCP< const LinearOpBase< Scalar > > getLeftPrecOp() const
Definition: Thyra_MultiVectorPreconditioner.hpp:80
Thyra::MultiVectorPreconditioner::getNonconstPreconditioner
RCP< PreconditionerBase< Scalar > > getNonconstPreconditioner()
Definition: Thyra_MultiVectorPreconditioner.hpp:55
Thyra::MultiVectorPreconditioner::nonconstInitialize
void nonconstInitialize(const RCP< PreconditionerBase< Scalar > > &prec, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Definition: Thyra_MultiVectorPreconditioner.hpp:33
Thyra::MultiVectorPreconditioner::getPreconditioner
RCP< const PreconditionerBase< Scalar > > getPreconditioner() const
Definition: Thyra_MultiVectorPreconditioner.hpp:58
Thyra::MultiVectorPreconditioner::CNPB
Teuchos::ConstNonconstObjectContainer< PreconditionerBase< Scalar > > CNPB
Definition: Thyra_MultiVectorPreconditioner.hpp:123
Thyra::MultiVectorPreconditioner::nonconstMultiVectorPreconditioner
RCP< MultiVectorPreconditioner< Scalar > > nonconstMultiVectorPreconditioner(const RCP< PreconditionerBase< Scalar > > &prec, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
Definition: Thyra_MultiVectorPreconditioner.hpp:167
Thyra::MultiVectorPreconditioner::validateInitialize
static void validateInitialize(const RCP< const PreconditionerBase< Scalar > > &prec, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Definition: Thyra_MultiVectorPreconditioner.hpp:135
Thyra::MultiVectorPreconditioner::multiVectorPreconditioner
RCP< MultiVectorPreconditioner< Scalar > > multiVectorPreconditioner()
Nonmember constructor function.
Definition: Thyra_MultiVectorPreconditioner.hpp:156
Thyra::MultiVectorPreconditioner::multiVecRange_
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
Definition: Thyra_MultiVectorPreconditioner.hpp:129
Thyra
Definition: Thyra_AdjointLinearOpWithSolveFactory.hpp:19