10#ifndef Thyra_MultiVectorLinearOpWithSolveFactory_hpp 
   11#define Thyra_MultiVectorLinearOpWithSolveFactory_hpp 
   13#include "Thyra_LinearOpWithSolveFactoryBase.hpp" 
   17#include "Thyra_DefaultMultiVectorLinearOpWithSolve.hpp" 
   18#include "Thyra_DefaultMultiVectorProductVectorSpace.hpp" 
   19#include "Thyra_DefaultLinearOpSource.hpp" 
   25template <
class Scalar>
 
   49      const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
   51      const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
   67                  const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
   69                  const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  106      const std::string &precFactoryName);
 
  115      std::string *precFactoryName);
 
  117  virtual bool isCompatible(
const LinearOpSourceBase<Scalar> &fwdOpSrc) 
const;
 
  119  virtual RCP<LinearOpWithSolveBase<Scalar> > 
createOp() 
const;
 
  122      const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  124      const ESupportSolveUse supportSolveUse) 
const;
 
  127      const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  132      RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
 
  134      RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
 
  135      ESupportSolveUse *supportSolveUse) 
const;
 
  138      const EPreconditionerInputType precOpType) 
const;
 
  141      const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  144      const ESupportSolveUse supportSolveUse) 
const;
 
  147      const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  148      const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
 
  150      const ESupportSolveUse supportSolveUse) 
const;
 
  163  typedef Teuchos::ConstNonconstObjectContainer<
 
 
  176template <
class Scalar>
 
  177RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
 
  180    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  182    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  185  RCP<MultiVectorLinearOpWithSolveFactory<Scalar> > mvlowsf =
 
  187  mvlowsf->nonconstInitialize(lowsf, multiVecRange, multiVecDomain);
 
 
  195template <
class Scalar>
 
  196RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
 
  199    const int num_blocks)
 
  201  RCP<LinearOpWithSolveBase<Scalar> > op = lowsf->createOp();
 
  202  RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
 
  203      Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
 
  204  RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
 
  205      Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
 
  206  return nonconstMultiVectorLinearOpWithSolveFactory(lowsf, mv_range,
 
 
  214template <
class Scalar>
 
  215RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
 
  218    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  220    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  223  RCP<MultiVectorLinearOpWithSolveFactory<Scalar> > mvlowsf =
 
  225  mvlowsf->initialize(lowsf, multiVecRange, multiVecDomain);
 
 
  233template <
class Scalar>
 
  234RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
 
  237    const int num_blocks)
 
  239  RCP<LinearOpWithSolveBase<Scalar> > op = lowsf->createOp();
 
  240  RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
 
  241      Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
 
  242  RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
 
  243      Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
 
  244  return multiVectorLinearOpWithSolveFactory(lowsf, mv_range, mv_domain);
 
 
  249template <
class Scalar>
 
  252    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  254    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  258  TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf));
 
  260  lowsf_.initialize(lowsf);
 
  261  multiVecRange_  = multiVecRange;
 
  262  multiVecDomain_ = multiVecDomain;
 
 
  265template <
class Scalar>
 
  268    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  270    const RCP<
const DefaultMultiVectorProductVectorSpace<Scalar> >
 
  274  TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf));
 
  276  lowsf_.initialize(lowsf);
 
  277  multiVecRange_  = multiVecRange;
 
  278  multiVecDomain_ = multiVecDomain;
 
 
  281template <
class Scalar>
 
  282RCP<LinearOpWithSolveFactoryBase<Scalar> >
 
  285  return lowsf_.getNonconstObj();
 
 
  288template <
class Scalar>
 
  289RCP<const LinearOpWithSolveFactoryBase<Scalar> >
 
  292  return lowsf_.getConstObj();
 
 
  297template <
class Scalar>
 
  300  std::ostringstream oss;
 
  301  oss << this->Teuchos::Describable::description() << 
"{" 
  303  if (!is_null(lowsf_.getConstObj()))
 
  304    oss << lowsf_.getConstObj()->description();
 
 
  313template <
class Scalar>
 
  315    RCP<ParameterList> 
const ¶mList)
 
  317  lowsf_.getNonconstObj()->setParameterList(paramList);
 
 
  320template <
class Scalar>
 
  324  return lowsf_.getNonconstObj()->getNonconstParameterList();
 
 
  327template <
