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_Overlap_CrsGraph.h>
00030
00031 #include <Epetra_Import.h>
00032 #include <Epetra_CrsGraph.h>
00033 #include <Epetra_Map.h>
00034
00035 namespace EpetraExt {
00036
00037 CrsGraph_Overlap::
00038 ~CrsGraph_Overlap()
00039 {
00040 if( newObj_ ) delete newObj_;
00041
00042 if( OverlapMap_ ) delete OverlapMap_;
00043 }
00044
00045 CrsGraph_Overlap::NewTypeRef
00046 CrsGraph_Overlap::
00047 operator()( OriginalTypeRef orig )
00048 {
00049 origObj_ = &orig;
00050
00051
00052 if( orig.DomainMap().DistributedGlobal() && levelOverlap_ )
00053 {
00054 Epetra_CrsGraph * OverlapGraph = new Epetra_CrsGraph( orig );
00055 OverlapMap_ = new Epetra_BlockMap( orig.RowMap() );
00056
00057 Epetra_BlockMap * DomainMap = &(const_cast<Epetra_BlockMap&>(orig.DomainMap()));
00058 Epetra_BlockMap * RangeMap = &(const_cast<Epetra_BlockMap&>(orig.RangeMap()));
00059
00060 for( int level = 0; level < levelOverlap_; ++level )
00061 {
00062 Epetra_BlockMap * OldRowMap = OverlapMap_;
00063 Epetra_CrsGraph * OldGraph = OverlapGraph;
00064
00065 Epetra_Import & OverlapImporter = *(const_cast<Epetra_Import *>( OldGraph->Importer() ));
00066 OverlapMap_ = new Epetra_BlockMap( OverlapImporter.TargetMap() );
00067
00068
00069 if( squareLocalBlock_ && level==(levelOverlap_-1) )
00070 OverlapGraph = new Epetra_CrsGraph( Copy, *OverlapMap_, *OverlapMap_, 0 );
00071 else
00072 OverlapGraph = new Epetra_CrsGraph( Copy, *OverlapMap_, 0 );
00073
00074 OverlapGraph->Import( *OldGraph, OverlapImporter, Insert );
00075 OverlapGraph->FillComplete( *DomainMap, *RangeMap );
00076
00077 delete OldGraph;
00078 delete OldRowMap;
00079 }
00080
00081 newObj_ = OverlapGraph;
00082 }
00083 else
00084 newObj_ = new Epetra_CrsGraph( orig );
00085
00086 return *newObj_;
00087 }
00088
00089 }