Teko Version of the Day
Loading...
Searching...
No Matches
Teko_EpetraOperatorWrapper.hpp
1/*
2// @HEADER
3//
4// ***********************************************************************
5//
6// Teko: A package for block and physics based preconditioning
7// Copyright 2010 Sandia Corporation
8//
9// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
10// the U.S. Government retains certain rights in this software.
11//
12// Redistribution and use in source and binary forms, with or without
13// modification, are permitted provided that the following conditions are
14// met:
15//
16// 1. Redistributions of source code must retain the above copyright
17// notice, this list of conditions and the following disclaimer.
18//
19// 2. Redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution.
22//
23// 3. Neither the name of the Corporation nor the names of the
24// contributors may be used to endorse or promote products derived from
25// this software without specific prior written permission.
26//
27// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
28// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
31// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
34// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38//
39// Questions? Contact Eric C. Cyr (eccyr@sandia.gov)
40//
41// ***********************************************************************
42//
43// @HEADER
44
45*/
46
47#ifndef __Teko_EpetraOperatorWrapper_hpp__
48#define __Teko_EpetraOperatorWrapper_hpp__
49
50#include "Thyra_LinearOpBase.hpp"
51#include "Epetra_Map.h"
52#include "Epetra_Comm.h"
53#include "Epetra_MultiVector.h"
54#include "Epetra_Operator.h"
55
56#include <string>
57
58
59namespace Teko {
60namespace Epetra {
61 using Teuchos::RCP;
62
63 class EpetraOperatorWrapper;
64
67 public:
68 virtual ~MappingStrategy() {}
69
78 virtual void copyEpetraIntoThyra(const Epetra_MultiVector& epetraX,
79 const Teuchos::Ptr<Thyra::MultiVectorBase<double> > & thyraX) const = 0;
80 // const EpetraOperatorWrapper & eow) const = 0;
81
90 virtual void copyThyraIntoEpetra(const RCP<const Thyra::MultiVectorBase<double> > & thyraX,
91 Epetra_MultiVector& epetraX) const = 0;
92 // const EpetraOperatorWrapper & eow) const = 0;
93
95 virtual const RCP<const Epetra_Map> domainMap() const = 0;
96
98 virtual const RCP<const Epetra_Map> rangeMap() const = 0;
99
101 virtual std::string toString() const = 0;
102 };
103
106 public:
110 InverseMappingStrategy(const RCP<const MappingStrategy> & forward)
111 : forwardStrategy_(forward)
112 { }
113
114 virtual ~InverseMappingStrategy() {}
115
116 virtual void copyEpetraIntoThyra(const Epetra_MultiVector& epetraX,
117 const Teuchos::Ptr<Thyra::MultiVectorBase<double> > & thyraX) const
118 // const EpetraOperatorWrapper & eow) const
119 { forwardStrategy_->copyEpetraIntoThyra(epetraX,thyraX); }
120
121 virtual void copyThyraIntoEpetra(const RCP<const Thyra::MultiVectorBase<double> > & thyraX,
122 Epetra_MultiVector& epetraX) const
123 // const EpetraOperatorWrapper & eow) const
124 { forwardStrategy_->copyThyraIntoEpetra(thyraX,epetraX); }
125
127 virtual const RCP<const Epetra_Map> domainMap() const
128 { return forwardStrategy_->rangeMap(); }
129
131 virtual const RCP<const Epetra_Map> rangeMap() const
132 { return forwardStrategy_->domainMap(); }
133
135 virtual std::string toString() const
136 { return std::string("InverseMapping(")+forwardStrategy_->toString()+std::string(")"); }
137 protected:
139 const RCP<const MappingStrategy> forwardStrategy_;
140
141 private:
144 };
145
148 public:
150 DefaultMappingStrategy(const RCP<const Thyra::LinearOpBase<double> > & thyraOp,const Epetra_Comm & comm);
151
152 virtual ~DefaultMappingStrategy() {}
153
162 virtual void copyEpetraIntoThyra(const Epetra_MultiVector& epetraX,
163 const Teuchos::Ptr<Thyra::MultiVectorBase<double> > & thyraX) const;
164 // const EpetraOperatorWrapper & eow) const;
165
174 virtual void copyThyraIntoEpetra(const RCP<const Thyra::MultiVectorBase<double> > & thyraX,
175 Epetra_MultiVector& epetraX) const;
176 // const EpetraOperatorWrapper & eow) const;
177
179 virtual const RCP<const Epetra_Map> domainMap() const { return domainMap_; }
180
182 virtual const RCP<const Epetra_Map> rangeMap() const { return rangeMap_; }
183
185 virtual std::string toString() const
186 { return std::string("DefaultMappingStrategy"); }
187
188 protected:
189 RCP<const Thyra::VectorSpaceBase<double> > domainSpace_;
190 RCP<const Thyra::VectorSpaceBase<double> > rangeSpace_;
191
192 RCP<const Epetra_Map> domainMap_;
193 RCP<const Epetra_Map> rangeMap_;
194 };
195
202 class EpetraOperatorWrapper : public Epetra_Operator
203 {
204 public:
206 EpetraOperatorWrapper(const RCP<const Thyra::LinearOpBase<double> > & thyraOp);
207 EpetraOperatorWrapper(const RCP<const Thyra::LinearOpBase<double> > & thyraOp,
208 const RCP<const MappingStrategy> & mapStrategy);
209 EpetraOperatorWrapper(const RCP<const MappingStrategy> & mapStrategy);
210
212 virtual ~EpetraOperatorWrapper() {;}
213
215 int SetUseTranspose(bool useTranspose) {
216 useTranspose_ = useTranspose;
217 return 0;
218 }
219
221 int Apply(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const ;
222
224 int ApplyInverse(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const ;
225
227 double NormInf() const ;
228
230 const char* Label() const {return label_.c_str();}
231
233 bool UseTranspose() const {return useTranspose_;}
234
236 bool HasNormInf() const {return false;}
237
239 const Epetra_Comm & Comm() const {return *comm_;}
240
242 const Epetra_Map& OperatorDomainMap() const {return *mapStrategy_->domainMap();}
243
245 const Epetra_Map& OperatorRangeMap() const {return *mapStrategy_->rangeMap();}
246
248 const RCP<const Thyra::LinearOpBase<double> > getThyraOp() const
249 { return thyraOp_; }
250
252 const RCP<const MappingStrategy> getMapStrategy() const
253 { return mapStrategy_; }
254
256 virtual int GetBlockRowCount();
257
259 virtual int GetBlockColCount();
260
262 Teuchos::RCP<const Epetra_Operator> GetBlock(int i,int j) const;
263
264 protected:
267
269 RCP<const Epetra_Comm> getEpetraComm(const Thyra::LinearOpBase<double> & inOp) const;
270
272 void SetOperator(const RCP<const Thyra::LinearOpBase<double> > & thyraOp,bool buildMap=true);
273
275 void SetMapStrategy(const RCP<const MappingStrategy> & mapStrategy)
276 { mapStrategy_ = mapStrategy; }
277
279 RCP<const MappingStrategy> mapStrategy_;
280
282 RCP<const Thyra::LinearOpBase<double> > thyraOp_;
283
285 bool useTranspose_;
286
288 RCP<const Epetra_Comm> comm_;
289
291 std::string label_;
292 };
293} // end namespace Epetra
294} // end namespace Teko
295
296#endif
default mapping strategy for the basic EpetraOperatorWrapper
RCP< const Thyra::VectorSpaceBase< double > > rangeSpace_
Range space object.
virtual const RCP< const Epetra_Map > domainMap() const
Domain map for this strategy.
RCP< const Epetra_Map > domainMap_
Pointer to the constructed domain map.
RCP< const Thyra::VectorSpaceBase< double > > domainSpace_
Domain space object.
virtual std::string toString() const
Identifier string.
RCP< const Epetra_Map > rangeMap_
Pointer to the constructed range map.
virtual const RCP< const Epetra_Map > rangeMap() const
Range map for this strategy.
virtual void copyEpetraIntoThyra(const Epetra_MultiVector &epetraX, const Teuchos::Ptr< Thyra::MultiVectorBase< double > > &thyraX) const
Copy an Epetra_MultiVector into a Thyra::MultiVectorBase.
virtual void copyThyraIntoEpetra(const RCP< const Thyra::MultiVectorBase< double > > &thyraX, Epetra_MultiVector &epetraX) const
Copy an Thyra::MultiVectorBase into a Epetra_MultiVector.
Implements the Epetra_Operator interface with a Thyra LinearOperator. This enables the use of absrtac...
const RCP< const MappingStrategy > getMapStrategy() const
Get the mapping strategy for this wrapper (translate between Thyra and Epetra)
Teuchos::RCP< const Epetra_Operator > GetBlock(int i, int j) const
Grab the i,j block.
virtual int GetBlockRowCount()
Get the number of block rows in this operator.
virtual int GetBlockColCount()
Get the number of block columns in this operator.
const RCP< const Thyra::LinearOpBase< double > > getThyraOp() const
Return the thyra operator associated with this wrapper.
Flip a mapping strategy object around to give the "inverse" mapping strategy.
InverseMappingStrategy(const RCP< const MappingStrategy > &forward)
Constructor to build a inverse MappingStrategy from a forward map.
const RCP< const MappingStrategy > forwardStrategy_
Forward mapping strategy object.
virtual const RCP< const Epetra_Map > domainMap() const
Domain map for this strategy.
virtual std::string toString() const
Identifier string.
virtual const RCP< const Epetra_Map > rangeMap() const
Range map for this strategy.
virtual void copyThyraIntoEpetra(const RCP< const Thyra::MultiVectorBase< double > > &thyraX, Epetra_MultiVector &epetraX) const
Copy an Thyra::MultiVectorBase into a Epetra_MultiVector.
virtual void copyEpetraIntoThyra(const Epetra_MultiVector &epetraX, const Teuchos::Ptr< Thyra::MultiVectorBase< double > > &thyraX) const
Copy an Epetra_MultiVector into a Thyra::MultiVectorBase.
Abstract Mapping strategy for an EpetraOperatorWrapper.
virtual std::string toString() const =0
Identifier string.
virtual const RCP< const Epetra_Map > rangeMap() const =0
Range map for this strategy.
virtual void copyEpetraIntoThyra(const Epetra_MultiVector &epetraX, const Teuchos::Ptr< Thyra::MultiVectorBase< double > > &thyraX) const =0
Copy an Epetra_MultiVector into a Thyra::MultiVectorBase.
virtual void copyThyraIntoEpetra(const RCP< const Thyra::MultiVectorBase< double > > &thyraX, Epetra_MultiVector &epetraX) const =0
Copy an Thyra::MultiVectorBase into a Epetra_MultiVector.
virtual const RCP< const Epetra_Map > domainMap() const =0
Domain map for this strategy.