Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Thyra_AdjointLinearOpWithSolveFactory.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_AdjointLinearOpWithSolveFactory_hpp
10 #define Thyra_AdjointLinearOpWithSolveFactory_hpp
11 
12 #include "Thyra_LinearOpWithSolveFactoryBase.hpp"
13 #include "Thyra_DefaultScaledAdjointLinearOp.hpp"
14 #include "Thyra_DefaultAdjointLinearOpWithSolve.hpp"
15 #include "Thyra_DefaultLinearOpSource.hpp"
18 
19 namespace Thyra {
20 
23 template <class Scalar>
25  : virtual public LinearOpWithSolveFactoryBase<Scalar> {
26  public:
29 
32 
43  void nonconstInitialize(
44  const RCP<LinearOpWithSolveFactoryBase<Scalar> > &lowsf);
45 
56  void initialize(
57  const RCP<const LinearOpWithSolveFactoryBase<Scalar> > &lowsf);
58 
59  RCP<LinearOpWithSolveFactoryBase<Scalar> > getUnderlyingLOWSF();
60 
61  RCP<const LinearOpWithSolveFactoryBase<Scalar> > getUnderlyingLOWSF() const;
62 
64 
67 
68  std::string description() const;
69 
71 
75 
76  void setParameterList(RCP<ParameterList> const &paramList);
77  RCP<ParameterList> getNonconstParameterList();
78  RCP<ParameterList> unsetParameterList();
79  RCP<const ParameterList> getParameterList() const;
80  RCP<const ParameterList> getValidParameters() const;
81 
83 
86 
88  virtual bool acceptsPreconditionerFactory() const;
89 
91  virtual void setPreconditionerFactory(
92  const RCP<PreconditionerFactoryBase<Scalar> > &precFactory,
93  const std::string &precFactoryName);
94 
96  virtual RCP<PreconditionerFactoryBase<Scalar> > getPreconditionerFactory()
97  const;
98 
100  virtual void unsetPreconditionerFactory(
101  RCP<PreconditionerFactoryBase<Scalar> > *precFactory,
102  std::string *precFactoryName);
103 
104  virtual bool isCompatible(const LinearOpSourceBase<Scalar> &fwdOpSrc) const;
105 
106  virtual RCP<LinearOpWithSolveBase<Scalar> > createOp() const;
107 
108  virtual void initializeOp(
109  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
111  const ESupportSolveUse supportSolveUse) const;
112 
113  virtual void initializeAndReuseOp(
114  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
116 
117  virtual void uninitializeOp(
119  RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc,
120  RCP<const PreconditionerBase<Scalar> > *prec,
121  RCP<const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
122  ESupportSolveUse *supportSolveUse) const;
123 
124  virtual bool supportsPreconditionerInputType(
125  const EPreconditionerInputType precOpType) const;
126 
127  virtual void initializePreconditionedOp(
128  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
129  const RCP<const PreconditionerBase<Scalar> > &prec,
131  const ESupportSolveUse supportSolveUse) const;
132 
134  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
135  const RCP<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
137  const ESupportSolveUse supportSolveUse) const;
138 
140 
141  protected:
144 
145  void informUpdatedVerbosityState() const;
146 
148 
149  private:
153 
155 };
156 
161 template <class Scalar>
162 RCP<const AdjointLinearOpWithSolveFactory<Scalar> >
164  const RCP<const LinearOpWithSolveFactoryBase<Scalar> > &lowsf)
165 {
166  RCP<AdjointLinearOpWithSolveFactory<Scalar> > alowsf =
168  alowsf->initialize(lowsf);
169  return alowsf;
170 }
171 
176 template <class Scalar>
177 RCP<AdjointLinearOpWithSolveFactory<Scalar> >
179  const RCP<LinearOpWithSolveFactoryBase<Scalar> > &lowsf)
180 {
181  RCP<AdjointLinearOpWithSolveFactory<Scalar> > alowsf =
183  alowsf->nonconstInitialize(lowsf);
184  return alowsf;
185 }
186 
187 // Overridden from Constructors/Initializers/Accessors
188 
189 template <class Scalar>
191  const RCP<LinearOpWithSolveFactoryBase<Scalar> > &lowsf)
192 {
193 #ifdef TEUCHOS_DEBUG
195 #endif
196  lowsf_.initialize(lowsf);
197 }
198 
199 template <class Scalar>
201  const RCP<const LinearOpWithSolveFactoryBase<Scalar> > &lowsf)
202 {
203 #ifdef TEUCHOS_DEBUG
205 #endif
206  lowsf_.initialize(lowsf);
207 }
208 
209 template <class Scalar>
210 RCP<LinearOpWithSolveFactoryBase<Scalar> >
212 {
213  return lowsf_.getNonconstObj();
214 }
215 
216 template <class Scalar>
217 RCP<const LinearOpWithSolveFactoryBase<Scalar> >
219 {
220  return lowsf_.getConstObj();
221 }
222 
223 // Overridden from Teuchos::Describable
224 
225 template <class Scalar>
227 {
228  std::ostringstream oss;
229  oss << this->Teuchos::Describable::description() << "{"
230  << "lowsf=";
231  if (!is_null(lowsf_.getConstObj()))
232  oss << lowsf_.getConstObj()->description();
233  else
234  oss << "NULL";
235  oss << "}";
236  return oss.str();
237 }
238 
239 // Overridden from ParameterListAcceptor
240 
241 template <class Scalar>
243  RCP<ParameterList> const &paramList)
244 {
245  lowsf_.getNonconstObj()->setParameterList(paramList);
246 }
247 
248 template <class Scalar>
249 RCP<ParameterList>
251 {
252  return lowsf_.getNonconstObj()->getNonconstParameterList();
253 }
254 
255 template <class Scalar>
257 {
258  return lowsf_.getNonconstObj()->unsetParameterList();
259 }
260 
261 template <class Scalar>
262 RCP<const ParameterList>
264 {
265  return lowsf_.getConstObj()->getParameterList();
266 }
267 
268 template <class Scalar>
269 RCP<const ParameterList>
271 {
272  return lowsf_.getConstObj()->getValidParameters();
273 }
274 
275 // Overridden from LinearOpWithSolveFactoyBase
276 
277 template <class Scalar>
279  const
280 {
281  return lowsf_.getConstObj()->acceptsPreconditionerFactory();
282 }
283 
284 template <class Scalar>
286  const RCP<PreconditionerFactoryBase<Scalar> > &precFactory,
287  const std::string &precFactoryName)
288 {
290  RCP<APF> apf = Teuchos::rcp_dynamic_cast<APF>(precFactory);
291  lowsf_.getNonconstObj()->setPreconditionerFactory(
292  apf->getNonconstPreconditionerFactory(), precFactoryName);
293 }
294 
295 template <class Scalar>
296 RCP<PreconditionerFactoryBase<Scalar> >
298 {
299  RCP<PreconditionerFactoryBase<Scalar> > prec_fac =
300  lowsf_.getConstObj()->getPreconditionerFactory();
301  if (prec_fac == Teuchos::null)
302  return Teuchos::null;
303  else
304  return nonconstAdjointPreconditionerFactory(prec_fac);
305 }
306 
307 template <class Scalar>
309  RCP<PreconditionerFactoryBase<Scalar> > *precFactory,
310  std::string *precFactoryName)
311 {
312  RCP<PreconditionerFactoryBase<Scalar> > inner_precFactory;
313  lowsf_.getNonconstObj()->unsetPreconditionerFactory(
314  precFactory ? &inner_precFactory : NULL, precFactoryName);
315  if (precFactory)
316  *precFactory = nonconstAdjointPreconditionerFactory(inner_precFactory);
317 }
318 
319 template <class Scalar>
321  const LinearOpSourceBase<Scalar> &fwdOpSrc) const
322 {
324  RCP<const ALO> alo =
325  Teuchos::rcp_dynamic_cast<const ALO>(fwdOpSrc.getOp().assert_not_null());
326  RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc =
327  defaultLinearOpSource<Scalar>(alo->getOp());
328  return lowsf_.getConstObj()->isCompatible(*inner_fwdOpSrc);
329 }
330 
331 template <class Scalar>
332 RCP<LinearOpWithSolveBase<Scalar> >
334 {
335  return nonconstAdjointLows<Scalar>(lowsf_.getConstObj()->createOp());
336 }
337 
338 template <class Scalar>
340  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
342  const ESupportSolveUse supportSolveUse) const
343 {
344  using Teuchos::dyn_cast;
345  using Teuchos::rcp_dynamic_cast;
346 
347 #ifdef TEUCHOS_DEBUG
348  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
349 #endif
350 
351  // Set the verbosity settings for the wrapped LOWSF object!
352  lowsf_.getConstObj()->setOStream(this->getOStream());
353  lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
354 
357  const RCP<const ALO> alo =
358  rcp_dynamic_cast<const ALO>(fwdOpSrc->getOp().assert_not_null());
359  ALOWS &alows = dyn_cast<ALOWS>(*Op);
360 
361  lowsf_.getConstObj()->initializeOp(
362  defaultLinearOpSource<Scalar>(alo->getOrigOp()),
363  alows.getNonconstOp().get(), supportSolveUse);
364 }
365 
366 template <class Scalar>
368  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
370 {
371  using Teuchos::dyn_cast;
372  using Teuchos::rcp_dynamic_cast;
373 
374 #ifdef TEUCHOS_DEBUG
375  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
376 #endif
377 
378  // Set the verbosity settings for the wrapped LOWSF object!
379  lowsf_.getConstObj()->setOStream(this->getOStream());
380  lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
381 
384  const RCP<const ALO> alo =
385  rcp_dynamic_cast<const ALO>(fwdOpSrc->getOp().assert_not_null());
386  ALOWS &alows = dyn_cast<ALOWS>(*Op);
387 
388  lowsf_.getConstObj()->initializeAndReuseOp(
389  defaultLinearOpSource<Scalar>(alo->getOrigOp()),
390  alows.getNonconstOp().get());
391 }
392 
393 template <class Scalar>
396  RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc,
397  RCP<const PreconditionerBase<Scalar> > *prec,
398  RCP<const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
399  ESupportSolveUse *supportSolveUse) const
400 {
401  using Teuchos::dyn_cast;
402 
403 #ifdef TEUCHOS_DEBUG
404  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
405 #endif
407  ALOWS &alowsOp = dyn_cast<ALOWS>(*Op);
408  RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
409  RCP<const PreconditionerBase<Scalar> > inner_prec;
410  RCP<const LinearOpSourceBase<Scalar> > inner_approxFwdOpSrc;
411  lowsf_.getConstObj()->uninitializeOp(
412  alowsOp.getNonconstOp().get(), fwdOpSrc ? &inner_fwdOpSrc : NULL,
413  prec ? &inner_prec : NULL, approxFwdOpSrc ? &inner_approxFwdOpSrc : NULL,
414  supportSolveUse);
415  if (fwdOpSrc)
416  *fwdOpSrc = defaultLinearOpSource<Scalar>(adjoint(inner_fwdOpSrc->getOp()));
417  if (prec) *prec = adjointPreconditioner(inner_prec);
418  if (fwdOpSrc)
419  *approxFwdOpSrc =
420  defaultLinearOpSource<Scalar>(adjoint(inner_approxFwdOpSrc->getOp()));
421 }
422 
423 template <class Scalar>
425  const EPreconditionerInputType precOpType) const
426 {
427  return lowsf_.getConstObj()->supportsPreconditionerInputType(precOpType);
428 }
429 
430 template <class Scalar>
432  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
433  const RCP<const PreconditionerBase<Scalar> > &prec,
435  const ESupportSolveUse supportSolveUse) const
436 {
437  using Teuchos::dyn_cast;
438  using Teuchos::rcp_dynamic_cast;
439 
440 #ifdef TEUCHOS_DEBUG
441  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
442 #endif
443 
444  // Set the verbosity settings for the wrapped LOWSF object!
445  lowsf_.getConstObj()->setOStream(this->getOStream());
446  lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
447 
451  const RCP<const ALO> alo =
452  rcp_dynamic_cast<const ALO>(fwdOpSrc->getOp().assert_not_null());
453  const RCP<const AP> ap = rcp_dynamic_cast<const AP>(prec);
454  ALOWS &alows = dyn_cast<ALOWS>(*Op);
455 
456  lowsf_.getConstObj()->initializePreconditionedOp(
457  defaultLinearOpSource<Scalar>(alo->getOp()), ap->getPreconditioner(),
458  alows.getNonconstOp().get(), supportSolveUse);
459 }
460 
461 template <class Scalar>
463  const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
464  const RCP<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
466  const ESupportSolveUse supportSolveUse) const
467 {
468  using Teuchos::dyn_cast;
469  using Teuchos::rcp_dynamic_cast;
470 
471 #ifdef TEUCHOS_DEBUG
472  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
473 #endif
474 
475  // Set the verbosity settings for the wrapped LOWSF object!
476  lowsf_.getConstObj()->setOStream(this->getOStream());
477  lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
478 
481  const RCP<const ALO> alo =
482  rcp_dynamic_cast<const ALO>(fwdOpSrc->getOp().assert_not_null());
483  const RCP<const ALO> aalo =
484  rcp_dynamic_cast<const ALO>(approxFwdOpSrc->getOp().assert_not_null());
485  ALOWS &alows = dyn_cast<ALOWS>(*Op);
486 
487  lowsf_.getConstObj()->initializeApproxPreconditionedOp(
488  defaultLinearOpSource<Scalar>(alo->getOp()),
489  defaultLinearOpSource<Scalar>(aalo->getOp()), alows.getNonconstOp().get(),
490  supportSolveUse);
491 }
492 
493 // protected
494 
495 template <class Scalar>
497  const
498 {
499  lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
500  lowsf_.getConstObj()->setOStream(this->getOStream());
501 }
502 
503 } // namespace Thyra
504 
505 #endif
bool is_null(const boost::shared_ptr< T > &p)
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
virtual void uninitializeOp(LinearOpWithSolveBase< Scalar > *Op, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc, RCP< const PreconditionerBase< Scalar > > *prec, RCP< const LinearOpSourceBase< Scalar > > *approxFwdOpSrc, ESupportSolveUse *supportSolveUse) const
RCP< LinearOpWithSolveFactoryBase< Scalar > > getUnderlyingLOWSF()
T_To & dyn_cast(T_From &from)
virtual void initializeApproxPreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
Create a LinearOpWithSolveFactory for an adjoint linear op.
RCP< AdjointLinearOpWithSolveFactory< Scalar > > nonconstAdjointLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf)
Nonmember constructor.
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
virtual bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
Teuchos::ConstNonconstObjectContainer< LinearOpWithSolveFactoryBase< Scalar > > LOWSF_t
virtual void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
RCP< const AdjointLinearOpWithSolveFactory< Scalar > > adjointLinearOpWithSolveFactory(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf)
Nonmember constructor.
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.
void setParameterList(RCP< ParameterList > const &paramList)
virtual std::string description() const
ESupportSolveUse
void initialize(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf)
Initialize given a single const LOWSFB object.
virtual bool acceptsPreconditionerFactory() const
returns false.
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.
EPreconditionerInputType
virtual void initializePreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
Concrete PreconditionerFactoryBase subclass that wraps a preconditioner in AdjointPreconditioner.
virtual Teuchos::RCP< const LinearOpBase< Scalar > > getOp() const =0
virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
void nonconstInitialize(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf)
Initialize given a single non-const LOWSFB object.