Xpetra_TpetraOperator.hpp
Go to the documentation of this file.
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // Xpetra: A linear algebra interface package
6 // Copyright 2012 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact
39 // Jonathan Hu (jhu@sandia.gov)
40 // Andrey Prokopenko (aprokop@sandia.gov)
41 // Ray Tuminaro (rstumin@sandia.gov)
42 //
43 // ***********************************************************************
44 //
45 // @HEADER
46 #ifndef XPETRA_TPETRAOPERATOR_HPP
47 #define XPETRA_TPETRAOPERATOR_HPP
48 
50 
51 #include <Tpetra_Operator.hpp>
52 
53 #include "Xpetra_Map.hpp"
54 #include "Xpetra_TpetraMap.hpp"
55 #include "Xpetra_MultiVector.hpp"
57 #include "Xpetra_Operator.hpp"
58 
59 #include "Xpetra_Utils.hpp"
60 
61 namespace Xpetra {
62 
63  template <class Scalar = Operator<>::scalar_type,
64  class LocalOrdinal = typename Operator<Scalar>::local_ordinal_type,
65  class GlobalOrdinal = typename Operator<Scalar, LocalOrdinal>::global_ordinal_type,
67  class TpetraOperator : public Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > {
68  public:
70 
72  virtual Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > getDomainMap() const {
73  XPETRA_MONITOR("TpetraOperator::getDomainMap()");
74  return toXpetra(op_->getDomainMap());
75  }
76 
78  virtual Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > getRangeMap() const {
79  XPETRA_MONITOR("TpetraOperator::getRangeMap()");
80  return toXpetra(op_->getRangeMap());
81  }
82 
84 
89  virtual void
92  Teuchos::ETransp mode = Teuchos::NO_TRANS,
93  Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
94  Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const {
95  op_->apply(toTpetra(X), toTpetra(Y), mode, alpha, beta);
96  }
97 
99  virtual bool hasTransposeApply() const {
100  return op_->hasTransposeApply();
101  }
102 
104 
106 
107 
109  std::string description() const { XPETRA_MONITOR("TpetraOperator::description"); return op_->description(); }
110 
112  void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const {
113  XPETRA_MONITOR("TpetraOperator::describe"); op_->describe(out, verbLevel);
114  }
115 
117 
119 
120 
122  TpetraOperator(const Teuchos::RCP<Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node> > &op) : op_(op) { } //TODO removed const
123 
125 
126  private:
128  RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node> > op_;
129 
130  }; // TpetraOperator class
131 
132 
133 
134 #if ((!defined(HAVE_TPETRA_INST_SERIAL)) && (!defined(HAVE_TPETRA_INST_INT_INT)))
135  // specialization for Tpetra Map on EpetraNode and GO=int
136  template <>
137  class TpetraOperator<double, int, int, EpetraNode>
138  : public Operator< double, int, int, EpetraNode > {
139  public:
140  typedef double Scalar;
141  typedef int GlobalOrdinal;
142  typedef int LocalOrdinal;
143  typedef EpetraNode Node;
144 
146 
148  virtual Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > getDomainMap() const {
149  return Teuchos::null;
150  }
151 
153  virtual Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > getRangeMap() const {
154  return Teuchos::null;
155  }
156 
158 
163  virtual void
166  Teuchos::ETransp mode = Teuchos::NO_TRANS,
167  Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
168  Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const { }
169 
171  virtual bool hasTransposeApply() const { return false; }
172 
174 
176 
177 
179  std::string description() const { return std::string(""); }
180 
182  void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const { }
183 
185 
187 
188 
190  TpetraOperator(const Teuchos::RCP<Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node> > &op) { }
191 
193 
194  }; // TpetraOperator class
195 #endif
196 
197 
198 #if ((!defined(HAVE_TPETRA_INST_SERIAL)) && (!defined(HAVE_TPETRA_INST_INT_LONG_LONG)))
199  // specialization for Tpetra Map on EpetraNode and GO=int
200  template <>
201  class TpetraOperator<double, int, long long, EpetraNode>
202  : public Operator< double, int, long long, EpetraNode > {
203  public:
204  typedef double Scalar;
205  typedef long long GlobalOrdinal;
206  typedef int LocalOrdinal;
207  typedef EpetraNode Node;
208 
210 
212  virtual Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > getDomainMap() const {
213  return Teuchos::null;
214  }
215 
217  virtual Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > getRangeMap() const {
218  return Teuchos::null;
219  }
220 
222 
227  virtual void
230  Teuchos::ETransp mode = Teuchos::NO_TRANS,
231  Scalar alpha = Teuchos::ScalarTraits<Scalar>::one(),
232  Scalar beta = Teuchos::ScalarTraits<Scalar>::zero()) const { }
233 
235  virtual bool hasTransposeApply() const { return false; }
236 
238 
240 
241 
243  std::string description() const { return std::string(""); }
244 
246  void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const { }
247 
249 
251 
252 
254  TpetraOperator(const Teuchos::RCP<Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node> > &op) { }
255 
257 
258  }; // TpetraOperator class
259 #endif
260 
261 } // Xpetra namespace
262 
263 #define XPETRA_TPETRAOPERATOR_SHORT
264 #endif // XPETRA_TPETRAOPERATOR_HPP
virtual void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=Teuchos::ScalarTraits< Scalar >::one(), Scalar beta=Teuchos::ScalarTraits< Scalar >::zero()) const
Computes the operator-multivector application.
virtual Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
The Map associated with the range of this operator, which must be compatible with Y...
Xpetra namespace
virtual bool hasTransposeApply() const
Whether this operator supports applying the transpose or conjugate transpose.
virtual Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
The Map associated with the range of this operator, which must be compatible with Y...
virtual Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
The Map associated with the domain of this operator, which must be compatible with X...
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with the given verbosity level to a FancyOStream.
std::string description() const
A simple one-line description of this object.
Node node_type
The Kokkos Node type.
std::string description() const
A simple one-line description of this object.
GlobalOrdinal global_ordinal_type
The global index type.
std::string description() const
A simple one-line description of this object.
virtual bool hasTransposeApply() const
Whether this operator supports applying the transpose or conjugate transpose.
RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > op_
The Tpetra::Operator which this class wraps.
virtual bool hasTransposeApply() const
Whether this operator supports applying the transpose or conjugate transpose.
LocalOrdinal local_ordinal_type
The local index type.
TpetraOperator(const Teuchos::RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &op)
TpetraOperator constructor to wrap a Tpetra::Operator object.
TpetraOperator(const Teuchos::RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &op)
TpetraOperator constructor to wrap a Tpetra::Operator object.
virtual void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=Teuchos::ScalarTraits< Scalar >::one(), Scalar beta=Teuchos::ScalarTraits< Scalar >::zero()) const
Computes the operator-multivector application.
RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > toTpetra(const RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &graph)
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)
virtual Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
The Map associated with the range of this operator, which must be compatible with Y...
virtual Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
The Map associated with the domain of this operator, which must be compatible with X...
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with the given verbosity level to a FancyOStream.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with the given verbosity level to a FancyOStream.
#define XPETRA_MONITOR(funcName)
virtual Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
The Map associated with the domain of this operator, which must be compatible with X...
TpetraOperator(const Teuchos::RCP< Tpetra::Operator< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &op)
TpetraOperator constructor to wrap a Tpetra::Operator object.
virtual void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=Teuchos::ScalarTraits< Scalar >::one(), Scalar beta=Teuchos::ScalarTraits< Scalar >::zero()) const
Computes the operator-multivector application.