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 #include <EpetraExt_View_CrsMatrix.h>
00030
00031 #include <Epetra_CrsGraph.h>
00032 #include <Epetra_CrsMatrix.h>
00033
00034 namespace EpetraExt {
00035
00036 CrsMatrix_View::
00037 ~CrsMatrix_View()
00038 {
00039 if( newObj_ ) delete newObj_;
00040 }
00041
00042 CrsMatrix_View::NewTypeRef
00043 CrsMatrix_View::
00044 operator()( OriginalTypeRef orig )
00045 {
00046 origObj_ = &orig;
00047
00048 if( orig.IndicesAreGlobal() ) cout << "EDT_CrsMatrix_View: Indices must be LOCAL!\n";
00049 assert( !orig.IndicesAreGlobal() );
00050
00051
00052
00053
00054 Epetra_CrsMatrix * newMatrix( new Epetra_CrsMatrix( View, NewGraph_ ) );
00055
00056
00057 int * myIndices;
00058 double * myValues;
00059 int indicesCnt;
00060 int numMyRows = newMatrix->NumMyRows();
00061 for( int i = 0; i < numMyRows; ++i )
00062 {
00063 orig.ExtractMyRowView( i, indicesCnt, myValues, myIndices );
00064
00065 int newIndicesCnt = indicesCnt;
00066 bool done = false;
00067 for( int j = 0; j < indicesCnt; ++j )
00068 if( !done && NewGraph_.GCID( myIndices[j] ) == -1 )
00069 {
00070 newIndicesCnt = j;
00071 done = true;
00072 }
00073
00074 newMatrix->InsertMyValues( i, newIndicesCnt, myValues, myIndices );
00075 }
00076
00077 newMatrix->FillComplete();
00078
00079 newObj_ = newMatrix;
00080
00081 return *newMatrix;
00082 }
00083
00084 }
00085