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) {
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*/