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