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