! ! This program demonstrates use of MatCreateSubMatrices() from Fortran ! #include program main use petscmat implicit none Mat A Mat, pointer :: B(:) PetscErrorCode ierr PetscInt nis, zero(1) PetscViewer v IS isrow PetscMPIInt rank PetscCallA(PetscInitialize(ierr)) PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr)) #if defined(PETSC_USE_64BIT_INDICES) PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD, '${PETSC_DIR}/share/petsc/datafiles/matrices/'//'ns-real-int64-float64', FILE_MODE_READ, v, ierr)) #else PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD, '${PETSC_DIR}/share/petsc/datafiles/matrices/'//'ns-real-int32-float64', FILE_MODE_READ, v, ierr)) #endif PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr)) PetscCallA(MatSetType(A, MATAIJ, ierr)) PetscCallA(MatLoad(A, v, ierr)) nis = 1 zero(1) = 0 if (rank == 1) then nis = 0 ! test nis = 0 end if PetscCallA(ISCreateGeneral(PETSC_COMM_SELF, nis, zero, PETSC_COPY_VALUES, isrow, ierr)) PetscCallA(MatCreateSubmatrices(A, nis, [isrow], [isrow], MAT_INITIAL_MATRIX, B, ierr)) if (rank == 0) then PetscCallA(MatView(B(1), PETSC_VIEWER_STDOUT_SELF, ierr)) end if PetscCallA(MatCreateSubmatrices(A, nis, [isrow], [isrow], MAT_REUSE_MATRIX, B, ierr)) if (rank == 0) then PetscCallA(MatView(B(1), PETSC_VIEWER_STDOUT_SELF, ierr)) end if PetscCallA(ISDestroy(isrow, ierr)) PetscCallA(MatDestroy(A, ierr)) PetscCallA(MatDestroySubMatrices(nis, B, ierr)) PetscCallA(PetscViewerDestroy(v, ierr)) PetscCallA(PetscFinalize(ierr)) end !/*TEST ! ! test: ! requires: double !complex ! !TEST*/