1633354d9SStefano Zampini static char help[] = "Tests ISLocalToGlobalMappingGetInfo() and ISLocalToGlobalMappingGetNodeInfo().\n\n"; 2633354d9SStefano Zampini 3633354d9SStefano Zampini #include <petscis.h> 4d4df40f3SStefano Zampini #include <petscsf.h> 5633354d9SStefano Zampini #include <petscviewer.h> 6633354d9SStefano Zampini 7633354d9SStefano Zampini int main(int argc, char **argv) 8633354d9SStefano Zampini { 9633354d9SStefano Zampini ISLocalToGlobalMapping ltog = NULL; 10d4df40f3SStefano Zampini PetscSF mlsf; 11d4df40f3SStefano Zampini PetscInt *p, *ns, **ids, *leaves, *mleaves; 12d4df40f3SStefano Zampini PetscInt nl, mnl, mnr, i, j, k, n, np, bs = 1, test = 0; 13633354d9SStefano Zampini PetscViewer viewer; 14633354d9SStefano Zampini PetscMPIInt rank, size; 15633354d9SStefano Zampini 16c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 17633354d9SStefano Zampini PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 18633354d9SStefano Zampini PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 19633354d9SStefano Zampini PetscCall(PetscOptionsGetInt(NULL, NULL, "-test", &test, NULL)); 20633354d9SStefano Zampini PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL)); 21633354d9SStefano Zampini switch (test) { 22633354d9SStefano Zampini case 1: /* quads */ 23633354d9SStefano Zampini if (size > 1) { 24633354d9SStefano Zampini if (size == 4) { 25633354d9SStefano Zampini if (rank == 0) { 26633354d9SStefano Zampini PetscInt id[4] = {0, 1, 2, 3}; 27633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, <og)); 28633354d9SStefano Zampini } else if (rank == 1) { 29633354d9SStefano Zampini PetscInt id[4] = {2, 3, 6, 7}; 30633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, <og)); 31633354d9SStefano Zampini } else if (rank == 2) { 32633354d9SStefano Zampini PetscInt id[4] = {1, 4, 3, 5}; 33633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, <og)); 34633354d9SStefano Zampini } else if (rank == 3) { 35633354d9SStefano Zampini PetscInt id[8] = {3, 5, 7, 8}; 36633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, <og)); 37633354d9SStefano Zampini } 38633354d9SStefano Zampini } else { 39633354d9SStefano Zampini if (rank == 0) { 40633354d9SStefano Zampini PetscInt id[8] = {0, 1, 2, 3, 1, 4, 3, 5}; 41633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 8, id, PETSC_COPY_VALUES, <og)); 42633354d9SStefano Zampini } else if (rank == size - 1) { 43633354d9SStefano Zampini PetscInt id[8] = {2, 3, 6, 7, 3, 5, 7, 8}; 44633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 8, id, PETSC_COPY_VALUES, <og)); 45633354d9SStefano Zampini } else { 46633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, <og)); 47633354d9SStefano Zampini } 48633354d9SStefano Zampini } 49633354d9SStefano Zampini } else { 50633354d9SStefano Zampini PetscInt id[16] = {0, 1, 2, 3, 1, 4, 3, 5, 2, 3, 6, 7, 3, 5, 7, 8}; 51633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 16, id, PETSC_COPY_VALUES, <og)); 52633354d9SStefano Zampini } 53633354d9SStefano Zampini break; 54633354d9SStefano Zampini case 2: /* mix quads and tets with holes */ 55633354d9SStefano Zampini if (size > 1) { 56633354d9SStefano Zampini if (size == 4) { 57633354d9SStefano Zampini if (rank == 0) { 58633354d9SStefano Zampini PetscInt id[3] = {1, 2, 3}; 59633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, <og)); 60633354d9SStefano Zampini } else if (rank == 1) { 61633354d9SStefano Zampini PetscInt id[4] = {1, 4, 5, 3}; 62633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, <og)); 63633354d9SStefano Zampini } else if (rank == 2) { 64633354d9SStefano Zampini PetscInt id[3] = {3, 6, 2}; 65633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, <og)); 66633354d9SStefano Zampini } else if (rank == 3) { 67633354d9SStefano Zampini PetscInt id[3] = {3, 5, 8}; 68633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 3, id, PETSC_COPY_VALUES, <og)); 69633354d9SStefano Zampini } 70633354d9SStefano Zampini } else { 71633354d9SStefano Zampini if (rank == 0) { 72633354d9SStefano Zampini PetscInt id[9] = {1, 2, 3, 3, 5, 8, 3, 6, 2}; 73633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 9, id, PETSC_COPY_VALUES, <og)); 74633354d9SStefano Zampini } else if (rank == size - 1) { 75633354d9SStefano Zampini PetscInt id[4] = {5, 3, 1, 4}; 76633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 4, id, PETSC_COPY_VALUES, <og)); 77633354d9SStefano Zampini } else { 78633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, <og)); 79633354d9SStefano Zampini } 80633354d9SStefano Zampini } 81633354d9SStefano Zampini } else { 82633354d9SStefano Zampini PetscInt id[13] = {1, 2, 3, 1, 4, 5, 3, 6, 3, 2, 5, 3, 8}; 83633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 13, id, PETSC_COPY_VALUES, <og)); 84633354d9SStefano Zampini } 85633354d9SStefano Zampini break; 86633354d9SStefano Zampini default: 87633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, bs, 0, NULL, PETSC_COPY_VALUES, <og)); 88633354d9SStefano Zampini break; 89633354d9SStefano Zampini } 90633354d9SStefano Zampini PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ltog), &viewer)); 91633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingView(ltog, viewer)); 92633354d9SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, "GETINFO OUTPUT\n")); 93633354d9SStefano Zampini PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 94633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingGetInfo(ltog, &np, &p, &ns, &ids)); 95633354d9SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local NP %" PetscInt_FMT "\n", rank, np)); 96633354d9SStefano Zampini for (i = 0; i < np; i++) { 97633354d9SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] procs[%" PetscInt_FMT "] = %" PetscInt_FMT ", shared %" PetscInt_FMT "\n", rank, i, p[i], ns[i])); 98*3a7d0413SPierre Jolivet for (j = 0; j < ns[i]; j++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); 99633354d9SStefano Zampini } 100633354d9SStefano Zampini PetscCall(PetscViewerFlush(viewer)); 101633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingRestoreInfo(ltog, &np, &p, &ns, &ids)); 102633354d9SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, "GETNODEINFO OUTPUT\n")); 103633354d9SStefano Zampini PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 104633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingGetNodeInfo(ltog, &n, &ns, &ids)); 105633354d9SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n)); 106633354d9SStefano Zampini for (i = 0; i < n; i++) { 107633354d9SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i])); 108*3a7d0413SPierre Jolivet for (j = 0; j < ns[i]; j++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); 109633354d9SStefano Zampini } 110633354d9SStefano Zampini PetscCall(PetscViewerFlush(viewer)); 111633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingRestoreNodeInfo(ltog, &n, &ns, &ids)); 112d4df40f3SStefano Zampini 113d4df40f3SStefano Zampini /* Test block */ 114d4df40f3SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, "GETBLOCKINFO OUTPUT\n")); 115d4df40f3SStefano Zampini PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 116d4df40f3SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockInfo(ltog, &np, &p, &ns, &ids)); 117d4df40f3SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local NP %" PetscInt_FMT "\n", rank, np)); 118d4df40f3SStefano Zampini for (i = 0; i < np; i++) { 119d4df40f3SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] procs[%" PetscInt_FMT "] = %" PetscInt_FMT ", shared %" PetscInt_FMT "\n", rank, i, p[i], ns[i])); 120*3a7d0413SPierre Jolivet for (j = 0; j < ns[i]; j++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); 121d4df40f3SStefano Zampini } 122d4df40f3SStefano Zampini PetscCall(PetscViewerFlush(viewer)); 123d4df40f3SStefano Zampini PetscCall(ISLocalToGlobalMappingRestoreBlockInfo(ltog, &np, &p, &ns, &ids)); 124d4df40f3SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, "GETBLOCKNODEINFO OUTPUT\n")); 125d4df40f3SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockNodeInfo(ltog, &n, &ns, &ids)); 126d4df40f3SStefano Zampini PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 127d4df40f3SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n)); 128d4df40f3SStefano Zampini for (i = 0; i < n; i++) { 129d4df40f3SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i])); 130*3a7d0413SPierre Jolivet for (j = 0; j < ns[i]; j++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] ids[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, j, ids[i][j])); 131d4df40f3SStefano Zampini } 132d4df40f3SStefano Zampini PetscCall(PetscViewerFlush(viewer)); 133d4df40f3SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockMultiLeavesSF(ltog, &mlsf)); 134d4df40f3SStefano Zampini PetscCall(PetscSFGetGraph(mlsf, &mnr, &mnl, NULL, NULL)); 135d4df40f3SStefano Zampini PetscCall(ISLocalToGlobalMappingGetSize(ltog, &nl)); 136d4df40f3SStefano Zampini nl /= bs; 137d4df40f3SStefano Zampini for (i = 0, j = 0; i < n; i++) j += ns[i]; 138d4df40f3SStefano Zampini PetscCheck(mnr == nl, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of roots in multi-leaves SF %" PetscInt_FMT " != %" PetscInt_FMT, mnr, nl); 139d4df40f3SStefano Zampini PetscCheck(mnl == j, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of leaves in multi-leaves SF %" PetscInt_FMT " != %" PetscInt_FMT, mnl, j); 140d4df40f3SStefano Zampini PetscCall(PetscMalloc2(2 * nl, &leaves, 2 * mnl, &mleaves)); 141d4df40f3SStefano Zampini for (i = 0; i < nl; i++) { 142d4df40f3SStefano Zampini leaves[2 * i] = -(rank + 1); 143d4df40f3SStefano Zampini leaves[2 * i + 1] = i; 144d4df40f3SStefano Zampini } 145d4df40f3SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, "BLOCK MULTI-LEAVES INPUT\n")); 146d4df40f3SStefano Zampini PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 147*3a7d0413SPierre Jolivet 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])); 148d4df40f3SStefano Zampini PetscCall(PetscViewerFlush(viewer)); 149d4df40f3SStefano Zampini PetscCall(PetscSFBcastBegin(mlsf, MPIU_2INT, leaves, mleaves, MPI_REPLACE)); 150d4df40f3SStefano Zampini PetscCall(PetscSFBcastEnd(mlsf, MPIU_2INT, leaves, mleaves, MPI_REPLACE)); 151d4df40f3SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, "BLOCK MULTI-LEAVES OUTPUT\n")); 152d4df40f3SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Local N %" PetscInt_FMT "\n", rank, n)); 153d4df40f3SStefano Zampini for (i = 0, k = 0; i < n; i++) { 154d4df40f3SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] sharedby[%" PetscInt_FMT "] = %" PetscInt_FMT "\n", rank, i, ns[i])); 155d4df40f3SStefano Zampini for (j = 0; j < ns[i]; j++) { 156d4df40f3SStefano Zampini 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])); 157d4df40f3SStefano Zampini } 158d4df40f3SStefano Zampini k += ns[i]; 159d4df40f3SStefano Zampini } 160d4df40f3SStefano Zampini PetscCall(PetscViewerFlush(viewer)); 161d4df40f3SStefano Zampini PetscCall(PetscFree2(leaves, mleaves)); 162d4df40f3SStefano Zampini PetscCall(ISLocalToGlobalMappingRestoreBlockNodeInfo(ltog, &n, &ns, &ids)); 163d4df40f3SStefano Zampini 164633354d9SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(<og)); 165633354d9SStefano Zampini PetscCall(PetscFinalize()); 166633354d9SStefano Zampini return 0; 167633354d9SStefano Zampini } 168633354d9SStefano Zampini 169633354d9SStefano Zampini /*TEST 170633354d9SStefano Zampini 171633354d9SStefano Zampini test: 172633354d9SStefano Zampini suffix: ltog_info 173633354d9SStefano Zampini nsize: {{1 2 3 4 5}separate output} 174633354d9SStefano Zampini args: -bs {{1 3}separate output} -test {{0 1 2}separate output} 175633354d9SStefano Zampini 176633354d9SStefano Zampini TEST*/ 177