17de13914SStefano Zampini static char help[] = "Tests ISLocalToGlobalMappingView() and ISLocalToGlobalMappingLoad()\n\n"; 27de13914SStefano Zampini 37de13914SStefano Zampini #include <petscis.h> 47de13914SStefano Zampini #include <petscviewer.h> 57de13914SStefano Zampini 67de13914SStefano Zampini static PetscErrorCode TestEqual(MPI_Comm comm, ISLocalToGlobalMapping m1, ISLocalToGlobalMapping m2, const char *tname) 77de13914SStefano Zampini { 87de13914SStefano Zampini PetscInt n1, n2, b1, b2; 97de13914SStefano Zampini const PetscInt *idx1, *idx2; 107de13914SStefano Zampini PetscBool flg; 117de13914SStefano Zampini 127de13914SStefano Zampini PetscFunctionBegin; 137de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetSize(m1, &n1)); 147de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockSize(m1, &b1)); 157de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetIndices(m1, &idx1)); 167de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetSize(m2, &n2)); 177de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockSize(m2, &b2)); 187de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetIndices(m2, &idx2)); 197de13914SStefano Zampini flg = (PetscBool)(b1 == b2); 207de13914SStefano Zampini if (!flg) PetscCall(PetscPrintf(PETSC_COMM_SELF, "%s: different block sizes %" PetscInt_FMT " %" PetscInt_FMT "\n", tname, b1, b2)); 217de13914SStefano Zampini flg = (PetscBool)(n1 == n2); 227de13914SStefano Zampini if (!flg) PetscCall(PetscPrintf(PETSC_COMM_SELF, "%s: different sizes %" PetscInt_FMT " %" PetscInt_FMT "\n", tname, n1, n2)); 237de13914SStefano Zampini if (flg) { 247de13914SStefano Zampini PetscCall(PetscArraycmp(idx1, idx2, n1, &flg)); 257de13914SStefano Zampini if (!flg) PetscCall(PetscPrintf(PETSC_COMM_SELF, "%s: different indices\n", tname)); 267de13914SStefano Zampini } 27*5440e5dcSBarry Smith PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, &flg, 1, MPI_C_BOOL, MPI_LAND, comm)); 287de13914SStefano Zampini if (!flg) { 297de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(m1, PETSC_VIEWER_STDOUT_(comm))); 307de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(m2, PETSC_VIEWER_STDOUT_(comm))); 317de13914SStefano Zampini } 327de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingRestoreIndices(m1, &idx1)); 337de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingRestoreIndices(m2, &idx2)); 347de13914SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 357de13914SStefano Zampini } 367de13914SStefano Zampini 377de13914SStefano Zampini int main(int argc, char **argv) 387de13914SStefano Zampini { 397de13914SStefano Zampini ISLocalToGlobalMapping lg1l, lg1v, lg1lh, lg2l, lg2v, lg2lh; 407de13914SStefano Zampini IS is1, is2; 417de13914SStefano Zampini PetscInt n, n1, n2, b1, b2; 427de13914SStefano Zampini PetscInt *idx; 437de13914SStefano Zampini PetscMPIInt size, rank; 447de13914SStefano Zampini PetscViewer vx; 457de13914SStefano Zampini MPI_Comm comm; 467de13914SStefano Zampini char fname[PETSC_MAX_PATH_LEN], fnameh[PETSC_MAX_PATH_LEN]; 477de13914SStefano Zampini 487de13914SStefano Zampini PetscFunctionBeginUser; 497de13914SStefano Zampini PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 507de13914SStefano Zampini PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 517de13914SStefano Zampini PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 527de13914SStefano Zampini PetscCall(ISCreateStride(PETSC_COMM_WORLD, size - rank, -size - 1, rank + 1, &is1)); 537de13914SStefano Zampini PetscCall(ISGetLocalSize(is1, &n)); 547de13914SStefano Zampini PetscCall(ISGetIndices(is1, (const PetscInt **)&idx)); 557de13914SStefano Zampini PetscCall(ISCreateBlock(PETSC_COMM_WORLD, 3, n, idx, PETSC_COPY_VALUES, &is2)); 567de13914SStefano Zampini PetscCall(ISRestoreIndices(is1, (const PetscInt **)&idx)); 577de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreateIS(is1, &lg1v)); 587de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreateIS(is2, &lg2v)); 597de13914SStefano Zampini PetscCall(ISDestroy(&is1)); 607de13914SStefano Zampini PetscCall(ISDestroy(&is2)); 617de13914SStefano Zampini 627de13914SStefano Zampini /* Test MATLAB ASCII viewer */ 637de13914SStefano Zampini PetscCall(PetscObjectSetName((PetscObject)lg1v, "map1")); 647de13914SStefano Zampini PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_ASCII_MATLAB)); 657de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, PETSC_VIEWER_STDOUT_WORLD)); 667de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, PETSC_VIEWER_STDOUT_WORLD)); 677de13914SStefano Zampini PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD)); 687de13914SStefano Zampini PetscCall(PetscObjectSetName((PetscObject)lg2v, "map2")); 697de13914SStefano Zampini 707de13914SStefano Zampini /* Now test view/load of type binary */ 717de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_WRITE, &vx)); 727de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, vx)); 737de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, vx)); 747de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 757de13914SStefano Zampini 767de13914SStefano Zampini PetscCall(PetscSNPrintf(fname, PETSC_STATIC_ARRAY_LENGTH(fname), "testfile_seq_%d", rank)); 777de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fname, FILE_MODE_WRITE, &vx)); 787de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, vx)); 797de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, vx)); 807de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 817de13914SStefano Zampini 827de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_WRITE, &vx)); 837de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 847de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, vx)); 857de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, vx)); 867de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 877de13914SStefano Zampini 887de13914SStefano Zampini PetscCall(PetscSNPrintf(fnameh, PETSC_STATIC_ARRAY_LENGTH(fname), "testfile_noheader_seq_%d", rank)); 897de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fnameh, FILE_MODE_WRITE, &vx)); 907de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 917de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, vx)); 927de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, vx)); 937de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 947de13914SStefano Zampini 957de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 77, 0, NULL, PETSC_USE_POINTER, &lg1l)); 967de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 99, 0, NULL, PETSC_OWN_POINTER, &lg2l)); 977de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetSize(lg1v, &n1)); 987de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockSize(lg1v, &b1)); 997de13914SStefano Zampini n1 /= b1; 1007de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetSize(lg2v, &n2)); 1017de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingGetBlockSize(lg2v, &b2)); 1027de13914SStefano Zampini n2 /= b2; 1037de13914SStefano Zampini PetscCall(PetscMalloc1(n1, &idx)); 1047de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_SELF, b1, n1, idx, PETSC_OWN_POINTER, &lg1lh)); 1057de13914SStefano Zampini PetscCall(PetscMalloc1(n2, &idx)); 1067de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_SELF, b2, n2, idx, PETSC_OWN_POINTER, &lg2lh)); 1077de13914SStefano Zampini 1087de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_READ, &vx)); 1097de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 1107de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 1117de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 1127de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_world_map_world 1")); 1137de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_world_map_world 2")); 1147de13914SStefano Zampini 1157de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_READ, &vx)); 1167de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 1177de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 1187de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 1197de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 1207de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_world_map_world_noheader 1")); 1217de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_world_map_world_noheader 2")); 1227de13914SStefano Zampini 1237de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_READ, &vx)); 1247de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 1257de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1lh, vx)); 1267de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2lh, vx)); 1277de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 1287de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1lh, "load_world_map_self_noheader 1")); 1297de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2lh, "load_world_map_self_noheader 2")); 1307de13914SStefano Zampini 1317de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fname, FILE_MODE_READ, &vx)); 1327de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 1337de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 1347de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 1357de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_self_map_world 1")); 1367de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_self_map_world 2")); 1377de13914SStefano Zampini 1387de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fnameh, FILE_MODE_READ, &vx)); 1397de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 1407de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 1417de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 1427de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 1437de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1l, "load_self_map_world_noheader 1")); 1447de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2l, "load_self_map_world_noheader 2")); 1457de13914SStefano Zampini 1467de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fnameh, FILE_MODE_READ, &vx)); 1477de13914SStefano Zampini PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE)); 1487de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1lh, vx)); 1497de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2lh, vx)); 1507de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 1517de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg1v, lg1lh, "load_self_map_self_noheader 1")); 1527de13914SStefano Zampini PetscCall(TestEqual(PETSC_COMM_WORLD, lg2v, lg2lh, "load_self_map_self_noheader 2")); 1537de13914SStefano Zampini 1547de13914SStefano Zampini PetscCall(PetscPrintf(PETSC_COMM_WORLD, "View world maps\n")); 1557de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1v, PETSC_VIEWER_STDOUT_WORLD)); 1567de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2v, PETSC_VIEWER_STDOUT_WORLD)); 1577de13914SStefano Zampini 1587de13914SStefano Zampini PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, rank < 2, rank, &comm)); 1597de13914SStefano Zampini if (rank < 2) { 1607de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg1l)); 1617de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg2l)); 1627de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(comm, 77, 1, &n, PETSC_USE_POINTER, &lg1l)); 1637de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(comm, 99, 0, NULL, PETSC_OWN_POINTER, &lg2l)); 1647de13914SStefano Zampini 1657de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(comm, "testfile", FILE_MODE_READ, &vx)); 1667de13914SStefano Zampini PetscCall(PetscPrintf(comm, "View world maps loaded from subcomm\n")); 1677de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 1687de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 1697de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1l, PETSC_VIEWER_STDOUT_(comm))); 1707de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2l, PETSC_VIEWER_STDOUT_(comm))); 1717de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 1727de13914SStefano Zampini 1737de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg1l)); 1747de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg2l)); 1757de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(comm, 77, 1, &n, PETSC_USE_POINTER, &lg1l)); 1767de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingCreate(comm, 99, 0, NULL, PETSC_OWN_POINTER, &lg2l)); 1777de13914SStefano Zampini PetscCall(PetscViewerBinaryOpen(comm, "testfile_seq_0", FILE_MODE_READ, &vx)); 1787de13914SStefano Zampini PetscCall(PetscPrintf(comm, "View sequential maps from rank 0 loaded from subcomm\n")); 1797de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg1l, vx)); 1807de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingLoad(lg2l, vx)); 1817de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg1l, PETSC_VIEWER_STDOUT_(comm))); 1827de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingView(lg2l, PETSC_VIEWER_STDOUT_(comm))); 1837de13914SStefano Zampini PetscCall(PetscViewerDestroy(&vx)); 1847de13914SStefano Zampini } 1857de13914SStefano Zampini PetscCallMPI(MPI_Comm_free(&comm)); 1867de13914SStefano Zampini 1877de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg1lh)); 1887de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg2lh)); 1897de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg1l)); 1907de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg2l)); 1917de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg1v)); 1927de13914SStefano Zampini PetscCall(ISLocalToGlobalMappingDestroy(&lg2v)); 1937de13914SStefano Zampini PetscCall(PetscFinalize()); 1947de13914SStefano Zampini return 0; 1957de13914SStefano Zampini } 1967de13914SStefano Zampini 1977de13914SStefano Zampini /*TEST 1987de13914SStefano Zampini 1997de13914SStefano Zampini testset: 2007de13914SStefano Zampini args: -viewer_binary_mpiio 0 2017de13914SStefano Zampini test: 2027de13914SStefano Zampini output_file: output/ex8_1_1.out 2037de13914SStefano Zampini suffix: 1_stdio_1 2047de13914SStefano Zampini nsize: 1 2057de13914SStefano Zampini test: 2067de13914SStefano Zampini output_file: output/ex8_1_2.out 2077de13914SStefano Zampini suffix: 1_stdio_2 2087de13914SStefano Zampini nsize: 2 2097de13914SStefano Zampini test: 2107de13914SStefano Zampini output_file: output/ex8_1_3.out 2117de13914SStefano Zampini suffix: 1_stdio_3 2127de13914SStefano Zampini nsize: 3 2137de13914SStefano Zampini 2147de13914SStefano Zampini testset: 2157de13914SStefano Zampini requires: mpiio 2167de13914SStefano Zampini args: -viewer_binary_mpiio 1 2177de13914SStefano Zampini test: 2187de13914SStefano Zampini output_file: output/ex8_1_1.out 2197de13914SStefano Zampini suffix: 1_mpiio_1 2207de13914SStefano Zampini nsize: 1 2217de13914SStefano Zampini test: 2227de13914SStefano Zampini output_file: output/ex8_1_2.out 2237de13914SStefano Zampini suffix: 1_mpiio_2 2247de13914SStefano Zampini nsize: 2 2257de13914SStefano Zampini test: 2267de13914SStefano Zampini output_file: output/ex8_1_3.out 2277de13914SStefano Zampini suffix: 1_mpiio_3 2287de13914SStefano Zampini nsize: 3 2297de13914SStefano Zampini 2307de13914SStefano Zampini TEST*/ 231