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