10#ifndef Thyra_MultiVectorPreconditionerFactory_hpp
11#define Thyra_MultiVectorPreconditionerFactory_hpp
13#include "Thyra_PreconditionerFactoryBase.hpp"
14#include "Teuchos_ConstNonconstObjectContainer.hpp"
17#include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
24template <
class Scalar>
36 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
38 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
48 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
50 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
81 std::ostringstream oss;
82 oss << this->Teuchos::Describable::description() <<
"{"
85 oss <<
prec_fac_.getConstObj()->description();
100 prec_fac_.getNonconstObj()->setParameterList(paramList);
105 return prec_fac_.getNonconstObj()->getNonconstParameterList();
110 return prec_fac_.getNonconstObj()->unsetParameterList();
115 return prec_fac_.getConstObj()->getParameterList();
120 return prec_fac_.getConstObj()->getValidParameters();
132 return prec_fac_.getConstObj()->isCompatible(fwdOpSrc);
137 return nonconstMultiVectorPreconditioner(
142 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
144 const ESupportSolveUse supportSolveUse = SUPPORT_SOLVE_UNSPECIFIED)
const
146 using Teuchos::dyn_cast;
147 using Teuchos::rcp_dynamic_cast;
151 const RCP<const MVLO> mvlo =
152 rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
153 MVP &mvp = dyn_cast<MVP>(*precOp);
155 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
156 mvp.getNonconstPreconditioner().get(), supportSolveUse);
160 RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc = NULL,
161 ESupportSolveUse *supportSolveUse = NULL)
const
163 using Teuchos::dyn_cast;
166 TEUCHOS_TEST_FOR_EXCEPT(0 == precOp);
169 MVP &mvp = dyn_cast<MVP>(*precOp);
170 RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
171 prec_fac_.getConstObj()->uninitializePrec(
172 mvp.getNonconstPreconditioner().get(),
173 fwdOpSrc ? &inner_fwdOpSrc : NULL, supportSolveUse);
175 *fwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
185 typedef Teuchos::ConstNonconstObjectContainer<
201 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
203 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
207 TEUCHOS_TEST_FOR_EXCEPT(is_null(prec_fac));
208 TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecRange));
209 TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecDomain));
210 TEUCHOS_TEST_FOR_EXCEPT(multiVecRange->numBlocks() !=
211 multiVecDomain->numBlocks());
215 (void)multiVecDomain;
224template <
class Scalar>
225RCP<MultiVectorPreconditionerFactory<Scalar> >
235template <
class Scalar>
236RCP<MultiVectorPreconditionerFactory<Scalar> >
239 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
241 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
244 RCP<MultiVectorPreconditionerFactory<Scalar> > mvfac =
246 mvfac->nonconstInitialize(prec_fac, multiVecRange, multiVecDomain);
254template <
class Scalar>
257 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
259 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
262 RCP<MultiVectorPreconditionerFactory<Scalar> > mvfac =
264 mvfac->initialize(prec_fac, multiVecRange, multiVecDomain);
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
Concrete PreconditionerFactoryBase subclass that wraps a preconditioner in MultiVectorPreconditioner.
MultiVectorPreconditionerFactory()
Construct to uninitialized.
RCP< ParameterList > getNonconstParameterList()
RCP< const ParameterList > getParameterList() const
RCP< ParameterList > unsetParameterList()
RCP< MultiVectorPreconditionerFactory< Scalar > > multiVectorPreconditionerFactory()
Nonmember constructor function.
RCP< const PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
static void validateInitialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
RCP< PreconditionerBase< Scalar > > createPrec() const
RCP< MultiVectorPreconditionerFactory< Scalar > > nonconstMultiVectorPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
RCP< const ParameterList > getValidParameters() const
void initialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
void nonconstInitialize(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
void setParameterList(RCP< ParameterList > const ¶mList)
std::string description() const
Teuchos::ConstNonconstObjectContainer< PreconditionerFactoryBase< Scalar > > CNPFB
RCP< MultiVectorPreconditionerFactory< Scalar > > multiVectorPreconditionerFactory(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
RCP< PreconditionerFactoryBase< Scalar > > getNonconstPreconditionerFactory()
void uninitializePrec(PreconditionerBase< Scalar > *precOp, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc=NULL, ESupportSolveUse *supportSolveUse=NULL) const
void initializePrec(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, PreconditionerBase< Scalar > *precOp, const ESupportSolveUse supportSolveUse=SUPPORT_SOLVE_UNSPECIFIED) const
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.