00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "Ifpack_ConfigDefs.h"
00031 #include "Ifpack_ReorderFilter.h"
00032 #include "Ifpack_Reordering.h"
00033 #include "Epetra_ConfigDefs.h"
00034 #include "Epetra_RowMatrix.h"
00035 #include "Epetra_Comm.h"
00036 #include "Epetra_Map.h"
00037 #include "Epetra_MultiVector.h"
00038 #include "Epetra_Vector.h"
00039
00040
00041 Ifpack_ReorderFilter::Ifpack_ReorderFilter(const Teuchos::RefCountPtr<Epetra_RowMatrix>& Matrix_in,
00042 const Teuchos::RefCountPtr<Ifpack_Reordering>& Reordering_in) :
00043 A_(Matrix_in),
00044 Reordering_(Reordering_in),
00045 NumMyRows_(Matrix_in->NumMyRows()),
00046 MaxNumEntries_(Matrix_in->MaxNumEntries())
00047 {
00048 }
00049
00050
00051 Ifpack_ReorderFilter::Ifpack_ReorderFilter(const Ifpack_ReorderFilter& RHS) :
00052 A_(Matrix()),
00053 Reordering_(Reordering()),
00054 NumMyRows_(RHS.NumMyRows()),
00055 MaxNumEntries_(RHS.MaxNumEntries())
00056 {
00057 strcpy(Label_,RHS.Label());
00058 }
00059
00060
00061 Ifpack_ReorderFilter&
00062 Ifpack_ReorderFilter::operator=(const Ifpack_ReorderFilter& RHS)
00063 {
00064 if (this == &RHS)
00065 return (*this);
00066
00067 A_ = RHS.Matrix();
00068
00069 Reordering_ = RHS.Reordering();
00070 MaxNumEntries_ = RHS.MaxNumEntries();
00071 NumMyRows_ = RHS.NumMyRows();
00072
00073 strcpy(Label_,RHS.Label());
00074 return(*this);
00075 }
00076
00077
00078 int Ifpack_ReorderFilter::
00079 ExtractMyRowCopy(int MyRow, int Length, int & NumEntries,
00080 double *Values, int * Indices) const
00081 {
00082 int MyReorderdRow = Reordering_->InvReorder(MyRow);
00083
00084 IFPACK_CHK_ERR(Matrix()->ExtractMyRowCopy(MyReorderdRow,MaxNumEntries_,
00085 NumEntries, Values,Indices));
00086
00087
00088
00089 for (int i = 0 ; i < NumEntries ; ++i) {
00090 Indices[i] = Reordering_->Reorder(Indices[i]);
00091 }
00092
00093 return(0);
00094 }
00095
00096
00097 int Ifpack_ReorderFilter::
00098 ExtractDiagonalCopy(Epetra_Vector & Diagonal) const
00099 {
00100 Epetra_Vector DiagonalTilde(Diagonal.Map());
00101 IFPACK_CHK_ERR(Matrix()->ExtractDiagonalCopy(DiagonalTilde));
00102 IFPACK_CHK_ERR((Reordering_->P(DiagonalTilde,Diagonal)));
00103 return(0);
00104 }
00105
00106
00107 int Ifpack_ReorderFilter::
00108 Multiply(bool TransA, const Epetra_MultiVector& X,
00109 Epetra_MultiVector& Y) const
00110 {
00111
00112 Epetra_MultiVector Xtilde(X.Map(),X.NumVectors());
00113 Epetra_MultiVector Ytilde(Y.Map(),Y.NumVectors());
00114
00115 Reordering_->Pinv(X,Xtilde);
00116
00117 IFPACK_CHK_ERR(Matrix()->Multiply(TransA,Xtilde,Ytilde));
00118
00119 Reordering_->P(Ytilde,Y);
00120
00121
00122 return(0);
00123 }
00124
00125
00126 int Ifpack_ReorderFilter::
00127 Solve(bool Upper, bool Trans, bool UnitDiagonal,
00128 const Epetra_MultiVector& X, Epetra_MultiVector& Y) const
00129 {
00130 IFPACK_CHK_ERR(-98);
00131 }
00132
00133
00134 int Ifpack_ReorderFilter::
00135 Apply(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const
00136 {
00137 IFPACK_RETURN(Multiply(UseTranspose(),X,Y));
00138 }