int compute_hypergraph_metrics(const Epetra_CrsGraph &graph, Isorropia::Epetra::CostDescriber &costs, double &myGoalWeight, double &balance, double &cutn, double &cutl) // output { return compute_hypergraph_metrics(graph.RowMap(), graph.ColMap(), graph.NumGlobalCols(), costs, myGoalWeight, balance, cutn, cutl); }
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; }