9 #ifndef Thyra_ScaledIdentityLinearOpWithSolveFactory_hpp
10 #define Thyra_ScaledIdentityLinearOpWithSolveFactory_hpp
12 #include "Thyra_LinearOpWithSolveFactoryBase.hpp"
17 #include "Thyra_DefaultLinearOpSource.hpp"
23 template<
class Scalar>
25 :
virtual public LinearOpWithSolveFactoryBase<Scalar>
38 void initialize(
const RCP<
const VectorSpaceBase<Scalar> >& space,
66 const RCP<PreconditionerFactoryBase<Scalar> > &precFactory,
67 const std::string &precFactoryName
71 virtual RCP<PreconditionerFactoryBase<Scalar> >
76 RCP<PreconditionerFactoryBase<Scalar> > *precFactory,
77 std::string *precFactoryName
81 const LinearOpSourceBase<Scalar> &fwdOpSrc
88 virtual RCP<LinearOpWithSolveBase<Scalar> >
createOp()
const
89 {
return scaledIdentity(
space_,
s_); }
92 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
93 LinearOpWithSolveBase<Scalar> *Op,
94 const ESupportSolveUse supportSolveUse
98 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
99 LinearOpWithSolveBase<Scalar> *Op
106 LinearOpWithSolveBase<Scalar> *Op,
107 RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
108 RCP<
const PreconditionerBase<Scalar> > *prec,
109 RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
110 ESupportSolveUse *supportSolveUse
114 const EPreconditionerInputType precOpType
115 )
const {
return false; }
118 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
119 const RCP<
const PreconditionerBase<Scalar> > &prec,
120 LinearOpWithSolveBase<Scalar> *Op,
121 const ESupportSolveUse supportSolveUse
125 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
126 const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
127 LinearOpWithSolveBase<Scalar> *Op,
128 const ESupportSolveUse supportSolveUse
144 RCP<const VectorSpaceBase<Scalar> >
space_;
153 template<
class Scalar>
154 RCP<ScaledIdentityLinearOpWithSolveFactory<Scalar> >
156 const RCP<
const VectorSpaceBase<Scalar> >& space,
159 RCP<ScaledIdentityLinearOpWithSolveFactory<Scalar> > lowsf =
161 lowsf->initialize(space,s);
167 template<
class Scalar>
171 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
172 LinearOpWithSolveBase<Scalar> *Op,
173 const ESupportSolveUse supportSolveUse
176 using Teuchos::dyn_cast;
177 using Teuchos::rcp_dynamic_cast;
180 TEUCHOS_TEST_FOR_EXCEPT(0==Op);
183 const RCP<const LinearOpBase<Scalar> > tmpFwdOp = fwdOpSrc->getOp();
184 RCP<const LinearOpBase<Scalar> > fwdOp;
185 Scalar fwdOp_scalar = 0.0;
186 EOpTransp fwdOp_transp;
187 unwrap<Scalar>(tmpFwdOp, &fwdOp_scalar, &fwdOp_transp, &fwdOp);
189 const RCP<const ScaledIdentityLinearOpWithSolve<Scalar> > fwdSi =
193 fwdSi->space(), fwdSi->scale());
196 template<
class Scalar>
200 LinearOpWithSolveBase<Scalar> *Op,
201 RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
202 RCP<
const PreconditionerBase<Scalar> > *prec,
203 RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
204 ESupportSolveUse *supportSolveUse
207 using Teuchos::dyn_cast;
208 using Teuchos::is_null;
210 TEUCHOS_TEST_FOR_EXCEPT(0==Op);
211 #endif // TEUCHOS_DEBUG
212 if (fwdOpSrc) *fwdOpSrc = Teuchos::null;
213 if (prec) *prec = Teuchos::null;
214 if (approxFwdOpSrc) *approxFwdOpSrc = Teuchos::null;