HYPRE_Int hypre_ParaSailsBuildIJMatrix(hypre_ParaSails obj, HYPRE_IJMatrix *pij_A) { hypre_ParaSails_struct *internal = (hypre_ParaSails_struct *) obj; ParaSails *ps = internal->ps; Matrix *mat = internal->ps->M; HYPRE_Int *diag_sizes, *offdiag_sizes, local_row, i, j; HYPRE_Int size; HYPRE_Int *col_inds; HYPRE_Real *values; HYPRE_IJMatrixCreate( ps->comm, ps->beg_row, ps->end_row, ps->beg_row, ps->end_row, pij_A ); HYPRE_IJMatrixSetObjectType( *pij_A, HYPRE_PARCSR ); diag_sizes = hypre_CTAlloc(HYPRE_Int, ps->end_row - ps->beg_row + 1); offdiag_sizes = hypre_CTAlloc(HYPRE_Int, ps->end_row - ps->beg_row + 1); local_row = 0; for (i=ps->beg_row; i<= ps->end_row; i++) { MatrixGetRow(mat, local_row, &size, &col_inds, &values); NumberingLocalToGlobal(ps->numb, size, col_inds, col_inds); for (j=0; j < size; j++) { if (col_inds[j] < ps->beg_row || col_inds[j] > ps->end_row) offdiag_sizes[local_row]++; else diag_sizes[local_row]++; } local_row++; } HYPRE_IJMatrixSetDiagOffdSizes( *pij_A, (const HYPRE_Int *) diag_sizes, (const HYPRE_Int *) offdiag_sizes ); hypre_TFree(diag_sizes); hypre_TFree(offdiag_sizes); HYPRE_IJMatrixInitialize( *pij_A ); local_row = 0; for (i=ps->beg_row; i<= ps->end_row; i++) { MatrixGetRow(mat, local_row, &size, &col_inds, &values); HYPRE_IJMatrixSetValues( *pij_A, 1, &size, &i, (const HYPRE_Int *) col_inds, (const HYPRE_Real *) values ); NumberingGlobalToLocal(ps->numb, size, col_inds, col_inds); local_row++; } HYPRE_IJMatrixAssemble( *pij_A ); return hypre_error_flag; }
void LoadBalRecipRecv(MPI_Comm comm, Numbering *numb, int num_taken, RecipData *recip_data) { int i, row; int count; MPI_Status status; int *buffer, *bufferp; int beg_row, end_row; int len; for (i=0; i<num_taken; i++) { MPI_Probe(MPI_ANY_SOURCE, LOADBAL_REQ_TAG, comm, &status); recip_data[i].pe = status.MPI_SOURCE; MPI_Get_count(&status, MPI_INT, &count); buffer = (int *) malloc(count * sizeof(int)); MPI_Recv(buffer, count, MPI_INT, recip_data[i].pe, LOADBAL_REQ_TAG, comm, &status); bufferp = buffer; beg_row = *bufferp++; end_row = *bufferp++; recip_data[i].mat = MatrixCreateLocal(beg_row, end_row); /* Set the indices of the local matrix containing donated rows */ for (row=beg_row; row<=end_row; row++) { len = *bufferp++; NumberingGlobalToLocal(numb, len, bufferp, bufferp); MatrixSetRow(recip_data[i].mat, row, len, bufferp, NULL); bufferp += len; } free(buffer); } }