HYPRE_Int hypre_ParCSRBooleanMatrixDestroy( hypre_ParCSRBooleanMatrix *matrix ) { HYPRE_Int ierr=0; if (matrix) { if ( hypre_ParCSRBooleanMatrix_Get_OwnsData(matrix) ) { hypre_CSRBooleanMatrixDestroy(hypre_ParCSRBooleanMatrix_Get_Diag(matrix)); hypre_CSRBooleanMatrixDestroy(hypre_ParCSRBooleanMatrix_Get_Offd(matrix)); if (hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix)) hypre_TFree(hypre_ParCSRBooleanMatrix_Get_ColMapOffd(matrix)); if (hypre_ParCSRBooleanMatrix_Get_CommPkg(matrix)) hypre_MatvecCommPkgDestroy(hypre_ParCSRBooleanMatrix_Get_CommPkg(matrix)); } if ( hypre_ParCSRBooleanMatrix_Get_OwnsRowStarts(matrix) ) hypre_TFree(hypre_ParCSRBooleanMatrix_Get_RowStarts(matrix)); if ( hypre_ParCSRBooleanMatrix_Get_OwnsColStarts(matrix) ) hypre_TFree(hypre_ParCSRBooleanMatrix_Get_ColStarts(matrix)); hypre_TFree(hypre_ParCSRBooleanMatrix_Get_Rowindices(matrix)); hypre_TFree(matrix); } return ierr; }
HYPRE_Int main( HYPRE_Int argc, char *argv[] ) { hypre_ParCSRBooleanMatrix *A; hypre_ParCSRBooleanMatrix *C; hypre_CSRBooleanMatrix *As; HYPRE_Int *row_starts, *col_starts; HYPRE_Int num_procs, my_id; /* Initialize MPI */ hypre_MPI_Init(&argc, &argv); hypre_MPI_Comm_size(hypre_MPI_COMM_WORLD,&num_procs); hypre_MPI_Comm_rank(hypre_MPI_COMM_WORLD,&my_id); row_starts = NULL; col_starts = NULL; if (my_id == 0) { As = hypre_CSRBooleanMatrixRead("inpr"); hypre_printf(" read input A\n"); } A = hypre_CSRBooleanMatrixToParCSRBooleanMatrix(hypre_MPI_COMM_WORLD, As, row_starts, col_starts); row_starts = hypre_ParCSRBooleanMatrix_Get_RowStarts(A); col_starts = hypre_ParCSRBooleanMatrix_Get_ColStarts(A); hypre_ParCSRBooleanMatrixPrint(A, "echo_A" ); hypre_ParCSRBooleanMatrixPrintIJ(A, "echo_AIJ" ); C = hypre_ParBooleanAAt( A ); hypre_ParCSRBooleanMatrixPrint(C, "result"); hypre_ParCSRBooleanMatrixPrintIJ(C, "resultIJ"); if (my_id == 0) { hypre_CSRBooleanMatrixDestroy(As); } hypre_ParCSRBooleanMatrixDestroy(A); hypre_ParCSRBooleanMatrixDestroy(C); hypre_MPI_Finalize(); return 0; }
hypre_ParCSRBooleanMatrix * hypre_CSRBooleanMatrixToParCSRBooleanMatrix ( MPI_Comm comm, hypre_CSRBooleanMatrix *A, HYPRE_Int *row_starts, HYPRE_Int *col_starts ) { HYPRE_Int global_data[2]; HYPRE_Int global_num_rows; HYPRE_Int global_num_cols; HYPRE_Int *local_num_rows; HYPRE_Int num_procs, my_id; HYPRE_Int *local_num_nonzeros; HYPRE_Int num_nonzeros; HYPRE_Int *a_i; HYPRE_Int *a_j; hypre_CSRBooleanMatrix *local_A; hypre_MPI_Request *requests; hypre_MPI_Status *status, status0; hypre_MPI_Datatype *csr_matrix_datatypes; hypre_ParCSRBooleanMatrix *par_matrix; HYPRE_Int first_col_diag; HYPRE_Int last_col_diag; HYPRE_Int i, j, ind; hypre_MPI_Comm_rank(comm, &my_id); hypre_MPI_Comm_size(comm, &num_procs); if (my_id == 0) { global_data[0] = hypre_CSRBooleanMatrix_Get_NRows(A); global_data[1] = hypre_CSRBooleanMatrix_Get_NCols(A); a_i = hypre_CSRBooleanMatrix_Get_I(A); a_j = hypre_CSRBooleanMatrix_Get_J(A); } hypre_MPI_Bcast(global_data,2,HYPRE_MPI_INT,0,comm); global_num_rows = global_data[0]; global_num_cols = global_data[1]; local_num_rows = hypre_CTAlloc(HYPRE_Int, num_procs); csr_matrix_datatypes = hypre_CTAlloc(hypre_MPI_Datatype, num_procs); par_matrix = hypre_ParCSRBooleanMatrixCreate (comm, global_num_rows, global_num_cols,row_starts,col_starts,0,0,0); row_starts = hypre_ParCSRBooleanMatrix_Get_RowStarts(par_matrix); col_starts = hypre_ParCSRBooleanMatrix_Get_ColStarts(par_matrix); for (i=0; i < num_procs; i++) local_num_rows[i] = row_starts[i+1] - row_starts[i]; if (my_id == 0) { local_num_nonzeros = hypre_CTAlloc(HYPRE_Int, num_procs); for (i=0; i < num_procs-1; i++) local_num_nonzeros[i] = a_i[row_starts[i+1]] - a_i[row_starts[i]]; local_num_nonzeros[num_procs-1] = a_i[global_num_rows] - a_i[row_starts[num_procs-1]]; } hypre_MPI_Scatter(local_num_nonzeros,1,HYPRE_MPI_INT,&num_nonzeros,1,HYPRE_MPI_INT,0,comm); if (my_id == 0) num_nonzeros = local_num_nonzeros[0]; local_A = hypre_CSRBooleanMatrixCreate(local_num_rows[my_id], global_num_cols, num_nonzeros); if (my_id == 0) { requests = hypre_CTAlloc (hypre_MPI_Request, num_procs-1); status = hypre_CTAlloc(hypre_MPI_Status, num_procs-1); j=0; for (i=1; i < num_procs; i++) { ind = a_i[row_starts[i]]; hypre_BuildCSRBooleanMatrixMPIDataType(local_num_nonzeros[i], local_num_rows[i], &a_i[row_starts[i]], &a_j[ind], &csr_matrix_datatypes[i]); hypre_MPI_Isend(hypre_MPI_BOTTOM, 1, csr_matrix_datatypes[i], i, 0, comm, &requests[j++]); hypre_MPI_Type_free(&csr_matrix_datatypes[i]); } hypre_CSRBooleanMatrix_Get_I(local_A) = a_i; hypre_CSRBooleanMatrix_Get_J(local_A) = a_j; hypre_MPI_Waitall(num_procs-1,requests,status); hypre_TFree(requests); hypre_TFree(status); hypre_TFree(local_num_nonzeros); } else { hypre_CSRBooleanMatrixInitialize(local_A); hypre_BuildCSRBooleanMatrixMPIDataType(num_nonzeros, local_num_rows[my_id], hypre_CSRBooleanMatrix_Get_I(local_A), hypre_CSRBooleanMatrix_Get_J(local_A), csr_matrix_datatypes); hypre_MPI_Recv(hypre_MPI_BOTTOM,1,csr_matrix_datatypes[0],0,0,comm,&status0); hypre_MPI_Type_free(csr_matrix_datatypes); } first_col_diag = col_starts[my_id]; last_col_diag = col_starts[my_id+1]-1; BooleanGenerateDiagAndOffd(local_A, par_matrix, first_col_diag, last_col_diag); /* set pointers back to NULL before destroying */ if (my_id == 0) { hypre_CSRBooleanMatrix_Get_I(local_A) = NULL; hypre_CSRBooleanMatrix_Get_J(local_A) = NULL; } hypre_CSRBooleanMatrixDestroy(local_A); hypre_TFree(local_num_rows); hypre_TFree(csr_matrix_datatypes); return par_matrix; }