1 static char help[] = "Tests ISLocalToGlobalMappingGetInfo() and ISLocalToGlobalMappingGetNodeInfo().\n\n";
2
3 #include <petscis.h>
4 #include <petscsf.h>
5 #include <petscviewer.h>
6
main(int argc,char ** argv)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, <og));
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, <og));
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, <og));
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, <og));
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, <og));
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, <og));
45 } else {
46 PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, <og));
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, <og));
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, <og));
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, <og));
63 } else if (rank == 2) {
64 PetscInt id[3] = {3, 6, 2};
65 PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, <og));
66 } else if (rank == 3) {
67 PetscInt id[3] = {3, 5, 8};
68 PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, <og));
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, <og));
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, <og));
77 } else {
78 PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, <og));
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, <og));
84 }
85 break;
86 default:
87 PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, <og));
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(<og));
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