Ifpack_ReorderFilter.cpp

00001 #include "Ifpack_ConfigDefs.h"
00002 #include "Ifpack_ReorderFilter.h"
00003 #include "Ifpack_Reordering.h"
00004 #include "Epetra_ConfigDefs.h"
00005 #include "Epetra_RowMatrix.h"
00006 #include "Epetra_Comm.h"
00007 #include "Epetra_Map.h"
00008 #include "Epetra_MultiVector.h"
00009 #include "Epetra_Vector.h"
00010 
00011 //==============================================================================
00012 Ifpack_ReorderFilter::Ifpack_ReorderFilter(Epetra_RowMatrix* Matrix,
00013                                            Ifpack_Reordering* Reordering) :
00014   A_(Matrix),
00015   Reordering_(Reordering),
00016   NumMyRows_(Matrix->NumMyRows()),
00017   MaxNumEntries_(Matrix->MaxNumEntries())
00018 {
00019 }
00020 
00021 //==============================================================================
00022 Ifpack_ReorderFilter::Ifpack_ReorderFilter(const Ifpack_ReorderFilter& RHS) :
00023   A_(&RHS.Matrix()),
00024   Reordering_(&RHS.Reordering()),
00025   NumMyRows_(RHS.NumMyRows()),
00026   MaxNumEntries_(RHS.MaxNumEntries())
00027 {
00028   strcpy(Label_,RHS.Label());
00029 }
00030 
00031 //==============================================================================
00032 Ifpack_ReorderFilter::~Ifpack_ReorderFilter()
00033 {
00034 }
00035 
00036 //==============================================================================
00037 Ifpack_ReorderFilter& 
00038 Ifpack_ReorderFilter::operator=(const Ifpack_ReorderFilter& RHS)
00039 {
00040   if (this == &RHS)
00041     return (*this);
00042 
00043   A_ = &RHS.Matrix();
00044 
00045   Reordering_ = &RHS.Reordering();
00046   MaxNumEntries_ = RHS.MaxNumEntries();
00047   NumMyRows_ = RHS.NumMyRows();
00048 
00049   strcpy(Label_,RHS.Label());
00050   return(*this);
00051 }
00052 
00053 //==============================================================================
00054 int Ifpack_ReorderFilter::
00055 ExtractMyRowCopy(int MyRow, int Length, int & NumEntries, 
00056                  double *Values, int * Indices) const
00057 {
00058   int MyReorderdRow = Reordering_->InvReorder(MyRow);
00059 
00060   IFPACK_CHK_ERR(Matrix().ExtractMyRowCopy(MyReorderdRow,MaxNumEntries_,
00061                                            NumEntries, Values,Indices));
00062 
00063   // suppose all elements are local. Note that now
00064   // Indices can have indices in non-increasing order.
00065   for (int i = 0 ; i < NumEntries ; ++i) {
00066     Indices[i] = Reordering_->Reorder(Indices[i]);
00067   }
00068 
00069   return(0);
00070 }
00071 
00072 //==============================================================================
00073 int Ifpack_ReorderFilter::
00074 ExtractDiagonalCopy(Epetra_Vector & Diagonal) const
00075 {
00076   Epetra_Vector DiagonalTilde(Diagonal.Map());
00077   IFPACK_CHK_ERR(Matrix().ExtractDiagonalCopy(DiagonalTilde));
00078   IFPACK_CHK_ERR((Reordering_->P(DiagonalTilde,Diagonal)));
00079   return(0);
00080 }
00081 
00082 //==============================================================================
00083 int Ifpack_ReorderFilter::
00084 Multiply(bool TransA, const Epetra_MultiVector& X, 
00085          Epetra_MultiVector& Y) const
00086 {
00087   // need two additional vectors
00088   Epetra_MultiVector Xtilde(X.Map(),X.NumVectors());
00089   Epetra_MultiVector Ytilde(Y.Map(),Y.NumVectors());
00090   // bring X back to original ordering
00091   Reordering_->Pinv(X,Xtilde);
00092   // apply original matrix
00093   IFPACK_CHK_ERR(Matrix().Multiply(TransA,Xtilde,Ytilde));
00094   // now reorder result
00095   Reordering_->P(Ytilde,Y);
00096 
00097 
00098   return(0);
00099 }
00100 
00101 //==============================================================================
00102 int Ifpack_ReorderFilter::
00103 Solve(bool Upper, bool Trans, bool UnitDiagonal, 
00104       const Epetra_MultiVector& X, Epetra_MultiVector& Y) const
00105 {
00106   IFPACK_CHK_ERR(-98);
00107 }
00108 
00109 //==============================================================================
00110 int Ifpack_ReorderFilter::
00111 Apply(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const
00112 {
00113   IFPACK_RETURN(Multiply(UseTranspose(),X,Y));
00114 }

Generated on Thu Sep 18 12:37:08 2008 for IFPACK by doxygen 1.3.9.1