xref: /petsc/src/mat/tests/ex16f90.F90 (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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