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