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:   PetscCallA(PetscInitialize(ierr))

     19:   allocate(dnnz(0:m-1))
     20:   allocate(onnz(0:m-1))

     22:   do i=0,m-1
     23:    dnnz(i) = 1
     24:    onnz(i) = 1
     25:   end do

     27:   PetscCallA(MatCreateAIJ(PETSC_COMM_WORLD,m,n,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_DECIDE,dnnz,PETSC_DECIDE,onnz,A,ierr))
     28:   PetscCallA(MatSetFromOptions(A,ierr))
     29:   PetscCallA(MatSetUp(A,ierr))
     30:   deallocate(dnnz)
     31:   deallocate(onnz)

     33:   !/* This assembly shrinks memory because we do not insert enough number of values */
     34:   PetscCallA(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr))
     35:   PetscCallA(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr))

     37:   !/* MatResetPreallocation restores the memory required by users */
     38:   PetscCallA(MatResetPreallocation(A,ierr))
     39:   PetscCallA(MatSetOption(A,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_TRUE,ierr))
     40:   PetscCallA(MatGetOwnershipRange(A,rstart,rend,ierr))
     41:   PetscCallA(MatGetSize(A,M1,N1,ierr))
     42:   do i=rstart,rend-1
     43:    PetscCallA(MatSetValue(A,i,i,two,INSERT_VALUES,ierr))
     44:    if (rend<N1) PetscCallA(MatSetValue(A,i,rend,one,INSERT_VALUES,ierr))
     45:   end do
     46:   PetscCallA(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr))
     47:   PetscCallA(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr))
     48:   PetscCallA(MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr))
     49:   PetscCallA(MatDestroy(A,ierr))
     50:   PetscCallA(PetscFinalize(ierr))

     52: end program

     54: !/*TEST
     55: !
     56: !   test:
     57: !      suffix: 1
     58: !      output_file: output/ex4_1.out
     59: !
     60: !   test:
     61: !      suffix: 2
     62: !      nsize: 2
     63: !      output_file: output/ex4_2.out
     64: !
     65: !TEST*/