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