xref: /petsc/src/vec/is/is/tutorials/ex5.c (revision 356ea6bc55263ef03692b27b17f9e29fe78f4084) !
1 static char help[] = "Demonstrates using ISLocalToGlobalMappings with block size.\n\n";
2 
3 #include <petscis.h>
4 #include <petscviewer.h>
5 
6 int main(int argc, char **argv)
7 {
8   PetscInt               i, n = 4, indices[] = {0, 3, 9, 12}, m = 2, input[] = {0, 2};
9   PetscInt               output[2], inglobals[13], outlocals[13];
10   ISLocalToGlobalMapping mapping;
11 
12   PetscFunctionBeginUser;
13   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
14 
15   /*
16       Create a local to global mapping. Each processor independently
17      creates a mapping
18   */
19   PetscCall(PetscIntView(n, indices, PETSC_VIEWER_STDOUT_WORLD));
20   PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 2, n, indices, PETSC_COPY_VALUES, &mapping));
21 
22   /*
23      Map a set of local indices to their global values
24   */
25   PetscCall(PetscIntView(m, input, PETSC_VIEWER_STDOUT_WORLD));
26   PetscCall(ISLocalToGlobalMappingApply(mapping, m, input, output));
27   PetscCall(PetscIntView(m, output, PETSC_VIEWER_STDOUT_WORLD));
28 
29   /*
30      Map some global indices to local, retaining the ones without a local index by -1
31   */
32   for (i = 0; i < 13; i++) inglobals[i] = i;
33   PetscCall(PetscIntView(13, inglobals, PETSC_VIEWER_STDOUT_WORLD));
34   PetscCall(ISGlobalToLocalMappingApply(mapping, IS_GTOLM_MASK, 13, inglobals, NULL, outlocals));
35   PetscCall(PetscIntView(13, outlocals, PETSC_VIEWER_STDOUT_WORLD));
36 
37   /*
38      Map some block global indices to local, dropping the ones without a local index.
39   */
40   PetscCall(PetscIntView(13, inglobals, PETSC_VIEWER_STDOUT_WORLD));
41   PetscCall(ISGlobalToLocalMappingApplyBlock(mapping, IS_GTOLM_DROP, 13, inglobals, &m, outlocals));
42   PetscCall(PetscIntView(m, outlocals, PETSC_VIEWER_STDOUT_WORLD));
43 
44   /*
45      Free the space used by the local to global mapping
46   */
47   PetscCall(ISLocalToGlobalMappingDestroy(&mapping));
48 
49   PetscCall(PetscFinalize());
50   return 0;
51 }
52 
53 /*TEST
54 
55    test:
56 
57 TEST*/
58