10#ifndef THYRA_DEFAULT_SCALED_ADJOINT_LINEAR_OP_DEF_HPP 
   11#define THYRA_DEFAULT_SCALED_ADJOINT_LINEAR_OP_DEF_HPP 
   14#include "Thyra_DefaultScaledAdjointLinearOp_decl.hpp" 
   15#include "Thyra_VectorSpaceBase.hpp" 
   16#include "Thyra_AssertOp.hpp" 
   32  initializeImpl(scalar,transp,Op,
false);
 
 
   43  initializeImpl(scalar,transp,Op,
false);
 
 
   51  return getOpImpl().getNonconstObj();
 
 
   67  origOp_.uninitialize();
 
   68  overallScalar_ = ST::zero();
 
 
   82  std::ostringstream oss;
 
   84      << overallScalar() << 
","<<
toString(overallTransp())<<
"," 
   85      << origOp_->description() << 
"}";
 
 
  106      *out << this->description() << std::endl;
 
  114        << 
"rangeDim=" << this->range()->dim()
 
  115        << 
",domainDim=" << this->domain()->dim() << 
"}\n";
 
  118        << 
"overallScalar="<< overallScalar() << std::endl
 
  119        << 
"overallTransp="<<
toString(overallTransp()) << std::endl
 
  120        << 
"Constituent transformations:\n";
 
  121      for( 
int i = 0; i <= my_index_; ++i ) {
 
  122        const ScalarETransp<Scalar> &scalar_transp = (*allScalarETransp_)[my_index_-i];
 
  124        if(scalar_transp.scalar != ST::one() && scalar_transp.transp != 
NOTRANS)
 
  125          *out << 
"scalar="<<scalar_transp.scalar<<
",transp="<<
toString(scalar_transp.transp)<<std::endl;
 
  126        else if(scalar_transp.scalar != ST::one())
 
  127          *out << 
"scalar="<<scalar_transp.scalar<<std::endl;
 
  128        else if( scalar_transp.transp != 
NOTRANS )
 
  129          *out << 
"transp="<<
toString(scalar_transp.transp)<<std::endl;
 
  131          *out << 
"no-transformation\n";
 
  133      tab.incrTab(my_index_+2);
 
  134      *out << 
"origOp = " << Teuchos::describe(*origOp_,verbLevel);
 
 
  146template<
class Scalar>
 
  152    ? this->getOrigOp()->range() : this->getOrigOp()->domain() );
 
 
  156template<
class Scalar>
 
  162    ? this->getOrigOp()->domain() : this->getOrigOp()->range() );
 
 
  166template<
class Scalar>
 
  177template<
class Scalar>
 
  180  return overallScalar_;
 
 
  184template<
class Scalar>
 
  187  return overallTransp_;
 
 
  191template<
class Scalar>
 
  195  return origOp_.getNonconstObj();
 
 
  199template<
class Scalar>
 
  213template<
class Scalar>
 
  217  return Thyra::opSupported(
 
  218    *this->getOrigOp(), 
trans_trans(this->overallTransp(), M_trans) );
 
 
  222template<
class Scalar>
 
  234    *this->getOrigOp(), 
trans_trans(M_trans, this->overallTransp()),
 
  235    X, Y, as<Scalar>(this->overallScalar()*alpha), beta
 
 
  243template<
class Scalar>
 
  254    Op.get()==NULL, std::invalid_argument
 
  255    ,
"DefaultScaledAdjointLinearOp<"<<ST::name()<<
">::initialize(scalar,transp,Op): " 
  256    "Error!, Op.get()==NULL is not allowed!" 
  262    origOp_ = saOp->origOp_;
 
  263    overallScalar_ = saOp->overallScalar_*scalar;
 
  264    overallTransp_ = 
