xref: /petsc/src/vec/is/tests/ex7.c (revision 73ff1848c0400416fcc176f9b48bfbf2ec9308e0)
1 static char help[] = "Tests ISLocalToGlobalMappingGetInfo() and ISLocalToGlobalMappingGetNodeInfo().\n\n";
2 
3 #include <petscis.h>
4 #include <petscviewer.h>
5 
6 int main(int argc, char **argv)
7 {
8   ISLocalToGlobalMapping ltog = NULL;
9   PetscInt              *p, *ns, **ids;
10   PetscInt               i, j, n, np, bs = 1, test = 0;
11   PetscViewer            viewer;
12   PetscMPIInt            rank, size;
13 
14   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
15   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
16   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
17   PetscCall(PetscOptionsGetInt(NULL, NULL, "-test", &test, NULL));
18   PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL));
19   switch (test) {
20   case 1: /* quads */
21     if (size > 1) {
22       if (size == 4) {
23         if (rank == 0) {
24           PetscInt id[4] = {0, 1, 2, 3};
25           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
26         } else if (rank == 1) {
27           PetscInt id[4] = {2, 3, 6, 7};
28           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
29         } else if (rank == 2) {
30           PetscInt id[4] = {1, 4, 3, 5};
31           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
32         } else if (rank == 3) {
33           PetscInt id[8] = {3, 5, 7, 8};
34           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
35         }
36       } else {
37         if (rank == 0) {
38           PetscInt id[8] = {0, 1, 2, 3, 1, 4, 3, 5};
39           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 8, id, PETSC_COPY_VALUES, &ltog));
40         } else if (rank == size - 1) {
41           PetscInt id[8] = {2, 3, 6, 7, 3, 5, 7, 8};
42           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 8, id, PETSC_COPY_VALUES, &ltog));
43         } else {
44           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
45         }
46       }
47     } else {
48       PetscInt id[16] = {0, 1, 2, 3, 1, 4, 3, 5, 2, 3, 6, 7, 3, 5, 7, 8};
49       PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 16, id, PETSC_COPY_VALUES, &ltog));
50     }
51     break;
52   case 2: /* mix quads and tets with holes */
53     if (size > 1) {
54       if (size == 4) {
55         if (rank == 0) {
56           PetscInt id[3] = {1, 2, 3};
57           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
58         } else if (rank == 1) {
59           PetscInt id[4] = {1, 4, 5, 3};
60           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
61         } else if (rank == 2) {
62           PetscInt id[3] = {3, 6, 2};
63           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
64         } else if (rank == 3) {
65           PetscInt id[3] = {3, 5, 8};
66           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
67         }
68       } else {
69         if (rank == 0) {
70           PetscInt id[9] = {1, 2, 3, 3, 5, 8, 3, 6, 2};
71           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 9, id, PETSC_COPY_VALUES, &ltog));
72         } else if (rank == size - 1) {
73           PetscInt id[4] = {5, 3, 1, 4};
74           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
75         } else {
76           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
77         }
78       }
79     } else {
80       PetscInt id[13] = {1, 2, 3, 1, 4, 5, 3, 6, 3, 2, 5, 3, 8};
81       PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 13, id, PETSC_COPY_VALUES, &ltog));
82     }
83     break;
84   default:
85     PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
86     break;
87   }
88   PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ltog), &viewer));
89   PetscCall(ISLocalToGlobalMappingView(ltog, viewer));
90   PetscCall(PetscViewerASCIIPrintf(viewer, "GETINFO OUTPUT\n"));
91   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
92   PetscCall(ISLocalToGlobalMappingGetInfo(ltog, &np, &p, &ns, &ids));
93   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local NP %" PetscInt_FMT "\n", rank, np));
94   for (i = 0; i < np; i++) {
95     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   procs[%" PetscInt_FMT "] = %" PetscInt_FMT ", shared %" PetscInt_FMT "\n", rank, i, p[i], ns[i]));
96     for (j = 0; j < ns[i]; j++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); }
97   }
98   PetscCall(PetscViewerFlush(viewer));
99   PetscCall(ISLocalToGlobalMappingRestoreInfo(ltog, &np, &p, &ns, &ids));
100   PetscCall(PetscViewerASCIIPrintf(viewer, "GETNODEINFO OUTPUT\n"));
101   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
102   PetscCall(ISLocalToGlobalMappingGetNodeInfo(ltog, &n, &ns, &ids));
103   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n));
104   for (i = 0; i < n; i++) {
105     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i]));
106     for (j = 0; j < ns[i]; j++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); }
107   }
108   PetscCall(PetscViewerFlush(viewer));
109   PetscCall(ISLocalToGlobalMappingRestoreNodeInfo(ltog, &n, &ns, &ids));
110   PetscCall(ISLocalToGlobalMappingDestroy(&ltog));
111   PetscCall(PetscFinalize());
112   return 0;
113 }
114 
115 /*TEST
116 
117    test:
118      suffix: ltog_info
119      nsize: {{1 2 3 4 5}separate output}
120      args: -bs {{1 3}separate output} -test {{0 1 2}separate output}
121 
122 TEST*/
123