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