47 #include "Teko_DiagonalPreconditionerOp.hpp"
48 #include "Thyra_EpetraThyraWrappers.hpp"
49 #include "EpetraExt_PointToBlockDiagPermute.h"
50 #include "Epetra_MultiVector.h"
53 using Teuchos::rcp_const_cast;
54 using Teuchos::rcp_dynamic_cast;
55 using Teuchos::rcpFromRef;
57 using Thyra::MultiVectorBase;
61 DiagonalPreconditionerOp::DiagonalPreconditionerOp(
62 Teuchos::RCP<EpetraExt_PointToBlockDiagPermute> BDP,
const VectorSpace range,
63 const VectorSpace domain)
64 : BDP_(BDP), range_(range), domain_(domain) {}
66 void DiagonalPreconditionerOp::implicitApply(
const MultiVector& x, MultiVector& y,
67 const double alpha,
const double beta)
const {
70 const Epetra_Map& rangemap_ = BDP_->OperatorRangeMap();
71 const Epetra_Map& domainmap_ = BDP_->OperatorDomainMap();
73 RCP<const Epetra_MultiVector> x_ = Thyra::get_Epetra_MultiVector(domainmap_, x);
74 RCP<Epetra_MultiVector> y_ = Thyra::get_Epetra_MultiVector(rangemap_, y);
75 TEUCHOS_ASSERT(x_ != Teuchos::null);
76 TEUCHOS_ASSERT(y_ != Teuchos::null);
80 BDP_->ApplyInverse(*x_, *y_);
83 MultiVector y0 = deepcopy(y);
84 BDP_->ApplyInverse(*x_, *y_);
85 update(alpha, y, beta, y0);
89 void DiagonalPreconditionerOp::describe(Teuchos::FancyOStream& out_arg,
90 const Teuchos::EVerbosityLevel verbLevel)
const {
94 case Teuchos::VERB_DEFAULT:
95 case Teuchos::VERB_LOW: out_arg << this->description() << std::endl;
break;
96 case Teuchos::VERB_MEDIUM:
97 case Teuchos::VERB_HIGH:
98 case Teuchos::VERB_EXTREME:
99 if (BDP_ != Teuchos::null) BDP_->Print(out_arg);
101 default: TEUCHOS_TEST_FOR_EXCEPT(
true);