43#ifndef THYRA_DEFAULT_SCALED_ADJOINT_LINEAR_OP_DEF_HPP
44#define THYRA_DEFAULT_SCALED_ADJOINT_LINEAR_OP_DEF_HPP
47#include "Thyra_DefaultScaledAdjointLinearOp_decl.hpp"
48#include "Thyra_VectorSpaceBase.hpp"
49#include "Thyra_AssertOp.hpp"
65 initializeImpl(scalar,transp,Op,
false);
76 initializeImpl(scalar,transp,Op,
false);
84 return getOpImpl().getNonconstObj();
100 origOp_.uninitialize();
101 overallScalar_ = ST::zero();
111template<
class Scalar>
115 std::ostringstream oss;
117 << overallScalar() <<
","<<
toString(overallTransp())<<
","
118 << origOp_->description() <<
"}";
123template<
class Scalar>
139 *out << this->description() << std::endl;
147 <<
"rangeDim=" << this->range()->dim()
148 <<
",domainDim=" << this->domain()->dim() <<
"}\n";
151 <<
"overallScalar="<< overallScalar() << std::endl
152 <<
"overallTransp="<<
toString(overallTransp()) << std::endl
153 <<
"Constituent transformations:\n";
154 for(
int i = 0; i <= my_index_; ++i ) {
155 const ScalarETransp<Scalar> &scalar_transp = (*allScalarETransp_)[my_index_-i];
157 if(scalar_transp.scalar != ST::one() && scalar_transp.transp !=
NOTRANS)
158 *out <<
"scalar="<<scalar_transp.scalar<<
",transp="<<
toString(scalar_transp.transp)<<std::endl;
159 else if(scalar_transp.scalar != ST::one())
160 *out <<
"scalar="<<scalar_transp.scalar<<std::endl;
161 else if( scalar_transp.transp !=
NOTRANS )
162 *out <<
"transp="<<
toString(scalar_transp.transp)<<std::endl;
164 *out <<
"no-transformation\n";
166 tab.incrTab(my_index_+2);
167 *out <<
"origOp = " << Teuchos::describe(*origOp_,verbLevel);
179template<
class Scalar>
185 ? this->getOrigOp()->range() : this->getOrigOp()->domain() );
189template<
class Scalar>
195 ? this->getOrigOp()->domain() : this->getOrigOp()->range() );
199template<
class Scalar>
210template<
class Scalar>
213 return overallScalar_;
217template<
class Scalar>
220 return overallTransp_;
224template<
class Scalar>
228 return origOp_.getNonconstObj();
232template<
class Scalar>
246template<
class Scalar>
250 return Thyra::opSupported(
251 *this->getOrigOp(),
trans_trans(this->overallTransp(), M_trans) );
255template<
class Scalar>
267 *this->getOrigOp(),
trans_trans(M_trans, this->overallTransp()),
268 X, Y, as<Scalar>(this->overallScalar()*alpha), beta
276template<
class Scalar>
287 Op.get()==NULL, std::invalid_argument
288 ,
"DefaultScaledAdjointLinearOp<"<<ST::name()<<
">::initialize(scalar,transp,Op): "
289 "Error!, Op.get()==NULL is not allowed!"
295 origOp_ = saOp->origOp_;
296 overallScalar_ = saOp->overallScalar_*scalar;
297 overallTransp_ =
trans_trans(saOp->overallTransp_,transp) ;
298 my_index_ = saOp->my_index_ + 1;
299 allScalarETransp_ = saOp->allScalarETransp_;
303 origOp_.initialize(Op);
305 origOp_.initialize(Teuchos::rcp_const_cast<LinearOpBase<Scalar> >(Op));
306 overallScalar_ = scalar;
307 overallTransp_ = transp;
309 allScalarETransp_ =
Teuchos::rcp(
new allScalarETransp_t());
311 allScalarETransp_->push_back(ScalarETransp<Scalar>(scalar,transp));
313 std::string Op_label = Op->getObjectLabel();
314 if(Op_label.length()==0)
316 std::ostringstream label;
317 if(scalar!=ST::one())
318 label << scalar <<
"*";
334 label <<
"(" << Op_label <<
")";
335 this->setObjectLabel(label.str());
339template<
class Scalar>
340typename DefaultScaledAdjointLinearOp<Scalar>::CNLOC
341DefaultScaledAdjointLinearOp<Scalar>::getOpImpl()
const
344 if( my_index_ > 0 ) {
345 const ScalarETransp<Scalar> &scalar_transp = allScalarETransp_->at(my_index_);
347 Op =
Teuchos::rcp(
new DefaultScaledAdjointLinearOp<Scalar>());
348 Op->origOp_ = origOp_;
349 Op->overallScalar_ = overallScalar_/scalar_transp.scalar;
350 Op->overallTransp_ =
trans_trans(overallTransp_,scalar_transp.transp);
351 Op->my_index_ = my_index_ - 1;
352 Op->allScalarETransp_ = allScalarETransp_;
354 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)