xref: /petsc/src/sys/classes/bag/bag.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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 */
89371c9d4SSatish Balay static PetscErrorCode PetscBagRegister_Private(PetscBag bag, PetscBagItem item, const char *name, const char *help) {
95c6c1daeSBarry Smith   PetscFunctionBegin;
109566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(item->name, name, PETSC_BAG_NAME_LENGTH - 1));
119566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(item->help, help, PETSC_BAG_HELP_LENGTH - 1));
125f80ce2aSJacob Faibussowitsch   if (bag->bagitems) {
135c6c1daeSBarry Smith     PetscBagItem nitem = bag->bagitems;
145f80ce2aSJacob Faibussowitsch 
155f80ce2aSJacob Faibussowitsch     while (nitem->next) nitem = nitem->next;
165c6c1daeSBarry Smith     nitem->next = item;
175f80ce2aSJacob Faibussowitsch   } else bag->bagitems = item;
185c6c1daeSBarry Smith   bag->count++;
195c6c1daeSBarry Smith   PetscFunctionReturn(0);
205c6c1daeSBarry Smith }
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith /*@C
235c6c1daeSBarry Smith    PetscBagRegisterEnum - add an enum value to the bag
245c6c1daeSBarry Smith 
255c6c1daeSBarry Smith    Logically Collective on PetscBag
265c6c1daeSBarry Smith 
27d8d19677SJose E. Roman    Input Parameters:
285c6c1daeSBarry Smith +  bag - the bag of values
295c6c1daeSBarry Smith .  addr - location of enum in struct
305c6c1daeSBarry Smith .  mdefault - the initial value
315c6c1daeSBarry Smith .  list - array of strings containing names of enum values followed by enum name followed by enum prefix
325c6c1daeSBarry Smith -  help - longer string with more information about the value
335c6c1daeSBarry Smith 
345c6c1daeSBarry Smith    Level: beginner
355c6c1daeSBarry Smith 
36db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
37db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
38db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith @*/
419371c9d4SSatish Balay PetscErrorCode PetscBagRegisterEnum(PetscBag bag, void *addr, const char *const *list, PetscEnum mdefault, const char *name, const char *help) {
425c6c1daeSBarry Smith   PetscBagItem item;
435c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
445c6c1daeSBarry Smith   PetscBool    printhelp;
455c6c1daeSBarry Smith   PetscInt     i = 0;
465c6c1daeSBarry Smith 
475c6c1daeSBarry Smith   PetscFunctionBegin;
485f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
495f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
505f80ce2aSJacob Faibussowitsch   PetscValidPointer(list, 3);
515f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 5);
525f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 6);
535c6c1daeSBarry Smith   nname[0] = '-';
545c6c1daeSBarry Smith   nname[1] = 0;
559566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
569566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
575c6c1daeSBarry Smith   if (printhelp) {
589371c9d4SSatish Balay     while (list[i++])
599371c9d4SSatish Balay       ;
609566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: (%s) %s (choose one of) ", bag->bagprefix ? bag->bagprefix : "", name, list[mdefault], list[i - 3], help));
619566063dSJacob Faibussowitsch     for (i = 0; list[i + 2]; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " %s", list[i]));
629566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "\n"));
635c6c1daeSBarry Smith   }
649566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetEnum(NULL, bag->bagprefix, nname, list, &mdefault, NULL));
655c6c1daeSBarry Smith 
669566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
675c6c1daeSBarry Smith   item->dtype  = PETSC_ENUM;
685c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
695f80ce2aSJacob 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);
7002c9f0b5SLisandro Dalcin   item->next  = NULL;
715c6c1daeSBarry Smith   item->msize = 1;
729566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(list, (char ***)&item->list));
735c6c1daeSBarry Smith   *(PetscEnum *)addr = mdefault;
749566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
755c6c1daeSBarry Smith   PetscFunctionReturn(0);
765c6c1daeSBarry Smith }
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith /*@C
795c6c1daeSBarry Smith    PetscBagRegisterIntArray - add an integer value to the bag
805c6c1daeSBarry Smith 
815c6c1daeSBarry Smith    Logically Collective on PetscBag
825c6c1daeSBarry Smith 
83d8d19677SJose E. Roman    Input Parameters:
845c6c1daeSBarry Smith +  bag - the bag of values
855c6c1daeSBarry Smith .  addr - location of integer in struct
865c6c1daeSBarry Smith .  msize - number of entries in array
875c6c1daeSBarry Smith .  name - name of the integer array
885c6c1daeSBarry Smith -  help - longer string with more information about the value
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith    Level: beginner
915c6c1daeSBarry Smith 
92db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
93db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
94db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
955c6c1daeSBarry Smith 
965c6c1daeSBarry Smith @*/
979371c9d4SSatish Balay PetscErrorCode PetscBagRegisterIntArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help) {
985c6c1daeSBarry Smith   PetscBagItem item;
995c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
1005c6c1daeSBarry Smith   PetscBool    printhelp;
1015c6c1daeSBarry Smith   PetscInt     i, tmp = msize;
1025c6c1daeSBarry Smith 
1035c6c1daeSBarry Smith   PetscFunctionBegin;
1045f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
1055f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
1065f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
1075f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
1085c6c1daeSBarry Smith   nname[0] = '-';
1095c6c1daeSBarry Smith   nname[1] = 0;
1109566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
1119566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
1125c6c1daeSBarry Smith   if (printhelp) {
1139566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <", bag->bagprefix ? bag->bagprefix : "", name));
114*48a46eb9SPierre Jolivet     for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i));
1159566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help));
1165c6c1daeSBarry Smith   }
1179566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetIntArray(NULL, bag->bagprefix, nname, (PetscInt *)addr, &tmp, NULL));
1185c6c1daeSBarry Smith 
1199566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
1205c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
1215c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
1225f80ce2aSJacob 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);
12302c9f0b5SLisandro Dalcin   item->next  = NULL;
1245c6c1daeSBarry Smith   item->msize = msize;
1259566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
1265c6c1daeSBarry Smith   PetscFunctionReturn(0);
1275c6c1daeSBarry Smith }
1285c6c1daeSBarry Smith 
1295c6c1daeSBarry Smith /*@C
1305c6c1daeSBarry Smith    PetscBagRegisterRealArray - add an real array to the bag
1315c6c1daeSBarry Smith 
1325c6c1daeSBarry Smith    Logically Collective on PetscBag
1335c6c1daeSBarry Smith 
134d8d19677SJose E. Roman    Input Parameters:
1355c6c1daeSBarry Smith +  bag - the bag of values
1365c6c1daeSBarry Smith .  addr - location of real array in struct
1375c6c1daeSBarry Smith .  msize - number of entries in array
1385c6c1daeSBarry Smith .  name - name of the integer array
1395c6c1daeSBarry Smith -  help - longer string with more information about the value
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith    Level: beginner
1425c6c1daeSBarry Smith 
143db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
144db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
145db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith @*/
1489371c9d4SSatish Balay PetscErrorCode PetscBagRegisterRealArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help) {
1495c6c1daeSBarry Smith   PetscBagItem item;
1505c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
1515c6c1daeSBarry Smith   PetscBool    printhelp;
1525c6c1daeSBarry Smith   PetscInt     i, tmp = msize;
1535c6c1daeSBarry Smith 
1545c6c1daeSBarry Smith   PetscFunctionBegin;
1555f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
1565f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
1575f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
1585f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
1595c6c1daeSBarry Smith   nname[0] = '-';
1605c6c1daeSBarry Smith   nname[1] = 0;
1619566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
1629566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
1635c6c1daeSBarry Smith   if (printhelp) {
1649566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <", bag->bagprefix ? bag->bagprefix : "", name));
165*48a46eb9SPierre Jolivet     for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%g ", (double)*((PetscReal *)addr) + i));
1669566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help));
1675c6c1daeSBarry Smith   }
1689566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetRealArray(NULL, bag->bagprefix, nname, (PetscReal *)addr, &tmp, NULL));
1695c6c1daeSBarry Smith 
1709566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
1715c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
1725c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
1735f80ce2aSJacob 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);
17402c9f0b5SLisandro Dalcin   item->next  = NULL;
1755c6c1daeSBarry Smith   item->msize = msize;
1769566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
1775c6c1daeSBarry Smith   PetscFunctionReturn(0);
1785c6c1daeSBarry Smith }
1795c6c1daeSBarry Smith 
1805c6c1daeSBarry Smith /*@C
1815c6c1daeSBarry Smith    PetscBagRegisterInt - add an integer value to the bag
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith    Logically Collective on PetscBag
1845c6c1daeSBarry Smith 
185d8d19677SJose E. Roman    Input Parameters:
1865c6c1daeSBarry Smith +  bag - the bag of values
1875c6c1daeSBarry Smith .  addr - location of integer in struct
1885c6c1daeSBarry Smith .  mdefault - the initial value
1895c6c1daeSBarry Smith .  name - name of the integer
1905c6c1daeSBarry Smith -  help - longer string with more information about the value
1915c6c1daeSBarry Smith 
1925c6c1daeSBarry Smith    Level: beginner
1935c6c1daeSBarry Smith 
194db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
195db781477SPatrick Sanan           `PetscBagRegisterInt64()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
196db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
1975c6c1daeSBarry Smith 
1985c6c1daeSBarry Smith @*/
1999371c9d4SSatish Balay PetscErrorCode PetscBagRegisterInt(PetscBag bag, void *addr, PetscInt mdefault, const char *name, const char *help) {
2005c6c1daeSBarry Smith   PetscBagItem item;
2015c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
2025c6c1daeSBarry Smith   PetscBool    printhelp;
2035c6c1daeSBarry Smith 
2045c6c1daeSBarry Smith   PetscFunctionBegin;
2055f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
2065f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
2075f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
2085f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
2095c6c1daeSBarry Smith   nname[0] = '-';
2105c6c1daeSBarry Smith   nname[1] = 0;
2119566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
2129566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
213*48a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help));
2149566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &mdefault, NULL));
2155c6c1daeSBarry Smith 
2169566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
2175c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
2185c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
2195f80ce2aSJacob 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);
22002c9f0b5SLisandro Dalcin   item->next        = NULL;
2215c6c1daeSBarry Smith   item->msize       = 1;
2225c6c1daeSBarry Smith   *(PetscInt *)addr = mdefault;
2239566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
2245c6c1daeSBarry Smith   PetscFunctionReturn(0);
2255c6c1daeSBarry Smith }
2265c6c1daeSBarry Smith 
2270d349d43SBarry Smith /*@C
228bafee8b4SSatish Balay    PetscBagRegisterInt64 - add an integer value to the bag
2290d349d43SBarry Smith 
2300d349d43SBarry Smith    Logically Collective on PetscBag
2310d349d43SBarry Smith 
232d8d19677SJose E. Roman    Input Parameters:
2330d349d43SBarry Smith +  bag - the bag of values
2340d349d43SBarry Smith .  addr - location of integer in struct
2350d349d43SBarry Smith .  mdefault - the initial value
2360d349d43SBarry Smith .  name - name of the integer
2370d349d43SBarry Smith -  help - longer string with more information about the value
2380d349d43SBarry Smith 
2390d349d43SBarry Smith    Level: beginner
2400d349d43SBarry Smith 
241db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
242db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
243db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
2440d349d43SBarry Smith 
2450d349d43SBarry Smith @*/
2469371c9d4SSatish Balay PetscErrorCode PetscBagRegisterInt64(PetscBag bag, void *addr, PetscInt64 mdefault, const char *name, const char *help) {
2470d349d43SBarry Smith   PetscBagItem item;
2480d349d43SBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
2490d349d43SBarry Smith   PetscBool    printhelp;
2500d349d43SBarry Smith   PetscInt     odefault = (PetscInt)mdefault;
2510d349d43SBarry Smith   PetscBool    flg;
2520d349d43SBarry Smith 
2530d349d43SBarry Smith   PetscFunctionBegin;
2540d349d43SBarry Smith   nname[0] = '-';
2550d349d43SBarry Smith   nname[1] = 0;
2569566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
2579566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
258*48a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, odefault, help));
2599566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &odefault, &flg));
260bafee8b4SSatish Balay   if (flg) mdefault = (PetscInt64)odefault;
2610d349d43SBarry Smith 
2629566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
2630d349d43SBarry Smith   item->dtype  = PETSC_INT;
2640d349d43SBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
2655f80ce2aSJacob 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);
26602c9f0b5SLisandro Dalcin   item->next          = NULL;
2670d349d43SBarry Smith   item->msize         = 1;
268bafee8b4SSatish Balay   *(PetscInt64 *)addr = mdefault;
2699566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
2700d349d43SBarry Smith   PetscFunctionReturn(0);
2710d349d43SBarry Smith }
2720d349d43SBarry Smith 
273dd66f111SBlaise Bourdin /*@C
274dd66f111SBlaise Bourdin    PetscBagRegisterBoolArray - add a n logical values to the bag
275dd66f111SBlaise Bourdin 
276dd66f111SBlaise Bourdin    Logically Collective on PetscBag
277dd66f111SBlaise Bourdin 
278d8d19677SJose E. Roman    Input Parameters:
279dd66f111SBlaise Bourdin +  bag - the bag of values
280dd66f111SBlaise Bourdin .  addr - location of boolean array in struct
281dd66f111SBlaise Bourdin .  msize - number of entries in array
282dd66f111SBlaise Bourdin .  name - name of the boolean array
283dd66f111SBlaise Bourdin -  help - longer string with more information about the value
284dd66f111SBlaise Bourdin 
285dd66f111SBlaise Bourdin    Level: beginner
286dd66f111SBlaise Bourdin 
287db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
288db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
289db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
290dd66f111SBlaise Bourdin 
291dd66f111SBlaise Bourdin @*/
2929371c9d4SSatish Balay PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help) {
293dd66f111SBlaise Bourdin   PetscBagItem item;
294dd66f111SBlaise Bourdin   char         nname[PETSC_BAG_NAME_LENGTH + 1];
295dd66f111SBlaise Bourdin   PetscBool    printhelp;
296dd66f111SBlaise Bourdin   PetscInt     i, tmp = msize;
297dd66f111SBlaise Bourdin 
298dd66f111SBlaise Bourdin   PetscFunctionBegin;
2995f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
3005f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
3015f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
3025f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
303dd66f111SBlaise Bourdin   nname[0] = '-';
304dd66f111SBlaise Bourdin   nname[1] = 0;
3059566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
3069566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
307dd66f111SBlaise Bourdin   if (printhelp) {
3089566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <", bag->bagprefix ? bag->bagprefix : "", name));
309*48a46eb9SPierre Jolivet     for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i));
3109566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help));
311dd66f111SBlaise Bourdin   }
3129566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBoolArray(NULL, bag->bagprefix, nname, (PetscBool *)addr, &tmp, NULL));
313dd66f111SBlaise Bourdin 
3149566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
315dd66f111SBlaise Bourdin   item->dtype  = PETSC_BOOL;
316dd66f111SBlaise Bourdin   item->offset = ((char *)addr) - ((char *)bag);
3175f80ce2aSJacob 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);
31802c9f0b5SLisandro Dalcin   item->next  = NULL;
319dd66f111SBlaise Bourdin   item->msize = msize;
3209566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
321dd66f111SBlaise Bourdin   PetscFunctionReturn(0);
322dd66f111SBlaise Bourdin }
323dd66f111SBlaise Bourdin 
3245c6c1daeSBarry Smith /*@C
3255c6c1daeSBarry Smith    PetscBagRegisterString - add a string value to the bag
3265c6c1daeSBarry Smith 
3275c6c1daeSBarry Smith    Logically Collective on PetscBag
3285c6c1daeSBarry Smith 
329d8d19677SJose E. Roman    Input Parameters:
3305c6c1daeSBarry Smith +  bag - the bag of values
3315c6c1daeSBarry Smith .  addr - location of start of string in struct
3325c6c1daeSBarry Smith .  msize - length of the string space in the struct
3335c6c1daeSBarry Smith .  mdefault - the initial value
3345c6c1daeSBarry Smith .  name - name of the string
3355c6c1daeSBarry Smith -  help - longer string with more information about the value
3365c6c1daeSBarry Smith 
3375c6c1daeSBarry Smith    Level: beginner
3385c6c1daeSBarry Smith 
3395c6c1daeSBarry Smith    Note: The struct should have the field char mystring[msize]; not char *mystring
3405c6c1daeSBarry Smith 
341db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
342db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
343c2e3fba1SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith @*/
3469371c9d4SSatish Balay PetscErrorCode PetscBagRegisterString(PetscBag bag, void *addr, PetscInt msize, const char *mdefault, const char *name, const char *help) {
3475c6c1daeSBarry Smith   PetscBagItem item;
3485c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
3495c6c1daeSBarry Smith   PetscBool    printhelp;
3505c6c1daeSBarry Smith 
3515c6c1daeSBarry Smith   PetscFunctionBegin;
3525f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
3535f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
3545f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(mdefault, 4);
3555f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 5);
3565f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 6);
3575c6c1daeSBarry Smith   nname[0] = '-';
3585c6c1daeSBarry Smith   nname[1] = 0;
3599566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
3609566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
361*48a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help));
3625c6c1daeSBarry Smith 
3639566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
3645c6c1daeSBarry Smith   item->dtype  = PETSC_CHAR;
3655c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
3665f80ce2aSJacob 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);
36702c9f0b5SLisandro Dalcin   item->next  = NULL;
3685c6c1daeSBarry Smith   item->msize = msize;
369*48a46eb9SPierre Jolivet   if (mdefault != (char *)addr) PetscCall(PetscStrncpy((char *)addr, mdefault, msize - 1));
3709566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, bag->bagprefix, nname, (char *)addr, msize, NULL));
3719566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
3725c6c1daeSBarry Smith   PetscFunctionReturn(0);
3735c6c1daeSBarry Smith }
3745c6c1daeSBarry Smith 
3755c6c1daeSBarry Smith /*@C
3765c6c1daeSBarry Smith    PetscBagRegisterReal - add a real value to the bag
3775c6c1daeSBarry Smith 
3785c6c1daeSBarry Smith    Logically Collective on PetscBag
3795c6c1daeSBarry Smith 
380d8d19677SJose E. Roman    Input Parameters:
3815c6c1daeSBarry Smith +  bag - the bag of values
3825c6c1daeSBarry Smith .  addr - location of double in struct
3835c6c1daeSBarry Smith .  mdefault - the initial value
3845c6c1daeSBarry Smith .  name - name of the variable
3855c6c1daeSBarry Smith -  help - longer string with more information about the value
3865c6c1daeSBarry Smith 
3875c6c1daeSBarry Smith    Level: beginner
3885c6c1daeSBarry Smith 
389db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
390db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
391db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
3925c6c1daeSBarry Smith 
3935c6c1daeSBarry Smith @*/
3949371c9d4SSatish Balay PetscErrorCode PetscBagRegisterReal(PetscBag bag, void *addr, PetscReal mdefault, const char *name, const char *help) {
3955c6c1daeSBarry Smith   PetscBagItem item;
3965c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
3975c6c1daeSBarry Smith   PetscBool    printhelp;
3985c6c1daeSBarry Smith 
3995c6c1daeSBarry Smith   PetscFunctionBegin;
4005f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
4015f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
4025f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
4035f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
4045c6c1daeSBarry Smith   nname[0] = '-';
4055c6c1daeSBarry Smith   nname[1] = 0;
4069566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
4079566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
408*48a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%g>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, (double)mdefault, help));
4099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetReal(NULL, bag->bagprefix, nname, &mdefault, NULL));
4105c6c1daeSBarry Smith 
4119566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4125c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
4135c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
4145f80ce2aSJacob 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);
41502c9f0b5SLisandro Dalcin   item->next         = NULL;
4165c6c1daeSBarry Smith   item->msize        = 1;
4175c6c1daeSBarry Smith   *(PetscReal *)addr = mdefault;
4189566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
4195c6c1daeSBarry Smith   PetscFunctionReturn(0);
4205c6c1daeSBarry Smith }
4215c6c1daeSBarry Smith 
4225c6c1daeSBarry Smith /*@C
4235c6c1daeSBarry Smith    PetscBagRegisterScalar - add a real or complex number value to the bag
4245c6c1daeSBarry Smith 
4255c6c1daeSBarry Smith    Logically Collective on PetscBag
4265c6c1daeSBarry Smith 
427d8d19677SJose E. Roman    Input Parameters:
4285c6c1daeSBarry Smith +  bag - the bag of values
4295c6c1daeSBarry Smith .  addr - location of scalar in struct
4305c6c1daeSBarry Smith .  mdefault - the initial value
4315c6c1daeSBarry Smith .  name - name of the variable
4325c6c1daeSBarry Smith -  help - longer string with more information about the value
4335c6c1daeSBarry Smith 
4345c6c1daeSBarry Smith    Level: beginner
4355c6c1daeSBarry Smith 
436db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
437db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
438db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
4395c6c1daeSBarry Smith 
4405c6c1daeSBarry Smith @*/
4419371c9d4SSatish Balay PetscErrorCode PetscBagRegisterScalar(PetscBag bag, void *addr, PetscScalar mdefault, const char *name, const char *help) {
4425c6c1daeSBarry Smith   PetscBagItem item;
4435c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
4445c6c1daeSBarry Smith   PetscBool    printhelp;
4455c6c1daeSBarry Smith 
4465c6c1daeSBarry Smith   PetscFunctionBegin;
4475f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
4485f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
4495f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
4505f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
4515c6c1daeSBarry Smith   nname[0] = '-';
4525c6c1daeSBarry Smith   nname[1] = 0;
4539566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
4549566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
455*48a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%g + %gi>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, (double)PetscRealPart(mdefault), (double)PetscImaginaryPart(mdefault), help));
4569566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetScalar(NULL, bag->bagprefix, nname, &mdefault, NULL));
4575c6c1daeSBarry Smith 
4589566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4595c6c1daeSBarry Smith   item->dtype  = PETSC_SCALAR;
4605c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
4615f80ce2aSJacob 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);
46202c9f0b5SLisandro Dalcin   item->next           = NULL;
4635c6c1daeSBarry Smith   item->msize          = 1;
4645c6c1daeSBarry Smith   *(PetscScalar *)addr = mdefault;
4659566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
4665c6c1daeSBarry Smith   PetscFunctionReturn(0);
4675c6c1daeSBarry Smith }
4685c6c1daeSBarry Smith 
4695c6c1daeSBarry Smith /*@C
4705c6c1daeSBarry Smith    PetscBagRegisterBool - add a logical value to the bag
4715c6c1daeSBarry Smith 
4725c6c1daeSBarry Smith    Logically Collective on PetscBag
4735c6c1daeSBarry Smith 
474d8d19677SJose E. Roman    Input Parameters:
4755c6c1daeSBarry Smith +  bag - the bag of values
4765c6c1daeSBarry Smith .  addr - location of logical in struct
4775c6c1daeSBarry Smith .  mdefault - the initial value
4785c6c1daeSBarry Smith .  name - name of the variable
4795c6c1daeSBarry Smith -  help - longer string with more information about the value
4805c6c1daeSBarry Smith 
4815c6c1daeSBarry Smith    Level: beginner
4825c6c1daeSBarry Smith 
483db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
484db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
485db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
4865c6c1daeSBarry Smith 
4875c6c1daeSBarry Smith @*/
4889371c9d4SSatish Balay PetscErrorCode PetscBagRegisterBool(PetscBag bag, void *addr, PetscBool mdefault, const char *name, const char *help) {
4895c6c1daeSBarry Smith   PetscBagItem item;
4905c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
4915c6c1daeSBarry Smith   PetscBool    printhelp;
4925c6c1daeSBarry Smith 
4935c6c1daeSBarry Smith   PetscFunctionBegin;
4945f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
4955f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
4965f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
4975f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
4985c6c1daeSBarry 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 */
4995f80ce2aSJacob 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);
5005c6c1daeSBarry Smith   nname[0] = '-';
5015c6c1daeSBarry Smith   nname[1] = 0;
5029566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
5039566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
504*48a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, PetscBools[mdefault], help));
5059566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, bag->bagprefix, nname, &mdefault, NULL));
5065c6c1daeSBarry Smith 
5079566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
5085c6c1daeSBarry Smith   item->dtype  = PETSC_BOOL;
5095c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
5105f80ce2aSJacob 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);
51102c9f0b5SLisandro Dalcin   item->next         = NULL;
5125c6c1daeSBarry Smith   item->msize        = 1;
5135c6c1daeSBarry Smith   *(PetscBool *)addr = mdefault;
5149566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
5155c6c1daeSBarry Smith   PetscFunctionReturn(0);
5165c6c1daeSBarry Smith }
5175c6c1daeSBarry Smith 
5185c6c1daeSBarry Smith /*@C
5195c6c1daeSBarry Smith    PetscBagDestroy - Destroys a bag values
5205c6c1daeSBarry Smith 
5215c6c1daeSBarry Smith    Collective on PetscBag
5225c6c1daeSBarry Smith 
5235c6c1daeSBarry Smith    Input Parameter:
5245c6c1daeSBarry Smith .  bag - the bag of values
5255c6c1daeSBarry Smith 
5265c6c1daeSBarry Smith    Level: beginner
5275c6c1daeSBarry Smith 
528db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
529db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
530db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
5315c6c1daeSBarry Smith 
5325c6c1daeSBarry Smith @*/
5339371c9d4SSatish Balay PetscErrorCode PetscBagDestroy(PetscBag *bag) {
5345f80ce2aSJacob Faibussowitsch   PetscBagItem nitem;
5355c6c1daeSBarry Smith 
5365c6c1daeSBarry Smith   PetscFunctionBegin;
5375f80ce2aSJacob Faibussowitsch   if (!*bag) PetscFunctionReturn(0);
5385f80ce2aSJacob Faibussowitsch   PetscValidPointer(*bag, 1);
5395f80ce2aSJacob Faibussowitsch   nitem = (*bag)->bagitems;
5405c6c1daeSBarry Smith   while (nitem) {
5415f80ce2aSJacob Faibussowitsch     PetscBagItem item = nitem->next;
5425f80ce2aSJacob Faibussowitsch 
5439566063dSJacob Faibussowitsch     if (nitem->list) PetscCall(PetscStrArrayDestroy(&nitem->list));
5449566063dSJacob Faibussowitsch     PetscCall(PetscFree(nitem));
5455c6c1daeSBarry Smith     nitem = item;
5465c6c1daeSBarry Smith   }
5479566063dSJacob Faibussowitsch   if ((*bag)->bagprefix) PetscCall(PetscFree((*bag)->bagprefix));
5489566063dSJacob Faibussowitsch   PetscCall(PetscFree(*bag));
5495c6c1daeSBarry Smith   PetscFunctionReturn(0);
5505c6c1daeSBarry Smith }
5515c6c1daeSBarry Smith 
5525c6c1daeSBarry Smith /*@
5535c6c1daeSBarry Smith    PetscBagSetFromOptions - Allows setting options from a bag
5545c6c1daeSBarry Smith 
5555c6c1daeSBarry Smith    Collective on PetscBag
5565c6c1daeSBarry Smith 
5575c6c1daeSBarry Smith    Input Parameter:
5585c6c1daeSBarry Smith .  bag - the bag of values
5595c6c1daeSBarry Smith 
5605c6c1daeSBarry Smith    Level: beginner
5615c6c1daeSBarry Smith 
562db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()`
563db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
564db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagRegisterEnum()`
5655c6c1daeSBarry Smith 
5665c6c1daeSBarry Smith @*/
5679371c9d4SSatish Balay PetscErrorCode PetscBagSetFromOptions(PetscBag bag) {
5685c6c1daeSBarry Smith   PetscBagItem nitem = bag->bagitems;
5695c6c1daeSBarry Smith   char         name[PETSC_BAG_NAME_LENGTH + 1], helpname[PETSC_BAG_NAME_LENGTH + PETSC_BAG_HELP_LENGTH + 3];
5705c6c1daeSBarry Smith   PetscInt     n;
5715c6c1daeSBarry Smith 
5725c6c1daeSBarry Smith   PetscFunctionBegin;
5735f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
5749566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(helpname, bag->bagname, sizeof(helpname)));
5759566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(helpname, " ", sizeof(helpname)));
5769566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(helpname, bag->baghelp, sizeof(helpname)));
577d0609cedSBarry Smith   PetscOptionsBegin(bag->bagcomm, bag->bagprefix, helpname, NULL);
5785c6c1daeSBarry Smith   while (nitem) {
5795c6c1daeSBarry Smith     name[0] = '-';
5805c6c1daeSBarry Smith     name[1] = 0;
5819566063dSJacob Faibussowitsch     PetscCall(PetscStrlcat(name, nitem->name, sizeof(name)));
5825c6c1daeSBarry Smith     if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */
5835c6c1daeSBarry Smith       char *value = (char *)(((char *)bag) + nitem->offset);
5849566063dSJacob Faibussowitsch       PetscCall(PetscOptionsString(name, nitem->help, "", value, value, nitem->msize, NULL));
5855c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_REAL) {
5865c6c1daeSBarry Smith       PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset);
5875c6c1daeSBarry Smith       if (nitem->msize == 1) {
5889566063dSJacob Faibussowitsch         PetscCall(PetscOptionsReal(name, nitem->help, "", *value, value, NULL));
5895c6c1daeSBarry Smith       } else {
5905c6c1daeSBarry Smith         n = nitem->msize;
5919566063dSJacob Faibussowitsch         PetscCall(PetscOptionsRealArray(name, nitem->help, "", value, &n, NULL));
5925c6c1daeSBarry Smith       }
5935c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_SCALAR) {
5945c6c1daeSBarry Smith       PetscScalar *value = (PetscScalar *)(((char *)bag) + nitem->offset);
5959566063dSJacob Faibussowitsch       PetscCall(PetscOptionsScalar(name, nitem->help, "", *value, value, NULL));
5965c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_INT) {
5975c6c1daeSBarry Smith       PetscInt *value = (PetscInt *)(((char *)bag) + nitem->offset);
5985c6c1daeSBarry Smith       if (nitem->msize == 1) {
5999566063dSJacob Faibussowitsch         PetscCall(PetscOptionsInt(name, nitem->help, "", *value, value, NULL));
6005c6c1daeSBarry Smith       } else {
6015c6c1daeSBarry Smith         n = nitem->msize;
6029566063dSJacob Faibussowitsch         PetscCall(PetscOptionsIntArray(name, nitem->help, "", value, &n, NULL));
6035c6c1daeSBarry Smith       }
6045c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_ENUM) {
6055c6c1daeSBarry Smith       PetscEnum *value = (PetscEnum *)(((char *)bag) + nitem->offset);
6065c6c1daeSBarry Smith       PetscInt   i     = 0;
6079371c9d4SSatish Balay       while (nitem->list[i++])
6089371c9d4SSatish Balay         ;
6099566063dSJacob Faibussowitsch       PetscCall(PetscOptionsEnum(name, nitem->help, nitem->list[i - 3], (const char *const *)nitem->list, *value, value, NULL));
6105c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_BOOL) {
6115c6c1daeSBarry Smith       PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset);
612dd66f111SBlaise Bourdin       if (nitem->msize == 1) {
6139566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBool(name, nitem->help, "", *value, value, NULL));
614dd66f111SBlaise Bourdin       } else {
615dd66f111SBlaise Bourdin         n = nitem->msize;
6169566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBoolArray(name, nitem->help, "", value, &n, NULL));
617dd66f111SBlaise Bourdin       }
6185c6c1daeSBarry Smith     }
6195c6c1daeSBarry Smith     nitem = nitem->next;
6205c6c1daeSBarry Smith   }
621d0609cedSBarry Smith   PetscOptionsEnd();
6225c6c1daeSBarry Smith   PetscFunctionReturn(0);
6235c6c1daeSBarry Smith }
6245c6c1daeSBarry Smith 
6255c6c1daeSBarry Smith /*@C
6265c6c1daeSBarry Smith    PetscBagView - Views a bag of values as either ASCII text or a binary file
6275c6c1daeSBarry Smith 
6285c6c1daeSBarry Smith    Collective on PetscBag
6295c6c1daeSBarry Smith 
630d8d19677SJose E. Roman    Input Parameters:
6315c6c1daeSBarry Smith +  bag - the bag of values
6325c6c1daeSBarry Smith -  viewer - location to view the values
6335c6c1daeSBarry Smith 
6345c6c1daeSBarry Smith    Level: beginner
6355c6c1daeSBarry Smith 
6365c6c1daeSBarry Smith    Warning: Currently PETSc bags saved in a binary file can only be read back
6375c6c1daeSBarry Smith      in on a machine of the same architecture. Let us know when this is a problem
6385c6c1daeSBarry Smith      and we'll fix it.
6395c6c1daeSBarry Smith 
640db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()`
641db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
642db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`
6435c6c1daeSBarry Smith 
6445c6c1daeSBarry Smith @*/
6459371c9d4SSatish Balay PetscErrorCode PetscBagView(PetscBag bag, PetscViewer view) {
6465c6c1daeSBarry Smith   PetscBool    isascii, isbinary;
6475c6c1daeSBarry Smith   PetscBagItem nitem = bag->bagitems;
6485c6c1daeSBarry Smith 
6495c6c1daeSBarry Smith   PetscFunctionBegin;
6505f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
6515f80ce2aSJacob Faibussowitsch   PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 2);
6529566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERASCII, &isascii));
6539566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary));
6545c6c1daeSBarry Smith   if (isascii) {
6553ffde785SBarry Smith     if (bag->bagprefix) {
6569566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object:  %s (%s) %s\n", bag->bagname, bag->bagprefix, bag->baghelp));
6573ffde785SBarry Smith     } else {
6589566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object:  %s %s\n", bag->bagname, bag->baghelp));
6593ffde785SBarry Smith     }
6605c6c1daeSBarry Smith     while (nitem) {
6615c6c1daeSBarry Smith       if (nitem->dtype == PETSC_CHAR) {
6625c6c1daeSBarry Smith         char *value             = (char *)(((char *)bag) + nitem->offset);
6635c6c1daeSBarry Smith         char  tmp               = value[nitem->msize - 1]; /* special handling for fortran chars wihout null terminator */
6645c6c1daeSBarry Smith         value[nitem->msize - 1] = 0;
6659566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %s; %s\n", nitem->name, value, nitem->help));
6665c6c1daeSBarry Smith         value[nitem->msize - 1] = tmp;
6675c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_REAL) {
6685c6c1daeSBarry Smith         PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset);
6695c6c1daeSBarry Smith         PetscInt   i;
6709566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
671*48a46eb9SPierre Jolivet         for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%g ", (double)value[i]));
6729566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
6735c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_SCALAR) {
6745c6c1daeSBarry Smith         PetscScalar value = *(PetscScalar *)(((char *)bag) + nitem->offset);
6755c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
6768627564fSBarry Smith         if ((double)PetscImaginaryPart(value)) {
6779566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g + %gi; %s\n", nitem->name, (double)PetscRealPart(value), (double)PetscImaginaryPart(value), nitem->help));
6788627564fSBarry Smith         } else {
6799566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g; %s\n", nitem->name, (double)PetscRealPart(value), nitem->help));
6808627564fSBarry Smith         }
6815c6c1daeSBarry Smith #else
6829566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g; %s\n", nitem->name, (double)value, nitem->help));
6835c6c1daeSBarry Smith #endif
6845c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_INT) {
6855c6c1daeSBarry Smith         PetscInt i, *value = (PetscInt *)(((char *)bag) + nitem->offset);
6869566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
687*48a46eb9SPierre Jolivet         for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%" PetscInt_FMT " ", value[i]));
6889566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
6895c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_BOOL) {
690dd66f111SBlaise Bourdin         PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset);
691dd66f111SBlaise Bourdin         PetscInt   i;
6925c6c1daeSBarry Smith         /* some Fortran compilers use -1 as boolean */
6939566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
694dd66f111SBlaise Bourdin         for (i = 0; i < nitem->msize; i++) {
695dd66f111SBlaise Bourdin           if (((int)value[i]) == -1) value[i] = PETSC_TRUE;
6965c6c1daeSBarry 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 */
6975f80ce2aSJacob 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]));
6989566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, " %s", PetscBools[value[i]]));
699dd66f111SBlaise Bourdin         }
7009566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
7015c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_ENUM) {
7025c6c1daeSBarry Smith         PetscEnum value = *(PetscEnum *)(((char *)bag) + nitem->offset);
7035c6c1daeSBarry Smith         PetscInt  i     = 0;
7049371c9d4SSatish Balay         while (nitem->list[i++])
7059371c9d4SSatish Balay           ;
7069566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %s; (%s) %s\n", nitem->name, nitem->list[value], nitem->list[i - 3], nitem->help));
7075c6c1daeSBarry Smith       }
7085c6c1daeSBarry Smith       nitem = nitem->next;
7095c6c1daeSBarry Smith     }
7105c6c1daeSBarry Smith   } else if (isbinary) {
7115c6c1daeSBarry Smith     PetscInt          classid           = PETSC_BAG_FILE_CLASSID, dtype;
7125c6c1daeSBarry Smith     PetscInt          deprecatedbagsize = 0;
713a261c58fSBarry Smith     PetscViewerFormat format;
7149566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &classid, 1, PETSC_INT));
7159566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &deprecatedbagsize, 1, PETSC_INT));
7169566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &bag->count, 1, PETSC_INT));
7179566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, bag->bagname, PETSC_BAG_NAME_LENGTH, PETSC_CHAR));
7189566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, PETSC_CHAR));
7195c6c1daeSBarry Smith     while (nitem) {
7209566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &nitem->offset, 1, PETSC_INT));
7215c6c1daeSBarry Smith       dtype = (PetscInt)nitem->dtype;
7229566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &dtype, 1, PETSC_INT));
7239566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, nitem->name, PETSC_BAG_NAME_LENGTH, PETSC_CHAR));
7249566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, nitem->help, PETSC_BAG_HELP_LENGTH, PETSC_CHAR));
7259566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &nitem->msize, 1, PETSC_INT));
7265c6c1daeSBarry Smith       /* some Fortran compilers use -1 as boolean */
7275c6c1daeSBarry Smith       if (dtype == PETSC_BOOL && ((*(int *)(((char *)bag) + nitem->offset) == -1))) *(int *)(((char *)bag) + nitem->offset) = PETSC_TRUE;
7285c6c1daeSBarry Smith 
7299566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, (((char *)bag) + nitem->offset), nitem->msize, nitem->dtype));
730*48a46eb9SPierre Jolivet       if (dtype == PETSC_ENUM) PetscCall(PetscViewerBinaryWriteStringArray(view, (const char *const *)nitem->list));
7315c6c1daeSBarry Smith       nitem = nitem->next;
7325c6c1daeSBarry Smith     }
7339566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(view, &format));
734a261c58fSBarry Smith     if (format == PETSC_VIEWER_BINARY_MATLAB) {
735a261c58fSBarry Smith       MPI_Comm comm;
736a261c58fSBarry Smith       FILE    *info;
7379566063dSJacob Faibussowitsch       PetscCall(PetscObjectGetComm((PetscObject)view, &comm));
7389566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryGetInfoPointer(view, &info));
7399566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#--- begin code written by PetscViewerBinary for MATLAB format ---#\n"));
7409566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#$$ Set.%s = PetscBinaryRead(fd);\n", bag->bagname));
7419566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n"));
742a261c58fSBarry Smith     }
743a261c58fSBarry Smith   }
7445c6c1daeSBarry Smith   PetscFunctionReturn(0);
7455c6c1daeSBarry Smith }
7465c6c1daeSBarry Smith 
7475c6c1daeSBarry Smith /*@C
748173f9484SMatthew G. Knepley   PetscBagViewFromOptions - Processes command line options to determine if/how a PetscBag is to be viewed.
749173f9484SMatthew G. Knepley 
750173f9484SMatthew G. Knepley   Collective on PetscBag
751173f9484SMatthew G. Knepley 
752173f9484SMatthew G. Knepley   Input Parameters:
753173f9484SMatthew G. Knepley + obj   - the object
754173f9484SMatthew G. Knepley . bobj  - optional other object that provides prefix (if NULL then the prefix in obj is used)
755173f9484SMatthew G. Knepley - optionname - option to activate viewing
756478db826SMatthew G. Knepley 
757173f9484SMatthew G. Knepley   Level: intermediate
758478db826SMatthew G. Knepley 
759db781477SPatrick Sanan .seealso: `PetscBagCreate()`, `PetscBag`, `PetscViewer`
760173f9484SMatthew G. Knepley @*/
7619371c9d4SSatish Balay PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[]) {
762173f9484SMatthew G. Knepley   static PetscBool  incall = PETSC_FALSE;
763173f9484SMatthew G. Knepley   PetscViewer       viewer;
764173f9484SMatthew G. Knepley   PetscViewerFormat format;
765173f9484SMatthew G. Knepley   const char       *prefix, *bprefix = NULL;
766173f9484SMatthew G. Knepley   PetscBool         flg;
767173f9484SMatthew G. Knepley 
768173f9484SMatthew G. Knepley   PetscFunctionBegin;
769173f9484SMatthew G. Knepley   if (incall) PetscFunctionReturn(0);
770173f9484SMatthew G. Knepley   incall = PETSC_TRUE;
7715f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
7729566063dSJacob Faibussowitsch   if (bobj) PetscCall(PetscObjectGetOptionsPrefix(bobj, &bprefix));
773173f9484SMatthew G. Knepley   prefix = bobj ? bprefix : bag->bagprefix;
7749566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg));
775173f9484SMatthew G. Knepley   if (flg) {
7769566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, format));
7779566063dSJacob Faibussowitsch     PetscCall(PetscBagView(bag, viewer));
7789566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(viewer));
7799566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
7809566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
781173f9484SMatthew G. Knepley   }
782173f9484SMatthew G. Knepley   incall = PETSC_FALSE;
783173f9484SMatthew G. Knepley   PetscFunctionReturn(0);
784173f9484SMatthew G. Knepley }
785173f9484SMatthew G. Knepley 
786173f9484SMatthew G. Knepley /*@C
7875c6c1daeSBarry Smith    PetscBagLoad - Loads a bag of values from a binary file
7885c6c1daeSBarry Smith 
7895c6c1daeSBarry Smith    Collective on PetscViewer
7905c6c1daeSBarry Smith 
791d8d19677SJose E. Roman    Input Parameters:
7925c6c1daeSBarry Smith +  viewer - file to load values from
7935c6c1daeSBarry Smith -  bag - the bag of values
7945c6c1daeSBarry Smith 
79595452b02SPatrick Sanan    Notes:
79695452b02SPatrick Sanan     You must have created and registered all the fields in the bag before loading into it.
7975c6c1daeSBarry Smith 
7985c6c1daeSBarry Smith    Notes:
7995c6c1daeSBarry Smith    Level: beginner
8005c6c1daeSBarry Smith 
801db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagView()`, `PetscBagGetData()`
802db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
803db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
8045c6c1daeSBarry Smith 
8055c6c1daeSBarry Smith @*/
8069371c9d4SSatish Balay PetscErrorCode PetscBagLoad(PetscViewer view, PetscBag bag) {
8075c6c1daeSBarry Smith   PetscBool    isbinary;
8085f80ce2aSJacob Faibussowitsch   PetscInt     classid, bagcount, dtype, msize, offset, deprecatedbagsize;
8095c6c1daeSBarry Smith   char         name[PETSC_BAG_NAME_LENGTH], help[PETSC_BAG_HELP_LENGTH], **list;
8105c6c1daeSBarry Smith   PetscBagItem nitem;
8115c6c1daeSBarry Smith   MPI_Comm     comm;
8125c6c1daeSBarry Smith   PetscMPIInt  flag;
8135c6c1daeSBarry Smith 
8145c6c1daeSBarry Smith   PetscFunctionBegin;
8155f80ce2aSJacob Faibussowitsch   PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 1);
8165f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 2);
8179566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)view, &comm));
8189566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_compare(comm, bag->bagcomm, &flag));
8195f80ce2aSJacob Faibussowitsch   PetscCheck(flag == MPI_CONGRUENT || flag == MPI_IDENT, PETSC_COMM_SELF, PETSC_ERR_ARG_NOTSAMECOMM, "Different communicators in the viewer and bag");
8209566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary));
8215f80ce2aSJacob Faibussowitsch   PetscCheck(isbinary, PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for this viewer type");
8225c6c1daeSBarry Smith 
8239566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &classid, 1, NULL, PETSC_INT));
8245f80ce2aSJacob Faibussowitsch   PetscCheck(classid == PETSC_BAG_FILE_CLASSID, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Not PetscBag next in binary file");
8259566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &deprecatedbagsize, 1, NULL, PETSC_INT));
8269566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &bagcount, 1, NULL, PETSC_INT));
8275f80ce2aSJacob 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);
8289566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, bag->bagname, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR));
8299566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR));
8305c6c1daeSBarry Smith 
8315c6c1daeSBarry Smith   nitem = bag->bagitems;
8325f80ce2aSJacob Faibussowitsch   for (PetscInt i = 0; i < bagcount; i++) {
8339566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &offset, 1, NULL, PETSC_INT));
8345c6c1daeSBarry Smith     /* ignore the offset in the file */
8359566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &dtype, 1, NULL, PETSC_INT));
8369566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, name, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR));
8379566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, help, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR));
8389566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &msize, 1, NULL, PETSC_INT));
8395c6c1daeSBarry Smith 
8405c6c1daeSBarry Smith     if (dtype == (PetscInt)PETSC_CHAR) {
8419566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_CHAR));
8425c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_REAL) {
8439566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_REAL));
8445c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_SCALAR) {
8459566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_SCALAR));
8465c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_INT) {
8479566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_INT));
8485c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_BOOL) {
8499566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_BOOL));
8505c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_ENUM) {
8519566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_ENUM));
8529566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryReadStringArray(view, &list));
8535c6c1daeSBarry Smith       /* don't need to save list because it is already registered in the bag */
8549566063dSJacob Faibussowitsch       PetscCall(PetscFree(list));
8555c6c1daeSBarry Smith     }
8565c6c1daeSBarry Smith     nitem = nitem->next;
8575c6c1daeSBarry Smith   }
8585c6c1daeSBarry Smith   PetscFunctionReturn(0);
8595c6c1daeSBarry Smith }
8605c6c1daeSBarry Smith 
861e8976759SBarry Smith /*@C
8625c6c1daeSBarry Smith     PetscBagCreate - Create a bag of values
8635c6c1daeSBarry Smith 
864d083f849SBarry Smith   Collective
8655c6c1daeSBarry Smith 
8665c6c1daeSBarry Smith   Level: Intermediate
8675c6c1daeSBarry Smith 
8685c6c1daeSBarry Smith   Input Parameters:
8695c6c1daeSBarry Smith +  comm - communicator to share bag
8705c6c1daeSBarry Smith -  bagsize - size of the C structure holding the values
8715c6c1daeSBarry Smith 
8725c6c1daeSBarry Smith   Output Parameter:
8735c6c1daeSBarry Smith .   bag - the bag of values
8745c6c1daeSBarry Smith 
8755c6c1daeSBarry Smith    Notes:
8765c6c1daeSBarry Smith       The size of the A struct must be small enough to fit in a PetscInt; by default
8775c6c1daeSBarry Smith       PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length.
8785c6c1daeSBarry Smith       The warning about casting to a shorter length can be ignored below unless your A struct is too large
8795c6c1daeSBarry Smith 
880db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
881db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
882db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
8835c6c1daeSBarry Smith @*/
8849371c9d4SSatish Balay PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag) {
8855f80ce2aSJacob Faibussowitsch   const size_t totalsize = bagsize + sizeof(struct _n_PetscBag) + sizeof(PetscScalar);
8865c6c1daeSBarry Smith 
8875c6c1daeSBarry Smith   PetscFunctionBegin;
8885f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 3);
8899566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Creating Bag with total size %d\n", (int)totalsize));
8909566063dSJacob Faibussowitsch   PetscCall(PetscCalloc(totalsize, bag));
891a297a907SKarl Rupp 
8925f80ce2aSJacob Faibussowitsch   (*bag)->bagsize        = totalsize;
8935c6c1daeSBarry Smith   (*bag)->bagcomm        = comm;
8940298fd71SBarry Smith   (*bag)->bagprefix      = NULL;
8955c6c1daeSBarry Smith   (*bag)->structlocation = (void *)(((char *)(*bag)) + sizeof(PetscScalar) * (sizeof(struct _n_PetscBag) / sizeof(PetscScalar)) + sizeof(PetscScalar));
8965c6c1daeSBarry Smith   PetscFunctionReturn(0);
8975c6c1daeSBarry Smith }
8985c6c1daeSBarry Smith 
8995c6c1daeSBarry Smith /*@C
9005c6c1daeSBarry Smith     PetscBagSetName - Sets the name of a bag of values
9015c6c1daeSBarry Smith 
9025c6c1daeSBarry Smith   Not Collective
9035c6c1daeSBarry Smith 
9045c6c1daeSBarry Smith   Level: Intermediate
9055c6c1daeSBarry Smith 
9065c6c1daeSBarry Smith   Input Parameters:
9075c6c1daeSBarry Smith +   bag - the bag of values
9085c6c1daeSBarry Smith .   name - the name assigned to the bag
9095c6c1daeSBarry Smith -   help - help message for bag
9105c6c1daeSBarry Smith 
911db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
912db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
913db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9145c6c1daeSBarry Smith @*/
9155c6c1daeSBarry Smith 
9169371c9d4SSatish Balay PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help) {
9175c6c1daeSBarry Smith   PetscFunctionBegin;
9185f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
9195f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 2);
9205f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 3);
9219566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(bag->bagname, name, PETSC_BAG_NAME_LENGTH - 1));
9229566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(bag->baghelp, help, PETSC_BAG_HELP_LENGTH - 1));
9235c6c1daeSBarry Smith   PetscFunctionReturn(0);
9245c6c1daeSBarry Smith }
9255c6c1daeSBarry Smith 
9265c6c1daeSBarry Smith /*@C
9275c6c1daeSBarry Smith     PetscBagGetName - Gets the name of a bag of values
9285c6c1daeSBarry Smith 
9295c6c1daeSBarry Smith   Not Collective
9305c6c1daeSBarry Smith 
9315c6c1daeSBarry Smith   Level: Intermediate
9325c6c1daeSBarry Smith 
9335c6c1daeSBarry Smith   Input Parameter:
9345c6c1daeSBarry Smith .   bag - the bag of values
9355c6c1daeSBarry Smith 
9365c6c1daeSBarry Smith   Output Parameter:
9375c6c1daeSBarry Smith .   name - the name assigned to the bag
9385c6c1daeSBarry Smith 
939db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
940db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
941db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9425c6c1daeSBarry Smith @*/
9439371c9d4SSatish Balay PetscErrorCode PetscBagGetName(PetscBag bag, char **name) {
9445c6c1daeSBarry Smith   PetscFunctionBegin;
9455f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
9465f80ce2aSJacob Faibussowitsch   PetscValidPointer(name, 2);
9475c6c1daeSBarry Smith   *name = bag->bagname;
9485c6c1daeSBarry Smith   PetscFunctionReturn(0);
9495c6c1daeSBarry Smith }
9505c6c1daeSBarry Smith 
9515c6c1daeSBarry Smith /*@C
9525c6c1daeSBarry Smith     PetscBagGetData - Gives back the user - access to memory that
9535c6c1daeSBarry Smith     should be used for storing user-data-structure
9545c6c1daeSBarry Smith 
9555c6c1daeSBarry Smith   Not Collective
9565c6c1daeSBarry Smith 
9575c6c1daeSBarry Smith   Level: Intermediate
9585c6c1daeSBarry Smith 
9595c6c1daeSBarry Smith   Input Parameter:
9605c6c1daeSBarry Smith .   bag - the bag of values
9615c6c1daeSBarry Smith 
9625c6c1daeSBarry Smith   Output Parameter:
9635c6c1daeSBarry Smith .   data - pointer to memory that will have user-data-structure
9645c6c1daeSBarry Smith 
965db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`
966db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
967db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9685c6c1daeSBarry Smith @*/
9699371c9d4SSatish Balay PetscErrorCode PetscBagGetData(PetscBag bag, void **data) {
9705c6c1daeSBarry Smith   PetscFunctionBegin;
9715f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
9725f80ce2aSJacob Faibussowitsch   PetscValidPointer(data, 2);
9735c6c1daeSBarry Smith   *data = bag->structlocation;
9745c6c1daeSBarry Smith   PetscFunctionReturn(0);
9755c6c1daeSBarry Smith }
9765c6c1daeSBarry Smith 
9775c6c1daeSBarry Smith /*@C
9785c6c1daeSBarry Smith   PetscBagSetOptionsPrefix - Sets the prefix used for searching for all
9795c6c1daeSBarry Smith   PetscBag items in the options database.
9805c6c1daeSBarry Smith 
9815c6c1daeSBarry Smith   Logically collective on Bag.
9825c6c1daeSBarry Smith 
9835c6c1daeSBarry Smith   Level: Intermediate
9845c6c1daeSBarry Smith 
9855c6c1daeSBarry Smith   Input Parameters:
9865c6c1daeSBarry Smith +   bag - the bag of values
9875c6c1daeSBarry Smith -   prefix - the prefix to prepend all Bag item names with.
9885c6c1daeSBarry Smith 
9895c6c1daeSBarry Smith   NOTES: Must be called prior to registering any of the bag items.
9905c6c1daeSBarry Smith 
991db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
992db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9935c6c1daeSBarry Smith @*/
9945c6c1daeSBarry Smith 
9959371c9d4SSatish Balay PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[]) {
9965c6c1daeSBarry Smith   PetscFunctionBegin;
9975f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
9985f80ce2aSJacob Faibussowitsch   if (pre) {
9995f80ce2aSJacob Faibussowitsch     PetscValidCharPointer(pre, 2);
10005f80ce2aSJacob Faibussowitsch     PetscCheck(pre[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Options prefix should not begin with a hyphen");
10019566063dSJacob Faibussowitsch     PetscCall(PetscFree(bag->bagprefix));
10029566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(pre, &(bag->bagprefix)));
10039566063dSJacob Faibussowitsch   } else PetscCall(PetscFree(bag->bagprefix));
10045c6c1daeSBarry Smith   PetscFunctionReturn(0);
10055c6c1daeSBarry Smith }
1006ffb7e86cSMatthew G. Knepley 
1007ffb7e86cSMatthew G. Knepley /*@C
1008ffb7e86cSMatthew G. Knepley   PetscBagGetNames - Get the names of all entries in the bag
1009ffb7e86cSMatthew G. Knepley 
1010ffb7e86cSMatthew G. Knepley   Not collective
1011ffb7e86cSMatthew G. Knepley 
1012ffb7e86cSMatthew G. Knepley   Input Parameters:
1013ffb7e86cSMatthew G. Knepley + bag   - the bag of values
1014ffb7e86cSMatthew G. Knepley - names - array of the correct size to hold names
1015ffb7e86cSMatthew G. Knepley 
1016ffb7e86cSMatthew G. Knepley   Output Parameter:
1017ffb7e86cSMatthew G. Knepley . names - array of char pointers for names
1018ffb7e86cSMatthew G. Knepley 
1019ffb7e86cSMatthew G. Knepley   Level: intermediate
1020ffb7e86cSMatthew G. Knepley 
1021db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagSetName()`, `PetscBagCreate()`, `PetscBagGetData()`
1022db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
1023ffb7e86cSMatthew G. Knepley @*/
10249371c9d4SSatish Balay PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[]) {
1025ffb7e86cSMatthew G. Knepley   PetscBagItem nitem = bag->bagitems;
1026ffb7e86cSMatthew G. Knepley 
1027ffb7e86cSMatthew G. Knepley   PetscFunctionBegin;
10285f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
10295f80ce2aSJacob Faibussowitsch   PetscValidPointer(names, 2);
10305f80ce2aSJacob Faibussowitsch   for (PetscInt n = 0; nitem; ++n, nitem = nitem->next) names[n] = nitem->name;
1031ffb7e86cSMatthew G. Knepley   PetscFunctionReturn(0);
1032ffb7e86cSMatthew G. Knepley }
1033