45 #include "Epetra_ConfigDefs.h"
46 #include "Epetra_RowMatrix.h"
47 #include "Epetra_Comm.h"
48 #include "Epetra_Map.h"
49 #include "Epetra_MultiVector.h"
50 #include "Epetra_Vector.h"
51 #include "Epetra_Import.h"
67 if (
A_->Comm().NumProc() != 1) {
68 cerr <<
"Ifpack_SingletonFilter can be used with Comm().NumProc() == 1" << endl;
69 cerr <<
"only. This class is a tool for Ifpack_AdditiveSchwarz," << endl;
70 cerr <<
"and it is not meant to be used otherwise." << endl;
74 if ((
A_->NumMyRows() !=
A_->NumGlobalRows64()) ||
75 (
A_->NumMyRows() !=
A_->NumMyCols()))
113 for (
int i = 0 ; i <
A_->NumMyRows() ; ++i) {
133 #if !defined(EPETRA_NO_32BIT_GLOBAL_INDICES) || !defined(EPETRA_NO_64BIT_GLOBAL_INDICES)
141 A_->ExtractDiagonalCopy(Diagonal);
142 for (
int i = 0 ; i <
NumRows_ ; ++i) {
144 (*Diagonal_)[i] = Diagonal[ii];
152 double *Values,
int * Indices)
const
163 for (
int i = 0 ; i < Nnz ; ++i) {
166 Indices[NumEntries] = ii;
167 Values[NumEntries] =
Values_[i];
189 if (NumVectors != Y.NumVectors())
198 for (
int i = 0 ; i <
A_->NumMyRows() ; ++i) {
205 &Values[0], &Indices[0]);
209 for (
int k = 0 ; k < Nnz ; ++k) {
211 Y[j][i] += Values[k] * X[j][
Reorder_[Indices[k]]];
218 for (
int k = 0 ; k < Nnz ; ++k) {
220 Y[j][
Reorder_[Indices[k]]] += Values[k] * X[j][i];
263 for (
int j = 0 ; j < Nnz ; ++j) {
265 for (
int k = 0 ; k < LHS.NumVectors() ; ++k)
266 LHS[k][ii] = RHS[k][ii] /
Values_[j];
282 for (
int i = 0 ; i <
NumRows_ ; ++i)
286 for (
int i = 0 ; i <
NumRows_ ; ++i) {
292 for (
int j = 0 ; j < Nnz ; ++j) {
307 for (
int i = 0 ; i <
NumRows_ ; ++i)
308 for (
int k = 0 ; k < LHS.NumVectors() ; ++k)
Ifpack_SingletonFilter(const Teuchos::RefCountPtr< Epetra_RowMatrix > &Matrix)
Constructor.
int SolveSingletons(const Epetra_MultiVector &RHS, Epetra_MultiVector &LHS)
virtual int Apply(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
std::vector< int > NumEntries_
Teuchos::RefCountPtr< Epetra_Vector > Diagonal_
std::vector< int > SingletonIndex_
std::vector< double > Values_
Used in ExtractMyRowCopy, to avoid allocation each time.
virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
virtual int Multiply(bool TransA, const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
#define IFPACK_CHK_ERRV(ifpack_err)
const Epetra_Comm & Comm() const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
std::vector< int > Indices_
Used in ExtractMyRowCopy, to avoid allocation each time.
std::vector< int > Reorder_
virtual int ExtractMyRowCopy(int MyRow, int Length, int &NumEntries, double *Values, int *Indices) const
int CreateReducedRHS(const Epetra_MultiVector &LHS, const Epetra_MultiVector &RHS, Epetra_MultiVector &ReducedRHS)
virtual int ExtractDiagonalCopy(Epetra_Vector &Diagonal) const
Teuchos::RefCountPtr< Epetra_RowMatrix > A_
Pointer to the matrix to be preconditioned.
Teuchos::RefCountPtr< Epetra_Map > Map_
std::vector< int > InvReorder_
#define IFPACK_CHK_ERR(ifpack_err)
int UpdateLHS(const Epetra_MultiVector &ReducedLHS, Epetra_MultiVector &LHS)
virtual int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const