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_MapColoringIndex.h>
00030
00031 #include <Epetra_CrsGraph.h>
00032 #include <Epetra_MapColoring.h>
00033 #include <Epetra_IntVector.h>
00034 #include <Epetra_Map.h>
00035
00036 #include <vector>
00037 #include <map>
00038
00039 using std::vector;
00040 using std::map;
00041
00042 namespace EpetraExt {
00043
00044 CrsGraph_MapColoringIndex::NewTypeRef
00045 CrsGraph_MapColoringIndex::
00046 operator()( OriginalTypeRef orig )
00047 {
00048 origObj_ = &orig;
00049
00050 const Epetra_BlockMap & RowMap = orig.RowMap();
00051 int nRows = RowMap.NumMyElements();
00052
00053 int NumColors = ColorMap_.NumColors();
00054 int * ListOfColors = ColorMap_.ListOfColors();
00055
00056 map<int,int> MapOfColors;
00057 for( int i = 0; i < NumColors; ++i ) MapOfColors[ ListOfColors[i] ] = i;
00058
00059
00060 vector<int> dummy( nRows, -1 );
00061 NewTypePtr IndexVec = new NewType( NumColors, Epetra_IntVector( Copy, RowMap, &dummy[0] ) );
00062
00063 int MaxNumIndices = orig.MaxNumIndices();
00064 int NumIndices;
00065 vector<int> Indices( MaxNumIndices );
00066
00067 for( int i = 0; i < nRows; ++i )
00068 {
00069 orig.ExtractGlobalRowCopy( orig.GRID(i), MaxNumIndices, NumIndices, &Indices[0] );
00070
00071 for( int j = 0; j < NumIndices; ++j )
00072 (*IndexVec)[ MapOfColors[ColorMap_(Indices[j])] ][i] = Indices[j];
00073 }
00074
00075 newObj_ = IndexVec;
00076
00077 return *IndexVec;
00078 }
00079
00080 }
00081