1*c4762a1bSJed Brown! 2*c4762a1bSJed Brown! 3*c4762a1bSJed Brown! Tests MatDenseGetArray() 4*c4762a1bSJed Brown! 5*c4762a1bSJed Brown 6*c4762a1bSJed Brown program main 7*c4762a1bSJed Brown#include <petsc/finclude/petscmat.h> 8*c4762a1bSJed Brown use petscmat 9*c4762a1bSJed Brown implicit none 10*c4762a1bSJed Brown 11*c4762a1bSJed Brown Mat A 12*c4762a1bSJed Brown PetscErrorCode ierr 13*c4762a1bSJed Brown PetscInt i,j,m,n,iar(1),jar(1) 14*c4762a1bSJed Brown PetscInt one 15*c4762a1bSJed Brown PetscScalar v(1) 16*c4762a1bSJed Brown PetscScalar, pointer :: array(:,:) 17*c4762a1bSJed Brown PetscMPIInt rank 18*c4762a1bSJed Brown integer :: ashape(2) 19*c4762a1bSJed Brown character(len=80) :: string 20*c4762a1bSJed Brown 21*c4762a1bSJed Brown call PetscInitialize(PETSC_NULL_CHARACTER,ierr) 22*c4762a1bSJed Brown if (ierr .ne. 0) then 23*c4762a1bSJed Brown print*,'Unable to initialize PETSc' 24*c4762a1bSJed Brown stop 25*c4762a1bSJed Brown endif 26*c4762a1bSJed Brown 27*c4762a1bSJed Brown m = 3 28*c4762a1bSJed Brown n = 2 29*c4762a1bSJed Brown one = 1 30*c4762a1bSJed Brown! 31*c4762a1bSJed Brown! Create a parallel dense matrix shared by all processors 32*c4762a1bSJed Brown! 33*c4762a1bSJed Brown call MatCreateDense(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,m,n,PETSC_NULL_SCALAR,A,ierr);CHKERRA(ierr) 34*c4762a1bSJed Brown 35*c4762a1bSJed Brown! 36*c4762a1bSJed Brown! Set values into the matrix. All processors set all values. 37*c4762a1bSJed Brown! 38*c4762a1bSJed Brown do 10, i=0,m-1 39*c4762a1bSJed Brown iar(1) = i 40*c4762a1bSJed Brown do 20, j=0,n-1 41*c4762a1bSJed Brown jar(1) = j 42*c4762a1bSJed Brown v(1) = 9.0/real(i+j+1) 43*c4762a1bSJed Brown call MatSetValues(A,one,iar,one,jar,v,INSERT_VALUES,ierr);CHKERRA(ierr) 44*c4762a1bSJed Brown 20 continue 45*c4762a1bSJed Brown 10 continue 46*c4762a1bSJed Brown 47*c4762a1bSJed Brown call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr);CHKERRA(ierr) 48*c4762a1bSJed Brown call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr);CHKERRA(ierr) 49*c4762a1bSJed Brown 50*c4762a1bSJed Brown! 51*c4762a1bSJed Brown! Print the matrix to the screen 52*c4762a1bSJed Brown! 53*c4762a1bSJed Brown call MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr);CHKERRA(ierr) 54*c4762a1bSJed Brown 55*c4762a1bSJed Brown! 56*c4762a1bSJed Brown! Print the local matrix shape to the screen for each rank 57*c4762a1bSJed Brown! 58*c4762a1bSJed Brown call MatDenseGetArrayF90(A,array,ierr);CHKERRA(ierr) 59*c4762a1bSJed Brown call MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr);CHKERRA(ierr); 60*c4762a1bSJed Brown ashape = shape(array) 61*c4762a1bSJed Brown write(string, '("[", i0, "]", " shape (", i0, ",", i0, ")", a1)') rank, ashape(1), ashape(2), new_line('a') 62*c4762a1bSJed Brown call PetscSynchronizedPrintf(PETSC_COMM_WORLD, string, ierr);CHKERRA(ierr); 63*c4762a1bSJed Brown call PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT,ierr);CHKERRA(ierr); 64*c4762a1bSJed Brown call MatDenseRestoreArrayF90(A,array,ierr);CHKERRA(ierr) 65*c4762a1bSJed Brown! 66*c4762a1bSJed Brown! Free the space used by the matrix 67*c4762a1bSJed Brown! 68*c4762a1bSJed Brown call MatDestroy(A,ierr);CHKERRA(ierr) 69*c4762a1bSJed Brown call PetscFinalize(ierr) 70*c4762a1bSJed Brown end 71*c4762a1bSJed Brown 72*c4762a1bSJed Brown 73*c4762a1bSJed Brown!/*TEST 74*c4762a1bSJed Brown! 75*c4762a1bSJed Brown! test: 76*c4762a1bSJed Brown! nsize: 2 77*c4762a1bSJed Brown! filter: sort -b 78*c4762a1bSJed Brown! filter_output: sort -b 79*c4762a1bSJed Brown! 80*c4762a1bSJed Brown!TEST*/ 81