Actual source code: ex10.c
2: static char help[] = "Tests I/O of vectors for different data formats (binary,HDF5) and illustrates the use of user-defined event logging\n\n";
4: #include <petscvec.h>
5: #include <petscviewerhdf5.h>
7: /* Note: Most applications would not read and write a vector within
8: the same program. This example is intended only to demonstrate
9: both input and output and is written for use with either 1,2,or 4 processors. */
11: int main(int argc,char **args)
12: {
13: PetscErrorCode ierr;
14: PetscMPIInt rank,size;
15: PetscInt i,m = 20,low,high,ldim,iglobal,lsize;
16: PetscScalar v;
17: Vec u;
18: PetscViewer viewer;
19: PetscBool vstage2,vstage3,mpiio_use,isbinary = PETSC_FALSE;
20: #if defined(PETSC_HAVE_HDF5)
21: PetscBool ishdf5 = PETSC_FALSE;
22: #endif
23: #if defined(PETSC_HAVE_ADIOS)
24: PetscBool isadios = PETSC_FALSE;
25: #endif
26: PetscScalar const *values;
27: #if defined(PETSC_USE_LOG)
28: PetscLogEvent VECTOR_GENERATE,VECTOR_READ;
29: #endif
31: PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
32: mpiio_use = vstage2 = vstage3 = PETSC_FALSE;
34: PetscOptionsGetBool(NULL,NULL,"-binary",&isbinary,NULL);
35: #if defined(PETSC_HAVE_HDF5)
36: PetscOptionsGetBool(NULL,NULL,"-hdf5",&ishdf5,NULL);
37: #endif
38: #if defined(PETSC_HAVE_ADIOS)
39: PetscOptionsGetBool(NULL,NULL,"-adios",&isadios,NULL);
40: #endif
41: PetscOptionsGetBool(NULL,NULL,"-mpiio",&mpiio_use,NULL);
42: PetscOptionsGetBool(NULL,NULL,"-sizes_set",&vstage2,NULL);
43: PetscOptionsGetBool(NULL,NULL,"-type_set",&vstage3,NULL);
45: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
46: MPI_Comm_size(PETSC_COMM_WORLD,&size);
47: PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);
49: /* PART 1: Generate vector, then write it in the given data format */
51: PetscLogEventRegister("Generate Vector",VEC_CLASSID,&VECTOR_GENERATE);
52: PetscLogEventBegin(VECTOR_GENERATE,0,0,0,0);
53: /* Generate vector */
54: VecCreate(PETSC_COMM_WORLD,&u);
55: PetscObjectSetName((PetscObject)u, "Test_Vec");
56: VecSetSizes(u,PETSC_DECIDE,m);
57: VecSetFromOptions(u);
58: VecGetOwnershipRange(u,&low,&high);
59: VecGetLocalSize(u,&ldim);
60: for (i=0; i<ldim; i++) {
61: iglobal = i + low;
62: v = (PetscScalar)(i + low);
63: VecSetValues(u,1,&iglobal,&v,INSERT_VALUES);
64: }
65: VecAssemblyBegin(u);
66: VecAssemblyEnd(u);
67: VecView(u,PETSC_VIEWER_STDOUT_WORLD);
69: if (isbinary) {
70: PetscPrintf(PETSC_COMM_WORLD,"writing vector in binary to vector.dat ...\n");
71: PetscViewerBinaryOpen(PETSC_COMM_WORLD,"vector.dat",FILE_MODE_WRITE,&viewer);
72: #if defined(PETSC_HAVE_HDF5)
73: } else if (ishdf5) {
74: PetscPrintf(PETSC_COMM_WORLD,"writing vector in hdf5 to vector.dat ...\n");
75: PetscViewerHDF5Open(PETSC_COMM_WORLD,"vector.dat",FILE_MODE_WRITE,&viewer);
76: #endif
77: #if defined(PETSC_HAVE_ADIOS)
78: } else if (isadios) {
79: PetscPrintf(PETSC_COMM_WORLD,"writing vector in adios to vector.dat ...\n");
80: PetscViewerADIOSOpen(PETSC_COMM_WORLD,"vector.dat",FILE_MODE_WRITE,&viewer);
81: #endif
82: } else SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"No data format specified, run with one of -binary -hdf5 -adios options\n");
83: VecView(u,viewer);
84: PetscViewerDestroy(&viewer);
85: VecDestroy(&u);
87: PetscLogEventEnd(VECTOR_GENERATE,0,0,0,0);
89: /* PART 2: Read in vector in binary format */
91: /* Read new vector in binary format */
92: PetscLogEventRegister("Read Vector",VEC_CLASSID,&VECTOR_READ);
93: PetscLogEventBegin(VECTOR_READ,0,0,0,0);
94: if (mpiio_use) {
95: PetscPrintf(PETSC_COMM_WORLD,"Using MPI IO for reading the vector\n");
96: PetscOptionsSetValue(NULL,"-viewer_binary_mpiio","");
97: }
98: if (isbinary) {
99: PetscPrintf(PETSC_COMM_WORLD,"reading vector in binary from vector.dat ...\n");
100: PetscViewerBinaryOpen(PETSC_COMM_WORLD,"vector.dat",FILE_MODE_READ,&viewer);
101: PetscViewerBinarySetFlowControl(viewer,2);
102: #if defined(PETSC_HAVE_HDF5)
103: } else if (ishdf5) {
104: PetscPrintf(PETSC_COMM_WORLD,"reading vector in hdf5 from vector.dat ...\n");
105: PetscViewerHDF5Open(PETSC_COMM_WORLD,"vector.dat",FILE_MODE_READ,&viewer);
106: #endif
107: #if defined(PETSC_HAVE_ADIOS)
108: } else if (isadios) {
109: PetscPrintf(PETSC_COMM_WORLD,"reading vector in adios from vector.dat ...\n");
110: PetscViewerADIOSOpen(PETSC_COMM_WORLD,"vector.dat",FILE_MODE_READ,&viewer);
111: #endif
112: }
113: VecCreate(PETSC_COMM_WORLD,&u);
114: PetscObjectSetName((PetscObject) u,"Test_Vec");
116: if (vstage2) {
117: PetscPrintf(PETSC_COMM_WORLD,"Setting vector sizes...\n");
118: if (size > 1) {
119: if (rank == 0) {
120: lsize = m/size + size;
121: VecSetSizes(u,lsize,m);
122: } else if (rank == size-1) {
123: lsize = m/size - size;
124: VecSetSizes(u,lsize,m);
125: } else {
126: lsize = m/size;
127: VecSetSizes(u,lsize,m);
128: }
129: } else {
130: VecSetSizes(u,m,m);
131: }
132: }
134: if (vstage3) {
135: PetscPrintf(PETSC_COMM_WORLD,"Setting vector type...\n");
136: VecSetType(u, VECMPI);
137: }
138: VecLoad(u,viewer);
139: PetscViewerDestroy(&viewer);
140: PetscLogEventEnd(VECTOR_READ,0,0,0,0);
141: VecView(u,PETSC_VIEWER_STDOUT_WORLD);
142: VecGetArrayRead(u,&values);
143: VecGetLocalSize(u,&ldim);
144: VecGetOwnershipRange(u,&low,NULL);
145: for (i=0; i<ldim; i++) {
146: if (values[i] != (PetscScalar)(i + low)) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"Data check failed!\n");
147: }
148: VecRestoreArrayRead(u,&values);
150: /* Free data structures */
151: VecDestroy(&u);
152: PetscFinalize();
153: return ierr;
154: }
156: /*TEST
158: test:
159: nsize: 2
160: args: -binary
162: test:
163: suffix: 2
164: nsize: 3
165: args: -binary
167: test:
168: suffix: 3
169: nsize: 5
170: args: -binary
172: test:
173: suffix: 4
174: requires: hdf5
175: nsize: 2
176: args: -hdf5
178: test:
179: suffix: 5
180: nsize: 4
181: args: -binary -sizes_set
183: test:
184: suffix: 6
185: requires: hdf5
186: nsize: 4
187: args: -hdf5 -sizes_set
189: TEST*/