46 #include <Xpetra_Matrix.hpp> 47 #include <Xpetra_CrsMatrixWrap.hpp> 48 #include <Xpetra_BlockedCrsMatrix.hpp> 49 #include <Xpetra_EpetraMultiVector.hpp> 54 #if defined(HAVE_MUELU_SERIAL) and defined(HAVE_MUELU_EPETRA) 58 int EpetraOperator::ApplyInverse(
const Epetra_MultiVector& X, Epetra_MultiVector& Y)
const {
61 const Xpetra::EpetraMultiVectorT<GO,NO> eX(rcpFromRef(const_cast<Epetra_MultiVector&>(X)));
62 Xpetra::EpetraMultiVectorT<GO,NO> eY(rcpFromRef(Y));
65 if (X.Values() == Y.Values()) {
67 RCP<Xpetra::EpetraMultiVectorT<GO,NO> > tmpY = Teuchos::rcp(
new Xpetra::EpetraMultiVectorT<GO,NO>(eY.getMap(), eY.getNumVectors()));
71 bool initialGuessZero =
true;
75 Hierarchy_->Iterate(eX, *tmpY, 1, initialGuessZero);
78 eY.update(1.0, *tmpY, 0.0);
85 bool initialGuessZero =
true;
88 Hierarchy_->Iterate(eX, eY, 1, initialGuessZero);
91 }
catch (std::exception& e) {
93 std::cerr <<
"Caught an exception in MueLu::EpetraOperator::ApplyInverse():" << std::endl
94 << e.what() << std::endl;
101 const Epetra_Comm& EpetraOperator::Comm()
const {
102 RCP<Matrix> A = Hierarchy_->GetLevel(0)->Get<RCP<Matrix> >(
"A");
105 RCP<Xpetra::BlockedCrsMatrix<SC, LO, GO, NO> > epbA = Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<SC, LO, GO, NO> >(A);
106 if (epbA != Teuchos::null) {
107 RCP<const Xpetra::EpetraCrsMatrix> tmp_ECrsMtx = rcp_dynamic_cast<Xpetra::EpetraCrsMatrix >(epbA->getMatrix(0,0));
108 if (tmp_ECrsMtx == Teuchos::null)
109 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
111 RCP<Epetra_CrsMatrix> epA = tmp_ECrsMtx->getEpetra_CrsMatrixNonConst();
115 RCP<const Xpetra::CrsMatrixWrap<SC,LO,GO,NO> > crsOp = rcp_dynamic_cast<
const Xpetra::CrsMatrixWrap<SC,LO,GO,NO> >(A);
116 if (crsOp == Teuchos::null)
117 throw Exceptions::BadCast(
"Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed");
118 const RCP<const Xpetra::EpetraCrsMatrix> &tmp_ECrsMtx = rcp_dynamic_cast<
const Xpetra::EpetraCrsMatrix>(crsOp->getCrsMatrix());
119 if (tmp_ECrsMtx == Teuchos::null)
120 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
121 return tmp_ECrsMtx->getEpetra_CrsMatrixNonConst()->Comm();
124 const Epetra_Map& EpetraOperator::OperatorDomainMap()
const {
125 RCP<Xpetra::Matrix<SC,LO,GO,NO> > A = Hierarchy_->GetLevel(0)->Get<RCP<Matrix> >(
"A");
127 RCP<Xpetra::BlockedCrsMatrix<SC, LO, GO, NO> > epbA = Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<SC, LO, GO, NO> >(A);
128 if (epbA != Teuchos::null)
129 return Xpetra::toEpetra(epbA->getDomainMap());
131 RCP<const Xpetra::CrsMatrixWrap<SC,LO,GO,NO> > crsOp = rcp_dynamic_cast<
const Xpetra::CrsMatrixWrap<SC,LO,GO,NO> >(A);
132 if (crsOp == Teuchos::null)
133 throw Exceptions::BadCast(
"Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed");
134 const RCP<const Xpetra::EpetraCrsMatrix> &tmp_ECrsMtx = rcp_dynamic_cast<
const Xpetra::EpetraCrsMatrix>(crsOp->getCrsMatrix());
135 if (tmp_ECrsMtx == Teuchos::null)
136 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
137 return tmp_ECrsMtx->getEpetra_CrsMatrixNonConst()->DomainMap();
140 const Epetra_Map & EpetraOperator::OperatorRangeMap()
const {
141 RCP<Xpetra::Matrix<SC,LO,GO,NO> > A = Hierarchy_->GetLevel(0)->Get<RCP<Matrix> >(
"A");
143 RCP<Xpetra::BlockedCrsMatrix<SC, LO, GO, NO> > epbA = Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<SC, LO, GO, NO> >(A);
144 if (epbA != Teuchos::null)
145 return Xpetra::toEpetra(epbA->getRangeMap());
147 RCP<const Xpetra::CrsMatrixWrap<SC,LO,GO,NO> > crsOp = rcp_dynamic_cast<
const Xpetra::CrsMatrixWrap<SC,LO,GO,NO> >(A);
148 if (crsOp == Teuchos::null)
149 throw Exceptions::BadCast(
"Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed");
150 const RCP<const Xpetra::EpetraCrsMatrix> &tmp_ECrsMtx = rcp_dynamic_cast<
const Xpetra::EpetraCrsMatrix>(crsOp->getCrsMatrix());
151 if (tmp_ECrsMtx == Teuchos::null)
152 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
153 return tmp_ECrsMtx->getEpetra_CrsMatrixNonConst()->RangeMap();
158 #endif // #if defined(HAVE_MUELU_SERIAL) and defined(HAVE_MUELU_EPETRA)
Namespace for MueLu classes and methods.