xref: /petsc/src/sys/tutorials/ex5.c (revision 74a82d2edf9b3aa51eef449cdc5a734d88535a9c)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Demonstrates using the PetscBag Object\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown /*T
5c4762a1bSJed Brown    Concepts: bags;
6c4762a1bSJed Brown    Processors: n
7c4762a1bSJed Brown T*/
8c4762a1bSJed Brown 
9c4762a1bSJed Brown 
10c4762a1bSJed Brown #include <petscsys.h>
11c4762a1bSJed Brown #include <petscbag.h>
12c4762a1bSJed Brown #include <petscviewer.h>
13c4762a1bSJed Brown 
14c4762a1bSJed Brown /*
15c4762a1bSJed Brown   Enum variables can be stored in a bag but require a string array
16c4762a1bSJed Brown   to name their fields.  The fourth entry in this example is the name
17c4762a1bSJed Brown   of the enum, the fifth is the prefix (none in this case), and the last
18c4762a1bSJed Brown   entry is the null string.
19c4762a1bSJed Brown */
20c4762a1bSJed Brown typedef enum {
21c4762a1bSJed Brown   THIS = 0, THAT = 1, THE_OTHER = 2
22c4762a1bSJed Brown } YourChoice;
23c4762a1bSJed Brown const char *EnumeratedChoices[] = {"THIS","THAT","THE_OTHER","EnumeratedChoices","",0};
24c4762a1bSJed Brown 
25c4762a1bSJed Brown /*
26c4762a1bSJed Brown   Data structures can be used in a bag as long as they
27c4762a1bSJed Brown   are declared in the bag with a variable, not with a pointer.
28c4762a1bSJed Brown */
29c4762a1bSJed Brown typedef struct {
30c4762a1bSJed Brown   PetscReal x1,x2;
31c4762a1bSJed Brown } TwoVec;
32c4762a1bSJed Brown 
33c4762a1bSJed Brown /*
34c4762a1bSJed Brown   Define a C struct that will contain my program's parameters.
35c4762a1bSJed Brown 
36c4762a1bSJed Brown   A PETSc bag is merely a representation of a C struct that can be printed, saved to a file and loaded from a file.
37c4762a1bSJed Brown */
38c4762a1bSJed Brown typedef struct {
39c4762a1bSJed Brown   PetscScalar   W;
40c4762a1bSJed Brown   PetscReal     rho;
41c4762a1bSJed Brown   TwoVec        pos;
42c4762a1bSJed Brown   PetscInt      Ii;
43c4762a1bSJed Brown   PetscInt      iarray[3];
44c4762a1bSJed Brown   PetscReal     rarray[2];
45c4762a1bSJed Brown   PetscBool     T;
46c4762a1bSJed Brown   PetscBool     Tarray[3];
47c4762a1bSJed Brown   PetscDataType dt;
48c4762a1bSJed Brown   char          filename[PETSC_MAX_PATH_LEN];
49c4762a1bSJed Brown   YourChoice    which;
50c4762a1bSJed Brown } Parameter;
51c4762a1bSJed Brown 
52c4762a1bSJed Brown 
53c4762a1bSJed Brown int main(int argc,char **argv)
54c4762a1bSJed Brown {
55c4762a1bSJed Brown   PetscErrorCode ierr;
56c4762a1bSJed Brown   PetscBag       bag;
57c4762a1bSJed Brown   Parameter      *params;
58c4762a1bSJed Brown   PetscViewer    viewer;
59c4762a1bSJed Brown   PetscBool      flg;
60c4762a1bSJed Brown   char           filename[PETSC_MAX_PATH_LEN] = "binaryoutput";
61c4762a1bSJed Brown 
62c4762a1bSJed Brown   /*
63c4762a1bSJed Brown     Every PETSc routine should begin with the PetscInitialize() routine.
64c4762a1bSJed Brown     argc, argv - These command line arguments are taken to extract the options
65c4762a1bSJed Brown                  supplied to PETSc and options supplied to MPI.
66c4762a1bSJed Brown     help       - When PETSc executable is invoked with the option -help,
67c4762a1bSJed Brown                  it prints the various options that can be applied at
68c4762a1bSJed Brown                  runtime.  The user can use the "help" variable place
69c4762a1bSJed Brown                  additional help messages in this printout.
70c4762a1bSJed Brown   */
71c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
72c4762a1bSJed Brown 
73c4762a1bSJed Brown   /* Create an empty bag */
74c4762a1bSJed Brown   ierr = PetscBagCreate(PETSC_COMM_WORLD,sizeof(Parameter),&bag);CHKERRQ(ierr);
75c4762a1bSJed Brown   ierr = PetscBagGetData(bag,(void**)&params);CHKERRQ(ierr);
76c4762a1bSJed Brown 
77c4762a1bSJed Brown   /* register variables, defaults, names, help strings */
78c4762a1bSJed Brown   ierr = PetscBagSetName(bag,"ParameterBag","contains parameters for simulations of top-secret, dangerous physics");CHKERRQ(ierr);
79c4762a1bSJed Brown   ierr = PetscBagSetOptionsPrefix(bag, "pbag_");CHKERRQ(ierr);
80c4762a1bSJed Brown   ierr = PetscBagRegisterString(bag,&params->filename,PETSC_MAX_PATH_LEN,"myfile","filename","Name of secret file");CHKERRQ(ierr);
81c4762a1bSJed Brown   ierr = PetscBagRegisterReal  (bag,&params->rho,3.0,"rho","Density, kg/m^3");CHKERRQ(ierr);
82c4762a1bSJed Brown   ierr = PetscBagRegisterScalar(bag,&params->W,  5.0,"W","Vertical velocity, m/sec");CHKERRQ(ierr);
83c4762a1bSJed Brown   ierr = PetscBagRegisterInt   (bag,&params->Ii, 2,"modes_x","Number of modes in x-direction");CHKERRQ(ierr);
84c4762a1bSJed Brown 
85c4762a1bSJed Brown   params->iarray[0] = 1;
86c4762a1bSJed Brown   params->iarray[1] = 2;
87c4762a1bSJed Brown   params->iarray[2] = 3;
88c4762a1bSJed Brown 
89c4762a1bSJed Brown   ierr = PetscBagRegisterIntArray(bag,&params->iarray, 3,"int_array","Int array with 3 locations");CHKERRQ(ierr);
90c4762a1bSJed Brown 
91c4762a1bSJed Brown   params->rarray[0] = -1.0;
92c4762a1bSJed Brown   params->rarray[1] = -2.0;
93c4762a1bSJed Brown 
94c4762a1bSJed Brown   ierr = PetscBagRegisterRealArray(bag,&params->rarray, 2,"real_array","Real array with 2 locations");CHKERRQ(ierr);
95c4762a1bSJed Brown   ierr = PetscBagRegisterBool (bag,&params->T,  PETSC_FALSE,"do_output","Write output file (yes/no)");CHKERRQ(ierr);
96c4762a1bSJed Brown   ierr = PetscBagRegisterBoolArray(bag,&params->Tarray, 3,"bool_array","Bool array with 3 locations");CHKERRQ(ierr);
97c4762a1bSJed Brown   ierr = PetscBagRegisterEnum  (bag,&params->dt, PetscDataTypes,(PetscEnum)PETSC_INT,"dt","meaningless datatype");CHKERRQ(ierr);
98c4762a1bSJed Brown   ierr = PetscBagRegisterReal  (bag,&params->pos.x1,1.0,"x1","x position");CHKERRQ(ierr);
99c4762a1bSJed Brown   ierr = PetscBagRegisterReal  (bag,&params->pos.x2,1.9,"x2","y position");CHKERRQ(ierr);
100c4762a1bSJed Brown   ierr = PetscBagRegisterEnum  (bag,&params->which, EnumeratedChoices, (PetscEnum)THAT, "choose","Express yourself by choosing among enumerated things");CHKERRQ(ierr);
101c4762a1bSJed Brown 
102c4762a1bSJed Brown 
103c4762a1bSJed Brown   /* This option allows loading user-provided PetscBag */
104c4762a1bSJed Brown   ierr = PetscOptionsGetString(NULL,NULL,"-f",filename,sizeof(filename),&flg);CHKERRQ(ierr);
105c4762a1bSJed Brown   if (!flg) {
106c4762a1bSJed Brown 
107c4762a1bSJed Brown     /* write bag to stdio & binary file */
108c4762a1bSJed Brown     ierr = PetscBagView(bag,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
109c4762a1bSJed Brown     ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
110c4762a1bSJed Brown     ierr = PetscBagView(bag,viewer);CHKERRQ(ierr);
111c4762a1bSJed Brown     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
112c4762a1bSJed Brown   }
113c4762a1bSJed Brown 
114c4762a1bSJed Brown   ierr = PetscMemzero(params,sizeof(Parameter));CHKERRQ(ierr);
115c4762a1bSJed Brown 
116c4762a1bSJed Brown   /* load bag from file & write to stdio */
117c4762a1bSJed Brown   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer);CHKERRQ(ierr);
118c4762a1bSJed Brown   ierr = PetscBagLoad(viewer,bag);CHKERRQ(ierr);
119c4762a1bSJed Brown   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
120c4762a1bSJed Brown   ierr = PetscBagSetFromOptions(bag);CHKERRQ(ierr);
121c4762a1bSJed Brown   ierr = PetscBagView(bag,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
122c4762a1bSJed Brown 
123c4762a1bSJed Brown   /* reuse the parameter struct */
124c4762a1bSJed Brown   ierr = PetscBagGetData(bag,(void**)&params);CHKERRQ(ierr);
125c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_WORLD,"The value of rho after loading is: %f\n",(double)params->rho);CHKERRQ(ierr);
126c4762a1bSJed Brown 
127c4762a1bSJed Brown   /* clean up and exit */
128c4762a1bSJed Brown   ierr = PetscBagDestroy(&bag);CHKERRQ(ierr);
129c4762a1bSJed Brown   ierr = PetscFinalize();
130c4762a1bSJed Brown   return ierr;
131c4762a1bSJed Brown }
132c4762a1bSJed Brown 
133c4762a1bSJed Brown 
134c4762a1bSJed Brown /*TEST
135c4762a1bSJed Brown 
136c4762a1bSJed Brown    test:
137c4762a1bSJed Brown       args: -pbag_rho 44 -pbag_do_output true
138*74a82d2eSLisandro Dalcin       requires: !complex
139c4762a1bSJed Brown 
140c4762a1bSJed Brown    test:
141c4762a1bSJed Brown       suffix: yaml
142c4762a1bSJed Brown       requires: yaml !complex
143c4762a1bSJed Brown       args: -options_file_yaml bag.yml -options_view
144c4762a1bSJed Brown       filter:  grep -v saws_port_auto_select |grep -v malloc_dump | grep -v display | grep -v check_pointer_intensity | grep -v error_output_stdout | grep -v nox | grep -v nox_warning
145c4762a1bSJed Brown       localrunfiles: bag.yml
146c4762a1bSJed Brown 
147c4762a1bSJed Brown TEST*/
148