Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
23 template <class Scalar>
25  : virtual public PreconditionerFactoryBase<Scalar> {
26  public:
29 
32 
34  const RCP<PreconditionerFactoryBase<Scalar> > &prec_fac,
36  &multiVecRange,
38  &multiVecDomain)
39  {
40  validateInitialize(prec_fac, multiVecRange, multiVecDomain);
41  prec_fac_ = prec_fac;
42  multiVecRange_ = multiVecRange;
43  multiVecDomain_ = multiVecDomain;
44  }
45 
46  void initialize(const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac,
48  &multiVecRange,
50  &multiVecDomain)
51  {
52  validateInitialize(prec_fac, multiVecRange, multiVecDomain);
53  prec_fac_ = prec_fac;
54  multiVecRange_ = multiVecRange;
55  multiVecDomain_ = multiVecDomain;
56  }
57 
58  RCP<PreconditionerFactoryBase<Scalar> > getNonconstPreconditionerFactory()
59  {
60  return prec_fac_.getNonconstObj();
61  }
62 
63  RCP<const PreconditionerFactoryBase<Scalar> > getPreconditionerFactory() const
64  {
65  return prec_fac_.getConstObj();
66  }
67 
68  void uninitialize()
69  {
71  multiVecRange_ = Teuchos::null;
72  multiVecDomain_ = Teuchos::null;
73  }
74 
77 
78  std::string description() const
79  {
80  std::ostringstream oss;
81  oss << this->Teuchos::Describable::description() << "{"
82  << "prec_fac=";
84  oss << prec_fac_.getConstObj()->description();
85  else
86  oss << "NULL";
87  oss << "}";
88  return oss.str();
89  }
90 
92 
96 
97  void setParameterList(RCP<ParameterList> const &paramList)
98  {
99  prec_fac_.getNonconstObj()->setParameterList(paramList);
100  }
101 
102  RCP<ParameterList> getNonconstParameterList()
103  {
104  return prec_fac_.getNonconstObj()->getNonconstParameterList();
105  }
106 
107  RCP<ParameterList> unsetParameterList()
108  {
109  return prec_fac_.getNonconstObj()->unsetParameterList();
110  }
111 
112  RCP<const ParameterList> getParameterList() const
113  {
114  return prec_fac_.getConstObj()->getParameterList();
115  }
116 
117  RCP<const ParameterList> getValidParameters() const
118  {
119  return prec_fac_.getConstObj()->getValidParameters();
120  }
121 
123 
125 
128 
129  bool isCompatible(const LinearOpSourceBase<Scalar> &fwdOpSrc) const
130  {
131  return prec_fac_.getConstObj()->isCompatible(fwdOpSrc);
132  }
133 
134  RCP<PreconditionerBase<Scalar> > createPrec() const
135  {
136  return nonconstMultiVectorPreconditioner(
138  }
139 
141  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
143  const ESupportSolveUse supportSolveUse = SUPPORT_SOLVE_UNSPECIFIED) const
144  {
145  using Teuchos::dyn_cast;
146  using Teuchos::rcp_dynamic_cast;
147 
148  typedef MultiVectorLinearOp<Scalar> MVLO;
150  const RCP<const MVLO> mvlo =
151  rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
152  MVP &mvp = dyn_cast<MVP>(*precOp);
153  prec_fac_.getConstObj()->initializePrec(
154  defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
155  mvp.getNonconstPreconditioner().get(), supportSolveUse);
156  }
157 
159  RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc = NULL,
160  ESupportSolveUse *supportSolveUse = NULL) const
161  {
162  using Teuchos::dyn_cast;
163 
164 #ifdef TEUCHOS_DEBUG
165  TEUCHOS_TEST_FOR_EXCEPT(0 == precOp);
166 #endif
168  MVP &mvp = dyn_cast<MVP>(*precOp);
169  RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
170  prec_fac_.getConstObj()->uninitializePrec(
171  mvp.getNonconstPreconditioner().get(),
172  fwdOpSrc ? &inner_fwdOpSrc : NULL, supportSolveUse);
173  if (fwdOpSrc)
174  *fwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
175  inner_fwdOpSrc->getOp(), multiVecRange_, multiVecDomain_));
176  }
177 
179 
180  private:
181  // //////////////////////////////
182  // Private types
183 
187 
188  // //////////////////////////////
189  // Private data members
190 
192  RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecRange_;
193  RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecDomain_;
194 
195  // //////////////////////////////
196  // Private member functions
197 
198  static void validateInitialize(
199  const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac,
201  &multiVecRange,
203  &multiVecDomain)
204  {
205 #ifdef TEUCHOS_DEBUG
206  TEUCHOS_TEST_FOR_EXCEPT(is_null(prec_fac));
207  TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecRange));
208  TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecDomain));
209  TEUCHOS_TEST_FOR_EXCEPT(multiVecRange->numBlocks() !=
210  multiVecDomain->numBlocks());
211 #else
212  (void)prec_fac;
213  (void)multiVecRange;
214  (void)multiVecDomain;
215 #endif
216  }
217 };
218 
223 template <class Scalar>
224 RCP<MultiVectorPreconditionerFactory<Scalar> >
226 {
228 }
229 
234 template <class Scalar>
235 RCP<MultiVectorPreconditionerFactory<Scalar> >
237  const RCP<PreconditionerFactoryBase<Scalar> > &prec_fac,
239  &multiVecRange,
241  &multiVecDomain)
242 {
243  RCP<MultiVectorPreconditionerFactory<Scalar> > mvfac =
245  mvfac->nonconstInitialize(prec_fac, multiVecRange, multiVecDomain);
246  return mvfac;
247 }
248 
253 template <class Scalar>
254 RCP<MultiVectorPreconditionerFactory<Scalar> > multiVectorPreconditionerFactory(
255  const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac,
257  &multiVecRange,
259  &multiVecDomain)
260 {
261  RCP<MultiVectorPreconditionerFactory<Scalar> > mvfac =
263  mvfac->initialize(prec_fac, multiVecRange, multiVecDomain);
264  return mvfac;
265 }
266 
267 } // end namespace Thyra
268 
269 #endif
Concrete PreconditionerFactoryBase subclass that wraps a preconditioner in MultiVectorPreconditioner...
RCP< PreconditionerFactoryBase< Scalar > > getNonconstPreconditionerFactory()
bool is_null(const boost::shared_ptr< T > &p)
RCP< const PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
void initializePrec(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, PreconditionerBase< Scalar > *precOp, const ESupportSolveUse supportSolveUse=SUPPORT_SOLVE_UNSPECIFIED) const
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.
T_To & dyn_cast(T_From &from)
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.
RCP< PreconditionerBase< Scalar > > createPrec() const
void nonconstInitialize(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
RCP< const ObjType > getConstObj() const
void setParameterList(RCP< ParameterList > const &paramList)
virtual std::string description() const
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
Teuchos::ConstNonconstObjectContainer< PreconditionerFactoryBase< Scalar > > CNPFB
RCP< MultiVectorPreconditionerFactory< Scalar > > multiVectorPreconditionerFactory()
Nonmember constructor function.
ESupportSolveUse
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
void initialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
void uninitializePrec(PreconditionerBase< Scalar > *precOp, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc=NULL, ESupportSolveUse *supportSolveUse=NULL) const
static void validateInitialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
RCP< ObjType > getNonconstObj() const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const