xref: /petsc/src/sys/classes/bag/bag.c (revision c2e3fba1fe1cda7e6350bbca19c4ed35ce95940a)
15f80ce2aSJacob Faibussowitsch #include <petsc/private/petscimpl.h>
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   PetscFunctionBegin;
119566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(item->name,name,PETSC_BAG_NAME_LENGTH-1));
129566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(item->help,help,PETSC_BAG_HELP_LENGTH-1));
135f80ce2aSJacob Faibussowitsch   if (bag->bagitems) {
145c6c1daeSBarry Smith     PetscBagItem nitem = bag->bagitems;
155f80ce2aSJacob Faibussowitsch 
165f80ce2aSJacob Faibussowitsch     while (nitem->next) nitem = nitem->next;
175c6c1daeSBarry Smith     nitem->next = item;
185f80ce2aSJacob Faibussowitsch   } else bag->bagitems = item;
195c6c1daeSBarry Smith   bag->count++;
205c6c1daeSBarry Smith   PetscFunctionReturn(0);
215c6c1daeSBarry Smith }
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith /*@C
245c6c1daeSBarry Smith    PetscBagRegisterEnum - add an enum value to the bag
255c6c1daeSBarry Smith 
265c6c1daeSBarry Smith    Logically Collective on PetscBag
275c6c1daeSBarry Smith 
28d8d19677SJose E. Roman    Input Parameters:
295c6c1daeSBarry Smith +  bag - the bag of values
305c6c1daeSBarry Smith .  addr - location of enum in struct
315c6c1daeSBarry Smith .  mdefault - the initial value
325c6c1daeSBarry Smith .  list - array of strings containing names of enum values followed by enum name followed by enum prefix
335c6c1daeSBarry Smith -  help - longer string with more information about the value
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith    Level: beginner
365c6c1daeSBarry Smith 
37db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
38db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
39db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`
405c6c1daeSBarry Smith 
415c6c1daeSBarry Smith @*/
425c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterEnum(PetscBag bag,void *addr,const char *const *list,PetscEnum mdefault, const char *name, const char *help)
435c6c1daeSBarry Smith {
445c6c1daeSBarry Smith   PetscBagItem   item;
455c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
465c6c1daeSBarry Smith   PetscBool      printhelp;
475c6c1daeSBarry Smith   PetscInt       i = 0;
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith   PetscFunctionBegin;
505f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
515f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr,2);
525f80ce2aSJacob Faibussowitsch   PetscValidPointer(list,3);
535f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name,5);
545f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help,6);
555c6c1daeSBarry Smith   nname[0] = '-';
565c6c1daeSBarry Smith   nname[1] = 0;
579566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH));
589566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL,&printhelp));
595c6c1daeSBarry Smith   if (printhelp) {
605c6c1daeSBarry Smith     while (list[i++]) ;
619566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%s>: (%s) %s (choose one of) ",bag->bagprefix ? bag->bagprefix : "",name,list[mdefault],list[i-3],help));
629566063dSJacob Faibussowitsch     for (i=0; list[i+2]; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm," %s",list[i]));
639566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"\n"));
645c6c1daeSBarry Smith   }
659566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetEnum(NULL,bag->bagprefix,nname,list,&mdefault,NULL));
665c6c1daeSBarry Smith 
679566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
685c6c1daeSBarry Smith   item->dtype  = PETSC_ENUM;
695c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
705f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
7102c9f0b5SLisandro Dalcin   item->next  = NULL;
725c6c1daeSBarry Smith   item->msize = 1;
739566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(list,(char***)&item->list));
745c6c1daeSBarry Smith   *(PetscEnum*)addr = mdefault;
759566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag,item,name,help));
765c6c1daeSBarry Smith   PetscFunctionReturn(0);
775c6c1daeSBarry Smith }
785c6c1daeSBarry Smith 
795c6c1daeSBarry Smith /*@C
805c6c1daeSBarry Smith    PetscBagRegisterIntArray - add an integer value to the bag
815c6c1daeSBarry Smith 
825c6c1daeSBarry Smith    Logically Collective on PetscBag
835c6c1daeSBarry Smith 
84d8d19677SJose E. Roman    Input Parameters:
855c6c1daeSBarry Smith +  bag - the bag of values
865c6c1daeSBarry Smith .  addr - location of integer in struct
875c6c1daeSBarry Smith .  msize - number of entries in array
885c6c1daeSBarry Smith .  name - name of the integer array
895c6c1daeSBarry Smith -  help - longer string with more information about the value
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith    Level: beginner
925c6c1daeSBarry Smith 
93db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
94db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
95db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
965c6c1daeSBarry Smith 
975c6c1daeSBarry Smith @*/
985c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterIntArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help)
995c6c1daeSBarry Smith {
1005c6c1daeSBarry Smith   PetscBagItem   item;
1015c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
1025c6c1daeSBarry Smith   PetscBool      printhelp;
1035c6c1daeSBarry Smith   PetscInt       i,tmp = msize;
1045c6c1daeSBarry Smith 
1055c6c1daeSBarry Smith   PetscFunctionBegin;
1065f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
1075f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr,2);
1085f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name,4);
1095f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help,5);
1105c6c1daeSBarry Smith   nname[0] = '-';
1115c6c1daeSBarry Smith   nname[1] = 0;
1129566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH));
1139566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL,&printhelp));
1145c6c1daeSBarry Smith   if (printhelp) {
1159566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <",bag->bagprefix ? bag->bagprefix : "",name));
1165c6c1daeSBarry Smith     for (i=0; i<msize; i++) {
1179566063dSJacob Faibussowitsch       PetscCall((*PetscHelpPrintf)(bag->bagcomm,"%" PetscInt_FMT " ",*((PetscInt*)addr)+i));
1185c6c1daeSBarry Smith     }
1199566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help));
1205c6c1daeSBarry Smith   }
1219566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetIntArray(NULL,bag->bagprefix,nname,(PetscInt*)addr,&tmp,NULL));
1225c6c1daeSBarry Smith 
1239566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
1245c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
1255c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
1265f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
12702c9f0b5SLisandro Dalcin   item->next  = NULL;
1285c6c1daeSBarry Smith   item->msize = msize;
1299566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag,item,name,help));
1305c6c1daeSBarry Smith   PetscFunctionReturn(0);
1315c6c1daeSBarry Smith }
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith /*@C
1345c6c1daeSBarry Smith    PetscBagRegisterRealArray - add an real array to the bag
1355c6c1daeSBarry Smith 
1365c6c1daeSBarry Smith    Logically Collective on PetscBag
1375c6c1daeSBarry Smith 
138d8d19677SJose E. Roman    Input Parameters:
1395c6c1daeSBarry Smith +  bag - the bag of values
1405c6c1daeSBarry Smith .  addr - location of real array in struct
1415c6c1daeSBarry Smith .  msize - number of entries in array
1425c6c1daeSBarry Smith .  name - name of the integer array
1435c6c1daeSBarry Smith -  help - longer string with more information about the value
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith    Level: beginner
1465c6c1daeSBarry Smith 
147db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
148db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
149db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
1505c6c1daeSBarry Smith 
1515c6c1daeSBarry Smith @*/
1525c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterRealArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help)
1535c6c1daeSBarry Smith {
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;
1605f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
1615f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr,2);
1625f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name,4);
1635f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help,5);
1645c6c1daeSBarry Smith   nname[0] = '-';
1655c6c1daeSBarry Smith   nname[1] = 0;
1669566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH));
1679566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL,&printhelp));
1685c6c1daeSBarry Smith   if (printhelp) {
1699566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <",bag->bagprefix ? bag->bagprefix : "",name));
1705c6c1daeSBarry Smith     for (i=0; i<msize; i++) {
1719566063dSJacob Faibussowitsch       PetscCall((*PetscHelpPrintf)(bag->bagcomm,"%g ",(double)*((PetscReal*)addr)+i));
1725c6c1daeSBarry Smith     }
1739566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help));
1745c6c1daeSBarry Smith   }
1759566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetRealArray(NULL,bag->bagprefix,nname,(PetscReal*)addr,&tmp,NULL));
1765c6c1daeSBarry Smith 
1779566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
1785c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
1795c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
1805f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
18102c9f0b5SLisandro Dalcin   item->next  = NULL;
1825c6c1daeSBarry Smith   item->msize = msize;
1839566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag,item,name,help));
1845c6c1daeSBarry Smith   PetscFunctionReturn(0);
1855c6c1daeSBarry Smith }
1865c6c1daeSBarry Smith 
1875c6c1daeSBarry Smith /*@C
1885c6c1daeSBarry Smith    PetscBagRegisterInt - add an integer value to the bag
1895c6c1daeSBarry Smith 
1905c6c1daeSBarry Smith    Logically Collective on PetscBag
1915c6c1daeSBarry Smith 
192d8d19677SJose E. Roman    Input Parameters:
1935c6c1daeSBarry Smith +  bag - the bag of values
1945c6c1daeSBarry Smith .  addr - location of integer in struct
1955c6c1daeSBarry Smith .  mdefault - the initial value
1965c6c1daeSBarry Smith .  name - name of the integer
1975c6c1daeSBarry Smith -  help - longer string with more information about the value
1985c6c1daeSBarry Smith 
1995c6c1daeSBarry Smith    Level: beginner
2005c6c1daeSBarry Smith 
201db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
202db781477SPatrick Sanan           `PetscBagRegisterInt64()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
203db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
2045c6c1daeSBarry Smith 
2055c6c1daeSBarry Smith @*/
2065c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterInt(PetscBag bag,void *addr,PetscInt mdefault,const char *name,const char *help)
2075c6c1daeSBarry Smith {
2085c6c1daeSBarry Smith   PetscBagItem   item;
2095c6c1daeSBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
2105c6c1daeSBarry Smith   PetscBool      printhelp;
2115c6c1daeSBarry Smith 
2125c6c1daeSBarry Smith   PetscFunctionBegin;
2135f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
2145f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr,2);
2155f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name,4);
2165f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help,5);
2175c6c1daeSBarry Smith   nname[0] = '-';
2185c6c1daeSBarry Smith   nname[1] = 0;
2199566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH));
2209566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL,&printhelp));
2215c6c1daeSBarry Smith   if (printhelp) {
2229566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%" PetscInt_FMT ">: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help));
2235c6c1daeSBarry Smith   }
2249566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL,bag->bagprefix,nname,&mdefault,NULL));
2255c6c1daeSBarry Smith 
2269566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
2275c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
2285c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
2295f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
23002c9f0b5SLisandro Dalcin   item->next       = NULL;
2315c6c1daeSBarry Smith   item->msize      = 1;
2325c6c1daeSBarry Smith   *(PetscInt*)addr = mdefault;
2339566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag,item,name,help));
2345c6c1daeSBarry Smith   PetscFunctionReturn(0);
2355c6c1daeSBarry Smith }
2365c6c1daeSBarry Smith 
2370d349d43SBarry Smith /*@C
238bafee8b4SSatish Balay    PetscBagRegisterInt64 - add an integer value to the bag
2390d349d43SBarry Smith 
2400d349d43SBarry Smith    Logically Collective on PetscBag
2410d349d43SBarry Smith 
242d8d19677SJose E. Roman    Input Parameters:
2430d349d43SBarry Smith +  bag - the bag of values
2440d349d43SBarry Smith .  addr - location of integer in struct
2450d349d43SBarry Smith .  mdefault - the initial value
2460d349d43SBarry Smith .  name - name of the integer
2470d349d43SBarry Smith -  help - longer string with more information about the value
2480d349d43SBarry Smith 
2490d349d43SBarry Smith    Level: beginner
2500d349d43SBarry Smith 
251db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
252db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
253db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
2540d349d43SBarry Smith 
2550d349d43SBarry Smith @*/
256bafee8b4SSatish Balay PetscErrorCode PetscBagRegisterInt64(PetscBag bag,void *addr,PetscInt64 mdefault,const char *name,const char *help)
2570d349d43SBarry Smith {
2580d349d43SBarry Smith   PetscBagItem   item;
2590d349d43SBarry Smith   char           nname[PETSC_BAG_NAME_LENGTH+1];
2600d349d43SBarry Smith   PetscBool      printhelp;
2610d349d43SBarry Smith   PetscInt       odefault = (PetscInt)mdefault;
2620d349d43SBarry Smith   PetscBool      flg;
2630d349d43SBarry Smith 
2640d349d43SBarry Smith   PetscFunctionBegin;
2650d349d43SBarry Smith   nname[0] = '-';
2660d349d43SBarry Smith   nname[1] = 0;
2679566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH));
2689566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL,&printhelp));
2690d349d43SBarry Smith   if (printhelp) {
2709566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%" PetscInt_FMT ">: %s \n",bag->bagprefix ? bag->bagprefix : "",name,odefault,help));
2710d349d43SBarry Smith   }
2729566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL,bag->bagprefix,nname,&odefault,&flg));
273bafee8b4SSatish Balay   if (flg) mdefault = (PetscInt64)odefault;
2740d349d43SBarry Smith 
2759566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
2760d349d43SBarry Smith   item->dtype  = PETSC_INT;
2770d349d43SBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
2785f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
27902c9f0b5SLisandro Dalcin   item->next       = NULL;
2800d349d43SBarry Smith   item->msize      = 1;
281bafee8b4SSatish Balay   *(PetscInt64*)addr = mdefault;
2829566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag,item,name,help));
2830d349d43SBarry Smith   PetscFunctionReturn(0);
2840d349d43SBarry Smith }
2850d349d43SBarry Smith 
286dd66f111SBlaise Bourdin /*@C
287dd66f111SBlaise Bourdin    PetscBagRegisterBoolArray - add a n logical values to the bag
288dd66f111SBlaise Bourdin 
289dd66f111SBlaise Bourdin    Logically Collective on PetscBag
290dd66f111SBlaise Bourdin 
291d8d19677SJose E. Roman    Input Parameters:
292dd66f111SBlaise Bourdin +  bag - the bag of values
293dd66f111SBlaise Bourdin .  addr - location of boolean array in struct
294dd66f111SBlaise Bourdin .  msize - number of entries in array
295dd66f111SBlaise Bourdin .  name - name of the boolean array
296dd66f111SBlaise Bourdin -  help - longer string with more information about the value
297dd66f111SBlaise Bourdin 
298dd66f111SBlaise Bourdin    Level: beginner
299dd66f111SBlaise Bourdin 
300db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
301db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
302db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
303dd66f111SBlaise Bourdin 
304dd66f111SBlaise Bourdin @*/
305dd66f111SBlaise Bourdin PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag,void *addr,PetscInt msize, const char* name, const char* help)
306dd66f111SBlaise Bourdin {
307dd66f111SBlaise Bourdin   PetscBagItem   item;
308dd66f111SBlaise Bourdin   char           nname[PETSC_BAG_NAME_LENGTH+1];
309dd66f111SBlaise Bourdin   PetscBool      printhelp;
310dd66f111SBlaise Bourdin   PetscInt       i,tmp = msize;
311dd66f111SBlaise Bourdin 
312dd66f111SBlaise Bourdin   PetscFunctionBegin;
3135f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
3145f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr,2);
3155f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name,4);
3165f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help,5);
317dd66f111SBlaise Bourdin   nname[0] = '-';
318dd66f111SBlaise Bourdin   nname[1] = 0;
3199566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH));
3209566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL,&printhelp));
321dd66f111SBlaise Bourdin   if (printhelp) {
3229566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <",bag->bagprefix?bag->bagprefix:"",name));
323dd66f111SBlaise Bourdin     for (i=0; i<msize; i++) {
3249566063dSJacob Faibussowitsch       PetscCall((*PetscHelpPrintf)(bag->bagcomm,"%" PetscInt_FMT " ",*((PetscInt*)addr)+i));
325dd66f111SBlaise Bourdin     }
3269566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help));
327dd66f111SBlaise Bourdin   }
3289566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBoolArray(NULL,bag->bagprefix,nname,(PetscBool*)addr,&tmp,NULL));
329dd66f111SBlaise Bourdin 
3309566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
331dd66f111SBlaise Bourdin   item->dtype  = PETSC_BOOL;
332dd66f111SBlaise Bourdin   item->offset = ((char*)addr) - ((char*)bag);
3335f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
33402c9f0b5SLisandro Dalcin   item->next   = NULL;
335dd66f111SBlaise Bourdin   item->msize  = msize;
3369566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag,item,name,help));
337dd66f111SBlaise Bourdin   PetscFunctionReturn(0);
338dd66f111SBlaise Bourdin }
339dd66f111SBlaise Bourdin 
3405c6c1daeSBarry Smith /*@C
3415c6c1daeSBarry Smith    PetscBagRegisterString - add a string value to the bag
3425c6c1daeSBarry Smith 
3435c6c1daeSBarry Smith    Logically Collective on PetscBag
3445c6c1daeSBarry Smith 
345d8d19677SJose E. Roman    Input Parameters:
3465c6c1daeSBarry Smith +  bag - the bag of values
3475c6c1daeSBarry Smith .  addr - location of start of string in struct
3485c6c1daeSBarry Smith .  msize - length of the string space in the struct
3495c6c1daeSBarry Smith .  mdefault - the initial value
3505c6c1daeSBarry Smith .  name - name of the string
3515c6c1daeSBarry Smith -  help - longer string with more information about the value
3525c6c1daeSBarry Smith 
3535c6c1daeSBarry Smith    Level: beginner
3545c6c1daeSBarry Smith 
3555c6c1daeSBarry Smith    Note: The struct should have the field char mystring[msize]; not char *mystring
3565c6c1daeSBarry Smith 
357db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
358db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
359*c2e3fba1SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
3605c6c1daeSBarry Smith 
3615c6c1daeSBarry Smith @*/
3625c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* mdefault,const char* name,const char* help)
3635c6c1daeSBarry Smith {
3645c6c1daeSBarry Smith   PetscBagItem item;
3655c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH+1];
3665c6c1daeSBarry Smith   PetscBool    printhelp;
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith   PetscFunctionBegin;
3695f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
3705f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr,2);
3715f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(mdefault,4);
3725f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name,5);
3735f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help,6);
3745c6c1daeSBarry Smith   nname[0] = '-';
3755c6c1daeSBarry Smith   nname[1] = 0;
3769566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH));
3779566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL,&printhelp));
3785c6c1daeSBarry Smith   if (printhelp) {
3799566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help));
3805c6c1daeSBarry Smith   }
3815c6c1daeSBarry Smith 
3829566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
3835c6c1daeSBarry Smith   item->dtype  = PETSC_CHAR;
3845c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
3855f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
38602c9f0b5SLisandro Dalcin   item->next  = NULL;
3875c6c1daeSBarry Smith   item->msize = msize;
3885c6c1daeSBarry Smith   if (mdefault != (char*)addr) {
3899566063dSJacob Faibussowitsch     PetscCall(PetscStrncpy((char*)addr,mdefault,msize-1));
3905c6c1daeSBarry Smith   }
3919566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL,bag->bagprefix,nname,(char*)addr,msize,NULL));
3929566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag,item,name,help));
3935c6c1daeSBarry Smith   PetscFunctionReturn(0);
3945c6c1daeSBarry Smith }
3955c6c1daeSBarry Smith 
3965c6c1daeSBarry Smith /*@C
3975c6c1daeSBarry Smith    PetscBagRegisterReal - add a real value to the bag
3985c6c1daeSBarry Smith 
3995c6c1daeSBarry Smith    Logically Collective on PetscBag
4005c6c1daeSBarry Smith 
401d8d19677SJose E. Roman    Input Parameters:
4025c6c1daeSBarry Smith +  bag - the bag of values
4035c6c1daeSBarry Smith .  addr - location of double in struct
4045c6c1daeSBarry Smith .  mdefault - the initial value
4055c6c1daeSBarry Smith .  name - name of the variable
4065c6c1daeSBarry Smith -  help - longer string with more information about the value
4075c6c1daeSBarry Smith 
4085c6c1daeSBarry Smith    Level: beginner
4095c6c1daeSBarry Smith 
410db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
411db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
412db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
4135c6c1daeSBarry Smith 
4145c6c1daeSBarry Smith @*/
4155c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterReal(PetscBag bag,void *addr,PetscReal mdefault, const char *name, const char *help)
4165c6c1daeSBarry Smith {
4175c6c1daeSBarry Smith   PetscBagItem item;
4185c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH+1];
4195c6c1daeSBarry Smith   PetscBool    printhelp;
4205c6c1daeSBarry Smith 
4215c6c1daeSBarry Smith   PetscFunctionBegin;
4225f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
4235f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr,2);
4245f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name,4);
4255f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help,5);
4265c6c1daeSBarry Smith   nname[0] = '-';
4275c6c1daeSBarry Smith   nname[1] = 0;
4289566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH));
4299566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL,&printhelp));
4305c6c1daeSBarry Smith   if (printhelp) {
4319566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%g>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)mdefault,help));
4325c6c1daeSBarry Smith   }
4339566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetReal(NULL,bag->bagprefix,nname,&mdefault,NULL));
4345c6c1daeSBarry Smith 
4359566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4365c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
4375c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
4385f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
43902c9f0b5SLisandro Dalcin   item->next        = NULL;
4405c6c1daeSBarry Smith   item->msize       = 1;
4415c6c1daeSBarry Smith   *(PetscReal*)addr = mdefault;
4429566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag,item,name,help));
4435c6c1daeSBarry Smith   PetscFunctionReturn(0);
4445c6c1daeSBarry Smith }
4455c6c1daeSBarry Smith 
4465c6c1daeSBarry Smith /*@C
4475c6c1daeSBarry Smith    PetscBagRegisterScalar - add a real or complex number value to the bag
4485c6c1daeSBarry Smith 
4495c6c1daeSBarry Smith    Logically Collective on PetscBag
4505c6c1daeSBarry Smith 
451d8d19677SJose E. Roman    Input Parameters:
4525c6c1daeSBarry Smith +  bag - the bag of values
4535c6c1daeSBarry Smith .  addr - location of scalar in struct
4545c6c1daeSBarry Smith .  mdefault - the initial value
4555c6c1daeSBarry Smith .  name - name of the variable
4565c6c1daeSBarry Smith -  help - longer string with more information about the value
4575c6c1daeSBarry Smith 
4585c6c1daeSBarry Smith    Level: beginner
4595c6c1daeSBarry Smith 
460db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
461db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
462db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
4635c6c1daeSBarry Smith 
4645c6c1daeSBarry Smith @*/
4655c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar mdefault,const char *name,const char *help)
4665c6c1daeSBarry Smith {
4675c6c1daeSBarry Smith   PetscBagItem item;
4685c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH+1];
4695c6c1daeSBarry Smith   PetscBool    printhelp;
4705c6c1daeSBarry Smith 
4715c6c1daeSBarry Smith   PetscFunctionBegin;
4725f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
4735f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr,2);
4745f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name,4);
4755f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help,5);
4765c6c1daeSBarry Smith   nname[0] = '-';
4775c6c1daeSBarry Smith   nname[1] = 0;
4789566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH));
4799566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL,&printhelp));
4805c6c1daeSBarry Smith   if (printhelp) {
4819566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%g + %gi>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)PetscRealPart(mdefault),(double)PetscImaginaryPart(mdefault),help));
4825c6c1daeSBarry Smith   }
4839566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetScalar(NULL,bag->bagprefix,nname,&mdefault,NULL));
4845c6c1daeSBarry Smith 
4859566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4865c6c1daeSBarry Smith   item->dtype  = PETSC_SCALAR;
4875c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
4885f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
48902c9f0b5SLisandro Dalcin   item->next          = NULL;
4905c6c1daeSBarry Smith   item->msize         = 1;
4915c6c1daeSBarry Smith   *(PetscScalar*)addr = mdefault;
4929566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag,item,name,help));
4935c6c1daeSBarry Smith   PetscFunctionReturn(0);
4945c6c1daeSBarry Smith }
4955c6c1daeSBarry Smith 
4965c6c1daeSBarry Smith /*@C
4975c6c1daeSBarry Smith    PetscBagRegisterBool - add a logical value to the bag
4985c6c1daeSBarry Smith 
4995c6c1daeSBarry Smith    Logically Collective on PetscBag
5005c6c1daeSBarry Smith 
501d8d19677SJose E. Roman    Input Parameters:
5025c6c1daeSBarry Smith +  bag - the bag of values
5035c6c1daeSBarry Smith .  addr - location of logical in struct
5045c6c1daeSBarry Smith .  mdefault - the initial value
5055c6c1daeSBarry Smith .  name - name of the variable
5065c6c1daeSBarry Smith -  help - longer string with more information about the value
5075c6c1daeSBarry Smith 
5085c6c1daeSBarry Smith    Level: beginner
5095c6c1daeSBarry Smith 
510db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
511db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
512db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
5135c6c1daeSBarry Smith 
5145c6c1daeSBarry Smith @*/
5155c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterBool(PetscBag bag,void *addr,PetscBool mdefault,const char *name,const char *help)
5165c6c1daeSBarry Smith {
5175c6c1daeSBarry Smith   PetscBagItem item;
5185c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH+1];
5195c6c1daeSBarry Smith   PetscBool    printhelp;
5205c6c1daeSBarry Smith 
5215c6c1daeSBarry Smith   PetscFunctionBegin;
5225f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
5235f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr,2);
5245f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name,4);
5255f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help,5);
5265c6c1daeSBarry 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 */
5275f80ce2aSJacob Faibussowitsch   PetscCheck(mdefault == PETSC_FALSE || mdefault == PETSC_TRUE,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Boolean %s %s must be boolean; integer value %d",name,help,(int)mdefault);
5285c6c1daeSBarry Smith   nname[0] = '-';
5295c6c1daeSBarry Smith   nname[1] = 0;
5309566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH));
5319566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL,&printhelp));
5325c6c1daeSBarry Smith   if (printhelp) {
5339566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm,"  -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,PetscBools[mdefault],help));
5345c6c1daeSBarry Smith   }
5359566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL,bag->bagprefix,nname,&mdefault,NULL));
5365c6c1daeSBarry Smith 
5379566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
5385c6c1daeSBarry Smith   item->dtype  = PETSC_BOOL;
5395c6c1daeSBarry Smith   item->offset = ((char*)addr) - ((char*)bag);
5405f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help);
54102c9f0b5SLisandro Dalcin   item->next        = NULL;
5425c6c1daeSBarry Smith   item->msize       = 1;
5435c6c1daeSBarry Smith   *(PetscBool*)addr = mdefault;
5449566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag,item,name,help));
5455c6c1daeSBarry Smith   PetscFunctionReturn(0);
5465c6c1daeSBarry Smith }
5475c6c1daeSBarry Smith 
5485c6c1daeSBarry Smith /*@C
5495c6c1daeSBarry Smith    PetscBagDestroy - Destroys a bag values
5505c6c1daeSBarry Smith 
5515c6c1daeSBarry Smith    Collective on PetscBag
5525c6c1daeSBarry Smith 
5535c6c1daeSBarry Smith    Input Parameter:
5545c6c1daeSBarry Smith .  bag - the bag of values
5555c6c1daeSBarry Smith 
5565c6c1daeSBarry Smith    Level: beginner
5575c6c1daeSBarry Smith 
558db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
559db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
560db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
5615c6c1daeSBarry Smith 
5625c6c1daeSBarry Smith @*/
5635c6c1daeSBarry Smith PetscErrorCode  PetscBagDestroy(PetscBag *bag)
5645c6c1daeSBarry Smith {
5655f80ce2aSJacob Faibussowitsch   PetscBagItem nitem;
5665c6c1daeSBarry Smith 
5675c6c1daeSBarry Smith   PetscFunctionBegin;
5685f80ce2aSJacob Faibussowitsch   if (!*bag) PetscFunctionReturn(0);
5695f80ce2aSJacob Faibussowitsch   PetscValidPointer(*bag,1);
5705f80ce2aSJacob Faibussowitsch   nitem = (*bag)->bagitems;
5715c6c1daeSBarry Smith   while (nitem) {
5725f80ce2aSJacob Faibussowitsch     PetscBagItem item = nitem->next;
5735f80ce2aSJacob Faibussowitsch 
5749566063dSJacob Faibussowitsch     if (nitem->list) PetscCall(PetscStrArrayDestroy(&nitem->list));
5759566063dSJacob Faibussowitsch     PetscCall(PetscFree(nitem));
5765c6c1daeSBarry Smith     nitem = item;
5775c6c1daeSBarry Smith   }
5789566063dSJacob Faibussowitsch   if ((*bag)->bagprefix) PetscCall(PetscFree((*bag)->bagprefix));
5799566063dSJacob Faibussowitsch   PetscCall(PetscFree(*bag));
5805c6c1daeSBarry Smith   PetscFunctionReturn(0);
5815c6c1daeSBarry Smith }
5825c6c1daeSBarry Smith 
5835c6c1daeSBarry Smith /*@
5845c6c1daeSBarry Smith    PetscBagSetFromOptions - Allows setting options from a bag
5855c6c1daeSBarry Smith 
5865c6c1daeSBarry Smith    Collective on PetscBag
5875c6c1daeSBarry Smith 
5885c6c1daeSBarry Smith    Input Parameter:
5895c6c1daeSBarry Smith .  bag - the bag of values
5905c6c1daeSBarry Smith 
5915c6c1daeSBarry Smith    Level: beginner
5925c6c1daeSBarry Smith 
593db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()`
594db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
595db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagRegisterEnum()`
5965c6c1daeSBarry Smith 
5975c6c1daeSBarry Smith @*/
5985c6c1daeSBarry Smith PetscErrorCode  PetscBagSetFromOptions(PetscBag bag)
5995c6c1daeSBarry Smith {
6005c6c1daeSBarry Smith   PetscBagItem   nitem = bag->bagitems;
6015c6c1daeSBarry Smith   char           name[PETSC_BAG_NAME_LENGTH+1],helpname[PETSC_BAG_NAME_LENGTH+PETSC_BAG_HELP_LENGTH+3];
6025c6c1daeSBarry Smith   PetscInt       n;
6035c6c1daeSBarry Smith 
6045c6c1daeSBarry Smith   PetscFunctionBegin;
6055f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
6069566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(helpname,bag->bagname,sizeof(helpname)));
6079566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(helpname," ",sizeof(helpname)));
6089566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(helpname,bag->baghelp,sizeof(helpname)));
609d0609cedSBarry Smith   PetscOptionsBegin(bag->bagcomm,bag->bagprefix,helpname,NULL);
6105c6c1daeSBarry Smith   while (nitem) {
6115c6c1daeSBarry Smith     name[0] = '-';
6125c6c1daeSBarry Smith     name[1] = 0;
6139566063dSJacob Faibussowitsch     PetscCall(PetscStrlcat(name,nitem->name,sizeof(name)));
6145c6c1daeSBarry Smith     if (nitem->dtype == PETSC_CHAR) {   /* special handling for fortran required? [due to space padding vs null termination] */
6155c6c1daeSBarry Smith       char *value = (char*)(((char*)bag) + nitem->offset);
6169566063dSJacob Faibussowitsch       PetscCall(PetscOptionsString(name,nitem->help,"",value,value,nitem->msize,NULL));
6175c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_REAL) {
6185c6c1daeSBarry Smith       PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset);
6195c6c1daeSBarry Smith       if (nitem->msize == 1) {
6209566063dSJacob Faibussowitsch         PetscCall(PetscOptionsReal(name,nitem->help,"",*value,value,NULL));
6215c6c1daeSBarry Smith       } else {
6225c6c1daeSBarry Smith         n    = nitem->msize;
6239566063dSJacob Faibussowitsch         PetscCall(PetscOptionsRealArray(name,nitem->help,"",value,&n,NULL));
6245c6c1daeSBarry Smith       }
6255c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_SCALAR) {
6265c6c1daeSBarry Smith       PetscScalar *value = (PetscScalar*)(((char*)bag) + nitem->offset);
6279566063dSJacob Faibussowitsch       PetscCall(PetscOptionsScalar(name,nitem->help,"",*value,value,NULL));
6285c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_INT) {
6295c6c1daeSBarry Smith       PetscInt *value = (PetscInt*)(((char*)bag) + nitem->offset);
6305c6c1daeSBarry Smith       if (nitem->msize == 1) {
6319566063dSJacob Faibussowitsch         PetscCall(PetscOptionsInt(name,nitem->help,"",*value,value,NULL));
6325c6c1daeSBarry Smith       } else {
6335c6c1daeSBarry Smith         n    = nitem->msize;
6349566063dSJacob Faibussowitsch         PetscCall(PetscOptionsIntArray(name,nitem->help,"",value,&n,NULL));
6355c6c1daeSBarry Smith       }
6365c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_ENUM) {
6375c6c1daeSBarry Smith       PetscEnum *value = (PetscEnum*)(((char*)bag) + nitem->offset);
6385c6c1daeSBarry Smith       PetscInt  i      = 0;
6395c6c1daeSBarry Smith       while (nitem->list[i++]) ;
6409566063dSJacob Faibussowitsch       PetscCall(PetscOptionsEnum(name,nitem->help,nitem->list[i-3],(const char*const*)nitem->list,*value,value,NULL));
6415c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_BOOL) {
6425c6c1daeSBarry Smith       PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset);
643dd66f111SBlaise Bourdin       if (nitem->msize == 1) {
6449566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBool(name,nitem->help,"",*value,value,NULL));
645dd66f111SBlaise Bourdin       } else {
646dd66f111SBlaise Bourdin         n = nitem->msize;
6479566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBoolArray(name,nitem->help,"",value,&n,NULL));
648dd66f111SBlaise Bourdin       }
6495c6c1daeSBarry Smith     }
6505c6c1daeSBarry Smith     nitem = nitem->next;
6515c6c1daeSBarry Smith   }
652d0609cedSBarry Smith   PetscOptionsEnd();
6535c6c1daeSBarry Smith   PetscFunctionReturn(0);
6545c6c1daeSBarry Smith }
6555c6c1daeSBarry Smith 
6565c6c1daeSBarry Smith /*@C
6575c6c1daeSBarry Smith    PetscBagView - Views a bag of values as either ASCII text or a binary file
6585c6c1daeSBarry Smith 
6595c6c1daeSBarry Smith    Collective on PetscBag
6605c6c1daeSBarry Smith 
661d8d19677SJose E. Roman    Input Parameters:
6625c6c1daeSBarry Smith +  bag - the bag of values
6635c6c1daeSBarry Smith -  viewer - location to view the values
6645c6c1daeSBarry Smith 
6655c6c1daeSBarry Smith    Level: beginner
6665c6c1daeSBarry Smith 
6675c6c1daeSBarry Smith    Warning: Currently PETSc bags saved in a binary file can only be read back
6685c6c1daeSBarry Smith      in on a machine of the same architecture. Let us know when this is a problem
6695c6c1daeSBarry Smith      and we'll fix it.
6705c6c1daeSBarry Smith 
671db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()`
672db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
673db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`
6745c6c1daeSBarry Smith 
6755c6c1daeSBarry Smith @*/
6765c6c1daeSBarry Smith PetscErrorCode  PetscBagView(PetscBag bag,PetscViewer view)
6775c6c1daeSBarry Smith {
6785c6c1daeSBarry Smith   PetscBool    isascii,isbinary;
6795c6c1daeSBarry Smith   PetscBagItem nitem = bag->bagitems;
6805c6c1daeSBarry Smith 
6815c6c1daeSBarry Smith   PetscFunctionBegin;
6825f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
6835f80ce2aSJacob Faibussowitsch   PetscValidHeaderSpecific(view,PETSC_VIEWER_CLASSID,2);
6849566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERASCII,&isascii));
6859566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary));
6865c6c1daeSBarry Smith   if (isascii) {
6873ffde785SBarry Smith     if (bag->bagprefix) {
6889566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(view,"PetscBag Object:  %s (%s) %s\n",bag->bagname,bag->bagprefix,bag->baghelp));
6893ffde785SBarry Smith     } else {
6909566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(view,"PetscBag Object:  %s %s\n",bag->bagname,bag->baghelp));
6913ffde785SBarry Smith     }
6925c6c1daeSBarry Smith     while (nitem) {
6935c6c1daeSBarry Smith       if (nitem->dtype == PETSC_CHAR) {
6945c6c1daeSBarry Smith         char *value = (char*)(((char*)bag) + nitem->offset);
6955c6c1daeSBarry Smith         char tmp    = value[nitem->msize-1]; /* special handling for fortran chars wihout null terminator */
6965c6c1daeSBarry Smith         value[nitem->msize-1] =0;
6979566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view,"  %s = %s; %s\n",nitem->name,value,nitem->help));
6985c6c1daeSBarry Smith         value[nitem->msize-1] = tmp;
6995c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_REAL) {
7005c6c1daeSBarry Smith         PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset);
7015c6c1daeSBarry Smith         PetscInt  i;
7029566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view,"  %s = ",nitem->name));
7035c6c1daeSBarry Smith         for (i=0; i<nitem->msize; i++) {
7049566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view,"%g ",(double)value[i]));
7055c6c1daeSBarry Smith         }
7069566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view,"; %s\n",nitem->help));
7075c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_SCALAR) {
7085c6c1daeSBarry Smith         PetscScalar value = *(PetscScalar*)(((char*)bag) + nitem->offset);
7095c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
7108627564fSBarry Smith         if ((double)PetscImaginaryPart(value)) {
7119566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view,"  %s = %g + %gi; %s\n",nitem->name,(double)PetscRealPart(value),(double)PetscImaginaryPart(value),nitem->help));
7128627564fSBarry Smith         } else {
7139566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view,"  %s = %g; %s\n",nitem->name,(double)PetscRealPart(value),nitem->help));
7148627564fSBarry Smith         }
7155c6c1daeSBarry Smith #else
7169566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view,"  %s = %g; %s\n",nitem->name,(double)value,nitem->help));
7175c6c1daeSBarry Smith #endif
7185c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_INT) {
7195c6c1daeSBarry Smith         PetscInt i,*value = (PetscInt*)(((char*)bag) + nitem->offset);
7209566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view,"  %s = ",nitem->name));
7215c6c1daeSBarry Smith         for (i=0; i<nitem->msize; i++) {
7229566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view,"%" PetscInt_FMT " ",value[i]));
7235c6c1daeSBarry Smith         }
7249566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view,"; %s\n",nitem->help));
7255c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_BOOL) {
726dd66f111SBlaise Bourdin         PetscBool  *value = (PetscBool*)(((char*)bag) + nitem->offset);
727dd66f111SBlaise Bourdin         PetscInt  i;
7285c6c1daeSBarry Smith          /* some Fortran compilers use -1 as boolean */
7299566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view,"  %s = ",nitem->name));
730dd66f111SBlaise Bourdin         for (i=0; i<nitem->msize; i++) {
731dd66f111SBlaise Bourdin           if (((int) value[i]) == -1) value[i] = PETSC_TRUE;
7325c6c1daeSBarry 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 */
7335f80ce2aSJacob Faibussowitsch           PetscCheck(value[i] == PETSC_FALSE || value[i] == PETSC_TRUE,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Boolean value for %s %s is corrupt; integer value %" PetscInt_FMT,nitem->name,nitem->help,(PetscInt)(value[i]));
7349566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view," %s",PetscBools[value[i]]));
735dd66f111SBlaise Bourdin         }
7369566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view,"; %s\n",nitem->help));
7375c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_ENUM) {
7385c6c1daeSBarry Smith         PetscEnum value = *(PetscEnum*)(((char*)bag) + nitem->offset);
7395c6c1daeSBarry Smith         PetscInt  i     = 0;
7405c6c1daeSBarry Smith         while (nitem->list[i++]) ;
7419566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view,"  %s = %s; (%s) %s\n",nitem->name,nitem->list[value],nitem->list[i-3],nitem->help));
7425c6c1daeSBarry Smith       }
7435c6c1daeSBarry Smith       nitem = nitem->next;
7445c6c1daeSBarry Smith     }
7455c6c1daeSBarry Smith   } else if (isbinary) {
7465c6c1daeSBarry Smith     PetscInt          classid           = PETSC_BAG_FILE_CLASSID, dtype;
7475c6c1daeSBarry Smith     PetscInt          deprecatedbagsize = 0;
748a261c58fSBarry Smith     PetscViewerFormat format;
7499566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view,&classid,1,PETSC_INT));
7509566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view,&deprecatedbagsize,1,PETSC_INT));
7519566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view,&bag->count,1,PETSC_INT));
7529566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR));
7539566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR));
7545c6c1daeSBarry Smith     while (nitem) {
7559566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view,&nitem->offset,1,PETSC_INT));
7565c6c1daeSBarry Smith       dtype = (PetscInt)nitem->dtype;
7579566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view,&dtype,1,PETSC_INT));
7589566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view,nitem->name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR));
7599566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view,nitem->help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR));
7609566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view,&nitem->msize,1,PETSC_INT));
7615c6c1daeSBarry Smith       /* some Fortran compilers use -1 as boolean */
7625c6c1daeSBarry Smith       if (dtype == PETSC_BOOL && ((*(int*) (((char*)bag) + nitem->offset) == -1))) *(int*) (((char*)bag) + nitem->offset) = PETSC_TRUE;
7635c6c1daeSBarry Smith 
7649566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view,(((char*)bag) + nitem->offset),nitem->msize,nitem->dtype));
7655c6c1daeSBarry Smith       if (dtype == PETSC_ENUM) {
7669566063dSJacob Faibussowitsch         PetscCall(PetscViewerBinaryWriteStringArray(view,(const char* const*)nitem->list));
7675c6c1daeSBarry Smith       }
7685c6c1daeSBarry Smith       nitem = nitem->next;
7695c6c1daeSBarry Smith     }
7709566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(view,&format));
771a261c58fSBarry Smith     if (format == PETSC_VIEWER_BINARY_MATLAB) {
772a261c58fSBarry Smith       MPI_Comm comm;
773a261c58fSBarry Smith       FILE     *info;
7749566063dSJacob Faibussowitsch       PetscCall(PetscObjectGetComm((PetscObject)view,&comm));
7759566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryGetInfoPointer(view,&info));
7769566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm,info,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n"));
7779566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm,info,"#$$ Set.%s = PetscBinaryRead(fd);\n",bag->bagname));
7789566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm,info,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n"));
779a261c58fSBarry Smith     }
780a261c58fSBarry Smith   }
7815c6c1daeSBarry Smith   PetscFunctionReturn(0);
7825c6c1daeSBarry Smith }
7835c6c1daeSBarry Smith 
7845c6c1daeSBarry Smith /*@C
785173f9484SMatthew G. Knepley   PetscBagViewFromOptions - Processes command line options to determine if/how a PetscBag is to be viewed.
786173f9484SMatthew G. Knepley 
787173f9484SMatthew G. Knepley   Collective on PetscBag
788173f9484SMatthew G. Knepley 
789173f9484SMatthew G. Knepley   Input Parameters:
790173f9484SMatthew G. Knepley + obj   - the object
791173f9484SMatthew G. Knepley . bobj  - optional other object that provides prefix (if NULL then the prefix in obj is used)
792173f9484SMatthew G. Knepley - optionname - option to activate viewing
793478db826SMatthew G. Knepley 
794173f9484SMatthew G. Knepley   Level: intermediate
795478db826SMatthew G. Knepley 
796db781477SPatrick Sanan .seealso: `PetscBagCreate()`, `PetscBag`, `PetscViewer`
797173f9484SMatthew G. Knepley @*/
798173f9484SMatthew G. Knepley PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[])
799173f9484SMatthew G. Knepley {
800173f9484SMatthew G. Knepley   static PetscBool  incall = PETSC_FALSE;
801173f9484SMatthew G. Knepley   PetscViewer       viewer;
802173f9484SMatthew G. Knepley   PetscViewerFormat format;
803173f9484SMatthew G. Knepley   const char       *prefix, *bprefix = NULL;
804173f9484SMatthew G. Knepley   PetscBool         flg;
805173f9484SMatthew G. Knepley 
806173f9484SMatthew G. Knepley   PetscFunctionBegin;
807173f9484SMatthew G. Knepley   if (incall) PetscFunctionReturn(0);
808173f9484SMatthew G. Knepley   incall = PETSC_TRUE;
8095f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
8109566063dSJacob Faibussowitsch   if (bobj) PetscCall(PetscObjectGetOptionsPrefix(bobj, &bprefix));
811173f9484SMatthew G. Knepley   prefix = bobj ? bprefix : bag->bagprefix;
8129566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg));
813173f9484SMatthew G. Knepley   if (flg) {
8149566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, format));
8159566063dSJacob Faibussowitsch     PetscCall(PetscBagView(bag, viewer));
8169566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(viewer));
8179566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
8189566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
819173f9484SMatthew G. Knepley   }
820173f9484SMatthew G. Knepley   incall = PETSC_FALSE;
821173f9484SMatthew G. Knepley   PetscFunctionReturn(0);
822173f9484SMatthew G. Knepley }
823173f9484SMatthew G. Knepley 
824173f9484SMatthew G. Knepley /*@C
8255c6c1daeSBarry Smith    PetscBagLoad - Loads a bag of values from a binary file
8265c6c1daeSBarry Smith 
8275c6c1daeSBarry Smith    Collective on PetscViewer
8285c6c1daeSBarry Smith 
829d8d19677SJose E. Roman    Input Parameters:
8305c6c1daeSBarry Smith +  viewer - file to load values from
8315c6c1daeSBarry Smith -  bag - the bag of values
8325c6c1daeSBarry Smith 
83395452b02SPatrick Sanan    Notes:
83495452b02SPatrick Sanan     You must have created and registered all the fields in the bag before loading into it.
8355c6c1daeSBarry Smith 
8365c6c1daeSBarry Smith    Notes:
8375c6c1daeSBarry Smith    Level: beginner
8385c6c1daeSBarry Smith 
839db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagView()`, `PetscBagGetData()`
840db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
841db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
8425c6c1daeSBarry Smith 
8435c6c1daeSBarry Smith @*/
8445c6c1daeSBarry Smith PetscErrorCode  PetscBagLoad(PetscViewer view,PetscBag bag)
8455c6c1daeSBarry Smith {
8465c6c1daeSBarry Smith   PetscBool    isbinary;
8475f80ce2aSJacob Faibussowitsch   PetscInt     classid,bagcount,dtype,msize,offset,deprecatedbagsize;
8485c6c1daeSBarry Smith   char         name[PETSC_BAG_NAME_LENGTH],help[PETSC_BAG_HELP_LENGTH],**list;
8495c6c1daeSBarry Smith   PetscBagItem nitem;
8505c6c1daeSBarry Smith   MPI_Comm     comm;
8515c6c1daeSBarry Smith   PetscMPIInt  flag;
8525c6c1daeSBarry Smith 
8535c6c1daeSBarry Smith   PetscFunctionBegin;
8545f80ce2aSJacob Faibussowitsch   PetscValidHeaderSpecific(view,PETSC_VIEWER_CLASSID,1);
8555f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,2);
8569566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)view,&comm));
8579566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_compare(comm,bag->bagcomm,&flag));
8585f80ce2aSJacob Faibussowitsch   PetscCheck(flag == MPI_CONGRUENT || flag == MPI_IDENT,PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the viewer and bag");
8599566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary));
8605f80ce2aSJacob Faibussowitsch   PetscCheck(isbinary,PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type");
8615c6c1daeSBarry Smith 
8629566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view,&classid,1,NULL,PETSC_INT));
8635f80ce2aSJacob Faibussowitsch   PetscCheck(classid == PETSC_BAG_FILE_CLASSID,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not PetscBag next in binary file");
8649566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view,&deprecatedbagsize,1,NULL,PETSC_INT));
8659566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view,&bagcount,1,NULL,PETSC_INT));
8665f80ce2aSJacob Faibussowitsch   PetscCheck(bagcount == bag->count,comm,PETSC_ERR_ARG_INCOMP,"Bag in file has different number of entries %d then passed in bag %d",(int)bagcount,(int)bag->count);
8679566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view,bag->bagname,PETSC_BAG_NAME_LENGTH,NULL,PETSC_CHAR));
8689566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,NULL,PETSC_CHAR));
8695c6c1daeSBarry Smith 
8705c6c1daeSBarry Smith   nitem = bag->bagitems;
8715f80ce2aSJacob Faibussowitsch   for (PetscInt i=0; i<bagcount; i++) {
8729566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view,&offset,1,NULL,PETSC_INT));
8735c6c1daeSBarry Smith     /* ignore the offset in the file */
8749566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view,&dtype,1,NULL,PETSC_INT));
8759566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view,name,PETSC_BAG_NAME_LENGTH,NULL,PETSC_CHAR));
8769566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view,help,PETSC_BAG_HELP_LENGTH,NULL,PETSC_CHAR));
8779566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view,&msize,1,NULL,PETSC_INT));
8785c6c1daeSBarry Smith 
8795c6c1daeSBarry Smith     if (dtype == (PetscInt) PETSC_CHAR) {
8809566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_CHAR));
8815c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_REAL) {
8829566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_REAL));
8835c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_SCALAR) {
8849566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,NULL,PETSC_SCALAR));
8855c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_INT) {
8869566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_INT));
8875c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_BOOL) {
8889566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_BOOL));
8895c6c1daeSBarry Smith     } else if (dtype == (PetscInt) PETSC_ENUM) {
8909566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,NULL,PETSC_ENUM));
8919566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryReadStringArray(view,&list));
8925c6c1daeSBarry Smith       /* don't need to save list because it is already registered in the bag */
8939566063dSJacob Faibussowitsch       PetscCall(PetscFree(list));
8945c6c1daeSBarry Smith     }
8955c6c1daeSBarry Smith     nitem = nitem->next;
8965c6c1daeSBarry Smith   }
8975c6c1daeSBarry Smith   PetscFunctionReturn(0);
8985c6c1daeSBarry Smith }
8995c6c1daeSBarry Smith 
900e8976759SBarry Smith /*@C
9015c6c1daeSBarry Smith     PetscBagCreate - Create a bag of values
9025c6c1daeSBarry Smith 
903d083f849SBarry Smith   Collective
9045c6c1daeSBarry Smith 
9055c6c1daeSBarry Smith   Level: Intermediate
9065c6c1daeSBarry Smith 
9075c6c1daeSBarry Smith   Input Parameters:
9085c6c1daeSBarry Smith +  comm - communicator to share bag
9095c6c1daeSBarry Smith -  bagsize - size of the C structure holding the values
9105c6c1daeSBarry Smith 
9115c6c1daeSBarry Smith   Output Parameter:
9125c6c1daeSBarry Smith .   bag - the bag of values
9135c6c1daeSBarry Smith 
9145c6c1daeSBarry Smith    Notes:
9155c6c1daeSBarry Smith       The size of the A struct must be small enough to fit in a PetscInt; by default
9165c6c1daeSBarry Smith       PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length.
9175c6c1daeSBarry Smith       The warning about casting to a shorter length can be ignored below unless your A struct is too large
9185c6c1daeSBarry Smith 
919db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
920db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
921db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9225c6c1daeSBarry Smith @*/
9235c6c1daeSBarry Smith PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag)
9245c6c1daeSBarry Smith {
9255f80ce2aSJacob Faibussowitsch   const size_t totalsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar);
9265c6c1daeSBarry Smith 
9275c6c1daeSBarry Smith   PetscFunctionBegin;
9285f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,3);
9299566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL,"Creating Bag with total size %d\n",(int)totalsize));
9309566063dSJacob Faibussowitsch   PetscCall(PetscCalloc(totalsize,bag));
931a297a907SKarl Rupp 
9325f80ce2aSJacob Faibussowitsch   (*bag)->bagsize        = totalsize;
9335c6c1daeSBarry Smith   (*bag)->bagcomm        = comm;
9340298fd71SBarry Smith   (*bag)->bagprefix      = NULL;
9355c6c1daeSBarry Smith   (*bag)->structlocation = (void*)(((char*)(*bag)) + sizeof(PetscScalar)*(sizeof(struct _n_PetscBag)/sizeof(PetscScalar)) + sizeof(PetscScalar));
9365c6c1daeSBarry Smith   PetscFunctionReturn(0);
9375c6c1daeSBarry Smith }
9385c6c1daeSBarry Smith 
9395c6c1daeSBarry Smith /*@C
9405c6c1daeSBarry Smith     PetscBagSetName - Sets the name of a bag of values
9415c6c1daeSBarry Smith 
9425c6c1daeSBarry Smith   Not Collective
9435c6c1daeSBarry Smith 
9445c6c1daeSBarry Smith   Level: Intermediate
9455c6c1daeSBarry Smith 
9465c6c1daeSBarry Smith   Input Parameters:
9475c6c1daeSBarry Smith +   bag - the bag of values
9485c6c1daeSBarry Smith .   name - the name assigned to the bag
9495c6c1daeSBarry Smith -   help - help message for bag
9505c6c1daeSBarry Smith 
951db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
952db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
953db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9545c6c1daeSBarry Smith @*/
9555c6c1daeSBarry Smith 
9565c6c1daeSBarry Smith PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help)
9575c6c1daeSBarry Smith {
9585c6c1daeSBarry Smith   PetscFunctionBegin;
9595f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
9605f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name,2);
9615f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help,3);
9629566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(bag->bagname,name,PETSC_BAG_NAME_LENGTH-1));
9639566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(bag->baghelp,help,PETSC_BAG_HELP_LENGTH-1));
9645c6c1daeSBarry Smith   PetscFunctionReturn(0);
9655c6c1daeSBarry Smith }
9665c6c1daeSBarry Smith 
9675c6c1daeSBarry Smith /*@C
9685c6c1daeSBarry Smith     PetscBagGetName - Gets the name of a bag of values
9695c6c1daeSBarry Smith 
9705c6c1daeSBarry Smith   Not Collective
9715c6c1daeSBarry Smith 
9725c6c1daeSBarry Smith   Level: Intermediate
9735c6c1daeSBarry Smith 
9745c6c1daeSBarry Smith   Input Parameter:
9755c6c1daeSBarry Smith .   bag - the bag of values
9765c6c1daeSBarry Smith 
9775c6c1daeSBarry Smith   Output Parameter:
9785c6c1daeSBarry Smith .   name - the name assigned to the bag
9795c6c1daeSBarry Smith 
980db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
981db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
982db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9835c6c1daeSBarry Smith @*/
9845c6c1daeSBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, char **name)
9855c6c1daeSBarry Smith {
9865c6c1daeSBarry Smith   PetscFunctionBegin;
9875f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
9885f80ce2aSJacob Faibussowitsch   PetscValidPointer(name,2);
9895c6c1daeSBarry Smith   *name = bag->bagname;
9905c6c1daeSBarry Smith   PetscFunctionReturn(0);
9915c6c1daeSBarry Smith }
9925c6c1daeSBarry Smith 
9935c6c1daeSBarry Smith /*@C
9945c6c1daeSBarry Smith     PetscBagGetData - Gives back the user - access to memory that
9955c6c1daeSBarry Smith     should be used for storing user-data-structure
9965c6c1daeSBarry Smith 
9975c6c1daeSBarry Smith   Not Collective
9985c6c1daeSBarry Smith 
9995c6c1daeSBarry Smith   Level: Intermediate
10005c6c1daeSBarry Smith 
10015c6c1daeSBarry Smith   Input Parameter:
10025c6c1daeSBarry Smith .   bag - the bag of values
10035c6c1daeSBarry Smith 
10045c6c1daeSBarry Smith   Output Parameter:
10055c6c1daeSBarry Smith .   data - pointer to memory that will have user-data-structure
10065c6c1daeSBarry Smith 
1007db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`
1008db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
1009db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
10105c6c1daeSBarry Smith @*/
10115c6c1daeSBarry Smith PetscErrorCode PetscBagGetData(PetscBag bag, void **data)
10125c6c1daeSBarry Smith {
10135c6c1daeSBarry Smith   PetscFunctionBegin;
10145f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
10155f80ce2aSJacob Faibussowitsch   PetscValidPointer(data,2);
10165c6c1daeSBarry Smith   *data = bag->structlocation;
10175c6c1daeSBarry Smith   PetscFunctionReturn(0);
10185c6c1daeSBarry Smith }
10195c6c1daeSBarry Smith 
10205c6c1daeSBarry Smith /*@C
10215c6c1daeSBarry Smith   PetscBagSetOptionsPrefix - Sets the prefix used for searching for all
10225c6c1daeSBarry Smith   PetscBag items in the options database.
10235c6c1daeSBarry Smith 
10245c6c1daeSBarry Smith   Logically collective on Bag.
10255c6c1daeSBarry Smith 
10265c6c1daeSBarry Smith   Level: Intermediate
10275c6c1daeSBarry Smith 
10285c6c1daeSBarry Smith   Input Parameters:
10295c6c1daeSBarry Smith +   bag - the bag of values
10305c6c1daeSBarry Smith -   prefix - the prefix to prepend all Bag item names with.
10315c6c1daeSBarry Smith 
10325c6c1daeSBarry Smith   NOTES: Must be called prior to registering any of the bag items.
10335c6c1daeSBarry Smith 
1034db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
1035db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
10365c6c1daeSBarry Smith @*/
10375c6c1daeSBarry Smith 
10385c6c1daeSBarry Smith PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[])
10395c6c1daeSBarry Smith {
10405c6c1daeSBarry Smith   PetscFunctionBegin;
10415f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
10425f80ce2aSJacob Faibussowitsch   if (pre) {
10435f80ce2aSJacob Faibussowitsch     PetscValidCharPointer(pre,2);
10445f80ce2aSJacob Faibussowitsch     PetscCheck(pre[0] != '-',PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hyphen");
10459566063dSJacob Faibussowitsch     PetscCall(PetscFree(bag->bagprefix));
10469566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(pre,&(bag->bagprefix)));
10479566063dSJacob Faibussowitsch   } else PetscCall(PetscFree(bag->bagprefix));
10485c6c1daeSBarry Smith   PetscFunctionReturn(0);
10495c6c1daeSBarry Smith }
1050ffb7e86cSMatthew G. Knepley 
1051ffb7e86cSMatthew G. Knepley /*@C
1052ffb7e86cSMatthew G. Knepley   PetscBagGetNames - Get the names of all entries in the bag
1053ffb7e86cSMatthew G. Knepley 
1054ffb7e86cSMatthew G. Knepley   Not collective
1055ffb7e86cSMatthew G. Knepley 
1056ffb7e86cSMatthew G. Knepley   Input Parameters:
1057ffb7e86cSMatthew G. Knepley + bag   - the bag of values
1058ffb7e86cSMatthew G. Knepley - names - array of the correct size to hold names
1059ffb7e86cSMatthew G. Knepley 
1060ffb7e86cSMatthew G. Knepley   Output Parameter:
1061ffb7e86cSMatthew G. Knepley . names - array of char pointers for names
1062ffb7e86cSMatthew G. Knepley 
1063ffb7e86cSMatthew G. Knepley   Level: intermediate
1064ffb7e86cSMatthew G. Knepley 
1065db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagSetName()`, `PetscBagCreate()`, `PetscBagGetData()`
1066db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
1067ffb7e86cSMatthew G. Knepley @*/
1068ffb7e86cSMatthew G. Knepley PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[])
1069ffb7e86cSMatthew G. Knepley {
1070ffb7e86cSMatthew G. Knepley   PetscBagItem nitem = bag->bagitems;
1071ffb7e86cSMatthew G. Knepley 
1072ffb7e86cSMatthew G. Knepley   PetscFunctionBegin;
10735f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag,1);
10745f80ce2aSJacob Faibussowitsch   PetscValidPointer(names,2);
10755f80ce2aSJacob Faibussowitsch   for (PetscInt n = 0; nitem; ++n, nitem = nitem->next) names[n] = nitem->name;
1076ffb7e86cSMatthew G. Knepley   PetscFunctionReturn(0);
1077ffb7e86cSMatthew G. Knepley }
1078