xref: /petsc/src/vec/vec/tutorials/ex5.c (revision 732aec7a18f2199fb53bb9a2f3aef439a834ce31)
1 static char help[] = "Tests binary I/O of vectors and illustrates the use of user-defined event logging.\n\n";
2 
3 #include <petscvec.h>
4 
5 /* Note:  Most applications would not read and write a vector within
6   the same program.  This example is intended only to demonstrate
7   both input and output. */
8 
main(int argc,char ** args)9 int main(int argc, char **args)
10 {
11   PetscMPIInt   rank, size;
12   PetscInt      i, m = 10, low, high, ldim, iglobal;
13   PetscScalar   v;
14   Vec           u;
15   PetscViewer   viewer;
16   PetscLogEvent VECTOR_GENERATE, VECTOR_READ;
17 
18   PetscFunctionBeginUser;
19   PetscCall(PetscInitialize(&argc, &args, NULL, help));
20   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
21   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
22   PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
23 
24   /* PART 1:  Generate vector, then write it in binary format */
25 
26   PetscCall(PetscLogEventRegister("Generate Vector", VEC_CLASSID, &VECTOR_GENERATE));
27   PetscCall(PetscLogEventBegin(VECTOR_GENERATE, 0, 0, 0, 0));
28   /* Generate vector */
29   PetscCall(VecCreate(PETSC_COMM_WORLD, &u));
30   PetscCall(VecSetSizes(u, PETSC_DECIDE, m));
31   PetscCall(VecSetFromOptions(u));
32   PetscCall(VecGetOwnershipRange(u, &low, &high));
33   PetscCall(VecGetLocalSize(u, &ldim));
34   for (i = 0; i < ldim; i++) {
35     iglobal = i + low;
36     v       = (PetscScalar)(i + 100 * rank);
37     PetscCall(VecSetValues(u, 1, &iglobal, &v, INSERT_VALUES));
38   }
39   PetscCall(VecAssemblyBegin(u));
40   PetscCall(VecAssemblyEnd(u));
41   PetscCall(VecView(u, PETSC_VIEWER_STDOUT_WORLD));
42 
43   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "writing vector in binary to vector.dat ...\n"));
44   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "vector.dat", FILE_MODE_WRITE, &viewer));
45   PetscCall(VecView(u, viewer));
46   PetscCall(PetscViewerDestroy(&viewer));
47   PetscCall(VecDestroy(&u));
48   PetscCall(PetscOptionsSetValue(NULL, "-viewer_binary_mpiio", ""));
49 
50   PetscCall(PetscLogEventEnd(VECTOR_GENERATE, 0, 0, 0, 0));
51 
52   /* PART 2:  Read in vector in binary format */
53 
54   /* Read new vector in binary format */
55   PetscCall(PetscLogEventRegister("Read Vector", VEC_CLASSID, &VECTOR_READ));
56   PetscCall(PetscLogEventBegin(VECTOR_READ, 0, 0, 0, 0));
57   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "reading vector in binary from vector.dat ...\n"));
58   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "vector.dat", FILE_MODE_READ, &viewer));
59   PetscCall(VecCreate(PETSC_COMM_WORLD, &u));
60   PetscCall(VecLoad(u, viewer));
61   PetscCall(PetscViewerDestroy(&viewer));
62   PetscCall(PetscLogEventEnd(VECTOR_READ, 0, 0, 0, 0));
63   PetscCall(VecView(u, PETSC_VIEWER_STDOUT_WORLD));
64 
65   /* Free data structures */
66   PetscCall(VecDestroy(&u));
67   PetscCall(PetscFinalize());
68   return 0;
69 }
70 
71 /*TEST
72 
73      test:
74        nsize: 1
75        requires: mpiio
76 
77      test:
78        suffix: 2
79        nsize: 2
80        requires: mpiio
81 
82 TEST*/
83