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];
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) {
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)
virtual int ExtractMyRowCopy(int MyRow, int Length, int &NumEntries, double *Values, int *Indices) const
virtual int Multiply(bool TransA, const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
Ifpack_SingletonFilter(const Teuchos::RefCountPtr< Epetra_RowMatrix > &Matrix)
Constructor.
virtual int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
int SolveSingletons(const Epetra_MultiVector &RHS, Epetra_MultiVector &LHS)
std::vector< int > NumEntries_
const Epetra_Comm & Comm() const
virtual int Apply(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
virtual int ExtractDiagonalCopy(Epetra_Vector &Diagonal) const
int PutScalar(double ScalarConstant)
Teuchos::RefCountPtr< Epetra_Vector > Diagonal_
std::vector< int > SingletonIndex_
std::vector< double > Values_
Used in ExtractMyRowCopy, to avoid allocation each time.
#define IFPACK_CHK_ERRV(ifpack_err)
std::vector< int > Indices_
Used in ExtractMyRowCopy, to avoid allocation each time.
std::vector< int > Reorder_
int CreateReducedRHS(const Epetra_MultiVector &LHS, const Epetra_MultiVector &RHS, Epetra_MultiVector &ReducedRHS)
Teuchos::RefCountPtr< Epetra_RowMatrix > A_
Pointer to the matrix to be preconditioned.
Teuchos::RefCountPtr< Epetra_Map > Map_
virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
std::vector< int > InvReorder_
#define IFPACK_CHK_ERR(ifpack_err)
int UpdateLHS(const Epetra_MultiVector &ReducedLHS, Epetra_MultiVector &LHS)