trans_trans(saOp->overallTransp_,transp) ;
 
  265    my_index_ = saOp->my_index_ + 1;
 
  266    allScalarETransp_ = saOp->allScalarETransp_;
 
  270      origOp_.initialize(Op);
 
  272      origOp_.initialize(Teuchos::rcp_const_cast<LinearOpBase<Scalar> >(Op));
 
  273    overallScalar_ = scalar;
 
  274    overallTransp_ = transp;
 
  276    allScalarETransp_ = 
Teuchos::rcp(
new allScalarETransp_t());
 
  278  allScalarETransp_->push_back(ScalarETransp<Scalar>(scalar,transp));
 
  280  std::string Op_label = Op->getObjectLabel();
 
  281  if(Op_label.length()==0)
 
  283  std::ostringstream label;
 
  284  if(scalar!=ST::one())
 
  285    label << scalar << 
"*";
 
  301  label << 
"(" << Op_label << 
")";
 
  302  this->setObjectLabel(label.str());
 
  306template<
class Scalar>
 
  307typename DefaultScaledAdjointLinearOp<Scalar>::CNLOC
 
  308DefaultScaledAdjointLinearOp<Scalar>::getOpImpl()
 const 
  311  if( my_index_ > 0 ) {
 
  312    const ScalarETransp<Scalar> &scalar_transp = allScalarETransp_->at(my_index_);
 
  314      Op = 
Teuchos::rcp(
new DefaultScaledAdjointLinearOp<Scalar>());
 
  315    Op->origOp_ = origOp_;
 
  316    Op->overallScalar_ = overallScalar_/scalar_transp.scalar;
 
  317    Op->overallTransp_ = 
trans_trans(overallTransp_,scalar_transp.transp);
 
  318    Op->my_index_ = my_index_ - 1;
 
  319    Op->allScalarETransp_ = allScalarETransp_;
 
  321      Teuchos::rcp_implicit_cast<LinearOpBase<Scalar> >(Op)
 
virtual std::string description() const
 
Concrete decorator LinearOpBase subclass that wraps a LinearOpBase object and adds on an extra scalin...
 
RCP< LinearOpBase< Scalar > > getNonconstOp()
Return the non-const linear operator passed into initialize().
 
RCP< LinearOpBase< Scalar > > getNonconstOrigOp()
 
bool opSupportedImpl(EOpTransp M_trans) const
Return if the operation is supported on the logical linear operator.
 
std::string description() const
Outputs DefaultScaledAdjointLinearOp<Scalar>{this->getOrigOp().description()) along with the dimensio...
 
RCP< const VectorSpaceBase< Scalar > > domain() const
Return the domain space of the logical linear operator.
 
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Prints out the original operator as well as all of the scalings and transpositions in the order that ...
 
void uninitialize()
Set to uninitialized and (optionally) extract the objects passed into initialize().
 
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
Apply the linear operator (or its transpose) to a multi-vector : Y = alpha*op(M)*X + beta*Y.
 
RCP< const LinearOpBase< Scalar > > clone() const
 
RCP< const LinearOpBase< Scalar > > getOrigOp() const
 
RCP< const VectorSpaceBase< Scalar > > range() const
Return the range space of the logical linear operator.
 
void initialize(const Scalar &scalar, const EOpTransp &transp, const RCP< LinearOpBase< Scalar > > &Op)
Initialize with an operator with by defining adjoint (transpose) and scaling arguments.
 
Scalar overallScalar() const
 
EOpTransp overallTransp() const
 
RCP< const LinearOpBase< Scalar > > getOp() const
Return the const linear operator passed into initialize().
 
Base class for all linear operators.
 
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)
 
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...
 
EOpTransp trans_trans(EOpTransp trans1, EOpTransp trans2)
Combine two transpose arguments.
 
@ TRANS
Use the transposed operator.
 
@ NOTRANS
Use the non-transposed operator.
 
@ CONJTRANS
Use the transposed operator with complex-conjugate clements (same as TRANS for real scalar types).
 
@ CONJ
Use the non-transposed operator with complex-conjugate elements (same as NOTRANS for real scalar type...
 
TypeTo as(const TypeFrom &t)
 
T_To & dyn_cast(T_From &from)
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)