94 const Thyra::EOpTransp M_trans,
95 const Thyra::MultiVectorBase<Scalar> &X_in,
96 const Teuchos::Ptr<Thyra::MultiVectorBase<Scalar> > &Y_inout,
99 using Teuchos::rcpFromPtr;
100 using Teuchos::rcpFromRef;
102 TEUCHOS_TEST_FOR_EXCEPTION(getConstXpetraOperator() == Teuchos::null,
MueLu::Exceptions::RuntimeError,
"XpetraLinearOp::applyImpl: internal Xpetra::Operator is null.");
103 RCP<const Teuchos::Comm<int> > comm = getConstXpetraOperator()->getRangeMap()->getComm();
105 const RCP<const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tX_in =
106 Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toXpetra(rcpFromRef(X_in), comm);
107 RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tY_inout =
108 Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toXpetra(rcpFromPtr(Y_inout), comm);
109 Teuchos::ETransp transp;
111 case NOTRANS: transp = Teuchos::NO_TRANS;
break;
112 case TRANS: transp = Teuchos::TRANS;
break;
113 case CONJTRANS: transp = Teuchos::CONJ_TRANS;
break;
114 default: TEUCHOS_TEST_FOR_EXCEPTION(
true,
MueLu::Exceptions::NotImplemented,
"Thyra::XpetraLinearOp::apply. Unknown value for M_trans. Only NOTRANS, TRANS and CONJTRANS are supported.");
117 xpetraOperator_->apply(*tX_in, *tY_inout, transp, alpha, beta);
120 RCP<const Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal, Node> > rgMapExtractor = Teuchos::null;
121 Teuchos::Ptr<Thyra::ProductMultiVectorBase<Scalar> > prodY_inout =
122 Teuchos::ptr_dynamic_cast<Thyra::ProductMultiVectorBase<Scalar> >(Y_inout);
123 if (prodY_inout != Teuchos::null) {
130 RCP<MueLu::XpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node> > mueXop =
131 Teuchos::rcp_dynamic_cast<MueLu::XpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(xpetraOperator_.getNonconstObj());
133 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > A =
134 mueXop->GetHierarchy()->GetLevel(0)->template Get<RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > >(
"A");
135 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(A));
137 RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > bA =
138 Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(A);
139 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(bA));
141 rgMapExtractor = bA->getRangeMapExtractor();
142 TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgMapExtractor));
151 const RCP<
const VectorSpaceBase<Scalar> > &rangeSpace,
152 const RCP<
const VectorSpaceBase<Scalar> > &domainSpace,
153 const RCP<XpetraOperator_t> &xpetraOperator) {
155 TEUCHOS_ASSERT(nonnull(rangeSpace));
156 TEUCHOS_ASSERT(nonnull(domainSpace));
157 TEUCHOS_ASSERT(nonnull(xpetraOperator));
159 rangeSpace_ = rangeSpace;
160 domainSpace_ = domainSpace;
161 xpetraOperator_ = xpetraOperator;