IFPACK Development
Loading...
Searching...
No Matches
Ifpack_DiagonalFilter.h
1/*@HEADER
2// ***********************************************************************
3//
4// Ifpack: Object-Oriented Algebraic Preconditioner Package
5// Copyright (2002) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38//
39// ***********************************************************************
40//@HEADER
41*/
42
43#ifndef IFPACK_DIAGONALFILTER_H
44#define IFPACK_DIAGONALFILTER_H
45
46#include "Ifpack_ConfigDefs.h"
47#include "Epetra_ConfigDefs.h"
48#include "Epetra_RowMatrix.h"
49#include "Epetra_Time.h"
50#include "Teuchos_RefCountPtr.hpp"
51
52class Epetra_Comm;
53class Epetra_Map;
55class Epetra_Import;
56class Epetra_BlockMap;
57
59
81
82public:
84 Ifpack_DiagonalFilter(const Teuchos::RefCountPtr<Epetra_RowMatrix>& Matrix,
85 double AbsoluteThreshold,
86 double RelativeThreshold);
87
90
92 virtual int NumMyRowEntries(int MyRow, int& NumEntries) const
93 {
94 return(A_->NumMyRowEntries(MyRow, NumEntries));
95 }
96
98 virtual int MaxNumEntries() const
99 {
100 return(A_->MaxNumEntries());
101 }
102
103 inline virtual int ExtractMyRowCopy(int MyRow, int Length, int& NumEntries,
104 double* Values, int* Indices) const;
105
106 virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const
107 {
108 int ierr = A_->ExtractDiagonalCopy(Diagonal);
109 IFPACK_RETURN(ierr);
110 }
111
112 virtual int Multiply(bool TransA, const Epetra_MultiVector& X,
113 Epetra_MultiVector& Y) const;
114
115 virtual int Solve(bool /* Upper */, bool /* Trans */, bool /* UnitDiagonal */,
116 const Epetra_MultiVector& /* X */,
117 Epetra_MultiVector& /* Y */) const
118 {
119 IFPACK_CHK_ERR(-1);
120 }
121
122 virtual int Apply(const Epetra_MultiVector& X,
123 Epetra_MultiVector& Y) const
124 {
125 int ierr = Multiply(UseTranspose(),X,Y);
126 IFPACK_RETURN(ierr);
127 }
128
129 virtual int ApplyInverse(const Epetra_MultiVector& /* X */,
130 Epetra_MultiVector& /* Y */) const
131 {
132 IFPACK_CHK_ERR(-1);
133 }
134
135 virtual int InvRowSums(Epetra_Vector& /* x */) const
136 {
137 IFPACK_CHK_ERR(-1);
138 }
139
140 virtual int LeftScale(const Epetra_Vector& x)
141 {
142 return(A_->LeftScale(x));
143 }
144
145 virtual int InvColSums(Epetra_Vector& /* x */) const
146 {
147 IFPACK_CHK_ERR(-1);;
148 }
149
150 virtual int RightScale(const Epetra_Vector& x)
151 {
152 return(A_->RightScale(x));
153 }
154
155 virtual bool Filled() const
156 {
157 return(A_->Filled());
158 }
159
161 virtual double NormInf() const
162 {
163 return(-1.0);
164 }
165
167 virtual double NormOne() const
168 {
169 return(-1.0);
170 }
171
172#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
173 virtual int NumGlobalNonzeros() const
174 {
175 return(A_->NumGlobalNonzeros());
176 }
177
178 virtual int NumGlobalRows() const
179 {
180 return(A_->NumGlobalRows());
181 }
182
183 virtual int NumGlobalCols() const
184 {
185 return(A_->NumGlobalCols());
186 }
187
188 virtual int NumGlobalDiagonals() const
189 {
190 return(A_->NumGlobalDiagonals());
191 }
192#endif
193
194 virtual long long NumGlobalNonzeros64() const
195 {
196 return(A_->NumGlobalNonzeros64());
197 }
198
199 virtual long long NumGlobalRows64() const
200 {
201 return(A_->NumGlobalRows64());
202 }
203
204 virtual long long NumGlobalCols64() const
205 {
206 return(A_->NumGlobalCols64());
207 }
208
209 virtual long long NumGlobalDiagonals64() const
210 {
211 return(A_->NumGlobalDiagonals64());
212 }
213
214 virtual int NumMyNonzeros() const
215 {
216 return(A_->NumMyNonzeros());
217 }
218
219 virtual int NumMyRows() const
220 {
221 return(A_->NumMyRows());
222 }
223
224 virtual int NumMyCols() const
225 {
226 return(A_->NumMyCols());
227 }
228
229 virtual int NumMyDiagonals() const
230 {
231 return(A_->NumMyDiagonals());
232 }
233
234 virtual bool LowerTriangular() const
235 {
236 return(A_->LowerTriangular());
237 }
238
239 virtual bool UpperTriangular() const
240 {
241 return(A_->UpperTriangular());
242 }
243
244 virtual const Epetra_Map& RowMatrixRowMap() const
245 {
246 return(A_->RowMatrixRowMap());
247 }
248
249 virtual const Epetra_Map& RowMatrixColMap() const
250 {
251 return(A_->RowMatrixColMap());
252 }
253
254 virtual const Epetra_Import* RowMatrixImporter() const
255 {
256 return(A_->RowMatrixImporter());
257 }
258
259 int SetUseTranspose(bool UseTranspose_in)
260 {
261 return(A_->SetUseTranspose(UseTranspose_in));
262 }
263
264 bool UseTranspose() const
265 {
266 return(A_->UseTranspose());
267 }
268
270 bool HasNormInf() const
271 {
272 return(false);
273 }
274
275 const Epetra_Comm& Comm() const
276 {
277 return(A_->Comm());
278 }
279
280 const Epetra_Map& OperatorDomainMap() const
281 {
282 return(A_->OperatorDomainMap());
283 }
284
285 const Epetra_Map& OperatorRangeMap() const
286 {
287 return(A_->OperatorRangeMap());
288 }
289
290 const Epetra_BlockMap& Map() const
291 {
292 return(A_->Map());
293 }
294
295 const char* Label() const{
296 return(A_->Label());
297 }
298
299private:
300
302 Teuchos::RefCountPtr<Epetra_RowMatrix> A_;
304 double AbsoluteThreshold_;
306 double RelativeThreshold_;
308 std::vector<int> pos_;
310 std::vector<double> val_;
311
312};
313
314
315#endif /* IFPACK_DIAGONALFILTER_H */
Ifpack_DiagonalFilter: Filter to modify the diagonal entries of a given Epetra_RowMatrix.
virtual int NumMyRowEntries(int MyRow, int &NumEntries) const
Returns the number of entries in MyRow.
bool HasNormInf() const
Not implemented for efficiency reasons.
virtual double NormInf() const
Not implemented for efficiency reasons.
Ifpack_DiagonalFilter(const Teuchos::RefCountPtr< Epetra_RowMatrix > &Matrix, double AbsoluteThreshold, double RelativeThreshold)
Constructor.
virtual ~Ifpack_DiagonalFilter()
Destructor.
virtual double NormOne() const
Not implemented for efficiency reasons.
virtual int MaxNumEntries() const
Returns the maximum number of entries.