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"
28 ,
const EOpTransp &transp
32 initializeImpl(scalar,transp,Op,
false);
39 ,
const EOpTransp &transp
43 initializeImpl(scalar,transp,Op,
false);
51 return getOpImpl().getNonconstObj();
67 origOp_.uninitialize();
68 overallScalar_ = ST::zero();
70 allScalarETransp_ = Teuchos::null;
82 std::ostringstream oss;
85 << origOp_->description() <<
"}";
114 <<
"rangeDim=" << this->
range()->dim()
115 <<
",domainDim=" << this->
domain()->dim() <<
"}\n";
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>
156template<
class Scalar>
166template<
class Scalar>
170 return Teuchos::null;
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>
222template<
class Scalar>
224 const EOpTransp M_trans,
243template<
class Scalar>
244void DefaultScaledAdjointLinearOp<Scalar>::initializeImpl(
246 ,
const EOpTransp &transp
254 Op.get()==NULL, std::invalid_argument
255 ,
"DefaultScaledAdjointLinearOp<"<<ST::name()<<
">::initialize(scalar,transp,Op): "
256 "Error!, Op.get()==NULL is not allowed!"
260 saOp = Teuchos::rcp_dynamic_cast<const DefaultScaledAdjointLinearOp<Scalar> >(Op);
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_);
313 Teuchos::RCP<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_;
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.
void apply(const LinearOpBase< Scalar > &M, const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha=static_cast< Scalar >(1.0), const Scalar beta=static_cast< Scalar >(0.0))
Non-member function call for M.apply(...).
bool opSupported(const LinearOpBase< Scalar > &M, EOpTransp M_trans)
Determines if an operation is supported for a single scalar type.
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)
const char * toString(EOpTransp transp)
Return a string name for a EOpTransp value.
NOTRANS
Type for the dimension of a vector space. `**/ typedef Teuchos::Ordinal Ordinal;.
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.
TypeTo as(const TypeFrom &t)
basic_FancyOStream< char > FancyOStream
basic_OSTab< char > OSTab
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)