xref: /petsc/src/mat/tests/ex67f.F90 (revision a336c15037c72f93cd561f5a5e11e93175f2efd9)
1!
2!   This program demonstrates use of MatCreateSubMatrices() from Fortran
3!
4#include <petsc/finclude/petscmat.h>
5program main
6  use petscmat
7  implicit none
8
9  Mat A
10  Mat, pointer :: B(:)
11  PetscErrorCode ierr
12  PetscInt nis, zero(1)
13  PetscViewer v
14  IS isrow
15  PetscMPIInt rank
16
17  PetscCallA(PetscInitialize(ierr))
18  PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
19
20#if defined(PETSC_USE_64BIT_INDICES)
21  PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD, '${PETSC_DIR}/share/petsc/datafiles/matrices/'//'ns-real-int64-float64', FILE_MODE_READ, v, ierr))
22#else
23  PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD, '${PETSC_DIR}/share/petsc/datafiles/matrices/'//'ns-real-int32-float64', FILE_MODE_READ, v, ierr))
24#endif
25
26  PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
27  PetscCallA(MatSetType(A, MATAIJ, ierr))
28  PetscCallA(MatLoad(A, v, ierr))
29
30  nis = 1
31  zero(1) = 0
32  if (rank == 1) then
33    nis = 0 ! test nis = 0
34  end if
35  PetscCallA(ISCreateGeneral(PETSC_COMM_SELF, nis, zero, PETSC_COPY_VALUES, isrow, ierr))
36
37  PetscCallA(MatCreateSubmatrices(A, nis, [isrow], [isrow], MAT_INITIAL_MATRIX, B, ierr))
38
39  if (rank == 0) then
40    PetscCallA(MatView(B(1), PETSC_VIEWER_STDOUT_SELF, ierr))
41  end if
42
43  PetscCallA(MatCreateSubmatrices(A, nis, [isrow], [isrow], MAT_REUSE_MATRIX, B, ierr))
44
45  if (rank == 0) then
46    PetscCallA(MatView(B(1), PETSC_VIEWER_STDOUT_SELF, ierr))
47  end if
48
49  PetscCallA(ISDestroy(isrow, ierr))
50  PetscCallA(MatDestroy(A, ierr))
51  PetscCallA(MatDestroySubMatrices(nis, B, ierr))
52  PetscCallA(PetscViewerDestroy(v, ierr))
53
54  PetscCallA(PetscFinalize(ierr))
55end
56
57!/*TEST
58!
59!     test:
60!        requires: double !complex
61!
62!TEST*/
63