void BlockUtility::TGenerateRowStencil(const Epetra_CrsGraph& LocalBlockGraph, std::vector<int_type> RowIndices, std::vector< std::vector<int_type> >& RowStencil) { // Get row indices int NumMyRows = LocalBlockGraph.NumMyRows(); RowIndices.resize(NumMyRows); const Epetra_BlockMap& RowMap = LocalBlockGraph.RowMap(); RowMap.MyGlobalElements(&RowIndices[0]); // Get stencil RowStencil.resize(NumMyRows); if (LocalBlockGraph.IndicesAreGlobal()) { for (int i=0; i<NumMyRows; i++) { int_type Row = RowIndices[i]; int NumCols = LocalBlockGraph.NumGlobalIndices(Row); RowStencil[i].resize(NumCols); LocalBlockGraph.ExtractGlobalRowCopy(Row, NumCols, NumCols, &RowStencil[i][0]); for (int k=0; k<NumCols; k++) RowStencil[i][k] -= Row; } } else { for (int i=0; i<NumMyRows; i++) { int NumCols = LocalBlockGraph.NumMyIndices(i); std::vector<int> RowStencil_local(NumCols); RowStencil[i].resize(NumCols); LocalBlockGraph.ExtractMyRowCopy(i, NumCols, NumCols, &RowStencil_local[0]); for (int k=0; k<NumCols; k++) RowStencil[i][k] = (int_type) ((int) (LocalBlockGraph.GCID64(RowStencil_local[k]) - RowIndices[i])); } } }
//============================================================================== int checkSharedOwnership(Epetra_Comm& Comm, bool verbose) { // check to make sure each function returns 1 when it should // check to make sure each function doesn't return 1 when it shouldn't int ierr = 0; // initialize Map const int NumMyElements = 10; const int IndexBase = 0; Epetra_Map Map1((long long) -1, NumMyElements, IndexBase, Comm); // initialize Graphs const int NumIndicesPerRow = 5; Epetra_CrsGraph * SoleOwner = new Epetra_CrsGraph(Copy, Map1, Map1, NumIndicesPerRow); Epetra_CrsGraph SharedOrig(Copy, Map1, Map1, NumIndicesPerRow); Epetra_CrsGraph SharedOwner(SharedOrig); // arrays used by Insert & Remove Epetra_IntSerialDenseVector array1(2); array1[0] = NumIndicesPerRow / 2; array1[1] = array1[0] + 1; Epetra_LongLongSerialDenseVector array2(NumIndicesPerRow); for(int i = 0; i < NumIndicesPerRow; i++) array2[i] = i; // output variables (declaring them here lets us comment out indiv. tests) int soleOutput, sharedOutput; // InsertMyIndices if(verbose) cout << "InsertMyIndices..." << endl; soleOutput = SoleOwner->InsertMyIndices(0, 2, array1.Values()); sharedOutput = SharedOwner.InsertMyIndices(0, 2, array1.Values()); EPETRA_TEST_ERR(!(soleOutput == 0), ierr); EPETRA_TEST_ERR(!(sharedOutput == 1), ierr); if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; // RemoveMyIndices (#0) if(verbose) cout << "RemoveMyIndices(#0)..." << endl; soleOutput = SoleOwner->RemoveMyIndices(0); EPETRA_TEST_ERR(!(soleOutput == 0), ierr); EPETRA_TEST_ERR(!(SoleOwner->NumMyIndices(0)==0),ierr); if (ierr != 0) cout << "tests FAILED" << std::endl; soleOutput = SoleOwner->InsertMyIndices(0, 2, array1.Values()); EPETRA_TEST_ERR(!(soleOutput == 0), ierr); // SortIndices //if(verbose) cout << "SortIndices..." << endl; //soleOutput = SoleOwner.SortIndices(); //sharedOutput = SharedOwner.SortIndices(); //EPETRA_TEST_ERR(!(soleOutput == 0), ierr); //EPETRA_TEST_ERR(!(sharedOutput == 1), ierr); //if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; // RemoveRedundantIndices //if(verbose) cout << "RemoveRedundantIndices..." << endl; //SoleOwner.InsertGlobalIndices(0, 1, array1.Values()); //SharedOwner.InsertGlobalIndices(0, 1, array1.Values()); //soleOutput = SoleOwner.RemoveRedundantIndices(); //sharedOutput = SharedOwner.RemoveRedundantIndices(); //EPETRA_TEST_ERR(!(soleOutput == 0), ierr); //EPETRA_TEST_ERR(!(sharedOutput == 1), ierr); //if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; // FillComplete (#1) if(verbose) cout << "FillComplete..." << endl; soleOutput = SoleOwner->FillComplete(); sharedOutput = SharedOwner.FillComplete(); EPETRA_TEST_ERR(!(soleOutput == 0), ierr); EPETRA_TEST_ERR(!(sharedOutput == 1), ierr); if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; // OptimizeStorage if(verbose) cout << "OptimizeStorage..." << endl; soleOutput = SoleOwner->OptimizeStorage(); sharedOutput = SharedOwner.OptimizeStorage(); EPETRA_TEST_ERR(!(soleOutput == 0), ierr); EPETRA_TEST_ERR(!(sharedOutput == 0), ierr); if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; // RemoveMyIndices (#1) if(verbose) cout << "RemoveMyIndices..." << endl; soleOutput = SoleOwner->RemoveMyIndices(0, 1, &array1[1]); sharedOutput = SharedOwner.RemoveMyIndices(0, 1, &array1[1]); EPETRA_TEST_ERR(!(soleOutput == -1), ierr); EPETRA_TEST_ERR(!(sharedOutput == -1), ierr); if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; // RemoveMyIndices (#2) if(verbose) cout << "RemoveMyIndices(#2)..." << endl; soleOutput = SoleOwner->RemoveMyIndices(0); sharedOutput = SharedOwner.RemoveMyIndices(0); EPETRA_TEST_ERR(!(soleOutput == -1), ierr); EPETRA_TEST_ERR(!(sharedOutput == -1), ierr); if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; // FillComplete (#2) if(verbose) cout << "FillComplete(#2)..." << endl; soleOutput = SoleOwner->FillComplete(SoleOwner->DomainMap(), SoleOwner->RangeMap()); sharedOutput = SharedOwner.FillComplete(SharedOwner.DomainMap(), SharedOwner.RangeMap()); EPETRA_TEST_ERR(!(soleOutput == 0), ierr); EPETRA_TEST_ERR(!(sharedOutput == 1), ierr); if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; { // make new Graphs so that we can insert Global instead of Local // inside of new scope so that we can use same names Epetra_CrsGraph SoleOwnerG(Copy, Map1, NumIndicesPerRow); Epetra_CrsGraph SharedOrigG(Copy, Map1, NumIndicesPerRow); Epetra_CrsGraph SharedOwnerG(SharedOrig); long long GlobalRow = SoleOwnerG.GRID64(0); // InsertGlobalIndices if(verbose) cout << "InsertGlobalIndices..." << endl; soleOutput = SoleOwnerG.InsertGlobalIndices(GlobalRow, 2, array2.Values()); sharedOutput = SharedOwnerG.InsertGlobalIndices(GlobalRow, 2, array2.Values()); EPETRA_TEST_ERR(!(soleOutput == 0), ierr); EPETRA_TEST_ERR(!(sharedOutput == 1), ierr); if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; // RemoveGlobalIndices (#1) if(verbose) cout << "RemoveGlobalIndices..." << endl; soleOutput = SoleOwnerG.RemoveGlobalIndices(GlobalRow, 1, &array2[1]); sharedOutput = SharedOwnerG.RemoveGlobalIndices(GlobalRow, 1, &array2[1]); EPETRA_TEST_ERR(!(soleOutput == 0), ierr); EPETRA_TEST_ERR(!(sharedOutput == 1), ierr); if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; // RemoveGlobalIndices (#2) if(verbose) cout << "RemoveGlobalIndices(#2)..." << endl; soleOutput = SoleOwnerG.RemoveGlobalIndices(GlobalRow); sharedOutput = SharedOwnerG.RemoveGlobalIndices(GlobalRow); EPETRA_TEST_ERR(!(soleOutput == 0), ierr); EPETRA_TEST_ERR(!(sharedOutput == 1), ierr); if(verbose && ierr > 0) cout << "soleOutput = " << soleOutput << " sharedOutput = " << sharedOutput << endl; } // *PROT* InsertIndices // *PROT* MakeIndicesLocal delete SoleOwner; return(ierr); }
void show_matrix(const char *txt, const Epetra_CrsGraph &graph, const Epetra_Comm &comm) { int me = comm.MyPID(); if (comm.NumProc() > 10){ if (me == 0){ std::cerr << txt << std::endl; std::cerr << "Printed matrix format only works for 10 or fewer processes" << std::endl; } return; } const Epetra_BlockMap &rowmap = graph.RowMap(); const Epetra_BlockMap &colmap = graph.ColMap(); int myRows = rowmap.NumMyElements(); int numRows = graph.NumGlobalRows(); int numCols = graph.NumGlobalCols(); int base = rowmap.IndexBase(); if ((numRows > 200) || (numCols > 500)){ if (me == 0){ std::cerr << txt << std::endl; std::cerr << "show_matrix: problem is too large to display" << std::endl; } return; } int *myA = new int [numRows * numCols]; memset(myA, 0, sizeof(int) * numRows * numCols); int *myIndices; int *myRowGIDs = rowmap.MyGlobalElements(); for (int i=0; i< myRows; i++){ int myRowLID = rowmap.LID(myRowGIDs[i]); int numEntries = graph.NumMyIndices(myRowLID); if (numEntries > 0){ int rc = graph.ExtractMyRowView(myRowLID, numEntries, myIndices); if (rc){ std::cerr << txt << std::endl; std::cerr << "extract graph error" << std::endl; return; } int *row = myA + (numCols * (myRowGIDs[i] - base)); for (int j=0; j < numEntries; j++){ int gid = colmap.GID(myIndices[j]); row[gid-base] = me+1; } } } printMatrix(txt, myA, NULL, NULL, numRows, numCols, comm); delete [] myA; }
void Epetra_OffsetIndex::GenerateRemoteOffsets_( const Epetra_CrsGraph & SourceGraph, const Epetra_CrsGraph & TargetGraph, const int * ExportLIDs, const int * RemoteLIDs, Epetra_Distributor & Distor ) { int numProcs = SourceGraph.RowMap().Comm().NumProc(); if (numProcs < 2) { return; } const int GlobalMaxNumIndices = SourceGraph.GlobalMaxNumIndices(); int NumIndices; /* "Indices" appears to be unused -- [email protected] int * Indices = 0; if( GlobalMaxNumIndices>0 ) Indices = new int[GlobalMaxNumIndices]; */ //Pack Source Rows int * Sizes = 0; if( NumExport_ > 0 ) Sizes = new int[NumExport_]; int TotalSize = 0; for( int i = 0; i < NumExport_; ++i ) { Sizes[i] = SourceGraph.NumMyIndices(ExportLIDs[i]) + 1; TotalSize += Sizes[i]; } int_type * SourceArray = new int_type[TotalSize+1]; int Loc = 0; for( int i = 0; i < NumExport_; ++i ) { int_type GID = (int_type) SourceGraph.GRID64(ExportLIDs[i]); SourceArray[Loc] = Sizes[i]-1; SourceGraph.ExtractGlobalRowCopy( GID, GlobalMaxNumIndices, NumIndices, &(SourceArray[Loc+1]) ); Loc += Sizes[i]; } //Push to Target char * cRecvArray = 0; int_type * RecvArray = 0; int RecvArraySize = 0; Distor.Do( reinterpret_cast<char *>(SourceArray), (int)sizeof(int_type), Sizes, RecvArraySize, cRecvArray ); RecvArray = reinterpret_cast<int_type*>(cRecvArray); //Construct RemoteOffsets if( NumRemote_ > 0 ) RemoteOffsets_ = new int*[NumRemote_]; for( int i = 0; i < NumRemote_; ++i ) RemoteOffsets_[i] = 0; Loc = 0; for( int i = 0; i < NumRemote_; ++i ) { NumIndices = (int) RecvArray[Loc]; RemoteOffsets_[i] = new int[NumIndices]; ++Loc; int FLoc = 0; int Start = 0; for( int j = 0; j < NumIndices; ++j ) { Start = FLoc; if( TargetGraph.FindGlobalIndexLoc(RemoteLIDs[i],RecvArray[Loc],Start,FLoc) ) RemoteOffsets_[i][j] = FLoc; else RemoteOffsets_[i][j] = -1; ++Loc; } } /* "Indices" appears to be unused -- [email protected] if( GlobalMaxNumIndices>0 ) delete [] Indices; */ if( Sizes ) delete [] Sizes; if( SourceArray ) delete [] SourceArray; if( RecvArraySize ) delete [] cRecvArray; }