45#include "Thyra_MultiVectorStdOps.hpp"
46#include "Teuchos_TimeMonitor.hpp"
47#include <Teuchos_RCP.hpp>
56template<
typename Scalar>
61template<
typename Scalar>
63 const Teuchos::RCP<
const LinearOpBase<Scalar> > &fwdOp,
64 const Teuchos::RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
65 const Teuchos::RCP< Solver > &amesos2Solver,
70 this->initialize(fwdOp,fwdOpSrc,amesos2Solver);
74template<
typename Scalar>
76 const Teuchos::RCP<
const LinearOpBase<Scalar> > &fwdOp,
77 const Teuchos::RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
78 const Teuchos::RCP< Solver > &amesos2Solver
83 amesos2Solver_ = amesos2Solver;
84 const std::string fwdOpLabel = fwdOp_->getObjectLabel();
85 if(fwdOpLabel.length())
86 this->setObjectLabel(
"lows("+fwdOpLabel+
")" );
90template<
typename Scalar>
91Teuchos::RCP<const LinearOpSourceBase<Scalar> >
94 Teuchos::RCP<const LinearOpSourceBase<Scalar> >
95 _fwdOpSrc = fwdOpSrc_;
96 fwdOpSrc_ = Teuchos::null;
104template<
typename Scalar>
105Teuchos::RCP< const VectorSpaceBase<Scalar> >
108 return ( fwdOp_.get() ? fwdOp_->range() : Teuchos::null );
112template<
typename Scalar>
113Teuchos::RCP< const VectorSpaceBase<Scalar> >
116 return ( fwdOp_.get() ? fwdOp_->domain() : Teuchos::null );
120template<
typename Scalar>
121Teuchos::RCP<const LinearOpBase<Scalar> >
124 return Teuchos::null;
131template<
typename Scalar>
134 std::ostringstream oss;
135 oss << Teuchos::Describable::description();
136 if(!is_null(amesos2Solver_)) {
138 <<
"{fwdOp="<<fwdOp_->description()
139 <<
",amesos2Solver="<<typeName(*amesos2Solver_)<<
"}";
145template<
typename Scalar>
147 Teuchos::FancyOStream &out,
148 const Teuchos::EVerbosityLevel verbLevel
151 using Teuchos::OSTab;
152 using Teuchos::typeName;
153 using Teuchos::describe;
155 case Teuchos::VERB_DEFAULT:
156 case Teuchos::VERB_LOW:
157 out << this->description() << std::endl;
159 case Teuchos::VERB_MEDIUM:
160 case Teuchos::VERB_HIGH:
161 case Teuchos::VERB_EXTREME:
164 << Teuchos::Describable::description() <<
"{"
165 <<
"rangeDim=" << this->range()->dim()
166 <<
",domainDim="<< this->domain()->dim() <<
"}\n";
168 if(!is_null(fwdOp_)) {
169 out <<
"fwdOp = " << describe(*fwdOp_,verbLevel);
171 if(!is_null(amesos2Solver_)) {
172 out <<
"amesos2Solver=" << typeName(*amesos2Solver_) <<
"\n";
177 TEUCHOS_TEST_FOR_EXCEPT(
true);
188template<
typename Scalar>
191 return ::Thyra::opSupported(*fwdOp_,M_trans);
195template<
typename Scalar>
197 const EOpTransp M_trans,
198 const MultiVectorBase<Scalar> &X,
199 const Ptr<MultiVectorBase<Scalar> > &Y,
204 Thyra::apply( *fwdOp_, M_trans, X, Y, alpha, beta );
210template<
typename Scalar>
213 if (Thyra::real_trans(M_trans) == Thyra::NOTRANS) {
222template<
typename Scalar>
224 EOpTransp ,
const SolveMeasureType&
231template<
typename Scalar>
235 const MultiVectorBase<Scalar> &B,
236 const Ptr<MultiVectorBase<Scalar> > &X,
237 const Ptr<
const SolveCriteria<Scalar> >
240 auto Btpetra = ConverterT::getConstTpetraMultiVector(Teuchos::rcpFromRef(B));
242 auto Xtpetra = ConverterT::getTpetraMultiVector(Teuchos::rcpFromPtr(X));
244 Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
245 Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
247 if(out.get() &&
static_cast<int>(verbLevel) >
static_cast<int>(Teuchos::VERB_NONE))
248 *out <<
"\nSolving system using Amesos2 solver "
249 << typeName(*amesos2Solver_) <<
" ...\n\n";
251 amesos2Solver_->solve(Xtpetra.ptr(), Btpetra.ptr());
253 SolveStatus<Scalar> solveStatus;
254 solveStatus.solveStatus = SOLVE_STATUS_CONVERGED;
Amesos2LinearOpWithSolve()
Construct to uninitialized.
virtual void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
virtual bool solveSupportsImpl(EOpTransp M_trans) const
SolveStatus< Scalar > solveImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &B, const Ptr< MultiVectorBase< Scalar > > &X, const Ptr< const SolveCriteria< Scalar > > solveCriteria) const
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Teuchos::RCP< const LinearOpSourceBase< Scalar > > extract_fwdOpSrc()
Extract the forward LinearOpSourceBase<double> object so that it can be modified and remove it from t...
virtual bool opSupportedImpl(EOpTransp M_trans) const
std::string description() const
Teuchos::RCP< const VectorSpaceBase< Scalar > > range() const
Teuchos::RCP< const LinearOpBase< Scalar > > clone() const
virtual bool solveSupportsSolveMeasureTypeImpl(EOpTransp M_trans, const SolveMeasureType &solveMeasureType) const
void initialize(const Teuchos::RCP< const LinearOpBase< Scalar > > &fwdOp, const Teuchos::RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const Teuchos::RCP< Solver > &amesos2Solver)
Initialize after construction.
Teuchos::RCP< const VectorSpaceBase< Scalar > > domain() const