1 2 static char help[] = "Tests MatCreateSubMatrices() for SBAIJ matrices\n\n"; 3 4 #include <petscmat.h> 5 6 int main(int argc, char **args) 7 { 8 Mat BAIJ, SBAIJ, *subBAIJ, *subSBAIJ; 9 PetscViewer viewer; 10 char file[PETSC_MAX_PATH_LEN]; 11 PetscBool flg; 12 PetscInt n = 2, issize, M, N; 13 PetscMPIInt rank; 14 IS isrow, iscol, irow[n], icol[n]; 15 16 PetscFunctionBeginUser; 17 PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 18 PetscCall(PetscOptionsGetString(NULL, NULL, "-f", file, sizeof(file), &flg)); 19 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file, FILE_MODE_READ, &viewer)); 20 21 PetscCall(MatCreate(PETSC_COMM_WORLD, &BAIJ)); 22 PetscCall(MatSetType(BAIJ, MATMPIBAIJ)); 23 PetscCall(MatLoad(BAIJ, viewer)); 24 PetscCall(PetscViewerDestroy(&viewer)); 25 26 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file, FILE_MODE_READ, &viewer)); 27 PetscCall(MatCreate(PETSC_COMM_WORLD, &SBAIJ)); 28 PetscCall(MatSetType(SBAIJ, MATMPISBAIJ)); 29 PetscCall(MatLoad(SBAIJ, viewer)); 30 PetscCall(PetscViewerDestroy(&viewer)); 31 32 PetscCall(MatGetSize(BAIJ, &M, &N)); 33 issize = M / 4; 34 PetscCall(ISCreateStride(PETSC_COMM_SELF, issize, 0, 1, &isrow)); 35 irow[0] = irow[1] = isrow; 36 issize = N / 2; 37 PetscCall(ISCreateStride(PETSC_COMM_SELF, issize, 0, 1, &iscol)); 38 icol[0] = icol[1] = iscol; 39 PetscCall(MatCreateSubMatrices(BAIJ, n, irow, icol, MAT_INITIAL_MATRIX, &subBAIJ)); 40 PetscCall(MatCreateSubMatrices(BAIJ, n, irow, icol, MAT_REUSE_MATRIX, &subBAIJ)); 41 42 /* irow and icol must be same for SBAIJ matrices! */ 43 icol[0] = icol[1] = isrow; 44 PetscCall(MatCreateSubMatrices(SBAIJ, n, irow, icol, MAT_INITIAL_MATRIX, &subSBAIJ)); 45 PetscCall(MatCreateSubMatrices(SBAIJ, n, irow, icol, MAT_REUSE_MATRIX, &subSBAIJ)); 46 47 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 48 if (rank == 0) { 49 PetscCall(MatView(subBAIJ[0], PETSC_VIEWER_STDOUT_SELF)); 50 PetscCall(MatView(subSBAIJ[0], PETSC_VIEWER_STDOUT_SELF)); 51 } 52 53 /* Free data structures */ 54 PetscCall(ISDestroy(&isrow)); 55 PetscCall(ISDestroy(&iscol)); 56 PetscCall(MatDestroySubMatrices(n, &subBAIJ)); 57 PetscCall(MatDestroySubMatrices(n, &subSBAIJ)); 58 PetscCall(MatDestroy(&BAIJ)); 59 PetscCall(MatDestroy(&SBAIJ)); 60 61 PetscCall(PetscFinalize()); 62 return 0; 63 } 64