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