10#ifndef THYRA_DEFAULT_INVERSE_LINEAR_OP_DEF_HPP 
   11#define THYRA_DEFAULT_INVERSE_LINEAR_OP_DEF_HPP 
   13#include "Thyra_DefaultInverseLinearOp_decl.hpp" 
   14#include "Thyra_MultiVectorStdOps.hpp" 
   15#include "Thyra_AssertOp.hpp" 
   16#include "Teuchos_Utils.hpp" 
   17#include "Teuchos_TypeNameTraits.hpp" 
   41    lows,fwdSolveCriteria,throwOnFwdSolveFailure
 
   42    ,adjSolveCriteria,throwOnAdjSolveFailure
 
 
   57    lows,fwdSolveCriteria,throwOnFwdSolveFailure
 
   58    ,adjSolveCriteria,throwOnAdjSolveFailure
 
 
   73    lows,fwdSolveCriteria,throwOnFwdSolveFailure
 
   74    ,adjSolveCriteria,throwOnAdjSolveFailure
 
 
   89    lows,fwdSolveCriteria,throwOnFwdSolveFailure
 
   90    ,adjSolveCriteria,throwOnAdjSolveFailure
 
 
  107template<
class Scalar>
 
  110  return lows_.isConst();
 
 
  114template<
class Scalar>
 
  118  return lows_.getNonconstObj();
 
 
  122template<
class Scalar>
 
  126  return lows_.getConstObj();
 
 
  133template<
class Scalar>
 
  138  return lows_.getConstObj()->domain();
 
 
  142template<
class Scalar>
 
  147  return lows_.getConstObj()->range();
 
 
  151template<
class Scalar>
 
  162template<
class Scalar>
 
  166  std::ostringstream oss;
 
  169    << 
"lows="<<lows_.getConstObj()->description()
 
  170    << 
",fwdSolveCriteria="<<(fwdSolveCriteria_.get()?
"...":
"DEFAULT")
 
  171    << 
",adjSolveCriteria="<<(adjSolveCriteria_.get()?
"...":
"DEFAULT")
 
 
  177template<
class Scalar>
 
  190      out << this->description() << std::endl;
 
  198        << 
"rangeDim=" << this->range()->dim()
 
  199        << 
