47 #ifndef MUELU_TPETRAOPERATOR_DEF_HPP
48 #define MUELU_TPETRAOPERATOR_DEF_HPP
52 #ifdef HAVE_MUELU_TPETRA
54 #include <Xpetra_BlockedMap.hpp>
55 #include <Xpetra_Matrix.hpp>
56 #include <Xpetra_CrsMatrixWrap.hpp>
57 #include <Xpetra_BlockedCrsMatrix.hpp>
58 #include <Xpetra_Operator.hpp>
59 #include <Xpetra_TpetraMultiVector.hpp>
62 #include "MueLu_Hierarchy.hpp"
63 #include "MueLu_Utilities.hpp"
68 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
69 Teuchos::RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> >
71 typedef Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> Matrix;
72 typedef Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> Map;
73 typedef Xpetra::BlockedMap<LocalOrdinal, GlobalOrdinal, Node> BlockedMap;
75 RCP<const Map> domainMap;
76 if(!Hierarchy_.is_null()) domainMap = Hierarchy_->GetLevel(0)->template Get<RCP<Matrix> >(
"A")->getDomainMap();
77 else domainMap = Operator_->getDomainMap();
80 RCP<const BlockedMap> bDomainMap = Teuchos::rcp_dynamic_cast<const BlockedMap>(domainMap);
81 if(bDomainMap.is_null() ==
false) {
82 return Xpetra::toTpetraNonZero(bDomainMap->getFullMap());
84 return Xpetra::toTpetraNonZero(domainMap);
87 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
89 typedef Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> Matrix;
90 typedef Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> Map;
91 typedef Xpetra::BlockedMap<LocalOrdinal, GlobalOrdinal, Node> BlockedMap;
94 RCP<const Map> rangeMap;
95 if(!Hierarchy_.is_null()) rangeMap = Hierarchy_->GetLevel(0)->template Get<RCP<Matrix> >(
"A")->getRangeMap();
96 else rangeMap = Operator_->getRangeMap();
98 RCP<const BlockedMap> bRangeMap = Teuchos::rcp_dynamic_cast<const BlockedMap>(rangeMap);
99 if(bRangeMap.is_null() ==
false) {
100 return Xpetra::toTpetraNonZero(bRangeMap->getFullMap());
102 return Xpetra::toTpetraNonZero(rangeMap);
105 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
107 Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>& Y,
109 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
110 typedef Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> XTMV;
112 TEUCHOS_TEST_FOR_EXCEPTION(mode!=Teuchos::NO_TRANS,std::logic_error,
"MueLu::TpetraOperator does not support applying the adjoint operator");
115 TMV& temp_x =
const_cast<TMV &
>(X);
116 const XTMV tX(rcpFromRef(temp_x));
117 XTMV tY(rcpFromRef(Y));
119 if(!Hierarchy_.is_null())
120 Hierarchy_->Iterate(tX, tY, 1,
true);
122 Operator_->apply(tX, tY);
124 }
catch (std::exception& e) {
125 std::cerr <<
"MueLu::TpetraOperator::apply : detected an exception" << std::endl
126 << e.what() << std::endl;
131 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
136 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
137 RCP<MueLu::Hierarchy<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
142 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
143 RCP<Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
MueLu::DefaultScalar Scalar
Wraps an existing MueLu::Hierarchy as a Tpetra::Operator.
Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
Returns the Tpetra::Map object associated with the domain of this operator.
Namespace for MueLu classes and methods.