xref: /petsc/src/sys/classes/bag/bag.c (revision 478db826a40dca33d2f318a94ee2bc67dcb6bd71)
15c6c1daeSBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/bagimpl.h>     /*I  "petscbag.h"   I*/
3665c2dedSJed Brown #include <petscviewer.h>
45c6c1daeSBarry Smith 
55c6c1daeSBarry Smith /*
65c6c1daeSBarry Smith       Adds item to the linked list in a bag
75c6c1daeSBarry Smith */
85c6c1daeSBarry Smith static PetscErrorCode PetscBagRegister_Private(PetscBag bag,PetscBagItem item,const char *name,const char *help)
95c6c1daeSBarry Smith {
105c6c1daeSBarry Smith   PetscErrorCode ierr;
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith   PetscFunctionBegin;
135c6c1daeSBarry Smith   ierr = PetscStrncpy(item->name,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
145c6c1daeSBarry Smith   ierr = PetscStrncpy(item->help,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr);
155c6c1daeSBarry Smith   if (!bag->bagitems) bag->bagitems = item;
165c6c1daeSBarry Smith   else {
175c6c1daeSBarry Smith     PetscBagItem nitem = bag->bagitems;
185c6c1daeSBarry Smith     while (nitem->next) {
195c6c1daeSBarry Smith       nitem = nitem->next;
205c6c1daeSBarry Smith     }
215c6c1daeSBarry Smith     nitem->next = item;
225c6c1daeSBarry Smith   }
235c6c1daeSBarry Smith   bag->count++;
245c6c1daeSBarry Smith   PetscFunctionReturn(0);
255c6c1daeSBarry Smith }
265c6c1daeSBarry Smith 
275c6c1daeSBarry Smith /*@C
285c6c1daeSBarry Smith    PetscBagRegisterEnum - add an enum value to the bag
295c6c1daeSBarry Smith 
305c6c1daeSBarry Smith    Logically Collective on PetscBag
315c6c1daeSBarry Smith 
325c6c1daeSBarry Smith    Input Parameter:
335c6c1daeSBarry Smith +  bag - the bag of values
345c6c1daeSBarry Smith .  addr - location of enum in struct
355c6c1daeSBarry Smith .  mdefault - the initial value
365c6c1daeSBarry Smith .  list - array of strings containing names of enum values followed by enum name followed by enum prefix
375c6c1daeSBarry Smith -  help - longer string with more information about the value
385c6c1daeSBarry Smith 
395c6c1daeSBarry Smith    Level: beginner
405c6c1daeSBarry Smith 
415c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
425c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
435c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName()
445c6c1daeSBarry Smith 
455c6c1daeSBarry Smith @*/
465c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterEnum(PetscBag bag,void *addr,const char *const *list,PetscEnum mdefault, const char *name, const char *help)
475c6c1daeSBarry Smith {
485c6c1daeSBarry Smith   PetscErrorCode ierr;
495c6c1daeSBarry Smith   PetscBagItem   item;
505c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
515c6c1daeSBarry Smith   PetscBool      printhelp;
525c6c1daeSBarry Smith   PetscInt       i = 0;
535c6c1daeSBarry Smith 
545c6c1daeSBarry Smith   PetscFunctionBegin;
555c6c1daeSBarry Smith   nname[0] = '-';
565c6c1daeSBarry Smith   nname[1] = 0;
57a126751eSBarry Smith   ierr     = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr);
582d747510SLisandro Dalcin   ierr     = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr);
595c6c1daeSBarry Smith   if (printhelp) {
605c6c1daeSBarry Smith     while (list[i++]) ;
615c6c1daeSBarry 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);
625c6c1daeSBarry Smith     for (i=0; list[i+2]; i++) {
635c6c1daeSBarry Smith       ierr = (*PetscHelpPrintf)(bag->bagcomm," %s",list[i]);CHKERRQ(ierr);
645c6c1daeSBarry Smith     }
655c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"\n");CHKERRQ(ierr);
665c6c1daeSBarry Smith   }
67c5929fdfSBarry Smith   ierr = PetscOptionsGetEnum(NULL,bag->bagprefix,nname,list,&mdefault,NULL);CHKERRQ(ierr);
685c6c1daeSBarry Smith 
69b00a9115SJed Brown   ierr         = PetscNew(&item);CHKERRQ(ierr);
705c6c1daeSBarry Smith   item->dtype  = PETSC_ENUM;
715c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
725c6c1daeSBarry 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);
7302c9f0b5SLisandro Dalcin   item->next        = NULL;
745c6c1daeSBarry Smith   item->msize       = 1;
755c6c1daeSBarry Smith   ierr              = PetscStrArrayallocpy(list,(char***)&item->list);CHKERRQ(ierr);
765c6c1daeSBarry Smith   *(PetscEnum*)addr = mdefault;
775c6c1daeSBarry Smith   ierr              = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
785c6c1daeSBarry Smith   PetscFunctionReturn(0);
795c6c1daeSBarry Smith }
805c6c1daeSBarry Smith 
815c6c1daeSBarry Smith /*@C
825c6c1daeSBarry Smith    PetscBagRegisterIntArray - add an integer value to the bag
835c6c1daeSBarry Smith 
845c6c1daeSBarry Smith    Logically Collective on PetscBag
855c6c1daeSBarry Smith 
865c6c1daeSBarry Smith    Input Parameter:
875c6c1daeSBarry Smith +  bag - the bag of values
885c6c1daeSBarry Smith .  addr - location of integer in struct
895c6c1daeSBarry Smith .  msize - number of entries in array
905c6c1daeSBarry Smith .  name - name of the integer array
915c6c1daeSBarry Smith -  help - longer string with more information about the value
925c6c1daeSBarry Smith 
935c6c1daeSBarry Smith    Level: beginner
945c6c1daeSBarry Smith 
955c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
965c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
975c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
985c6c1daeSBarry Smith 
995c6c1daeSBarry Smith @*/
1005c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterIntArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help)
1015c6c1daeSBarry Smith {
1025c6c1daeSBarry Smith   PetscErrorCode ierr;
1035c6c1daeSBarry Smith   PetscBagItem   item;
1045c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
1055c6c1daeSBarry Smith   PetscBool      printhelp;
1065c6c1daeSBarry Smith   PetscInt       i,tmp = msize;
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith   PetscFunctionBegin;
1095c6c1daeSBarry Smith   nname[0] = '-';
1105c6c1daeSBarry Smith   nname[1] = 0;
111a126751eSBarry Smith   ierr     = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr);
1122d747510SLisandro Dalcin   ierr     = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr);
1135c6c1daeSBarry Smith   if (printhelp) {
1145c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <",bag->bagprefix ? bag->bagprefix : "",name);CHKERRQ(ierr);
1155c6c1daeSBarry Smith     for (i=0; i<msize; i++) {
1165c6c1daeSBarry Smith       ierr = (*PetscHelpPrintf)(bag->bagcomm,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr);
1175c6c1daeSBarry Smith     }
1185c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr);
1195c6c1daeSBarry Smith   }
120c5929fdfSBarry Smith   ierr = PetscOptionsGetIntArray(NULL,bag->bagprefix,nname,(PetscInt*)addr,&tmp,NULL);CHKERRQ(ierr);
1215c6c1daeSBarry Smith 
122b00a9115SJed Brown   ierr         = PetscNew(&item);CHKERRQ(ierr);
1235c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
1245c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
1255c6c1daeSBarry 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);
12602c9f0b5SLisandro Dalcin   item->next  = NULL;
1275c6c1daeSBarry Smith   item->msize = msize;
1285c6c1daeSBarry Smith   ierr        = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
1295c6c1daeSBarry Smith   PetscFunctionReturn(0);
1305c6c1daeSBarry Smith }
1315c6c1daeSBarry Smith 
1325c6c1daeSBarry Smith /*@C
1335c6c1daeSBarry Smith    PetscBagRegisterRealArray - add an real array to the bag
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith    Logically Collective on PetscBag
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith    Input Parameter:
1385c6c1daeSBarry Smith +  bag - the bag of values
1395c6c1daeSBarry Smith .  addr - location of real array in struct
1405c6c1daeSBarry Smith .  msize - number of entries in array
1415c6c1daeSBarry Smith .  name - name of the integer array
1425c6c1daeSBarry Smith -  help - longer string with more information about the value
1435c6c1daeSBarry Smith 
1445c6c1daeSBarry Smith    Level: beginner
1455c6c1daeSBarry Smith 
1465c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
1475c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
1485c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith @*/
1515c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterRealArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help)
1525c6c1daeSBarry Smith {
1535c6c1daeSBarry Smith   PetscErrorCode ierr;
1545c6c1daeSBarry Smith   PetscBagItem   item;
1555c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
1565c6c1daeSBarry Smith   PetscBool      printhelp;
1575c6c1daeSBarry Smith   PetscInt       i,tmp = msize;
1585c6c1daeSBarry Smith 
1595c6c1daeSBarry Smith   PetscFunctionBegin;
1605c6c1daeSBarry Smith   nname[0] = '-';
1615c6c1daeSBarry Smith   nname[1] = 0;
162a126751eSBarry Smith   ierr     = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr);
1632d747510SLisandro Dalcin   ierr     = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr);
1645c6c1daeSBarry Smith   if (printhelp) {
1655c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <",bag->bagprefix ? bag->bagprefix : "",name);CHKERRQ(ierr);
1665c6c1daeSBarry Smith     for (i=0; i<msize; i++) {
16757622a8eSBarry Smith       ierr = (*PetscHelpPrintf)(bag->bagcomm,"%g ",(double)*((PetscReal*)addr)+i);CHKERRQ(ierr);
1685c6c1daeSBarry Smith     }
1695c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr);
1705c6c1daeSBarry Smith   }
171c5929fdfSBarry Smith   ierr = PetscOptionsGetRealArray(NULL,bag->bagprefix,nname,(PetscReal*)addr,&tmp,NULL);CHKERRQ(ierr);
1725c6c1daeSBarry Smith 
173b00a9115SJed Brown   ierr         = PetscNew(&item);CHKERRQ(ierr);
1745c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
1755c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
1765c6c1daeSBarry 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);
17702c9f0b5SLisandro Dalcin   item->next  = NULL;
1785c6c1daeSBarry Smith   item->msize = msize;
1795c6c1daeSBarry Smith   ierr        = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
1805c6c1daeSBarry Smith   PetscFunctionReturn(0);
1815c6c1daeSBarry Smith }
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith /*@C
1845c6c1daeSBarry Smith    PetscBagRegisterInt - add an integer value to the bag
1855c6c1daeSBarry Smith 
1865c6c1daeSBarry Smith    Logically Collective on PetscBag
1875c6c1daeSBarry Smith 
1885c6c1daeSBarry Smith    Input Parameter:
1895c6c1daeSBarry Smith +  bag - the bag of values
1905c6c1daeSBarry Smith .  addr - location of integer in struct
1915c6c1daeSBarry Smith .  mdefault - the initial value
1925c6c1daeSBarry Smith .  name - name of the integer
1935c6c1daeSBarry Smith -  help - longer string with more information about the value
1945c6c1daeSBarry Smith 
1955c6c1daeSBarry Smith    Level: beginner
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
198bafee8b4SSatish Balay            PetscBagRegisterInt64(), PetscBagRegisterBool(), PetscBagRegisterScalar()
1995c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
2005c6c1daeSBarry Smith 
2015c6c1daeSBarry Smith @*/
2025c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterInt(PetscBag bag,void *addr,PetscInt mdefault,const char *name,const char *help)
2035c6c1daeSBarry Smith {
2045c6c1daeSBarry Smith   PetscErrorCode ierr;
2055c6c1daeSBarry Smith   PetscBagItem   item;
2065c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
2075c6c1daeSBarry Smith   PetscBool      printhelp;
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith   PetscFunctionBegin;
2105c6c1daeSBarry Smith   nname[0] = '-';
2115c6c1daeSBarry Smith   nname[1] = 0;
212a126751eSBarry Smith   ierr     = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr);
2132d747510SLisandro Dalcin   ierr     = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr);
2145c6c1daeSBarry Smith   if (printhelp) {
2155c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%d>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr);
2165c6c1daeSBarry Smith   }
217c5929fdfSBarry Smith   ierr = PetscOptionsGetInt(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr);
2185c6c1daeSBarry Smith 
219b00a9115SJed Brown   ierr         = PetscNew(&item);CHKERRQ(ierr);
2205c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
2215c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
2225c6c1daeSBarry 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);
22302c9f0b5SLisandro Dalcin   item->next       = NULL;
2245c6c1daeSBarry Smith   item->msize      = 1;
2255c6c1daeSBarry Smith   *(PetscInt*)addr = mdefault;
2265c6c1daeSBarry Smith   ierr             = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
2275c6c1daeSBarry Smith   PetscFunctionReturn(0);
2285c6c1daeSBarry Smith }
2295c6c1daeSBarry Smith 
2300d349d43SBarry Smith /*@C
231bafee8b4SSatish Balay    PetscBagRegisterInt64 - add an integer value to the bag
2320d349d43SBarry Smith 
2330d349d43SBarry Smith    Logically Collective on PetscBag
2340d349d43SBarry Smith 
2350d349d43SBarry Smith    Input Parameter:
2360d349d43SBarry Smith +  bag - the bag of values
2370d349d43SBarry Smith .  addr - location of integer in struct
2380d349d43SBarry Smith .  mdefault - the initial value
2390d349d43SBarry Smith .  name - name of the integer
2400d349d43SBarry Smith -  help - longer string with more information about the value
2410d349d43SBarry Smith 
2420d349d43SBarry Smith    Level: beginner
2430d349d43SBarry Smith 
2440d349d43SBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
2450d349d43SBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
2460d349d43SBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
2470d349d43SBarry Smith 
2480d349d43SBarry Smith @*/
249bafee8b4SSatish Balay PetscErrorCode PetscBagRegisterInt64(PetscBag bag,void *addr,PetscInt64 mdefault,const char *name,const char *help)
2500d349d43SBarry Smith {
2510d349d43SBarry Smith   PetscErrorCode ierr;
2520d349d43SBarry Smith   PetscBagItem   item;
2530d349d43SBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
2540d349d43SBarry Smith   PetscBool      printhelp;
2550d349d43SBarry Smith   PetscInt       odefault = (PetscInt)mdefault;
2560d349d43SBarry Smith   PetscBool      flg;
2570d349d43SBarry Smith 
2580d349d43SBarry Smith   PetscFunctionBegin;
2590d349d43SBarry Smith   nname[0] = '-';
2600d349d43SBarry Smith   nname[1] = 0;
261a126751eSBarry Smith   ierr     = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr);
2622d747510SLisandro Dalcin   ierr     = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr);
2630d349d43SBarry Smith   if (printhelp) {
2640d349d43SBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%d>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,odefault,help);CHKERRQ(ierr);
2650d349d43SBarry Smith   }
266c5929fdfSBarry Smith   ierr = PetscOptionsGetInt(NULL,bag->bagprefix,nname,&odefault,&flg);CHKERRQ(ierr);
267bafee8b4SSatish Balay   if (flg) mdefault = (PetscInt64)odefault;
2680d349d43SBarry Smith 
2690d349d43SBarry Smith   ierr         = PetscNew(&item);CHKERRQ(ierr);
2700d349d43SBarry Smith   item->dtype  = PETSC_INT;
2710d349d43SBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
2720d349d43SBarry 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);
27302c9f0b5SLisandro Dalcin   item->next       = NULL;
2740d349d43SBarry Smith   item->msize      = 1;
275bafee8b4SSatish Balay   *(PetscInt64*)addr = mdefault;
2760d349d43SBarry Smith   ierr             = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
2770d349d43SBarry Smith   PetscFunctionReturn(0);
2780d349d43SBarry Smith }
2790d349d43SBarry Smith 
280dd66f111SBlaise Bourdin /*@C
281dd66f111SBlaise Bourdin    PetscBagRegisterBoolArray - add a n logical values to the bag
282dd66f111SBlaise Bourdin 
283dd66f111SBlaise Bourdin    Logically Collective on PetscBag
284dd66f111SBlaise Bourdin 
285dd66f111SBlaise Bourdin    Input Parameter:
286dd66f111SBlaise Bourdin +  bag - the bag of values
287dd66f111SBlaise Bourdin .  addr - location of boolean array in struct
288dd66f111SBlaise Bourdin .  msize - number of entries in array
289dd66f111SBlaise Bourdin .  name - name of the boolean array
290dd66f111SBlaise Bourdin -  help - longer string with more information about the value
291dd66f111SBlaise Bourdin 
292dd66f111SBlaise Bourdin    Level: beginner
293dd66f111SBlaise Bourdin 
294dd66f111SBlaise Bourdin .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
295dd66f111SBlaise Bourdin            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
296dd66f111SBlaise Bourdin            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
297dd66f111SBlaise Bourdin 
298dd66f111SBlaise Bourdin @*/
299dd66f111SBlaise Bourdin PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag,void *addr,PetscInt msize, const char* name, const char* help)
300dd66f111SBlaise Bourdin {
301dd66f111SBlaise Bourdin   PetscErrorCode ierr;
302dd66f111SBlaise Bourdin   PetscBagItem   item;
303dd66f111SBlaise Bourdin   char           nname[PETSC_BAG_NAME_LENGTH+1];
304dd66f111SBlaise Bourdin   PetscBool      printhelp;
305dd66f111SBlaise Bourdin   PetscInt       i,tmp = msize;
306dd66f111SBlaise Bourdin 
307dd66f111SBlaise Bourdin   PetscFunctionBegin;
308dd66f111SBlaise Bourdin   nname[0] = '-';
309dd66f111SBlaise Bourdin   nname[1] = 0;
310a126751eSBarry Smith   ierr     = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr);
3112d747510SLisandro Dalcin   ierr     = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr);
312dd66f111SBlaise Bourdin   if (printhelp) {
313dd66f111SBlaise Bourdin     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <",bag->bagprefix?bag->bagprefix:"",name);CHKERRQ(ierr);
314dd66f111SBlaise Bourdin     for (i=0; i<msize; i++) {
315dd66f111SBlaise Bourdin       ierr = (*PetscHelpPrintf)(bag->bagcomm,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr);
316dd66f111SBlaise Bourdin     }
317dd66f111SBlaise Bourdin     ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr);
318dd66f111SBlaise Bourdin   }
319c5929fdfSBarry Smith   ierr = PetscOptionsGetBoolArray(NULL,bag->bagprefix,nname,(PetscBool*)addr,&tmp,NULL);CHKERRQ(ierr);
320dd66f111SBlaise Bourdin 
321b00a9115SJed Brown   ierr = PetscNew(&item);CHKERRQ(ierr);
322dd66f111SBlaise Bourdin   item->dtype  = PETSC_BOOL;
323dd66f111SBlaise Bourdin   item->offset = ((char*)addr) - ((char*)bag);
324dd66f111SBlaise Bourdin   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);
32502c9f0b5SLisandro Dalcin   item->next   = NULL;
326dd66f111SBlaise Bourdin   item->msize  = msize;
327dd66f111SBlaise Bourdin   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
328dd66f111SBlaise Bourdin   PetscFunctionReturn(0);
329dd66f111SBlaise Bourdin }
330dd66f111SBlaise Bourdin 
3315c6c1daeSBarry Smith /*@C
3325c6c1daeSBarry Smith    PetscBagRegisterString - add a string value to the bag
3335c6c1daeSBarry Smith 
3345c6c1daeSBarry Smith    Logically Collective on PetscBag
3355c6c1daeSBarry Smith 
3365c6c1daeSBarry Smith    Input Parameter:
3375c6c1daeSBarry Smith +  bag - the bag of values
3385c6c1daeSBarry Smith .  addr - location of start of string in struct
3395c6c1daeSBarry Smith .  msize - length of the string space in the struct
3405c6c1daeSBarry Smith .  mdefault - the initial value
3415c6c1daeSBarry Smith .  name - name of the string
3425c6c1daeSBarry Smith -  help - longer string with more information about the value
3435c6c1daeSBarry Smith 
3445c6c1daeSBarry Smith    Level: beginner
3455c6c1daeSBarry Smith 
3465c6c1daeSBarry Smith    Note: The struct should have the field char mystring[msize]; not char *mystring
3475c6c1daeSBarry Smith 
3485c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
3495c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
3505c6c1daeSBarry Smith            PetscBagSetFromOptions(),PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith @*/
3535c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* mdefault,const char* name,const char* help)
3545c6c1daeSBarry Smith {
3555c6c1daeSBarry Smith   PetscErrorCode ierr;
3565c6c1daeSBarry Smith   PetscBagItem   item;
3575c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
3585c6c1daeSBarry Smith   PetscBool      printhelp;
3595c6c1daeSBarry Smith 
3605c6c1daeSBarry Smith   PetscFunctionBegin;
3615c6c1daeSBarry Smith   nname[0] = '-';
3625c6c1daeSBarry Smith   nname[1] = 0;
363a126751eSBarry Smith   ierr     = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr);
3642d747510SLisandro Dalcin   ierr     = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr);
3655c6c1daeSBarry Smith   if (printhelp) {
3665c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr);
3675c6c1daeSBarry Smith   }
3685c6c1daeSBarry Smith 
369b00a9115SJed Brown   ierr         = PetscNew(&item);CHKERRQ(ierr);
3705c6c1daeSBarry Smith   item->dtype  = PETSC_CHAR;
3715c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
3725c6c1daeSBarry 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);
37302c9f0b5SLisandro Dalcin   item->next  = NULL;
3745c6c1daeSBarry Smith   item->msize = msize;
3755c6c1daeSBarry Smith   if (mdefault != (char*)addr) {
3765c6c1daeSBarry Smith     ierr = PetscStrncpy((char*)addr,mdefault,msize-1);CHKERRQ(ierr);
3775c6c1daeSBarry Smith   }
378c5929fdfSBarry Smith   ierr = PetscOptionsGetString(NULL,bag->bagprefix,nname,(char*)addr,msize,NULL);CHKERRQ(ierr);
3795c6c1daeSBarry Smith   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
3805c6c1daeSBarry Smith   PetscFunctionReturn(0);
3815c6c1daeSBarry Smith }
3825c6c1daeSBarry Smith 
3835c6c1daeSBarry Smith /*@C
3845c6c1daeSBarry Smith    PetscBagRegisterReal - add a real value to the bag
3855c6c1daeSBarry Smith 
3865c6c1daeSBarry Smith    Logically Collective on PetscBag
3875c6c1daeSBarry Smith 
3885c6c1daeSBarry Smith    Input Parameter:
3895c6c1daeSBarry Smith +  bag - the bag of values
3905c6c1daeSBarry Smith .  addr - location of double in struct
3915c6c1daeSBarry Smith .  mdefault - the initial value
3925c6c1daeSBarry Smith .  name - name of the variable
3935c6c1daeSBarry Smith -  help - longer string with more information about the value
3945c6c1daeSBarry Smith 
3955c6c1daeSBarry Smith    Level: beginner
3965c6c1daeSBarry Smith 
3975c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
3985c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
3995c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
4005c6c1daeSBarry Smith 
4015c6c1daeSBarry Smith @*/
4025c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterReal(PetscBag bag,void *addr,PetscReal mdefault, const char *name, const char *help)
4035c6c1daeSBarry Smith {
4045c6c1daeSBarry Smith   PetscErrorCode ierr;
4055c6c1daeSBarry Smith   PetscBagItem   item;
4065c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
4075c6c1daeSBarry Smith   PetscBool      printhelp;
4085c6c1daeSBarry Smith 
4095c6c1daeSBarry Smith   PetscFunctionBegin;
4105c6c1daeSBarry Smith   nname[0] = '-';
4115c6c1daeSBarry Smith   nname[1] = 0;
412a126751eSBarry Smith   ierr     = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr);
4132d747510SLisandro Dalcin   ierr     = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr);
4145c6c1daeSBarry Smith   if (printhelp) {
41557622a8eSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%g>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)mdefault,help);CHKERRQ(ierr);
4165c6c1daeSBarry Smith   }
417c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr);
4185c6c1daeSBarry Smith 
419b00a9115SJed Brown   ierr         = PetscNew(&item);CHKERRQ(ierr);
4205c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
4215c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
4225c6c1daeSBarry 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);
42302c9f0b5SLisandro Dalcin   item->next        = NULL;
4245c6c1daeSBarry Smith   item->msize       = 1;
4255c6c1daeSBarry Smith   *(PetscReal*)addr = mdefault;
4265c6c1daeSBarry Smith   ierr              = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
4275c6c1daeSBarry Smith   PetscFunctionReturn(0);
4285c6c1daeSBarry Smith }
4295c6c1daeSBarry Smith 
4305c6c1daeSBarry Smith /*@C
4315c6c1daeSBarry Smith    PetscBagRegisterScalar - add a real or complex number value to the bag
4325c6c1daeSBarry Smith 
4335c6c1daeSBarry Smith    Logically Collective on PetscBag
4345c6c1daeSBarry Smith 
4355c6c1daeSBarry Smith    Input Parameter:
4365c6c1daeSBarry Smith +  bag - the bag of values
4375c6c1daeSBarry Smith .  addr - location of scalar in struct
4385c6c1daeSBarry Smith .  mdefault - the initial value
4395c6c1daeSBarry Smith .  name - name of the variable
4405c6c1daeSBarry Smith -  help - longer string with more information about the value
4415c6c1daeSBarry Smith 
4425c6c1daeSBarry Smith 
4435c6c1daeSBarry Smith    Level: beginner
4445c6c1daeSBarry Smith 
4455c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
4465c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
4475c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
4485c6c1daeSBarry Smith 
4495c6c1daeSBarry Smith @*/
4505c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar mdefault,const char *name,const char *help)
4515c6c1daeSBarry Smith {
4525c6c1daeSBarry Smith   PetscErrorCode ierr;
4535c6c1daeSBarry Smith   PetscBagItem   item;
4545c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
4555c6c1daeSBarry Smith   PetscBool      printhelp;
4565c6c1daeSBarry Smith 
4575c6c1daeSBarry Smith   PetscFunctionBegin;
4585c6c1daeSBarry Smith   nname[0] = '-';
4595c6c1daeSBarry Smith   nname[1] = 0;
460a126751eSBarry Smith   ierr     = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr);
4612d747510SLisandro Dalcin   ierr     = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr);
4625c6c1daeSBarry Smith   if (printhelp) {
46357622a8eSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%g + %gi>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)PetscRealPart(mdefault),(double)PetscImaginaryPart(mdefault),help);CHKERRQ(ierr);
4645c6c1daeSBarry Smith   }
465c5929fdfSBarry Smith   ierr = PetscOptionsGetScalar(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr);
4665c6c1daeSBarry Smith 
467b00a9115SJed Brown   ierr         = PetscNew(&item);CHKERRQ(ierr);
4685c6c1daeSBarry Smith   item->dtype  = PETSC_SCALAR;
4695c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
4705c6c1daeSBarry 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);
47102c9f0b5SLisandro Dalcin   item->next          = NULL;
4725c6c1daeSBarry Smith   item->msize         = 1;
4735c6c1daeSBarry Smith   *(PetscScalar*)addr = mdefault;
4745c6c1daeSBarry Smith   ierr                = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
4755c6c1daeSBarry Smith   PetscFunctionReturn(0);
4765c6c1daeSBarry Smith }
4775c6c1daeSBarry Smith 
4785c6c1daeSBarry Smith /*@C
4795c6c1daeSBarry Smith    PetscBagRegisterBool - add a logical value to the bag
4805c6c1daeSBarry Smith 
4815c6c1daeSBarry Smith    Logically Collective on PetscBag
4825c6c1daeSBarry Smith 
4835c6c1daeSBarry Smith    Input Parameter:
4845c6c1daeSBarry Smith +  bag - the bag of values
4855c6c1daeSBarry Smith .  addr - location of logical in struct
4865c6c1daeSBarry Smith .  mdefault - the initial value
4875c6c1daeSBarry Smith .  name - name of the variable
4885c6c1daeSBarry Smith -  help - longer string with more information about the value
4895c6c1daeSBarry Smith 
4905c6c1daeSBarry Smith 
4915c6c1daeSBarry Smith    Level: beginner
4925c6c1daeSBarry Smith 
4935c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
4945c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
4955c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
4965c6c1daeSBarry Smith 
4975c6c1daeSBarry Smith @*/
4985c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterBool(PetscBag bag,void *addr,PetscBool mdefault,const char *name,const char *help)
4995c6c1daeSBarry Smith {
5005c6c1daeSBarry Smith   PetscErrorCode ierr;
5015c6c1daeSBarry Smith   PetscBagItem   item;
5025c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
5035c6c1daeSBarry Smith   PetscBool      printhelp;
5045c6c1daeSBarry Smith 
5055c6c1daeSBarry Smith   PetscFunctionBegin;
5065c6c1daeSBarry 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 */
5075c6c1daeSBarry 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);
5085c6c1daeSBarry Smith   nname[0] = '-';
5095c6c1daeSBarry Smith   nname[1] = 0;
510a126751eSBarry Smith   ierr     = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr);
5112d747510SLisandro Dalcin   ierr     = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr);
5125c6c1daeSBarry Smith   if (printhelp) {
5135c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,PetscBools[mdefault],help);CHKERRQ(ierr);
5145c6c1daeSBarry Smith   }
515c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr);
5165c6c1daeSBarry Smith 
517b00a9115SJed Brown   ierr         = PetscNew(&item);CHKERRQ(ierr);
5185c6c1daeSBarry Smith   item->dtype  = PETSC_BOOL;
5195c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
5205c6c1daeSBarry 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);
52102c9f0b5SLisandro Dalcin   item->next        = NULL;
5225c6c1daeSBarry Smith   item->msize       = 1;
5235c6c1daeSBarry Smith   *(PetscBool*)addr = mdefault;
5245c6c1daeSBarry Smith   ierr              = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
5255c6c1daeSBarry Smith   PetscFunctionReturn(0);
5265c6c1daeSBarry Smith }
5275c6c1daeSBarry Smith 
5285c6c1daeSBarry Smith /*@C
5295c6c1daeSBarry Smith    PetscBagDestroy - Destroys a bag values
5305c6c1daeSBarry Smith 
5315c6c1daeSBarry Smith    Collective on PetscBag
5325c6c1daeSBarry Smith 
5335c6c1daeSBarry Smith    Input Parameter:
5345c6c1daeSBarry Smith .  bag - the bag of values
5355c6c1daeSBarry Smith 
5365c6c1daeSBarry Smith    Level: beginner
5375c6c1daeSBarry Smith 
5385c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
5395c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
5405c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
5415c6c1daeSBarry Smith 
5425c6c1daeSBarry Smith @*/
5435c6c1daeSBarry Smith PetscErrorCode  PetscBagDestroy(PetscBag *bag)
5445c6c1daeSBarry Smith {
5455c6c1daeSBarry Smith   PetscErrorCode ierr;
5465c6c1daeSBarry Smith   PetscBagItem   nitem = (*bag)->bagitems,item;
5475c6c1daeSBarry Smith 
5485c6c1daeSBarry Smith   PetscFunctionBegin;
5495c6c1daeSBarry Smith   while (nitem) {
5505c6c1daeSBarry Smith     item = nitem->next;
5515c6c1daeSBarry Smith     if (nitem->list) {
5525c6c1daeSBarry Smith       ierr = PetscStrArrayDestroy(&nitem->list);CHKERRQ(ierr);
5535c6c1daeSBarry Smith     }
5545c6c1daeSBarry Smith     ierr  = PetscFree(nitem);CHKERRQ(ierr);
5555c6c1daeSBarry Smith     nitem = item;
5565c6c1daeSBarry Smith   }
5575c6c1daeSBarry Smith   if ((*bag)->bagprefix) { ierr = PetscFree((*bag)->bagprefix);CHKERRQ(ierr); }
5585c6c1daeSBarry Smith   ierr = PetscFree(*bag);CHKERRQ(ierr);
5595c6c1daeSBarry Smith   PetscFunctionReturn(0);
5605c6c1daeSBarry Smith }
5615c6c1daeSBarry Smith 
5625c6c1daeSBarry Smith /*@
5635c6c1daeSBarry Smith    PetscBagSetFromOptions - Allows setting options from a bag
5645c6c1daeSBarry Smith 
5655c6c1daeSBarry Smith    Collective on PetscBag
5665c6c1daeSBarry Smith 
5675c6c1daeSBarry Smith    Input Parameter:
5685c6c1daeSBarry Smith .  bag - the bag of values
5695c6c1daeSBarry Smith 
5705c6c1daeSBarry Smith    Level: beginner
5715c6c1daeSBarry Smith 
5725c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData()
5735c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
5745c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagView(), PetscBagRegisterEnum()
5755c6c1daeSBarry Smith 
5765c6c1daeSBarry Smith @*/
5775c6c1daeSBarry Smith PetscErrorCode  PetscBagSetFromOptions(PetscBag bag)
5785c6c1daeSBarry Smith {
5795c6c1daeSBarry Smith   PetscErrorCode ierr;
5805c6c1daeSBarry Smith   PetscBagItem   nitem = bag->bagitems;
5815c6c1daeSBarry Smith   char           name[PETSC_BAG_NAME_LENGTH+1],helpname[PETSC_BAG_NAME_LENGTH+PETSC_BAG_HELP_LENGTH+3];
5825c6c1daeSBarry Smith   PetscInt       n;
5835c6c1daeSBarry Smith 
5845c6c1daeSBarry Smith   PetscFunctionBegin;
585a126751eSBarry Smith   ierr = PetscStrncpy(helpname,bag->bagname,sizeof(helpname));CHKERRQ(ierr);
586a126751eSBarry Smith   ierr = PetscStrlcat(helpname," ",sizeof(helpname));CHKERRQ(ierr);
587a126751eSBarry Smith   ierr = PetscStrlcat(helpname,bag->baghelp,sizeof(helpname));CHKERRQ(ierr);
58802c9f0b5SLisandro Dalcin   ierr = PetscOptionsBegin(bag->bagcomm,bag->bagprefix,helpname,NULL);CHKERRQ(ierr);
5895c6c1daeSBarry Smith   while (nitem) {
5905c6c1daeSBarry Smith     name[0] = '-';
5915c6c1daeSBarry Smith     name[1] = 0;
592a126751eSBarry Smith     ierr    = PetscStrlcat(name,nitem->name,sizeof(name));CHKERRQ(ierr);
5935c6c1daeSBarry Smith     if (nitem->dtype == PETSC_CHAR) {   /* special handling for fortran required? [due to space padding vs null termination] */
5945c6c1daeSBarry Smith       char *value = (char*)(((char*)bag) + nitem->offset);
5950298fd71SBarry Smith       ierr = PetscOptionsString(name,nitem->help,"",value,value,nitem->msize,NULL);CHKERRQ(ierr);
5965c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_REAL) {
5975c6c1daeSBarry Smith       PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset);
5985c6c1daeSBarry Smith       if (nitem->msize == 1) {
5990298fd71SBarry Smith         ierr = PetscOptionsReal(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr);
6005c6c1daeSBarry Smith       } else {
6015c6c1daeSBarry Smith         n    = nitem->msize;
6020298fd71SBarry Smith         ierr = PetscOptionsRealArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr);
6035c6c1daeSBarry Smith       }
6045c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_SCALAR) {
6055c6c1daeSBarry Smith       PetscScalar *value = (PetscScalar*)(((char*)bag) + nitem->offset);
6060298fd71SBarry Smith       ierr = PetscOptionsScalar(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr);
6075c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_INT) {
6085c6c1daeSBarry Smith       PetscInt *value = (PetscInt*)(((char*)bag) + nitem->offset);
6095c6c1daeSBarry Smith       if (nitem->msize == 1) {
6100298fd71SBarry Smith         ierr = PetscOptionsInt(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr);
6115c6c1daeSBarry Smith       } else {
6125c6c1daeSBarry Smith         n    = nitem->msize;
6130298fd71SBarry Smith         ierr = PetscOptionsIntArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr);
6145c6c1daeSBarry Smith       }
6155c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_ENUM) {
6165c6c1daeSBarry Smith       PetscEnum *value = (PetscEnum*)(((char*)bag) + nitem->offset);
6175c6c1daeSBarry Smith       PetscInt  i      = 0;
6185c6c1daeSBarry Smith       while (nitem->list[i++]) ;
6190298fd71SBarry Smith       ierr = PetscOptionsEnum(name,nitem->help,nitem->list[i-3],(const char*const*)nitem->list,*value,value,NULL);CHKERRQ(ierr);
6205c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_BOOL) {
6215c6c1daeSBarry Smith       PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset);
622dd66f111SBlaise Bourdin       if (nitem->msize == 1) {
6230298fd71SBarry Smith         ierr = PetscOptionsBool(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr);
624dd66f111SBlaise Bourdin       } else {
625dd66f111SBlaise Bourdin         n = nitem->msize;
626dd66f111SBlaise Bourdin         ierr = PetscOptionsBoolArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr);
627dd66f111SBlaise Bourdin       }
6285c6c1daeSBarry Smith     }
6295c6c1daeSBarry Smith     nitem = nitem->next;
6305c6c1daeSBarry Smith   }
6315c6c1daeSBarry Smith   PetscOptionsEnd();
6325c6c1daeSBarry Smith   PetscFunctionReturn(0);
6335c6c1daeSBarry Smith }
6345c6c1daeSBarry Smith 
6355c6c1daeSBarry Smith /*@C
6365c6c1daeSBarry Smith    PetscBagView - Views a bag of values as either ASCII text or a binary file
6375c6c1daeSBarry Smith 
6385c6c1daeSBarry Smith    Collective on PetscBag
6395c6c1daeSBarry Smith 
6405c6c1daeSBarry Smith    Input Parameter:
6415c6c1daeSBarry Smith +  bag - the bag of values
6425c6c1daeSBarry Smith -  viewer - location to view the values
6435c6c1daeSBarry Smith 
6445c6c1daeSBarry Smith    Level: beginner
6455c6c1daeSBarry Smith 
6465c6c1daeSBarry Smith    Warning: Currently PETSc bags saved in a binary file can only be read back
6475c6c1daeSBarry Smith      in on a machine of the same architecture. Let us know when this is a problem
6485c6c1daeSBarry Smith      and we'll fix it.
6495c6c1daeSBarry Smith 
6505c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData()
6515c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum()
6525c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName()
6535c6c1daeSBarry Smith 
6545c6c1daeSBarry Smith @*/
6555c6c1daeSBarry Smith PetscErrorCode  PetscBagView(PetscBag bag,PetscViewer view)
6565c6c1daeSBarry Smith {
6575c6c1daeSBarry Smith   PetscBool      isascii,isbinary;
6585c6c1daeSBarry Smith   PetscErrorCode ierr;
6595c6c1daeSBarry Smith   PetscBagItem   nitem = bag->bagitems;
6605c6c1daeSBarry Smith 
6615c6c1daeSBarry Smith   PetscFunctionBegin;
6625c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
6635c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
6645c6c1daeSBarry Smith   if (isascii) {
6653ffde785SBarry Smith     if (bag->bagprefix) {
6663ffde785SBarry Smith       ierr = PetscViewerASCIIPrintf(view,"PetscBag Object:  %s (%s) %s\n",bag->bagname,bag->bagprefix,bag->baghelp);CHKERRQ(ierr);
6673ffde785SBarry Smith     } else {
6685c6c1daeSBarry Smith       ierr = PetscViewerASCIIPrintf(view,"PetscBag Object:  %s %s\n",bag->bagname,bag->baghelp);CHKERRQ(ierr);
6693ffde785SBarry Smith     }
6705c6c1daeSBarry Smith     while (nitem) {
6715c6c1daeSBarry Smith       if (nitem->dtype == PETSC_CHAR) {
6725c6c1daeSBarry Smith         char *value = (char*)(((char*)bag) + nitem->offset);
6735c6c1daeSBarry Smith         char tmp    = value[nitem->msize-1]; /* special handling for fortran chars wihout null terminator */
6745c6c1daeSBarry Smith         value[nitem->msize-1] =0;
6755c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %s; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr);
6765c6c1daeSBarry Smith         value[nitem->msize-1] = tmp;
6775c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_REAL) {
6785c6c1daeSBarry Smith         PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset);
6795c6c1daeSBarry Smith         PetscInt  i;
6805c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = ",nitem->name);CHKERRQ(ierr);
6815c6c1daeSBarry Smith         for (i=0; i<nitem->msize; i++) {
68257622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(view,"%g ",(double)value[i]);CHKERRQ(ierr);
6835c6c1daeSBarry Smith         }
6845c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr);
6855c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_SCALAR) {
6865c6c1daeSBarry Smith         PetscScalar value = *(PetscScalar*)(((char*)bag) + nitem->offset);
6875c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
6888627564fSBarry Smith         if ((double)PetscImaginaryPart(value)) {
68957622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(view,"  %s = %g + %gi; %s\n",nitem->name,(double)PetscRealPart(value),(double)PetscImaginaryPart(value),nitem->help);CHKERRQ(ierr);
6908627564fSBarry Smith         } else {
6918627564fSBarry Smith           ierr = PetscViewerASCIIPrintf(view,"  %s = %g; %s\n",nitem->name,(double)PetscRealPart(value),nitem->help);CHKERRQ(ierr);
6928627564fSBarry Smith         }
6935c6c1daeSBarry Smith #else
69457622a8eSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %g; %s\n",nitem->name,(double)value,nitem->help);CHKERRQ(ierr);
6955c6c1daeSBarry Smith #endif
6965c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_INT) {
6975c6c1daeSBarry Smith         PetscInt i,*value = (PetscInt*)(((char*)bag) + nitem->offset);
6985c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = ",nitem->name);CHKERRQ(ierr);
6995c6c1daeSBarry Smith         for (i=0; i<nitem->msize; i++) {
7005c6c1daeSBarry Smith           ierr = PetscViewerASCIIPrintf(view,"%D ",value[i]);CHKERRQ(ierr);
7015c6c1daeSBarry Smith         }
7025c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr);
7035c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_BOOL) {
704dd66f111SBlaise Bourdin         PetscBool  *value = (PetscBool*)(((char*)bag) + nitem->offset);
705dd66f111SBlaise Bourdin         PetscInt  i;
7065c6c1daeSBarry Smith          /* some Fortran compilers use -1 as boolean */
707dd66f111SBlaise Bourdin         ierr = PetscViewerASCIIPrintf(view,"  %s = ",nitem->name);CHKERRQ(ierr);
708dd66f111SBlaise Bourdin         for (i=0; i<nitem->msize; i++) {
709dd66f111SBlaise Bourdin           if (((int) value[i]) == -1) value[i] = PETSC_TRUE;
7105c6c1daeSBarry 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 */
711dd66f111SBlaise Bourdin           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);
712dd66f111SBlaise Bourdin           ierr = PetscViewerASCIIPrintf(view," %s",PetscBools[value[i]]);CHKERRQ(ierr);
713dd66f111SBlaise Bourdin         }
714dd66f111SBlaise Bourdin         ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr);
7155c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_ENUM) {
7165c6c1daeSBarry Smith         PetscEnum value = *(PetscEnum*)(((char*)bag) + nitem->offset);
7175c6c1daeSBarry Smith         PetscInt  i     = 0;
7185c6c1daeSBarry Smith         while (nitem->list[i++]) ;
7195c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %s; (%s) %s\n",nitem->name,nitem->list[value],nitem->list[i-3],nitem->help);CHKERRQ(ierr);
7205c6c1daeSBarry Smith       }
7215c6c1daeSBarry Smith       nitem = nitem->next;
7225c6c1daeSBarry Smith     }
7235c6c1daeSBarry Smith   } else if (isbinary) {
7245c6c1daeSBarry Smith     PetscInt          classid           = PETSC_BAG_FILE_CLASSID, dtype;
7255c6c1daeSBarry Smith     PetscInt          deprecatedbagsize = 0;
726a261c58fSBarry Smith     PetscViewerFormat format;
727f253e43cSLisandro Dalcin     ierr = PetscViewerBinaryWrite(view,&classid,1,PETSC_INT);CHKERRQ(ierr);
728f253e43cSLisandro Dalcin     ierr = PetscViewerBinaryWrite(view,&deprecatedbagsize,1,PETSC_INT);CHKERRQ(ierr);
729f253e43cSLisandro Dalcin     ierr = PetscViewerBinaryWrite(view,&bag->count,1,PETSC_INT);CHKERRQ(ierr);
730f253e43cSLisandro Dalcin     ierr = PetscViewerBinaryWrite(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
731f253e43cSLisandro Dalcin     ierr = PetscViewerBinaryWrite(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
7325c6c1daeSBarry Smith     while (nitem) {
733f253e43cSLisandro Dalcin       ierr  = PetscViewerBinaryWrite(view,&nitem->offset,1,PETSC_INT);CHKERRQ(ierr);
7345c6c1daeSBarry Smith       dtype = (PetscInt)nitem->dtype;
735f253e43cSLisandro Dalcin       ierr  = PetscViewerBinaryWrite(view,&dtype,1,PETSC_INT);CHKERRQ(ierr);
736f253e43cSLisandro Dalcin       ierr  = PetscViewerBinaryWrite(view,nitem->name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
737f253e43cSLisandro Dalcin       ierr  = PetscViewerBinaryWrite(view,nitem->help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
738f253e43cSLisandro Dalcin       ierr  = PetscViewerBinaryWrite(view,&nitem->msize,1,PETSC_INT);CHKERRQ(ierr);
7395c6c1daeSBarry Smith       /* some Fortran compilers use -1 as boolean */
7405c6c1daeSBarry Smith       if (dtype == PETSC_BOOL && ((*(int*) (((char*)bag) + nitem->offset) == -1))) *(int*) (((char*)bag) + nitem->offset) = PETSC_TRUE;
7415c6c1daeSBarry Smith 
742f253e43cSLisandro Dalcin       ierr = PetscViewerBinaryWrite(view,(((char*)bag) + nitem->offset),nitem->msize,nitem->dtype);CHKERRQ(ierr);
7435c6c1daeSBarry Smith       if (dtype == PETSC_ENUM) {
744196bbcbdSSatish Balay         ierr = PetscViewerBinaryWriteStringArray(view,(const char* const*)nitem->list);CHKERRQ(ierr);
7455c6c1daeSBarry Smith       }
7465c6c1daeSBarry Smith       nitem = nitem->next;
7475c6c1daeSBarry Smith     }
748a261c58fSBarry Smith     ierr = PetscViewerGetFormat(view,&format);CHKERRQ(ierr);
749a261c58fSBarry Smith     if (format == PETSC_VIEWER_BINARY_MATLAB) {
750a261c58fSBarry Smith       MPI_Comm comm;
751a261c58fSBarry Smith       FILE     *info;
752a261c58fSBarry Smith       ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr);
753a261c58fSBarry Smith       ierr = PetscViewerBinaryGetInfoPointer(view,&info);CHKERRQ(ierr);
754da88d4d4SJed Brown       ierr = PetscFPrintf(comm,info,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n");CHKERRQ(ierr);
755da88d4d4SJed Brown       ierr = PetscFPrintf(comm,info,"#$$ Set.%s = PetscBinaryRead(fd);\n",bag->bagname);CHKERRQ(ierr);
756da88d4d4SJed Brown       ierr = PetscFPrintf(comm,info,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n");CHKERRQ(ierr);
757a261c58fSBarry Smith     }
758a261c58fSBarry Smith   }
7595c6c1daeSBarry Smith   PetscFunctionReturn(0);
7605c6c1daeSBarry Smith }
7615c6c1daeSBarry Smith 
7625c6c1daeSBarry Smith /*@C
763173f9484SMatthew G. Knepley   PetscBagViewFromOptions - Processes command line options to determine if/how a PetscBag is to be viewed.
764173f9484SMatthew G. Knepley 
765173f9484SMatthew G. Knepley   Collective on PetscBag
766173f9484SMatthew G. Knepley 
767173f9484SMatthew G. Knepley   Input Parameters:
768173f9484SMatthew G. Knepley + obj   - the object
769173f9484SMatthew G. Knepley . bobj  - optional other object that provides prefix (if NULL then the prefix in obj is used)
770173f9484SMatthew G. Knepley - optionname - option to activate viewing
771*478db826SMatthew G. Knepley 
772173f9484SMatthew G. Knepley   Level: intermediate
773*478db826SMatthew G. Knepley 
774*478db826SMatthew G. Knepley .seealso: PetscBagCreate(), PetscBag, PetscViewer
775173f9484SMatthew G. Knepley @*/
776173f9484SMatthew G. Knepley PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[])
777173f9484SMatthew G. Knepley {
778173f9484SMatthew G. Knepley   static PetscBool  incall = PETSC_FALSE;
779173f9484SMatthew G. Knepley   PetscViewer       viewer;
780173f9484SMatthew G. Knepley   PetscViewerFormat format;
781173f9484SMatthew G. Knepley   const char       *prefix, *bprefix = NULL;
782173f9484SMatthew G. Knepley   PetscBool         flg;
783173f9484SMatthew G. Knepley   PetscErrorCode    ierr;
784173f9484SMatthew G. Knepley 
785173f9484SMatthew G. Knepley   PetscFunctionBegin;
786173f9484SMatthew G. Knepley   if (incall) PetscFunctionReturn(0);
787173f9484SMatthew G. Knepley   incall = PETSC_TRUE;
788173f9484SMatthew G. Knepley   if (bobj) {ierr = PetscObjectGetOptionsPrefix(bobj, &bprefix);CHKERRQ(ierr);}
789173f9484SMatthew G. Knepley   prefix = bobj ? bprefix : bag->bagprefix;
790173f9484SMatthew G. Knepley   ierr   = PetscOptionsGetViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg);CHKERRQ(ierr);
791173f9484SMatthew G. Knepley   if (flg) {
792173f9484SMatthew G. Knepley     ierr = PetscViewerPushFormat(viewer, format);CHKERRQ(ierr);
793173f9484SMatthew G. Knepley     ierr = PetscBagView(bag, viewer);CHKERRQ(ierr);
794173f9484SMatthew G. Knepley     ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
795173f9484SMatthew G. Knepley     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
796173f9484SMatthew G. Knepley     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
797173f9484SMatthew G. Knepley   }
798173f9484SMatthew G. Knepley   incall = PETSC_FALSE;
799173f9484SMatthew G. Knepley   PetscFunctionReturn(0);
800173f9484SMatthew G. Knepley }
801173f9484SMatthew G. Knepley 
802173f9484SMatthew G. Knepley /*@C
8035c6c1daeSBarry Smith    PetscBagLoad - Loads a bag of values from a binary file
8045c6c1daeSBarry Smith 
8055c6c1daeSBarry Smith    Collective on PetscViewer
8065c6c1daeSBarry Smith 
8075c6c1daeSBarry Smith    Input Parameter:
8085c6c1daeSBarry Smith +  viewer - file to load values from
8095c6c1daeSBarry Smith -  bag - the bag of values
8105c6c1daeSBarry Smith 
81195452b02SPatrick Sanan    Notes:
81295452b02SPatrick Sanan     You must have created and registered all the fields in the bag before loading into it.
8135c6c1daeSBarry Smith 
8145c6c1daeSBarry Smith    Notes:
8155c6c1daeSBarry Smith    Level: beginner
8165c6c1daeSBarry Smith 
8175c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagView(), PetscBagGetData()
8185c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
8195c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
8205c6c1daeSBarry Smith 
8215c6c1daeSBarry Smith @*/
8225c6c1daeSBarry Smith PetscErrorCode  PetscBagLoad(PetscViewer view,PetscBag bag)
8235c6c1daeSBarry Smith {
8245c6c1daeSBarry Smith   PetscErrorCode ierr;
8255c6c1daeSBarry Smith   PetscBool      isbinary;
826060da220SMatthew G. Knepley   PetscInt       classid,bagcount,i,dtype,msize,offset,deprecatedbagsize;
8275c6c1daeSBarry Smith   char           name[PETSC_BAG_NAME_LENGTH],help[PETSC_BAG_HELP_LENGTH],**list;
8285c6c1daeSBarry Smith   PetscBagItem   nitem;
8295c6c1daeSBarry Smith   MPI_Comm       comm;
8305c6c1daeSBarry Smith   PetscMPIInt    flag;
8315c6c1daeSBarry Smith 
8325c6c1daeSBarry Smith   PetscFunctionBegin;
8335c6c1daeSBarry Smith   ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr);
8345c6c1daeSBarry Smith   ierr = MPI_Comm_compare(comm,bag->bagcomm,&flag);CHKERRQ(ierr);
8355c6c1daeSBarry Smith   if (flag != MPI_CONGRUENT && flag != MPI_IDENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the viewer and bag"); \
8365c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
8375c6c1daeSBarry Smith   if (!isbinary) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type");
8385c6c1daeSBarry Smith 
839060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(view,&classid,1,NULL,PETSC_INT);CHKERRQ(ierr);
8405c6c1daeSBarry Smith   if (classid != PETSC_BAG_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not PetscBag next in binary file");
841060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(view,&deprecatedbagsize,1,NULL,PETSC_INT);CHKERRQ(ierr);
842060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(view,&bagcount,1,NULL,PETSC_INT);CHKERRQ(ierr);
84313903a91SSatish Balay   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);
844060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(view,bag->bagname,PETSC_BAG_NAME_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr);
845060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr);
8465c6c1daeSBarry Smith 
8475c6c1daeSBarry Smith   nitem = bag->bagitems;
8485c6c1daeSBarry Smith   for (i=0; i<bagcount; i++) {
849060da220SMatthew G. Knepley     ierr = PetscViewerBinaryRead(view,&offset,1,NULL,PETSC_INT);CHKERRQ(ierr);
8505c6c1daeSBarry Smith     /* ignore the offset in the file */
851060da220SMatthew G. Knepley     ierr = PetscViewerBinaryRead(view,&dtype,1,NULL,PETSC_INT);CHKERRQ(ierr);
852060da220SMatthew G. Knepley     ierr = PetscViewerBinaryRead(view,name,PETSC_BAG_NAME_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr);
853060da220SMatthew G. Knepley     ierr = PetscViewerBinaryRead(view,help,PETSC_BAG_HELP_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr);
854060da220SMatthew G. Knepley     ierr = PetscViewerBinaryRead(view,&msize,1,NULL,PETSC_INT);CHKERRQ(ierr);
8555c6c1daeSBarry Smith 
8565c6c1daeSBarry Smith     if (dtype == (PetscInt) PETSC_CHAR) {
857060da220SMatthew G. Knepley       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_CHAR);CHKERRQ(ierr);
8585c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_REAL) {
859060da220SMatthew G. Knepley       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_REAL);CHKERRQ(ierr);
8605c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_SCALAR) {
861060da220SMatthew G. Knepley       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,NULL,PETSC_SCALAR);CHKERRQ(ierr);
8625c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_INT) {
863060da220SMatthew G. Knepley       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_INT);CHKERRQ(ierr);
8645c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_BOOL) {
865060da220SMatthew G. Knepley       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_BOOL);CHKERRQ(ierr);
8665c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_ENUM) {
867060da220SMatthew G. Knepley       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
8685c6c1daeSBarry Smith       ierr = PetscViewerBinaryReadStringArray(view,&list);CHKERRQ(ierr);
8695c6c1daeSBarry Smith       /* don't need to save list because it is already registered in the bag */
8705c6c1daeSBarry Smith       ierr = PetscFree(list);CHKERRQ(ierr);
8715c6c1daeSBarry Smith     }
8725c6c1daeSBarry Smith     nitem = nitem->next;
8735c6c1daeSBarry Smith   }
8745c6c1daeSBarry Smith   PetscFunctionReturn(0);
8755c6c1daeSBarry Smith }
8765c6c1daeSBarry Smith 
877e8976759SBarry Smith /*@C
8785c6c1daeSBarry Smith     PetscBagCreate - Create a bag of values
8795c6c1daeSBarry Smith 
880d083f849SBarry Smith   Collective
8815c6c1daeSBarry Smith 
8825c6c1daeSBarry Smith   Level: Intermediate
8835c6c1daeSBarry Smith 
8845c6c1daeSBarry Smith   Input Parameters:
8855c6c1daeSBarry Smith +  comm - communicator to share bag
8865c6c1daeSBarry Smith -  bagsize - size of the C structure holding the values
8875c6c1daeSBarry Smith 
8885c6c1daeSBarry Smith   Output Parameter:
8895c6c1daeSBarry Smith .   bag - the bag of values
8905c6c1daeSBarry Smith 
8915c6c1daeSBarry Smith    Notes:
8925c6c1daeSBarry Smith       The size of the A struct must be small enough to fit in a PetscInt; by default
8935c6c1daeSBarry Smith       PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length.
8945c6c1daeSBarry Smith       The warning about casting to a shorter length can be ignored below unless your A struct is too large
8955c6c1daeSBarry Smith 
8965c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
8975c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
8985c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
8995c6c1daeSBarry Smith @*/
9005c6c1daeSBarry Smith PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag)
9015c6c1daeSBarry Smith {
9025c6c1daeSBarry Smith   PetscErrorCode ierr;
9035c6c1daeSBarry Smith   size_t         totalsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar);
9045c6c1daeSBarry Smith 
9055c6c1daeSBarry Smith   PetscFunctionBegin;
9060298fd71SBarry Smith   ierr = PetscInfo1(NULL,"Creating Bag with total size %d\n",(int)totalsize);CHKERRQ(ierr);
9075c6c1daeSBarry Smith   ierr = PetscMalloc(totalsize,bag);CHKERRQ(ierr);
9085c6c1daeSBarry Smith   ierr = PetscMemzero(*bag,bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar));CHKERRQ(ierr);
909a297a907SKarl Rupp 
9105c6c1daeSBarry Smith   (*bag)->bagsize        = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar);
9115c6c1daeSBarry Smith   (*bag)->bagcomm        = comm;
9120298fd71SBarry Smith   (*bag)->bagprefix      = NULL;
9135c6c1daeSBarry Smith   (*bag)->structlocation = (void*)(((char*)(*bag)) + sizeof(PetscScalar)*(sizeof(struct _n_PetscBag)/sizeof(PetscScalar)) + sizeof(PetscScalar));
9145c6c1daeSBarry Smith   PetscFunctionReturn(0);
9155c6c1daeSBarry Smith }
9165c6c1daeSBarry Smith 
9175c6c1daeSBarry Smith /*@C
9185c6c1daeSBarry Smith     PetscBagSetName - Sets the name of a bag of values
9195c6c1daeSBarry Smith 
9205c6c1daeSBarry Smith   Not Collective
9215c6c1daeSBarry Smith 
9225c6c1daeSBarry Smith   Level: Intermediate
9235c6c1daeSBarry Smith 
9245c6c1daeSBarry Smith   Input Parameters:
9255c6c1daeSBarry Smith +   bag - the bag of values
9265c6c1daeSBarry Smith .   name - the name assigned to the bag
9275c6c1daeSBarry Smith -   help - help message for bag
9285c6c1daeSBarry Smith 
9295c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
9305c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
9315c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
9325c6c1daeSBarry Smith @*/
9335c6c1daeSBarry Smith 
9345c6c1daeSBarry Smith PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help)
9355c6c1daeSBarry Smith {
9365c6c1daeSBarry Smith   PetscErrorCode ierr;
9375fd66863SKarl Rupp 
9385c6c1daeSBarry Smith   PetscFunctionBegin;
9395c6c1daeSBarry Smith   ierr = PetscStrncpy(bag->bagname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
9405c6c1daeSBarry Smith   ierr = PetscStrncpy(bag->baghelp,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr);
9415c6c1daeSBarry Smith   PetscFunctionReturn(0);
9425c6c1daeSBarry Smith }
9435c6c1daeSBarry Smith 
9445c6c1daeSBarry Smith 
9455c6c1daeSBarry Smith /*@C
9465c6c1daeSBarry Smith     PetscBagGetName - Gets the name of a bag of values
9475c6c1daeSBarry Smith 
9485c6c1daeSBarry Smith   Not Collective
9495c6c1daeSBarry Smith 
9505c6c1daeSBarry Smith   Level: Intermediate
9515c6c1daeSBarry Smith 
9525c6c1daeSBarry Smith   Input Parameter:
9535c6c1daeSBarry Smith .   bag - the bag of values
9545c6c1daeSBarry Smith 
9555c6c1daeSBarry Smith   Output Parameter:
9565c6c1daeSBarry Smith .   name - the name assigned to the bag
9575c6c1daeSBarry Smith 
9585c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
9595c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
9605c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
9615c6c1daeSBarry Smith @*/
9625c6c1daeSBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, char **name)
9635c6c1daeSBarry Smith {
9645c6c1daeSBarry Smith   PetscFunctionBegin;
9655c6c1daeSBarry Smith   *name = bag->bagname;
9665c6c1daeSBarry Smith   PetscFunctionReturn(0);
9675c6c1daeSBarry Smith }
9685c6c1daeSBarry Smith 
9695c6c1daeSBarry Smith /*@C
9705c6c1daeSBarry Smith     PetscBagGetData - Gives back the user - access to memory that
9715c6c1daeSBarry Smith     should be used for storing user-data-structure
9725c6c1daeSBarry Smith 
9735c6c1daeSBarry Smith   Not Collective
9745c6c1daeSBarry Smith 
9755c6c1daeSBarry Smith   Level: Intermediate
9765c6c1daeSBarry Smith 
9775c6c1daeSBarry Smith   Input Parameter:
9785c6c1daeSBarry Smith .   bag - the bag of values
9795c6c1daeSBarry Smith 
9805c6c1daeSBarry Smith   Output Parameter:
9815c6c1daeSBarry Smith .   data - pointer to memory that will have user-data-structure
9825c6c1daeSBarry Smith 
9835c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad()
9845c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
9855c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
9865c6c1daeSBarry Smith @*/
9875c6c1daeSBarry Smith PetscErrorCode PetscBagGetData(PetscBag bag, void **data)
9885c6c1daeSBarry Smith {
9895c6c1daeSBarry Smith   PetscFunctionBegin;
9905c6c1daeSBarry Smith   *data = bag->structlocation;
9915c6c1daeSBarry Smith   PetscFunctionReturn(0);
9925c6c1daeSBarry Smith }
9935c6c1daeSBarry Smith 
9945c6c1daeSBarry Smith /*@C
9955c6c1daeSBarry Smith   PetscBagSetOptionsPrefix - Sets the prefix used for searching for all
9965c6c1daeSBarry Smith   PetscBag items in the options database.
9975c6c1daeSBarry Smith 
9985c6c1daeSBarry Smith   Logically collective on Bag.
9995c6c1daeSBarry Smith 
10005c6c1daeSBarry Smith   Level: Intermediate
10015c6c1daeSBarry Smith 
10025c6c1daeSBarry Smith   Input Parameters:
10035c6c1daeSBarry Smith +   bag - the bag of values
10045c6c1daeSBarry Smith -   prefix - the prefix to prepend all Bag item names with.
10055c6c1daeSBarry Smith 
10065c6c1daeSBarry Smith   NOTES: Must be called prior to registering any of the bag items.
10075c6c1daeSBarry Smith 
10085c6c1daeSBarry Smith .seealso: PetscBag, PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
10095c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
10105c6c1daeSBarry Smith @*/
10115c6c1daeSBarry Smith 
10125c6c1daeSBarry Smith PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[])
10135c6c1daeSBarry Smith {
10145c6c1daeSBarry Smith   PetscErrorCode ierr;
10155fd66863SKarl Rupp 
10165c6c1daeSBarry Smith   PetscFunctionBegin;
10175c6c1daeSBarry Smith   if (!pre) {
10185c6c1daeSBarry Smith     ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr);
10195c6c1daeSBarry Smith   } else {
10205c6c1daeSBarry Smith     if (pre[0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hypen");
10215c6c1daeSBarry Smith     ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr);
10225c6c1daeSBarry Smith     ierr = PetscStrallocpy(pre,&(bag->bagprefix));CHKERRQ(ierr);
10235c6c1daeSBarry Smith   }
10245c6c1daeSBarry Smith   PetscFunctionReturn(0);
10255c6c1daeSBarry Smith }
1026ffb7e86cSMatthew G. Knepley 
1027ffb7e86cSMatthew G. Knepley /*@C
1028ffb7e86cSMatthew G. Knepley   PetscBagGetNames - Get the names of all entries in the bag
1029ffb7e86cSMatthew G. Knepley 
1030ffb7e86cSMatthew G. Knepley   Not collective
1031ffb7e86cSMatthew G. Knepley 
1032ffb7e86cSMatthew G. Knepley   Input Parameters:
1033ffb7e86cSMatthew G. Knepley + bag   - the bag of values
1034ffb7e86cSMatthew G. Knepley - names - array of the correct size to hold names
1035ffb7e86cSMatthew G. Knepley 
1036ffb7e86cSMatthew G. Knepley   Output Parameter:
1037ffb7e86cSMatthew G. Knepley . names - array of char pointers for names
1038ffb7e86cSMatthew G. Knepley 
1039ffb7e86cSMatthew G. Knepley   Level: intermediate
1040ffb7e86cSMatthew G. Knepley 
1041ffb7e86cSMatthew G. Knepley .seealso: PetscBag, PetscBagGetName(), PetscBagSetName(), PetscBagCreate(), PetscBagGetData()
1042ffb7e86cSMatthew G. Knepley           PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum()
1043ffb7e86cSMatthew G. Knepley @*/
1044ffb7e86cSMatthew G. Knepley PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[])
1045ffb7e86cSMatthew G. Knepley {
1046ffb7e86cSMatthew G. Knepley   PetscBagItem nitem = bag->bagitems;
1047ffb7e86cSMatthew G. Knepley   PetscInt     n;
1048ffb7e86cSMatthew G. Knepley 
1049ffb7e86cSMatthew G. Knepley   PetscFunctionBegin;
1050ffb7e86cSMatthew G. Knepley   for (n = 0; nitem; ++n, nitem = nitem->next) {names[n] = nitem->name;}
1051ffb7e86cSMatthew G. Knepley   PetscFunctionReturn(0);
1052ffb7e86cSMatthew G. Knepley }
1053