1*7de13914SStefano Zampini static char help[] = "Tests ISLocalToGlobalMappingView() and ISLocalToGlobalMappingLoad()\n\n"; 2*7de13914SStefano Zampini 3*7de13914SStefano Zampini #include <petscis.h> 4*7de13914SStefano Zampini #include <petscviewer.h> 5*7de13914SStefano Zampini 6*7de13914SStefano Zampini static PetscErrorCode TestEqual(MPI_Comm comm, ISLocalToGlobalMapping m1, ISLocalToGlobalMapping m2, const char *tname) 7*7de13914SStefano Zampini { 8*7de13914SStefano Zampini PetscInt n1, n2, b1, b2; 9*7de13914SStefano Zampini const PetscInt *idx1, *idx2; 10*7de13914SStefano Zampini PetscBool flg; 11*7de13914SStefano Zampini 12*7de13914SStefano Zampini PetscFunctionBegin; 13*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetSize(m1, &n1)); 14*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockSize(m1, &b1)); 15*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetIndices(m1, &idx1)); 16*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetSize(m2, &n2)); 17*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockSize(m2, &b2)); 18*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetIndices(m2, &idx2)); 19*7de13914SStefano Zampini flg = (PetscBool)(b1 == b2); 20*7de13914SStefano Zampini if (!flg) PetscCall(PetscPrintf(PETSC_COMM_SELF, "%s: different block sizes %" PetscInt_FMT " %" PetscInt_FMT "\n", tname, b1, b2)); 21*7de13914SStefano Zampini flg = (PetscBool)(n1 == n2); 22*7de13914SStefano Zampini if (!flg) PetscCall(PetscPrintf(PETSC_COMM_SELF, "%s: different sizes %" PetscInt_FMT " %" PetscInt_FMT "\n", tname, n1, n2)); 23*7de13914SStefano Zampini if (flg) { 24*7de13914SStefano Zampini PetscCall(PetscArraycmp(idx1, idx2, n1, &flg)); 25*7de13914SStefano Zampini if (!flg) PetscCall(PetscPrintf(PETSC_COMM_SELF, "%s: different indices\n", tname)); 26*7de13914SStefano Zampini } 27*7de13914SStefano Zampini PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, &flg, 1, MPIU_BOOL, MPI_LAND, comm)); 28*7de13914SStefano Zampini if (!flg) { 29*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(m1, PETSC_VIEWER_STDOUT_(comm))); 30*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(m2, PETSC_VIEWER_STDOUT_(comm))); 31*7de13914SStefano Zampini } 32*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingRestoreIndices(m1, &idx1)); 33*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingRestoreIndices(m2, &idx2)); 34*7de13914SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 35*7de13914SStefano Zampini } 36*7de13914SStefano Zampini 37*7de13914SStefano Zampini int main(int argc, char **argv) 38*7de13914SStefano Zampini { 39*7de13914SStefano Zampini ISLocalToGlobalMapping lg1l, lg1v, lg1lh, lg2l, lg2v, lg2lh; 40*7de13914SStefano Zampini IS is1, is2; 41*7de13914SStefano Zampini PetscInt n, n1, n2, b1, b2; 42*7de13914SStefano Zampini PetscInt *idx; 43*7de13914SStefano Zampini PetscMPIInt size, rank; 44*7de13914SStefano Zampini PetscViewer vx; 45*7de13914SStefano Zampini MPI_Comm comm; 46*7de13914SStefano Zampini char fname[PETSC_MAX_PATH_LEN], fnameh[PETSC_MAX_PATH_LEN]; 47*7de13914SStefano Zampini 48*7de13914SStefano Zampini PetscFunctionBeginUser; 49*7de13914SStefano Zampini PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 50*7de13914SStefano Zampini PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 51*7de13914SStefano Zampini PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 52*7de13914SStefano Zampini PetscCall(ISCreateStride(PETSC_COMM_WORLD, size - rank, -size - 1, rank + 1, &is1)); 53*7de13914SStefano Zampini PetscCall(ISGetLocalSize(is1, &n)); 54*7de13914SStefano Zampini PetscCall(ISGetIndices(is1, (const PetscInt **)&idx)); 55*7de13914SStefano Zampini PetscCall(ISCreateBlock(PETSC_COMM_WORLD, 3, n, idx, PETSC_COPY_VALUES, &is2)); 56*7de13914SStefano Zampini PetscCall(ISRestoreIndices(is1, (const PetscInt **)&idx)); 57*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreateIS(is1, &lg1v)); 58*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreateIS(is2, &lg2v)); 59*7de13914SStefano Zampini PetscCall(ISDestroy(&is1)); 60*7de13914SStefano Zampini PetscCall(ISDestroy(&is2)); 61*7de13914SStefano Zampini 62*7de13914SStefano Zampini /* Test MATLAB ASCII viewer */ 63*7de13914SStefano Zampini PetscCall(PetscObjectSetName((PetscObject)lg1v, "map1")); 64*7de13914SStefano Zampini PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_ASCII_MATLAB)); 65*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, PETSC_VIEWER_STDOUT_WORLD)); 66*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, PETSC_VIEWER_STDOUT_WORLD)); 67*7de13914SStefano Zampini PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD)); 68*7de13914SStefano Zampini PetscCall(PetscObjectSetName((PetscObject)lg2v, "map2")); 69*7de13914SStefano Zampini 70*7de13914SStefano Zampini /* Now test view/load of type binary */ 71*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_WRITE, &vx)); 72*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, vx)); 73*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, vx)); 74*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 75*7de13914SStefano Zampini 76*7de13914SStefano Zampini PetscCall(PetscSNPrintf(fname, PETSC_STATIC_ARRAY_LENGTH(fname), "testfile_seq_%d", rank)); 77*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fname, FILE_MODE_WRITE, &vx)); 78*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, vx)); 79*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, vx)); 80*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 81*7de13914SStefano Zampini 82*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_WRITE, &vx)); 83*7de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 84*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, vx)); 85*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, vx)); 86*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 87*7de13914SStefano Zampini 88*7de13914SStefano Zampini PetscCall(PetscSNPrintf(fnameh, PETSC_STATIC_ARRAY_LENGTH(fname), "testfile_noheader_seq_%d", rank)); 89*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fnameh, FILE_MODE_WRITE, &vx)); 90*7de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 91*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, vx)); 92*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, vx)); 93*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 94*7de13914SStefano Zampini 95*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 77, 0, NULL, PETSC_USE_POINTER, &lg1l)); 96*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 99, 0, NULL, PETSC_OWN_POINTER, &lg2l)); 97*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetSize(lg1v, &n1)); 98*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockSize(lg1v, &b1)); 99*7de13914SStefano Zampini n1 /= b1; 100*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetSize(lg2v, &n2)); 101*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockSize(lg2v, &b2)); 102*7de13914SStefano Zampini n2 /= b2; 103*7de13914SStefano Zampini PetscCall(PetscMalloc1(n1, &idx)); 104*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_SELF, b1, n1, idx, PETSC_OWN_POINTER, &lg1lh)); 105*7de13914SStefano Zampini PetscCall(PetscMalloc1(n2, &idx)); 106*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_SELF, b2, n2, idx, PETSC_OWN_POINTER, &lg2lh)); 107*7de13914SStefano Zampini 108*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_READ, &vx)); 109*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 110*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 111*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 112*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_world_map_world 1")); 113*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_world_map_world 2")); 114*7de13914SStefano Zampini 115*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_READ, &vx)); 116*7de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 117*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 118*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 119*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 120*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_world_map_world_noheader 1")); 121*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_world_map_world_noheader 2")); 122*7de13914SStefano Zampini 123*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_READ, &vx)); 124*7de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 125*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1lh, vx)); 126*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2lh, vx)); 127*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 128*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1lh, "load_world_map_self_noheader 1")); 129*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2lh, "load_world_map_self_noheader 2")); 130*7de13914SStefano Zampini 131*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fname, FILE_MODE_READ, &vx)); 132*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 133*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 134*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 135*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_self_map_world 1")); 136*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_self_map_world 2")); 137*7de13914SStefano Zampini 138*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fnameh, FILE_MODE_READ, &vx)); 139*7de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 140*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 141*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 142*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 143*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_self_map_world_noheader 1")); 144*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_self_map_world_noheader 2")); 145*7de13914SStefano Zampini 146*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fnameh, FILE_MODE_READ, &vx)); 147*7de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 148*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1lh, vx)); 149*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2lh, vx)); 150*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 151*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1lh, "load_self_map_self_noheader 1")); 152*7de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2lh, "load_self_map_self_noheader 2")); 153*7de13914SStefano Zampini 154*7de13914SStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "View world maps\n")); 155*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, PETSC_VIEWER_STDOUT_WORLD)); 156*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, PETSC_VIEWER_STDOUT_WORLD)); 157*7de13914SStefano Zampini 158*7de13914SStefano Zampini PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, rank < 2, rank, &comm)); 159*7de13914SStefano Zampini if (rank < 2) { 160*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg1l)); 161*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg2l)); 162*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(comm, 77, 1, &n, PETSC_USE_POINTER, &lg1l)); 163*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(comm, 99, 0, NULL, PETSC_OWN_POINTER, &lg2l)); 164*7de13914SStefano Zampini 165*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(comm, "testfile", FILE_MODE_READ, &vx)); 166*7de13914SStefano Zampini PetscCall(PetscPrintf(comm, "View world maps loaded from subcomm\n")); 167*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 168*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 169*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1l, PETSC_VIEWER_STDOUT_(comm))); 170*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2l, PETSC_VIEWER_STDOUT_(comm))); 171*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 172*7de13914SStefano Zampini 173*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg1l)); 174*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg2l)); 175*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(comm, 77, 1, &n, PETSC_USE_POINTER, &lg1l)); 176*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(comm, 99, 0, NULL, PETSC_OWN_POINTER, &lg2l)); 177*7de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(comm, "testfile_seq_0", FILE_MODE_READ, &vx)); 178*7de13914SStefano Zampini PetscCall(PetscPrintf(comm, "View sequential maps from rank 0 loaded from subcomm\n")); 179*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 180*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 181*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1l, PETSC_VIEWER_STDOUT_(comm))); 182*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2l, PETSC_VIEWER_STDOUT_(comm))); 183*7de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 184*7de13914SStefano Zampini } 185*7de13914SStefano Zampini PetscCallMPI(MPI_Comm_free(&comm)); 186*7de13914SStefano Zampini 187*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg1lh)); 188*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg2lh)); 189*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg1l)); 190*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg2l)); 191*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg1v)); 192*7de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg2v)); 193*7de13914SStefano Zampini PetscCall(PetscFinalize()); 194*7de13914SStefano Zampini return 0; 195*7de13914SStefano Zampini } 196*7de13914SStefano Zampini 197*7de13914SStefano Zampini /*TEST 198*7de13914SStefano Zampini 199*7de13914SStefano Zampini testset: 200*7de13914SStefano Zampini args: -viewer_binary_mpiio 0 201*7de13914SStefano Zampini test: 202*7de13914SStefano Zampini output_file: output/ex8_1_1.out 203*7de13914SStefano Zampini suffix: 1_stdio_1 204*7de13914SStefano Zampini nsize: 1 205*7de13914SStefano Zampini test: 206*7de13914SStefano Zampini output_file: output/ex8_1_2.out 207*7de13914SStefano Zampini suffix: 1_stdio_2 208*7de13914SStefano Zampini nsize: 2 209*7de13914SStefano Zampini test: 210*7de13914SStefano Zampini output_file: output/ex8_1_3.out 211*7de13914SStefano Zampini suffix: 1_stdio_3 212*7de13914SStefano Zampini nsize: 3 213*7de13914SStefano Zampini 214*7de13914SStefano Zampini testset: 215*7de13914SStefano Zampini requires: mpiio 216*7de13914SStefano Zampini args: -viewer_binary_mpiio 1 217*7de13914SStefano Zampini test: 218*7de13914SStefano Zampini output_file: output/ex8_1_1.out 219*7de13914SStefano Zampini suffix: 1_mpiio_1 220*7de13914SStefano Zampini nsize: 1 221*7de13914SStefano Zampini test: 222*7de13914SStefano Zampini output_file: output/ex8_1_2.out 223*7de13914SStefano Zampini suffix: 1_mpiio_2 224*7de13914SStefano Zampini nsize: 2 225*7de13914SStefano Zampini test: 226*7de13914SStefano Zampini output_file: output/ex8_1_3.out 227*7de13914SStefano Zampini suffix: 1_mpiio_3 228*7de13914SStefano Zampini nsize: 3 229*7de13914SStefano Zampini 230*7de13914SStefano Zampini TEST*/ 231