xref: /petsc/src/vec/is/tests/ex7.c (revision 0baf8eba40dbc839082666f9f7396a225d6f663c)
1 static char help[] = "Tests ISLocalToGlobalMappingGetInfo() and ISLocalToGlobalMappingGetNodeInfo().\n\n";
2 
3 #include <petscis.h>
4 #include <petscsf.h>
5 #include <petscviewer.h>
6 
7 int main(int argc, char **argv)
8 {
9   ISLocalToGlobalMapping ltog = NULL;
10   PetscSF                mlsf;
11   PetscInt              *p, *ns, **ids, *leaves, *mleaves;
12   PetscInt               nl, mnl, mnr, i, j, k, n, np, bs = 1, test = 0;
13   PetscViewer            viewer;
14   PetscMPIInt            rank, size;
15 
16   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
17   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
18   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
19   PetscCall(PetscOptionsGetInt(NULL, NULL, "-test", &test, NULL));
20   PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL));
21   switch (test) {
22   case 1: /* quads */
23     if (size > 1) {
24       if (size == 4) {
25         if (rank == 0) {
26           PetscInt id[4] = {0, 1, 2, 3};
27           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
28         } else if (rank == 1) {
29           PetscInt id[4] = {2, 3, 6, 7};
30           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
31         } else if (rank == 2) {
32           PetscInt id[4] = {1, 4, 3, 5};
33           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
34         } else if (rank == 3) {
35           PetscInt id[8] = {3, 5, 7, 8};
36           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
37         }
38       } else {
39         if (rank == 0) {
40           PetscInt id[8] = {0, 1, 2, 3, 1, 4, 3, 5};
41           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 8, id, PETSC_COPY_VALUES, &ltog));
42         } else if (rank == size - 1) {
43           PetscInt id[8] = {2, 3, 6, 7, 3, 5, 7, 8};
44           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 8, id, PETSC_COPY_VALUES, &ltog));
45         } else {
46           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
47         }
48       }
49     } else {
50       PetscInt id[16] = {0, 1, 2, 3, 1, 4, 3, 5, 2, 3, 6, 7, 3, 5, 7, 8};
51       PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 16, id, PETSC_COPY_VALUES, &ltog));
52     }
53     break;
54   case 2: /* mix quads and tets with holes */
55     if (size > 1) {
56       if (size == 4) {
57         if (rank == 0) {
58           PetscInt id[3] = {1, 2, 3};
59           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
60         } else if (rank == 1) {
61           PetscInt id[4] = {1, 4, 5, 3};
62           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
63         } else if (rank == 2) {
64           PetscInt id[3] = {3, 6, 2};
65           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
66         } else if (rank == 3) {
67           PetscInt id[3] = {3, 5, 8};
68           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
69         }
70       } else {
71         if (rank == 0) {
72           PetscInt id[9] = {1, 2, 3, 3, 5, 8, 3, 6, 2};
73           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 9, id, PETSC_COPY_VALUES, &ltog));
74         } else if (rank == size - 1) {
75           PetscInt id[4] = {5, 3, 1, 4};
76           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
77         } else {
78           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
79         }
80       }
81     } else {
82       PetscInt id[13] = {1, 2, 3, 1, 4, 5, 3, 6, 3, 2, 5, 3, 8};
83       PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 13, id, PETSC_COPY_VALUES, &ltog));
84     }
85     break;
86   default:
87     PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
88     break;
89   }
90   PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ltog), &viewer));
91   PetscCall(ISLocalToGlobalMappingView(ltog, viewer));
92   PetscCall(PetscViewerASCIIPrintf(viewer, "GETINFO OUTPUT\n"));
93   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
94   PetscCall(ISLocalToGlobalMappingGetInfo(ltog, &np, &p, &ns, &ids));
95   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local NP %" PetscInt_FMT "\n", rank, np));
96   for (i = 0; i < np; i++) {
97     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   procs[%" PetscInt_FMT "] = %" PetscInt_FMT ", shared %" PetscInt_FMT "\n", rank, i, p[i], ns[i]));
98     for (j = 0; j < ns[i]; j++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); }
99   }
100   PetscCall(PetscViewerFlush(viewer));
101   PetscCall(ISLocalToGlobalMappingRestoreInfo(ltog, &np, &p, &ns, &ids));
102   PetscCall(PetscViewerASCIIPrintf(viewer, "GETNODEINFO OUTPUT\n"));
103   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
104   PetscCall(ISLocalToGlobalMappingGetNodeInfo(ltog, &n, &ns, &ids));
105   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n));
106   for (i = 0; i < n; i++) {
107     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i]));
108     for (j = 0; j < ns[i]; j++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); }
109   }
110   PetscCall(PetscViewerFlush(viewer));
111   PetscCall(ISLocalToGlobalMappingRestoreNodeInfo(ltog, &n, &ns, &ids));
112 
113   /* Test block */
114   PetscCall(PetscViewerASCIIPrintf(viewer, "GETBLOCKINFO OUTPUT\n"));
115   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
116   PetscCall(ISLocalToGlobalMappingGetBlockInfo(ltog, &np, &p, &ns, &ids));
117   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local NP %" PetscInt_FMT "\n", rank, np));
118   for (i = 0; i < np; i++) {
119     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   procs[%" PetscInt_FMT "] = %" PetscInt_FMT ", shared %" PetscInt_FMT "\n", rank, i, p[i], ns[i]));
120     for (j = 0; j < ns[i]; j++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); }
121   }
122   PetscCall(PetscViewerFlush(viewer));
123   PetscCall(ISLocalToGlobalMappingRestoreBlockInfo(ltog, &np, &p, &ns, &ids));
124   PetscCall(PetscViewerASCIIPrintf(viewer, "GETBLOCKNODEINFO OUTPUT\n"));
125   PetscCall(ISLocalToGlobalMappingGetBlockNodeInfo(ltog, &n, &ns, &ids));
126   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
127   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n));
128   for (i = 0; i < n; i++) {
129     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i]));
130     for (j = 0; j < ns[i]; j++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); }
131   }
132   PetscCall(PetscViewerFlush(viewer));
133   PetscCall(ISLocalToGlobalMappingGetBlockMultiLeavesSF(ltog, &mlsf));
134   PetscCall(PetscSFGetGraph(mlsf, &mnr, &mnl, NULL, NULL));
135   PetscCall(ISLocalToGlobalMappingGetSize(ltog, &nl));
136   nl /= bs;
137   for (i = 0, j = 0; i < n; i++) j += ns[i];
138   PetscCheck(mnr == nl, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of roots in multi-leaves SF %" PetscInt_FMT " != %" PetscInt_FMT, mnr, nl);
139   PetscCheck(mnl == j, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of leaves in multi-leaves SF %" PetscInt_FMT " != %" PetscInt_FMT, mnl, j);
140   PetscCall(PetscMalloc2(2 * nl, &leaves, 2 * mnl, &mleaves));
141   for (i = 0; i < nl; i++) {
142     leaves[2 * i]     = -(rank + 1);
143     leaves[2 * i + 1] = i;
144   }
145   PetscCall(PetscViewerASCIIPrintf(viewer, "BLOCK MULTI-LEAVES INPUT\n"));
146   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
147   for (i = 0; i < nl; i++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   input[%" PetscInt_FMT "] = (%" PetscInt_FMT ", %" PetscInt_FMT ")\n", rank, i, leaves[2 * i], leaves[2 * i + 1])); }
148   PetscCall(PetscViewerFlush(viewer));
149   PetscCall(PetscSFBcastBegin(mlsf, MPIU_2INT, leaves, mleaves, MPI_REPLACE));
150   PetscCall(PetscSFBcastEnd(mlsf, MPIU_2INT, leaves, mleaves, MPI_REPLACE));
151   PetscCall(PetscViewerASCIIPrintf(viewer, "BLOCK MULTI-LEAVES OUTPUT\n"));
152   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n));
153   for (i = 0, k = 0; i < n; i++) {
154     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i]));
155     for (j = 0; j < ns[i]; j++) {
156       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     recv[%" PetscInt_FMT "] = (%" PetscInt_FMT ", %" PetscInt_FMT ") from %" PetscInt_FMT "\n", rank, j, mleaves[2 * (k + j)], mleaves[2 * (k + j) + 1], ids[i][j]));
157     }
158     k += ns[i];
159   }
160   PetscCall(PetscViewerFlush(viewer));
161   PetscCall(PetscFree2(leaves, mleaves));
162   PetscCall(ISLocalToGlobalMappingRestoreBlockNodeInfo(ltog, &n, &ns, &ids));
163 
164   PetscCall(ISLocalToGlobalMappingDestroy(&ltog));
165   PetscCall(PetscFinalize());
166   return 0;
167 }
168 
169 /*TEST
170 
171    test:
172      suffix: ltog_info
173      nsize: {{1 2 3 4 5}separate output}
174      args: -bs {{1 3}separate output} -test {{0 1 2}separate output}
175 
176 TEST*/
177