1 static char help[] = "Tests ISLocalToGlobalMappingGetInfo() and ISLocalToGlobalMappingGetNodeInfo().\n\n"; 2 3 #include <petscis.h> 4 #include <petscsf.h> 5 #include <petscviewer.h> 6 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