10#ifndef Thyra_MultiVectorLinearOpWithSolveFactory_hpp
11#define Thyra_MultiVectorLinearOpWithSolveFactory_hpp
13#include "Thyra_LinearOpWithSolveFactoryBase.hpp"
17#include "Thyra_DefaultMultiVectorLinearOpWithSolve.hpp"
18#include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
19#include "Thyra_DefaultLinearOpSource.hpp"
25template <
class Scalar>
49 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
51 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
67 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
69 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
106 const std::string &precFactoryName);
115 std::string *precFactoryName);
117 virtual bool isCompatible(
const LinearOpSourceBase<Scalar> &fwdOpSrc)
const;
119 virtual RCP<LinearOpWithSolveBase<Scalar> >
createOp()
const;
122 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
124 const ESupportSolveUse supportSolveUse)
const;
127 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
132 RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
134 RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
135 ESupportSolveUse *supportSolveUse)
const;
138 const EPreconditionerInputType precOpType)
const;
141 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
144 const ESupportSolveUse supportSolveUse)
const;
147 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
148 const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
150 const ESupportSolveUse supportSolveUse)
const;
163 typedef Teuchos::ConstNonconstObjectContainer<
176template <
class Scalar>
177RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
180 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
182 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
185 RCP<MultiVectorLinearOpWithSolveFactory<Scalar> > mvlowsf =
187 mvlowsf->nonconstInitialize(lowsf, multiVecRange, multiVecDomain);
195template <
class Scalar>
196RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
199 const int num_blocks)
201 RCP<LinearOpWithSolveBase<Scalar> > op = lowsf->createOp();
202 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
203 Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
204 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
205 Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
206 return nonconstMultiVectorLinearOpWithSolveFactory(lowsf, mv_range,
214template <
class Scalar>
215RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
218 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
220 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
223 RCP<MultiVectorLinearOpWithSolveFactory<Scalar> > mvlowsf =
225 mvlowsf->initialize(lowsf, multiVecRange, multiVecDomain);
233template <
class Scalar>
234RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
237 const int num_blocks)
239 RCP<LinearOpWithSolveBase<Scalar> > op = lowsf->createOp();
240 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
241 Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
242 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
243 Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
244 return multiVectorLinearOpWithSolveFactory(lowsf, mv_range, mv_domain);
249template <
class Scalar>
252 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
254 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
258 TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf));
260 lowsf_.initialize(lowsf);
261 multiVecRange_ = multiVecRange;
262 multiVecDomain_ = multiVecDomain;
265template <
class Scalar>
268 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
270 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
274 TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf));
276 lowsf_.initialize(lowsf);
277 multiVecRange_ = multiVecRange;
278 multiVecDomain_ = multiVecDomain;
281template <
class Scalar>
282RCP<LinearOpWithSolveFactoryBase<Scalar> >
285 return lowsf_.getNonconstObj();
288template <
class Scalar>
289RCP<const LinearOpWithSolveFactoryBase<Scalar> >
292 return lowsf_.getConstObj();
297template <
class Scalar>
300 std::ostringstream oss;
301 oss << this->Teuchos::Describable::description() <<
"{"
303 if (!is_null(lowsf_.getConstObj()))
304 oss << lowsf_.getConstObj()->description();
313template <
class Scalar>
315 RCP<ParameterList>
const ¶mList)
317 lowsf_.getNonconstObj()->setParameterList(paramList);
320template <
class Scalar>
324 return lowsf_.getNonconstObj()->getNonconstParameterList();
327template <
class Scalar>
331 return lowsf_.getNonconstObj()->unsetParameterList();
334template <
class Scalar>
335RCP<const ParameterList>
338 return lowsf_.getConstObj()->getParameterList();
341template <
class Scalar>
342RCP<const ParameterList>
345 return lowsf_.getConstObj()->getValidParameters();
350template <
class Scalar>
354 return lowsf_.getConstObj()->acceptsPreconditionerFactory();
357template <
class Scalar>
360 const std::string &precFactoryName)
363 RCP<MVPF> mvpf = Teuchos::rcp_dynamic_cast<MVPF>(precFactory);
364 lowsf_.getNonconstObj()->setPreconditionerFactory(
365 mvpf->getNonconstPreconditionerFactory(), precFactoryName);
368template <
class Scalar>
369RCP<PreconditionerFactoryBase<Scalar> >
372 RCP<PreconditionerFactoryBase<Scalar> > prec_fac =
373 lowsf_.getConstObj()->getPreconditionerFactory();
374 if (prec_fac == Teuchos::null)
375 return Teuchos::null;
377 return nonconstMultiVectorPreconditionerFactory(prec_fac, multiVecRange_,
381template <
class Scalar>
384 std::string *precFactoryName)
386 RCP<PreconditionerFactoryBase<Scalar> > inner_precFactory;
387 lowsf_.getNonconstObj()->unsetPreconditionerFactory(
388 precFactory ? &inner_precFactory : NULL, precFactoryName);
390 *precFactory = nonconstMultiVectorPreconditionerFactory(
391 inner_precFactory, multiVecRange_, multiVecDomain_);
394template <
class Scalar>
396 const LinearOpSourceBase<Scalar> &fwdOpSrc)
const
399 RCP<const MVLO> mvlo =
400 Teuchos::rcp_dynamic_cast<const MVLO>(fwdOpSrc.getOp().assert_not_null());
401 RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc =
402 defaultLinearOpSource<Scalar>(mvlo->getLinearOp());
403 return lowsf_.getConstObj()->isCompatible(*inner_fwdOpSrc);
406template <
class Scalar>
407RCP<LinearOpWithSolveBase<Scalar> >
410 return nonconstMultiVectorLinearOpWithSolve<Scalar>(
411 lowsf_.getConstObj()->createOp(), multiVecRange_, multiVecDomain_);
414template <
class Scalar>
416 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
418 const ESupportSolveUse supportSolveUse)
const
420 using Teuchos::dyn_cast;
421 using Teuchos::rcp_dynamic_cast;
424 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
428 lowsf_.getConstObj()->setOStream(this->getOStream());
429 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
432 typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
433 const RCP<const MVLO> mvlo =
434 rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
435 MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
437 lowsf_.getConstObj()->initializeOp(
438 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
439 mvlows.getNonconstLinearOpWithSolve().get(), supportSolveUse);
442template <
class Scalar>
444 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
447 using Teuchos::dyn_cast;
448 using Teuchos::rcp_dynamic_cast;
451 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
455 lowsf_.getConstObj()->setOStream(this->getOStream());
456 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
459 typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
460 const RCP<const MVLO> mvlo =
461 rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
462 MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
464 lowsf_.getConstObj()->initializeAndReuseOp(
465 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
466 mvlows.getNonconstLinearOpWithSolve().get());
469template <
class Scalar>
472 RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
474 RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
475 ESupportSolveUse *supportSolveUse)
const
477 using Teuchos::dyn_cast;
480 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
482 typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
483 MVLOWS &mvlowsOp = dyn_cast<MVLOWS>(*Op);
484 RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
485 RCP<const PreconditionerBase<Scalar> > inner_prec;
486 RCP<const LinearOpSourceBase<Scalar> > inner_approxFwdOpSrc;
487 lowsf_.getConstObj()->uninitializeOp(
488 mvlowsOp.getNonconstLinearOpWithSolve().get(),
489 fwdOpSrc ? &inner_fwdOpSrc : NULL, prec ? &inner_prec : NULL,
490 approxFwdOpSrc ? &inner_approxFwdOpSrc : NULL, supportSolveUse);
492 *fwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
493 inner_fwdOpSrc->getOp(), multiVecRange_, multiVecDomain_));
496 multiVectorPreconditioner(inner_prec, multiVecRange_, multiVecDomain_);
498 *approxFwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
499 inner_approxFwdOpSrc->getOp(), multiVecRange_, multiVecDomain_));
502template <
class Scalar>
504 Scalar>::supportsPreconditionerInputType(
const EPreconditionerInputType
510template <
class Scalar>
512 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
515 const ESupportSolveUse supportSolveUse)
const
517 using Teuchos::dyn_cast;
518 using Teuchos::rcp_dynamic_cast;
521 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
525 lowsf_.getConstObj()->setOStream(this->getOStream());
526 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
530 typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
531 const RCP<const MVLO> mvlo =
532 rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
533 const RCP<const MVP> mvp = rcp_dynamic_cast<const MVP>(prec);
534 MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
536 lowsf_.getConstObj()->initializePreconditionedOp(
537 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
538 mvp->getPreconditioner(), mvlows.getNonconstLinearOpWithSolve().get(),
542template <
class Scalar>
545 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
546 const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
548 const ESupportSolveUse supportSolveUse)
const
550 using Teuchos::dyn_cast;
551 using Teuchos::rcp_dynamic_cast;
554 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
558 lowsf_.getConstObj()->setOStream(this->getOStream());
559 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
562 typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
563 const RCP<const MVLO> mvlo =
564 rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
565 const RCP<const MVLO> amvlo =
566 rcp_dynamic_cast<const MVLO>(approxFwdOpSrc->getOp().assert_not_null());
567 MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
569 lowsf_.getConstObj()->initializeApproxPreconditionedOp(
570 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
571 defaultLinearOpSource<Scalar>(amvlo->getLinearOp()),
572 mvlows.getNonconstLinearOpWithSolve().get(), supportSolveUse);
577template <
class Scalar>
581 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
582 lowsf_.getConstObj()->setOStream(this->getOStream());
Create a LinearOpWithSolveFactory for a flattened-out multi-vector.
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > nonconstMultiVectorLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const int num_blocks)
Nonmember constructor.
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > multiVectorLinearOpWithSolveFactory(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const int num_blocks)
Nonmember constructor.
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
void setParameterList(RCP< ParameterList > const ¶mList)
Teuchos::ConstNonconstObjectContainer< LinearOpWithSolveFactoryBase< Scalar > > LOWSF_t
RCP< const ParameterList > getValidParameters() const
virtual void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
RCP< const ParameterList > getParameterList() const
void initialize(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Initialize given a single const LOWSFB object.
virtual bool acceptsPreconditionerFactory() const
returns false.
RCP< LinearOpWithSolveFactoryBase< Scalar > > getUnderlyingLOWSF()
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
RCP< ParameterList > unsetParameterList()
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > nonconstMultiVectorLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor.
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
RCP< ParameterList > getNonconstParameterList()
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
std::string description() const
virtual void initializeApproxPreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
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 isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > multiVectorLinearOpWithSolveFactory(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor.
virtual void initializePreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
void nonconstInitialize(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Initialize given a single non-const LOWSFB object.
MultiVectorLinearOpWithSolveFactory()
Construct to uninitialized.
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
Concrete PreconditionerFactoryBase subclass that wraps a preconditioner in MultiVectorPreconditioner.
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.