Actual source code: ex1.c
1: static char help[] = "Creating a general index set.\n\n";
3: /*
4: Include petscis.h so we can use PETSc IS objects. Note that this automatically
5: includes petscsys.h.
6: */
7: #include <petscis.h>
8: #include <petscviewer.h>
10: int main(int argc, char **argv)
11: {
12: PetscInt *indices, n;
13: const PetscInt *nindices;
14: PetscMPIInt rank;
15: IS is;
17: PetscFunctionBeginUser;
18: PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
19: PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
21: /*
22: Create an index set with 5 entries. Each processor creates
23: its own index set with its own list of integers.
24: */
25: PetscCall(PetscMalloc1(5, &indices));
26: indices[0] = rank + 1;
27: indices[1] = rank + 2;
28: indices[2] = rank + 3;
29: indices[3] = rank + 4;
30: indices[4] = rank + 5;
31: PetscCall(ISCreateGeneral(PETSC_COMM_SELF, 5, indices, PETSC_COPY_VALUES, &is));
32: /*
33: Note that ISCreateGeneral() has made a copy of the indices
34: so we may (and generally should) free indices[]
35: */
36: PetscCall(PetscFree(indices));
38: /*
39: Print the index set to stdout
40: */
41: PetscCall(ISView(is, PETSC_VIEWER_STDOUT_SELF));
43: /*
44: Get the number of indices in the set
45: */
46: PetscCall(ISGetLocalSize(is, &n));
48: /*
49: Get the indices in the index set
50: */
51: PetscCall(ISGetIndices(is, &nindices));
52: /*
53: Now any code that needs access to the list of integers
54: has access to it here through indices[].
55: */
56: PetscCall(PetscPrintf(PETSC_COMM_SELF, "[%d] First index %" PetscInt_FMT "\n", rank, nindices[0]));
58: /*
59: Once we no longer need access to the indices they should
60: returned to the system
61: */
62: PetscCall(ISRestoreIndices(is, &nindices));
64: /*
65: One should destroy any PETSc object once one is completely
66: done with it.
67: */
68: PetscCall(ISDestroy(&is));
69: PetscCall(PetscFinalize());
70: return 0;
71: }
73: /*TEST
75: test:
77: TEST*/