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, &ltog));
 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, &ltog));
 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, &ltog));
 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, &ltog));
 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, &ltog));
 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, &ltog));
 45:         } else {
 46:           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
 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, &ltog));
 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, &ltog));
 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, &ltog));
 63:         } else if (rank == 2) {
 64:           PetscInt id[3] = {3, 6, 2};
 65:           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
 66:         } else if (rank == 3) {
 67:           PetscInt id[3] = {3, 5, 8};
 68:           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, &ltog));
 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, &ltog));
 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, &ltog));
 77:         } else {
 78:           PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
 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, &ltog));
 84:     }
 85:     break;
 86:   default:
 87:     PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, &ltog));
 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(&ltog));
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*/