xref: /petsc/src/vec/is/tests/ex7.c (revision d4df40f31fd33609e497a20f95876da58485cfff)
1633354d9SStefano Zampini static char help[] = "Tests ISLocalToGlobalMappingGetInfo() and ISLocalToGlobalMappingGetNodeInfo().\n\n";
2633354d9SStefano Zampini 
3633354d9SStefano Zampini #include <petscis.h>
4*d4df40f3SStefano Zampini #include <petscsf.h>
5633354d9SStefano Zampini #include <petscviewer.h>
6633354d9SStefano Zampini 
7633354d9SStefano Zampini int main(int argc, char **argv)
8633354d9SStefano Zampini {
9633354d9SStefano Zampini   ISLocalToGlobalMapping ltog = NULL;
10*d4df40f3SStefano Zampini   PetscSF                mlsf;
11*d4df40f3SStefano Zampini   PetscInt              *p, *ns, **ids, *leaves, *mleaves;
12*d4df40f3SStefano Zampini   PetscInt               nl, mnl, mnr, i, j, k, n, np, bs = 1, test = 0;
13633354d9SStefano Zampini   PetscViewer            viewer;
14633354d9SStefano Zampini   PetscMPIInt            rank, size;
15633354d9SStefano Zampini 
16633354d9SStefano Zampini   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
17633354d9SStefano Zampini   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
18633354d9SStefano Zampini   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
19633354d9SStefano Zampini   PetscCall(PetscOptionsGetInt(NULL, NULL, "-test", &test, NULL));
20633354d9SStefano Zampini   PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL));
21633354d9SStefano Zampini   switch (test) {
22633354d9SStefano Zampini   case 1: /* quads */
23633354d9SStefano Zampini     if (size > 1) {
24633354d9SStefano Zampini       if (size == 4) {
25633354d9SStefano Zampini         if (rank == 0) {
26633354d9SStefano Zampini           PetscInt id[4] = {0, 1, 2, 3};
27633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
28633354d9SStefano Zampini         } else if (rank == 1) {
29633354d9SStefano Zampini           PetscInt id[4] = {2, 3, 6, 7};
30633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
31633354d9SStefano Zampini         } else if (rank == 2) {
32633354d9SStefano Zampini           PetscInt id[4] = {1, 4, 3, 5};
33633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
34633354d9SStefano Zampini         } else if (rank == 3) {
35633354d9SStefano Zampini           PetscInt id[8] = {3, 5, 7, 8};
36633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
37633354d9SStefano Zampini         }
38633354d9SStefano Zampini       } else {
39633354d9SStefano Zampini         if (rank == 0) {
40633354d9SStefano Zampini           PetscInt id[8] = {0, 1, 2, 3, 1, 4, 3, 5};
41633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 8, id, PETSC_COPY_VALUES, &ltog));
42633354d9SStefano Zampini         } else if (rank == size - 1) {
43633354d9SStefano Zampini           PetscInt id[8] = {2, 3, 6, 7, 3, 5, 7, 8};
44633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 8, id, PETSC_COPY_VALUES, &ltog));
45633354d9SStefano Zampini         } else {
46633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
47633354d9SStefano Zampini         }
48633354d9SStefano Zampini       }
49633354d9SStefano Zampini     } else {
50633354d9SStefano Zampini       PetscInt id[16] = {0, 1, 2, 3, 1, 4, 3, 5, 2, 3, 6, 7, 3, 5, 7, 8};
51633354d9SStefano Zampini       PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 16, id, PETSC_COPY_VALUES, &ltog));
52633354d9SStefano Zampini     }
53633354d9SStefano Zampini     break;
54633354d9SStefano Zampini   case 2: /* mix quads and tets with holes */
55633354d9SStefano Zampini     if (size > 1) {
56633354d9SStefano Zampini       if (size == 4) {
57633354d9SStefano Zampini         if (rank == 0) {
58633354d9SStefano Zampini           PetscInt id[3] = {1, 2, 3};
59633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
60633354d9SStefano Zampini         } else if (rank == 1) {
61633354d9SStefano Zampini           PetscInt id[4] = {1, 4, 5, 3};
62633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
63633354d9SStefano Zampini         } else if (rank == 2) {
64633354d9SStefano Zampini           PetscInt id[3] = {3, 6, 2};
65633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
66633354d9SStefano Zampini         } else if (rank == 3) {
67633354d9SStefano Zampini           PetscInt id[3] = {3, 5, 8};
68633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
69633354d9SStefano Zampini         }
70633354d9SStefano Zampini       } else {
71633354d9SStefano Zampini         if (rank == 0) {
72633354d9SStefano Zampini           PetscInt id[9] = {1, 2, 3, 3, 5, 8, 3, 6, 2};
73633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 9, id, PETSC_COPY_VALUES, &ltog));
74633354d9SStefano Zampini         } else if (rank == size - 1) {
75633354d9SStefano Zampini           PetscInt id[4] = {5, 3, 1, 4};
76633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, &ltog));
77633354d9SStefano Zampini         } else {
78633354d9SStefano Zampini           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
79633354d9SStefano Zampini         }
80633354d9SStefano Zampini       }
81633354d9SStefano Zampini     } else {
82633354d9SStefano Zampini       PetscInt id[13] = {1, 2, 3, 1, 4, 5, 3, 6, 3, 2, 5, 3, 8};
83633354d9SStefano Zampini       PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 13, id, PETSC_COPY_VALUES, &ltog));
84633354d9SStefano Zampini     }
85633354d9SStefano Zampini     break;
86633354d9SStefano Zampini   default:
87633354d9SStefano Zampini     PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
88633354d9SStefano Zampini     break;
89633354d9SStefano Zampini   }
90633354d9SStefano Zampini   PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ltog), &viewer));
91633354d9SStefano Zampini   PetscCall(ISLocalToGlobalMappingView(ltog, viewer));
92633354d9SStefano Zampini   PetscCall(PetscViewerASCIIPrintf(viewer, "GETINFO OUTPUT\n"));
93633354d9SStefano Zampini   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
94633354d9SStefano Zampini   PetscCall(ISLocalToGlobalMappingGetInfo(ltog, &np, &p, &ns, &ids));
95633354d9SStefano Zampini   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local NP %" PetscInt_FMT "\n", rank, np));
96633354d9SStefano Zampini   for (i = 0; i < np; i++) {
97633354d9SStefano Zampini     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   procs[%" PetscInt_FMT "] = %" PetscInt_FMT ", shared %" PetscInt_FMT "\n", rank, i, p[i], ns[i]));
98633354d9SStefano Zampini     for (j = 0; j < ns[i]; j++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); }
99633354d9SStefano Zampini   }
100633354d9SStefano Zampini   PetscCall(PetscViewerFlush(viewer));
101633354d9SStefano Zampini   PetscCall(ISLocalToGlobalMappingRestoreInfo(ltog, &np, &p, &ns, &ids));
102633354d9SStefano Zampini   PetscCall(PetscViewerASCIIPrintf(viewer, "GETNODEINFO OUTPUT\n"));
103633354d9SStefano Zampini   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
104633354d9SStefano Zampini   PetscCall(ISLocalToGlobalMappingGetNodeInfo(ltog, &n, &ns, &ids));
105633354d9SStefano Zampini   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n));
106633354d9SStefano Zampini   for (i = 0; i < n; i++) {
107633354d9SStefano Zampini     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i]));
108633354d9SStefano Zampini     for (j = 0; j < ns[i]; j++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); }
109633354d9SStefano Zampini   }
110633354d9SStefano Zampini   PetscCall(PetscViewerFlush(viewer));
111633354d9SStefano Zampini   PetscCall(ISLocalToGlobalMappingRestoreNodeInfo(ltog, &n, &ns, &ids));
112*d4df40f3SStefano Zampini 
113*d4df40f3SStefano Zampini   /* Test block */
114*d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPrintf(viewer, "GETBLOCKINFO OUTPUT\n"));
115*d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
116*d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingGetBlockInfo(ltog, &np, &p, &ns, &ids));
117*d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local NP %" PetscInt_FMT "\n", rank, np));
118*d4df40f3SStefano Zampini   for (i = 0; i < np; i++) {
119*d4df40f3SStefano Zampini     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   procs[%" PetscInt_FMT "] = %" PetscInt_FMT ", shared %" PetscInt_FMT "\n", rank, i, p[i], ns[i]));
120*d4df40f3SStefano Zampini     for (j = 0; j < ns[i]; j++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); }
121*d4df40f3SStefano Zampini   }
122*d4df40f3SStefano Zampini   PetscCall(PetscViewerFlush(viewer));
123*d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingRestoreBlockInfo(ltog, &np, &p, &ns, &ids));
124*d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPrintf(viewer, "GETBLOCKNODEINFO OUTPUT\n"));
125*d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingGetBlockNodeInfo(ltog, &n, &ns, &ids));
126*d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
127*d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n));
128*d4df40f3SStefano Zampini   for (i = 0; i < n; i++) {
129*d4df40f3SStefano Zampini     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i]));
130*d4df40f3SStefano Zampini     for (j = 0; j < ns[i]; j++) { PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); }
131*d4df40f3SStefano Zampini   }
132*d4df40f3SStefano Zampini   PetscCall(PetscViewerFlush(viewer));
133*d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingGetBlockMultiLeavesSF(ltog, &mlsf));
134*d4df40f3SStefano Zampini   PetscCall(PetscSFGetGraph(mlsf, &mnr, &mnl, NULL, NULL));
135*d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingGetSize(ltog, &nl));
136*d4df40f3SStefano Zampini   nl /= bs;
137*d4df40f3SStefano Zampini   for (i = 0, j = 0; i < n; i++) j += ns[i];
138*d4df40f3SStefano Zampini   PetscCheck(mnr == nl, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of roots in multi-leaves SF %" PetscInt_FMT " != %" PetscInt_FMT, mnr, nl);
139*d4df40f3SStefano Zampini   PetscCheck(mnl == j, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of leaves in multi-leaves SF %" PetscInt_FMT " != %" PetscInt_FMT, mnl, j);
140*d4df40f3SStefano Zampini   PetscCall(PetscMalloc2(2 * nl, &leaves, 2 * mnl, &mleaves));
141*d4df40f3SStefano Zampini   for (i = 0; i < nl; i++) {
142*d4df40f3SStefano Zampini     leaves[2 * i]     = -(rank + 1);
143*d4df40f3SStefano Zampini     leaves[2 * i + 1] = i;
144*d4df40f3SStefano Zampini   }
145*d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPrintf(viewer, "BLOCK MULTI-LEAVES INPUT\n"));
146*d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
147*d4df40f3SStefano Zampini   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*d4df40f3SStefano Zampini   PetscCall(PetscViewerFlush(viewer));
149*d4df40f3SStefano Zampini   PetscCall(PetscSFBcastBegin(mlsf, MPIU_2INT, leaves, mleaves, MPI_REPLACE));
150*d4df40f3SStefano Zampini   PetscCall(PetscSFBcastEnd(mlsf, MPIU_2INT, leaves, mleaves, MPI_REPLACE));
151*d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPrintf(viewer, "BLOCK MULTI-LEAVES OUTPUT\n"));
152*d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n));
153*d4df40f3SStefano Zampini   for (i = 0, k = 0; i < n; i++) {
154*d4df40f3SStefano Zampini     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i]));
155*d4df40f3SStefano Zampini     for (j = 0; j < ns[i]; j++) {
156*d4df40f3SStefano Zampini       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*d4df40f3SStefano Zampini     }
158*d4df40f3SStefano Zampini     k += ns[i];
159*d4df40f3SStefano Zampini   }
160*d4df40f3SStefano Zampini   PetscCall(PetscViewerFlush(viewer));
161*d4df40f3SStefano Zampini   PetscCall(PetscFree2(leaves, mleaves));
162*d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingRestoreBlockNodeInfo(ltog, &n, &ns, &ids));
163*d4df40f3SStefano Zampini 
164633354d9SStefano Zampini   PetscCall(ISLocalToGlobalMappingDestroy(&ltog));
165633354d9SStefano Zampini   PetscCall(PetscFinalize());
166633354d9SStefano Zampini   return 0;
167633354d9SStefano Zampini }
168633354d9SStefano Zampini 
169633354d9SStefano Zampini /*TEST
170633354d9SStefano Zampini 
171633354d9SStefano Zampini    test:
172633354d9SStefano Zampini      suffix: ltog_info
173633354d9SStefano Zampini      nsize: {{1 2 3 4 5}separate output}
174633354d9SStefano Zampini      args: -bs {{1 3}separate output} -test {{0 1 2}separate output}
175633354d9SStefano Zampini 
176633354d9SStefano Zampini TEST*/
177