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