/****************************************************************************** * Convert CSR matrix format to Parasails matrix format * ******************************************************************************/ Matrix* csrToParaSails(int procID, int *map, int *fg2or, int *or2fg, int *IA, int *JA, double *AElts, MPI_Comm comm) { int i, j; int ncols; int origRow; int rowStart, rangeStart; int rowEnd, rangeEnd; Matrix *newMatrix; rangeStart = map[procID]; rangeEnd = map[procID+1]-1; newMatrix = MatrixCreate(comm, rangeStart, rangeEnd); for (i = rangeStart; i <= rangeEnd; i++) { origRow = fg2or[i]; rowStart = IA[origRow]; rowEnd = IA[origRow+1]-1; ncols = rowEnd - rowStart + 1; for (j=rowStart; j <= rowEnd; j++) { JA[j] = or2fg[JA[j]]; } MatrixSetRow(newMatrix, i, ncols, &JA[rowStart], &AElts[rowStart]); for (j=rowStart; j <= rowEnd; j++) { JA[j] = fg2or[JA[j]]; } } MatrixComplete(newMatrix); return newMatrix; }
static Matrix *convert_matrix(MPI_Comm comm, HYPRE_DistributedMatrix *distmat) { HYPRE_Int beg_row, end_row, row, dummy; HYPRE_Int len, *ind; HYPRE_Real *val; Matrix *mat; HYPRE_DistributedMatrixGetLocalRange(distmat, &beg_row, &end_row, &dummy, &dummy); mat = MatrixCreate(comm, beg_row, end_row); for (row=beg_row; row<=end_row; row++) { HYPRE_DistributedMatrixGetRow(distmat, row, &len, &ind, &val); MatrixSetRow(mat, row, len, ind, val); HYPRE_DistributedMatrixRestoreRow(distmat, row, &len, &ind, &val); } MatrixComplete(mat); #ifdef BALANCE_INFO matvec_timing(comm, mat); balance_info(comm, mat); #endif return mat; }