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