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" 58 template<
class Scalar>
62 ,
const Teuchos::RCP<LinearOpBase<Scalar> > &Op
65 initializeImpl(scalar,transp,Op,
false);
69 template<
class Scalar>
73 ,
const Teuchos::RCP<
const LinearOpBase<Scalar> > &Op
76 initializeImpl(scalar,transp,Op,
false);
80 template<
class Scalar>
81 Teuchos::RCP<LinearOpBase<Scalar> >
84 return getOpImpl().getNonconstObj();
88 template<
class Scalar>
89 Teuchos::RCP<const LinearOpBase<Scalar> >
96 template<
class Scalar>
99 typedef Teuchos::ScalarTraits<Scalar> ST;
100 origOp_.uninitialize();
101 overallScalar_ = ST::zero();
103 allScalarETransp_ = Teuchos::null;
111 template<
class Scalar>
115 std::ostringstream oss;
116 oss << Teuchos::Describable::description() <<
"{" 117 << overallScalar() <<
","<<
toString(overallTransp())<<
"," 118 << origOp_->description() <<
"}";
123 template<
class Scalar>
125 Teuchos::FancyOStream &out_arg
126 ,
const Teuchos::EVerbosityLevel verbLevel
129 typedef Teuchos::ScalarTraits<Scalar> ST;
131 using Teuchos::FancyOStream;
132 using Teuchos::OSTab;
134 RCP<FancyOStream> out = rcp(&out_arg,
false);
137 case Teuchos::VERB_DEFAULT:
138 case Teuchos::VERB_LOW:
139 *out << this->description() << std::endl;
141 case Teuchos::VERB_MEDIUM:
142 case Teuchos::VERB_HIGH:
143 case Teuchos::VERB_EXTREME:
146 << Teuchos::Describable::description() <<
"{" 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);
171 TEUCHOS_TEST_FOR_EXCEPT(
true);
179 template<
class Scalar>
180 Teuchos::RCP< const VectorSpaceBase<Scalar> >
185 ? this->getOrigOp()->range() : this->getOrigOp()->domain() );
189 template<
class Scalar>
190 Teuchos::RCP< const VectorSpaceBase<Scalar> >
195 ? this->getOrigOp()->domain() : this->getOrigOp()->range() );
199 template<
class Scalar>
200 Teuchos::RCP<const LinearOpBase<Scalar> >
203 return Teuchos::null;
210 template<
class Scalar>
213 return overallScalar_;
217 template<
class Scalar>
220 return overallTransp_;
224 template<
class Scalar>
225 Teuchos::RCP<LinearOpBase<Scalar> >
228 return origOp_.getNonconstObj();
232 template<
class Scalar>
233 Teuchos::RCP<const LinearOpBase<Scalar> >
246 template<
class Scalar>
250 return Thyra::opSupported(
251 *this->getOrigOp(),
trans_trans(this->overallTransp(), M_trans) );
255 template<
class Scalar>
267 *this->getOrigOp(),
trans_trans(M_trans, this->overallTransp()),
268 X, Y, as<Scalar>(this->overallScalar()*alpha), beta
276 template<
class Scalar>
284 typedef Teuchos::ScalarTraits<Scalar> ST;
286 TEUCHOS_TEST_FOR_EXCEPTION(
287 Op.get()==NULL, std::invalid_argument
288 ,
"DefaultScaledAdjointLinearOp<"<<ST::name()<<
">::initialize(scalar,transp,Op): " 289 "Error!, Op.get()==NULL is not allowed!" 291 #endif // TEUCHOS_DEBUG 292 Teuchos::RCP<const DefaultScaledAdjointLinearOp<Scalar> >
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 <<
"*";
332 TEUCHOS_TEST_FOR_EXCEPT(
"Invalid EOpTransp value!");
334 label <<
"(" << Op_label <<
")";
335 this->setObjectLabel(label.str());
339 template<
class Scalar>
340 typename DefaultScaledAdjointLinearOp<Scalar>::CNLOC
341 DefaultScaledAdjointLinearOp<Scalar>::getOpImpl()
const 344 if( my_index_ > 0 ) {
345 const ScalarETransp<Scalar> &scalar_transp = allScalarETransp_->at(my_index_);
346 Teuchos::RCP<DefaultScaledAdjointLinearOp<Scalar> >
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)
364 #endif // THYRA_DEFAULT_SCALED_ADJOINT_LINEAR_OP_DEF_HPP EOpTransp
Enumeration for determining how a linear operator is applied. `*.
RCP< const LinearOpBase< Scalar > > getOrigOp() const
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 ...
bool opSupportedImpl(EOpTransp M_trans) const
Return if the operation is supported on the logical linear operator.
Use the non-transposed operator.
EOpTransp real_trans(EOpTransp transp)
Return NOTRANS or TRANS for real scalar valued operators and this also is used for determining struct...
Use the transposed operator with complex-conjugate clements (same as TRANS for real scalar types)...
RCP< const LinearOpBase< Scalar > > clone() const
RCP< LinearOpBase< Scalar > > getNonconstOp()
Return the non-const linear operator passed into initialize().
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.
Use the non-transposed operator with complex-conjugate elements (same as NOTRANS for real scalar type...
Use the transposed operator.
Interface for a collection of column vectors called a multi-vector.
std::string description() const
Outputs DefaultScaledAdjointLinearOp<Scalar>{this->getOrigOp().description()) along with the dimensio...
EOpTransp trans_trans(EOpTransp trans1, EOpTransp trans2)
Combine two transpose arguments.
RCP< const LinearOpBase< Scalar > > getOp() const
Return the const linear operator passed into initialize().
Concrete decorator LinearOpBase subclass that wraps a LinearOpBase object and adds on an extra scalin...
void uninitialize()
Set to uninitialized and (optionally) extract the objects passed into initialize().
Base class for all linear operators.
RCP< const VectorSpaceBase< Scalar > > domain() const
Return the domain space of the logical linear operator.
Scalar overallScalar() const
RCP< LinearOpBase< Scalar > > getNonconstOrigOp()
EOpTransp overallTransp() const
const char * toString(EConj conj)
Return a string name for a EOpTransp value. `*.
RCP< const VectorSpaceBase< Scalar > > range() const
Return the range space of the logical linear operator.
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...