xref: /petsc/src/sys/classes/bag/bag.c (revision 9bb5e83dfd8d08918f3df3058fee52935e3d9cc1)
15c6c1daeSBarry Smith 
2*9bb5e83dSBarry Smith #include <petsc-private/bagimpl.h>     /*I  "petscbag.h"   I*/
3665c2dedSJed Brown #include <petscviewer.h>
45c6c1daeSBarry Smith 
55c6c1daeSBarry Smith #undef __FUNCT__
65c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegister_Private"
75c6c1daeSBarry Smith /*
85c6c1daeSBarry Smith       Adds item to the linked list in a bag
95c6c1daeSBarry Smith */
105c6c1daeSBarry Smith static PetscErrorCode PetscBagRegister_Private(PetscBag bag,PetscBagItem item,const char *name,const char *help)
115c6c1daeSBarry Smith {
125c6c1daeSBarry Smith   PetscErrorCode ierr;
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith   PetscFunctionBegin;
155c6c1daeSBarry Smith   ierr = PetscStrncpy(item->name,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
165c6c1daeSBarry Smith   ierr = PetscStrncpy(item->help,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr);
175c6c1daeSBarry Smith   if (!bag->bagitems) bag->bagitems = item;
185c6c1daeSBarry Smith   else {
195c6c1daeSBarry Smith     PetscBagItem nitem = bag->bagitems;
205c6c1daeSBarry Smith     while (nitem->next) {
215c6c1daeSBarry Smith       nitem = nitem->next;
225c6c1daeSBarry Smith     }
235c6c1daeSBarry Smith     nitem->next = item;
245c6c1daeSBarry Smith   }
255c6c1daeSBarry Smith   bag->count++;
265c6c1daeSBarry Smith   PetscFunctionReturn(0);
275c6c1daeSBarry Smith }
285c6c1daeSBarry Smith 
295c6c1daeSBarry Smith #undef __FUNCT__
305c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterEnum"
315c6c1daeSBarry Smith /*@C
325c6c1daeSBarry Smith    PetscBagRegisterEnum - add an enum value to the bag
335c6c1daeSBarry Smith 
345c6c1daeSBarry Smith    Logically Collective on PetscBag
355c6c1daeSBarry Smith 
365c6c1daeSBarry Smith    Input Parameter:
375c6c1daeSBarry Smith +  bag - the bag of values
385c6c1daeSBarry Smith .  addr - location of enum in struct
395c6c1daeSBarry Smith .  mdefault - the initial value
405c6c1daeSBarry Smith .  list - array of strings containing names of enum values followed by enum name followed by enum prefix
415c6c1daeSBarry Smith -  help - longer string with more information about the value
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith    Level: beginner
445c6c1daeSBarry Smith 
455c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
465c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
475c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName()
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith @*/
505c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterEnum(PetscBag bag,void *addr,const char *const *list,PetscEnum mdefault, const char *name, const char *help)
515c6c1daeSBarry Smith {
525c6c1daeSBarry Smith   PetscErrorCode ierr;
535c6c1daeSBarry Smith   PetscBagItem   item;
545c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
555c6c1daeSBarry Smith   PetscBool      printhelp;
565c6c1daeSBarry Smith   PetscInt       i = 0;
575c6c1daeSBarry Smith 
585c6c1daeSBarry Smith   PetscFunctionBegin;
595c6c1daeSBarry Smith   nname[0] = '-';
605c6c1daeSBarry Smith   nname[1] = 0;
615c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
620298fd71SBarry Smith   ierr     = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr);
635c6c1daeSBarry Smith   if (printhelp) {
645c6c1daeSBarry Smith     while (list[i++]) ;
655c6c1daeSBarry 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);
665c6c1daeSBarry Smith     for (i=0; list[i+2]; i++) {
675c6c1daeSBarry Smith       ierr = (*PetscHelpPrintf)(bag->bagcomm," %s",list[i]);CHKERRQ(ierr);
685c6c1daeSBarry Smith     }
695c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"\n");CHKERRQ(ierr);
705c6c1daeSBarry Smith   }
710298fd71SBarry Smith   ierr = PetscOptionsGetEnum(bag->bagprefix,nname,list,&mdefault,NULL);CHKERRQ(ierr);
725c6c1daeSBarry Smith 
735c6c1daeSBarry Smith   ierr         = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
745c6c1daeSBarry Smith   item->dtype  = PETSC_ENUM;
755c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
765c6c1daeSBarry 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);
775c6c1daeSBarry Smith   item->next        = 0;
785c6c1daeSBarry Smith   item->msize       = 1;
795c6c1daeSBarry Smith   ierr              = PetscStrArrayallocpy(list,(char***)&item->list);CHKERRQ(ierr);
805c6c1daeSBarry Smith   *(PetscEnum*)addr = mdefault;
815c6c1daeSBarry Smith   ierr              = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
825c6c1daeSBarry Smith   PetscFunctionReturn(0);
835c6c1daeSBarry Smith }
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith #undef __FUNCT__
865c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterIntArray"
875c6c1daeSBarry Smith /*@C
885c6c1daeSBarry Smith    PetscBagRegisterIntArray - add an integer value to the bag
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith    Logically Collective on PetscBag
915c6c1daeSBarry Smith 
925c6c1daeSBarry Smith    Input Parameter:
935c6c1daeSBarry Smith +  bag - the bag of values
945c6c1daeSBarry Smith .  addr - location of integer in struct
955c6c1daeSBarry Smith .  msize - number of entries in array
965c6c1daeSBarry Smith .  name - name of the integer array
975c6c1daeSBarry Smith -  help - longer string with more information about the value
985c6c1daeSBarry Smith 
995c6c1daeSBarry Smith    Level: beginner
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
1025c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
1035c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
1045c6c1daeSBarry Smith 
1055c6c1daeSBarry Smith @*/
1065c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterIntArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help)
1075c6c1daeSBarry Smith {
1085c6c1daeSBarry Smith   PetscErrorCode ierr;
1095c6c1daeSBarry Smith   PetscBagItem   item;
1105c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
1115c6c1daeSBarry Smith   PetscBool      printhelp;
1125c6c1daeSBarry Smith   PetscInt       i,tmp = msize;
1135c6c1daeSBarry Smith 
1145c6c1daeSBarry Smith   PetscFunctionBegin;
1155c6c1daeSBarry Smith   /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/
1165c6c1daeSBarry Smith   nname[0] = '-';
1175c6c1daeSBarry Smith   nname[1] = 0;
1185c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
1190298fd71SBarry Smith   ierr     = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr);
1205c6c1daeSBarry Smith   if (printhelp) {
1215c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <",bag->bagprefix ? bag->bagprefix : "",name);CHKERRQ(ierr);
1225c6c1daeSBarry Smith     for (i=0; i<msize; i++) {
1235c6c1daeSBarry Smith       ierr = (*PetscHelpPrintf)(bag->bagcomm,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr);
1245c6c1daeSBarry Smith     }
1255c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr);
1265c6c1daeSBarry Smith   }
1270298fd71SBarry Smith   ierr = PetscOptionsGetIntArray(bag->bagprefix,nname,(PetscInt*)addr,&tmp,NULL);CHKERRQ(ierr);
1285c6c1daeSBarry Smith 
1295c6c1daeSBarry Smith   ierr         = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
1305c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
1315c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
1325c6c1daeSBarry 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);
1335c6c1daeSBarry Smith   item->next  = 0;
1345c6c1daeSBarry Smith   item->msize = msize;
1355c6c1daeSBarry Smith   ierr        = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
1365c6c1daeSBarry Smith   PetscFunctionReturn(0);
1375c6c1daeSBarry Smith }
1385c6c1daeSBarry Smith 
1395c6c1daeSBarry Smith #undef __FUNCT__
1405c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterRealArray"
1415c6c1daeSBarry Smith /*@C
1425c6c1daeSBarry Smith    PetscBagRegisterRealArray - add an real array to the bag
1435c6c1daeSBarry Smith 
1445c6c1daeSBarry Smith    Logically Collective on PetscBag
1455c6c1daeSBarry Smith 
1465c6c1daeSBarry Smith    Input Parameter:
1475c6c1daeSBarry Smith +  bag - the bag of values
1485c6c1daeSBarry Smith .  addr - location of real array in struct
1495c6c1daeSBarry Smith .  msize - number of entries in array
1505c6c1daeSBarry Smith .  name - name of the integer array
1515c6c1daeSBarry Smith -  help - longer string with more information about the value
1525c6c1daeSBarry Smith 
1535c6c1daeSBarry Smith    Level: beginner
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
1565c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
1575c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
1585c6c1daeSBarry Smith 
1595c6c1daeSBarry Smith @*/
1605c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterRealArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help)
1615c6c1daeSBarry Smith {
1625c6c1daeSBarry Smith   PetscErrorCode ierr;
1635c6c1daeSBarry Smith   PetscBagItem   item;
1645c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
1655c6c1daeSBarry Smith   PetscBool      printhelp;
1665c6c1daeSBarry Smith   PetscInt       i,tmp = msize;
1675c6c1daeSBarry Smith 
1685c6c1daeSBarry Smith   PetscFunctionBegin;
1695c6c1daeSBarry Smith   /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/
1705c6c1daeSBarry Smith   nname[0] = '-';
1715c6c1daeSBarry Smith   nname[1] = 0;
1725c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
1730298fd71SBarry Smith   ierr     = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr);
1745c6c1daeSBarry Smith   if (printhelp) {
1755c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <",bag->bagprefix ? bag->bagprefix : "",name);CHKERRQ(ierr);
1765c6c1daeSBarry Smith     for (i=0; i<msize; i++) {
1775c6c1daeSBarry Smith       ierr = (*PetscHelpPrintf)(bag->bagcomm,"%G ",*((PetscReal*)addr)+i);CHKERRQ(ierr);
1785c6c1daeSBarry Smith     }
1795c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr);
1805c6c1daeSBarry Smith   }
1810298fd71SBarry Smith   ierr = PetscOptionsGetRealArray(bag->bagprefix,nname,(PetscReal*)addr,&tmp,NULL);CHKERRQ(ierr);
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith   ierr         = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
1845c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
1855c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
1865c6c1daeSBarry 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);
1875c6c1daeSBarry Smith   item->next  = 0;
1885c6c1daeSBarry Smith   item->msize = msize;
1895c6c1daeSBarry Smith   ierr        = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
1905c6c1daeSBarry Smith   PetscFunctionReturn(0);
1915c6c1daeSBarry Smith }
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith #undef __FUNCT__
1945c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterInt"
1955c6c1daeSBarry Smith /*@C
1965c6c1daeSBarry Smith    PetscBagRegisterInt - add an integer value to the bag
1975c6c1daeSBarry Smith 
1985c6c1daeSBarry Smith    Logically Collective on PetscBag
1995c6c1daeSBarry Smith 
2005c6c1daeSBarry Smith    Input Parameter:
2015c6c1daeSBarry Smith +  bag - the bag of values
2025c6c1daeSBarry Smith .  addr - location of integer in struct
2035c6c1daeSBarry Smith .  mdefault - the initial value
2045c6c1daeSBarry Smith .  name - name of the integer
2055c6c1daeSBarry Smith -  help - longer string with more information about the value
2065c6c1daeSBarry Smith 
2075c6c1daeSBarry Smith    Level: beginner
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
2105c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
2115c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
2125c6c1daeSBarry Smith 
2135c6c1daeSBarry Smith @*/
2145c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterInt(PetscBag bag,void *addr,PetscInt mdefault,const char *name,const char *help)
2155c6c1daeSBarry Smith {
2165c6c1daeSBarry Smith   PetscErrorCode ierr;
2175c6c1daeSBarry Smith   PetscBagItem   item;
2185c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
2195c6c1daeSBarry Smith   PetscBool      printhelp;
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith   PetscFunctionBegin;
2225c6c1daeSBarry Smith   nname[0] = '-';
2235c6c1daeSBarry Smith   nname[1] = 0;
2245c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
2250298fd71SBarry Smith   ierr     = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr);
2265c6c1daeSBarry Smith   if (printhelp) {
2275c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%d>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr);
2285c6c1daeSBarry Smith   }
2290298fd71SBarry Smith   ierr = PetscOptionsGetInt(bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr);
2305c6c1daeSBarry Smith 
2315c6c1daeSBarry Smith   ierr         = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
2325c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
2335c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
2345c6c1daeSBarry 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);
2355c6c1daeSBarry Smith   item->next       = 0;
2365c6c1daeSBarry Smith   item->msize      = 1;
2375c6c1daeSBarry Smith   *(PetscInt*)addr = mdefault;
2385c6c1daeSBarry Smith   ierr             = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
2395c6c1daeSBarry Smith   PetscFunctionReturn(0);
2405c6c1daeSBarry Smith }
2415c6c1daeSBarry Smith 
2425c6c1daeSBarry Smith #undef __FUNCT__
2435c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterString"
2445c6c1daeSBarry Smith /*@C
2455c6c1daeSBarry Smith    PetscBagRegisterString - add a string value to the bag
2465c6c1daeSBarry Smith 
2475c6c1daeSBarry Smith    Logically Collective on PetscBag
2485c6c1daeSBarry Smith 
2495c6c1daeSBarry Smith    Input Parameter:
2505c6c1daeSBarry Smith +  bag - the bag of values
2515c6c1daeSBarry Smith .  addr - location of start of string in struct
2525c6c1daeSBarry Smith .  msize - length of the string space in the struct
2535c6c1daeSBarry Smith .  mdefault - the initial value
2545c6c1daeSBarry Smith .  name - name of the string
2555c6c1daeSBarry Smith -  help - longer string with more information about the value
2565c6c1daeSBarry Smith 
2575c6c1daeSBarry Smith    Level: beginner
2585c6c1daeSBarry Smith 
2595c6c1daeSBarry Smith    Note: The struct should have the field char mystring[msize]; not char *mystring
2605c6c1daeSBarry Smith 
2615c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
2625c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
2635c6c1daeSBarry Smith            PetscBagSetFromOptions(),PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
2645c6c1daeSBarry Smith 
2655c6c1daeSBarry Smith @*/
2665c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* mdefault,const char* name,const char* help)
2675c6c1daeSBarry Smith {
2685c6c1daeSBarry Smith   PetscErrorCode ierr;
2695c6c1daeSBarry Smith   PetscBagItem   item;
2705c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
2715c6c1daeSBarry Smith   PetscBool      printhelp;
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith   PetscFunctionBegin;
2745c6c1daeSBarry Smith   nname[0] = '-';
2755c6c1daeSBarry Smith   nname[1] = 0;
2765c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
2770298fd71SBarry Smith   ierr     = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr);
2785c6c1daeSBarry Smith   if (printhelp) {
2795c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr);
2805c6c1daeSBarry Smith   }
2815c6c1daeSBarry Smith 
2825c6c1daeSBarry Smith   ierr         = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
2835c6c1daeSBarry Smith   item->dtype  = PETSC_CHAR;
2845c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
2855c6c1daeSBarry 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);
2865c6c1daeSBarry Smith   item->next  = 0;
2875c6c1daeSBarry Smith   item->msize = msize;
2885c6c1daeSBarry Smith   if (mdefault != (char*)addr) {
2895c6c1daeSBarry Smith     ierr = PetscStrncpy((char*)addr,mdefault,msize-1);CHKERRQ(ierr);
2905c6c1daeSBarry Smith   }
2910298fd71SBarry Smith   ierr = PetscOptionsGetString(bag->bagprefix,nname,(char*)addr,msize,NULL);CHKERRQ(ierr);
2925c6c1daeSBarry Smith   ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
2935c6c1daeSBarry Smith   PetscFunctionReturn(0);
2945c6c1daeSBarry Smith }
2955c6c1daeSBarry Smith 
2965c6c1daeSBarry Smith #undef __FUNCT__
2975c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterReal"
2985c6c1daeSBarry Smith /*@C
2995c6c1daeSBarry Smith    PetscBagRegisterReal - add a real value to the bag
3005c6c1daeSBarry Smith 
3015c6c1daeSBarry Smith    Logically Collective on PetscBag
3025c6c1daeSBarry Smith 
3035c6c1daeSBarry Smith    Input Parameter:
3045c6c1daeSBarry Smith +  bag - the bag of values
3055c6c1daeSBarry Smith .  addr - location of double in struct
3065c6c1daeSBarry Smith .  mdefault - the initial value
3075c6c1daeSBarry Smith .  name - name of the variable
3085c6c1daeSBarry Smith -  help - longer string with more information about the value
3095c6c1daeSBarry Smith 
3105c6c1daeSBarry Smith    Level: beginner
3115c6c1daeSBarry Smith 
3125c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
3135c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
3145c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
3155c6c1daeSBarry Smith 
3165c6c1daeSBarry Smith @*/
3175c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterReal(PetscBag bag,void *addr,PetscReal mdefault, const char *name, const char *help)
3185c6c1daeSBarry Smith {
3195c6c1daeSBarry Smith   PetscErrorCode ierr;
3205c6c1daeSBarry Smith   PetscBagItem   item;
3215c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
3225c6c1daeSBarry Smith   PetscBool      printhelp;
3235c6c1daeSBarry Smith 
3245c6c1daeSBarry Smith   PetscFunctionBegin;
3255c6c1daeSBarry Smith   nname[0] = '-';
3265c6c1daeSBarry Smith   nname[1] = 0;
3275c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
3280298fd71SBarry Smith   ierr     = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr);
3295c6c1daeSBarry Smith   if (printhelp) {
3305c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%G>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr);
3315c6c1daeSBarry Smith   }
3320298fd71SBarry Smith   ierr = PetscOptionsGetReal(bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr);
3335c6c1daeSBarry Smith 
3345c6c1daeSBarry Smith   ierr         = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
3355c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
3365c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
3375c6c1daeSBarry 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);
3385c6c1daeSBarry Smith   item->next        = 0;
3395c6c1daeSBarry Smith   item->msize       = 1;
3405c6c1daeSBarry Smith   *(PetscReal*)addr = mdefault;
3415c6c1daeSBarry Smith   ierr              = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
3425c6c1daeSBarry Smith   PetscFunctionReturn(0);
3435c6c1daeSBarry Smith }
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith #undef __FUNCT__
3465c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterScalar"
3475c6c1daeSBarry Smith /*@C
3485c6c1daeSBarry Smith    PetscBagRegisterScalar - add a real or complex number value to the bag
3495c6c1daeSBarry Smith 
3505c6c1daeSBarry Smith    Logically Collective on PetscBag
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith    Input Parameter:
3535c6c1daeSBarry Smith +  bag - the bag of values
3545c6c1daeSBarry Smith .  addr - location of scalar in struct
3555c6c1daeSBarry Smith .  mdefault - the initial value
3565c6c1daeSBarry Smith .  name - name of the variable
3575c6c1daeSBarry Smith -  help - longer string with more information about the value
3585c6c1daeSBarry Smith 
3595c6c1daeSBarry Smith 
3605c6c1daeSBarry Smith    Level: beginner
3615c6c1daeSBarry Smith 
3625c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
3635c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
3645c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
3655c6c1daeSBarry Smith 
3665c6c1daeSBarry Smith @*/
3675c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar mdefault,const char *name,const char *help)
3685c6c1daeSBarry Smith {
3695c6c1daeSBarry Smith   PetscErrorCode ierr;
3705c6c1daeSBarry Smith   PetscBagItem   item;
3715c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
3725c6c1daeSBarry Smith   PetscBool      printhelp;
3735c6c1daeSBarry Smith 
3745c6c1daeSBarry Smith   PetscFunctionBegin;
3755c6c1daeSBarry Smith   nname[0] = '-';
3765c6c1daeSBarry Smith   nname[1] = 0;
3775c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
3780298fd71SBarry Smith   ierr     = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr);
3795c6c1daeSBarry Smith   if (printhelp) {
3805c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%G + %Gi>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,PetscRealPart(mdefault),PetscImaginaryPart(mdefault),help);CHKERRQ(ierr);
3815c6c1daeSBarry Smith   }
3820298fd71SBarry Smith   ierr = PetscOptionsGetScalar(bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr);
3835c6c1daeSBarry Smith 
3845c6c1daeSBarry Smith   ierr         = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
3855c6c1daeSBarry Smith   item->dtype  = PETSC_SCALAR;
3865c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
3875c6c1daeSBarry 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);
3885c6c1daeSBarry Smith   item->next          = 0;
3895c6c1daeSBarry Smith   item->msize         = 1;
3905c6c1daeSBarry Smith   *(PetscScalar*)addr = mdefault;
3915c6c1daeSBarry Smith   ierr                = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
3925c6c1daeSBarry Smith   PetscFunctionReturn(0);
3935c6c1daeSBarry Smith }
3945c6c1daeSBarry Smith 
3955c6c1daeSBarry Smith #undef __FUNCT__
3965c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterBool"
3975c6c1daeSBarry Smith /*@C
3985c6c1daeSBarry Smith    PetscBagRegisterBool - add a logical value to the bag
3995c6c1daeSBarry Smith 
4005c6c1daeSBarry Smith    Logically Collective on PetscBag
4015c6c1daeSBarry Smith 
4025c6c1daeSBarry Smith    Input Parameter:
4035c6c1daeSBarry Smith +  bag - the bag of values
4045c6c1daeSBarry Smith .  addr - location of logical in struct
4055c6c1daeSBarry Smith .  mdefault - the initial value
4065c6c1daeSBarry Smith .  name - name of the variable
4075c6c1daeSBarry Smith -  help - longer string with more information about the value
4085c6c1daeSBarry Smith 
4095c6c1daeSBarry Smith 
4105c6c1daeSBarry Smith    Level: beginner
4115c6c1daeSBarry Smith 
4125c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
4135c6c1daeSBarry Smith            PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
4145c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
4155c6c1daeSBarry Smith 
4165c6c1daeSBarry Smith @*/
4175c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterBool(PetscBag bag,void *addr,PetscBool mdefault,const char *name,const char *help)
4185c6c1daeSBarry Smith {
4195c6c1daeSBarry Smith   PetscErrorCode ierr;
4205c6c1daeSBarry Smith   PetscBagItem   item;
4215c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
4225c6c1daeSBarry Smith   PetscBool      printhelp;
4235c6c1daeSBarry Smith 
4245c6c1daeSBarry Smith   PetscFunctionBegin;
4255c6c1daeSBarry 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 */
4265c6c1daeSBarry 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);
4275c6c1daeSBarry Smith   nname[0] = '-';
4285c6c1daeSBarry Smith   nname[1] = 0;
4295c6c1daeSBarry Smith   ierr     = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
4300298fd71SBarry Smith   ierr     = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr);
4315c6c1daeSBarry Smith   if (printhelp) {
4325c6c1daeSBarry Smith     ierr = (*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,PetscBools[mdefault],help);CHKERRQ(ierr);
4335c6c1daeSBarry Smith   }
4340298fd71SBarry Smith   ierr = PetscOptionsGetBool(bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr);
4355c6c1daeSBarry Smith 
4365c6c1daeSBarry Smith   ierr         = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
4375c6c1daeSBarry Smith   item->dtype  = PETSC_BOOL;
4385c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
4395c6c1daeSBarry 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);
4405c6c1daeSBarry Smith   item->next        = 0;
4415c6c1daeSBarry Smith   item->msize       = 1;
4425c6c1daeSBarry Smith   *(PetscBool*)addr = mdefault;
4435c6c1daeSBarry Smith   ierr              = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
4445c6c1daeSBarry Smith   PetscFunctionReturn(0);
4455c6c1daeSBarry Smith }
4465c6c1daeSBarry Smith 
4475c6c1daeSBarry Smith #undef __FUNCT__
4485c6c1daeSBarry Smith #define __FUNCT__ "PetscBagDestroy"
4495c6c1daeSBarry Smith /*@C
4505c6c1daeSBarry Smith    PetscBagDestroy - Destroys a bag values
4515c6c1daeSBarry Smith 
4525c6c1daeSBarry Smith    Collective on PetscBag
4535c6c1daeSBarry Smith 
4545c6c1daeSBarry Smith    Input Parameter:
4555c6c1daeSBarry Smith .  bag - the bag of values
4565c6c1daeSBarry Smith 
4575c6c1daeSBarry Smith    Level: beginner
4585c6c1daeSBarry Smith 
4595c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
4605c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
4615c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
4625c6c1daeSBarry Smith 
4635c6c1daeSBarry Smith @*/
4645c6c1daeSBarry Smith PetscErrorCode  PetscBagDestroy(PetscBag *bag)
4655c6c1daeSBarry Smith {
4665c6c1daeSBarry Smith   PetscErrorCode ierr;
4675c6c1daeSBarry Smith   PetscBagItem   nitem = (*bag)->bagitems,item;
4685c6c1daeSBarry Smith 
4695c6c1daeSBarry Smith   PetscFunctionBegin;
4705c6c1daeSBarry Smith   while (nitem) {
4715c6c1daeSBarry Smith     item = nitem->next;
4725c6c1daeSBarry Smith     if (nitem->list) {
4735c6c1daeSBarry Smith       ierr = PetscStrArrayDestroy(&nitem->list);CHKERRQ(ierr);
4745c6c1daeSBarry Smith     }
4755c6c1daeSBarry Smith     ierr  = PetscFree(nitem);CHKERRQ(ierr);
4765c6c1daeSBarry Smith     nitem = item;
4775c6c1daeSBarry Smith   }
4785c6c1daeSBarry Smith   if ((*bag)->bagprefix) { ierr = PetscFree((*bag)->bagprefix);CHKERRQ(ierr); }
4795c6c1daeSBarry Smith   ierr = PetscFree(*bag);CHKERRQ(ierr);
4805c6c1daeSBarry Smith   PetscFunctionReturn(0);
4815c6c1daeSBarry Smith }
4825c6c1daeSBarry Smith 
4835c6c1daeSBarry Smith #undef __FUNCT__
4845c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetFromOptions"
4855c6c1daeSBarry Smith /*@
4865c6c1daeSBarry Smith    PetscBagSetFromOptions - Allows setting options from a bag
4875c6c1daeSBarry Smith 
4885c6c1daeSBarry Smith    Collective on PetscBag
4895c6c1daeSBarry Smith 
4905c6c1daeSBarry Smith    Input Parameter:
4915c6c1daeSBarry Smith .  bag - the bag of values
4925c6c1daeSBarry Smith 
4935c6c1daeSBarry Smith    Level: beginner
4945c6c1daeSBarry Smith 
4955c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData()
4965c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
4975c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagView(), PetscBagRegisterEnum()
4985c6c1daeSBarry Smith 
4995c6c1daeSBarry Smith @*/
5005c6c1daeSBarry Smith PetscErrorCode  PetscBagSetFromOptions(PetscBag bag)
5015c6c1daeSBarry Smith {
5025c6c1daeSBarry Smith   PetscErrorCode ierr;
5035c6c1daeSBarry Smith   PetscBagItem   nitem = bag->bagitems;
5045c6c1daeSBarry Smith   char           name[PETSC_BAG_NAME_LENGTH+1],helpname[PETSC_BAG_NAME_LENGTH+PETSC_BAG_HELP_LENGTH+3];
5055c6c1daeSBarry Smith   PetscInt       n;
5065c6c1daeSBarry Smith 
5075c6c1daeSBarry Smith   PetscFunctionBegin;
5085c6c1daeSBarry Smith   ierr = PetscStrcpy(helpname,bag->bagname);CHKERRQ(ierr);
5095c6c1daeSBarry Smith   ierr = PetscStrcat(helpname," ");CHKERRQ(ierr);
5105c6c1daeSBarry Smith   ierr = PetscStrcat(helpname,bag->baghelp);CHKERRQ(ierr);
5115c6c1daeSBarry Smith   ierr = PetscOptionsBegin(bag->bagcomm,bag->bagprefix,helpname,0);
5125c6c1daeSBarry Smith   while (nitem) {
5135c6c1daeSBarry Smith     name[0] = '-';
5145c6c1daeSBarry Smith     name[1] = 0;
5155c6c1daeSBarry Smith     ierr    = PetscStrcat(name,nitem->name);CHKERRQ(ierr);
5165c6c1daeSBarry Smith     if (nitem->dtype == PETSC_CHAR) {   /* special handling for fortran required? [due to space padding vs null termination] */
5175c6c1daeSBarry Smith       char *value = (char*)(((char*)bag) + nitem->offset);
5180298fd71SBarry Smith       ierr = PetscOptionsString(name,nitem->help,"",value,value,nitem->msize,NULL);CHKERRQ(ierr);
5195c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_REAL) {
5205c6c1daeSBarry Smith       PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset);
5215c6c1daeSBarry Smith       if (nitem->msize == 1) {
5220298fd71SBarry Smith         ierr = PetscOptionsReal(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr);
5235c6c1daeSBarry Smith       } else {
5245c6c1daeSBarry Smith         n    = nitem->msize;
5250298fd71SBarry Smith         ierr = PetscOptionsRealArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr);
5265c6c1daeSBarry Smith       }
5275c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_SCALAR) {
5285c6c1daeSBarry Smith       PetscScalar *value = (PetscScalar*)(((char*)bag) + nitem->offset);
5290298fd71SBarry Smith       ierr = PetscOptionsScalar(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr);
5305c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_INT) {
5315c6c1daeSBarry Smith       PetscInt *value = (PetscInt*)(((char*)bag) + nitem->offset);
5325c6c1daeSBarry Smith       if (nitem->msize == 1) {
5330298fd71SBarry Smith         ierr = PetscOptionsInt(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr);
5345c6c1daeSBarry Smith       } else {
5355c6c1daeSBarry Smith         n    = nitem->msize;
5360298fd71SBarry Smith         ierr = PetscOptionsIntArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr);
5375c6c1daeSBarry Smith       }
5385c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_ENUM) {
5395c6c1daeSBarry Smith       PetscEnum *value = (PetscEnum*)(((char*)bag) + nitem->offset);
5405c6c1daeSBarry Smith       PetscInt  i      = 0;
5415c6c1daeSBarry Smith       while (nitem->list[i++]) ;
5420298fd71SBarry Smith       ierr = PetscOptionsEnum(name,nitem->help,nitem->list[i-3],(const char*const*)nitem->list,*value,value,NULL);CHKERRQ(ierr);
5435c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_BOOL) {
5445c6c1daeSBarry Smith       PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset);
5450298fd71SBarry Smith       ierr = PetscOptionsBool(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr);
5465c6c1daeSBarry Smith     }
5475c6c1daeSBarry Smith     nitem = nitem->next;
5485c6c1daeSBarry Smith   }
5495c6c1daeSBarry Smith   PetscOptionsEnd();
5505c6c1daeSBarry Smith   PetscFunctionReturn(0);
5515c6c1daeSBarry Smith }
5525c6c1daeSBarry Smith 
5535c6c1daeSBarry Smith #undef __FUNCT__
5545c6c1daeSBarry Smith #define __FUNCT__ "PetscBagView"
5555c6c1daeSBarry Smith /*@C
5565c6c1daeSBarry Smith    PetscBagView - Views a bag of values as either ASCII text or a binary file
5575c6c1daeSBarry Smith 
5585c6c1daeSBarry Smith    Collective on PetscBag
5595c6c1daeSBarry Smith 
5605c6c1daeSBarry Smith    Input Parameter:
5615c6c1daeSBarry Smith +  bag - the bag of values
5625c6c1daeSBarry Smith -  viewer - location to view the values
5635c6c1daeSBarry Smith 
5645c6c1daeSBarry Smith    Level: beginner
5655c6c1daeSBarry Smith 
5665c6c1daeSBarry Smith    Warning: Currently PETSc bags saved in a binary file can only be read back
5675c6c1daeSBarry Smith      in on a machine of the same architecture. Let us know when this is a problem
5685c6c1daeSBarry Smith      and we'll fix it.
5695c6c1daeSBarry Smith 
5705c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData()
5715c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum()
5725c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName()
5735c6c1daeSBarry Smith 
5745c6c1daeSBarry Smith @*/
5755c6c1daeSBarry Smith PetscErrorCode  PetscBagView(PetscBag bag,PetscViewer view)
5765c6c1daeSBarry Smith {
5775c6c1daeSBarry Smith   PetscBool      isascii,isbinary;
5785c6c1daeSBarry Smith   PetscErrorCode ierr;
5795c6c1daeSBarry Smith   PetscBagItem   nitem = bag->bagitems;
5805c6c1daeSBarry Smith 
5815c6c1daeSBarry Smith   PetscFunctionBegin;
5825c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
5835c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
5845c6c1daeSBarry Smith   if (isascii) {
5855c6c1daeSBarry Smith     ierr = PetscViewerASCIIPrintf(view,"PetscBag Object:  %s %s\n",bag->bagname,bag->baghelp);CHKERRQ(ierr);
5865c6c1daeSBarry Smith     while (nitem) {
5875c6c1daeSBarry Smith       if (nitem->dtype == PETSC_CHAR) {
5885c6c1daeSBarry Smith         char *value = (char*)(((char*)bag) + nitem->offset);
5895c6c1daeSBarry Smith         char tmp    = value[nitem->msize-1]; /* special handling for fortran chars wihout null terminator */
5905c6c1daeSBarry Smith         value[nitem->msize-1] =0;
5915c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %s; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr);
5925c6c1daeSBarry Smith         value[nitem->msize-1] = tmp;
5935c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_REAL) {
5945c6c1daeSBarry Smith         PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset);
5955c6c1daeSBarry Smith         PetscInt  i;
5965c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = ",nitem->name);CHKERRQ(ierr);
5975c6c1daeSBarry Smith         for (i=0; i<nitem->msize; i++) {
5985c6c1daeSBarry Smith           ierr = PetscViewerASCIIPrintf(view,"%G ",value[i]);CHKERRQ(ierr);
5995c6c1daeSBarry Smith         }
6005c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr);
6015c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_SCALAR) {
6025c6c1daeSBarry Smith         PetscScalar value = *(PetscScalar*)(((char*)bag) + nitem->offset);
6035c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
6045c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %G + %Gi; %s\n",nitem->name,PetscRealPart(value),PetscImaginaryPart(value),nitem->help);CHKERRQ(ierr);
6055c6c1daeSBarry Smith #else
6065c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %G; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr);
6075c6c1daeSBarry Smith #endif
6085c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_INT) {
6095c6c1daeSBarry Smith         PetscInt i,*value = (PetscInt*)(((char*)bag) + nitem->offset);
6105c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = ",nitem->name);CHKERRQ(ierr);
6115c6c1daeSBarry Smith         for (i=0; i<nitem->msize; i++) {
6125c6c1daeSBarry Smith           ierr = PetscViewerASCIIPrintf(view,"%D ",value[i]);CHKERRQ(ierr);
6135c6c1daeSBarry Smith         }
6145c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr);
6155c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_BOOL) {
6165c6c1daeSBarry Smith         PetscBool value = *(PetscBool*)(((char*)bag) + nitem->offset);
6175c6c1daeSBarry Smith         /* some Fortran compilers use -1 as boolean */
6185c6c1daeSBarry Smith         if (((int) value) == -1) value = PETSC_TRUE;
6195c6c1daeSBarry 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 */
6205c6c1daeSBarry Smith         if (value != PETSC_FALSE && value != PETSC_TRUE) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Boolean value for %s %s is corrupt; integer value %d",nitem->name,nitem->help,value);
6215c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %s; %s\n",nitem->name,PetscBools[value],nitem->help);CHKERRQ(ierr);
6225c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_ENUM) {
6235c6c1daeSBarry Smith         PetscEnum value = *(PetscEnum*)(((char*)bag) + nitem->offset);
6245c6c1daeSBarry Smith         PetscInt  i     = 0;
6255c6c1daeSBarry Smith         while (nitem->list[i++]) ;
6265c6c1daeSBarry Smith         ierr = PetscViewerASCIIPrintf(view,"  %s = %s; (%s) %s\n",nitem->name,nitem->list[value],nitem->list[i-3],nitem->help);CHKERRQ(ierr);
6275c6c1daeSBarry Smith       }
6285c6c1daeSBarry Smith       nitem = nitem->next;
6295c6c1daeSBarry Smith     }
6305c6c1daeSBarry Smith   } else if (isbinary) {
6315c6c1daeSBarry Smith     PetscInt          classid           = PETSC_BAG_FILE_CLASSID, dtype;
6325c6c1daeSBarry Smith     PetscInt          deprecatedbagsize = 0;
633a261c58fSBarry Smith     PetscViewerFormat format;
6345c6c1daeSBarry Smith     ierr = PetscViewerBinaryWrite(view,&classid,1,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
6355c6c1daeSBarry Smith     ierr = PetscViewerBinaryWrite(view,&deprecatedbagsize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
6365c6c1daeSBarry Smith     ierr = PetscViewerBinaryWrite(view,&bag->count,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
6375c6c1daeSBarry Smith     ierr = PetscViewerBinaryWrite(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
6385c6c1daeSBarry Smith     ierr = PetscViewerBinaryWrite(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
6395c6c1daeSBarry Smith     while (nitem) {
6405c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,&nitem->offset,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
6415c6c1daeSBarry Smith       dtype = (PetscInt)nitem->dtype;
6425c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,&dtype,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
6435c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,nitem->name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
6445c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,nitem->help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
6455c6c1daeSBarry Smith       ierr  = PetscViewerBinaryWrite(view,&nitem->msize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
6465c6c1daeSBarry Smith       /* some Fortran compilers use -1 as boolean */
6475c6c1daeSBarry Smith       if (dtype == PETSC_BOOL && ((*(int*) (((char*)bag) + nitem->offset) == -1))) *(int*) (((char*)bag) + nitem->offset) = PETSC_TRUE;
6485c6c1daeSBarry Smith 
6495c6c1daeSBarry Smith       ierr = PetscViewerBinaryWrite(view,(((char*)bag) + nitem->offset),nitem->msize,nitem->dtype,PETSC_FALSE);CHKERRQ(ierr);
6505c6c1daeSBarry Smith       if (dtype == PETSC_ENUM) {
6515c6c1daeSBarry Smith         ierr = PetscViewerBinaryWriteStringArray(view,(char**)nitem->list);CHKERRQ(ierr);
6525c6c1daeSBarry Smith       }
6535c6c1daeSBarry Smith       nitem = nitem->next;
6545c6c1daeSBarry Smith     }
655a261c58fSBarry Smith     ierr = PetscViewerGetFormat(view,&format);CHKERRQ(ierr);
656a261c58fSBarry Smith     if (format == PETSC_VIEWER_BINARY_MATLAB) {
657a261c58fSBarry Smith       MPI_Comm comm;
658a261c58fSBarry Smith       FILE     *info;
659a261c58fSBarry Smith       ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr);
660a261c58fSBarry Smith       ierr = PetscViewerBinaryGetInfoPointer(view,&info);CHKERRQ(ierr);
661a261c58fSBarry Smith       ierr = PetscFPrintf(comm,info,"%%--- begin code written by PetscViewerBinary for MATLAB format ---%\n");CHKERRQ(ierr);
662a261c58fSBarry Smith       ierr = PetscFPrintf(comm,info,"%%$$ Set.%s = PetscBinaryRead(fd);\n",bag->bagname);CHKERRQ(ierr);
663a261c58fSBarry Smith       ierr = PetscFPrintf(comm,info,"%%--- end code written by PetscViewerBinary for MATLAB format ---%\n\n");CHKERRQ(ierr);
664a261c58fSBarry Smith     }
665a261c58fSBarry Smith   }
6665c6c1daeSBarry Smith   PetscFunctionReturn(0);
6675c6c1daeSBarry Smith }
6685c6c1daeSBarry Smith 
6695c6c1daeSBarry Smith #undef __FUNCT__
6705c6c1daeSBarry Smith #define __FUNCT__ "PetscBagLoad"
6715c6c1daeSBarry Smith /*@C
6725c6c1daeSBarry Smith    PetscBagLoad - Loads a bag of values from a binary file
6735c6c1daeSBarry Smith 
6745c6c1daeSBarry Smith    Collective on PetscViewer
6755c6c1daeSBarry Smith 
6765c6c1daeSBarry Smith    Input Parameter:
6775c6c1daeSBarry Smith +  viewer - file to load values from
6785c6c1daeSBarry Smith -  bag - the bag of values
6795c6c1daeSBarry Smith 
6805c6c1daeSBarry Smith    Notes: You must have created and registered all the fields in the bag before loading into it.
6815c6c1daeSBarry Smith 
6825c6c1daeSBarry Smith    Notes:
6835c6c1daeSBarry Smith    Level: beginner
6845c6c1daeSBarry Smith 
6855c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagView(), PetscBagGetData()
6865c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
6875c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
6885c6c1daeSBarry Smith 
6895c6c1daeSBarry Smith @*/
6905c6c1daeSBarry Smith PetscErrorCode  PetscBagLoad(PetscViewer view,PetscBag bag)
6915c6c1daeSBarry Smith {
6925c6c1daeSBarry Smith   PetscErrorCode ierr;
6935c6c1daeSBarry Smith   PetscBool      isbinary;
6945c6c1daeSBarry Smith   PetscInt       classid,bagcount,i,dtype,msize,offset,deprecatedbagsize;
6955c6c1daeSBarry Smith   char           name[PETSC_BAG_NAME_LENGTH],help[PETSC_BAG_HELP_LENGTH],**list;
6965c6c1daeSBarry Smith   PetscBagItem   nitem;
6975c6c1daeSBarry Smith   MPI_Comm       comm;
6985c6c1daeSBarry Smith   PetscMPIInt    flag;
6995c6c1daeSBarry Smith 
7005c6c1daeSBarry Smith   PetscFunctionBegin;
7015c6c1daeSBarry Smith   ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr);
7025c6c1daeSBarry Smith   ierr = MPI_Comm_compare(comm,bag->bagcomm,&flag);CHKERRQ(ierr);
7035c6c1daeSBarry Smith   if (flag != MPI_CONGRUENT && flag != MPI_IDENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the viewer and bag"); \
7045c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
7055c6c1daeSBarry Smith   if (!isbinary) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type");
7065c6c1daeSBarry Smith 
7075c6c1daeSBarry Smith   ierr = PetscViewerBinaryRead(view,&classid,1,PETSC_INT);CHKERRQ(ierr);
7085c6c1daeSBarry Smith   if (classid != PETSC_BAG_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not PetscBag next in binary file");
7095c6c1daeSBarry Smith   ierr = PetscViewerBinaryRead(view,&deprecatedbagsize,1,PETSC_INT);CHKERRQ(ierr);
7105c6c1daeSBarry Smith   ierr = PetscViewerBinaryRead(view,&bagcount,1,PETSC_INT);CHKERRQ(ierr);
7115c6c1daeSBarry Smith   if (bagcount != bag->count) SETERRQ2(comm,PETSC_ERR_ARG_INCOMP,"Bag in file has different number of entries %d then passed in bag %d\n",(int)bagcount,(int)bag->count);CHKERRQ(ierr);
7125c6c1daeSBarry Smith   ierr = PetscViewerBinaryRead(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
7135c6c1daeSBarry Smith   ierr = PetscViewerBinaryRead(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
7145c6c1daeSBarry Smith 
7155c6c1daeSBarry Smith   nitem = bag->bagitems;
7165c6c1daeSBarry Smith   for (i=0; i<bagcount; i++) {
7175c6c1daeSBarry Smith     ierr = PetscViewerBinaryRead(view,&offset,1,PETSC_INT);CHKERRQ(ierr);
7185c6c1daeSBarry Smith     /* ignore the offset in the file */
7195c6c1daeSBarry Smith     ierr = PetscViewerBinaryRead(view,&dtype,1,PETSC_INT);CHKERRQ(ierr);
7205c6c1daeSBarry Smith     ierr = PetscViewerBinaryRead(view,name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
7215c6c1daeSBarry Smith     ierr = PetscViewerBinaryRead(view,help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
7225c6c1daeSBarry Smith     ierr = PetscViewerBinaryRead(view,&msize,1,PETSC_INT);CHKERRQ(ierr);
7235c6c1daeSBarry Smith 
7245c6c1daeSBarry Smith     if (dtype == (PetscInt) PETSC_CHAR) {
7255c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_CHAR);CHKERRQ(ierr);
7265c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_REAL) {
7275c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_REAL);CHKERRQ(ierr);
7285c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_SCALAR) {
7295c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_SCALAR);CHKERRQ(ierr);
7305c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_INT) {
7315c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_INT);CHKERRQ(ierr);
7325c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_BOOL) {
7335c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_BOOL);CHKERRQ(ierr);
7345c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_ENUM) {
7355c6c1daeSBarry Smith       ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_ENUM);CHKERRQ(ierr);
7365c6c1daeSBarry Smith       ierr = PetscViewerBinaryReadStringArray(view,&list);CHKERRQ(ierr);
7375c6c1daeSBarry Smith       /* don't need to save list because it is already registered in the bag */
7385c6c1daeSBarry Smith       ierr = PetscFree(list);CHKERRQ(ierr);
7395c6c1daeSBarry Smith     }
7405c6c1daeSBarry Smith     nitem = nitem->next;
7415c6c1daeSBarry Smith   }
7425c6c1daeSBarry Smith   PetscFunctionReturn(0);
7435c6c1daeSBarry Smith }
7445c6c1daeSBarry Smith 
7455c6c1daeSBarry Smith #undef __FUNCT__
7465c6c1daeSBarry Smith #define __FUNCT__ "PetscBagCreate"
7475c6c1daeSBarry Smith /*@
7485c6c1daeSBarry Smith     PetscBagCreate - Create a bag of values
7495c6c1daeSBarry Smith 
7505c6c1daeSBarry Smith   Collective on MPI_Comm
7515c6c1daeSBarry Smith 
7525c6c1daeSBarry Smith   Level: Intermediate
7535c6c1daeSBarry Smith 
7545c6c1daeSBarry Smith   Input Parameters:
7555c6c1daeSBarry Smith +  comm - communicator to share bag
7565c6c1daeSBarry Smith -  bagsize - size of the C structure holding the values
7575c6c1daeSBarry Smith 
7585c6c1daeSBarry Smith   Output Parameter:
7595c6c1daeSBarry Smith .   bag - the bag of values
7605c6c1daeSBarry Smith 
7615c6c1daeSBarry Smith    Notes:
7625c6c1daeSBarry Smith       The size of the A struct must be small enough to fit in a PetscInt; by default
7635c6c1daeSBarry Smith       PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length.
7645c6c1daeSBarry Smith       The warning about casting to a shorter length can be ignored below unless your A struct is too large
7655c6c1daeSBarry Smith 
7665c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
7675c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
7685c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
7695c6c1daeSBarry Smith @*/
7705c6c1daeSBarry Smith PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag)
7715c6c1daeSBarry Smith {
7725c6c1daeSBarry Smith   PetscErrorCode ierr;
7735c6c1daeSBarry Smith   size_t         totalsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar);
7745c6c1daeSBarry Smith 
7755c6c1daeSBarry Smith   PetscFunctionBegin;
7760298fd71SBarry Smith   ierr = PetscInfo1(NULL,"Creating Bag with total size %d\n",(int)totalsize);CHKERRQ(ierr);
7775c6c1daeSBarry Smith   ierr = PetscMalloc(totalsize,bag);CHKERRQ(ierr);
7785c6c1daeSBarry Smith   ierr = PetscMemzero(*bag,bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar));CHKERRQ(ierr);
779a297a907SKarl Rupp 
7805c6c1daeSBarry Smith   (*bag)->bagsize        = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar);
7815c6c1daeSBarry Smith   (*bag)->bagcomm        = comm;
7820298fd71SBarry Smith   (*bag)->bagprefix      = NULL;
7835c6c1daeSBarry Smith   (*bag)->structlocation = (void*)(((char*)(*bag)) + sizeof(PetscScalar)*(sizeof(struct _n_PetscBag)/sizeof(PetscScalar)) + sizeof(PetscScalar));
7845c6c1daeSBarry Smith   PetscFunctionReturn(0);
7855c6c1daeSBarry Smith }
7865c6c1daeSBarry Smith 
7875c6c1daeSBarry Smith #undef __FUNCT__
7885c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetName"
7895c6c1daeSBarry Smith /*@C
7905c6c1daeSBarry Smith     PetscBagSetName - Sets the name of a bag of values
7915c6c1daeSBarry Smith 
7925c6c1daeSBarry Smith   Not Collective
7935c6c1daeSBarry Smith 
7945c6c1daeSBarry Smith   Level: Intermediate
7955c6c1daeSBarry Smith 
7965c6c1daeSBarry Smith   Input Parameters:
7975c6c1daeSBarry Smith +   bag - the bag of values
7985c6c1daeSBarry Smith .   name - the name assigned to the bag
7995c6c1daeSBarry Smith -   help - help message for bag
8005c6c1daeSBarry Smith 
8015c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
8025c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
8035c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
8045c6c1daeSBarry Smith @*/
8055c6c1daeSBarry Smith 
8065c6c1daeSBarry Smith PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help)
8075c6c1daeSBarry Smith {
8085c6c1daeSBarry Smith   PetscErrorCode ierr;
8095fd66863SKarl Rupp 
8105c6c1daeSBarry Smith   PetscFunctionBegin;
8115c6c1daeSBarry Smith   ierr = PetscStrncpy(bag->bagname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
8125c6c1daeSBarry Smith   ierr = PetscStrncpy(bag->baghelp,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr);
8135c6c1daeSBarry Smith   PetscFunctionReturn(0);
8145c6c1daeSBarry Smith }
8155c6c1daeSBarry Smith 
8165c6c1daeSBarry Smith 
8175c6c1daeSBarry Smith #undef __FUNCT__
8185c6c1daeSBarry Smith #define __FUNCT__ "PetscBagGetName"
8195c6c1daeSBarry Smith /*@C
8205c6c1daeSBarry Smith     PetscBagGetName - Gets the name of a bag of values
8215c6c1daeSBarry Smith 
8225c6c1daeSBarry Smith   Not Collective
8235c6c1daeSBarry Smith 
8245c6c1daeSBarry Smith   Level: Intermediate
8255c6c1daeSBarry Smith 
8265c6c1daeSBarry Smith   Input Parameter:
8275c6c1daeSBarry Smith .   bag - the bag of values
8285c6c1daeSBarry Smith 
8295c6c1daeSBarry Smith   Output Parameter:
8305c6c1daeSBarry Smith .   name - the name assigned to the bag
8315c6c1daeSBarry Smith 
8325c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
8335c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
8345c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
8355c6c1daeSBarry Smith @*/
8365c6c1daeSBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, char **name)
8375c6c1daeSBarry Smith {
8385c6c1daeSBarry Smith   PetscFunctionBegin;
8395c6c1daeSBarry Smith   *name = bag->bagname;
8405c6c1daeSBarry Smith   PetscFunctionReturn(0);
8415c6c1daeSBarry Smith }
8425c6c1daeSBarry Smith 
8435c6c1daeSBarry Smith #undef __FUNCT__
8445c6c1daeSBarry Smith #define __FUNCT__ "PetscBagGetData"
8455c6c1daeSBarry Smith /*@C
8465c6c1daeSBarry Smith     PetscBagGetData - Gives back the user - access to memory that
8475c6c1daeSBarry Smith     should be used for storing user-data-structure
8485c6c1daeSBarry Smith 
8495c6c1daeSBarry Smith   Not Collective
8505c6c1daeSBarry Smith 
8515c6c1daeSBarry Smith   Level: Intermediate
8525c6c1daeSBarry Smith 
8535c6c1daeSBarry Smith   Input Parameter:
8545c6c1daeSBarry Smith .   bag - the bag of values
8555c6c1daeSBarry Smith 
8565c6c1daeSBarry Smith   Output Parameter:
8575c6c1daeSBarry Smith .   data - pointer to memory that will have user-data-structure
8585c6c1daeSBarry Smith 
8595c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad()
8605c6c1daeSBarry Smith            PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
8615c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
8625c6c1daeSBarry Smith @*/
8635c6c1daeSBarry Smith PetscErrorCode PetscBagGetData(PetscBag bag, void **data)
8645c6c1daeSBarry Smith {
8655c6c1daeSBarry Smith   PetscFunctionBegin;
8665c6c1daeSBarry Smith   *data = bag->structlocation;
8675c6c1daeSBarry Smith   PetscFunctionReturn(0);
8685c6c1daeSBarry Smith }
8695c6c1daeSBarry Smith 
8705c6c1daeSBarry Smith #undef __FUNCT__
8715c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetOptionsPrefix"
8725c6c1daeSBarry Smith /*@C
8735c6c1daeSBarry Smith   PetscBagSetOptionsPrefix - Sets the prefix used for searching for all
8745c6c1daeSBarry Smith   PetscBag items in the options database.
8755c6c1daeSBarry Smith 
8765c6c1daeSBarry Smith   Logically collective on Bag.
8775c6c1daeSBarry Smith 
8785c6c1daeSBarry Smith   Level: Intermediate
8795c6c1daeSBarry Smith 
8805c6c1daeSBarry Smith   Input Parameters:
8815c6c1daeSBarry Smith +   bag - the bag of values
8825c6c1daeSBarry Smith -   prefix - the prefix to prepend all Bag item names with.
8835c6c1daeSBarry Smith 
8845c6c1daeSBarry Smith   NOTES: Must be called prior to registering any of the bag items.
8855c6c1daeSBarry Smith 
8865c6c1daeSBarry Smith .seealso: PetscBag, PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar()
8875c6c1daeSBarry Smith            PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
8885c6c1daeSBarry Smith @*/
8895c6c1daeSBarry Smith 
8905c6c1daeSBarry Smith PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[])
8915c6c1daeSBarry Smith {
8925c6c1daeSBarry Smith   PetscErrorCode ierr;
8935fd66863SKarl Rupp 
8945c6c1daeSBarry Smith   PetscFunctionBegin;
8955c6c1daeSBarry Smith   if (!pre) {
8965c6c1daeSBarry Smith     ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr);
8975c6c1daeSBarry Smith   } else {
8985c6c1daeSBarry Smith     if (pre[0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hypen");
8995c6c1daeSBarry Smith     ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr);
9005c6c1daeSBarry Smith     ierr = PetscStrallocpy(pre,&(bag->bagprefix));CHKERRQ(ierr);
9015c6c1daeSBarry Smith   }
9025c6c1daeSBarry Smith   PetscFunctionReturn(0);
9035c6c1daeSBarry Smith }
904