10#ifndef Thyra_BlockedTriangularLinearOpWithSolveFactory_hpp 
   11#define Thyra_BlockedTriangularLinearOpWithSolveFactory_hpp 
   13#include "Thyra_LinearOpWithSolveBase.hpp" 
   14#include "Thyra_DefaultBlockedLinearOp.hpp" 
   15#include "Thyra_DefaultBlockedTriangularLinearOpWithSolve.hpp" 
   16#include "Thyra_LinearOpSourceBase.hpp" 
   17#include "Teuchos_Array.hpp" 
   61template <
class Scalar>
 
  129      const std::string &precFactoryName);
 
  138      std::string *precFactoryName);
 
  140  virtual bool isCompatible(
const LinearOpSourceBase<Scalar> &fwdOpSrc) 
const;
 
  142  virtual RCP<LinearOpWithSolveBase<Scalar> > 
createOp() 
const;
 
  145      const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  147      const ESupportSolveUse supportSolveUse) 
const;
 
  150      const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  155      RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
 
  157      RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
 
  158      ESupportSolveUse *supportSolveUse) 
const;
 
  161      const EPreconditionerInputType precOpType) 
const;
 
  164      const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  167      const ESupportSolveUse supportSolveUse) 
const;
 
  170      const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  171      const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
 
  173      const ESupportSolveUse supportSolveUse) 
const;
 
  186  typedef Teuchos::ConstNonconstObjectContainer<
 
 
  200template <
class Scalar>
 
  201RCP<BlockedTriangularLinearOpWithSolveFactory<Scalar> >
 
  213template <
class Scalar>
 
  214RCP<BlockedTriangularLinearOpWithSolveFactory<Scalar> >
 
  224template <
class Scalar>
 
  228  : lowsf_(lowsf.size())
 
  230  for (Ordinal i = 0; i < lowsf.size(); ++i) {
 
  232    TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf[i]));
 
  234    lowsf_[i].initialize(lowsf[i]);
 
 
  238template <
class Scalar>
 
  242  : lowsf_(lowsf.size())
 
  244  for (Ordinal i = 0; i < lowsf.size(); ++i) {
 
  246    TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf[i]));
 
  248    lowsf_[i].initialize(lowsf[i]);
 
 
  252template <
