Tempus  Version of the Day
Time Integration
Thyra_MultiVectorPreconditionerFactory.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_MultiVectorPreconditionerFactory_hpp
10 #define Thyra_MultiVectorPreconditionerFactory_hpp
11 
12 #include "Thyra_PreconditionerFactoryBase.hpp"
13 #include "Teuchos_ConstNonconstObjectContainer.hpp"
16 #include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
17 
18 namespace Thyra {
19 
20 /** \brief Concrete <tt>PreconditionerFactoryBase</tt> subclass that
21  * wraps a preconditioner in MultiVectorPreconditioner.
22  */
23 template<class Scalar>
25  : virtual public PreconditionerFactoryBase<Scalar>
26 {
27 public:
28 
29  /** @name Constructors/initializers/accessors */
30  //@{
31 
32  /** \brief Construct to uninitialized. */
34 
36  const RCP<PreconditionerFactoryBase<Scalar> > &prec_fac,
37  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
38  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
39  ) {
40  validateInitialize(prec_fac,multiVecRange,multiVecDomain);
41  prec_fac_ = prec_fac;
42  multiVecRange_ = multiVecRange;
43  multiVecDomain_ = multiVecDomain;
44  }
45 
46  void initialize(
47  const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac,
48  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
49  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain) {
50  validateInitialize(prec_fac,multiVecRange,multiVecDomain);
51  prec_fac_ = prec_fac;
52  multiVecRange_ = multiVecRange;
53  multiVecDomain_ = multiVecDomain;
54  }
55 
56  RCP<PreconditionerFactoryBase<Scalar> >
57  getNonconstPreconditionerFactory() { return prec_fac_.getNonconstObj(); }
58 
59  RCP<const PreconditionerFactoryBase<Scalar> >
60  getPreconditionerFactory() const { return prec_fac_.getConstObj(); }
61 
62  void uninitialize() {
63  prec_fac_.uninitialize();
64  multiVecRange_ = Teuchos::null;
65  multiVecDomain_ = Teuchos::null;
66  }
67 
68  /** \name Overridden from Teuchos::Describable. */
69  //@{
70 
71  std::string description() const
72  {
73  std::ostringstream oss;
74  oss << this->Teuchos::Describable::description()
75  << "{"
76  << "prec_fac=";
77  if (!is_null(prec_fac_.getConstObj()))
78  oss << prec_fac_.getConstObj()->description();
79  else
80  oss << "NULL";
81  oss << "}";
82  return oss.str();
83  }
84 
85  //@}
86 
87  /** @name Overridden from ParameterListAcceptor (simple forwarding functions) */
88  //@{
89 
90  void setParameterList(RCP<ParameterList> const& paramList)
91  {
92  prec_fac_.getNonconstObj()->setParameterList(paramList);
93  }
94 
95  RCP<ParameterList> getNonconstParameterList()
96  {
97  return prec_fac_.getNonconstObj()->getNonconstParameterList();
98  }
99 
100  RCP<ParameterList> unsetParameterList()
101  {
102  return prec_fac_.getNonconstObj()->unsetParameterList();
103  }
104 
105  RCP<const ParameterList> getParameterList() const
106  {
107  return prec_fac_.getConstObj()->getParameterList();
108  }
109 
110  RCP<const ParameterList> getValidParameters() const
111  {
112  return prec_fac_.getConstObj()->getValidParameters();
113  }
114 
115  //@}
116 
117  //@}
118 
119  /** @name Overridden from PreconditionerFactoryBase */
120  //@{
121 
122  bool isCompatible(const LinearOpSourceBase<Scalar> &fwdOpSrc) const
123  { return prec_fac_.getConstObj()->isCompatible(fwdOpSrc); }
124 
125  RCP<PreconditionerBase<Scalar> > createPrec() const
126  { return nonconstMultiVectorPreconditioner(
127  prec_fac_.getConstObj()->createPrec(),
129  multiVecDomain_); }
130 
132  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
133  PreconditionerBase<Scalar> *precOp,
134  const ESupportSolveUse supportSolveUse = SUPPORT_SOLVE_UNSPECIFIED
135  ) const
136  {
137  using Teuchos::dyn_cast;
138  using Teuchos::rcp_dynamic_cast;
139 
140  typedef MultiVectorLinearOp<Scalar> MVLO;
142  const RCP<const MVLO> mvlo =
143  rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
144  MVP &mvp = dyn_cast<MVP>(*precOp);
145  prec_fac_.getConstObj()->initializePrec(
146  defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
147  mvp.getNonconstPreconditioner().get(),
148  supportSolveUse);
149  }
150 
152  PreconditionerBase<Scalar> *precOp,
153  RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc = NULL,
154  ESupportSolveUse *supportSolveUse = NULL
155  ) const
156  {
157  using Teuchos::dyn_cast;
158 
159 #ifdef TEUCHOS_DEBUG
160  TEUCHOS_TEST_FOR_EXCEPT(0==precOp);
161 #endif
163  MVP &mvp = dyn_cast<MVP>(*precOp);
164  RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
165  prec_fac_.getConstObj()->uninitializePrec(
166  mvp.getNonconstPreconditioner().get(),
167  fwdOpSrc ? &inner_fwdOpSrc : NULL,
168  supportSolveUse);
169  if (fwdOpSrc)
170  *fwdOpSrc =
171  defaultLinearOpSource<Scalar>(multiVectorLinearOp(inner_fwdOpSrc->getOp(),
173  multiVecDomain_));
174  }
175 
176  //@}
177 
178 private:
179 
180  // //////////////////////////////
181  // Private types
182 
183  typedef Teuchos::ConstNonconstObjectContainer<PreconditionerFactoryBase<Scalar> > CNPFB;
184 
185  // //////////////////////////////
186  // Private data members
187 
189  RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecRange_;
190  RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecDomain_;
191 
192  // //////////////////////////////
193  // Private member functions
194 
195  static void validateInitialize(
196  const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac,
197  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
198  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
199  ) {
200 #ifdef TEUCHOS_DEBUG
201  TEUCHOS_TEST_FOR_EXCEPT(is_null(prec_fac));
202  TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecRange));
203  TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecDomain));
204  TEUCHOS_TEST_FOR_EXCEPT( multiVecRange->numBlocks() != multiVecDomain->numBlocks() );
205 #endif
206  }
207 
208 };
209 
210 /** \brief Nonmember constructor function.
211  *
212  * \relates MultiVectorPreconditionerFactory
213  */
214 template<class Scalar>
215 RCP<MultiVectorPreconditionerFactory<Scalar> >
217 {
218  return Teuchos::rcp(new MultiVectorPreconditionerFactory<Scalar>());
219 }
220 
221 /** \brief Nonmember constructor function.
222  *
223  * \relates MultiVectorPreconditionerFactory
224  */
225 template<class Scalar>
226 RCP<MultiVectorPreconditionerFactory<Scalar> >
228  const RCP<PreconditionerFactoryBase<Scalar> > &prec_fac,
229  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
230  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
231  )
232 {
233  RCP<MultiVectorPreconditionerFactory<Scalar> >
234  mvfac = Teuchos::rcp(new MultiVectorPreconditionerFactory<Scalar>());
235  mvfac->nonconstInitialize(prec_fac,multiVecRange,multiVecDomain);
236  return mvfac;
237 }
238 
239 /** \brief Nonmember constructor function.
240  *
241  * \relates MultiVectorPreconditionerFactory
242  */
243 template<class Scalar>
244 RCP<MultiVectorPreconditionerFactory<Scalar> >
246  const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac,
247  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
248  const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
249  )
250 {
251  RCP<MultiVectorPreconditionerFactory<Scalar> >
252  mvfac = Teuchos::rcp(new MultiVectorPreconditionerFactory<Scalar>());
253  mvfac->initialize(prec_fac,multiVecRange,multiVecDomain);
254  return mvfac;
255 }
256 
257 } // end namespace Thyra
258 
259 #endif
Thyra::MultiVectorPreconditionerFactory::initialize
void initialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:46
Thyra_MultiVectorLinearOp.hpp
Thyra::MultiVectorPreconditionerFactory::createPrec
RCP< PreconditionerBase< Scalar > > createPrec() const
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:125
Thyra::MultiVectorPreconditionerFactory::uninitializePrec
void uninitializePrec(PreconditionerBase< Scalar > *precOp, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc=NULL, ESupportSolveUse *supportSolveUse=NULL) const
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:151
Thyra::MultiVectorPreconditionerFactory::MultiVectorPreconditionerFactory
MultiVectorPreconditionerFactory()
Construct to uninitialized.
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:33
Thyra::MultiVectorPreconditionerFactory
Concrete PreconditionerFactoryBase subclass that wraps a preconditioner in MultiVectorPreconditioner.
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:24
Thyra::MultiVectorPreconditionerFactory::nonconstMultiVectorPreconditionerFactory
RCP< MultiVectorPreconditionerFactory< Scalar > > nonconstMultiVectorPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:227
Thyra_MultiVectorPreconditioner.hpp
Thyra::MultiVectorPreconditionerFactory::nonconstInitialize
void nonconstInitialize(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:35
Thyra::MultiVectorPreconditionerFactory::getNonconstPreconditionerFactory
RCP< PreconditionerFactoryBase< Scalar > > getNonconstPreconditionerFactory()
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:57
Thyra::MultiVectorPreconditionerFactory::setParameterList
void setParameterList(RCP< ParameterList > const &paramList)
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:90
Thyra::MultiVectorPreconditionerFactory::prec_fac_
CNPFB prec_fac_
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:188
Thyra::MultiVectorLinearOp
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
Definition: Thyra_MultiVectorLinearOp.hpp:29
Thyra::MultiVectorPreconditionerFactory::multiVecRange_
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:189
Thyra::MultiVectorPreconditionerFactory::getParameterList
RCP< const ParameterList > getParameterList() const
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:105
Thyra::MultiVectorPreconditionerFactory::getValidParameters
RCP< const ParameterList > getValidParameters() const
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:110
Thyra::MultiVectorPreconditionerFactory::validateInitialize
static void validateInitialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:195
Thyra::MultiVectorPreconditionerFactory::unsetParameterList
RCP< ParameterList > unsetParameterList()
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:100
Thyra::MultiVectorPreconditionerFactory::initializePrec
void initializePrec(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, PreconditionerBase< Scalar > *precOp, const ESupportSolveUse supportSolveUse=SUPPORT_SOLVE_UNSPECIFIED) const
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:131
Thyra::MultiVectorPreconditioner
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
Definition: Thyra_MultiVectorPreconditioner.hpp:23
Thyra::MultiVectorPreconditionerFactory::uninitialize
void uninitialize()
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:62
Thyra::MultiVectorPreconditionerFactory::getPreconditionerFactory
RCP< const PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:60
Thyra::MultiVectorPreconditionerFactory::description
std::string description() const
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:71
Thyra::MultiVectorPreconditionerFactory::CNPFB
Teuchos::ConstNonconstObjectContainer< PreconditionerFactoryBase< Scalar > > CNPFB
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:183
Thyra::MultiVectorPreconditionerFactory::multiVectorPreconditionerFactory
RCP< MultiVectorPreconditionerFactory< Scalar > > multiVectorPreconditionerFactory()
Nonmember constructor function.
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:216
Thyra::MultiVectorPreconditionerFactory::multiVecDomain_
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:190
Thyra::MultiVectorPreconditionerFactory::isCompatible
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:122
Thyra::MultiVectorPreconditionerFactory::getNonconstParameterList
RCP< ParameterList > getNonconstParameterList()
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:95
Thyra
Definition: Thyra_AdjointLinearOpWithSolveFactory.hpp:19
Thyra::MultiVectorPreconditionerFactory::multiVectorPreconditionerFactory
RCP< MultiVectorPreconditionerFactory< Scalar > > multiVectorPreconditionerFactory(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
Definition: Thyra_MultiVectorPreconditionerFactory.hpp:245