class Scalar>
 
  331  return lowsf_.getNonconstObj()->unsetParameterList();
 
 
  334template <
class Scalar>
 
  335RCP<const ParameterList>
 
  338  return lowsf_.getConstObj()->getParameterList();
 
 
  341template <
class Scalar>
 
  342RCP<const ParameterList>
 
  345  return lowsf_.getConstObj()->getValidParameters();
 
 
  350template <
class Scalar>
 
  354  return lowsf_.getConstObj()->acceptsPreconditionerFactory();
 
 
  357template <
class Scalar>
 
  360    const std::string &precFactoryName)
 
  363  RCP<MVPF> mvpf = Teuchos::rcp_dynamic_cast<MVPF>(precFactory);
 
  364  lowsf_.getNonconstObj()->setPreconditionerFactory(
 
  365      mvpf->getNonconstPreconditionerFactory(), precFactoryName);
 
 
  368template <
class Scalar>
 
  369RCP<PreconditionerFactoryBase<Scalar> >
 
  372  RCP<PreconditionerFactoryBase<Scalar> > prec_fac =
 
  373      lowsf_.getConstObj()->getPreconditionerFactory();
 
  374  if (prec_fac == Teuchos::null)
 
  375    return Teuchos::null;
 
  377    return nonconstMultiVectorPreconditionerFactory(prec_fac, multiVecRange_,
 
 
  381template <
class Scalar>
 
  384    std::string *precFactoryName)
 
  386  RCP<PreconditionerFactoryBase<Scalar> > inner_precFactory;
 
  387  lowsf_.getNonconstObj()->unsetPreconditionerFactory(
 
  388      precFactory ? &inner_precFactory : NULL, precFactoryName);
 
  390    *precFactory = nonconstMultiVectorPreconditionerFactory(
 
  391        inner_precFactory, multiVecRange_, multiVecDomain_);
 
 
  394template <
class Scalar>
 
  396    const LinearOpSourceBase<Scalar> &fwdOpSrc)
 const 
  399  RCP<const MVLO> mvlo =
 
  400      Teuchos::rcp_dynamic_cast<const MVLO>(fwdOpSrc.getOp().assert_not_null());
 
  401  RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc =
 
  402      defaultLinearOpSource<Scalar>(mvlo->getLinearOp());
 
  403  return lowsf_.getConstObj()->isCompatible(*inner_fwdOpSrc);
 
 
  406template <
class Scalar>
 
  407RCP<LinearOpWithSolveBase<Scalar> >
 
  410  return nonconstMultiVectorLinearOpWithSolve<Scalar>(
 
  411      lowsf_.getConstObj()->createOp(), multiVecRange_, multiVecDomain_);
 
 
  414template <
class Scalar>
 
  416    const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  418    const ESupportSolveUse supportSolveUse)
 const 
  420  using Teuchos::dyn_cast;
 
  421  using Teuchos::rcp_dynamic_cast;
 
  424  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
 
  428  lowsf_.getConstObj()->setOStream(this->getOStream());
 
  429  lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
 
  432  typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
 
  433  const RCP<const MVLO> mvlo =
 
  434      rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
 
  435  MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
 
  437  lowsf_.getConstObj()->initializeOp(
 
  438      defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
 
  439      mvlows.getNonconstLinearOpWithSolve().get(), supportSolveUse);
 
 
  442template <
class Scalar>
 
  444    const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  447  using Teuchos::dyn_cast;
 
  448  using Teuchos::rcp_dynamic_cast;
 
  451  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
 
  455  lowsf_.getConstObj()->setOStream(this->getOStream());
 
  456  lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
 
  459  typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
 
  460  const RCP<const MVLO> mvlo =
 
  461      rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
 
  462  MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
 
  464  lowsf_.getConstObj()->initializeAndReuseOp(
 
  465      defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
 
  466      mvlows.getNonconstLinearOpWithSolve().get());
 
 
  469template <
