All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Xpetra_EpetraOperator.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_EPETRAOPERATOR_HPP
47 #define XPETRA_EPETRAOPERATOR_HPP
48 
50 
51 #include <Epetra_Operator.h>
52 #include <Epetra_Map.h>
53 
54 #include "Xpetra_Map.hpp"
55 #include "Xpetra_EpetraMap.hpp"
56 #include "Xpetra_MultiVector.hpp"
58 #include "Xpetra_Operator.hpp"
59 
60 #include "Xpetra_Utils.hpp"
61 
62 namespace Xpetra {
63 
64  template<class EpetraGlobalOrdinal, class Node>
65  class EpetraOperator : public Operator<double, int, EpetraGlobalOrdinal,Node>
66  {
67  typedef double Scalar;
68  typedef int LocalOrdinal;
69  typedef EpetraGlobalOrdinal GlobalOrdinal;
70 
71  public:
73 
76  XPETRA_MONITOR("EpetraOperator::getDomainMap()");
77  return toXpetra<GlobalOrdinal,Node>(op_->OperatorDomainMap());
78  }
79 
82  XPETRA_MONITOR("EpetraOperator::getRangeMap()");
83  return toXpetra<GlobalOrdinal,Node>(op_->OperatorRangeMap());
84  }
85 
87 
92  virtual void
98  XPETRA_MONITOR("EpetraOperator::apply");
99 
100  XPETRA_DYNAMIC_CAST(const EpetraMultiVectorT<GlobalOrdinal XPETRA_COMMA Node>, X, eX, "Xpetra::EpetraOperator->apply(): cannot cast input to Xpetra::EpetraMultiVectorT");
101  XPETRA_DYNAMIC_CAST( EpetraMultiVectorT<GlobalOrdinal XPETRA_COMMA Node>, Y, eY, "Xpetra::EpetraOperator->apply(): cannot cast input to Xpetra::EpetraMultiVectorT");
102 
104  "Xpetra::EpetraOperator->apply(): can only accept mode == NO_TRANS or mode == TRANS");
106  "Xpetra::EpetraOperator->apply(): cannot apply transpose as underlying Epetra operator does not support it");
107 
108  // Helper vector for string A*X
109  RCP<Epetra_MultiVector> epY = eY.getEpetra_MultiVector();
111  tmp->PutScalar(0.0);
112 
114  XPETRA_ERR_CHECK(op_->Apply(*eX.getEpetra_MultiVector(), *tmp));
115 
116  // calculate alpha * A * x + beta * y
117  XPETRA_ERR_CHECK(eY.getEpetra_MultiVector()->Update(alpha, *tmp, beta));
118  }
119 
121  virtual bool hasTransposeApply() const {
122  // We do not currently use transpose, try setting it
123  int err = op_->SetUseTranspose(true);
124  op_->SetUseTranspose(false);
125  return (err == 0);
126  }
127 
129 
131 
132 
134  std::string description() const { XPETRA_MONITOR("EpetraOperator::description"); return "Epetra_Operator"; }
135 
138  XPETRA_MONITOR("EpetraOperator::describe");
139  out << "Epetra_Operator" << std::endl;
140  }
141 
143 
145 
146 
148  EpetraOperator(const Teuchos::RCP<Epetra_Operator> &op) : op_(op) { } //TODO removed const
149 
151 
152  private:
155 
156  }; // TpetraOperator class
157 
158 
159 } // Xpetra namespace
160 
161 #endif // XPETRA_EPETRAOPERATOR_HPP
std::string description() const
A simple one-line description of this object.
virtual int SetUseTranspose(bool UseTranspose)=0
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Exception throws to report errors in the internal logical of the program.
virtual const Epetra_Map & OperatorDomainMap() const =0
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...
virtual int Apply(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const =0
virtual const Epetra_Map & OperatorRangeMap() const =0
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
#define XPETRA_ERR_CHECK(arg)
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.
EpetraOperator(const Teuchos::RCP< Epetra_Operator > &op)
EpetraOperator constructor to wrap a Epetra_Operator object.
Exception throws when you call an unimplemented method of Xpetra.
#define XPETRA_DYNAMIC_CAST(type, obj, newObj, exceptionMsg)
static const EVerbosityLevel verbLevel_default
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 bool hasTransposeApply() const
Whether this operator supports applying the transpose or conjugate transpose.
EpetraGlobalOrdinal GlobalOrdinal
RCP< Epetra_Operator > op_
The Tpetra::Operator which this class wraps.
#define XPETRA_MONITOR(funcName)
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...