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
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "Ifpack_ConfigDefs.h"
00044 #include "Ifpack_ReorderFilter.h"
00045 #include "Ifpack_Reordering.h"
00046 #include "Epetra_ConfigDefs.h"
00047 #include "Epetra_RowMatrix.h"
00048 #include "Epetra_Comm.h"
00049 #include "Epetra_Map.h"
00050 #include "Epetra_MultiVector.h"
00051 #include "Epetra_Vector.h"
00052
00053
00054 Ifpack_ReorderFilter::Ifpack_ReorderFilter(const Teuchos::RefCountPtr<Epetra_RowMatrix>& Matrix_in,
00055 const Teuchos::RefCountPtr<Ifpack_Reordering>& Reordering_in) :
00056 A_(Matrix_in),
00057 Reordering_(Reordering_in),
00058 NumMyRows_(Matrix_in->NumMyRows()),
00059 MaxNumEntries_(Matrix_in->MaxNumEntries())
00060 {
00061 }
00062
00063
00064 Ifpack_ReorderFilter::Ifpack_ReorderFilter(const Ifpack_ReorderFilter& RHS) :
00065 A_(Matrix()),
00066 Reordering_(Reordering()),
00067 NumMyRows_(RHS.NumMyRows()),
00068 MaxNumEntries_(RHS.MaxNumEntries())
00069 {
00070 strcpy(Label_,RHS.Label());
00071 }
00072
00073
00074 Ifpack_ReorderFilter&
00075 Ifpack_ReorderFilter::operator=(const Ifpack_ReorderFilter& RHS)
00076 {
00077 if (this == &RHS)
00078 return (*this);
00079
00080 A_ = RHS.Matrix();
00081
00082 Reordering_ = RHS.Reordering();
00083 MaxNumEntries_ = RHS.MaxNumEntries();
00084 NumMyRows_ = RHS.NumMyRows();
00085
00086 strcpy(Label_,RHS.Label());
00087 return(*this);
00088 }
00089
00090
00091 int Ifpack_ReorderFilter::
00092 ExtractMyRowCopy(int MyRow, int Length, int & NumEntries,
00093 double *Values, int * Indices) const
00094 {
00095 int MyReorderdRow = Reordering_->InvReorder(MyRow);
00096
00097 IFPACK_CHK_ERR(Matrix()->ExtractMyRowCopy(MyReorderdRow,MaxNumEntries_,
00098 NumEntries, Values,Indices));
00099
00100
00101
00102 for (int i = 0 ; i < NumEntries ; ++i) {
00103 Indices[i] = Reordering_->Reorder(Indices[i]);
00104 }
00105
00106 return(0);
00107 }
00108
00109
00110 int Ifpack_ReorderFilter::
00111 ExtractDiagonalCopy(Epetra_Vector & Diagonal) const
00112 {
00113 Epetra_Vector DiagonalTilde(Diagonal.Map());
00114 IFPACK_CHK_ERR(Matrix()->ExtractDiagonalCopy(DiagonalTilde));
00115 IFPACK_CHK_ERR((Reordering_->P(DiagonalTilde,Diagonal)));
00116 return(0);
00117 }
00118
00119
00120 int Ifpack_ReorderFilter::
00121 Multiply(bool TransA, const Epetra_MultiVector& X,
00122 Epetra_MultiVector& Y) const
00123 {
00124
00125 Epetra_MultiVector Xtilde(X.Map(),X.NumVectors());
00126 Epetra_MultiVector Ytilde(Y.Map(),Y.NumVectors());
00127
00128 Reordering_->Pinv(X,Xtilde);
00129
00130 IFPACK_CHK_ERR(Matrix()->Multiply(TransA,Xtilde,Ytilde));
00131
00132 Reordering_->P(Ytilde,Y);
00133
00134
00135 return(0);
00136 }
00137
00138
00139 int Ifpack_ReorderFilter::
00140 Solve(bool Upper, bool Trans, bool UnitDiagonal,
00141 const Epetra_MultiVector& X, Epetra_MultiVector& Y) const
00142 {
00143 IFPACK_CHK_ERR(-98);
00144 }
00145
00146
00147 int Ifpack_ReorderFilter::
00148 Apply(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const
00149 {
00150 int ierr = Multiply(UseTranspose(),X,Y);
00151 IFPACK_RETURN(ierr);
00152 }