xref: /petsc/src/sys/classes/bag/bag.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
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
23*811af0c4SBarry Smith    PetscBagRegisterEnum - add an enum value to a `PetscBag`
245c6c1daeSBarry Smith 
25*811af0c4SBarry Smith    Logically Collective on bag
265c6c1daeSBarry Smith 
27d8d19677SJose E. Roman    Input Parameters:
285c6c1daeSBarry Smith +  bag - the bag of values
29*811af0c4SBarry Smith .  addr - location of enum in struct, for example `&params->dt`
305c6c1daeSBarry Smith .  list - array of strings containing names of enum values followed by enum name followed by enum prefix
31*811af0c4SBarry Smith .  mdefault - the initial value, cast with (`PetscEnum`)
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 @*/
409371c9d4SSatish Balay PetscErrorCode PetscBagRegisterEnum(PetscBag bag, void *addr, const char *const *list, PetscEnum mdefault, const char *name, const char *help) {
415c6c1daeSBarry Smith   PetscBagItem item;
425c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
435c6c1daeSBarry Smith   PetscBool    printhelp;
445c6c1daeSBarry Smith   PetscInt     i = 0;
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith   PetscFunctionBegin;
475f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
485f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
495f80ce2aSJacob Faibussowitsch   PetscValidPointer(list, 3);
505f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 5);
515f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 6);
525c6c1daeSBarry Smith   nname[0] = '-';
535c6c1daeSBarry Smith   nname[1] = 0;
549566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
559566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
565c6c1daeSBarry Smith   if (printhelp) {
579371c9d4SSatish Balay     while (list[i++])
589371c9d4SSatish Balay       ;
599566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: (%s) %s (choose one of) ", bag->bagprefix ? bag->bagprefix : "", name, list[mdefault], list[i - 3], help));
609566063dSJacob Faibussowitsch     for (i = 0; list[i + 2]; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " %s", list[i]));
619566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "\n"));
625c6c1daeSBarry Smith   }
639566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetEnum(NULL, bag->bagprefix, nname, list, &mdefault, NULL));
645c6c1daeSBarry Smith 
659566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
665c6c1daeSBarry Smith   item->dtype  = PETSC_ENUM;
675c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
685f80ce2aSJacob 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);
6902c9f0b5SLisandro Dalcin   item->next  = NULL;
705c6c1daeSBarry Smith   item->msize = 1;
719566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(list, (char ***)&item->list));
725c6c1daeSBarry Smith   *(PetscEnum *)addr = mdefault;
739566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
745c6c1daeSBarry Smith   PetscFunctionReturn(0);
755c6c1daeSBarry Smith }
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith /*@C
78*811af0c4SBarry Smith    PetscBagRegisterIntArray - add an `PetscInt` array to a `PetscBag`
795c6c1daeSBarry Smith 
80*811af0c4SBarry Smith    Logically Collective on bag
815c6c1daeSBarry Smith 
82d8d19677SJose E. Roman    Input Parameters:
835c6c1daeSBarry Smith +  bag - the bag of values
84*811af0c4SBarry Smith .  addr - location of integer in struct, for example `&params->i`
855c6c1daeSBarry Smith .  msize - number of entries in array
86*811af0c4SBarry Smith .  name - name of the array
875c6c1daeSBarry Smith -  help - longer string with more information about the value
885c6c1daeSBarry Smith 
895c6c1daeSBarry Smith    Level: beginner
905c6c1daeSBarry Smith 
91db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
92db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
93db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
945c6c1daeSBarry Smith @*/
959371c9d4SSatish Balay PetscErrorCode PetscBagRegisterIntArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help) {
965c6c1daeSBarry Smith   PetscBagItem item;
975c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
985c6c1daeSBarry Smith   PetscBool    printhelp;
995c6c1daeSBarry Smith   PetscInt     i, tmp = msize;
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith   PetscFunctionBegin;
1025f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
1035f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
1045f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
1055f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
1065c6c1daeSBarry Smith   nname[0] = '-';
1075c6c1daeSBarry Smith   nname[1] = 0;
1089566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
1099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
1105c6c1daeSBarry Smith   if (printhelp) {
1119566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <", bag->bagprefix ? bag->bagprefix : "", name));
11248a46eb9SPierre Jolivet     for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i));
1139566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help));
1145c6c1daeSBarry Smith   }
1159566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetIntArray(NULL, bag->bagprefix, nname, (PetscInt *)addr, &tmp, NULL));
1165c6c1daeSBarry Smith 
1179566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
1185c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
1195c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
1205f80ce2aSJacob 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);
12102c9f0b5SLisandro Dalcin   item->next  = NULL;
1225c6c1daeSBarry Smith   item->msize = msize;
1239566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
1245c6c1daeSBarry Smith   PetscFunctionReturn(0);
1255c6c1daeSBarry Smith }
1265c6c1daeSBarry Smith 
1275c6c1daeSBarry Smith /*@C
128*811af0c4SBarry Smith    PetscBagRegisterRealArray - add an `PetscReal` array to a `PetscBag`
1295c6c1daeSBarry Smith 
130*811af0c4SBarry Smith    Logically Collective on bag
1315c6c1daeSBarry Smith 
132d8d19677SJose E. Roman    Input Parameters:
1335c6c1daeSBarry Smith +  bag - the bag of values
134*811af0c4SBarry Smith .  addr - location of real array in struct, for example `&params->d`
135*811af0c4SBarry Smith .  msize - number of entries in the array
136*811af0c4SBarry Smith .  name - name of the array
1375c6c1daeSBarry Smith -  help - longer string with more information about the value
1385c6c1daeSBarry Smith 
1395c6c1daeSBarry Smith    Level: beginner
1405c6c1daeSBarry Smith 
141db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
142db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
143db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
1445c6c1daeSBarry Smith @*/
1459371c9d4SSatish Balay PetscErrorCode PetscBagRegisterRealArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help) {
1465c6c1daeSBarry Smith   PetscBagItem item;
1475c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
1485c6c1daeSBarry Smith   PetscBool    printhelp;
1495c6c1daeSBarry Smith   PetscInt     i, tmp = msize;
1505c6c1daeSBarry Smith 
1515c6c1daeSBarry Smith   PetscFunctionBegin;
1525f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
1535f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
1545f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
1555f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
1565c6c1daeSBarry Smith   nname[0] = '-';
1575c6c1daeSBarry Smith   nname[1] = 0;
1589566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
1599566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
1605c6c1daeSBarry Smith   if (printhelp) {
1619566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <", bag->bagprefix ? bag->bagprefix : "", name));
16248a46eb9SPierre Jolivet     for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%g ", (double)*((PetscReal *)addr) + i));
1639566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help));
1645c6c1daeSBarry Smith   }
1659566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetRealArray(NULL, bag->bagprefix, nname, (PetscReal *)addr, &tmp, NULL));
1665c6c1daeSBarry Smith 
1679566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
1685c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
1695c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
1705f80ce2aSJacob 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);
17102c9f0b5SLisandro Dalcin   item->next  = NULL;
1725c6c1daeSBarry Smith   item->msize = msize;
1739566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
1745c6c1daeSBarry Smith   PetscFunctionReturn(0);
1755c6c1daeSBarry Smith }
1765c6c1daeSBarry Smith 
1775c6c1daeSBarry Smith /*@C
178*811af0c4SBarry Smith    PetscBagRegisterInt - add an `PetscInt` value to a `PetscBag`
1795c6c1daeSBarry Smith 
180*811af0c4SBarry Smith    Logically Collective on bag
1815c6c1daeSBarry Smith 
182d8d19677SJose E. Roman    Input Parameters:
1835c6c1daeSBarry Smith +  bag - the bag of values
184*811af0c4SBarry Smith .  addr - location of integer in struct, for example `&params->i`
1855c6c1daeSBarry Smith .  mdefault - the initial value
1865c6c1daeSBarry Smith .  name - name of the integer
1875c6c1daeSBarry Smith -  help - longer string with more information about the value
1885c6c1daeSBarry Smith 
1895c6c1daeSBarry Smith    Level: beginner
1905c6c1daeSBarry Smith 
191db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
192db781477SPatrick Sanan           `PetscBagRegisterInt64()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
193db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
1945c6c1daeSBarry Smith @*/
1959371c9d4SSatish Balay PetscErrorCode PetscBagRegisterInt(PetscBag bag, void *addr, PetscInt mdefault, const char *name, const char *help) {
1965c6c1daeSBarry Smith   PetscBagItem item;
1975c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
1985c6c1daeSBarry Smith   PetscBool    printhelp;
1995c6c1daeSBarry Smith 
2005c6c1daeSBarry Smith   PetscFunctionBegin;
2015f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
2025f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
2035f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
2045f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
2055c6c1daeSBarry Smith   nname[0] = '-';
2065c6c1daeSBarry Smith   nname[1] = 0;
2079566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
2089566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
20948a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help));
2109566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &mdefault, NULL));
2115c6c1daeSBarry Smith 
2129566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
2135c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
2145c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
2155f80ce2aSJacob 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);
21602c9f0b5SLisandro Dalcin   item->next        = NULL;
2175c6c1daeSBarry Smith   item->msize       = 1;
2185c6c1daeSBarry Smith   *(PetscInt *)addr = mdefault;
2199566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
2205c6c1daeSBarry Smith   PetscFunctionReturn(0);
2215c6c1daeSBarry Smith }
2225c6c1daeSBarry Smith 
2230d349d43SBarry Smith /*@C
224*811af0c4SBarry Smith    PetscBagRegisterInt64 - add a `PetscInt64` value to a `PetscBag`
2250d349d43SBarry Smith 
226*811af0c4SBarry Smith    Logically Collective on bag
2270d349d43SBarry Smith 
228d8d19677SJose E. Roman    Input Parameters:
2290d349d43SBarry Smith +  bag - the bag of values
230*811af0c4SBarry Smith .  addr - location of integer in struct, for example `&params->i`
2310d349d43SBarry Smith .  mdefault - the initial value
2320d349d43SBarry Smith .  name - name of the integer
2330d349d43SBarry Smith -  help - longer string with more information about the value
2340d349d43SBarry Smith 
2350d349d43SBarry Smith    Level: beginner
2360d349d43SBarry Smith 
237db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
238db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
239db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
2400d349d43SBarry Smith @*/
2419371c9d4SSatish Balay PetscErrorCode PetscBagRegisterInt64(PetscBag bag, void *addr, PetscInt64 mdefault, const char *name, const char *help) {
2420d349d43SBarry Smith   PetscBagItem item;
2430d349d43SBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
2440d349d43SBarry Smith   PetscBool    printhelp;
2450d349d43SBarry Smith   PetscInt     odefault = (PetscInt)mdefault;
2460d349d43SBarry Smith   PetscBool    flg;
2470d349d43SBarry Smith 
2480d349d43SBarry Smith   PetscFunctionBegin;
2490d349d43SBarry Smith   nname[0] = '-';
2500d349d43SBarry Smith   nname[1] = 0;
2519566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
2529566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
25348a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, odefault, help));
2549566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &odefault, &flg));
255bafee8b4SSatish Balay   if (flg) mdefault = (PetscInt64)odefault;
2560d349d43SBarry Smith 
2579566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
2580d349d43SBarry Smith   item->dtype  = PETSC_INT;
2590d349d43SBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
2605f80ce2aSJacob 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);
26102c9f0b5SLisandro Dalcin   item->next          = NULL;
2620d349d43SBarry Smith   item->msize         = 1;
263bafee8b4SSatish Balay   *(PetscInt64 *)addr = mdefault;
2649566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
2650d349d43SBarry Smith   PetscFunctionReturn(0);
2660d349d43SBarry Smith }
2670d349d43SBarry Smith 
268dd66f111SBlaise Bourdin /*@C
269*811af0c4SBarry Smith    PetscBagRegisterBoolArray - add a n `PetscBool` values to a `PetscBag`
270dd66f111SBlaise Bourdin 
271*811af0c4SBarry Smith    Logically Collective on bag
272dd66f111SBlaise Bourdin 
273d8d19677SJose E. Roman    Input Parameters:
274dd66f111SBlaise Bourdin +  bag - the bag of values
275*811af0c4SBarry Smith .  addr - location of boolean array in struct, for example `&params->b`
276dd66f111SBlaise Bourdin .  msize - number of entries in array
277dd66f111SBlaise Bourdin .  name - name of the boolean array
278dd66f111SBlaise Bourdin -  help - longer string with more information about the value
279dd66f111SBlaise Bourdin 
280dd66f111SBlaise Bourdin    Level: beginner
281dd66f111SBlaise Bourdin 
282db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
283db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
284db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
285dd66f111SBlaise Bourdin @*/
2869371c9d4SSatish Balay PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help) {
287dd66f111SBlaise Bourdin   PetscBagItem item;
288dd66f111SBlaise Bourdin   char         nname[PETSC_BAG_NAME_LENGTH + 1];
289dd66f111SBlaise Bourdin   PetscBool    printhelp;
290dd66f111SBlaise Bourdin   PetscInt     i, tmp = msize;
291dd66f111SBlaise Bourdin 
292dd66f111SBlaise Bourdin   PetscFunctionBegin;
2935f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
2945f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
2955f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
2965f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
297dd66f111SBlaise Bourdin   nname[0] = '-';
298dd66f111SBlaise Bourdin   nname[1] = 0;
2999566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
3009566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
301dd66f111SBlaise Bourdin   if (printhelp) {
3029566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <", bag->bagprefix ? bag->bagprefix : "", name));
30348a46eb9SPierre Jolivet     for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i));
3049566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help));
305dd66f111SBlaise Bourdin   }
3069566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBoolArray(NULL, bag->bagprefix, nname, (PetscBool *)addr, &tmp, NULL));
307dd66f111SBlaise Bourdin 
3089566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
309dd66f111SBlaise Bourdin   item->dtype  = PETSC_BOOL;
310dd66f111SBlaise Bourdin   item->offset = ((char *)addr) - ((char *)bag);
3115f80ce2aSJacob 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);
31202c9f0b5SLisandro Dalcin   item->next  = NULL;
313dd66f111SBlaise Bourdin   item->msize = msize;
3149566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
315dd66f111SBlaise Bourdin   PetscFunctionReturn(0);
316dd66f111SBlaise Bourdin }
317dd66f111SBlaise Bourdin 
3185c6c1daeSBarry Smith /*@C
319*811af0c4SBarry Smith    PetscBagRegisterString - add a string value to a `PetscBag`
3205c6c1daeSBarry Smith 
321*811af0c4SBarry Smith    Logically Collective on bag
3225c6c1daeSBarry Smith 
323d8d19677SJose E. Roman    Input Parameters:
3245c6c1daeSBarry Smith +  bag - the bag of values
325*811af0c4SBarry Smith .  addr - location of start of string in struct, for example `&params->mystring`
3265c6c1daeSBarry Smith .  msize - length of the string space in the struct
3275c6c1daeSBarry Smith .  mdefault - the initial value
3285c6c1daeSBarry Smith .  name - name of the string
3295c6c1daeSBarry Smith -  help - longer string with more information about the value
3305c6c1daeSBarry Smith 
3315c6c1daeSBarry Smith    Level: beginner
3325c6c1daeSBarry Smith 
3335c6c1daeSBarry Smith    Note: The struct should have the field char mystring[msize]; not char *mystring
3345c6c1daeSBarry Smith 
335db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
336db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
337c2e3fba1SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
3385c6c1daeSBarry Smith @*/
3399371c9d4SSatish Balay PetscErrorCode PetscBagRegisterString(PetscBag bag, void *addr, PetscInt msize, const char *mdefault, const char *name, const char *help) {
3405c6c1daeSBarry Smith   PetscBagItem item;
3415c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
3425c6c1daeSBarry Smith   PetscBool    printhelp;
3435c6c1daeSBarry Smith 
3445c6c1daeSBarry Smith   PetscFunctionBegin;
3455f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
3465f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
3475f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(mdefault, 4);
3485f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 5);
3495f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 6);
3505c6c1daeSBarry Smith   nname[0] = '-';
3515c6c1daeSBarry Smith   nname[1] = 0;
3529566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
3539566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
35448a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help));
3555c6c1daeSBarry Smith 
3569566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
3575c6c1daeSBarry Smith   item->dtype  = PETSC_CHAR;
3585c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
3595f80ce2aSJacob 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);
36002c9f0b5SLisandro Dalcin   item->next  = NULL;
3615c6c1daeSBarry Smith   item->msize = msize;
36248a46eb9SPierre Jolivet   if (mdefault != (char *)addr) PetscCall(PetscStrncpy((char *)addr, mdefault, msize - 1));
3639566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, bag->bagprefix, nname, (char *)addr, msize, NULL));
3649566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
3655c6c1daeSBarry Smith   PetscFunctionReturn(0);
3665c6c1daeSBarry Smith }
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith /*@C
369*811af0c4SBarry Smith    PetscBagRegisterReal - add a `PetscReal` value to a `PetscBag`
3705c6c1daeSBarry Smith 
371*811af0c4SBarry Smith    Logically Collective on bag
3725c6c1daeSBarry Smith 
373d8d19677SJose E. Roman    Input Parameters:
3745c6c1daeSBarry Smith +  bag - the bag of values
375*811af0c4SBarry Smith .  addr - location of double in struct, for example `&params->r`
3765c6c1daeSBarry Smith .  mdefault - the initial value
3775c6c1daeSBarry Smith .  name - name of the variable
3785c6c1daeSBarry Smith -  help - longer string with more information about the value
3795c6c1daeSBarry Smith 
3805c6c1daeSBarry Smith    Level: beginner
3815c6c1daeSBarry Smith 
382db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
383db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
384db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
3855c6c1daeSBarry Smith @*/
3869371c9d4SSatish Balay PetscErrorCode PetscBagRegisterReal(PetscBag bag, void *addr, PetscReal mdefault, const char *name, const char *help) {
3875c6c1daeSBarry Smith   PetscBagItem item;
3885c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
3895c6c1daeSBarry Smith   PetscBool    printhelp;
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith   PetscFunctionBegin;
3925f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
3935f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
3945f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
3955f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
3965c6c1daeSBarry Smith   nname[0] = '-';
3975c6c1daeSBarry Smith   nname[1] = 0;
3989566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
3999566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
40048a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%g>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, (double)mdefault, help));
4019566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetReal(NULL, bag->bagprefix, nname, &mdefault, NULL));
4025c6c1daeSBarry Smith 
4039566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4045c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
4055c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
4065f80ce2aSJacob 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);
40702c9f0b5SLisandro Dalcin   item->next         = NULL;
4085c6c1daeSBarry Smith   item->msize        = 1;
4095c6c1daeSBarry Smith   *(PetscReal *)addr = mdefault;
4109566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
4115c6c1daeSBarry Smith   PetscFunctionReturn(0);
4125c6c1daeSBarry Smith }
4135c6c1daeSBarry Smith 
4145c6c1daeSBarry Smith /*@C
415*811af0c4SBarry Smith    PetscBagRegisterScalar - add a `PetscScalar` value to a `PetscBag`
4165c6c1daeSBarry Smith 
417*811af0c4SBarry Smith    Logically Collective on bag
4185c6c1daeSBarry Smith 
419d8d19677SJose E. Roman    Input Parameters:
4205c6c1daeSBarry Smith +  bag - the bag of values
421*811af0c4SBarry Smith .  addr - location of scalar in struct, for example `&params->c`
4225c6c1daeSBarry Smith .  mdefault - the initial value
4235c6c1daeSBarry Smith .  name - name of the variable
4245c6c1daeSBarry Smith -  help - longer string with more information about the value
4255c6c1daeSBarry Smith 
4265c6c1daeSBarry Smith    Level: beginner
4275c6c1daeSBarry Smith 
428db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
429db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
430db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
4315c6c1daeSBarry Smith @*/
4329371c9d4SSatish Balay PetscErrorCode PetscBagRegisterScalar(PetscBag bag, void *addr, PetscScalar mdefault, const char *name, const char *help) {
4335c6c1daeSBarry Smith   PetscBagItem item;
4345c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
4355c6c1daeSBarry Smith   PetscBool    printhelp;
4365c6c1daeSBarry Smith 
4375c6c1daeSBarry Smith   PetscFunctionBegin;
4385f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
4395f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
4405f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
4415f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
4425c6c1daeSBarry Smith   nname[0] = '-';
4435c6c1daeSBarry Smith   nname[1] = 0;
4449566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
4459566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
44648a46eb9SPierre 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));
4479566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetScalar(NULL, bag->bagprefix, nname, &mdefault, NULL));
4485c6c1daeSBarry Smith 
4499566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4505c6c1daeSBarry Smith   item->dtype  = PETSC_SCALAR;
4515c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
4525f80ce2aSJacob 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);
45302c9f0b5SLisandro Dalcin   item->next           = NULL;
4545c6c1daeSBarry Smith   item->msize          = 1;
4555c6c1daeSBarry Smith   *(PetscScalar *)addr = mdefault;
4569566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
4575c6c1daeSBarry Smith   PetscFunctionReturn(0);
4585c6c1daeSBarry Smith }
4595c6c1daeSBarry Smith 
4605c6c1daeSBarry Smith /*@C
461*811af0c4SBarry Smith    PetscBagRegisterBool - add a `PetscBool` to a `PetscBag`
4625c6c1daeSBarry Smith 
463*811af0c4SBarry Smith    Logically Collective on bag
4645c6c1daeSBarry Smith 
465d8d19677SJose E. Roman    Input Parameters:
4665c6c1daeSBarry Smith +  bag - the bag of values
467*811af0c4SBarry Smith .  addr - location of logical in struct, for example `&params->b`
468*811af0c4SBarry Smith .  mdefault - the initial value, either `PETSC_FALSE` or `PETSC_TRUE`
4695c6c1daeSBarry Smith .  name - name of the variable
4705c6c1daeSBarry Smith -  help - longer string with more information about the value
4715c6c1daeSBarry Smith 
4725c6c1daeSBarry Smith    Level: beginner
4735c6c1daeSBarry Smith 
474db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
475db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
476db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
4775c6c1daeSBarry Smith @*/
4789371c9d4SSatish Balay PetscErrorCode PetscBagRegisterBool(PetscBag bag, void *addr, PetscBool mdefault, const char *name, const char *help) {
4795c6c1daeSBarry Smith   PetscBagItem item;
4805c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
4815c6c1daeSBarry Smith   PetscBool    printhelp;
4825c6c1daeSBarry Smith 
4835c6c1daeSBarry Smith   PetscFunctionBegin;
4845f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
4855f80ce2aSJacob Faibussowitsch   PetscValidPointer(addr, 2);
4865f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 4);
4875f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 5);
4885c6c1daeSBarry 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 */
4895f80ce2aSJacob 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);
4905c6c1daeSBarry Smith   nname[0] = '-';
4915c6c1daeSBarry Smith   nname[1] = 0;
4929566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
4939566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
49448a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, PetscBools[mdefault], help));
4959566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, bag->bagprefix, nname, &mdefault, NULL));
4965c6c1daeSBarry Smith 
4979566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4985c6c1daeSBarry Smith   item->dtype  = PETSC_BOOL;
4995c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
5005f80ce2aSJacob 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);
50102c9f0b5SLisandro Dalcin   item->next         = NULL;
5025c6c1daeSBarry Smith   item->msize        = 1;
5035c6c1daeSBarry Smith   *(PetscBool *)addr = mdefault;
5049566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
5055c6c1daeSBarry Smith   PetscFunctionReturn(0);
5065c6c1daeSBarry Smith }
5075c6c1daeSBarry Smith 
5085c6c1daeSBarry Smith /*@C
509*811af0c4SBarry Smith    PetscBagDestroy - Destroys a `PetscBag`
5105c6c1daeSBarry Smith 
511*811af0c4SBarry Smith    Collective on bag
5125c6c1daeSBarry Smith 
5135c6c1daeSBarry Smith    Input Parameter:
5145c6c1daeSBarry Smith .  bag - the bag of values
5155c6c1daeSBarry Smith 
5165c6c1daeSBarry Smith    Level: beginner
5175c6c1daeSBarry Smith 
518db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
519db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
520db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
5215c6c1daeSBarry Smith @*/
5229371c9d4SSatish Balay PetscErrorCode PetscBagDestroy(PetscBag *bag) {
5235f80ce2aSJacob Faibussowitsch   PetscBagItem nitem;
5245c6c1daeSBarry Smith 
5255c6c1daeSBarry Smith   PetscFunctionBegin;
5265f80ce2aSJacob Faibussowitsch   if (!*bag) PetscFunctionReturn(0);
5275f80ce2aSJacob Faibussowitsch   PetscValidPointer(*bag, 1);
5285f80ce2aSJacob Faibussowitsch   nitem = (*bag)->bagitems;
5295c6c1daeSBarry Smith   while (nitem) {
5305f80ce2aSJacob Faibussowitsch     PetscBagItem item = nitem->next;
5315f80ce2aSJacob Faibussowitsch 
5329566063dSJacob Faibussowitsch     if (nitem->list) PetscCall(PetscStrArrayDestroy(&nitem->list));
5339566063dSJacob Faibussowitsch     PetscCall(PetscFree(nitem));
5345c6c1daeSBarry Smith     nitem = item;
5355c6c1daeSBarry Smith   }
5369566063dSJacob Faibussowitsch   if ((*bag)->bagprefix) PetscCall(PetscFree((*bag)->bagprefix));
5379566063dSJacob Faibussowitsch   PetscCall(PetscFree(*bag));
5385c6c1daeSBarry Smith   PetscFunctionReturn(0);
5395c6c1daeSBarry Smith }
5405c6c1daeSBarry Smith 
5415c6c1daeSBarry Smith /*@
542*811af0c4SBarry Smith    PetscBagSetFromOptions - Allows setting entries to a `PetscBag` using the options database
5435c6c1daeSBarry Smith 
544*811af0c4SBarry Smith    Collective on bag
5455c6c1daeSBarry Smith 
5465c6c1daeSBarry Smith    Input Parameter:
5475c6c1daeSBarry Smith .  bag - the bag of values
5485c6c1daeSBarry Smith 
5495c6c1daeSBarry Smith    Level: beginner
5505c6c1daeSBarry Smith 
551*811af0c4SBarry Smith    Note:
552*811af0c4SBarry Smith    The options database keys for the entries are of the form `-[bagprefix]_name value`
553*811af0c4SBarry Smith 
554db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()`
555db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
556db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagRegisterEnum()`
5575c6c1daeSBarry Smith @*/
5589371c9d4SSatish Balay PetscErrorCode PetscBagSetFromOptions(PetscBag bag) {
5595c6c1daeSBarry Smith   PetscBagItem nitem = bag->bagitems;
5605c6c1daeSBarry Smith   char         name[PETSC_BAG_NAME_LENGTH + 1], helpname[PETSC_BAG_NAME_LENGTH + PETSC_BAG_HELP_LENGTH + 3];
5615c6c1daeSBarry Smith   PetscInt     n;
5625c6c1daeSBarry Smith 
5635c6c1daeSBarry Smith   PetscFunctionBegin;
5645f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
5659566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(helpname, bag->bagname, sizeof(helpname)));
5669566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(helpname, " ", sizeof(helpname)));
5679566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(helpname, bag->baghelp, sizeof(helpname)));
568d0609cedSBarry Smith   PetscOptionsBegin(bag->bagcomm, bag->bagprefix, helpname, NULL);
5695c6c1daeSBarry Smith   while (nitem) {
5705c6c1daeSBarry Smith     name[0] = '-';
5715c6c1daeSBarry Smith     name[1] = 0;
5729566063dSJacob Faibussowitsch     PetscCall(PetscStrlcat(name, nitem->name, sizeof(name)));
5735c6c1daeSBarry Smith     if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */
5745c6c1daeSBarry Smith       char *value = (char *)(((char *)bag) + nitem->offset);
5759566063dSJacob Faibussowitsch       PetscCall(PetscOptionsString(name, nitem->help, "", value, value, nitem->msize, NULL));
5765c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_REAL) {
5775c6c1daeSBarry Smith       PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset);
5785c6c1daeSBarry Smith       if (nitem->msize == 1) {
5799566063dSJacob Faibussowitsch         PetscCall(PetscOptionsReal(name, nitem->help, "", *value, value, NULL));
5805c6c1daeSBarry Smith       } else {
5815c6c1daeSBarry Smith         n = nitem->msize;
5829566063dSJacob Faibussowitsch         PetscCall(PetscOptionsRealArray(name, nitem->help, "", value, &n, NULL));
5835c6c1daeSBarry Smith       }
5845c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_SCALAR) {
5855c6c1daeSBarry Smith       PetscScalar *value = (PetscScalar *)(((char *)bag) + nitem->offset);
5869566063dSJacob Faibussowitsch       PetscCall(PetscOptionsScalar(name, nitem->help, "", *value, value, NULL));
5875c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_INT) {
5885c6c1daeSBarry Smith       PetscInt *value = (PetscInt *)(((char *)bag) + nitem->offset);
5895c6c1daeSBarry Smith       if (nitem->msize == 1) {
5909566063dSJacob Faibussowitsch         PetscCall(PetscOptionsInt(name, nitem->help, "", *value, value, NULL));
5915c6c1daeSBarry Smith       } else {
5925c6c1daeSBarry Smith         n = nitem->msize;
5939566063dSJacob Faibussowitsch         PetscCall(PetscOptionsIntArray(name, nitem->help, "", value, &n, NULL));
5945c6c1daeSBarry Smith       }
5955c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_ENUM) {
5965c6c1daeSBarry Smith       PetscEnum *value = (PetscEnum *)(((char *)bag) + nitem->offset);
5975c6c1daeSBarry Smith       PetscInt   i     = 0;
5989371c9d4SSatish Balay       while (nitem->list[i++])
5999371c9d4SSatish Balay         ;
6009566063dSJacob Faibussowitsch       PetscCall(PetscOptionsEnum(name, nitem->help, nitem->list[i - 3], (const char *const *)nitem->list, *value, value, NULL));
6015c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_BOOL) {
6025c6c1daeSBarry Smith       PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset);
603dd66f111SBlaise Bourdin       if (nitem->msize == 1) {
6049566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBool(name, nitem->help, "", *value, value, NULL));
605dd66f111SBlaise Bourdin       } else {
606dd66f111SBlaise Bourdin         n = nitem->msize;
6079566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBoolArray(name, nitem->help, "", value, &n, NULL));
608dd66f111SBlaise Bourdin       }
6095c6c1daeSBarry Smith     }
6105c6c1daeSBarry Smith     nitem = nitem->next;
6115c6c1daeSBarry Smith   }
612d0609cedSBarry Smith   PetscOptionsEnd();
6135c6c1daeSBarry Smith   PetscFunctionReturn(0);
6145c6c1daeSBarry Smith }
6155c6c1daeSBarry Smith 
6165c6c1daeSBarry Smith /*@C
6175c6c1daeSBarry Smith    PetscBagView - Views a bag of values as either ASCII text or a binary file
6185c6c1daeSBarry Smith 
619*811af0c4SBarry Smith    Collective on bag
6205c6c1daeSBarry Smith 
621d8d19677SJose E. Roman    Input Parameters:
6225c6c1daeSBarry Smith +  bag - the bag of values
6235c6c1daeSBarry Smith -  viewer - location to view the values
6245c6c1daeSBarry Smith 
6255c6c1daeSBarry Smith    Level: beginner
6265c6c1daeSBarry Smith 
627*811af0c4SBarry Smith    Note:
628*811af0c4SBarry Smith    Currently PETSc bags saved in a binary file can only be read back
629*811af0c4SBarry Smith    in on a machine of the same architecture.
6305c6c1daeSBarry Smith 
631db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()`
632db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
633db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`
6345c6c1daeSBarry Smith @*/
6359371c9d4SSatish Balay PetscErrorCode PetscBagView(PetscBag bag, PetscViewer view) {
6365c6c1daeSBarry Smith   PetscBool    isascii, isbinary;
6375c6c1daeSBarry Smith   PetscBagItem nitem = bag->bagitems;
6385c6c1daeSBarry Smith 
6395c6c1daeSBarry Smith   PetscFunctionBegin;
6405f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
6415f80ce2aSJacob Faibussowitsch   PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 2);
6429566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERASCII, &isascii));
6439566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary));
6445c6c1daeSBarry Smith   if (isascii) {
6453ffde785SBarry Smith     if (bag->bagprefix) {
6469566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object:  %s (%s) %s\n", bag->bagname, bag->bagprefix, bag->baghelp));
6473ffde785SBarry Smith     } else {
6489566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object:  %s %s\n", bag->bagname, bag->baghelp));
6493ffde785SBarry Smith     }
6505c6c1daeSBarry Smith     while (nitem) {
6515c6c1daeSBarry Smith       if (nitem->dtype == PETSC_CHAR) {
6525c6c1daeSBarry Smith         char *value             = (char *)(((char *)bag) + nitem->offset);
6535c6c1daeSBarry Smith         char  tmp               = value[nitem->msize - 1]; /* special handling for fortran chars wihout null terminator */
6545c6c1daeSBarry Smith         value[nitem->msize - 1] = 0;
6559566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %s; %s\n", nitem->name, value, nitem->help));
6565c6c1daeSBarry Smith         value[nitem->msize - 1] = tmp;
6575c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_REAL) {
6585c6c1daeSBarry Smith         PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset);
6595c6c1daeSBarry Smith         PetscInt   i;
6609566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
66148a46eb9SPierre Jolivet         for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%g ", (double)value[i]));
6629566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
6635c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_SCALAR) {
6645c6c1daeSBarry Smith         PetscScalar value = *(PetscScalar *)(((char *)bag) + nitem->offset);
6655c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
6668627564fSBarry Smith         if ((double)PetscImaginaryPart(value)) {
6679566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g + %gi; %s\n", nitem->name, (double)PetscRealPart(value), (double)PetscImaginaryPart(value), nitem->help));
6688627564fSBarry Smith         } else {
6699566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g; %s\n", nitem->name, (double)PetscRealPart(value), nitem->help));
6708627564fSBarry Smith         }
6715c6c1daeSBarry Smith #else
6729566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g; %s\n", nitem->name, (double)value, nitem->help));
6735c6c1daeSBarry Smith #endif
6745c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_INT) {
6755c6c1daeSBarry Smith         PetscInt i, *value = (PetscInt *)(((char *)bag) + nitem->offset);
6769566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
67748a46eb9SPierre Jolivet         for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%" PetscInt_FMT " ", value[i]));
6789566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
6795c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_BOOL) {
680dd66f111SBlaise Bourdin         PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset);
681dd66f111SBlaise Bourdin         PetscInt   i;
6825c6c1daeSBarry Smith         /* some Fortran compilers use -1 as boolean */
6839566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
684dd66f111SBlaise Bourdin         for (i = 0; i < nitem->msize; i++) {
685dd66f111SBlaise Bourdin           if (((int)value[i]) == -1) value[i] = PETSC_TRUE;
6865c6c1daeSBarry 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 */
6875f80ce2aSJacob 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]));
6889566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, " %s", PetscBools[value[i]]));
689dd66f111SBlaise Bourdin         }
6909566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
6915c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_ENUM) {
6925c6c1daeSBarry Smith         PetscEnum value = *(PetscEnum *)(((char *)bag) + nitem->offset);
6935c6c1daeSBarry Smith         PetscInt  i     = 0;
6949371c9d4SSatish Balay         while (nitem->list[i++])
6959371c9d4SSatish Balay           ;
6969566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %s; (%s) %s\n", nitem->name, nitem->list[value], nitem->list[i - 3], nitem->help));
6975c6c1daeSBarry Smith       }
6985c6c1daeSBarry Smith       nitem = nitem->next;
6995c6c1daeSBarry Smith     }
7005c6c1daeSBarry Smith   } else if (isbinary) {
7015c6c1daeSBarry Smith     PetscInt          classid           = PETSC_BAG_FILE_CLASSID, dtype;
7025c6c1daeSBarry Smith     PetscInt          deprecatedbagsize = 0;
703a261c58fSBarry Smith     PetscViewerFormat format;
7049566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &classid, 1, PETSC_INT));
7059566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &deprecatedbagsize, 1, PETSC_INT));
7069566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &bag->count, 1, PETSC_INT));
7079566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, bag->bagname, PETSC_BAG_NAME_LENGTH, PETSC_CHAR));
7089566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, PETSC_CHAR));
7095c6c1daeSBarry Smith     while (nitem) {
7109566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &nitem->offset, 1, PETSC_INT));
7115c6c1daeSBarry Smith       dtype = (PetscInt)nitem->dtype;
7129566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &dtype, 1, PETSC_INT));
7139566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, nitem->name, PETSC_BAG_NAME_LENGTH, PETSC_CHAR));
7149566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, nitem->help, PETSC_BAG_HELP_LENGTH, PETSC_CHAR));
7159566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &nitem->msize, 1, PETSC_INT));
7165c6c1daeSBarry Smith       /* some Fortran compilers use -1 as boolean */
7175c6c1daeSBarry Smith       if (dtype == PETSC_BOOL && ((*(int *)(((char *)bag) + nitem->offset) == -1))) *(int *)(((char *)bag) + nitem->offset) = PETSC_TRUE;
7185c6c1daeSBarry Smith 
7199566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, (((char *)bag) + nitem->offset), nitem->msize, nitem->dtype));
72048a46eb9SPierre Jolivet       if (dtype == PETSC_ENUM) PetscCall(PetscViewerBinaryWriteStringArray(view, (const char *const *)nitem->list));
7215c6c1daeSBarry Smith       nitem = nitem->next;
7225c6c1daeSBarry Smith     }
7239566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(view, &format));
724a261c58fSBarry Smith     if (format == PETSC_VIEWER_BINARY_MATLAB) {
725a261c58fSBarry Smith       MPI_Comm comm;
726a261c58fSBarry Smith       FILE    *info;
7279566063dSJacob Faibussowitsch       PetscCall(PetscObjectGetComm((PetscObject)view, &comm));
7289566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryGetInfoPointer(view, &info));
7299566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#--- begin code written by PetscViewerBinary for MATLAB format ---#\n"));
7309566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#$$ Set.%s = PetscBinaryRead(fd);\n", bag->bagname));
7319566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n"));
732a261c58fSBarry Smith     }
733a261c58fSBarry Smith   }
7345c6c1daeSBarry Smith   PetscFunctionReturn(0);
7355c6c1daeSBarry Smith }
7365c6c1daeSBarry Smith 
7375c6c1daeSBarry Smith /*@C
738173f9484SMatthew G. Knepley   PetscBagViewFromOptions - Processes command line options to determine if/how a PetscBag is to be viewed.
739173f9484SMatthew G. Knepley 
740*811af0c4SBarry Smith   Collective on bag
741173f9484SMatthew G. Knepley 
742173f9484SMatthew G. Knepley   Input Parameters:
743173f9484SMatthew G. Knepley + obj   - the object
744173f9484SMatthew G. Knepley . bobj  - optional other object that provides prefix (if NULL then the prefix in obj is used)
745173f9484SMatthew G. Knepley - optionname - option to activate viewing
746478db826SMatthew G. Knepley 
747173f9484SMatthew G. Knepley   Level: intermediate
748478db826SMatthew G. Knepley 
749db781477SPatrick Sanan .seealso: `PetscBagCreate()`, `PetscBag`, `PetscViewer`
750173f9484SMatthew G. Knepley @*/
7519371c9d4SSatish Balay PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[]) {
752173f9484SMatthew G. Knepley   static PetscBool  incall = PETSC_FALSE;
753173f9484SMatthew G. Knepley   PetscViewer       viewer;
754173f9484SMatthew G. Knepley   PetscViewerFormat format;
755173f9484SMatthew G. Knepley   const char       *prefix, *bprefix = NULL;
756173f9484SMatthew G. Knepley   PetscBool         flg;
757173f9484SMatthew G. Knepley 
758173f9484SMatthew G. Knepley   PetscFunctionBegin;
759173f9484SMatthew G. Knepley   if (incall) PetscFunctionReturn(0);
760173f9484SMatthew G. Knepley   incall = PETSC_TRUE;
7615f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
7629566063dSJacob Faibussowitsch   if (bobj) PetscCall(PetscObjectGetOptionsPrefix(bobj, &bprefix));
763173f9484SMatthew G. Knepley   prefix = bobj ? bprefix : bag->bagprefix;
7649566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg));
765173f9484SMatthew G. Knepley   if (flg) {
7669566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, format));
7679566063dSJacob Faibussowitsch     PetscCall(PetscBagView(bag, viewer));
7689566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(viewer));
7699566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
7709566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
771173f9484SMatthew G. Knepley   }
772173f9484SMatthew G. Knepley   incall = PETSC_FALSE;
773173f9484SMatthew G. Knepley   PetscFunctionReturn(0);
774173f9484SMatthew G. Knepley }
775173f9484SMatthew G. Knepley 
776173f9484SMatthew G. Knepley /*@C
7775c6c1daeSBarry Smith    PetscBagLoad - Loads a bag of values from a binary file
7785c6c1daeSBarry Smith 
779*811af0c4SBarry Smith    Collective on view
7805c6c1daeSBarry Smith 
781d8d19677SJose E. Roman    Input Parameters:
7825c6c1daeSBarry Smith +  viewer - file to load values from
7835c6c1daeSBarry Smith -  bag - the bag of values
7845c6c1daeSBarry Smith 
785*811af0c4SBarry Smith    Note:
78695452b02SPatrick Sanan     You must have created and registered all the fields in the bag before loading into it.
7875c6c1daeSBarry Smith 
7885c6c1daeSBarry Smith    Level: beginner
7895c6c1daeSBarry Smith 
790db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagView()`, `PetscBagGetData()`
791db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
792db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
7935c6c1daeSBarry Smith @*/
7949371c9d4SSatish Balay PetscErrorCode PetscBagLoad(PetscViewer view, PetscBag bag) {
7955c6c1daeSBarry Smith   PetscBool    isbinary;
7965f80ce2aSJacob Faibussowitsch   PetscInt     classid, bagcount, dtype, msize, offset, deprecatedbagsize;
7975c6c1daeSBarry Smith   char         name[PETSC_BAG_NAME_LENGTH], help[PETSC_BAG_HELP_LENGTH], **list;
7985c6c1daeSBarry Smith   PetscBagItem nitem;
7995c6c1daeSBarry Smith   MPI_Comm     comm;
8005c6c1daeSBarry Smith   PetscMPIInt  flag;
8015c6c1daeSBarry Smith 
8025c6c1daeSBarry Smith   PetscFunctionBegin;
8035f80ce2aSJacob Faibussowitsch   PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 1);
8045f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 2);
8059566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)view, &comm));
8069566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_compare(comm, bag->bagcomm, &flag));
8075f80ce2aSJacob Faibussowitsch   PetscCheck(flag == MPI_CONGRUENT || flag == MPI_IDENT, PETSC_COMM_SELF, PETSC_ERR_ARG_NOTSAMECOMM, "Different communicators in the viewer and bag");
8089566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary));
8095f80ce2aSJacob Faibussowitsch   PetscCheck(isbinary, PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for this viewer type");
8105c6c1daeSBarry Smith 
8119566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &classid, 1, NULL, PETSC_INT));
8125f80ce2aSJacob Faibussowitsch   PetscCheck(classid == PETSC_BAG_FILE_CLASSID, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Not PetscBag next in binary file");
8139566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &deprecatedbagsize, 1, NULL, PETSC_INT));
8149566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &bagcount, 1, NULL, PETSC_INT));
8155f80ce2aSJacob 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);
8169566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, bag->bagname, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR));
8179566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR));
8185c6c1daeSBarry Smith 
8195c6c1daeSBarry Smith   nitem = bag->bagitems;
8205f80ce2aSJacob Faibussowitsch   for (PetscInt i = 0; i < bagcount; i++) {
8219566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &offset, 1, NULL, PETSC_INT));
8225c6c1daeSBarry Smith     /* ignore the offset in the file */
8239566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &dtype, 1, NULL, PETSC_INT));
8249566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, name, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR));
8259566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, help, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR));
8269566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &msize, 1, NULL, PETSC_INT));
8275c6c1daeSBarry Smith 
8285c6c1daeSBarry Smith     if (dtype == (PetscInt)PETSC_CHAR) {
8299566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_CHAR));
8305c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_REAL) {
8319566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_REAL));
8325c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_SCALAR) {
8339566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_SCALAR));
8345c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_INT) {
8359566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_INT));
8365c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_BOOL) {
8379566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_BOOL));
8385c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_ENUM) {
8399566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_ENUM));
8409566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryReadStringArray(view, &list));
8415c6c1daeSBarry Smith       /* don't need to save list because it is already registered in the bag */
8429566063dSJacob Faibussowitsch       PetscCall(PetscFree(list));
8435c6c1daeSBarry Smith     }
8445c6c1daeSBarry Smith     nitem = nitem->next;
8455c6c1daeSBarry Smith   }
8465c6c1daeSBarry Smith   PetscFunctionReturn(0);
8475c6c1daeSBarry Smith }
8485c6c1daeSBarry Smith 
849e8976759SBarry Smith /*@C
850*811af0c4SBarry Smith     PetscBagCreate - Create a bag of values. A `PetscBag` is a representation of a C struct that can be saved to and read from files, can have values set from the
851*811af0c4SBarry Smith     options database
8525c6c1daeSBarry Smith 
853d083f849SBarry Smith   Collective
8545c6c1daeSBarry Smith 
8555c6c1daeSBarry Smith   Level: Intermediate
8565c6c1daeSBarry Smith 
8575c6c1daeSBarry Smith   Input Parameters:
8585c6c1daeSBarry Smith +  comm - communicator to share bag
859*811af0c4SBarry Smith -  bagsize - size of the C structure holding the values, for example sizeof(mystruct)
8605c6c1daeSBarry Smith 
8615c6c1daeSBarry Smith   Output Parameter:
8625c6c1daeSBarry Smith .   bag - the bag of values
8635c6c1daeSBarry Smith 
8645c6c1daeSBarry Smith    Notes:
865*811af0c4SBarry Smith    After creating the bag, for each entry in the C struct call the appropriate `PetscBagRegisterInt()` etc to define the C structs layout
866*811af0c4SBarry Smith 
867*811af0c4SBarry Smith    The size of the A struct must be small enough to fit in a `PetscInt`; by default
868*811af0c4SBarry Smith    `PetscInt` is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length.
8695c6c1daeSBarry Smith    The warning about casting to a shorter length can be ignored below unless your A struct is too large
8705c6c1daeSBarry Smith 
871db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
872db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
873db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
8745c6c1daeSBarry Smith @*/
8759371c9d4SSatish Balay PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag) {
8765f80ce2aSJacob Faibussowitsch   const size_t totalsize = bagsize + sizeof(struct _n_PetscBag) + sizeof(PetscScalar);
8775c6c1daeSBarry Smith 
8785c6c1daeSBarry Smith   PetscFunctionBegin;
8795f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 3);
8809566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Creating Bag with total size %d\n", (int)totalsize));
8819566063dSJacob Faibussowitsch   PetscCall(PetscCalloc(totalsize, bag));
882a297a907SKarl Rupp 
8835f80ce2aSJacob Faibussowitsch   (*bag)->bagsize        = totalsize;
8845c6c1daeSBarry Smith   (*bag)->bagcomm        = comm;
8850298fd71SBarry Smith   (*bag)->bagprefix      = NULL;
8865c6c1daeSBarry Smith   (*bag)->structlocation = (void *)(((char *)(*bag)) + sizeof(PetscScalar) * (sizeof(struct _n_PetscBag) / sizeof(PetscScalar)) + sizeof(PetscScalar));
8875c6c1daeSBarry Smith   PetscFunctionReturn(0);
8885c6c1daeSBarry Smith }
8895c6c1daeSBarry Smith 
8905c6c1daeSBarry Smith /*@C
8915c6c1daeSBarry Smith     PetscBagSetName - Sets the name of a bag of values
8925c6c1daeSBarry Smith 
8935c6c1daeSBarry Smith   Not Collective
8945c6c1daeSBarry Smith 
8955c6c1daeSBarry Smith   Level: Intermediate
8965c6c1daeSBarry Smith 
8975c6c1daeSBarry Smith   Input Parameters:
8985c6c1daeSBarry Smith +   bag - the bag of values
8995c6c1daeSBarry Smith .   name - the name assigned to the bag
9005c6c1daeSBarry Smith -   help - help message for bag
9015c6c1daeSBarry Smith 
902db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
903db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
904db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9055c6c1daeSBarry Smith @*/
9069371c9d4SSatish Balay PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help) {
9075c6c1daeSBarry Smith   PetscFunctionBegin;
9085f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
9095f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(name, 2);
9105f80ce2aSJacob Faibussowitsch   PetscValidCharPointer(help, 3);
9119566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(bag->bagname, name, PETSC_BAG_NAME_LENGTH - 1));
9129566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(bag->baghelp, help, PETSC_BAG_HELP_LENGTH - 1));
9135c6c1daeSBarry Smith   PetscFunctionReturn(0);
9145c6c1daeSBarry Smith }
9155c6c1daeSBarry Smith 
9165c6c1daeSBarry Smith /*@C
9175c6c1daeSBarry Smith     PetscBagGetName - Gets the name of a bag of values
9185c6c1daeSBarry Smith 
9195c6c1daeSBarry Smith   Not Collective
9205c6c1daeSBarry Smith 
9215c6c1daeSBarry Smith   Level: Intermediate
9225c6c1daeSBarry Smith 
9235c6c1daeSBarry Smith   Input Parameter:
9245c6c1daeSBarry Smith .   bag - the bag of values
9255c6c1daeSBarry Smith 
9265c6c1daeSBarry Smith   Output Parameter:
9275c6c1daeSBarry Smith .   name - the name assigned to the bag
9285c6c1daeSBarry Smith 
929db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
930db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
931db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9325c6c1daeSBarry Smith @*/
9339371c9d4SSatish Balay PetscErrorCode PetscBagGetName(PetscBag bag, char **name) {
9345c6c1daeSBarry Smith   PetscFunctionBegin;
9355f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
9365f80ce2aSJacob Faibussowitsch   PetscValidPointer(name, 2);
9375c6c1daeSBarry Smith   *name = bag->bagname;
9385c6c1daeSBarry Smith   PetscFunctionReturn(0);
9395c6c1daeSBarry Smith }
9405c6c1daeSBarry Smith 
9415c6c1daeSBarry Smith /*@C
9425c6c1daeSBarry Smith     PetscBagGetData - Gives back the user - access to memory that
943*811af0c4SBarry Smith     can be used for storing user-data-structure
9445c6c1daeSBarry Smith 
9455c6c1daeSBarry Smith   Not Collective
9465c6c1daeSBarry Smith 
9475c6c1daeSBarry Smith   Level: Intermediate
9485c6c1daeSBarry Smith 
9495c6c1daeSBarry Smith   Input Parameter:
9505c6c1daeSBarry Smith .   bag - the bag of values
9515c6c1daeSBarry Smith 
9525c6c1daeSBarry Smith   Output Parameter:
953*811af0c4SBarry Smith .   data - pointer to memory that will have user-data-structure, this can be cast to a pointer of the type the C struct used in defining the bag
9545c6c1daeSBarry Smith 
955db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`
956db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
957db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9585c6c1daeSBarry Smith @*/
9599371c9d4SSatish Balay PetscErrorCode PetscBagGetData(PetscBag bag, void **data) {
9605c6c1daeSBarry Smith   PetscFunctionBegin;
9615f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
9625f80ce2aSJacob Faibussowitsch   PetscValidPointer(data, 2);
9635c6c1daeSBarry Smith   *data = bag->structlocation;
9645c6c1daeSBarry Smith   PetscFunctionReturn(0);
9655c6c1daeSBarry Smith }
9665c6c1daeSBarry Smith 
9675c6c1daeSBarry Smith /*@C
9685c6c1daeSBarry Smith   PetscBagSetOptionsPrefix - Sets the prefix used for searching for all
969*811af0c4SBarry Smith   `PetscBag` items in the options database.
9705c6c1daeSBarry Smith 
971*811af0c4SBarry Smith   Logically collective on bag
9725c6c1daeSBarry Smith 
9735c6c1daeSBarry Smith   Level: Intermediate
9745c6c1daeSBarry Smith 
9755c6c1daeSBarry Smith   Input Parameters:
9765c6c1daeSBarry Smith +   bag - the bag of values
9775c6c1daeSBarry Smith -   prefix - the prefix to prepend all Bag item names with.
9785c6c1daeSBarry Smith 
9795c6c1daeSBarry Smith   NOTES: Must be called prior to registering any of the bag items.
9805c6c1daeSBarry Smith 
981db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
982db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9835c6c1daeSBarry Smith @*/
9845c6c1daeSBarry Smith 
9859371c9d4SSatish Balay PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[]) {
9865c6c1daeSBarry Smith   PetscFunctionBegin;
9875f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
9885f80ce2aSJacob Faibussowitsch   if (pre) {
9895f80ce2aSJacob Faibussowitsch     PetscValidCharPointer(pre, 2);
9905f80ce2aSJacob Faibussowitsch     PetscCheck(pre[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Options prefix should not begin with a hyphen");
9919566063dSJacob Faibussowitsch     PetscCall(PetscFree(bag->bagprefix));
9929566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(pre, &(bag->bagprefix)));
9939566063dSJacob Faibussowitsch   } else PetscCall(PetscFree(bag->bagprefix));
9945c6c1daeSBarry Smith   PetscFunctionReturn(0);
9955c6c1daeSBarry Smith }
996ffb7e86cSMatthew G. Knepley 
997ffb7e86cSMatthew G. Knepley /*@C
998ffb7e86cSMatthew G. Knepley   PetscBagGetNames - Get the names of all entries in the bag
999ffb7e86cSMatthew G. Knepley 
1000ffb7e86cSMatthew G. Knepley   Not collective
1001ffb7e86cSMatthew G. Knepley 
1002ffb7e86cSMatthew G. Knepley   Input Parameters:
1003ffb7e86cSMatthew G. Knepley + bag   - the bag of values
1004*811af0c4SBarry Smith - names - array of the correct size to hold names, must be long enough to hold all the names
1005ffb7e86cSMatthew G. Knepley 
1006ffb7e86cSMatthew G. Knepley   Output Parameter:
1007ffb7e86cSMatthew G. Knepley . names - array of char pointers for names
1008ffb7e86cSMatthew G. Knepley 
1009ffb7e86cSMatthew G. Knepley   Level: intermediate
1010ffb7e86cSMatthew G. Knepley 
1011db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagSetName()`, `PetscBagCreate()`, `PetscBagGetData()`
1012db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
1013ffb7e86cSMatthew G. Knepley @*/
10149371c9d4SSatish Balay PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[]) {
1015ffb7e86cSMatthew G. Knepley   PetscBagItem nitem = bag->bagitems;
1016ffb7e86cSMatthew G. Knepley 
1017ffb7e86cSMatthew G. Knepley   PetscFunctionBegin;
10185f80ce2aSJacob Faibussowitsch   PetscValidPointer(bag, 1);
10195f80ce2aSJacob Faibussowitsch   PetscValidPointer(names, 2);
10205f80ce2aSJacob Faibussowitsch   for (PetscInt n = 0; nitem; ++n, nitem = nitem->next) names[n] = nitem->name;
1021ffb7e86cSMatthew G. Knepley   PetscFunctionReturn(0);
1022ffb7e86cSMatthew G. Knepley }
1023