Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Thyra_AdjointPreconditionerFactory.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_AdjointPreconditionerFactory_hpp
10 #define Thyra_AdjointPreconditionerFactory_hpp
11 
12 #include "Thyra_PreconditionerFactoryBase.hpp"
13 #include "Teuchos_ConstNonconstObjectContainer.hpp"
14 #include "Thyra_DefaultScaledAdjointLinearOp.hpp"
16 
17 namespace Thyra {
18 
22 template <class Scalar>
24  : virtual public PreconditionerFactoryBase<Scalar> {
25  public:
28 
31 
33  const RCP<PreconditionerFactoryBase<Scalar> > &prec_fac)
34  {
35  validateInitialize(prec_fac);
36  prec_fac_ = prec_fac;
37  }
38 
39  void initialize(const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac)
40  {
41  validateInitialize(prec_fac);
42  prec_fac_ = prec_fac;
43  }
44 
45  RCP<PreconditionerFactoryBase<Scalar> > getNonconstPreconditionerFactory()
46  {
47  return prec_fac_.getNonconstObj();
48  }
49 
50  RCP<const PreconditionerFactoryBase<Scalar> > getPreconditionerFactory() const
51  {
52  return prec_fac_.getConstObj();
53  }
54 
56 
59 
60  std::string description() const
61  {
62  std::ostringstream oss;
63  oss << this->Teuchos::Describable::description() << "{"
64  << "prec_fac=";
66  oss << prec_fac_.getConstObj()->description();
67  else
68  oss << "NULL";
69  oss << "}";
70  return oss.str();
71  }
72 
74 
78 
79  void setParameterList(RCP<ParameterList> const &paramList)
80  {
81  prec_fac_.getNonconstObj()->setParameterList(paramList);
82  }
83 
84  RCP<ParameterList> getNonconstParameterList()
85  {
86  return prec_fac_.getNonconstObj()->getNonconstParameterList();
87  }
88 
89  RCP<ParameterList> unsetParameterList()
90  {
91  return prec_fac_.getNonconstObj()->unsetParameterList();
92  }
93 
94  RCP<const ParameterList> getParameterList() const
95  {
96  return prec_fac_.getConstObj()->getParameterList();
97  }
98 
99  RCP<const ParameterList> getValidParameters() const
100  {
101  return prec_fac_.getConstObj()->getValidParameters();
102  }
103 
105 
107 
110 
111  bool isCompatible(const LinearOpSourceBase<Scalar> &fwdOpSrc) const
112  {
113  return prec_fac_.getConstObj()->isCompatible(fwdOpSrc);
114  }
115 
116  RCP<PreconditionerBase<Scalar> > createPrec() const
117  {
118  return nonconstAdjointPreconditioner(prec_fac_.getConstObj()->createPrec());
119  }
120 
122  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
124  const ESupportSolveUse supportSolveUse = SUPPORT_SOLVE_UNSPECIFIED) const
125  {
126  using Teuchos::dyn_cast;
127  using Teuchos::rcp_dynamic_cast;
128 
131  const RCP<const ALO> alo =
132  rcp_dynamic_cast<const ALO>(fwdOpSrc->getOp().assert_not_null());
133  AP &ap = dyn_cast<AP>(*precOp);
134  prec_fac_.getConstObj()->initializePrec(
135  defaultLinearOpSource<Scalar>(alo->getOp()),
136  ap.getNonconstPreconditioner().get(), supportSolveUse);
137  }
138 
140  RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc = NULL,
141  ESupportSolveUse *supportSolveUse = NULL) const
142  {
143  using Teuchos::dyn_cast;
144 
145 #ifdef TEUCHOS_DEBUG
146  TEUCHOS_TEST_FOR_EXCEPT(0 == precOp);
147 #endif
149  AP &ap = dyn_cast<AP>(*precOp);
150  RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
151  prec_fac_.getConstObj()->uninitializePrec(
152  ap.getNonconstPreconditioner().get(), fwdOpSrc ? &inner_fwdOpSrc : NULL,
153  supportSolveUse);
154  if (fwdOpSrc)
155  *fwdOpSrc =
156  defaultLinearOpSource<Scalar>(adjoint(inner_fwdOpSrc->getOp()));
157  }
158 
160 
161  private:
162  // //////////////////////////////
163  // Private types
164 
168 
169  // //////////////////////////////
170  // Private data members
171 
173 
174  // //////////////////////////////
175  // Private member functions
176 
177  static void validateInitialize(
178  const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac)
179  {
180 #ifdef TEUCHOS_DEBUG
181  TEUCHOS_TEST_FOR_EXCEPT(is_null(prec_fac));
182 #else
183  (void)prec_fac;
184 #endif
185  }
186 };
187 
192 template <class Scalar>
193 RCP<AdjointPreconditionerFactory<Scalar> > adjointPreconditionerFactory()
194 {
196 }
197 
202 template <class Scalar>
203 RCP<AdjointPreconditionerFactory<Scalar> > nonconstAdjointPreconditionerFactory(
204  const RCP<PreconditionerFactoryBase<Scalar> > &prec_fac)
205 {
206  RCP<AdjointPreconditionerFactory<Scalar> > afac =
208  afac->nonconstInitialize(prec_fac);
209  return afac;
210 }
211 
216 template <class Scalar>
217 RCP<AdjointPreconditionerFactory<Scalar> > adjointPreconditionerFactory(
218  const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac)
219 {
220  RCP<AdjointPreconditionerFactory<Scalar> > afac =
222  afac->initialize(prec_fac);
223  return afac;
224 }
225 
226 } // end namespace Thyra
227 
228 #endif
void initializePrec(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, PreconditionerBase< Scalar > *precOp, const ESupportSolveUse supportSolveUse=SUPPORT_SOLVE_UNSPECIFIED) const
void uninitializePrec(PreconditionerBase< Scalar > *precOp, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc=NULL, ESupportSolveUse *supportSolveUse=NULL) const
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
bool is_null(const boost::shared_ptr< T > &p)
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
RCP< PreconditionerFactoryBase< Scalar > > getNonconstPreconditionerFactory()
RCP< const ParameterList > getParameterList() const
void nonconstInitialize(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac)
T_To & dyn_cast(T_From &from)
Teuchos::ConstNonconstObjectContainer< PreconditionerFactoryBase< Scalar > > CNPFB
RCP< const PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
RCP< const ParameterList > getValidParameters() const
RCP< AdjointPreconditionerFactory< Scalar > > nonconstAdjointPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac)
Nonmember constructor function.
void initialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac)
RCP< AdjointPreconditionerFactory< Scalar > > adjointPreconditionerFactory(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac)
Nonmember constructor function.
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
ESupportSolveUse
RCP< PreconditionerBase< Scalar > > createPrec() const
static void validateInitialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac)
RCP< AdjointPreconditionerFactory< Scalar > > adjointPreconditionerFactory()
Nonmember constructor function.
RCP< ObjType > getNonconstObj() const
Concrete PreconditionerFactoryBase subclass that wraps a preconditioner in AdjointPreconditioner.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)