xref: /petsc/src/mat/tests/ex79f.F90 (revision ceeae6b5899f2879f7a95602f98efecbe51ff614)
1c4762a1bSJed Brown!
2c4762a1bSJed Brown!   This program demonstrates use of MatGetRowIJ() from Fortran
3c4762a1bSJed Brown!
4c5e229c2SMartin Diehl#include <petsc/finclude/petscmat.h>
5c4762a1bSJed Brownprogram main
6c4762a1bSJed Brown
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
1442ce371bSBarry Smith  PetscInt i, j
1542ce371bSBarry Smith  PetscInt n, rstart
16c4762a1bSJed Brown  PetscInt zero, one, rend
1742ce371bSBarry Smith  PetscBool done, bb
1842ce371bSBarry Smith  PetscScalar, pointer :: aa(:)
1942ce371bSBarry 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
30ce78bad3SBarry Smith  PetscCallA(MatMPIAIJGetSeqAIJ(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
3842ce371bSBarry Smith  bb = .true.
39ce78bad3SBarry Smith  PetscCallA(MatGetRowIJ(Ad, one, bb, bb, n, ia, ja, done, ierr))
40ce78bad3SBarry Smith  PetscCallA(MatSeqAIJGetArray(Ad, aa, ierr))
41*ceeae6b5SMartin Diehl  do i = 1, n
4242ce371bSBarry Smith    write (7 + rank, *) 'row ', i + rstart, ' number nonzeros ', ia(i + 1) - ia(i)
43*ceeae6b5SMartin Diehl    do j = ia(i), ia(i + 1) - 1
4442ce371bSBarry Smith      write (7 + rank, *) '  ', j, ja(j) + rstart, aa(j)
45*ceeae6b5SMartin Diehl    end do
46*ceeae6b5SMartin Diehl  end do
47ce78bad3SBarry Smith  PetscCallA(MatRestoreRowIJ(Ad, one, bb, bb, n, ia, ja, done, ierr))
48ce78bad3SBarry Smith  PetscCallA(MatSeqAIJRestoreArray(Ad, aa, ierr))
49c4762a1bSJed Brown!
50c4762a1bSJed Brown!   Print off-diagonal portion of matrix
51c4762a1bSJed Brown!
52ce78bad3SBarry Smith  PetscCallA(MatGetRowIJ(Ao, one, bb, bb, n, ia, ja, done, ierr))
53ce78bad3SBarry Smith  PetscCallA(MatSeqAIJGetArray(Ao, aa, ierr))
54*ceeae6b5SMartin Diehl  do i = 1, n
5542ce371bSBarry Smith    write (7 + rank, *) 'row ', i + rstart, ' number nonzeros ', ia(i + 1) - ia(i)
56*ceeae6b5SMartin Diehl    do j = ia(i), ia(i + 1) - 1
5742ce371bSBarry Smith      write (7 + rank, *) '  ', j, icol(ja(j)) + 1, aa(j)
58*ceeae6b5SMartin Diehl    end do
59*ceeae6b5SMartin Diehl  end do
60ce78bad3SBarry Smith  PetscCallA(MatMPIAIJRestoreSeqAIJ(A, Ad, Ao, icol, ierr))
61ce78bad3SBarry Smith  PetscCallA(MatRestoreRowIJ(Ao, one, bb, bb, n, ia, ja, done, ierr))
62ce78bad3SBarry Smith  PetscCallA(MatSeqAIJRestoreArray(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 Brownend
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