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)