",domainDim=" << this->domain()->dim() << 
"}:\n";
 
  202      if(!lows_.getConstObj().get()) {
 
  206        out << Teuchos::describe(*lows_.getConstObj(),verbLevel);
 
 
  222template<
class Scalar>
 
  225  if (nonnull(lows_)) {
 
  226    return solveSupports(*lows_.getConstObj(),M_trans);
 
 
  232template<
class Scalar>
 
  253  if(beta==ST::zero()) {
 
  254    T = Teuchos::rcpFromPtr(Y);
 
  257    T = createMembers(Y->range(),Y->domain()->dim());
 
  264      ? fwdSolveCriteria_.ptr()
 
  265      : adjSolveCriteria_.ptr()
 
  267  assign(T.
ptr(), ST::zero()); 
 
  269    Thyra::solve<Scalar>(*lows_.getConstObj(), M_trans, X, T.
ptr(), solveCriteria);
 
  277    ,
"Error, the LOWS object " << lows_.getConstObj()->description() << 
" returned an unconverged" 
  282  if(beta==ST::zero()) {
 
  286    update( alpha, *T, Y );
 
 
  294template<
class Scalar>
 
  313  throwOnFwdSolveFailure_ = throwOnFwdSolveFailure;
 
  314  throwOnAdjSolveFailure_ = throwOnAdjSolveFailure;
 
  315  const std::string lowsLabel = lows_.getConstObj()->getObjectLabel();
 
  316  if(lowsLabel.length())
 
  317    this->setObjectLabel( 
"inv("+lowsLabel+
")" );
 
  327template<
class Scalar>
 
  329Thyra::nonconstInverse(
 
  330  const RCP<LinearOpWithSolveBase<Scalar> > &A,
 
  331  const Ptr<
const SolveCriteria<Scalar> > &fwdSolveCriteria,
 
  332  const EThrowOnSolveFailure throwOnFwdSolveFailure,
 
  333  const Ptr<
const SolveCriteria<Scalar> > &adjSolveCriteria,
 
  334  const EThrowOnSolveFailure throwOnAdjSolveFailure
 
  338    new DefaultInverseLinearOp<Scalar>(
 
  339      A, fwdSolveCriteria.get(), throwOnFwdSolveFailure,
 
  340      adjSolveCriteria.get(), throwOnAdjSolveFailure
 
  345template<
class Scalar>
 
  348  const RCP<
const LinearOpWithSolveBase<Scalar> > &A,
 
  349  const Ptr<
const SolveCriteria<Scalar> > &fwdSolveCriteria,
 
  350  const EThrowOnSolveFailure throwOnFwdSolveFailure,
 
  351  const Ptr<
const SolveCriteria<Scalar> > &adjSolveCriteria,
 
  352  const EThrowOnSolveFailure throwOnAdjSolveFailure
 
  356    new DefaultInverseLinearOp<Scalar>(
 
  357      A, fwdSolveCriteria.get(), throwOnFwdSolveFailure,
 
  358      adjSolveCriteria.get(), throwOnAdjSolveFailure
 
  371#define THYRA_DEFAULT_INVERSE_LINEAR_OP_INSTANT(SCALAR) \ 
  373  template class DefaultInverseLinearOp<SCALAR >; \ 
  375  template RCP<LinearOpBase<SCALAR > > \ 
  377    const RCP<LinearOpWithSolveBase<SCALAR > > &A, \ 
  378    const Ptr<const SolveCriteria<SCALAR > > &fwdSolveCriteria, \ 
  379    const EThrowOnSolveFailure throwOnFwdSolveFailure, \ 
  380    const Ptr<const SolveCriteria<SCALAR > > &adjSolveCriteria, \ 
  381    const EThrowOnSolveFailure throwOnAdjSolveFailure \ 
  384  template RCP<LinearOpBase<SCALAR > > \ 
  386    const RCP<const LinearOpWithSolveBase<SCALAR > > &A, \ 
  387    const Ptr<const SolveCriteria<SCALAR > > &fwdSolveCriteria, \ 
  388    const EThrowOnSolveFailure throwOnFwdSolveFailure, \ 
  389    const Ptr<const SolveCriteria<SCALAR > > &adjSolveCriteria, \ 
  390    const EThrowOnSolveFailure throwOnAdjSolveFailure \ 
virtual std::string description() const
 
Exception type thrown on an catastrophic solve failure.
 
Concrete LinearOpBase subclass that creates an implicit LinearOpBase object using the inverse action ...
 
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
 
RCP< const LinearOpWithSolveBase< Scalar > > getLows() const
 
RCP< const LinearOpBase< Scalar > > clone() const
 
std::string description() const
 
void initialize(const RCP< LinearOpWithSolveBase< Scalar > > &lows, const SolveCriteria< Scalar > *fwdSolveCriteria=NULL, const EThrowOnSolveFailure throwOnFwdSolveFailure=THROW_ON_SOLVE_FAILURE, const SolveCriteria< Scalar > *adjSolveCriteria=NULL, const EThrowOnSolveFailure throwOnAdjSolveFailure=THROW_ON_SOLVE_FAILURE)
Initialize given a non-const LinearOpWithSolveBase object and an optional .
 
DefaultInverseLinearOp()
Constructs to uninitialized (see postconditions for uninitialize()).
 
void uninitialize()
Set to uninitialized.
 
RCP< const VectorSpaceBase< Scalar > > domain() const
Returns this->getLows()->range() if <t>this->getLows().get()!=NULL and returns Teuchos::null otherwis...
 
RCP< const VectorSpaceBase< Scalar > > range() const
Returns this->getLows()->domain() if <t>this->getLows().get()!=NULL and returns Teuchos::null otherwi...
 
void describe(FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
 
RCP< LinearOpWithSolveBase< Scalar > > getNonconstLows()
 
bool opSupportedImpl(EOpTransp M_trans) const
Returns true only if all constituent operators support M_trans.
 
Base class for all linear operators that can support a high-level solve operation.
 
Interface for a collection of column vectors called a multi-vector.
 
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
@ SOLVE_STATUS_CONVERGED
The requested solution criteria has likely been achieved.
 
EThrowOnSolveFailure
Determines what to do if inverse solve fails.
 
@ THROW_ON_SOLVE_FAILURE
Throw an exception if a solve fails to converge.
 
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
 
const char * toString(EConj conj)
Return a string name for a EOpTransp value. `*.
 
EOpTransp real_trans(EOpTransp transp)
Return NOTRANS or TRANS for real scalar valued operators and this also is used for determining struct...
 
@ NOTRANS
Use the non-transposed operator.
 
T_To & dyn_cast(T_From &from)
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
 
Simple struct that defines the requested solution criteria for a solve.
 
Simple struct for the return status from a solve.
 
std::string message
A simple one-line message (i.e. no newlines) returned from the solver.
 
ESolveStatus solveStatus
The return status of the solve.