//============================================================================== int Ifpack_IlukGraph::ConstructOverlapGraph() { OverlapGraph_ = Teuchos::rcp( (Epetra_CrsGraph *) &Graph_, false ); OverlapRowMap_ = Teuchos::rcp( (Epetra_BlockMap *) &Graph_.RowMap(), false ); if (LevelOverlap_==0 || !Graph_.DomainMap().DistributedGlobal()) return(0); // Nothing to do Teuchos::RefCountPtr<Epetra_CrsGraph> OldGraph; Teuchos::RefCountPtr<Epetra_BlockMap> OldRowMap; Epetra_BlockMap * DomainMap_tmp = (Epetra_BlockMap *) &Graph_.DomainMap(); Epetra_BlockMap * RangeMap_tmp = (Epetra_BlockMap *) &Graph_.RangeMap(); for (int level=1; level <= LevelOverlap_; level++) { OldGraph = OverlapGraph_; OldRowMap = OverlapRowMap_; OverlapImporter_ = Teuchos::rcp( (Epetra_Import *) OldGraph->Importer(), false ); OverlapRowMap_ = Teuchos::rcp( new Epetra_BlockMap(OverlapImporter_->TargetMap()) ); if (level<LevelOverlap_) OverlapGraph_ = Teuchos::rcp( new Epetra_CrsGraph(Copy, *OverlapRowMap_, 0) ); else // On last iteration, we want to filter out all columns except those that correspond // to rows in the graph. This assures that our matrix is square OverlapGraph_ = Teuchos::rcp( new Epetra_CrsGraph(Copy, *OverlapRowMap_, *OverlapRowMap_, 0) ); EPETRA_CHK_ERR(OverlapGraph_->Import( Graph_, *OverlapImporter_, Insert)); if (level<LevelOverlap_) { EPETRA_CHK_ERR(OverlapGraph_->FillComplete(*DomainMap_tmp, *RangeMap_tmp)); } else { // Copy last OverlapImporter because we will use it later OverlapImporter_ = Teuchos::rcp( new Epetra_Import(*OverlapRowMap_, *DomainMap_tmp) ); EPETRA_CHK_ERR(OverlapGraph_->FillComplete(*DomainMap_tmp, *RangeMap_tmp)); } } NumMyBlockRows_ = OverlapGraph_->NumMyBlockRows(); NumMyBlockCols_ = OverlapGraph_->NumMyBlockCols(); NumMyRows_ = OverlapGraph_->NumMyRows(); NumMyCols_ = OverlapGraph_->NumMyCols(); return(0); }