xref: /petsc/src/mat/tests/ex79f.F90 (revision 42ce371b2bd7d45eb85bb2bb31075ac1967f9fc8)
1c4762a1bSJed Brown!
2c4762a1bSJed Brown!   This program demonstrates use of MatGetRowIJ() from Fortran
3c4762a1bSJed Brown!
4c4762a1bSJed Brown      program main
5c4762a1bSJed Brown
6c4762a1bSJed Brown#include <petsc/finclude/petscmat.h>
7c4762a1bSJed Brown      use petscmat
8c4762a1bSJed Brown      implicit none
9c4762a1bSJed Brown
10c4762a1bSJed Brown      Mat         A,Ad,Ao
11c4762a1bSJed Brown      PetscErrorCode ierr
12c4762a1bSJed Brown      PetscMPIInt rank
13c4762a1bSJed Brown      PetscViewer v
14*42ce371bSBarry Smith      PetscInt i,j
15*42ce371bSBarry Smith      PetscInt n,rstart
16c4762a1bSJed Brown      PetscInt zero,one,rend
17*42ce371bSBarry Smith      PetscBool   done,bb
18*42ce371bSBarry Smith      PetscScalar,pointer :: aa(:)
19*42ce371bSBarry Smith      PetscInt,pointer :: ia(:),ja(:),icol(:)
20c4762a1bSJed Brown
21d8606c27SBarry Smith      PetscCallA(PetscInitialize(ierr))
22d8606c27SBarry Smith      PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr))
23c4762a1bSJed Brown
24d8606c27SBarry Smith      PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD,'${PETSC_DIR}/share/petsc/datafiles/matrices/' // 'ns-real-int32-float64',FILE_MODE_READ,v,ierr))
25d8606c27SBarry Smith      PetscCallA(MatCreate(PETSC_COMM_WORLD,A,ierr))
26d8606c27SBarry Smith      PetscCallA(MatSetType(A, MATMPIAIJ,ierr))
27d8606c27SBarry Smith      PetscCallA(MatLoad(A,v,ierr))
28d8606c27SBarry Smith      PetscCallA(MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr))
29c4762a1bSJed Brown
30*42ce371bSBarry Smith      PetscCallA(MatMPIAIJGetSeqAIJF90(A,Ad,Ao,icol,ierr))
31d8606c27SBarry Smith      PetscCallA(MatGetOwnershipRange(A,rstart,rend,ierr))
32c4762a1bSJed Brown!
33c4762a1bSJed Brown!   Print diagonal portion of matrix
34c4762a1bSJed Brown!
35d8606c27SBarry Smith      PetscCallA(PetscSequentialPhaseBegin(PETSC_COMM_WORLD,1,ierr))
36c4762a1bSJed Brown      zero = 0
37c4762a1bSJed Brown      one  = 1
38*42ce371bSBarry Smith      bb = .true.
39*42ce371bSBarry Smith      PetscCallA(MatGetRowIJF90(Ad,one,bb,bb,n,ia,ja,done,ierr))
40*42ce371bSBarry Smith      PetscCallA(MatSeqAIJGetArrayF90(Ad,aa,ierr))
41c4762a1bSJed Brown      do 10, i=1,n
42*42ce371bSBarry Smith        write(7+rank,*) 'row ',i+rstart,' number nonzeros ',ia(i+1)-ia(i)
43*42ce371bSBarry Smith        do 20, j=ia(i),ia(i+1)-1
44*42ce371bSBarry Smith          write(7+rank,*)'  ',j,ja(j)+rstart,aa(j)
45c4762a1bSJed Brown 20     continue
46c4762a1bSJed Brown 10   continue
47*42ce371bSBarry Smith      PetscCallA(MatRestoreRowIJF90(Ad,one,bb,bb,n,ia,ja,done,ierr))
48*42ce371bSBarry Smith      PetscCallA(MatSeqAIJRestoreArrayF90(Ad,aa,ierr))
49c4762a1bSJed Brown!
50c4762a1bSJed Brown!   Print off-diagonal portion of matrix
51c4762a1bSJed Brown!
52*42ce371bSBarry Smith      PetscCallA(MatGetRowIJF90(Ao,one,bb,bb,n,ia,ja,done,ierr))
53*42ce371bSBarry Smith      PetscCallA(MatSeqAIJGetArrayF90(Ao,aa,ierr))
54c4762a1bSJed Brown      do 30, i=1,n
55*42ce371bSBarry Smith        write(7+rank,*) 'row ',i+rstart,' number nonzeros ',ia(i+1)-ia(i)
56*42ce371bSBarry Smith        do 40, j=ia(i),ia(i+1)-1
57*42ce371bSBarry Smith          write(7+rank,*)'  ',j,icol(ja(j))+1,aa(j)
58c4762a1bSJed Brown 40     continue
59c4762a1bSJed Brown 30   continue
60*42ce371bSBarry Smith      PetscCallA(MatMPIAIJRestoreSeqAIJF90(A,Ad,Ao,icol,ierr))
61*42ce371bSBarry Smith      PetscCallA(MatRestoreRowIJF90(Ao,one,bb,bb,n,ia,ja,done,ierr))
62*42ce371bSBarry Smith      PetscCallA(MatSeqAIJRestoreArrayF90(Ao,aa,ierr))
63c4762a1bSJed Brown
64d8606c27SBarry Smith      PetscCallA(PetscSequentialPhaseEnd(PETSC_COMM_WORLD,1,ierr))
65c4762a1bSJed Brown
66d8606c27SBarry Smith      PetscCallA(MatGetDiagonalBlock(A,Ad,ierr))
67d8606c27SBarry Smith      PetscCallA(MatView(Ad,PETSC_VIEWER_STDOUT_WORLD,ierr))
68c4762a1bSJed Brown
69d8606c27SBarry Smith      PetscCallA(MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr))
70d8606c27SBarry Smith      PetscCallA(MatDestroy(A,ierr))
71d8606c27SBarry Smith      PetscCallA(PetscViewerDestroy(v,ierr))
72d8606c27SBarry Smith      PetscCallA(PetscFinalize(ierr))
73c4762a1bSJed Brown      end
74c4762a1bSJed Brown
75c4762a1bSJed Brown!/*TEST
76c4762a1bSJed Brown!
77c4762a1bSJed Brown!     build:
78dfd57a17SPierre Jolivet!       requires: double !complex !defined(PETSC_USE_64BIT_INDICES)
79c4762a1bSJed Brown!
80c4762a1bSJed Brown!     test:
81c4762a1bSJed Brown!        args: -binary_read_double -options_left false
82c4762a1bSJed Brown!
83c4762a1bSJed Brown!TEST*/
84