xref: /petsc/src/vec/is/tests/ex7.c (revision 834855d6effb0d027771461c8e947ee1ce5a1e17)
1633354d9SStefano Zampini static char help[] = "Tests ISLocalToGlobalMappingGetInfo() and ISLocalToGlobalMappingGetNodeInfo().\n\n";
2633354d9SStefano Zampini 
3633354d9SStefano Zampini #include <petscis.h>
4d4df40f3SStefano 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;
10d4df40f3SStefano Zampini   PetscSF                mlsf;
11d4df40f3SStefano Zampini   PetscInt              *p, *ns, **ids, *leaves, *mleaves;
12d4df40f3SStefano 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 
16c8025a54SPierre Jolivet   PetscCall(PetscInitialize(&argc, &argv, NULL, 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]));
98*3a7d0413SPierre Jolivet     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]));
108*3a7d0413SPierre Jolivet     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));
112d4df40f3SStefano Zampini 
113d4df40f3SStefano Zampini   /* Test block */
114d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPrintf(viewer, "GETBLOCKINFO OUTPUT\n"));
115d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
116d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingGetBlockInfo(ltog, &np, &p, &ns, &ids));
117d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local NP %" PetscInt_FMT "\n", rank, np));
118d4df40f3SStefano Zampini   for (i = 0; i < np; i++) {
119d4df40f3SStefano Zampini     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   procs[%" PetscInt_FMT "] = %" PetscInt_FMT ", shared %" PetscInt_FMT "\n", rank, i, p[i], ns[i]));
120*3a7d0413SPierre Jolivet     for (j = 0; j < ns[i]; j++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j]));
121d4df40f3SStefano Zampini   }
122d4df40f3SStefano Zampini   PetscCall(PetscViewerFlush(viewer));
123d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingRestoreBlockInfo(ltog, &np, &p, &ns, &ids));
124d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPrintf(viewer, "GETBLOCKNODEINFO OUTPUT\n"));
125d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingGetBlockNodeInfo(ltog, &n, &ns, &ids));
126d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
127d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n));
128d4df40f3SStefano Zampini   for (i = 0; i < n; i++) {
129d4df40f3SStefano Zampini     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i]));
130*3a7d0413SPierre Jolivet     for (j = 0; j < ns[i]; j++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]     ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j]));
131d4df40f3SStefano Zampini   }
132d4df40f3SStefano Zampini   PetscCall(PetscViewerFlush(viewer));
133d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingGetBlockMultiLeavesSF(ltog, &mlsf));
134d4df40f3SStefano Zampini   PetscCall(PetscSFGetGraph(mlsf, &mnr, &mnl, NULL, NULL));
135d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingGetSize(ltog, &nl));
136d4df40f3SStefano Zampini   nl /= bs;
137d4df40f3SStefano Zampini   for (i = 0, j = 0; i < n; i++) j += ns[i];
138d4df40f3SStefano Zampini   PetscCheck(mnr == nl, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of roots in multi-leaves SF %" PetscInt_FMT " != %" PetscInt_FMT, mnr, nl);
139d4df40f3SStefano Zampini   PetscCheck(mnl == j, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of leaves in multi-leaves SF %" PetscInt_FMT " != %" PetscInt_FMT, mnl, j);
140d4df40f3SStefano Zampini   PetscCall(PetscMalloc2(2 * nl, &leaves, 2 * mnl, &mleaves));
141d4df40f3SStefano Zampini   for (i = 0; i < nl; i++) {
142d4df40f3SStefano Zampini     leaves[2 * i]     = -(rank + 1);
143d4df40f3SStefano Zampini     leaves[2 * i + 1] = i;
144d4df40f3SStefano Zampini   }
145d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPrintf(viewer, "BLOCK MULTI-LEAVES INPUT\n"));
146d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
147*3a7d0413SPierre Jolivet   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]));
148d4df40f3SStefano Zampini   PetscCall(PetscViewerFlush(viewer));
149d4df40f3SStefano Zampini   PetscCall(PetscSFBcastBegin(mlsf, MPIU_2INT, leaves, mleaves, MPI_REPLACE));
150d4df40f3SStefano Zampini   PetscCall(PetscSFBcastEnd(mlsf, MPIU_2INT, leaves, mleaves, MPI_REPLACE));
151d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIIPrintf(viewer, "BLOCK MULTI-LEAVES OUTPUT\n"));
152d4df40f3SStefano Zampini   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n));
153d4df40f3SStefano Zampini   for (i = 0, k = 0; i < n; i++) {
154d4df40f3SStefano Zampini     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d]   sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i]));
155d4df40f3SStefano Zampini     for (j = 0; j < ns[i]; j++) {
156d4df40f3SStefano 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]));
157d4df40f3SStefano Zampini     }
158d4df40f3SStefano Zampini     k += ns[i];
159d4df40f3SStefano Zampini   }
160d4df40f3SStefano Zampini   PetscCall(PetscViewerFlush(viewer));
161d4df40f3SStefano Zampini   PetscCall(PetscFree2(leaves, mleaves));
162d4df40f3SStefano Zampini   PetscCall(ISLocalToGlobalMappingRestoreBlockNodeInfo(ltog, &n, &ns, &ids));
163d4df40f3SStefano 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