class Scalar>
 
  253Array<RCP<LinearOpWithSolveFactoryBase<Scalar> > >
 
  256  Array<RCP<LinearOpWithSolveFactoryBase<Scalar> > > lowsf(lowsf_.size());
 
  257  for (Ordinal i = 0; i < lowsf_.size(); ++i) {
 
  258    lowsf[i] = lowsf_[i].getNonconstObj();
 
 
  263template <
class Scalar>
 
  264Array<RCP<const LinearOpWithSolveFactoryBase<Scalar> > >
 
  267  Array<RCP<const LinearOpWithSolveFactoryBase<Scalar> > > lowsf(lowsf_.size());
 
  268  for (Ordinal i = 0; i < lowsf_.size(); ++i) {
 
  269    lowsf[i] = lowsf_[i].getConstObj();
 
 
  276template <
class Scalar>
 
  280  std::ostringstream oss;
 
  281  oss << this->Teuchos::Describable::description() << 
"{";
 
  282  for (Ordinal i = 0; i < lowsf_.size(); ++i) {
 
  284    if (!is_null(lowsf_[i].getConstObj()))
 
  285      oss << lowsf_[i].getConstObj()->description();
 
 
  297template <
class Scalar>
 
  299    RCP<ParameterList> 
const ¶mList)
 
  301  for (Ordinal i = 0; i < lowsf_.size(); ++i) {
 
  302    lowsf_[i].getNonconstObj()->setParameterList(paramList);
 
 
  306template <
class Scalar>
 
  310  return lowsf_[0].getNonconstObj()->getNonconstParameterList();
 
 
  313template <
class Scalar>
 
  317  RCP<ParameterList> pl;
 
  318  for (Ordinal i = 0; i < lowsf_.size(); ++i) {
 
  319    pl = lowsf_[i].getNonconstObj()->unsetParameterList();
 
 
  324template <
class Scalar>
 
  325RCP<const ParameterList>
 
  328  return lowsf_[0].getConstObj()->getParameterList();
 
 
  331template <
class Scalar>
 
  332RCP<const ParameterList>
 
  335  return lowsf_[0].getConstObj()->getValidParameters();
 
 
  340template <
class Scalar>
 
  342    Scalar>::acceptsPreconditionerFactory()
 const 
 
  347template <
class Scalar>
 
  354  TEUCHOS_TEST_FOR_EXCEPTION(
 
  355      true, std::logic_error,
 
  356      "Error, we don't support a preconditioner factory!");
 
 
  359template <
class Scalar>
 
  360RCP<PreconditionerFactoryBase<Scalar> >
 
  364  return Teuchos::null;
 
 
  367template <
class Scalar>
 
  374  TEUCHOS_TEST_FOR_EXCEPTION(
 
  375      true, std::logic_error,
 
  376      "Error, we don't support a preconditioner factory!");
 
 
  379template <
class Scalar>
 
  381    const LinearOpSourceBase<Scalar> & 
 
  384  TEUCHOS_TEST_FOR_EXCEPT(
true);
 
  385  TEUCHOS_UNREACHABLE_RETURN(
false);
 
 
  388template <
class Scalar>
 
  389RCP<LinearOpWithSolveBase<Scalar> >
 
  392  return defaultBlockedTriangularLinearOpWithSolve<Scalar>();
 
 
  395template <
class Scalar>
 
  397    const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
 
  399    const ESupportSolveUse 
 
  402  using Teuchos::dyn_cast;
 
  403  using Teuchos::rcp_dynamic_cast;
 
  406  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
 
  410  for (Ordinal i = 0; i < lowsf_.size(); ++i) {
 
  411    lowsf_[i].getConstObj()->setOStream(this->getOStream());
 
  412    lowsf_[i].getConstObj()->setVerbLevel(this->getVerbLevel());
 
  416  typedef PhysicallyBlockedLinearOpBase<Scalar> PBLOB;
 
  417  const RCP<const PBLOB> blo =
 
  418      rcp_dynamic_cast<const PBLOB>(fwdOpSrc->getOp().assert_not_null());
 
  423  typedef DefaultBlockedTriangularLinearOpWithSolve<Scalar> DBTLOWS;
 
  424  DBTLOWS &btlows = dyn_cast<DBTLOWS>(*Op);
 
  429  const bool firstTime = is_null(btlows.range());
 
  434    btlows.beginBlockFill(blo->productRange(), blo->productDomain());
 
  436  const int N = blo->productRange()->numBlocks();
 
  437  for (
int k = 0; k < N; ++k) {
 
  438    const RCP<const LinearOpBase<Scalar> > fwdOp_k =
 
  439        blo->getBlock(k, k).assert_not_null();
 
  443      btlows.setNonconstLOWSBlock(
 
  444          k, k, linearOpWithSolve<Scalar>(*lowsf_[k].getConstObj(), fwdOp_k));
 
  450      RCP<LinearOpWithSolveBase<Scalar> > invOp_k =
 
  451          btlows.getNonconstLOWSBlock(k, k).assert_not_null();
 
  452      Thyra::initializeOp<Scalar>(*lowsf_[k].getConstObj(), fwdOp_k,
 
  459  if (firstTime) btlows.endBlockFill();
 
  464  btlows.setBlocks(blo);
 
  467  btlows.setOStream(this->getOStream());
 
  468  btlows.setVerbLevel(this->getVerbLevel());
 
 
  471template <
class Scalar>
 
  473    const RCP<
const LinearOpSourceBase<Scalar> > & ,
 
  477  TEUCHOS_TEST_FOR_EXCEPT(
true);
 
 
  480template <
class Scalar>
 
  483    RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
 
  485    RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
 
  489  using Teuchos::dyn_cast;
 
  490  using Teuchos::rcp_dynamic_cast;
 
  491  using Teuchos::rcp_implicit_cast;
 
  492  typedef DefaultBlockedTriangularLinearOpWithSolve<Scalar> DBTLOWS;
 
  493  TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
 
  494  DBTLOWS &btlowsOp = dyn_cast<DBTLOWS>(*Op);
 
  496    const RCP<const LinearOpBase<Scalar> > fwdOp = btlowsOp.getBlocks();
 
  498      *fwdOpSrc = defaultLinearOpSource<Scalar>(fwdOp);
 
  500      *fwdOpSrc = Teuchos::null;
 
  502  if (prec) *prec = Teuchos::null;
 
  503  if (approxFwdOpSrc) *approxFwdOpSrc = Teuchos::null;
 
 
  506template <
class Scalar>
 
  509        const EPreconditionerInputType 
 
 
  520template <
class Scalar>
 
  523        const RCP<
const LinearOpSourceBase<Scalar> > & ,
 
  526        const ESupportSolveUse 
 
  529  TEUCHOS_TEST_FOR_EXCEPTION(
 
  530      true, std::logic_error,
 
  531      "Error, we don't support an external preconditioner!");
 
 
  534template <
class Scalar>
 
  537        const RCP<
const LinearOpSourceBase<Scalar> > & ,
 
  538        const RCP<
const LinearOpSourceBase<Scalar> > & ,
 
  540        const ESupportSolveUse 
 
  543  TEUCHOS_TEST_FOR_EXCEPTION(
 
  544      true, std::logic_error,
 
  545      "Error, we don't support an external preconditioner!");
 
 
  550template <
class Scalar>
 
  552    Scalar>::informUpdatedVerbosityState()
 const 
  554  for (Ordinal i = 0; i < lowsf_.size(); ++i) {
 
  555    lowsf_[i].getConstObj()->setVerbLevel(this->getVerbLevel());
 
  556    lowsf_[i].getConstObj()->setOStream(this->getOStream());
 
 
Implicit subclass that takes a blocked triangular LOWB object and turns it into a LOWSB object.
 
BlockedTriangularLinearOpWithSolveFactory()
 
RCP< BlockedTriangularLinearOpWithSolveFactory< Scalar > > blockedTriangularLinearOpWithSolveFactory(const Array< RCP< const LinearOpWithSolveFactoryBase< Scalar > > > &lowsf)
Nonmember constructor.
 
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
 
RCP< const ParameterList > getParameterList() const
 
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
 
virtual void initializePreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
 
RCP< BlockedTriangularLinearOpWithSolveFactory< Scalar > > blockedTriangularLinearOpWithSolveFactory(const Array< RCP< LinearOpWithSolveFactoryBase< Scalar > > > &lowsf)
Nonmember constructor.
 
void setParameterList(RCP< ParameterList > const ¶mList)
 
virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
 
Teuchos::ConstNonconstObjectContainer< LinearOpWithSolveFactoryBase< Scalar > > LOWSF_t
 
virtual void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
 
virtual bool acceptsPreconditionerFactory() const
returns false.
 
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
 
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
 
virtual bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
 
Array< RCP< LinearOpWithSolveFactoryBase< Scalar > > > getUnderlyingLOWSF()
 
RCP< ParameterList > getNonconstParameterList()
 
std::string description() const
 
RCP< const ParameterList > getValidParameters() const
 
virtual void uninitializeOp(LinearOpWithSolveBase< Scalar > *Op, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc, RCP< const PreconditionerBase< Scalar > > *prec, RCP< const LinearOpSourceBase< Scalar > > *approxFwdOpSrc, ESupportSolveUse *supportSolveUse) const
 
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.
 
RCP< ParameterList > unsetParameterList()
 
virtual void initializeApproxPreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
 
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.