Actual source code: ex9.c
1: static char help[] = "Demonstrates HDF5 vector input/output\n\n";
3: #include <petscsys.h>
4: #include <petscdm.h>
5: #include <petscdmda.h>
6: #include <petscviewerhdf5.h>
8: int main(int argc, char **argv)
9: {
10: PetscViewer viewer;
11: DM da;
12: Vec global, local, global2;
13: PetscMPIInt rank;
14: PetscBool flg;
15: PetscInt ndof;
17: /*
18: Every PETSc routine should begin with the PetscInitialize() routine.
19: argc, argv - These command line arguments are taken to extract the options
20: supplied to PETSc and options supplied to MPI.
21: help - When PETSc executable is invoked with the option -help,
22: it prints the various options that can be applied at
23: runtime. The user can use the "help" variable place
24: additional help messages in this printout.
25: */
27: PetscInitialize(&argc, &argv, (char *)0, help);
28: /* Get number of DOF's from command line */
29: PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "DMDA VecView/VecLoad example", "");
30: {
31: ndof = 1;
32: PetscOptionsBoundedInt("-ndof", "Number of DOF's in DMDA", "", ndof, &ndof, NULL, 1);
33: }
34: PetscOptionsEnd();
36: /* Create a DMDA and an associated vector */
37: DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, 100, 90, PETSC_DECIDE, PETSC_DECIDE, ndof, 1, NULL, NULL, &da);
38: DMSetFromOptions(da);
39: DMSetUp(da);
40: DMCreateGlobalVector(da, &global);
41: DMCreateLocalVector(da, &local);
42: VecSet(global, -1.0);
43: DMGlobalToLocalBegin(da, global, INSERT_VALUES, local);
44: DMGlobalToLocalEnd(da, global, INSERT_VALUES, local);
45: MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
46: VecScale(local, rank + 1);
47: DMLocalToGlobalBegin(da, local, ADD_VALUES, global);
48: DMLocalToGlobalEnd(da, local, ADD_VALUES, global);
50: /* Create the HDF5 viewer for writing */
51: PetscViewerHDF5Open(PETSC_COMM_WORLD, "hdf5output.h5", FILE_MODE_WRITE, &viewer);
52: PetscViewerSetFromOptions(viewer);
54: /* Write the Vec without one extra dimension for BS */
55: PetscViewerHDF5SetBaseDimension2(viewer, PETSC_FALSE);
56: PetscObjectSetName((PetscObject)global, "noBsDim");
57: VecView(global, viewer);
59: /* Write the Vec with one extra, 1-sized, dimension for BS */
60: PetscViewerHDF5SetBaseDimension2(viewer, PETSC_TRUE);
61: PetscObjectSetName((PetscObject)global, "bsDim");
62: VecView(global, viewer);
64: PetscViewerDestroy(&viewer);
65: MPI_Barrier(PETSC_COMM_WORLD);
66: VecDuplicate(global, &global2);
68: /* Create the HDF5 viewer for reading */
69: PetscViewerHDF5Open(PETSC_COMM_WORLD, "hdf5output.h5", FILE_MODE_READ, &viewer);
70: PetscViewerSetFromOptions(viewer);
72: /* Load the Vec without the BS dim and compare */
73: PetscObjectSetName((PetscObject)global2, "noBsDim");
74: VecLoad(global2, viewer);
76: VecEqual(global, global2, &flg);
77: if (!flg) PetscPrintf(PETSC_COMM_WORLD, "Error: Vectors are not equal\n");
79: /* Load the Vec with one extra, 1-sized, BS dim and compare */
80: PetscObjectSetName((PetscObject)global2, "bsDim");
81: VecLoad(global2, viewer);
82: PetscViewerDestroy(&viewer);
84: VecEqual(global, global2, &flg);
85: if (!flg) PetscPrintf(PETSC_COMM_WORLD, "Error: Vectors are not equal\n");
87: /* clean up and exit */
88: VecDestroy(&local);
89: VecDestroy(&global);
90: VecDestroy(&global2);
91: DMDestroy(&da);
93: PetscFinalize();
94: return 0;
95: }
97: /*TEST
99: build:
100: requires: hdf5
102: test:
103: nsize: 4
105: test:
106: nsize: 4
107: suffix: 2
108: args: -ndof 2
109: output_file: output/ex9_1.out
111: TEST*/