1program main 2#include <petsc/finclude/petscvec.h> 3#include <petsc/finclude/petscmat.h> 4 5use petscvec 6use petscmat 7 8implicit none 9 10 Mat A 11 PetscInt,parameter :: n=5,m=5 12 PetscScalar,parameter :: two =2.0, one = 1.0 13 PetscInt,pointer,dimension(:) :: dnnz,onnz 14 PetscInt :: i,rstart,rend,M1,N1 15 PetscErrorCode ierr 16 17 call PetscInitialize(PETSC_NULL_CHARACTER,ierr) 18 19 if (ierr /= 0) then 20 print*,'PetscInitialize failed' 21 stop 22 endif 23 24 allocate(dnnz(0:m-1)) 25 allocate(onnz(0:m-1)) 26 27 do i=0,m-1 28 dnnz(i) = 1 29 onnz(i) = 1 30 end do 31 32 call MatCreateAIJ(PETSC_COMM_WORLD,m,n,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_DECIDE,dnnz,PETSC_DECIDE,onnz,A,ierr);CHKERRA(ierr) 33 call MatSetFromOptions(A,ierr);CHKERRA(ierr) 34 call MatSetUp(A,ierr);CHKERRA(ierr) 35 deallocate(dnnz) 36 deallocate(onnz) 37 38 !/* This assembly shrinks memory because we do not insert enough number of values */ 39 call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr);CHKERRA(ierr) 40 call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr);CHKERRA(ierr) 41 42 !/* MatResetPreallocation restores the memory required by users */ 43 call MatResetPreallocation(A,ierr);CHKERRA(ierr) 44 call MatSetOption(A,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_TRUE,ierr);CHKERRA(ierr) 45 call MatGetOwnershipRange(A,rstart,rend,ierr);CHKERRA(ierr) 46 call MatGetSize(A,M1,N1,ierr);CHKERRA(ierr) 47 do i=rstart,rend-1 48 call MatSetValue(A,i,i,two,INSERT_VALUES,ierr);CHKERRA(ierr) 49 if (rend<N1) call MatSetValue(A,i,rend,one,INSERT_VALUES,ierr);CHKERRA(ierr) 50 end do 51 call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr);CHKERRA(ierr) 52 call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr);CHKERRA(ierr) 53 call MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr);CHKERRA(ierr) 54 call MatDestroy(A,ierr);CHKERRA(ierr) 55 call PetscFinalize(ierr);CHKERRA(ierr) 56 57end program 58 59!/*TEST 60! 61! test: 62! suffix: 1 63! output_file: output/ex4_1.out 64! 65! test: 66! suffix: 2 67! nsize: 2 68! output_file: output/ex4_2.out 69! 70!TEST*/ 71