Teko Version of the Day
Loading...
Searching...
No Matches
Teko_EpetraHelpers.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_EpetraHelpers_hpp__
48#define __Teko_EpetraHelpers_hpp__
49
50// stl includes
51#include <string>
52
53// Epetra includes
54#include "Epetra_Operator.h"
55#include "Epetra_CrsMatrix.h"
56#include "Epetra_MultiVector.h"
57
58// Teuchos includes
59#include "Teuchos_RCP.hpp"
60
61// Thyra includes
62#include "Thyra_VectorBase.hpp"
63#include "Thyra_DefaultSpmdMultiVector.hpp"
64
65namespace Teko {
66
67namespace Epetra {
68
78void fillDefaultSpmdMultiVector(Teuchos::RCP<Thyra::DefaultSpmdMultiVector<double> > & spmdMV,
79 Teuchos::RCP<Epetra_MultiVector> & epetraMV);
80
91const Teuchos::RCP<const Thyra::LinearOpBase<double> > thyraDiagOp(const Teuchos::RCP<const Epetra_Vector> & ev,
92 const Epetra_Map & map,const std::string & lbl="ANYM");
93
104const Teuchos::RCP<Thyra::LinearOpBase<double> > thyraDiagOp(const Teuchos::RCP<Epetra_Vector> & ev,
105 const Epetra_Map & map,const std::string & lbl="ANYM");
106
116void identityRowIndices(const Epetra_Map & rowMap, const Epetra_CrsMatrix & mat,std::vector<int> & outIndices);
117
128void zeroMultiVectorRowIndices(Epetra_MultiVector & mv,const std::vector<int> & zeroIndices);
129
133class ZeroedOperator : public Epetra_Operator {
134public:
144 ZeroedOperator(const std::vector<int> & zeroIndices,const Teuchos::RCP<const Epetra_Operator> & op);
145
147
148
150 virtual ~ZeroedOperator() {}
151
153 int SetUseTranspose(bool /* useTranspose */ ) { return -1;}
154
156 int Apply(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const;
157
159 int ApplyInverse(const Epetra_MultiVector& /* X */, Epetra_MultiVector& /* Y */) const
160 { return -1; }
161
163 double NormInf() const { return -1.0; }
164
166 const char* Label() const {return label_.c_str();}
167
169 bool UseTranspose() const {return false;}
170
172 bool HasNormInf() const {return false;}
173
175 const Epetra_Comm & Comm() const {return epetraOp_->Comm(); }
176
178 const Epetra_Map& OperatorDomainMap() const {return epetraOp_->OperatorDomainMap(); }
179
181 const Epetra_Map& OperatorRangeMap() const {return epetraOp_->OperatorRangeMap(); }
182
184
185protected:
186 std::vector<int> zeroIndices_;
187 const Teuchos::RCP<const Epetra_Operator> epetraOp_;
188 std::string label_;
189};
190
191} // end namespace Epetra
192} // end namespace Teko
193
194#endif
int ApplyInverse(const Epetra_MultiVector &, Epetra_MultiVector &) const
Can't call ApplyInverse on a zeroed operator.
ZeroedOperator(const std::vector< int > &zeroIndices, const Teuchos::RCP< const Epetra_Operator > &op)
Constructor for a ZeroedOperator.
virtual ~ZeroedOperator()
Do nothing destructor.
int SetUseTranspose(bool)
Can't transpose a ZeroedOperator.
int Apply(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
Perform a matrix-vector product with certain rows zeroed out.