xref: /petsc/src/sys/classes/bag/bag.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith #include <../src/sys/classes/bag/bagimpl.h>     /*I  "petscbag.h"   I*/
3*5c6c1daeSBarry Smith 
4*5c6c1daeSBarry Smith 
5*5c6c1daeSBarry Smith #undef __FUNCT__
6*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegister_Private"
7*5c6c1daeSBarry Smith /*
8*5c6c1daeSBarry Smith       Adds item to the linked list in a bag
9*5c6c1daeSBarry Smith */
10*5c6c1daeSBarry Smith static PetscErrorCode PetscBagRegister_Private(PetscBag bag,PetscBagItem item,const char*name,const char*help)
11*5c6c1daeSBarry Smith {
12*5c6c1daeSBarry Smith   PetscErrorCode ierr;
13*5c6c1daeSBarry Smith 
14*5c6c1daeSBarry Smith   PetscFunctionBegin;
15*5c6c1daeSBarry Smith   ierr = PetscStrncpy(item->name,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
16*5c6c1daeSBarry Smith   ierr = PetscStrncpy(item->help,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr);
17*5c6c1daeSBarry Smith   if (!bag->bagitems) bag->bagitems = item;
18*5c6c1daeSBarry Smith   else {
19*5c6c1daeSBarry Smith     PetscBagItem nitem = bag->bagitems;
20*5c6c1daeSBarry Smith     while (nitem->next) {
21*5c6c1daeSBarry Smith       nitem = nitem->next;
22*5c6c1daeSBarry Smith     }
23*5c6c1daeSBarry Smith     nitem->next = item;
24*5c6c1daeSBarry Smith   }
25*5c6c1daeSBarry Smith   bag->count++;
26*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
27*5c6c1daeSBarry Smith }
28*5c6c1daeSBarry Smith 
29*5c6c1daeSBarry Smith #undef __FUNCT__
30*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterEnum"
31*5c6c1daeSBarry Smith /*@C
32*5c6c1daeSBarry Smith    PetscBagRegisterEnum - add an enum value to the bag
33*5c6c1daeSBarry Smith 
34*5c6c1daeSBarry Smith    Logically Collective on PetscBag
35*5c6c1daeSBarry Smith 
36*5c6c1daeSBarry Smith    Input Parameter:
37*5c6c1daeSBarry Smith +  bag - the bag of values
38*5c6c1daeSBarry Smith .  addr - location of enum in struct
39*5c6c1daeSBarry Smith .  mdefault - the initial value
40*5c6c1daeSBarry Smith .  list - array of strings containing names of enum values followed by enum name followed by enum prefix
41*5c6c1daeSBarry Smith -  help - longer string with more information about the value
42*5c6c1daeSBarry Smith 
43*5c6c1daeSBarry Smith    Level: beginner
44*5c6c1daeSBarry Smith 
45*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
46*5c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
47*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName()
48*5c6c1daeSBarry Smith 
49*5c6c1daeSBarry Smith @*/
50*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterEnum(PetscBag bag,void *addr,const char *const*list,PetscEnum mdefault, const char *name, const char* help)
51*5c6c1daeSBarry Smith {
52*5c6c1daeSBarry Smith   PetscErrorCode ierr;
53*5c6c1daeSBarry Smith   PetscBagItem   item;
54*5c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
55*5c6c1daeSBarry Smith   PetscBool      printhelp;
56*5c6c1daeSBarry Smith   PetscInt       i = 0;
57*5c6c1daeSBarry Smith 
58*5c6c1daeSBarry Smith   PetscFunctionBegin;
59*5c6c1daeSBarry Smith   nname[0] = '-';
60*5c6c1daeSBarry Smith   nname[1] = 0;
61*5c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
62*5c6c1daeSBarry Smith   ierr     = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
63*5c6c1daeSBarry Smith   if (printhelp) {
64*5c6c1daeSBarry Smith     while (list[i++]);
65*5c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%s>: (%s) %s (choose one of) ",bag->bagprefix?bag->bagprefix:"",name,list[mdefault],list[i-3],help);CHKERRQ(ierr);
66*5c6c1daeSBarry Smith     for (i=0; list[i+2]; i++){
67*5c6c1daeSBarry Smith       ierr = (*PetscHelpPrintf)(bag->bagcomm," %s",list[i]);CHKERRQ(ierr);
68*5c6c1daeSBarry Smith     }
69*5c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"\n");CHKERRQ(ierr);
70*5c6c1daeSBarry Smith   }
71*5c6c1daeSBarry Smith   ierr     = PetscOptionsGetEnum(bag->bagprefix,nname,list,&mdefault,PETSC_NULL);CHKERRQ(ierr);
72*5c6c1daeSBarry Smith 
73*5c6c1daeSBarry Smith   ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
74*5c6c1daeSBarry Smith   item->dtype  = PETSC_ENUM;
75*5c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
76*5c6c1daeSBarry Smith   if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
77*5c6c1daeSBarry Smith   item->next   = 0;
78*5c6c1daeSBarry Smith   item->msize  = 1;
79*5c6c1daeSBarry Smith   ierr = PetscStrArrayallocpy(list,(char ***)&item->list);CHKERRQ(ierr);
80*5c6c1daeSBarry Smith   *(PetscEnum*)addr = mdefault;
81*5c6c1daeSBarry Smith   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
82*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
83*5c6c1daeSBarry Smith }
84*5c6c1daeSBarry Smith 
85*5c6c1daeSBarry Smith #undef __FUNCT__
86*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterIntArray"
87*5c6c1daeSBarry Smith /*@C
88*5c6c1daeSBarry Smith    PetscBagRegisterIntArray - add an integer value to the bag
89*5c6c1daeSBarry Smith 
90*5c6c1daeSBarry Smith    Logically Collective on PetscBag
91*5c6c1daeSBarry Smith 
92*5c6c1daeSBarry Smith    Input Parameter:
93*5c6c1daeSBarry Smith +  bag - the bag of values
94*5c6c1daeSBarry Smith .  addr - location of integer in struct
95*5c6c1daeSBarry Smith .  msize - number of entries in array
96*5c6c1daeSBarry Smith .  name - name of the integer array
97*5c6c1daeSBarry Smith -  help - longer string with more information about the value
98*5c6c1daeSBarry Smith 
99*5c6c1daeSBarry Smith    Level: beginner
100*5c6c1daeSBarry Smith 
101*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
102*5c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
103*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
104*5c6c1daeSBarry Smith 
105*5c6c1daeSBarry Smith @*/
106*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterIntArray(PetscBag bag,void *addr,PetscInt msize, const char* name, const char* help)
107*5c6c1daeSBarry Smith {
108*5c6c1daeSBarry Smith   PetscErrorCode ierr;
109*5c6c1daeSBarry Smith   PetscBagItem   item;
110*5c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
111*5c6c1daeSBarry Smith   PetscBool      printhelp;
112*5c6c1daeSBarry Smith   PetscInt       i,tmp = msize;
113*5c6c1daeSBarry Smith 
114*5c6c1daeSBarry Smith   PetscFunctionBegin;
115*5c6c1daeSBarry Smith   /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/
116*5c6c1daeSBarry Smith   nname[0] = '-';
117*5c6c1daeSBarry Smith   nname[1] = 0;
118*5c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
119*5c6c1daeSBarry Smith   ierr     = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
120*5c6c1daeSBarry Smith   if (printhelp) {
121*5c6c1daeSBarry Smith     ierr     = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <",bag->bagprefix?bag->bagprefix:"",name);CHKERRQ(ierr);
122*5c6c1daeSBarry Smith     for (i=0; i<msize; i++) {
123*5c6c1daeSBarry Smith       ierr     = (*PetscHelpPrintf)(bag->bagcomm,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr);
124*5c6c1daeSBarry Smith   }
125*5c6c1daeSBarry Smith     ierr     = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr);
126*5c6c1daeSBarry Smith   }
127*5c6c1daeSBarry Smith   ierr     = PetscOptionsGetIntArray(bag->bagprefix,nname,(PetscInt*)addr,&tmp,PETSC_NULL);CHKERRQ(ierr);
128*5c6c1daeSBarry Smith 
129*5c6c1daeSBarry Smith   ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
130*5c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
131*5c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
132*5c6c1daeSBarry Smith   if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
133*5c6c1daeSBarry Smith   item->next   = 0;
134*5c6c1daeSBarry Smith   item->msize  = msize;
135*5c6c1daeSBarry Smith   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
136*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
137*5c6c1daeSBarry Smith }
138*5c6c1daeSBarry Smith 
139*5c6c1daeSBarry Smith #undef __FUNCT__
140*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterRealArray"
141*5c6c1daeSBarry Smith /*@C
142*5c6c1daeSBarry Smith    PetscBagRegisterRealArray - add an real array to the bag
143*5c6c1daeSBarry Smith 
144*5c6c1daeSBarry Smith    Logically Collective on PetscBag
145*5c6c1daeSBarry Smith 
146*5c6c1daeSBarry Smith    Input Parameter:
147*5c6c1daeSBarry Smith +  bag - the bag of values
148*5c6c1daeSBarry Smith .  addr - location of real array in struct
149*5c6c1daeSBarry Smith .  msize - number of entries in array
150*5c6c1daeSBarry Smith .  name - name of the integer array
151*5c6c1daeSBarry Smith -  help - longer string with more information about the value
152*5c6c1daeSBarry Smith 
153*5c6c1daeSBarry Smith    Level: beginner
154*5c6c1daeSBarry Smith 
155*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
156*5c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
157*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
158*5c6c1daeSBarry Smith 
159*5c6c1daeSBarry Smith @*/
160*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterRealArray(PetscBag bag,void *addr,PetscInt msize, const char* name, const char* help)
161*5c6c1daeSBarry Smith {
162*5c6c1daeSBarry Smith   PetscErrorCode ierr;
163*5c6c1daeSBarry Smith   PetscBagItem   item;
164*5c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
165*5c6c1daeSBarry Smith   PetscBool      printhelp;
166*5c6c1daeSBarry Smith   PetscInt       i,tmp = msize;
167*5c6c1daeSBarry Smith 
168*5c6c1daeSBarry Smith   PetscFunctionBegin;
169*5c6c1daeSBarry Smith   /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/
170*5c6c1daeSBarry Smith   nname[0] = '-';
171*5c6c1daeSBarry Smith   nname[1] = 0;
172*5c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
173*5c6c1daeSBarry Smith   ierr     = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
174*5c6c1daeSBarry Smith   if (printhelp) {
175*5c6c1daeSBarry Smith     ierr     = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <",bag->bagprefix?bag->bagprefix:"",name);CHKERRQ(ierr);
176*5c6c1daeSBarry Smith     for (i=0; i<msize; i++) {
177*5c6c1daeSBarry Smith       ierr     = (*PetscHelpPrintf)(bag->bagcomm,"%G ",*((PetscReal*)addr)+i);CHKERRQ(ierr);
178*5c6c1daeSBarry Smith   }
179*5c6c1daeSBarry Smith     ierr     = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr);
180*5c6c1daeSBarry Smith   }
181*5c6c1daeSBarry Smith   ierr     = PetscOptionsGetRealArray(bag->bagprefix,nname,(PetscReal*)addr,&tmp,PETSC_NULL);CHKERRQ(ierr);
182*5c6c1daeSBarry Smith 
183*5c6c1daeSBarry Smith   ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
184*5c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
185*5c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
186*5c6c1daeSBarry Smith   if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
187*5c6c1daeSBarry Smith   item->next   = 0;
188*5c6c1daeSBarry Smith   item->msize  = msize;
189*5c6c1daeSBarry Smith   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
190*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
191*5c6c1daeSBarry Smith }
192*5c6c1daeSBarry Smith 
193*5c6c1daeSBarry Smith #undef __FUNCT__
194*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterInt"
195*5c6c1daeSBarry Smith /*@C
196*5c6c1daeSBarry Smith    PetscBagRegisterInt - add an integer value to the bag
197*5c6c1daeSBarry Smith 
198*5c6c1daeSBarry Smith    Logically Collective on PetscBag
199*5c6c1daeSBarry Smith 
200*5c6c1daeSBarry Smith    Input Parameter:
201*5c6c1daeSBarry Smith +  bag - the bag of values
202*5c6c1daeSBarry Smith .  addr - location of integer in struct
203*5c6c1daeSBarry Smith .  mdefault - the initial value
204*5c6c1daeSBarry Smith .  name - name of the integer
205*5c6c1daeSBarry Smith -  help - longer string with more information about the value
206*5c6c1daeSBarry Smith 
207*5c6c1daeSBarry Smith    Level: beginner
208*5c6c1daeSBarry Smith 
209*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
210*5c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
211*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
212*5c6c1daeSBarry Smith 
213*5c6c1daeSBarry Smith @*/
214*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterInt(PetscBag bag,void *addr,PetscInt mdefault, const char* name, const char* help)
215*5c6c1daeSBarry Smith {
216*5c6c1daeSBarry Smith   PetscErrorCode ierr;
217*5c6c1daeSBarry Smith   PetscBagItem   item;
218*5c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
219*5c6c1daeSBarry Smith   PetscBool      printhelp;
220*5c6c1daeSBarry Smith 
221*5c6c1daeSBarry Smith   PetscFunctionBegin;
222*5c6c1daeSBarry Smith   nname[0] = '-';
223*5c6c1daeSBarry Smith   nname[1] = 0;
224*5c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
225*5c6c1daeSBarry Smith   ierr     = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
226*5c6c1daeSBarry Smith   if (printhelp) {
227*5c6c1daeSBarry Smith     ierr     = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%d>: %s \n",bag->bagprefix?bag->bagprefix:"",name,mdefault,help);CHKERRQ(ierr);
228*5c6c1daeSBarry Smith   }
229*5c6c1daeSBarry Smith   ierr     = PetscOptionsGetInt(bag->bagprefix,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr);
230*5c6c1daeSBarry Smith 
231*5c6c1daeSBarry Smith   ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
232*5c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
233*5c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
234*5c6c1daeSBarry Smith   if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
235*5c6c1daeSBarry Smith   item->next   = 0;
236*5c6c1daeSBarry Smith   item->msize  = 1;
237*5c6c1daeSBarry Smith   *(PetscInt*)addr = mdefault;
238*5c6c1daeSBarry Smith   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
239*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
240*5c6c1daeSBarry Smith }
241*5c6c1daeSBarry Smith 
242*5c6c1daeSBarry Smith #undef __FUNCT__
243*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterString"
244*5c6c1daeSBarry Smith /*@C
245*5c6c1daeSBarry Smith    PetscBagRegisterString - add a string value to the bag
246*5c6c1daeSBarry Smith 
247*5c6c1daeSBarry Smith    Logically Collective on PetscBag
248*5c6c1daeSBarry Smith 
249*5c6c1daeSBarry Smith    Input Parameter:
250*5c6c1daeSBarry Smith +  bag - the bag of values
251*5c6c1daeSBarry Smith .  addr - location of start of string in struct
252*5c6c1daeSBarry Smith .  msize - length of the string space in the struct
253*5c6c1daeSBarry Smith .  mdefault - the initial value
254*5c6c1daeSBarry Smith .  name - name of the string
255*5c6c1daeSBarry Smith -  help - longer string with more information about the value
256*5c6c1daeSBarry Smith 
257*5c6c1daeSBarry Smith    Level: beginner
258*5c6c1daeSBarry Smith 
259*5c6c1daeSBarry Smith    Note: The struct should have the field char mystring[msize]; not char *mystring
260*5c6c1daeSBarry Smith 
261*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
262*5c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
263*5c6c1daeSBarry Smith            PetscBagSetFromOptions(),PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
264*5c6c1daeSBarry Smith 
265*5c6c1daeSBarry Smith @*/
266*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* mdefault, const char* name, const char* help)
267*5c6c1daeSBarry Smith {
268*5c6c1daeSBarry Smith   PetscErrorCode ierr;
269*5c6c1daeSBarry Smith   PetscBagItem   item;
270*5c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
271*5c6c1daeSBarry Smith   PetscBool      printhelp;
272*5c6c1daeSBarry Smith 
273*5c6c1daeSBarry Smith   PetscFunctionBegin;
274*5c6c1daeSBarry Smith   nname[0] = '-';
275*5c6c1daeSBarry Smith   nname[1] = 0;
276*5c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
277*5c6c1daeSBarry Smith   ierr     = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
278*5c6c1daeSBarry Smith   if (printhelp) {
279*5c6c1daeSBarry Smith     ierr     = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%s>: %s \n",bag->bagprefix?bag->bagprefix:"",name,mdefault,help);CHKERRQ(ierr);
280*5c6c1daeSBarry Smith   }
281*5c6c1daeSBarry Smith 
282*5c6c1daeSBarry Smith   ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
283*5c6c1daeSBarry Smith   item->dtype  = PETSC_CHAR;
284*5c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
285*5c6c1daeSBarry Smith   if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
286*5c6c1daeSBarry Smith   item->next   = 0;
287*5c6c1daeSBarry Smith   item->msize  = msize;
288*5c6c1daeSBarry Smith   if (mdefault != (char*)addr) {
289*5c6c1daeSBarry Smith     ierr = PetscStrncpy((char*)addr,mdefault,msize-1);CHKERRQ(ierr);
290*5c6c1daeSBarry Smith   }
291*5c6c1daeSBarry Smith   ierr = PetscOptionsGetString(bag->bagprefix,nname,(char*)addr,msize,PETSC_NULL);CHKERRQ(ierr);
292*5c6c1daeSBarry Smith   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
293*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
294*5c6c1daeSBarry Smith }
295*5c6c1daeSBarry Smith 
296*5c6c1daeSBarry Smith #undef __FUNCT__
297*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterReal"
298*5c6c1daeSBarry Smith /*@C
299*5c6c1daeSBarry Smith    PetscBagRegisterReal - add a real value to the bag
300*5c6c1daeSBarry Smith 
301*5c6c1daeSBarry Smith    Logically Collective on PetscBag
302*5c6c1daeSBarry Smith 
303*5c6c1daeSBarry Smith    Input Parameter:
304*5c6c1daeSBarry Smith +  bag - the bag of values
305*5c6c1daeSBarry Smith .  addr - location of double in struct
306*5c6c1daeSBarry Smith .  mdefault - the initial value
307*5c6c1daeSBarry Smith .  name - name of the variable
308*5c6c1daeSBarry Smith -  help - longer string with more information about the value
309*5c6c1daeSBarry Smith 
310*5c6c1daeSBarry Smith    Level: beginner
311*5c6c1daeSBarry Smith 
312*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
313*5c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
314*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
315*5c6c1daeSBarry Smith 
316*5c6c1daeSBarry Smith @*/
317*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterReal(PetscBag bag,void *addr,PetscReal mdefault, const char* name, const char* help)
318*5c6c1daeSBarry Smith {
319*5c6c1daeSBarry Smith   PetscErrorCode ierr;
320*5c6c1daeSBarry Smith   PetscBagItem   item;
321*5c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
322*5c6c1daeSBarry Smith   PetscBool      printhelp;
323*5c6c1daeSBarry Smith 
324*5c6c1daeSBarry Smith   PetscFunctionBegin;
325*5c6c1daeSBarry Smith   nname[0] = '-';
326*5c6c1daeSBarry Smith   nname[1] = 0;
327*5c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
328*5c6c1daeSBarry Smith   ierr     = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
329*5c6c1daeSBarry Smith   if (printhelp) {
330*5c6c1daeSBarry Smith     ierr     = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%G>: %s \n",bag->bagprefix?bag->bagprefix:"",name,mdefault,help);CHKERRQ(ierr);
331*5c6c1daeSBarry Smith   }
332*5c6c1daeSBarry Smith   ierr     = PetscOptionsGetReal(bag->bagprefix,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr);
333*5c6c1daeSBarry Smith 
334*5c6c1daeSBarry Smith   ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
335*5c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
336*5c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
337*5c6c1daeSBarry Smith   if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
338*5c6c1daeSBarry Smith   item->next   = 0;
339*5c6c1daeSBarry Smith   item->msize  = 1;
340*5c6c1daeSBarry Smith   *(PetscReal*)addr = mdefault;
341*5c6c1daeSBarry Smith   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
342*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
343*5c6c1daeSBarry Smith }
344*5c6c1daeSBarry Smith 
345*5c6c1daeSBarry Smith #undef __FUNCT__
346*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterScalar"
347*5c6c1daeSBarry Smith /*@C
348*5c6c1daeSBarry Smith    PetscBagRegisterScalar - add a real or complex number value to the bag
349*5c6c1daeSBarry Smith 
350*5c6c1daeSBarry Smith    Logically Collective on PetscBag
351*5c6c1daeSBarry Smith 
352*5c6c1daeSBarry Smith    Input Parameter:
353*5c6c1daeSBarry Smith +  bag - the bag of values
354*5c6c1daeSBarry Smith .  addr - location of scalar in struct
355*5c6c1daeSBarry Smith .  mdefault - the initial value
356*5c6c1daeSBarry Smith .  name - name of the variable
357*5c6c1daeSBarry Smith -  help - longer string with more information about the value
358*5c6c1daeSBarry Smith 
359*5c6c1daeSBarry Smith 
360*5c6c1daeSBarry Smith    Level: beginner
361*5c6c1daeSBarry Smith 
362*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
363*5c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
364*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
365*5c6c1daeSBarry Smith 
366*5c6c1daeSBarry Smith @*/
367*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar mdefault, const char* name, const char* help)
368*5c6c1daeSBarry Smith {
369*5c6c1daeSBarry Smith   PetscErrorCode ierr;
370*5c6c1daeSBarry Smith   PetscBagItem   item;
371*5c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
372*5c6c1daeSBarry Smith   PetscBool      printhelp;
373*5c6c1daeSBarry Smith 
374*5c6c1daeSBarry Smith   PetscFunctionBegin;
375*5c6c1daeSBarry Smith   nname[0] = '-';
376*5c6c1daeSBarry Smith   nname[1] = 0;
377*5c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
378*5c6c1daeSBarry Smith   ierr     = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
379*5c6c1daeSBarry Smith   if (printhelp) {
380*5c6c1daeSBarry Smith     ierr     = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%G + %Gi>: %s \n",bag->bagprefix?bag->bagprefix:"",name,PetscRealPart(mdefault),PetscImaginaryPart(mdefault),help);CHKERRQ(ierr);
381*5c6c1daeSBarry Smith   }
382*5c6c1daeSBarry Smith   ierr     = PetscOptionsGetScalar(bag->bagprefix,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr);
383*5c6c1daeSBarry Smith 
384*5c6c1daeSBarry Smith   ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
385*5c6c1daeSBarry Smith   item->dtype  = PETSC_SCALAR;
386*5c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
387*5c6c1daeSBarry Smith   if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
388*5c6c1daeSBarry Smith   item->next   = 0;
389*5c6c1daeSBarry Smith   item->msize  = 1;
390*5c6c1daeSBarry Smith   *(PetscScalar*)addr = mdefault;
391*5c6c1daeSBarry Smith   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
392*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
393*5c6c1daeSBarry Smith }
394*5c6c1daeSBarry Smith 
395*5c6c1daeSBarry Smith #undef __FUNCT__
396*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterBool"
397*5c6c1daeSBarry Smith /*@C
398*5c6c1daeSBarry Smith    PetscBagRegisterBool - add a logical value to the bag
399*5c6c1daeSBarry Smith 
400*5c6c1daeSBarry Smith    Logically Collective on PetscBag
401*5c6c1daeSBarry Smith 
402*5c6c1daeSBarry Smith    Input Parameter:
403*5c6c1daeSBarry Smith +  bag - the bag of values
404*5c6c1daeSBarry Smith .  addr - location of logical in struct
405*5c6c1daeSBarry Smith .  mdefault - the initial value
406*5c6c1daeSBarry Smith .  name - name of the variable
407*5c6c1daeSBarry Smith -  help - longer string with more information about the value
408*5c6c1daeSBarry Smith 
409*5c6c1daeSBarry Smith 
410*5c6c1daeSBarry Smith    Level: beginner
411*5c6c1daeSBarry Smith 
412*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
413*5c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
414*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
415*5c6c1daeSBarry Smith 
416*5c6c1daeSBarry Smith @*/
417*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterBool(PetscBag bag,void *addr,PetscBool  mdefault, const char* name, const char* help)
418*5c6c1daeSBarry Smith {
419*5c6c1daeSBarry Smith   PetscErrorCode ierr;
420*5c6c1daeSBarry Smith   PetscBagItem   item;
421*5c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
422*5c6c1daeSBarry Smith   PetscBool      printhelp;
423*5c6c1daeSBarry Smith 
424*5c6c1daeSBarry Smith   PetscFunctionBegin;
425*5c6c1daeSBarry Smith   /* the checks here with != PETSC_FALSE and PETSC_TRUE is a special case; here we truly demand that the value be 0 or 1 */
426*5c6c1daeSBarry Smith   if (mdefault != PETSC_FALSE && mdefault != PETSC_TRUE) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Boolean %s %s must be boolean; integer value %d",name,help,(int)mdefault);
427*5c6c1daeSBarry Smith   nname[0] = '-';
428*5c6c1daeSBarry Smith   nname[1] = 0;
429*5c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
430*5c6c1daeSBarry Smith   ierr     = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
431*5c6c1daeSBarry Smith   if (printhelp) {
432*5c6c1daeSBarry Smith     ierr     = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%s>: %s \n",bag->bagprefix?bag->bagprefix:"",name,PetscBools[mdefault],help);CHKERRQ(ierr);
433*5c6c1daeSBarry Smith   }
434*5c6c1daeSBarry Smith   ierr     = PetscOptionsGetBool(bag->bagprefix,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr);
435*5c6c1daeSBarry Smith 
436*5c6c1daeSBarry Smith   ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
437*5c6c1daeSBarry Smith   item->dtype  = PETSC_BOOL;
438*5c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
439*5c6c1daeSBarry Smith   if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
440*5c6c1daeSBarry Smith   item->next   = 0;
441*5c6c1daeSBarry Smith   item->msize  = 1;
442*5c6c1daeSBarry Smith   *(PetscBool*)addr = mdefault;
443*5c6c1daeSBarry Smith   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
444*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
445*5c6c1daeSBarry Smith }
446*5c6c1daeSBarry Smith 
447*5c6c1daeSBarry Smith #undef __FUNCT__
448*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagDestroy"
449*5c6c1daeSBarry Smith /*@C
450*5c6c1daeSBarry Smith    PetscBagDestroy - Destroys a bag values
451*5c6c1daeSBarry Smith 
452*5c6c1daeSBarry Smith    Collective on PetscBag
453*5c6c1daeSBarry Smith 
454*5c6c1daeSBarry Smith    Input Parameter:
455*5c6c1daeSBarry Smith .  bag - the bag of values
456*5c6c1daeSBarry Smith 
457*5c6c1daeSBarry Smith    Level: beginner
458*5c6c1daeSBarry Smith 
459*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
460*5c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
461*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
462*5c6c1daeSBarry Smith 
463*5c6c1daeSBarry Smith @*/
464*5c6c1daeSBarry Smith PetscErrorCode  PetscBagDestroy(PetscBag *bag)
465*5c6c1daeSBarry Smith {
466*5c6c1daeSBarry Smith   PetscErrorCode ierr;
467*5c6c1daeSBarry Smith   PetscBagItem   nitem = (*bag)->bagitems,item;
468*5c6c1daeSBarry Smith 
469*5c6c1daeSBarry Smith   PetscFunctionBegin;
470*5c6c1daeSBarry Smith   while (nitem) {
471*5c6c1daeSBarry Smith     item  = nitem->next;
472*5c6c1daeSBarry Smith     if (nitem->list) {
473*5c6c1daeSBarry Smith       ierr = PetscStrArrayDestroy(&nitem->list);CHKERRQ(ierr);
474*5c6c1daeSBarry Smith     }
475*5c6c1daeSBarry Smith     ierr  = PetscFree(nitem);CHKERRQ(ierr);
476*5c6c1daeSBarry Smith     nitem = item;
477*5c6c1daeSBarry Smith   }
478*5c6c1daeSBarry Smith   if ((*bag)->bagprefix) { ierr = PetscFree((*bag)->bagprefix);CHKERRQ(ierr); }
479*5c6c1daeSBarry Smith   ierr = PetscFree(*bag);CHKERRQ(ierr);
480*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
481*5c6c1daeSBarry Smith }
482*5c6c1daeSBarry Smith 
483*5c6c1daeSBarry Smith #undef __FUNCT__
484*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetFromOptions"
485*5c6c1daeSBarry Smith /*@
486*5c6c1daeSBarry Smith    PetscBagSetFromOptions - Allows setting options from a bag
487*5c6c1daeSBarry Smith 
488*5c6c1daeSBarry Smith    Collective on PetscBag
489*5c6c1daeSBarry Smith 
490*5c6c1daeSBarry Smith    Input Parameter:
491*5c6c1daeSBarry Smith .  bag - the bag of values
492*5c6c1daeSBarry Smith 
493*5c6c1daeSBarry Smith    Level: beginner
494*5c6c1daeSBarry Smith 
495*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData()
496*5c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
497*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagView(), PetscBagRegisterEnum()
498*5c6c1daeSBarry Smith 
499*5c6c1daeSBarry Smith @*/
500*5c6c1daeSBarry Smith PetscErrorCode  PetscBagSetFromOptions(PetscBag bag)
501*5c6c1daeSBarry Smith {
502*5c6c1daeSBarry Smith   PetscErrorCode ierr;
503*5c6c1daeSBarry Smith   PetscBagItem   nitem = bag->bagitems;
504*5c6c1daeSBarry Smith   char           name[PETSC_BAG_NAME_LENGTH+1],helpname[PETSC_BAG_NAME_LENGTH+PETSC_BAG_HELP_LENGTH+3];
505*5c6c1daeSBarry Smith   PetscInt       n;
506*5c6c1daeSBarry Smith 
507*5c6c1daeSBarry Smith   PetscFunctionBegin;
508*5c6c1daeSBarry Smith   ierr = PetscStrcpy(helpname,bag->bagname);CHKERRQ(ierr);
509*5c6c1daeSBarry Smith   ierr = PetscStrcat(helpname," ");CHKERRQ(ierr);
510*5c6c1daeSBarry Smith   ierr = PetscStrcat(helpname,bag->baghelp);CHKERRQ(ierr);
511*5c6c1daeSBarry Smith   ierr = PetscOptionsBegin(bag->bagcomm,bag->bagprefix,helpname,0);
512*5c6c1daeSBarry Smith     while (nitem) {
513*5c6c1daeSBarry Smith       name[0] = '-';
514*5c6c1daeSBarry Smith       name[1] = 0;
515*5c6c1daeSBarry Smith       ierr    = PetscStrcat(name,nitem->name);CHKERRQ(ierr);
516*5c6c1daeSBarry Smith       if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */
517*5c6c1daeSBarry Smith         char *value = (char*)(((char*)bag) + nitem->offset);
518*5c6c1daeSBarry Smith         ierr = PetscOptionsString(name,nitem->help,"",value,value,nitem->msize,PETSC_NULL);CHKERRQ(ierr);
519*5c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_REAL) {
520*5c6c1daeSBarry Smith         PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset);
521*5c6c1daeSBarry Smith         if (nitem->msize == 1) {
522*5c6c1daeSBarry Smith           ierr = PetscOptionsReal(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr);
523*5c6c1daeSBarry Smith         } else {
524*5c6c1daeSBarry Smith           n = nitem->msize;
525*5c6c1daeSBarry Smith           ierr = PetscOptionsRealArray(name,nitem->help,"",value,&n,PETSC_NULL);CHKERRQ(ierr);
526*5c6c1daeSBarry Smith         }
527*5c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_SCALAR) {
528*5c6c1daeSBarry Smith         PetscScalar *value = (PetscScalar*)(((char*)bag) + nitem->offset);
529*5c6c1daeSBarry Smith         ierr = PetscOptionsScalar(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr);
530*5c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_INT) {
531*5c6c1daeSBarry Smith         PetscInt *value = (PetscInt*)(((char*)bag) + nitem->offset);
532*5c6c1daeSBarry Smith         if (nitem->msize == 1) {
533*5c6c1daeSBarry Smith           ierr = PetscOptionsInt(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr);
534*5c6c1daeSBarry Smith         } else {
535*5c6c1daeSBarry Smith           n = nitem->msize;
536*5c6c1daeSBarry Smith           ierr = PetscOptionsIntArray(name,nitem->help,"",value,&n,PETSC_NULL);CHKERRQ(ierr);
537*5c6c1daeSBarry Smith         }
538*5c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_ENUM) {
539*5c6c1daeSBarry Smith         PetscEnum *value = (PetscEnum*)(((char*)bag) + nitem->offset);
540*5c6c1daeSBarry Smith         PetscInt  i = 0;
541*5c6c1daeSBarry Smith         while (nitem->list[i++]);
542*5c6c1daeSBarry Smith         ierr = PetscOptionsEnum(name,nitem->help,nitem->list[i-3],(const char*const*)nitem->list,*value,value,PETSC_NULL);CHKERRQ(ierr);
543*5c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_BOOL) {
544*5c6c1daeSBarry Smith         PetscBool  *value = (PetscBool*)(((char*)bag) + nitem->offset);
545*5c6c1daeSBarry Smith         ierr = PetscOptionsBool(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr);
546*5c6c1daeSBarry Smith       }
547*5c6c1daeSBarry Smith       nitem = nitem->next;
548*5c6c1daeSBarry Smith     }
549*5c6c1daeSBarry Smith   PetscOptionsEnd();
550*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
551*5c6c1daeSBarry Smith }
552*5c6c1daeSBarry Smith 
553*5c6c1daeSBarry Smith #undef __FUNCT__
554*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagView"
555*5c6c1daeSBarry Smith /*@C
556*5c6c1daeSBarry Smith    PetscBagView - Views a bag of values as either ASCII text or a binary file
557*5c6c1daeSBarry Smith 
558*5c6c1daeSBarry Smith    Collective on PetscBag
559*5c6c1daeSBarry Smith 
560*5c6c1daeSBarry Smith    Input Parameter:
561*5c6c1daeSBarry Smith +  bag - the bag of values
562*5c6c1daeSBarry Smith -  viewer - location to view the values
563*5c6c1daeSBarry Smith 
564*5c6c1daeSBarry Smith    Level: beginner
565*5c6c1daeSBarry Smith 
566*5c6c1daeSBarry Smith    Warning: Currently PETSc bags saved in a binary file can only be read back
567*5c6c1daeSBarry Smith      in on a machine of the same architecture. Let us know when this is a problem
568*5c6c1daeSBarry Smith      and we'll fix it.
569*5c6c1daeSBarry Smith 
570*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData()
571*5c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum()
572*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName()
573*5c6c1daeSBarry Smith 
574*5c6c1daeSBarry Smith @*/
575*5c6c1daeSBarry Smith PetscErrorCode  PetscBagView(PetscBag bag,PetscViewer view)
576*5c6c1daeSBarry Smith {
577*5c6c1daeSBarry Smith   PetscBool      isascii,isbinary;
578*5c6c1daeSBarry Smith   PetscErrorCode ierr;
579*5c6c1daeSBarry Smith   PetscBagItem   nitem = bag->bagitems;
580*5c6c1daeSBarry Smith 
581*5c6c1daeSBarry Smith   PetscFunctionBegin;
582*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
583*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
584*5c6c1daeSBarry Smith   if (isascii) {
585*5c6c1daeSBarry Smith     ierr = PetscViewerASCIIPrintf(view,"PetscBag Object:  %s %s\n",bag->bagname,bag->baghelp);CHKERRQ(ierr);
586*5c6c1daeSBarry Smith     while (nitem) {
587*5c6c1daeSBarry Smith       if (nitem->dtype == PETSC_CHAR) {
588*5c6c1daeSBarry Smith         char* value = (char*)(((char*)bag) + nitem->offset);
589*5c6c1daeSBarry Smith         char tmp = value[nitem->msize-1];  /* special handling for fortran chars wihout null terminator */
590*5c6c1daeSBarry Smith         value[nitem->msize-1] =0;
591*5c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %s; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr);
592*5c6c1daeSBarry Smith         value[nitem->msize-1] =tmp;
593*5c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_REAL) {
594*5c6c1daeSBarry Smith         PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset);
595*5c6c1daeSBarry Smith         PetscInt  i;
596*5c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = ",nitem->name);CHKERRQ(ierr);
597*5c6c1daeSBarry Smith         for (i=0; i<nitem->msize; i++) {
598*5c6c1daeSBarry Smith           ierr = PetscViewerASCIIPrintf(view,"%G ",value[i]);CHKERRQ(ierr);
599*5c6c1daeSBarry Smith         }
600*5c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr);
601*5c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_SCALAR) {
602*5c6c1daeSBarry Smith         PetscScalar value = *(PetscScalar*)(((char*)bag) + nitem->offset);
603*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
604*5c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %G + %Gi; %s\n",nitem->name,PetscRealPart(value),PetscImaginaryPart(value),nitem->help);CHKERRQ(ierr);
605*5c6c1daeSBarry Smith #else
606*5c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %G; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr);
607*5c6c1daeSBarry Smith #endif
608*5c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_INT) {
609*5c6c1daeSBarry Smith         PetscInt i,*value = (PetscInt*)(((char*)bag) + nitem->offset);
610*5c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = ",nitem->name);CHKERRQ(ierr);
611*5c6c1daeSBarry Smith         for (i=0; i<nitem->msize; i++) {
612*5c6c1daeSBarry Smith           ierr = PetscViewerASCIIPrintf(view,"%D ",value[i]);CHKERRQ(ierr);
613*5c6c1daeSBarry Smith         }
614*5c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr);
615*5c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_BOOL) {
616*5c6c1daeSBarry Smith         PetscBool  value = *(PetscBool*)(((char*)bag) + nitem->offset);
617*5c6c1daeSBarry Smith         /* some Fortran compilers use -1 as boolean */
618*5c6c1daeSBarry Smith         if (((int) value) == -1) value = PETSC_TRUE;
619*5c6c1daeSBarry Smith         /* the checks here with != PETSC_FALSE and PETSC_TRUE is a special case; here we truly demand that the value be 0 or 1 */
620*5c6c1daeSBarry Smith         if (value != PETSC_FALSE && value != PETSC_TRUE) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Boolean value for %s %s is corrupt; integer value %d",nitem->name,nitem->help,value);
621*5c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %s; %s\n",nitem->name,PetscBools[value],nitem->help);CHKERRQ(ierr);
622*5c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_ENUM) {
623*5c6c1daeSBarry Smith         PetscEnum value = *(PetscEnum*)(((char*)bag) + nitem->offset);
624*5c6c1daeSBarry Smith         PetscInt  i = 0;
625*5c6c1daeSBarry Smith         while (nitem->list[i++]);
626*5c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %s; (%s) %s\n",nitem->name,nitem->list[value],nitem->list[i-3],nitem->help);CHKERRQ(ierr);
627*5c6c1daeSBarry Smith       }
628*5c6c1daeSBarry Smith       nitem = nitem->next;
629*5c6c1daeSBarry Smith     }
630*5c6c1daeSBarry Smith   } else if (isbinary) {
631*5c6c1daeSBarry Smith     PetscInt classid = PETSC_BAG_FILE_CLASSID, dtype;
632*5c6c1daeSBarry Smith     PetscInt deprecatedbagsize = 0;
633*5c6c1daeSBarry Smith     ierr = PetscViewerBinaryWrite(view,&classid,1,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
634*5c6c1daeSBarry Smith     ierr = PetscViewerBinaryWrite(view,&deprecatedbagsize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
635*5c6c1daeSBarry Smith     ierr = PetscViewerBinaryWrite(view,&bag->count,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
636*5c6c1daeSBarry Smith     ierr = PetscViewerBinaryWrite(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
637*5c6c1daeSBarry Smith     ierr = PetscViewerBinaryWrite(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
638*5c6c1daeSBarry Smith     while (nitem) {
639*5c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,&nitem->offset,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
640*5c6c1daeSBarry Smith       dtype = (PetscInt)nitem->dtype;
641*5c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,&dtype,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
642*5c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,nitem->name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
643*5c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,nitem->help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
644*5c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,&nitem->msize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
645*5c6c1daeSBarry Smith       /* some Fortran compilers use -1 as boolean */
646*5c6c1daeSBarry Smith       if (dtype == PETSC_BOOL && ((*(int*) (((char*)bag) + nitem->offset) == -1))) *(int*) (((char*)bag) + nitem->offset) = PETSC_TRUE;
647*5c6c1daeSBarry Smith 
648*5c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,(((char*)bag) + nitem->offset),nitem->msize,nitem->dtype,PETSC_FALSE);CHKERRQ(ierr);
649*5c6c1daeSBarry Smith       if (dtype == PETSC_ENUM) {
650*5c6c1daeSBarry Smith         ierr = PetscViewerBinaryWriteStringArray(view,(char **)nitem->list);CHKERRQ(ierr);
651*5c6c1daeSBarry Smith       }
652*5c6c1daeSBarry Smith       nitem = nitem->next;
653*5c6c1daeSBarry Smith     }
654*5c6c1daeSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type");
655*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
656*5c6c1daeSBarry Smith }
657*5c6c1daeSBarry Smith 
658*5c6c1daeSBarry Smith #undef __FUNCT__
659*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagLoad"
660*5c6c1daeSBarry Smith /*@C
661*5c6c1daeSBarry Smith    PetscBagLoad - Loads a bag of values from a binary file
662*5c6c1daeSBarry Smith 
663*5c6c1daeSBarry Smith    Collective on PetscViewer
664*5c6c1daeSBarry Smith 
665*5c6c1daeSBarry Smith    Input Parameter:
666*5c6c1daeSBarry Smith +  viewer - file to load values from
667*5c6c1daeSBarry Smith -  bag - the bag of values
668*5c6c1daeSBarry Smith 
669*5c6c1daeSBarry Smith    Notes: You must have created and registered all the fields in the bag before loading into it.
670*5c6c1daeSBarry Smith 
671*5c6c1daeSBarry Smith    Notes:
672*5c6c1daeSBarry Smith    Level: beginner
673*5c6c1daeSBarry Smith 
674*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagView(), PetscBagGetData()
675*5c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
676*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
677*5c6c1daeSBarry Smith 
678*5c6c1daeSBarry Smith @*/
679*5c6c1daeSBarry Smith PetscErrorCode  PetscBagLoad(PetscViewer view,PetscBag bag)
680*5c6c1daeSBarry Smith {
681*5c6c1daeSBarry Smith   PetscErrorCode ierr;
682*5c6c1daeSBarry Smith   PetscBool      isbinary;
683*5c6c1daeSBarry Smith   PetscInt       classid,bagcount,i,dtype,msize,offset,deprecatedbagsize;
684*5c6c1daeSBarry Smith   char           name[PETSC_BAG_NAME_LENGTH],help[PETSC_BAG_HELP_LENGTH],**list;
685*5c6c1daeSBarry Smith   PetscBagItem   nitem;
686*5c6c1daeSBarry Smith   MPI_Comm       comm;
687*5c6c1daeSBarry Smith   PetscMPIInt    flag;
688*5c6c1daeSBarry Smith 
689*5c6c1daeSBarry Smith   PetscFunctionBegin;
690*5c6c1daeSBarry Smith   ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr);
691*5c6c1daeSBarry Smith   ierr = MPI_Comm_compare(comm,bag->bagcomm,&flag);CHKERRQ(ierr);
692*5c6c1daeSBarry Smith   if (flag != MPI_CONGRUENT && flag != MPI_IDENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the viewer and bag"); \
693*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
694*5c6c1daeSBarry Smith   if (!isbinary) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type");
695*5c6c1daeSBarry Smith 
696*5c6c1daeSBarry Smith   ierr = PetscViewerBinaryRead(view,&classid,1,PETSC_INT);CHKERRQ(ierr);
697*5c6c1daeSBarry Smith   if (classid != PETSC_BAG_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not PetscBag next in binary file");
698*5c6c1daeSBarry Smith   ierr = PetscViewerBinaryRead(view,&deprecatedbagsize,1,PETSC_INT);CHKERRQ(ierr);
699*5c6c1daeSBarry Smith   ierr = PetscViewerBinaryRead(view,&bagcount,1,PETSC_INT);CHKERRQ(ierr);
700*5c6c1daeSBarry Smith   if (bagcount != bag->count) SETERRQ2(comm,PETSC_ERR_ARG_INCOMP,"Bag in file has different number of entries %d then passed in bag %d\n",(int)bagcount,(int)bag->count);CHKERRQ(ierr);
701*5c6c1daeSBarry Smith   ierr = PetscViewerBinaryRead(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
702*5c6c1daeSBarry Smith   ierr = PetscViewerBinaryRead(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
703*5c6c1daeSBarry Smith 
704*5c6c1daeSBarry Smith   nitem = bag->bagitems;
705*5c6c1daeSBarry Smith   for (i=0; i<bagcount; i++) {
706*5c6c1daeSBarry Smith     ierr = PetscViewerBinaryRead(view,&offset,1,PETSC_INT);CHKERRQ(ierr);
707*5c6c1daeSBarry Smith     /* ignore the offset in the file */
708*5c6c1daeSBarry Smith     ierr = PetscViewerBinaryRead(view,&dtype,1,PETSC_INT);CHKERRQ(ierr);
709*5c6c1daeSBarry Smith     ierr = PetscViewerBinaryRead(view,name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
710*5c6c1daeSBarry Smith     ierr = PetscViewerBinaryRead(view,help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
711*5c6c1daeSBarry Smith     ierr = PetscViewerBinaryRead(view,&msize,1,PETSC_INT);CHKERRQ(ierr);
712*5c6c1daeSBarry Smith 
713*5c6c1daeSBarry Smith     if (dtype == (PetscInt) PETSC_CHAR) {
714*5c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_CHAR);CHKERRQ(ierr);
715*5c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_REAL) {
716*5c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_REAL);CHKERRQ(ierr);
717*5c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_SCALAR) {
718*5c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_SCALAR);CHKERRQ(ierr);
719*5c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_INT) {
720*5c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_INT);CHKERRQ(ierr);
721*5c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_BOOL) {
722*5c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_BOOL);CHKERRQ(ierr);
723*5c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_ENUM) {
724*5c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_ENUM);CHKERRQ(ierr);
725*5c6c1daeSBarry Smith       ierr = PetscViewerBinaryReadStringArray(view,&list);CHKERRQ(ierr);
726*5c6c1daeSBarry Smith       /* don't need to save list because it is already registered in the bag */
727*5c6c1daeSBarry Smith       ierr = PetscFree(list);CHKERRQ(ierr);
728*5c6c1daeSBarry Smith     }
729*5c6c1daeSBarry Smith     nitem = nitem->next;
730*5c6c1daeSBarry Smith   }
731*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
732*5c6c1daeSBarry Smith }
733*5c6c1daeSBarry Smith 
734*5c6c1daeSBarry Smith #undef __FUNCT__
735*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagCreate"
736*5c6c1daeSBarry Smith /*@
737*5c6c1daeSBarry Smith     PetscBagCreate - Create a bag of values
738*5c6c1daeSBarry Smith 
739*5c6c1daeSBarry Smith   Collective on MPI_Comm
740*5c6c1daeSBarry Smith 
741*5c6c1daeSBarry Smith   Level: Intermediate
742*5c6c1daeSBarry Smith 
743*5c6c1daeSBarry Smith   Input Parameters:
744*5c6c1daeSBarry Smith +  comm - communicator to share bag
745*5c6c1daeSBarry Smith -  bagsize - size of the C structure holding the values
746*5c6c1daeSBarry Smith 
747*5c6c1daeSBarry Smith   Output Parameter:
748*5c6c1daeSBarry Smith .   bag - the bag of values
749*5c6c1daeSBarry Smith 
750*5c6c1daeSBarry Smith    Notes:
751*5c6c1daeSBarry Smith       The size of the A struct must be small enough to fit in a PetscInt; by default
752*5c6c1daeSBarry Smith       PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length.
753*5c6c1daeSBarry Smith       The warning about casting to a shorter length can be ignored below unless your A struct is too large
754*5c6c1daeSBarry Smith 
755*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
756*5c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
757*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
758*5c6c1daeSBarry Smith @*/
759*5c6c1daeSBarry Smith PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag)
760*5c6c1daeSBarry Smith {
761*5c6c1daeSBarry Smith   PetscErrorCode ierr;
762*5c6c1daeSBarry Smith   size_t         totalsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar);
763*5c6c1daeSBarry Smith 
764*5c6c1daeSBarry Smith   PetscFunctionBegin;
765*5c6c1daeSBarry Smith   ierr = PetscInfo1(PETSC_NULL,"Creating Bag with total size %d\n",(int)totalsize);CHKERRQ(ierr);
766*5c6c1daeSBarry Smith   ierr = PetscMalloc(totalsize,bag);CHKERRQ(ierr);
767*5c6c1daeSBarry Smith   ierr = PetscMemzero(*bag,bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar));CHKERRQ(ierr);
768*5c6c1daeSBarry Smith   (*bag)->bagsize        = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar);
769*5c6c1daeSBarry Smith   (*bag)->bagcomm        = comm;
770*5c6c1daeSBarry Smith   (*bag)->bagprefix      = PETSC_NULL;
771*5c6c1daeSBarry Smith   (*bag)->structlocation = (void*)(((char*)(*bag)) + sizeof(PetscScalar)*(sizeof(struct _n_PetscBag)/sizeof(PetscScalar)) + sizeof(PetscScalar));
772*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
773*5c6c1daeSBarry Smith }
774*5c6c1daeSBarry Smith 
775*5c6c1daeSBarry Smith #undef __FUNCT__
776*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetName"
777*5c6c1daeSBarry Smith /*@C
778*5c6c1daeSBarry Smith     PetscBagSetName - Sets the name of a bag of values
779*5c6c1daeSBarry Smith 
780*5c6c1daeSBarry Smith   Not Collective
781*5c6c1daeSBarry Smith 
782*5c6c1daeSBarry Smith   Level: Intermediate
783*5c6c1daeSBarry Smith 
784*5c6c1daeSBarry Smith   Input Parameters:
785*5c6c1daeSBarry Smith +   bag - the bag of values
786*5c6c1daeSBarry Smith .   name - the name assigned to the bag
787*5c6c1daeSBarry Smith -   help - help message for bag
788*5c6c1daeSBarry Smith 
789*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
790*5c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
791*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
792*5c6c1daeSBarry Smith @*/
793*5c6c1daeSBarry Smith 
794*5c6c1daeSBarry Smith PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help)
795*5c6c1daeSBarry Smith {
796*5c6c1daeSBarry Smith   PetscErrorCode ierr;
797*5c6c1daeSBarry Smith   PetscFunctionBegin;
798*5c6c1daeSBarry Smith   ierr = PetscStrncpy(bag->bagname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
799*5c6c1daeSBarry Smith   ierr = PetscStrncpy(bag->baghelp,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr);
800*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
801*5c6c1daeSBarry Smith }
802*5c6c1daeSBarry Smith 
803*5c6c1daeSBarry Smith 
804*5c6c1daeSBarry Smith #undef __FUNCT__
805*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagGetName"
806*5c6c1daeSBarry Smith /*@C
807*5c6c1daeSBarry Smith     PetscBagGetName - Gets the name of a bag of values
808*5c6c1daeSBarry Smith 
809*5c6c1daeSBarry Smith   Not Collective
810*5c6c1daeSBarry Smith 
811*5c6c1daeSBarry Smith   Level: Intermediate
812*5c6c1daeSBarry Smith 
813*5c6c1daeSBarry Smith   Input Parameter:
814*5c6c1daeSBarry Smith .   bag - the bag of values
815*5c6c1daeSBarry Smith 
816*5c6c1daeSBarry Smith   Output Parameter:
817*5c6c1daeSBarry Smith .   name - the name assigned to the bag
818*5c6c1daeSBarry Smith 
819*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
820*5c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
821*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
822*5c6c1daeSBarry Smith @*/
823*5c6c1daeSBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, char **name)
824*5c6c1daeSBarry Smith {
825*5c6c1daeSBarry Smith   PetscFunctionBegin;
826*5c6c1daeSBarry Smith   *name = bag->bagname;
827*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
828*5c6c1daeSBarry Smith }
829*5c6c1daeSBarry Smith 
830*5c6c1daeSBarry Smith #undef __FUNCT__
831*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagGetData"
832*5c6c1daeSBarry Smith /*@C
833*5c6c1daeSBarry Smith     PetscBagGetData - Gives back the user - access to memory that
834*5c6c1daeSBarry Smith     should be used for storing user-data-structure
835*5c6c1daeSBarry Smith 
836*5c6c1daeSBarry Smith   Not Collective
837*5c6c1daeSBarry Smith 
838*5c6c1daeSBarry Smith   Level: Intermediate
839*5c6c1daeSBarry Smith 
840*5c6c1daeSBarry Smith   Input Parameter:
841*5c6c1daeSBarry Smith .   bag - the bag of values
842*5c6c1daeSBarry Smith 
843*5c6c1daeSBarry Smith   Output Parameter:
844*5c6c1daeSBarry Smith .   data - pointer to memory that will have user-data-structure
845*5c6c1daeSBarry Smith 
846*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad()
847*5c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
848*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
849*5c6c1daeSBarry Smith @*/
850*5c6c1daeSBarry Smith PetscErrorCode PetscBagGetData(PetscBag bag, void **data)
851*5c6c1daeSBarry Smith {
852*5c6c1daeSBarry Smith   PetscFunctionBegin;
853*5c6c1daeSBarry Smith   *data = bag->structlocation;
854*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
855*5c6c1daeSBarry Smith }
856*5c6c1daeSBarry Smith 
857*5c6c1daeSBarry Smith #undef __FUNCT__
858*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetOptionsPrefix"
859*5c6c1daeSBarry Smith /*@C
860*5c6c1daeSBarry Smith   PetscBagSetOptionsPrefix - Sets the prefix used for searching for all
861*5c6c1daeSBarry Smith   PetscBag items in the options database.
862*5c6c1daeSBarry Smith 
863*5c6c1daeSBarry Smith   Logically collective on Bag.
864*5c6c1daeSBarry Smith 
865*5c6c1daeSBarry Smith   Level: Intermediate
866*5c6c1daeSBarry Smith 
867*5c6c1daeSBarry Smith   Input Parameters:
868*5c6c1daeSBarry Smith +   bag - the bag of values
869*5c6c1daeSBarry Smith -   prefix - the prefix to prepend all Bag item names with.
870*5c6c1daeSBarry Smith 
871*5c6c1daeSBarry Smith   NOTES: Must be called prior to registering any of the bag items.
872*5c6c1daeSBarry Smith 
873*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
874*5c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
875*5c6c1daeSBarry Smith @*/
876*5c6c1daeSBarry Smith 
877*5c6c1daeSBarry Smith PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[])
878*5c6c1daeSBarry Smith {
879*5c6c1daeSBarry Smith   PetscErrorCode ierr;
880*5c6c1daeSBarry Smith   PetscFunctionBegin;
881*5c6c1daeSBarry Smith   if (!pre) {
882*5c6c1daeSBarry Smith     ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr);
883*5c6c1daeSBarry Smith   } else {
884*5c6c1daeSBarry Smith     if (pre[0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hypen");
885*5c6c1daeSBarry Smith     ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr);
886*5c6c1daeSBarry Smith     ierr = PetscStrallocpy(pre,&(bag->bagprefix));CHKERRQ(ierr);
887*5c6c1daeSBarry Smith   }
888*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
889*5c6c1daeSBarry Smith }
890