1 static char help[] = "Tests ISView() and ISLoad() \n\n";
2
3 #include <petscis.h>
4 #include <petscviewer.h>
5
main(int argc,char ** argv)6 int main(int argc, char **argv)
7 {
8 PetscInt n = 3, *izero, j, i;
9 PetscInt ix[3][3][3] = {
10 {{3, 5, 4}, {1, 7, 9}, {0, 2, 8}},
11 {{0, 2, 8}, {3, 5, 4}, {1, 7, 9}},
12 {{1, 7, 9}, {0, 2, 8}, {3, 5, 4}}
13 };
14 IS isx[3], il;
15 PetscMPIInt size, rank;
16 PetscViewer vx, vl;
17 PetscBool equal;
18
19 PetscFunctionBeginUser;
20 PetscCall(PetscInitialize(&argc, &argv, NULL, help));
21 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
22 PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
23 PetscCheck(size < 4, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Example only works with up to three processes");
24
25 PetscCall(PetscCalloc1(size * n, &izero));
26 for (i = 0; i < 3; i++) PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, n, ix[i][rank], PETSC_COPY_VALUES, &isx[i]));
27
28 for (j = 0; j < 3; j++) {
29 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_WRITE, &vx));
30 PetscCall(ISView(isx[0], vx));
31 PetscCall(PetscViewerDestroy(&vx));
32
33 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_READ, &vl));
34 PetscCall(ISCreate(PETSC_COMM_WORLD, &il));
35 PetscCall(ISLoad(il, vl));
36 PetscCall(ISEqual(il, isx[0], &equal));
37 PetscCheck(equal, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Iteration %" PetscInt_FMT " - Index set loaded from file does not match", j);
38 PetscCall(ISDestroy(&il));
39 PetscCall(PetscViewerDestroy(&vl));
40
41 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_APPEND, &vx));
42 PetscCall(ISView(isx[1], vx));
43 PetscCall(ISView(isx[2], vx));
44 PetscCall(PetscViewerDestroy(&vx));
45
46 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_READ, &vl));
47 for (i = 0; i < 3; i++) {
48 PetscCall(ISCreate(PETSC_COMM_WORLD, &il));
49 PetscCall(ISLoad(il, vl));
50 PetscCall(ISEqual(il, isx[i], &equal));
51 PetscCheck(equal, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Iteration %" PetscInt_FMT " - Index set %" PetscInt_FMT " loaded from file does not match", j, i);
52 PetscCall(ISDestroy(&il));
53 }
54 PetscCall(PetscViewerDestroy(&vl));
55
56 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile", FILE_MODE_READ, &vl));
57 for (i = 0; i < 3; i++) {
58 PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, n, izero, PETSC_COPY_VALUES, &il));
59 PetscCall(ISLoad(il, vl));
60 PetscCall(ISEqual(il, isx[i], &equal));
61 PetscCheck(equal, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Iteration %" PetscInt_FMT " - Index set %" PetscInt_FMT " loaded from file does not match", j, i);
62 PetscCall(ISDestroy(&il));
63 }
64 PetscCall(PetscViewerDestroy(&vl));
65 }
66
67 for (j = 0; j < 3; j++) {
68 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_WRITE, &vx));
69 PetscCall(PetscViewerBinarySetSkipHeader(vx, PETSC_TRUE));
70 for (i = 0; i < 3; i++) PetscCall(ISView(isx[i], vx));
71 PetscCall(PetscViewerDestroy(&vx));
72
73 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "testfile_noheader", FILE_MODE_READ, &vl));
74 PetscCall(PetscViewerBinarySetSkipHeader(vl, PETSC_TRUE));
75 for (i = 0; i < 3; i++) {
76 PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, n, izero, PETSC_COPY_VALUES, &il));
77 PetscCall(ISLoad(il, vl));
78 PetscCall(ISEqual(il, isx[i], &equal));
79 PetscCheck(equal, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Iteration %" PetscInt_FMT " - Index set %" PetscInt_FMT " loaded from file does not match", j, i);
80 PetscCall(ISDestroy(&il));
81 }
82 PetscCall(PetscViewerDestroy(&vl));
83 }
84
85 for (i = 0; i < 3; i++) PetscCall(ISDestroy(&isx[i]));
86
87 for (j = 0; j < 2; j++) {
88 const char *filename = (j == 0) ? "testfile_isstride" : "testfile_isblock";
89 PetscInt blocksize = (j == 0) ? 1 : size;
90 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, filename, FILE_MODE_WRITE, &vx));
91 for (i = 0; i < 3; i++) {
92 if (j == 0) {
93 PetscCall(ISCreateStride(PETSC_COMM_WORLD, n, rank, rank + 1, &isx[i]));
94 } else {
95 PetscCall(ISCreateBlock(PETSC_COMM_WORLD, blocksize, n, ix[i][rank], PETSC_COPY_VALUES, &isx[i]));
96 }
97 PetscCall(ISView(isx[i], vx));
98 PetscCall(ISToGeneral(isx[i]));
99 }
100 PetscCall(PetscViewerDestroy(&vx));
101 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, filename, FILE_MODE_READ, &vl));
102 for (i = 0; i < 3; i++) {
103 PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, blocksize * n, izero, PETSC_COPY_VALUES, &il));
104 PetscCall(ISLoad(il, vl));
105 PetscCall(ISEqual(il, isx[i], &equal));
106 PetscCheck(equal, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Iteration %" PetscInt_FMT " - Index set %" PetscInt_FMT " loaded from file does not match", j, i);
107 PetscCall(ISDestroy(&il));
108 }
109 PetscCall(PetscViewerDestroy(&vl));
110 for (i = 0; i < 3; i++) PetscCall(ISDestroy(&isx[i]));
111 }
112 PetscCall(PetscFree(izero));
113
114 PetscCall(PetscFinalize());
115 return 0;
116 }
117
118 /*TEST
119
120 testset:
121 args: -viewer_binary_mpiio 0
122 output_file: output/empty.out
123 test:
124 suffix: stdio_1
125 nsize: 1
126 test:
127 suffix: stdio_2
128 nsize: 2
129 test:
130 suffix: stdio_3
131 nsize: 3
132
133 testset:
134 requires: mpiio
135 args: -viewer_binary_mpiio 1
136 output_file: output/empty.out
137 test:
138 suffix: mpiio_1
139 nsize: 1
140 test:
141 suffix: mpiio_2
142 nsize: 2
143 test:
144 suffix: mpiio_3
145 nsize: 3
146
147 TEST*/
148