47 #ifndef MUELU_SHIFTEDLAPLACIANOPERATOR_DEF_HPP
48 #define MUELU_SHIFTEDLAPLACIANOPERATOR_DEF_HPP
52 #ifdef HAVE_MUELU_TPETRA
54 #include <Xpetra_Matrix.hpp>
55 #include <Xpetra_CrsMatrixWrap.hpp>
56 #include <Xpetra_BlockedCrsMatrix.hpp>
57 #include <Xpetra_TpetraMultiVector.hpp>
58 #include <Xpetra_MultiVectorFactory.hpp>
61 #include "MueLu_Hierarchy.hpp"
62 #include "MueLu_Utilities.hpp"
69 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
70 Teuchos::RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
74 typedef Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> XMatrix;
76 RCP<MueLu::Level> L0 = Hierarchy_->GetLevel (0);
77 RCP<XMatrix> A = L0->Get<RCP<XMatrix> > (
"A");
79 RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpbA =
80 Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(A);
81 if (tpbA != Teuchos::null) {
82 return Xpetra::toTpetraNonZero (tpbA->getDomainMap ());
85 RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpA =
87 return tpA->getDomainMap ();
92 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
93 Teuchos::RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
97 typedef Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> XMatrix;
99 RCP<MueLu::Level> L0 = Hierarchy_->GetLevel(0);
100 RCP<XMatrix> A = L0->Get< RCP<XMatrix> >(
"A");
102 RCP<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpbA =
103 Teuchos::rcp_dynamic_cast<Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(A);
104 if(tpbA != Teuchos::null)
105 return Xpetra::toTpetraNonZero(tpbA->getRangeMap());
107 RCP< Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > tpA =
109 return tpA->getRangeMap();
114 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
116 Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>& Y,
117 Teuchos::ETransp mode, Scalar alpha, Scalar beta)
const {
119 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
120 typedef Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> XTMV;
123 TMV & temp_x = const_cast<TMV &>(X);
124 const XTMV tX(rcpFromRef(temp_x));
125 XTMV tY(rcpFromRef(Y));
129 Hierarchy_->Iterate(tX, tY, cycles_,
true);
132 catch(std::exception& e) {
134 std::cerr <<
"Caught an exception in MueLu::ShiftedLaplacianOperator::ApplyInverse():" << std::endl
135 << e.what() << std::endl;
169 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
175 #endif //ifdef HAVE_MUELU_TPETRA
177 #endif //ifdef MUELU_SHIFTEDLAPLACIANOPERATOR_DEF_HPP