Tempus  Version of the Day
Time Integration
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 
19 /** \brief Concrete <tt>PreconditionerFactoryBase</tt> subclass that
20  * wraps a preconditioner in AdjointPreconditioner.
21  */
22 template<class Scalar>
24  : virtual public PreconditionerFactoryBase<Scalar>
25 {
26 public:
27 
28  /** @name Constructors/initializers/accessors */
29  //@{
30 
31  /** \brief Construct to uninitialized. */
33 
35  const RCP<PreconditionerFactoryBase<Scalar> > &prec_fac) {
36  validateInitialize(prec_fac);
37  prec_fac_ = prec_fac;
38  }
39 
40  void initialize(
41  const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac) {
42  validateInitialize(prec_fac);
43  prec_fac_ = prec_fac;
44  }
45 
46  RCP<PreconditionerFactoryBase<Scalar> >
47  getNonconstPreconditionerFactory() { return prec_fac_.getNonconstObj(); }
48 
49  RCP<const PreconditionerFactoryBase<Scalar> >
50  getPreconditionerFactory() const { return prec_fac_.getConstObj(); }
51 
52  void uninitialize() {
53  prec_fac_.uninitialize();
54  }
55 
56  /** \name Overridden from Teuchos::Describable. */
57  //@{
58 
59  std::string description() const
60  {
61  std::ostringstream oss;
62  oss << this->Teuchos::Describable::description()
63  << "{"
64  << "prec_fac=";
65  if (!is_null(prec_fac_.getConstObj()))
66  oss << prec_fac_.getConstObj()->description();
67  else
68  oss << "NULL";
69  oss << "}";
70  return oss.str();
71  }
72 
73  //@}
74 
75  /** @name Overridden from ParameterListAcceptor (simple forwarding functions) */
76  //@{
77 
78  void setParameterList(RCP<ParameterList> const& paramList)
79  {
80  prec_fac_.getNonconstObj()->setParameterList(paramList);
81  }
82 
83  RCP<ParameterList> getNonconstParameterList()
84  {
85  return prec_fac_.getNonconstObj()->getNonconstParameterList();
86  }
87 
88  RCP<ParameterList> unsetParameterList()
89  {
90  return prec_fac_.getNonconstObj()->unsetParameterList();
91  }
92 
93  RCP<const ParameterList> getParameterList() const
94  {
95  return prec_fac_.getConstObj()->getParameterList();
96  }
97 
98  RCP<const ParameterList> getValidParameters() const
99  {
100  return prec_fac_.getConstObj()->getValidParameters();
101  }
102 
103  //@}
104 
105  //@}
106 
107  /** @name Overridden from PreconditionerFactoryBase */
108  //@{
109 
110  bool isCompatible(const LinearOpSourceBase<Scalar> &fwdOpSrc) const
111  { return prec_fac_.getConstObj()->isCompatible(fwdOpSrc); }
112 
113  RCP<PreconditionerBase<Scalar> > createPrec() const
114  { return nonconstAdjointPreconditioner(
115  prec_fac_.getConstObj()->createPrec()); }
116 
118  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
119  PreconditionerBase<Scalar> *precOp,
120  const ESupportSolveUse supportSolveUse = SUPPORT_SOLVE_UNSPECIFIED
121  ) const
122  {
123  using Teuchos::dyn_cast;
124  using Teuchos::rcp_dynamic_cast;
125 
126  typedef DefaultScaledAdjointLinearOp<Scalar> ALO;
128  const RCP<const ALO> alo =
129  rcp_dynamic_cast<const ALO>(fwdOpSrc->getOp().assert_not_null());
130  AP &ap = dyn_cast<AP>(*precOp);
131  prec_fac_.getConstObj()->initializePrec(
132  defaultLinearOpSource<Scalar>(alo->getOp()),
133  ap.getNonconstPreconditioner().get(),
134  supportSolveUse);
135  }
136 
138  PreconditionerBase<Scalar> *precOp,
139  RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc = NULL,
140  ESupportSolveUse *supportSolveUse = NULL
141  ) 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(),
153  fwdOpSrc ? &inner_fwdOpSrc : NULL,
154  supportSolveUse);
155  if (fwdOpSrc)
156  *fwdOpSrc =
157  defaultLinearOpSource<Scalar>(adjoint(inner_fwdOpSrc->getOp()));
158  }
159 
160  //@}
161 
162 private:
163 
164  // //////////////////////////////
165  // Private types
166 
167  typedef Teuchos::ConstNonconstObjectContainer<PreconditionerFactoryBase<Scalar> > CNPFB;
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 #ifdef TEUCHOS_DEBUG
180  TEUCHOS_TEST_FOR_EXCEPT(is_null(prec_fac));
181 #endif
182  }
183 
184 };
185 
186 /** \brief Nonmember constructor function.
187  *
188  * \relates AdjointPreconditionerFactory
189  */
190 template<class Scalar>
191 RCP<AdjointPreconditionerFactory<Scalar> >
193 {
194  return Teuchos::rcp(new AdjointPreconditionerFactory<Scalar>());
195 }
196 
197 /** \brief Nonmember constructor function.
198  *
199  * \relates AdjointPreconditionerFactory
200  */
201 template<class Scalar>
202 RCP<AdjointPreconditionerFactory<Scalar> >
204  const RCP<PreconditionerFactoryBase<Scalar> > &prec_fac)
205 {
206  RCP<AdjointPreconditionerFactory<Scalar> >
207  afac = Teuchos::rcp(new AdjointPreconditionerFactory<Scalar>());
208  afac->nonconstInitialize(prec_fac);
209  return afac;
210 }
211 
212 /** \brief Nonmember constructor function.
213  *
214  * \relates AdjointPreconditionerFactory
215  */
216 template<class Scalar>
217 RCP<AdjointPreconditionerFactory<Scalar> >
219  const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac)
220 {
221  RCP<AdjointPreconditionerFactory<Scalar> >
222  afac = Teuchos::rcp(new AdjointPreconditionerFactory<Scalar>());
223  afac->initialize(prec_fac);
224  return afac;
225 }
226 
227 } // end namespace Thyra
228 
229 #endif
Thyra::AdjointPreconditionerFactory::nonconstAdjointPreconditionerFactory
RCP< AdjointPreconditionerFactory< Scalar > > nonconstAdjointPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac)
Nonmember constructor function.
Definition: Thyra_AdjointPreconditionerFactory.hpp:203
Thyra::AdjointPreconditionerFactory::initializePrec
void initializePrec(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, PreconditionerBase< Scalar > *precOp, const ESupportSolveUse supportSolveUse=SUPPORT_SOLVE_UNSPECIFIED) const
Definition: Thyra_AdjointPreconditionerFactory.hpp:117
Thyra::AdjointPreconditioner
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
Definition: Thyra_AdjointPreconditioner.hpp:22
Thyra::AdjointPreconditionerFactory::getNonconstPreconditionerFactory
RCP< PreconditionerFactoryBase< Scalar > > getNonconstPreconditionerFactory()
Definition: Thyra_AdjointPreconditionerFactory.hpp:47
Thyra::AdjointPreconditionerFactory::initialize
void initialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac)
Definition: Thyra_AdjointPreconditionerFactory.hpp:40
Thyra::AdjointPreconditionerFactory::nonconstInitialize
void nonconstInitialize(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac)
Definition: Thyra_AdjointPreconditionerFactory.hpp:34
Thyra::AdjointPreconditionerFactory::uninitializePrec
void uninitializePrec(PreconditionerBase< Scalar > *precOp, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc=NULL, ESupportSolveUse *supportSolveUse=NULL) const
Definition: Thyra_AdjointPreconditionerFactory.hpp:137
Thyra::AdjointPreconditionerFactory::unsetParameterList
RCP< ParameterList > unsetParameterList()
Definition: Thyra_AdjointPreconditionerFactory.hpp:88
Thyra::AdjointPreconditionerFactory::getParameterList
RCP< const ParameterList > getParameterList() const
Definition: Thyra_AdjointPreconditionerFactory.hpp:93
Thyra::AdjointPreconditionerFactory
Concrete PreconditionerFactoryBase subclass that wraps a preconditioner in AdjointPreconditioner.
Definition: Thyra_AdjointPreconditionerFactory.hpp:23
Thyra::AdjointPreconditionerFactory::uninitialize
void uninitialize()
Definition: Thyra_AdjointPreconditionerFactory.hpp:52
Thyra_AdjointPreconditioner.hpp
Thyra::AdjointPreconditionerFactory::adjointPreconditionerFactory
RCP< AdjointPreconditionerFactory< Scalar > > adjointPreconditionerFactory(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac)
Nonmember constructor function.
Definition: Thyra_AdjointPreconditionerFactory.hpp:218
Thyra::AdjointPreconditionerFactory::AdjointPreconditionerFactory
AdjointPreconditionerFactory()
Construct to uninitialized.
Definition: Thyra_AdjointPreconditionerFactory.hpp:32
Thyra::AdjointPreconditionerFactory::description
std::string description() const
Definition: Thyra_AdjointPreconditionerFactory.hpp:59
Thyra::AdjointPreconditionerFactory::CNPFB
Teuchos::ConstNonconstObjectContainer< PreconditionerFactoryBase< Scalar > > CNPFB
Definition: Thyra_AdjointPreconditionerFactory.hpp:167
Thyra::AdjointPreconditionerFactory::getNonconstParameterList
RCP< ParameterList > getNonconstParameterList()
Definition: Thyra_AdjointPreconditionerFactory.hpp:83
Thyra::AdjointPreconditionerFactory::getPreconditionerFactory
RCP< const PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Definition: Thyra_AdjointPreconditionerFactory.hpp:50
Thyra::AdjointPreconditionerFactory::isCompatible
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
Definition: Thyra_AdjointPreconditionerFactory.hpp:110
Thyra::AdjointPreconditionerFactory::createPrec
RCP< PreconditionerBase< Scalar > > createPrec() const
Definition: Thyra_AdjointPreconditionerFactory.hpp:113
Thyra::AdjointPreconditionerFactory::prec_fac_
CNPFB prec_fac_
Definition: Thyra_AdjointPreconditionerFactory.hpp:172
Thyra::AdjointPreconditionerFactory::adjointPreconditionerFactory
RCP< AdjointPreconditionerFactory< Scalar > > adjointPreconditionerFactory()
Nonmember constructor function.
Definition: Thyra_AdjointPreconditionerFactory.hpp:192
Thyra::AdjointPreconditionerFactory::setParameterList
void setParameterList(RCP< ParameterList > const &paramList)
Definition: Thyra_AdjointPreconditionerFactory.hpp:78
Thyra::AdjointPreconditionerFactory::getValidParameters
RCP< const ParameterList > getValidParameters() const
Definition: Thyra_AdjointPreconditionerFactory.hpp:98
Thyra::AdjointPreconditionerFactory::validateInitialize
static void validateInitialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac)
Definition: Thyra_AdjointPreconditionerFactory.hpp:177
Thyra
Definition: Thyra_AdjointLinearOpWithSolveFactory.hpp:19