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