xref: /petsc/src/vec/is/tests/ex8.c (revision 8112c1cbf372cb53bf7c5aca994a84a6a303db4d)
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