Teuchos::RCP<MueLu::Hierarchy<double,int,int,Xpetra::EpetraNode> > CreateHierarchy(Teuchos::RCP<Xpetra::Matrix<double,int,int,Xpetra::EpetraNode> > A, Teuchos::ParameterList& paramList, Teuchos::RCP<Xpetra::MultiVector<double,int,int,Xpetra::EpetraNode> > coords) { typedef double Scalar; typedef int LocalOrdinal; typedef int GlobalOrdinal; typedef Xpetra::EpetraNode Node; #include <MueLu_UseShortNames.hpp> using Teuchos::RCP; Xpetra::UnderlyingLib lib = A->getRowMap()->lib(); if (lib == Xpetra::UseTpetra) { #ifdef HAVE_MUELU_TPETRA RCP<Tpetra::CrsMatrix<SC, LO, GO, NO> > tA = Utilities::Op2NonConstTpetraCrs(A); RCP<MueLu::TpetraOperator<SC, LO, GO, NO> > tH = MueLu::CreateTpetraPreconditioner(tA, paramList, Utilities::MV2NonConstTpetraMV(coords)); return tH->GetHierarchy(); #else throw MueLu::Exceptions::RuntimeError("Tpetra is not available"); #endif } if (lib == Xpetra::UseEpetra) { #ifdef HAVE_MUELU_EPETRA RCP<Epetra_CrsMatrix> eA = Utilities::Op2NonConstEpetraCrs(A); RCP<MueLu::EpetraOperator> eH = MueLu::CreateEpetraPreconditioner(eA, paramList, Utilities::MV2NonConstEpetraMV(coords)); return eH->GetHierarchy(); #else throw MueLu::Exceptions::RuntimeError("Epetra is not available"); #endif } XPETRA_FACTORY_END; }
void XpetraLinearOp<Scalar,LocalOrdinal,GlobalOrdinal,Node>::applyImpl( const Thyra::EOpTransp M_trans, const Thyra::MultiVectorBase<Scalar> &X_in, const Teuchos::Ptr<Thyra::MultiVectorBase<Scalar> > &Y_inout, const Scalar alpha, const Scalar beta ) const { using Teuchos::rcpFromRef; using Teuchos::rcpFromPtr; TEUCHOS_TEST_FOR_EXCEPTION(getConstXpetraOperator() == Teuchos::null, MueLu::Exceptions::RuntimeError, "XpetraLinearOp::applyImpl: internal Xpetra::Operator is null."); RCP< const Teuchos::Comm< int > > comm = getConstXpetraOperator()->getRangeMap()->getComm(); const RCP<const Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tX_in = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toXpetra(rcpFromRef(X_in), comm); RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tY_inout = Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::toXpetra(rcpFromPtr(Y_inout), comm); Teuchos::ETransp transp; switch (M_trans) { case NOTRANS: transp = Teuchos::NO_TRANS; break; case TRANS: transp = Teuchos::TRANS; break; case CONJTRANS: transp = Teuchos::CONJ_TRANS; break; default: TEUCHOS_TEST_FOR_EXCEPTION(true, MueLu::Exceptions::NotImplemented, "Thyra::XpetraLinearOp::apply. Unknown value for M_trans. Only NOTRANS, TRANS and CONJTRANS are supported."); } xpetraOperator_->apply(*tX_in, *tY_inout, transp, alpha, beta); // check whether Y is a product vector RCP<const Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal,Node> > rgMapExtractor = Teuchos::null; Teuchos::Ptr<Thyra::ProductMultiVectorBase<Scalar> > prodY_inout = Teuchos::ptr_dynamic_cast<Thyra::ProductMultiVectorBase<Scalar> >(Y_inout); if(prodY_inout != Teuchos::null) { // If Y is a product vector we split up the data from tY and merge them // into the product vector. The necessary Xpetra::MapExtractor is extracted // from the fine level operator (not this!) // get underlying fine level operator (BlockedCrsMatrix) // to extract the range MapExtractor RCP<MueLu::XpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal,Node> > mueXop = Teuchos::rcp_dynamic_cast<MueLu::XpetraOperator<Scalar, LocalOrdinal, GlobalOrdinal,Node> >(xpetraOperator_.getNonconstObj()); RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal,Node> > A = mueXop->GetHierarchy()->GetLevel(0)->template Get<RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal,Node> > >("A"); TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(A)); RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal,Node> > bA = Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal,Node> >(A); TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(bA)); rgMapExtractor = bA->getRangeMapExtractor(); TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(rgMapExtractor)); } // copy back Xpetra results from tY to Thyra vector Y Xpetra::ThyraUtils<Scalar,LocalOrdinal,GlobalOrdinal,Node>::updateThyra( tY_inout, rgMapExtractor, Teuchos::rcpFromPtr(Y_inout)); }
Teuchos::RCP<MueLu::Hierarchy<Scalar,LocalOrdinal,GlobalOrdinal,Node> > CreateHierarchy(Teuchos::RCP<Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > A, Teuchos::ParameterList& paramList, Teuchos::RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > coords = Teuchos::null) { #include <MueLu_UseShortNames.hpp> using Teuchos::RCP; Xpetra::UnderlyingLib lib = A->getRowMap()->lib(); if (lib == Xpetra::UseTpetra) { #ifdef HAVE_MUELU_TPETRA RCP<Tpetra::CrsMatrix<SC, LO, GO, NO> > tA = Utilities::Op2NonConstTpetraCrs(A); RCP<MueLu::TpetraOperator<SC, LO, GO, NO> > tH = MueLu::CreateTpetraPreconditioner(tA, paramList, Utilities::MV2NonConstTpetraMV(coords)); return tH->GetHierarchy(); #else throw MueLu::Exceptions::RuntimeError("Tpetra is not available"); #endif // HAVE_MUELU_TPETRA } XPETRA_FACTORY_ERROR_IF_EPETRA(lib); XPETRA_FACTORY_END; }