Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Thyra_ReuseLinearOpWithSolveFactory.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_ReuseLinearOpWithSolveFactory_hpp
10#define Thyra_ReuseLinearOpWithSolveFactory_hpp
11
12#include "Thyra_LinearOpWithSolveFactoryBase.hpp"
14
15namespace Thyra {
16
20template<class Scalar>
22 : virtual public LinearOpWithSolveFactoryBase<Scalar>
23{
24public:
25
28
31
44 const RCP<LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
45 const RCP<PreconditionerBase<Scalar> > &prec
46 );
47
48
60 void initialize(
61 const RCP<const LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
62 const RCP<PreconditionerBase<Scalar> > &prec
63 );
64
65 RCP<LinearOpWithSolveFactoryBase<Scalar> > getUnderlyingLOWSF();
66
67 RCP<const LinearOpWithSolveFactoryBase<Scalar> > getUnderlyingLOWSF() const;
68
69 RCP<PreconditionerBase<Scalar> > getUnderlyingPreconditioner();
70
71 RCP<const PreconditionerBase<Scalar> > getUnderlyingPreconditioner() const;
72
74
77
78 std::string description() const;
79
81
84
85 void setParameterList(RCP<ParameterList> const& paramList);
86 RCP<ParameterList> getNonconstParameterList();
87 RCP<ParameterList> unsetParameterList();
88 RCP<const ParameterList> getParameterList() const;
89 RCP<const ParameterList> getValidParameters() const;
90
92
95
97 virtual bool acceptsPreconditionerFactory() const;
98
100 virtual void setPreconditionerFactory(
101 const RCP<PreconditionerFactoryBase<Scalar> > &precFactory,
102 const std::string &precFactoryName
103 );
104
106 virtual RCP<PreconditionerFactoryBase<Scalar> >
108
110 virtual void unsetPreconditionerFactory(
111 RCP<PreconditionerFactoryBase<Scalar> > *precFactory,
112 std::string *precFactoryName
113 );
114
115 virtual bool isCompatible(
116 const LinearOpSourceBase<Scalar> &fwdOpSrc
117 ) const;
118
119 virtual RCP<LinearOpWithSolveBase<Scalar> > createOp() const;
120
121 virtual void initializeOp(
122 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
123 LinearOpWithSolveBase<Scalar> *Op,
124 const ESupportSolveUse supportSolveUse
125 ) const;
126
127 virtual void initializeAndReuseOp(
128 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
129 LinearOpWithSolveBase<Scalar> *Op
130 ) const;
131
132 virtual void uninitializeOp(
133 LinearOpWithSolveBase<Scalar> *Op,
134 RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc,
135 RCP<const PreconditionerBase<Scalar> > *prec,
136 RCP<const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
137 ESupportSolveUse *supportSolveUse
138 ) const;
139
141 const EPreconditionerInputType precOpType
142 ) const;
143
144 virtual void initializePreconditionedOp(
145 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
146 const RCP<const PreconditionerBase<Scalar> > &prec,
147 LinearOpWithSolveBase<Scalar> *Op,
148 const ESupportSolveUse supportSolveUse
149 ) const;
150
152 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
153 const RCP<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
154 LinearOpWithSolveBase<Scalar> *Op,
155 const ESupportSolveUse supportSolveUse
156 ) const;
157
159
160protected:
161
164
165 void informUpdatedVerbosityState() const;
166
168
169private:
170
171 typedef Teuchos::ConstNonconstObjectContainer<LinearOpWithSolveFactoryBase<Scalar> > LOWSF_t;
172
174 RCP< PreconditionerBase<Scalar> > prec_;
175
176};
177
182template<class Scalar>
183RCP<ReuseLinearOpWithSolveFactory<Scalar> >
185 const RCP<LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
186 const RCP<PreconditionerBase<Scalar> > &prec
187 )
188{
189 RCP<ReuseLinearOpWithSolveFactory<Scalar> > rlowsf =
190 Teuchos::rcp(new ReuseLinearOpWithSolveFactory<Scalar>);
191 rlowsf->nonconstInitialize(lowsf, prec);
192 return rlowsf;
193}
194
199template<class Scalar>
200RCP<ReuseLinearOpWithSolveFactory<Scalar> >
202 const RCP<const LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
203 const RCP<PreconditionerBase<Scalar> > &prec
204 )
205{
206 RCP<ReuseLinearOpWithSolveFactory<Scalar> > rlowsf =
207 Teuchos::rcp(new ReuseLinearOpWithSolveFactory<Scalar>);
208 rlowsf->initialize(lowsf, prec);
209 return rlowsf;
210}
211
212// Overridden from Constructors/Initializers/Accessors
213
214template<class Scalar>
215void
218 const RCP<LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
219 const RCP<PreconditionerBase<Scalar> > &prec
220 )
221{
222#ifdef TEUCHOS_DEBUG
223 TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf));
224 TEUCHOS_TEST_FOR_EXCEPT(is_null(prec));
225#endif
226 lowsf_.initialize(lowsf);
227 prec_ = prec;
228}
229
230template<class Scalar>
231void
234 const RCP<const LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
235 const RCP<PreconditionerBase<Scalar> > &prec
236 )
237{
238#ifdef TEUCHOS_DEBUG
239 TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf));
240 TEUCHOS_TEST_FOR_EXCEPT(is_null(prec));
241#endif
242 lowsf_.initialize(lowsf);
243 prec_ = prec;
244}
245
246template<class Scalar>
247RCP<LinearOpWithSolveFactoryBase<Scalar> >
250{
251 return lowsf_.getNonconstObj();
252}
253
254template<class Scalar>
255RCP<const LinearOpWithSolveFactoryBase<Scalar> >
257getUnderlyingLOWSF() const
258{
259 return lowsf_.getConstObj();
260}
261
262template<class Scalar>
263RCP<PreconditionerBase<Scalar> >
269
270template<class Scalar>
271RCP<const PreconditionerBase<Scalar> >
277
278// Overridden from Teuchos::Describable
279
280template<class Scalar>
281std::string
283description() const
284{
285 std::ostringstream oss;
286 oss << this->Teuchos::Describable::description()
287 << "{"
288 << "lowsf=";
289 if (!is_null(lowsf_.getConstObj()))
290 oss << lowsf_.getConstObj()->description();
291 else
292 oss << "NULL";
293 oss << std::endl
294 << "prec=";
295 if (!is_null(prec_))
296 oss << prec_->description();
297 else
298 oss << "NULL";
299 oss << "}";
300 return oss.str();
301}
302
303// Overridden from ParameterListAcceptor
304
305template<class Scalar>
306void
309 RCP<ParameterList> const& paramList
310 )
311{
312 lowsf_.getNonconstObj()->setParameterList(paramList);
313}
314
315template<class Scalar>
316RCP<ParameterList>
319{
320 return lowsf_.getNonconstObj()->getNonconstParameterList();
321}
322
323template<class Scalar>
324RCP<ParameterList>
327{
328 return lowsf_.getNonconstObj()->unsetParameterList();
329}
330
331template<class Scalar>
332RCP<const ParameterList>
334getParameterList() const
335{
336 return lowsf_.getConstObj()->getParameterList();
337}
338
339template<class Scalar>
340RCP<const ParameterList>
342getValidParameters() const
343{
344 return lowsf_.getConstObj()->getValidParameters();
345}
346
347// Overridden from LinearOpWithSolveFactoyBase
348
349template<class Scalar>
350bool
356
357template<class Scalar>
358void
361 const RCP<PreconditionerFactoryBase<Scalar> > &/* precFactory */,
362 const std::string &/* precFactoryName */
363 )
364{
365}
366
367template<class Scalar>
368RCP<PreconditionerFactoryBase<Scalar> >
371{
372 return Thyra::reusePreconditionerFactory<Scalar>(prec_);
373}
374
375template<class Scalar>
378 RCP<PreconditionerFactoryBase<Scalar> > * /* precFactory */,
379 std::string * /* precFactoryName */
380 )
381{
382}
383
384template<class Scalar>
385bool
388 const LinearOpSourceBase<Scalar> &fwdOpSrc
389 ) const
390{
391 return lowsf_.getConstObj()->isCompatible(fwdOpSrc);
392}
393
394template<class Scalar>
395RCP<LinearOpWithSolveBase<Scalar> >
397createOp() const
398{
399 return lowsf_.getConstObj()->createOp();
400}
401
402template<class Scalar>
403void
406 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
407 LinearOpWithSolveBase<Scalar> *Op,
408 const ESupportSolveUse supportSolveUse
409 ) const
410{
411 lowsf_.getConstObj()->initializeOp(fwdOpSrc, Op, supportSolveUse);
412}
413
414template<class Scalar>
415void
418 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
419 LinearOpWithSolveBase<Scalar> *Op
420 ) const
421{
422 lowsf_.getConstObj()->initializeAndReuseOp(fwdOpSrc, Op);
423}
424
425template<class Scalar>
426void
429 LinearOpWithSolveBase<Scalar> *Op,
430 RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc,
431 RCP<const PreconditionerBase<Scalar> > *prec,
432 RCP<const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
433 ESupportSolveUse *supportSolveUse
434 ) const
435{
436 lowsf_.getConstObj()->uninitializeOp(Op, fwdOpSrc, prec, approxFwdOpSrc,
437 supportSolveUse);
438}
439
440template<class Scalar>
441bool
444 const EPreconditionerInputType precOpType
445 ) const
446{
447 return lowsf_.getConstObj()->supportsPreconditionerInputType(precOpType);
448}
449
450template<class Scalar>
451void
454 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
455 const RCP<const PreconditionerBase<Scalar> > &prec,
456 LinearOpWithSolveBase<Scalar> *Op,
457 const ESupportSolveUse supportSolveUse
458 ) const
459{
460 lowsf_.getConstObj()->initializePreconditionedOp(fwdOpSrc, prec, Op,
461 supportSolveUse);
462}
463
464template<class Scalar>
465void
468 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
469 const RCP<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
470 LinearOpWithSolveBase<Scalar> *Op,
471 const ESupportSolveUse supportSolveUse
472 ) const
473{
474 lowsf_.getConstObj()->initializeApproxPreconditionedOp(fwdOpSrc,
475 approxFwdOpSrc,
476 Op,
477 supportSolveUse);
478}
479
480// protected
481
482template<class Scalar>
483void
486{
487 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
488 lowsf_.getConstObj()->setOStream(this->getOStream());
489}
490
491} // namespace Thyra
492
493
494#endif
A LinearOpWithSolveFactory that is designed to reuse an already created/initialized preconditioner.
virtual void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
void initialize(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< PreconditionerBase< Scalar > > &prec)
Initialize given a single const LOWSFB object.
void nonconstInitialize(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< PreconditionerBase< Scalar > > &prec)
Initialize given a single non-const LOWSFB object.
virtual void uninitializeOp(LinearOpWithSolveBase< Scalar > *Op, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc, RCP< const PreconditionerBase< Scalar > > *prec, RCP< const LinearOpSourceBase< Scalar > > *approxFwdOpSrc, ESupportSolveUse *supportSolveUse) const
virtual bool acceptsPreconditionerFactory() const
returns false.
void setParameterList(RCP< ParameterList > const &paramList)
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.
RCP< ReuseLinearOpWithSolveFactory< Scalar > > reuseLinearOpWithSolveFactory(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< PreconditionerBase< Scalar > > &prec)
Nonmember constructor.
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.
Teuchos::ConstNonconstObjectContainer< LinearOpWithSolveFactoryBase< Scalar > > LOWSF_t
virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
virtual void initializeApproxPreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
RCP< ReuseLinearOpWithSolveFactory< Scalar > > nonconstReuseLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< PreconditionerBase< Scalar > > &prec)
Nonmember constructor.
virtual void initializePreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
RCP< PreconditionerBase< Scalar > > getUnderlyingPreconditioner()
virtual bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
RCP< LinearOpWithSolveFactoryBase< Scalar > > getUnderlyingLOWSF()