Date: 2022-03-04T17:37:33+00:00

Actual source code: ex2f.F

      1: !
      2: !     Description: Creates an index set based on a stride. Views that
      3: !     index set and then destroys it.
      4: !
      5: !/*T
      6: !     Concepts: index sets^manipulating a stride index set;
      7: !     Concepts: index sets^accessing indices from Fortran
      8: !T*/
      9: !
     10: !     Include petscis.h so we can use PETSc IS objects.
     11: !
     12:       program main
     13: #include <petsc/finclude/petscis.h>
     14:       use petscis
     15:       implicit none

     17:       PetscErrorCode ierr
     18:       PetscInt    i,n,index(1),first,step,val
     19:       IS          set
     20:       PetscOffset iss

     22: #define indices(ib)  index(iss + (ib))

     24:       call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
     25:       if (ierr .ne. 0) then
     26:          print*,'Unable to initialize PETSc'
     27:          stop
     28:       endif
     29:       n     = 10
     30:       first = 3
     31:       step  = 2

     33: !     Create stride index set, starting at 3 with a stride of 2 Note
     34: !     each processor is generating its own index set (in this case they
     35: !     are all identical)

     37:       call ISCreateStride(PETSC_COMM_SELF,n,first,step,set,ierr)
     38:       call ISView(set,PETSC_VIEWER_STDOUT_SELF,ierr)

     40: !     Extract the indice values from the set. Demonstrates how a Fortran
     41: !     code can directly access the array storing a PETSc index set with
     42: !     ISGetIndices().  The user declares an array (index(1)) and index
     43: !     variable (iss), which are then used together to allow the Fortran
     44: !     to directly manipulate the PETSc array

     46:       call ISGetIndices(set,index,iss,ierr)
     47:       write(6,20)
     48: !     Bug in IRIX64 f90 compiler - write cannot handle
     49: !     integer(integer*8) correctly
     50:       do 10 i=1,n
     51:          val = indices(i)
     52:          write(6,30) val
     53:  10   continue
     54:  20   format('Printing indices directly')
     55:  30   format(i3)
     56:       call ISRestoreIndices(set,index,iss,ierr)

     58: !     Determine information on stride

     60:       call ISStrideGetInfo(set,first,step,ierr)
     61:       if (first .ne. 3 .or. step .ne. 2) then
     62:         print*,'Stride info not correct!'
     63:       endif

     65:       call ISDestroy(set,ierr)
     66:       call PetscFinalize(ierr)
     67:       end

     69: !/*TEST
     70: !
     71: !   test:
     72: !
     73: !TEST*/