class Scalar>
 
  472    RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
 
  474    RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
 
  475    ESupportSolveUse *supportSolveUse)
 const 
  477  using Teuchos::dyn_cast;
 
  480  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
 
  482  typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
 
  483  MVLOWS &mvlowsOp = dyn_cast<MVLOWS>(*Op);
 
  484  RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
 
  485  RCP<const PreconditionerBase<Scalar> > inner_prec;
 
  486  RCP<const LinearOpSourceBase<Scalar> > inner_approxFwdOpSrc;
 
  487  lowsf_.getConstObj()->uninitializeOp(
 
  488      mvlowsOp.getNonconstLinearOpWithSolve().get(),
 
  489      fwdOpSrc ? &inner_fwdOpSrc : NULL, prec ? &inner_prec : NULL,
 
  490      approxFwdOpSrc ? &inner_approxFwdOpSrc : NULL, supportSolveUse);
 
  492    *fwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
 
  493        inner_fwdOpSrc->getOp(), multiVecRange_, multiVecDomain_));
 
  496        multiVectorPreconditioner(inner_prec, multiVecRange_, multiVecDomain_);
 
  498    *approxFwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
 
  499        inner_approxFwdOpSrc->getOp(), multiVecRange_, multiVecDomain_));
 
 
  502template <
class Scalar>
 
  504    Scalar>::supportsPreconditionerInputType(
const EPreconditionerInputType
 
 
  510template <
class Scalar>
 
  512    const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  515    const ESupportSolveUse supportSolveUse)
 const 
  517  using Teuchos::dyn_cast;
 
  518  using Teuchos::rcp_dynamic_cast;
 
  521  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
 
  525  lowsf_.getConstObj()->setOStream(this->getOStream());
 
  526  lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
 
  530  typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
 
  531  const RCP<const MVLO> mvlo =
 
  532      rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
 
  533  const RCP<const MVP> mvp = rcp_dynamic_cast<const MVP>(prec);
 
  534  MVLOWS &mvlows           = dyn_cast<MVLOWS>(*Op);
 
  536  lowsf_.getConstObj()->initializePreconditionedOp(
 
  537      defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
 
  538      mvp->getPreconditioner(), mvlows.getNonconstLinearOpWithSolve().get(),
 
 
  542template <
class Scalar>
 
  545        const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  546        const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
 
  548        const ESupportSolveUse supportSolveUse)
 const 
  550  using Teuchos::dyn_cast;
 
  551  using Teuchos::rcp_dynamic_cast;
 
  554  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
 
  558  lowsf_.getConstObj()->setOStream(this->getOStream());
 
  559  lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
 
  562  typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
 
  563  const RCP<const MVLO> mvlo =
 
  564      rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
 
  565  const RCP<const MVLO> amvlo =
 
  566      rcp_dynamic_cast<const MVLO>(approxFwdOpSrc->getOp().assert_not_null());
 
  567  MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
 
  569  lowsf_.getConstObj()->initializeApproxPreconditionedOp(
 
  570      defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
 
  571      defaultLinearOpSource<Scalar>(amvlo->getLinearOp()),
 
  572      mvlows.getNonconstLinearOpWithSolve().get(), supportSolveUse);
 
 
  577template <
class Scalar>
 
  581  lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
 
  582  lowsf_.getConstObj()->setOStream(this->getOStream());
 
 
Create a LinearOpWithSolveFactory for a flattened-out multi-vector.
 
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.
 
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > nonconstMultiVectorLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const int num_blocks)
Nonmember constructor.
 
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > multiVectorLinearOpWithSolveFactory(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const int num_blocks)
Nonmember constructor.
 
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
 
void setParameterList(RCP< ParameterList > const ¶mList)
 
Teuchos::ConstNonconstObjectContainer< LinearOpWithSolveFactoryBase< Scalar > > LOWSF_t
 
RCP< const ParameterList > getValidParameters() const
 
virtual void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
 
RCP< const ParameterList > getParameterList() const
 
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 bool acceptsPreconditionerFactory() const
returns false.
 
RCP< LinearOpWithSolveFactoryBase< Scalar > > getUnderlyingLOWSF()
 
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
 
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
 
RCP< ParameterList > unsetParameterList()
 
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
 
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > nonconstMultiVectorLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor.
 
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
 
RCP< ParameterList > getNonconstParameterList()
 
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
 
std::string description() const
 
virtual void initializeApproxPreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
 
virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
 
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 bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) 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.
 
virtual void initializePreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
 
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.
 
MultiVectorLinearOpWithSolveFactory()
Construct to uninitialized.
 
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.
 
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
 
Concrete PreconditionerFactoryBase subclass that wraps a preconditioner in MultiVectorPreconditioner.
 
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.