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