Date: 2022-03-31T04:47:20+00:00

Actual source code: ex4f.F90

      1: program main
      2: #include <petsc/finclude/petscvec.h>
      3: #include <petsc/finclude/petscmat.h>

      5: use petscvec
      6: use petscmat

      8: implicit none

     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

     17:   call PetscInitialize(PETSC_NULL_CHARACTER,ierr)

     19:   if (ierr /= 0) then
     20:    print*,'PetscInitialize failed'
     21:    stop
     22:   endif

     24:   allocate(dnnz(0:m-1))
     25:   allocate(onnz(0:m-1))

     27:   do i=0,m-1
     28:    dnnz(i) = 1
     29:    onnz(i) = 1
     30:   end do

     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)

     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)

     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)

     57: end program

     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*/