Actual source code: ex7.c
1: static char help[] = "Tests ISLocalToGlobalMappingGetInfo() and ISLocalToGlobalMappingGetNodeInfo().\n\n";
3: #include <petscis.h>
4: #include <petscsf.h>
5: #include <petscviewer.h>
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;
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));
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));
164: PetscCall(ISLocalToGlobalMappingDestroy(<og));
165: PetscCall(PetscFinalize());
166: return 0;
167: }
169: /*TEST
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}
176: TEST*/