9 #ifndef Thyra_MultiVectorPreconditioner_hpp
10 #define Thyra_MultiVectorPreconditioner_hpp
12 #include "Thyra_PreconditionerBase.hpp"
13 #include "Teuchos_ConstNonconstObjectContainer.hpp"
15 #include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
22 template<
class Scalar>
34 const RCP<PreconditionerBase<Scalar> > &prec,
35 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
36 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
45 const RCP<
const PreconditionerBase<Scalar> > &prec,
46 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
47 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain) {
54 RCP<PreconditionerBase<Scalar> >
57 RCP<const PreconditionerBase<Scalar> >
72 {
return prec_.getConstObj()->isLeftPrecOpConst(); }
75 {
return nonconstMultiVectorLinearOp(
76 prec_.getNonconstObj()->getNonconstLeftPrecOp(),
81 {
return multiVectorLinearOp(
82 prec_.getConstObj()->getLeftPrecOp(),
87 {
return prec_.getConstObj()->isRightPrecOpConst(); }
90 {
return nonconstMultiVectorLinearOp(
91 prec_.getNonconstObj()->getNonconstRightPrecOp(),
96 {
return multiVectorLinearOp(
97 prec_.getConstObj()->getRightPrecOp(),
102 {
return prec_.getConstObj()->isUnspecifiedPrecOpConst(); }
105 {
return nonconstMultiVectorLinearOp(
106 prec_.getNonconstObj()->getNonconstUnspecifiedPrecOp(),
111 {
return multiVectorLinearOp(
112 prec_.getNonconstObj()->getUnspecifiedPrecOp(),
123 typedef Teuchos::ConstNonconstObjectContainer<PreconditionerBase<Scalar> >
CNPB;
136 const RCP<
const PreconditionerBase<Scalar> > &prec,
137 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
138 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
141 TEUCHOS_TEST_FOR_EXCEPT(is_null(prec));
142 TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecRange));
143 TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecDomain));
144 TEUCHOS_TEST_FOR_EXCEPT( multiVecRange->numBlocks() != multiVecDomain->numBlocks() );
154 template<
class Scalar>
155 RCP<MultiVectorPreconditioner<Scalar> >
165 template<
class Scalar>
166 RCP<MultiVectorPreconditioner<Scalar> >
168 const RCP<PreconditionerBase<Scalar> > &prec,
169 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
170 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
173 RCP<MultiVectorPreconditioner<Scalar> >
175 mvprec->nonconstInitialize(prec,multiVecRange,multiVecDomain);
183 template<
class Scalar>
184 RCP<MultiVectorPreconditioner<Scalar> >
186 const RCP<
const PreconditionerBase<Scalar> > &prec,
187 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecRange,
188 const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> > &multiVecDomain
191 RCP<MultiVectorPreconditioner<Scalar> >
193 mvprec->initialize(prec,multiVecRange,multiVecDomain);