9 #ifndef Thyra_MultiVectorLinearOpWithSolveFactory_hpp
10 #define Thyra_MultiVectorLinearOpWithSolveFactory_hpp
12 #include "Thyra_LinearOpWithSolveFactoryBase.hpp"
16 #include "Thyra_DefaultMultiVectorLinearOpWithSolve.hpp"
17 #include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
18 #include "Thyra_DefaultLinearOpSource.hpp"
24 template <
class Scalar>
105 const std::string &precFactoryName);
114 std::string *precFactoryName);
118 virtual RCP<LinearOpWithSolveBase<Scalar> >
createOp()
const;
175 template <
class Scalar>
176 RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
184 RCP<MultiVectorLinearOpWithSolveFactory<Scalar> > mvlowsf =
186 mvlowsf->nonconstInitialize(lowsf, multiVecRange, multiVecDomain);
194 template <
class Scalar>
195 RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
198 const int num_blocks)
200 RCP<LinearOpWithSolveBase<Scalar> > op = lowsf->createOp();
201 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
202 Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
203 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
204 Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
205 return nonconstMultiVectorLinearOpWithSolveFactory(lowsf, mv_range,
213 template <
class Scalar>
214 RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
222 RCP<MultiVectorLinearOpWithSolveFactory<Scalar> > mvlowsf =
224 mvlowsf->initialize(lowsf, multiVecRange, multiVecDomain);
232 template <
class Scalar>
233 RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
236 const int num_blocks)
238 RCP<LinearOpWithSolveBase<Scalar> > op = lowsf->createOp();
239 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
240 Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
241 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
242 Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
243 return multiVectorLinearOpWithSolveFactory(lowsf, mv_range, mv_domain);
248 template <
class Scalar>
259 lowsf_.initialize(lowsf);
260 multiVecRange_ = multiVecRange;
261 multiVecDomain_ = multiVecDomain;
264 template <
class Scalar>
275 lowsf_.initialize(lowsf);
276 multiVecRange_ = multiVecRange;
277 multiVecDomain_ = multiVecDomain;
280 template <
class Scalar>
281 RCP<LinearOpWithSolveFactoryBase<Scalar> >
284 return lowsf_.getNonconstObj();
287 template <
class Scalar>
288 RCP<const LinearOpWithSolveFactoryBase<Scalar> >
291 return lowsf_.getConstObj();
296 template <
class Scalar>
299 std::ostringstream oss;
302 if (!
is_null(lowsf_.getConstObj()))
303 oss << lowsf_.getConstObj()->description();
312 template <
class Scalar>
314 RCP<ParameterList>
const ¶mList)
316 lowsf_.getNonconstObj()->setParameterList(paramList);
319 template <
class Scalar>
323 return lowsf_.getNonconstObj()->getNonconstParameterList();
326 template <
class Scalar>
330 return lowsf_.getNonconstObj()->unsetParameterList();
333 template <
class Scalar>
334 RCP<const ParameterList>
337 return lowsf_.getConstObj()->getParameterList();
340 template <
class Scalar>
341 RCP<const ParameterList>
344 return lowsf_.getConstObj()->getValidParameters();
349 template <
class Scalar>
353 return lowsf_.getConstObj()->acceptsPreconditionerFactory();
356 template <
class Scalar>
359 const std::string &precFactoryName)
362 RCP<MVPF> mvpf = Teuchos::rcp_dynamic_cast<MVPF>(precFactory);
363 lowsf_.getNonconstObj()->setPreconditionerFactory(
364 mvpf->getNonconstPreconditionerFactory(), precFactoryName);
367 template <
class Scalar>
368 RCP<PreconditionerFactoryBase<Scalar> >
371 RCP<PreconditionerFactoryBase<Scalar> > prec_fac =
372 lowsf_.getConstObj()->getPreconditionerFactory();
373 if (prec_fac == Teuchos::null)
374 return Teuchos::null;
376 return nonconstMultiVectorPreconditionerFactory(prec_fac, multiVecRange_,
380 template <
class Scalar>
383 std::string *precFactoryName)
385 RCP<PreconditionerFactoryBase<Scalar> > inner_precFactory;
386 lowsf_.getNonconstObj()->unsetPreconditionerFactory(
387 precFactory ? &inner_precFactory : NULL, precFactoryName);
389 *precFactory = nonconstMultiVectorPreconditionerFactory(
390 inner_precFactory, multiVecRange_, multiVecDomain_);
393 template <
class Scalar>
398 RCP<const MVLO> mvlo =
399 Teuchos::rcp_dynamic_cast<
const MVLO>(fwdOpSrc.
getOp().assert_not_null());
400 RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc =
401 defaultLinearOpSource<Scalar>(mvlo->getLinearOp());
402 return lowsf_.getConstObj()->isCompatible(*inner_fwdOpSrc);
405 template <
class Scalar>
406 RCP<LinearOpWithSolveBase<Scalar> >
409 return nonconstMultiVectorLinearOpWithSolve<Scalar>(
410 lowsf_.getConstObj()->createOp(), multiVecRange_, multiVecDomain_);
413 template <
class Scalar>
420 using Teuchos::rcp_dynamic_cast;
427 lowsf_.getConstObj()->setOStream(this->getOStream());
428 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
432 const RCP<const MVLO> mvlo =
433 rcp_dynamic_cast<
const MVLO>(fwdOpSrc->getOp().assert_not_null());
434 MVLOWS &mvlows =
dyn_cast<MVLOWS>(*Op);
436 lowsf_.getConstObj()->initializeOp(
437 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
438 mvlows.getNonconstLinearOpWithSolve().get(), supportSolveUse);
441 template <
class Scalar>
447 using Teuchos::rcp_dynamic_cast;
454 lowsf_.getConstObj()->setOStream(this->getOStream());
455 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
459 const RCP<const MVLO> mvlo =
460 rcp_dynamic_cast<
const MVLO>(fwdOpSrc->getOp().assert_not_null());
461 MVLOWS &mvlows =
dyn_cast<MVLOWS>(*Op);
463 lowsf_.getConstObj()->initializeAndReuseOp(
464 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
465 mvlows.getNonconstLinearOpWithSolve().get());
468 template <
class Scalar>
482 MVLOWS &mvlowsOp =
dyn_cast<MVLOWS>(*Op);
483 RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
484 RCP<const PreconditionerBase<Scalar> > inner_prec;
485 RCP<const LinearOpSourceBase<Scalar> > inner_approxFwdOpSrc;
486 lowsf_.getConstObj()->uninitializeOp(
487 mvlowsOp.getNonconstLinearOpWithSolve().get(),
488 fwdOpSrc ? &inner_fwdOpSrc : NULL, prec ? &inner_prec : NULL,
489 approxFwdOpSrc ? &inner_approxFwdOpSrc : NULL, supportSolveUse);
491 *fwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
492 inner_fwdOpSrc->getOp(), multiVecRange_, multiVecDomain_));
495 multiVectorPreconditioner(inner_prec, multiVecRange_, multiVecDomain_);
497 *approxFwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
498 inner_approxFwdOpSrc->getOp(), multiVecRange_, multiVecDomain_));
501 template <
class Scalar>
509 template <
class Scalar>
517 using Teuchos::rcp_dynamic_cast;
524 lowsf_.getConstObj()->setOStream(this->getOStream());
525 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
530 const RCP<const MVLO> mvlo =
531 rcp_dynamic_cast<
const MVLO>(fwdOpSrc->getOp().assert_not_null());
532 const RCP<const MVP> mvp = rcp_dynamic_cast<
const MVP>(prec);
533 MVLOWS &mvlows =
dyn_cast<MVLOWS>(*Op);
535 lowsf_.getConstObj()->initializePreconditionedOp(
536 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
537 mvp->getPreconditioner(), mvlows.getNonconstLinearOpWithSolve().get(),
541 template <
class Scalar>
550 using Teuchos::rcp_dynamic_cast;
557 lowsf_.getConstObj()->setOStream(this->getOStream());
558 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
562 const RCP<const MVLO> mvlo =
563 rcp_dynamic_cast<
const MVLO>(fwdOpSrc->getOp().assert_not_null());
564 const RCP<const MVLO> amvlo =
565 rcp_dynamic_cast<
const MVLO>(approxFwdOpSrc->getOp().assert_not_null());
566 MVLOWS &mvlows =
dyn_cast<MVLOWS>(*Op);
568 lowsf_.getConstObj()->initializeApproxPreconditionedOp(
569 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
570 defaultLinearOpSource<Scalar>(amvlo->getLinearOp()),
571 mvlows.getNonconstLinearOpWithSolve().get(), supportSolveUse);
576 template <
class Scalar>
580 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
581 lowsf_.getConstObj()->setOStream(this->getOStream());
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 MultiVectorPreconditioner...
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
void setParameterList(RCP< ParameterList > const ¶mList)
bool is_null(const boost::shared_ptr< T > &p)
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
RCP< const ParameterList > getValidParameters() const
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) 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.
T_To & dyn_cast(T_From &from)
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
Create a LinearOpWithSolveFactory for a flattened-out multi-vector.
RCP< LinearOpWithSolveFactoryBase< Scalar > > getUnderlyingLOWSF()
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > nonconstMultiVectorLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor.
virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
MultiVectorLinearOpWithSolveFactory()
Construct to uninitialized.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > nonconstMultiVectorLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const int num_blocks)
Nonmember constructor.
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.
virtual std::string description() const
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
virtual bool acceptsPreconditionerFactory() const
returns false.
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 void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
RCP< ParameterList > getNonconstParameterList()
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
virtual bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
RCP< ParameterList > unsetParameterList()
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 void initializeApproxPreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
std::string description() const
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > multiVectorLinearOpWithSolveFactory(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const int num_blocks)
Nonmember constructor.
virtual Teuchos::RCP< const LinearOpBase< Scalar > > getOp() const =0
RCP< const ParameterList > getParameterList() const
Teuchos::ConstNonconstObjectContainer< LinearOpWithSolveFactoryBase< Scalar > > LOWSF_t
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.