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