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