Actual source code: ex1f.F90
1: !
2: ! Description: Creates an index set based on a set of integers. Views that index set
3: ! and then destroys it.
4: !
5: !
6: !
7: program main
8: #include <petsc/finclude/petscis.h>
9: use petscis
10: implicit none
12: PetscErrorCode ierr
13: PetscInt n,indices(5),index1,index5
14: PetscMPIInt rank
15: IS is
16: PetscInt, pointer :: indices2(:)
18: PetscCallA(PetscInitialize(ierr))
19: PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr))
21: ! Create an index set with 5 entries. Each processor creates
22: ! its own index set with its own list of integers.
24: indices(1) = rank + 1
25: indices(2) = rank + 2
26: indices(3) = rank + 3
27: indices(4) = rank + 4
28: indices(5) = rank + 5
30: ! if using 64-bit integers cannot pass 5 into routine expecting an integer*8
31: n = 5
32: PetscCallA(ISCreateGeneral(PETSC_COMM_SELF,n,indices,PETSC_COPY_VALUES,is,ierr))
34: ! Print the index set to stdout
36: PetscCallA(ISView(is,PETSC_VIEWER_STDOUT_SELF,ierr))
38: ! Get the number of indices in the set
40: PetscCallA(ISGetLocalSize(is,n,ierr))
42: ! Get the indices in the index set
44: PetscCallA(ISGetIndicesF90(is,indices2,ierr))
46: ! Now any code that needs access to the list of integers
47: ! has access to it here
49: !
50: ! Bug in IRIX64-F90 libraries - write/format cannot handle integer(integer*8 + integer)
51: !
53: index1 = indices(1)
54: index5 = indices(5)
55: write(6,100) rank,index1,index5
56: 100 format('[',i5,'] First index = ',i5,' fifth index = ',i5)
58: ! Once we no longer need access to the indices they should
59: ! returned to the system
61: PetscCallA(ISRestoreIndicesF90(is,indices2,ierr))
63: ! All PETSc objects should be destroyed once they are
64: ! no longer needed
66: PetscCallA(ISDestroy(is,ierr))
67: PetscCallA(PetscFinalize(ierr))
68: end
70: !/*TEST
71: !
72: ! test:
73: ! filter: sort -b
74: ! filter_output: sort -b
75: !
76: !TEST*/