9 #ifndef Thyra_AdjointLinearOpWithSolveFactory_hpp
10 #define Thyra_AdjointLinearOpWithSolveFactory_hpp
12 #include "Thyra_LinearOpWithSolveFactoryBase.hpp"
13 #include "Thyra_DefaultScaledAdjointLinearOp.hpp"
14 #include "Thyra_DefaultAdjointLinearOpWithSolve.hpp"
15 #include "Thyra_DefaultLinearOpSource.hpp"
23 template <
class Scalar>
93 const std::string &precFactoryName);
102 std::string *precFactoryName);
106 virtual RCP<LinearOpWithSolveBase<Scalar> >
createOp()
const;
161 template <
class Scalar>
162 RCP<const AdjointLinearOpWithSolveFactory<Scalar> >
166 RCP<AdjointLinearOpWithSolveFactory<Scalar> > alowsf =
168 alowsf->initialize(lowsf);
176 template <
class Scalar>
177 RCP<AdjointLinearOpWithSolveFactory<Scalar> >
181 RCP<AdjointLinearOpWithSolveFactory<Scalar> > alowsf =
183 alowsf->nonconstInitialize(lowsf);
189 template <
class Scalar>
196 lowsf_.initialize(lowsf);
199 template <
class Scalar>
206 lowsf_.initialize(lowsf);
209 template <
class Scalar>
210 RCP<LinearOpWithSolveFactoryBase<Scalar> >
213 return lowsf_.getNonconstObj();
216 template <
class Scalar>
217 RCP<const LinearOpWithSolveFactoryBase<Scalar> >
220 return lowsf_.getConstObj();
225 template <
class Scalar>
228 std::ostringstream oss;
231 if (!
is_null(lowsf_.getConstObj()))
232 oss << lowsf_.getConstObj()->description();
241 template <
class Scalar>
243 RCP<ParameterList>
const ¶mList)
245 lowsf_.getNonconstObj()->setParameterList(paramList);
248 template <
class Scalar>
252 return lowsf_.getNonconstObj()->getNonconstParameterList();
255 template <
class Scalar>
258 return lowsf_.getNonconstObj()->unsetParameterList();
261 template <
class Scalar>
262 RCP<const ParameterList>
265 return lowsf_.getConstObj()->getParameterList();
268 template <
class Scalar>
269 RCP<const ParameterList>
272 return lowsf_.getConstObj()->getValidParameters();
277 template <
class Scalar>
281 return lowsf_.getConstObj()->acceptsPreconditionerFactory();
284 template <
class Scalar>
287 const std::string &precFactoryName)
290 RCP<APF> apf = Teuchos::rcp_dynamic_cast<APF>(precFactory);
291 lowsf_.getNonconstObj()->setPreconditionerFactory(
292 apf->getNonconstPreconditionerFactory(), precFactoryName);
295 template <
class Scalar>
296 RCP<PreconditionerFactoryBase<Scalar> >
299 RCP<PreconditionerFactoryBase<Scalar> > prec_fac =
300 lowsf_.getConstObj()->getPreconditionerFactory();
301 if (prec_fac == Teuchos::null)
302 return Teuchos::null;
304 return nonconstAdjointPreconditionerFactory(prec_fac);
307 template <
class Scalar>
310 std::string *precFactoryName)
312 RCP<PreconditionerFactoryBase<Scalar> > inner_precFactory;
313 lowsf_.getNonconstObj()->unsetPreconditionerFactory(
314 precFactory ? &inner_precFactory : NULL, precFactoryName);
316 *precFactory = nonconstAdjointPreconditionerFactory(inner_precFactory);
319 template <
class Scalar>
325 Teuchos::rcp_dynamic_cast<
const ALO>(fwdOpSrc.
getOp().assert_not_null());
326 RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc =
327 defaultLinearOpSource<Scalar>(alo->getOp());
328 return lowsf_.getConstObj()->isCompatible(*inner_fwdOpSrc);
331 template <
class Scalar>
332 RCP<LinearOpWithSolveBase<Scalar> >
335 return nonconstAdjointLows<Scalar>(lowsf_.getConstObj()->createOp());
338 template <
class Scalar>
345 using Teuchos::rcp_dynamic_cast;
352 lowsf_.getConstObj()->setOStream(this->getOStream());
353 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
357 const RCP<const ALO> alo =
358 rcp_dynamic_cast<
const ALO>(fwdOpSrc->getOp().assert_not_null());
359 ALOWS &alows =
dyn_cast<ALOWS>(*Op);
361 lowsf_.getConstObj()->initializeOp(
362 defaultLinearOpSource<Scalar>(alo->getOrigOp()),
363 alows.getNonconstOp().get(), supportSolveUse);
366 template <
class Scalar>
372 using Teuchos::rcp_dynamic_cast;
379 lowsf_.getConstObj()->setOStream(this->getOStream());
380 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
384 const RCP<const ALO> alo =
385 rcp_dynamic_cast<
const ALO>(fwdOpSrc->getOp().assert_not_null());
386 ALOWS &alows =
dyn_cast<ALOWS>(*Op);
388 lowsf_.getConstObj()->initializeAndReuseOp(
389 defaultLinearOpSource<Scalar>(alo->getOrigOp()),
390 alows.getNonconstOp().get());
393 template <
class Scalar>
407 ALOWS &alowsOp =
dyn_cast<ALOWS>(*Op);
408 RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
409 RCP<const PreconditionerBase<Scalar> > inner_prec;
410 RCP<const LinearOpSourceBase<Scalar> > inner_approxFwdOpSrc;
411 lowsf_.getConstObj()->uninitializeOp(
412 alowsOp.getNonconstOp().get(), fwdOpSrc ? &inner_fwdOpSrc : NULL,
413 prec ? &inner_prec : NULL, approxFwdOpSrc ? &inner_approxFwdOpSrc : NULL,
416 *fwdOpSrc = defaultLinearOpSource<Scalar>(adjoint(inner_fwdOpSrc->getOp()));
417 if (prec) *prec = adjointPreconditioner(inner_prec);
420 defaultLinearOpSource<Scalar>(adjoint(inner_approxFwdOpSrc->getOp()));
423 template <
class Scalar>
427 return lowsf_.getConstObj()->supportsPreconditionerInputType(precOpType);
430 template <
class Scalar>
438 using Teuchos::rcp_dynamic_cast;
445 lowsf_.getConstObj()->setOStream(this->getOStream());
446 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
451 const RCP<const ALO> alo =
452 rcp_dynamic_cast<
const ALO>(fwdOpSrc->getOp().assert_not_null());
453 const RCP<const AP> ap = rcp_dynamic_cast<
const AP>(prec);
454 ALOWS &alows =
dyn_cast<ALOWS>(*Op);
456 lowsf_.getConstObj()->initializePreconditionedOp(
457 defaultLinearOpSource<Scalar>(alo->getOp()), ap->getPreconditioner(),
458 alows.getNonconstOp().get(), supportSolveUse);
461 template <
class Scalar>
469 using Teuchos::rcp_dynamic_cast;
476 lowsf_.getConstObj()->setOStream(this->getOStream());
477 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
481 const RCP<const ALO> alo =
482 rcp_dynamic_cast<
const ALO>(fwdOpSrc->getOp().assert_not_null());
483 const RCP<const ALO> aalo =
484 rcp_dynamic_cast<
const ALO>(approxFwdOpSrc->getOp().assert_not_null());
485 ALOWS &alows =
dyn_cast<ALOWS>(*Op);
487 lowsf_.getConstObj()->initializeApproxPreconditionedOp(
488 defaultLinearOpSource<Scalar>(alo->getOp()),
489 defaultLinearOpSource<Scalar>(aalo->getOp()), alows.getNonconstOp().get(),
495 template <
class Scalar>
499 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
500 lowsf_.getConstObj()->setOStream(this->getOStream());
bool is_null(const boost::shared_ptr< T > &p)
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.
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
RCP< LinearOpWithSolveFactoryBase< Scalar > > getUnderlyingLOWSF()
T_To & dyn_cast(T_From &from)
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
Create a LinearOpWithSolveFactory for an adjoint linear op.
RCP< AdjointLinearOpWithSolveFactory< Scalar > > nonconstAdjointLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf)
Nonmember constructor.
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
virtual bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
Teuchos::ConstNonconstObjectContainer< LinearOpWithSolveFactoryBase< Scalar > > LOWSF_t
virtual void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
RCP< const ParameterList > getParameterList() const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
RCP< ParameterList > getNonconstParameterList()
RCP< const AdjointLinearOpWithSolveFactory< Scalar > > adjointLinearOpWithSolveFactory(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf)
Nonmember constructor.
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.
void setParameterList(RCP< ParameterList > const ¶mList)
virtual std::string description() const
AdjointLinearOpWithSolveFactory()
Construct to uninitialized.
void initialize(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf)
Initialize given a single const LOWSFB object.
virtual bool acceptsPreconditionerFactory() const
returns false.
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.
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 AdjointPreconditioner.
virtual Teuchos::RCP< const LinearOpBase< Scalar > > getOp() const =0
virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
void nonconstInitialize(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf)
Initialize given a single non-const LOWSFB object.
RCP< const ParameterList > getValidParameters() const