xref: /petsc/src/sys/classes/bag/bag.c (revision ffeef943c8ee50edff320d8a3135bb0c94853e4c)
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 */
8d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscBagRegister_Private(PetscBag bag, PetscBagItem item, const char *name, const char *help)
9d71ae5a4SJacob Faibussowitsch {
105c6c1daeSBarry Smith   PetscFunctionBegin;
119566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(item->name, name, PETSC_BAG_NAME_LENGTH - 1));
129566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(item->help, help, PETSC_BAG_HELP_LENGTH - 1));
135f80ce2aSJacob Faibussowitsch   if (bag->bagitems) {
145c6c1daeSBarry Smith     PetscBagItem nitem = bag->bagitems;
155f80ce2aSJacob Faibussowitsch 
165f80ce2aSJacob Faibussowitsch     while (nitem->next) nitem = nitem->next;
175c6c1daeSBarry Smith     nitem->next = item;
185f80ce2aSJacob Faibussowitsch   } else bag->bagitems = item;
195c6c1daeSBarry Smith   bag->count++;
203ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
215c6c1daeSBarry Smith }
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith /*@C
24811af0c4SBarry Smith   PetscBagRegisterEnum - add an enum value to a `PetscBag`
255c6c1daeSBarry Smith 
26c3339decSBarry Smith   Logically Collective
275c6c1daeSBarry Smith 
28d8d19677SJose E. Roman   Input Parameters:
295c6c1daeSBarry Smith + bag      - the bag of values
30811af0c4SBarry Smith . addr     - location of enum in struct, for example `&params->dt`
315c6c1daeSBarry Smith . list     - array of strings containing names of enum values followed by enum name followed by enum prefix
32811af0c4SBarry Smith . mdefault - the initial value, cast with (`PetscEnum`)
332fe279fdSBarry Smith . name     - the name of the item
345c6c1daeSBarry Smith - help     - longer string with more information about the value
355c6c1daeSBarry Smith 
365c6c1daeSBarry Smith   Level: beginner
375c6c1daeSBarry Smith 
38db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
39db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
40db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`
415c6c1daeSBarry Smith @*/
42d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterEnum(PetscBag bag, void *addr, const char *const *list, PetscEnum mdefault, const char *name, const char *help)
43d71ae5a4SJacob Faibussowitsch {
445c6c1daeSBarry Smith   PetscBagItem item;
455c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
465c6c1daeSBarry Smith   PetscBool    printhelp;
475c6c1daeSBarry Smith   PetscInt     i = 0;
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith   PetscFunctionBegin;
504f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
514f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
524f572ea9SToby Isaac   PetscAssertPointer(list, 3);
534f572ea9SToby Isaac   PetscAssertPointer(name, 5);
544f572ea9SToby Isaac   PetscAssertPointer(help, 6);
555c6c1daeSBarry Smith   nname[0] = '-';
565c6c1daeSBarry Smith   nname[1] = 0;
579566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
589566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
595c6c1daeSBarry Smith   if (printhelp) {
60fbccb6d4SPierre Jolivet     while (list[i++]);
619566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: (%s) %s (choose one of) ", bag->bagprefix ? bag->bagprefix : "", name, list[mdefault], list[i - 3], help));
629566063dSJacob Faibussowitsch     for (i = 0; list[i + 2]; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " %s", list[i]));
639566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "\n"));
645c6c1daeSBarry Smith   }
659566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetEnum(NULL, bag->bagprefix, nname, list, &mdefault, NULL));
665c6c1daeSBarry Smith 
679566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
685c6c1daeSBarry Smith   item->dtype  = PETSC_ENUM;
695c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
705f80ce2aSJacob Faibussowitsch   PetscCheck(item->offset <= bag->bagsize, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Registered item %s %s is not in bag memory space", name, help);
7102c9f0b5SLisandro Dalcin   item->next  = NULL;
725c6c1daeSBarry Smith   item->msize = 1;
739566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(list, (char ***)&item->list));
745c6c1daeSBarry Smith   *(PetscEnum *)addr = mdefault;
759566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
775c6c1daeSBarry Smith }
785c6c1daeSBarry Smith 
795c6c1daeSBarry Smith /*@C
8009cbc92aSBarry Smith   PetscBagRegisterIntArray - add a `PetscInt` array to a `PetscBag`
815c6c1daeSBarry Smith 
82c3339decSBarry Smith   Logically Collective
835c6c1daeSBarry Smith 
84d8d19677SJose E. Roman   Input Parameters:
855c6c1daeSBarry Smith + bag   - the bag of values
86811af0c4SBarry Smith . addr  - location of integer in struct, for example `&params->i`
875c6c1daeSBarry Smith . msize - number of entries in array
88811af0c4SBarry Smith . name  - name of the array
895c6c1daeSBarry Smith - help  - longer string with more information about the value
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith   Level: beginner
925c6c1daeSBarry Smith 
93db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
94db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
95db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
965c6c1daeSBarry Smith @*/
97d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterIntArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help)
98d71ae5a4SJacob Faibussowitsch {
995c6c1daeSBarry Smith   PetscBagItem item;
1005c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
1015c6c1daeSBarry Smith   PetscBool    printhelp;
1025c6c1daeSBarry Smith   PetscInt     i, tmp = msize;
1035c6c1daeSBarry Smith 
1045c6c1daeSBarry Smith   PetscFunctionBegin;
1054f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
1064f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
1074f572ea9SToby Isaac   PetscAssertPointer(name, 4);
1084f572ea9SToby Isaac   PetscAssertPointer(help, 5);
1095c6c1daeSBarry Smith   nname[0] = '-';
1105c6c1daeSBarry Smith   nname[1] = 0;
1119566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
1129566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
1135c6c1daeSBarry Smith   if (printhelp) {
1149566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <", bag->bagprefix ? bag->bagprefix : "", name));
11548a46eb9SPierre Jolivet     for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i));
1169566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help));
1175c6c1daeSBarry Smith   }
1189566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetIntArray(NULL, bag->bagprefix, nname, (PetscInt *)addr, &tmp, NULL));
1195c6c1daeSBarry Smith 
1209566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
1215c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
1225c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
1235f80ce2aSJacob 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);
12402c9f0b5SLisandro Dalcin   item->next  = NULL;
1255c6c1daeSBarry Smith   item->msize = msize;
1269566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
1273ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1285c6c1daeSBarry Smith }
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith /*@C
13109cbc92aSBarry Smith   PetscBagRegisterRealArray - add a `PetscReal` array to a `PetscBag`
1325c6c1daeSBarry Smith 
133c3339decSBarry Smith   Logically Collective
1345c6c1daeSBarry Smith 
135d8d19677SJose E. Roman   Input Parameters:
1365c6c1daeSBarry Smith + bag   - the bag of values
137811af0c4SBarry Smith . addr  - location of real array in struct, for example `&params->d`
138811af0c4SBarry Smith . msize - number of entries in the array
139811af0c4SBarry Smith . name  - name of the array
1405c6c1daeSBarry Smith - help  - longer string with more information about the value
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith   Level: beginner
1435c6c1daeSBarry Smith 
144db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
145db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
146db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
1475c6c1daeSBarry Smith @*/
148d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterRealArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help)
149d71ae5a4SJacob Faibussowitsch {
1505c6c1daeSBarry Smith   PetscBagItem item;
1515c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
1525c6c1daeSBarry Smith   PetscBool    printhelp;
1535c6c1daeSBarry Smith   PetscInt     i, tmp = msize;
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith   PetscFunctionBegin;
1564f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
1574f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
1584f572ea9SToby Isaac   PetscAssertPointer(name, 4);
1594f572ea9SToby Isaac   PetscAssertPointer(help, 5);
1605c6c1daeSBarry Smith   nname[0] = '-';
1615c6c1daeSBarry Smith   nname[1] = 0;
1629566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
1639566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
1645c6c1daeSBarry Smith   if (printhelp) {
1659566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <", bag->bagprefix ? bag->bagprefix : "", name));
16648a46eb9SPierre Jolivet     for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%g ", (double)*((PetscReal *)addr) + i));
1679566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help));
1685c6c1daeSBarry Smith   }
1699566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetRealArray(NULL, bag->bagprefix, nname, (PetscReal *)addr, &tmp, NULL));
1705c6c1daeSBarry Smith 
1719566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
1725c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
1735c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
1745f80ce2aSJacob 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);
17502c9f0b5SLisandro Dalcin   item->next  = NULL;
1765c6c1daeSBarry Smith   item->msize = msize;
1779566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
1783ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1795c6c1daeSBarry Smith }
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith /*@C
18209cbc92aSBarry Smith   PetscBagRegisterInt - add a `PetscInt` value to a `PetscBag`
1835c6c1daeSBarry Smith 
184c3339decSBarry Smith   Logically Collective
1855c6c1daeSBarry Smith 
186d8d19677SJose E. Roman   Input Parameters:
1875c6c1daeSBarry Smith + bag      - the bag of values
188811af0c4SBarry Smith . addr     - location of integer in struct, for example `&params->i`
1895c6c1daeSBarry Smith . mdefault - the initial value
1905c6c1daeSBarry Smith . name     - name of the integer
1915c6c1daeSBarry Smith - help     - longer string with more information about the value
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith   Level: beginner
1945c6c1daeSBarry Smith 
195db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
196db781477SPatrick Sanan           `PetscBagRegisterInt64()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
197db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
1985c6c1daeSBarry Smith @*/
199d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterInt(PetscBag bag, void *addr, PetscInt mdefault, const char *name, const char *help)
200d71ae5a4SJacob Faibussowitsch {
2015c6c1daeSBarry Smith   PetscBagItem item;
2025c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
2035c6c1daeSBarry Smith   PetscBool    printhelp;
2045c6c1daeSBarry Smith 
2055c6c1daeSBarry Smith   PetscFunctionBegin;
2064f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
2074f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
2084f572ea9SToby Isaac   PetscAssertPointer(name, 4);
2094f572ea9SToby Isaac   PetscAssertPointer(help, 5);
2105c6c1daeSBarry Smith   nname[0] = '-';
2115c6c1daeSBarry Smith   nname[1] = 0;
2129566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
2139566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
21448a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help));
2159566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &mdefault, NULL));
2165c6c1daeSBarry Smith 
2179566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
2185c6c1daeSBarry Smith   item->dtype  = PETSC_INT;
2195c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
2205f80ce2aSJacob 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);
22102c9f0b5SLisandro Dalcin   item->next        = NULL;
2225c6c1daeSBarry Smith   item->msize       = 1;
2235c6c1daeSBarry Smith   *(PetscInt *)addr = mdefault;
2249566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
2253ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2265c6c1daeSBarry Smith }
2275c6c1daeSBarry Smith 
2280d349d43SBarry Smith /*@C
229811af0c4SBarry Smith   PetscBagRegisterInt64 - add a `PetscInt64` value to a `PetscBag`
2300d349d43SBarry Smith 
231c3339decSBarry Smith   Logically Collective
2320d349d43SBarry Smith 
233d8d19677SJose E. Roman   Input Parameters:
2340d349d43SBarry Smith + bag      - the bag of values
235811af0c4SBarry Smith . addr     - location of integer in struct, for example `&params->i`
2360d349d43SBarry Smith . mdefault - the initial value
2370d349d43SBarry Smith . name     - name of the integer
2380d349d43SBarry Smith - help     - longer string with more information about the value
2390d349d43SBarry Smith 
2400d349d43SBarry Smith   Level: beginner
2410d349d43SBarry Smith 
242db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
243db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
244db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
2450d349d43SBarry Smith @*/
246d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterInt64(PetscBag bag, void *addr, PetscInt64 mdefault, const char *name, const char *help)
247d71ae5a4SJacob Faibussowitsch {
2480d349d43SBarry Smith   PetscBagItem item;
2490d349d43SBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
2500d349d43SBarry Smith   PetscBool    printhelp;
2510d349d43SBarry Smith   PetscInt     odefault = (PetscInt)mdefault;
2520d349d43SBarry Smith   PetscBool    flg;
2530d349d43SBarry Smith 
2540d349d43SBarry Smith   PetscFunctionBegin;
2550d349d43SBarry Smith   nname[0] = '-';
2560d349d43SBarry Smith   nname[1] = 0;
2579566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
2589566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
25948a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, odefault, help));
2609566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &odefault, &flg));
261bafee8b4SSatish Balay   if (flg) mdefault = (PetscInt64)odefault;
2620d349d43SBarry Smith 
2639566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
2640d349d43SBarry Smith   item->dtype  = PETSC_INT;
2650d349d43SBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
2665f80ce2aSJacob 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);
26702c9f0b5SLisandro Dalcin   item->next          = NULL;
2680d349d43SBarry Smith   item->msize         = 1;
269bafee8b4SSatish Balay   *(PetscInt64 *)addr = mdefault;
2709566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
2713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2720d349d43SBarry Smith }
2730d349d43SBarry Smith 
274dd66f111SBlaise Bourdin /*@C
275811af0c4SBarry Smith   PetscBagRegisterBoolArray - add a n `PetscBool` values to a `PetscBag`
276dd66f111SBlaise Bourdin 
277c3339decSBarry Smith   Logically Collective
278dd66f111SBlaise Bourdin 
279d8d19677SJose E. Roman   Input Parameters:
280dd66f111SBlaise Bourdin + bag   - the bag of values
281811af0c4SBarry Smith . addr  - location of boolean array in struct, for example `&params->b`
282dd66f111SBlaise Bourdin . msize - number of entries in array
283dd66f111SBlaise Bourdin . name  - name of the boolean array
284dd66f111SBlaise Bourdin - help  - longer string with more information about the value
285dd66f111SBlaise Bourdin 
286dd66f111SBlaise Bourdin   Level: beginner
287dd66f111SBlaise Bourdin 
288db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
289db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
290db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
291dd66f111SBlaise Bourdin @*/
292d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help)
293d71ae5a4SJacob Faibussowitsch {
294dd66f111SBlaise Bourdin   PetscBagItem item;
295dd66f111SBlaise Bourdin   char         nname[PETSC_BAG_NAME_LENGTH + 1];
296dd66f111SBlaise Bourdin   PetscBool    printhelp;
297dd66f111SBlaise Bourdin   PetscInt     i, tmp = msize;
298dd66f111SBlaise Bourdin 
299dd66f111SBlaise Bourdin   PetscFunctionBegin;
3004f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
3014f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
3024f572ea9SToby Isaac   PetscAssertPointer(name, 4);
3034f572ea9SToby Isaac   PetscAssertPointer(help, 5);
304dd66f111SBlaise Bourdin   nname[0] = '-';
305dd66f111SBlaise Bourdin   nname[1] = 0;
3069566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
3079566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
308dd66f111SBlaise Bourdin   if (printhelp) {
3099566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <", bag->bagprefix ? bag->bagprefix : "", name));
31048a46eb9SPierre Jolivet     for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i));
3119566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help));
312dd66f111SBlaise Bourdin   }
3139566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBoolArray(NULL, bag->bagprefix, nname, (PetscBool *)addr, &tmp, NULL));
314dd66f111SBlaise Bourdin 
3159566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
316dd66f111SBlaise Bourdin   item->dtype  = PETSC_BOOL;
317dd66f111SBlaise Bourdin   item->offset = ((char *)addr) - ((char *)bag);
3185f80ce2aSJacob 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);
31902c9f0b5SLisandro Dalcin   item->next  = NULL;
320dd66f111SBlaise Bourdin   item->msize = msize;
3219566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
3223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
323dd66f111SBlaise Bourdin }
324dd66f111SBlaise Bourdin 
3255c6c1daeSBarry Smith /*@C
326811af0c4SBarry Smith   PetscBagRegisterString - add a string value to a `PetscBag`
3275c6c1daeSBarry Smith 
328c3339decSBarry Smith   Logically Collective
3295c6c1daeSBarry Smith 
330d8d19677SJose E. Roman   Input Parameters:
3315c6c1daeSBarry Smith + bag      - the bag of values
332811af0c4SBarry Smith . addr     - location of start of string in struct, for example `&params->mystring`
3335c6c1daeSBarry Smith . msize    - length of the string space in the struct
3345c6c1daeSBarry Smith . mdefault - the initial value
3355c6c1daeSBarry Smith . name     - name of the string
3365c6c1daeSBarry Smith - help     - longer string with more information about the value
3375c6c1daeSBarry Smith 
3385c6c1daeSBarry Smith   Level: beginner
3395c6c1daeSBarry Smith 
34009cbc92aSBarry Smith   Note:
34109cbc92aSBarry Smith   The struct must have the field char mystring[`msize`]; not char *mystring
3425c6c1daeSBarry Smith 
343db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
344db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
345c2e3fba1SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
3465c6c1daeSBarry Smith @*/
347d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterString(PetscBag bag, void *addr, PetscInt msize, const char *mdefault, const char *name, const char *help)
348d71ae5a4SJacob Faibussowitsch {
3495c6c1daeSBarry Smith   PetscBagItem item;
3505c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
3515c6c1daeSBarry Smith   PetscBool    printhelp;
3525c6c1daeSBarry Smith 
3535c6c1daeSBarry Smith   PetscFunctionBegin;
3544f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
3554f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
3564f572ea9SToby Isaac   PetscAssertPointer(mdefault, 4);
3574f572ea9SToby Isaac   PetscAssertPointer(name, 5);
3584f572ea9SToby Isaac   PetscAssertPointer(help, 6);
3595c6c1daeSBarry Smith   nname[0] = '-';
3605c6c1daeSBarry Smith   nname[1] = 0;
3619566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
3629566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
36348a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help));
3645c6c1daeSBarry Smith 
3659566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
3665c6c1daeSBarry Smith   item->dtype  = PETSC_CHAR;
3675c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
3685f80ce2aSJacob 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);
36902c9f0b5SLisandro Dalcin   item->next  = NULL;
3705c6c1daeSBarry Smith   item->msize = msize;
37148a46eb9SPierre Jolivet   if (mdefault != (char *)addr) PetscCall(PetscStrncpy((char *)addr, mdefault, msize - 1));
3729566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, bag->bagprefix, nname, (char *)addr, msize, NULL));
3739566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
3743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3755c6c1daeSBarry Smith }
3765c6c1daeSBarry Smith 
3775c6c1daeSBarry Smith /*@C
378811af0c4SBarry Smith   PetscBagRegisterReal - add a `PetscReal` value to a `PetscBag`
3795c6c1daeSBarry Smith 
380c3339decSBarry Smith   Logically Collective
3815c6c1daeSBarry Smith 
382d8d19677SJose E. Roman   Input Parameters:
3835c6c1daeSBarry Smith + bag      - the bag of values
38409cbc92aSBarry Smith . addr     - location of `PetscReal` in struct, for example `&params->r`
3855c6c1daeSBarry Smith . mdefault - the initial value
3865c6c1daeSBarry Smith . name     - name of the variable
3875c6c1daeSBarry Smith - help     - longer string with more information about the value
3885c6c1daeSBarry Smith 
3895c6c1daeSBarry Smith   Level: beginner
3905c6c1daeSBarry Smith 
391db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
392db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
393db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
3945c6c1daeSBarry Smith @*/
395d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterReal(PetscBag bag, void *addr, PetscReal mdefault, const char *name, const char *help)
396d71ae5a4SJacob Faibussowitsch {
3975c6c1daeSBarry Smith   PetscBagItem item;
3985c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
3995c6c1daeSBarry Smith   PetscBool    printhelp;
4005c6c1daeSBarry Smith 
4015c6c1daeSBarry Smith   PetscFunctionBegin;
4024f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
4034f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
4044f572ea9SToby Isaac   PetscAssertPointer(name, 4);
4054f572ea9SToby Isaac   PetscAssertPointer(help, 5);
4065c6c1daeSBarry Smith   nname[0] = '-';
4075c6c1daeSBarry Smith   nname[1] = 0;
4089566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
4099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
41048a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%g>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, (double)mdefault, help));
4119566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetReal(NULL, bag->bagprefix, nname, &mdefault, NULL));
4125c6c1daeSBarry Smith 
4139566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4145c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
4155c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
4165f80ce2aSJacob 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);
41702c9f0b5SLisandro Dalcin   item->next         = NULL;
4185c6c1daeSBarry Smith   item->msize        = 1;
4195c6c1daeSBarry Smith   *(PetscReal *)addr = mdefault;
4209566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
4213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4225c6c1daeSBarry Smith }
4235c6c1daeSBarry Smith 
4245c6c1daeSBarry Smith /*@C
425811af0c4SBarry Smith   PetscBagRegisterScalar - add a `PetscScalar` value to a `PetscBag`
4265c6c1daeSBarry Smith 
427c3339decSBarry Smith   Logically Collective
4285c6c1daeSBarry Smith 
429d8d19677SJose E. Roman   Input Parameters:
4305c6c1daeSBarry Smith + bag      - the bag of values
43109cbc92aSBarry Smith . addr     - location of `PetscScalar` in struct, for example `&params->c`
4325c6c1daeSBarry Smith . mdefault - the initial value
4335c6c1daeSBarry Smith . name     - name of the variable
4345c6c1daeSBarry Smith - help     - longer string with more information about the value
4355c6c1daeSBarry Smith 
4365c6c1daeSBarry Smith   Level: beginner
4375c6c1daeSBarry Smith 
438db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
43942747ad1SJacob Faibussowitsch           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagSetFromOptions()`,
44042747ad1SJacob Faibussowitsch           `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
4415c6c1daeSBarry Smith @*/
442d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterScalar(PetscBag bag, void *addr, PetscScalar mdefault, const char *name, const char *help)
443d71ae5a4SJacob Faibussowitsch {
4445c6c1daeSBarry Smith   PetscBagItem item;
4455c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
4465c6c1daeSBarry Smith   PetscBool    printhelp;
4475c6c1daeSBarry Smith 
4485c6c1daeSBarry Smith   PetscFunctionBegin;
4494f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
4504f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
4514f572ea9SToby Isaac   PetscAssertPointer(name, 4);
4524f572ea9SToby Isaac   PetscAssertPointer(help, 5);
4535c6c1daeSBarry Smith   nname[0] = '-';
4545c6c1daeSBarry Smith   nname[1] = 0;
4559566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
4569566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
45748a46eb9SPierre 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));
4589566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetScalar(NULL, bag->bagprefix, nname, &mdefault, NULL));
4595c6c1daeSBarry Smith 
4609566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4615c6c1daeSBarry Smith   item->dtype  = PETSC_SCALAR;
4625c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
4635f80ce2aSJacob 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);
46402c9f0b5SLisandro Dalcin   item->next           = NULL;
4655c6c1daeSBarry Smith   item->msize          = 1;
4665c6c1daeSBarry Smith   *(PetscScalar *)addr = mdefault;
4679566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
4683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4695c6c1daeSBarry Smith }
4705c6c1daeSBarry Smith 
4715c6c1daeSBarry Smith /*@C
472811af0c4SBarry Smith   PetscBagRegisterBool - add a `PetscBool` to a `PetscBag`
4735c6c1daeSBarry Smith 
474c3339decSBarry Smith   Logically Collective
4755c6c1daeSBarry Smith 
476d8d19677SJose E. Roman   Input Parameters:
4775c6c1daeSBarry Smith + bag      - the bag of values
47809cbc92aSBarry Smith . addr     - location of `PetscBool` in struct, for example `&params->b`
479811af0c4SBarry Smith . mdefault - the initial value, either `PETSC_FALSE` or `PETSC_TRUE`
4805c6c1daeSBarry Smith . name     - name of the variable
4815c6c1daeSBarry Smith - help     - longer string with more information about the value
4825c6c1daeSBarry Smith 
4835c6c1daeSBarry Smith   Level: beginner
4845c6c1daeSBarry Smith 
485db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
48642747ad1SJacob Faibussowitsch           `PetscBagRegisterInt()`, `PetscBagRegisterScalar()`
487db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
4885c6c1daeSBarry Smith @*/
489d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterBool(PetscBag bag, void *addr, PetscBool mdefault, const char *name, const char *help)
490d71ae5a4SJacob Faibussowitsch {
4915c6c1daeSBarry Smith   PetscBagItem item;
4925c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
4935c6c1daeSBarry Smith   PetscBool    printhelp;
4945c6c1daeSBarry Smith 
4955c6c1daeSBarry Smith   PetscFunctionBegin;
4964f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
4974f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
4984f572ea9SToby Isaac   PetscAssertPointer(name, 4);
4994f572ea9SToby Isaac   PetscAssertPointer(help, 5);
5005c6c1daeSBarry 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 */
5015f80ce2aSJacob 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);
5025c6c1daeSBarry Smith   nname[0] = '-';
5035c6c1daeSBarry Smith   nname[1] = 0;
5049566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
5059566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
50648a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, PetscBools[mdefault], help));
5079566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, bag->bagprefix, nname, &mdefault, NULL));
5085c6c1daeSBarry Smith 
5099566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
5105c6c1daeSBarry Smith   item->dtype  = PETSC_BOOL;
5115c6c1daeSBarry Smith   item->offset = ((char *)addr) - ((char *)bag);
5125f80ce2aSJacob 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);
51302c9f0b5SLisandro Dalcin   item->next         = NULL;
5145c6c1daeSBarry Smith   item->msize        = 1;
5155c6c1daeSBarry Smith   *(PetscBool *)addr = mdefault;
5169566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
5173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5185c6c1daeSBarry Smith }
5195c6c1daeSBarry Smith 
5205c6c1daeSBarry Smith /*@C
521811af0c4SBarry Smith   PetscBagDestroy - Destroys a `PetscBag`
5225c6c1daeSBarry Smith 
523c3339decSBarry Smith   Collective
5245c6c1daeSBarry Smith 
5255c6c1daeSBarry Smith   Input Parameter:
5265c6c1daeSBarry Smith . bag - the bag of values
5275c6c1daeSBarry Smith 
5285c6c1daeSBarry Smith   Level: beginner
5295c6c1daeSBarry Smith 
530db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
531db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
532db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
5335c6c1daeSBarry Smith @*/
534d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagDestroy(PetscBag *bag)
535d71ae5a4SJacob Faibussowitsch {
5365f80ce2aSJacob Faibussowitsch   PetscBagItem nitem;
5375c6c1daeSBarry Smith 
5385c6c1daeSBarry Smith   PetscFunctionBegin;
5393ba16761SJacob Faibussowitsch   if (!*bag) PetscFunctionReturn(PETSC_SUCCESS);
5404f572ea9SToby Isaac   PetscAssertPointer(*bag, 1);
5415f80ce2aSJacob Faibussowitsch   nitem = (*bag)->bagitems;
5425c6c1daeSBarry Smith   while (nitem) {
5435f80ce2aSJacob Faibussowitsch     PetscBagItem item = nitem->next;
5445f80ce2aSJacob Faibussowitsch 
5459566063dSJacob Faibussowitsch     if (nitem->list) PetscCall(PetscStrArrayDestroy(&nitem->list));
5469566063dSJacob Faibussowitsch     PetscCall(PetscFree(nitem));
5475c6c1daeSBarry Smith     nitem = item;
5485c6c1daeSBarry Smith   }
5499566063dSJacob Faibussowitsch   if ((*bag)->bagprefix) PetscCall(PetscFree((*bag)->bagprefix));
5509566063dSJacob Faibussowitsch   PetscCall(PetscFree(*bag));
5513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5525c6c1daeSBarry Smith }
5535c6c1daeSBarry Smith 
5545c6c1daeSBarry Smith /*@
555811af0c4SBarry Smith   PetscBagSetFromOptions - Allows setting entries to a `PetscBag` using the options database
5565c6c1daeSBarry Smith 
557c3339decSBarry Smith   Collective
5585c6c1daeSBarry Smith 
5595c6c1daeSBarry Smith   Input Parameter:
5605c6c1daeSBarry Smith . bag - the bag of values
5615c6c1daeSBarry Smith 
5625c6c1daeSBarry Smith   Level: beginner
5635c6c1daeSBarry Smith 
564811af0c4SBarry Smith   Note:
565811af0c4SBarry Smith   The options database keys for the entries are of the form `-[bagprefix]_name value`
566811af0c4SBarry Smith 
567db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()`
568db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
56942747ad1SJacob Faibussowitsch           `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagRegisterEnum()`
5705c6c1daeSBarry Smith @*/
571d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagSetFromOptions(PetscBag bag)
572d71ae5a4SJacob Faibussowitsch {
5735c6c1daeSBarry Smith   PetscBagItem nitem = bag->bagitems;
5745c6c1daeSBarry Smith   char         name[PETSC_BAG_NAME_LENGTH + 1], helpname[PETSC_BAG_NAME_LENGTH + PETSC_BAG_HELP_LENGTH + 3];
5755c6c1daeSBarry Smith   PetscInt     n;
5765c6c1daeSBarry Smith 
5775c6c1daeSBarry Smith   PetscFunctionBegin;
5784f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
5799566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(helpname, bag->bagname, sizeof(helpname)));
5809566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(helpname, " ", sizeof(helpname)));
5819566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(helpname, bag->baghelp, sizeof(helpname)));
582d0609cedSBarry Smith   PetscOptionsBegin(bag->bagcomm, bag->bagprefix, helpname, NULL);
5835c6c1daeSBarry Smith   while (nitem) {
5845c6c1daeSBarry Smith     name[0] = '-';
5855c6c1daeSBarry Smith     name[1] = 0;
5869566063dSJacob Faibussowitsch     PetscCall(PetscStrlcat(name, nitem->name, sizeof(name)));
5875c6c1daeSBarry Smith     if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */
5885c6c1daeSBarry Smith       char *value = (char *)(((char *)bag) + nitem->offset);
5899566063dSJacob Faibussowitsch       PetscCall(PetscOptionsString(name, nitem->help, "", value, value, nitem->msize, NULL));
5905c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_REAL) {
5915c6c1daeSBarry Smith       PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset);
5925c6c1daeSBarry Smith       if (nitem->msize == 1) {
5939566063dSJacob Faibussowitsch         PetscCall(PetscOptionsReal(name, nitem->help, "", *value, value, NULL));
5945c6c1daeSBarry Smith       } else {
5955c6c1daeSBarry Smith         n = nitem->msize;
5969566063dSJacob Faibussowitsch         PetscCall(PetscOptionsRealArray(name, nitem->help, "", value, &n, NULL));
5975c6c1daeSBarry Smith       }
5985c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_SCALAR) {
5995c6c1daeSBarry Smith       PetscScalar *value = (PetscScalar *)(((char *)bag) + nitem->offset);
6009566063dSJacob Faibussowitsch       PetscCall(PetscOptionsScalar(name, nitem->help, "", *value, value, NULL));
6015c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_INT) {
6025c6c1daeSBarry Smith       PetscInt *value = (PetscInt *)(((char *)bag) + nitem->offset);
6035c6c1daeSBarry Smith       if (nitem->msize == 1) {
6049566063dSJacob Faibussowitsch         PetscCall(PetscOptionsInt(name, nitem->help, "", *value, value, NULL));
6055c6c1daeSBarry Smith       } else {
6065c6c1daeSBarry Smith         n = nitem->msize;
6079566063dSJacob Faibussowitsch         PetscCall(PetscOptionsIntArray(name, nitem->help, "", value, &n, NULL));
6085c6c1daeSBarry Smith       }
6095c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_ENUM) {
6105c6c1daeSBarry Smith       PetscEnum *value = (PetscEnum *)(((char *)bag) + nitem->offset);
6115c6c1daeSBarry Smith       PetscInt   i     = 0;
612fbccb6d4SPierre Jolivet       while (nitem->list[i++]);
6139566063dSJacob Faibussowitsch       PetscCall(PetscOptionsEnum(name, nitem->help, nitem->list[i - 3], (const char *const *)nitem->list, *value, value, NULL));
6145c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_BOOL) {
6155c6c1daeSBarry Smith       PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset);
616dd66f111SBlaise Bourdin       if (nitem->msize == 1) {
6179566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBool(name, nitem->help, "", *value, value, NULL));
618dd66f111SBlaise Bourdin       } else {
619dd66f111SBlaise Bourdin         n = nitem->msize;
6209566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBoolArray(name, nitem->help, "", value, &n, NULL));
621dd66f111SBlaise Bourdin       }
6225c6c1daeSBarry Smith     }
6235c6c1daeSBarry Smith     nitem = nitem->next;
6245c6c1daeSBarry Smith   }
625d0609cedSBarry Smith   PetscOptionsEnd();
6263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6275c6c1daeSBarry Smith }
6285c6c1daeSBarry Smith 
629*ffeef943SBarry Smith /*@
6305c6c1daeSBarry Smith   PetscBagView - Views a bag of values as either ASCII text or a binary file
6315c6c1daeSBarry Smith 
632c3339decSBarry Smith   Collective
6335c6c1daeSBarry Smith 
634d8d19677SJose E. Roman   Input Parameters:
6355c6c1daeSBarry Smith + bag  - the bag of values
636aec76313SJacob Faibussowitsch - view - location to view the values
6375c6c1daeSBarry Smith 
6385c6c1daeSBarry Smith   Level: beginner
6395c6c1daeSBarry Smith 
640811af0c4SBarry Smith   Note:
641811af0c4SBarry Smith   Currently PETSc bags saved in a binary file can only be read back
64209cbc92aSBarry Smith   in on a machine with the same binary format.
6435c6c1daeSBarry Smith 
644db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()`
645db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
646db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`
6475c6c1daeSBarry Smith @*/
648d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagView(PetscBag bag, PetscViewer view)
649d71ae5a4SJacob Faibussowitsch {
6505c6c1daeSBarry Smith   PetscBool    isascii, isbinary;
6515c6c1daeSBarry Smith   PetscBagItem nitem = bag->bagitems;
6525c6c1daeSBarry Smith 
6535c6c1daeSBarry Smith   PetscFunctionBegin;
6544f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
6555f80ce2aSJacob Faibussowitsch   PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 2);
6569566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERASCII, &isascii));
6579566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary));
6585c6c1daeSBarry Smith   if (isascii) {
6593ffde785SBarry Smith     if (bag->bagprefix) {
6609566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object:  %s (%s) %s\n", bag->bagname, bag->bagprefix, bag->baghelp));
6613ffde785SBarry Smith     } else {
6629566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object:  %s %s\n", bag->bagname, bag->baghelp));
6633ffde785SBarry Smith     }
6645c6c1daeSBarry Smith     while (nitem) {
6655c6c1daeSBarry Smith       if (nitem->dtype == PETSC_CHAR) {
6665c6c1daeSBarry Smith         char *value             = (char *)(((char *)bag) + nitem->offset);
667da81f932SPierre Jolivet         char  tmp               = value[nitem->msize - 1]; /* special handling for fortran chars without null terminator */
6685c6c1daeSBarry Smith         value[nitem->msize - 1] = 0;
6699566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %s; %s\n", nitem->name, value, nitem->help));
6705c6c1daeSBarry Smith         value[nitem->msize - 1] = tmp;
6715c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_REAL) {
6725c6c1daeSBarry Smith         PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset);
6735c6c1daeSBarry Smith         PetscInt   i;
6749566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
67548a46eb9SPierre Jolivet         for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%g ", (double)value[i]));
6769566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
6775c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_SCALAR) {
6785c6c1daeSBarry Smith         PetscScalar value = *(PetscScalar *)(((char *)bag) + nitem->offset);
6795c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
6808627564fSBarry Smith         if ((double)PetscImaginaryPart(value)) {
6819566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g + %gi; %s\n", nitem->name, (double)PetscRealPart(value), (double)PetscImaginaryPart(value), nitem->help));
6828627564fSBarry Smith         } else {
6839566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g; %s\n", nitem->name, (double)PetscRealPart(value), nitem->help));
6848627564fSBarry Smith         }
6855c6c1daeSBarry Smith #else
6869566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g; %s\n", nitem->name, (double)value, nitem->help));
6875c6c1daeSBarry Smith #endif
6885c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_INT) {
6895c6c1daeSBarry Smith         PetscInt i, *value = (PetscInt *)(((char *)bag) + nitem->offset);
6909566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
69148a46eb9SPierre Jolivet         for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%" PetscInt_FMT " ", value[i]));
6929566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
6935c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_BOOL) {
694dd66f111SBlaise Bourdin         PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset);
695dd66f111SBlaise Bourdin         PetscInt   i;
6965c6c1daeSBarry Smith         /* some Fortran compilers use -1 as boolean */
6979566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
698dd66f111SBlaise Bourdin         for (i = 0; i < nitem->msize; i++) {
699dd66f111SBlaise Bourdin           if (((int)value[i]) == -1) value[i] = PETSC_TRUE;
7005c6c1daeSBarry 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 */
701f4f49eeaSPierre Jolivet           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]);
7029566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, " %s", PetscBools[value[i]]));
703dd66f111SBlaise Bourdin         }
7049566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
7055c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_ENUM) {
7065c6c1daeSBarry Smith         PetscEnum value = *(PetscEnum *)(((char *)bag) + nitem->offset);
7075c6c1daeSBarry Smith         PetscInt  i     = 0;
708fbccb6d4SPierre Jolivet         while (nitem->list[i++]);
7099566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %s; (%s) %s\n", nitem->name, nitem->list[value], nitem->list[i - 3], nitem->help));
7105c6c1daeSBarry Smith       }
7115c6c1daeSBarry Smith       nitem = nitem->next;
7125c6c1daeSBarry Smith     }
7135c6c1daeSBarry Smith   } else if (isbinary) {
7145c6c1daeSBarry Smith     PetscInt          classid           = PETSC_BAG_FILE_CLASSID, dtype;
7155c6c1daeSBarry Smith     PetscInt          deprecatedbagsize = 0;
716a261c58fSBarry Smith     PetscViewerFormat format;
7179566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &classid, 1, PETSC_INT));
7189566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &deprecatedbagsize, 1, PETSC_INT));
7199566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &bag->count, 1, PETSC_INT));
7209566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, bag->bagname, PETSC_BAG_NAME_LENGTH, PETSC_CHAR));
7219566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, PETSC_CHAR));
7225c6c1daeSBarry Smith     while (nitem) {
7239566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &nitem->offset, 1, PETSC_INT));
7245c6c1daeSBarry Smith       dtype = (PetscInt)nitem->dtype;
7259566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &dtype, 1, PETSC_INT));
7269566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, nitem->name, PETSC_BAG_NAME_LENGTH, PETSC_CHAR));
7279566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, nitem->help, PETSC_BAG_HELP_LENGTH, PETSC_CHAR));
7289566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &nitem->msize, 1, PETSC_INT));
7295c6c1daeSBarry Smith       /* some Fortran compilers use -1 as boolean */
730f4f49eeaSPierre Jolivet       if (dtype == PETSC_BOOL && (*(int *)(((char *)bag) + nitem->offset) == -1)) *(int *)(((char *)bag) + nitem->offset) = PETSC_TRUE;
7315c6c1daeSBarry Smith 
7329566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, (((char *)bag) + nitem->offset), nitem->msize, nitem->dtype));
73348a46eb9SPierre Jolivet       if (dtype == PETSC_ENUM) PetscCall(PetscViewerBinaryWriteStringArray(view, (const char *const *)nitem->list));
7345c6c1daeSBarry Smith       nitem = nitem->next;
7355c6c1daeSBarry Smith     }
7369566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(view, &format));
737a261c58fSBarry Smith     if (format == PETSC_VIEWER_BINARY_MATLAB) {
738a261c58fSBarry Smith       MPI_Comm comm;
739a261c58fSBarry Smith       FILE    *info;
7409566063dSJacob Faibussowitsch       PetscCall(PetscObjectGetComm((PetscObject)view, &comm));
7419566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryGetInfoPointer(view, &info));
7429566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#--- begin code written by PetscViewerBinary for MATLAB format ---#\n"));
7439566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#$$ Set.%s = PetscBinaryRead(fd);\n", bag->bagname));
7449566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n"));
745a261c58fSBarry Smith     }
746a261c58fSBarry Smith   }
7473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7485c6c1daeSBarry Smith }
7495c6c1daeSBarry Smith 
750*ffeef943SBarry Smith /*@
75109cbc92aSBarry Smith   PetscBagViewFromOptions - Processes command line options to determine if/how a `PetscBag` is to be viewed.
752173f9484SMatthew G. Knepley 
753c3339decSBarry Smith   Collective
754173f9484SMatthew G. Knepley 
755173f9484SMatthew G. Knepley   Input Parameters:
756aec76313SJacob Faibussowitsch + bag        - the object
75709cbc92aSBarry Smith . bobj       - optional other object that provides prefix (if `NULL` then the prefix in obj is used)
758173f9484SMatthew G. Knepley - optionname - option to activate viewing
759478db826SMatthew G. Knepley 
760173f9484SMatthew G. Knepley   Level: intermediate
761478db826SMatthew G. Knepley 
762db781477SPatrick Sanan .seealso: `PetscBagCreate()`, `PetscBag`, `PetscViewer`
763173f9484SMatthew G. Knepley @*/
764d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[])
765d71ae5a4SJacob Faibussowitsch {
766173f9484SMatthew G. Knepley   static PetscBool  incall = PETSC_FALSE;
767173f9484SMatthew G. Knepley   PetscViewer       viewer;
768173f9484SMatthew G. Knepley   PetscViewerFormat format;
769173f9484SMatthew G. Knepley   const char       *prefix, *bprefix = NULL;
770173f9484SMatthew G. Knepley   PetscBool         flg;
771173f9484SMatthew G. Knepley 
772173f9484SMatthew G. Knepley   PetscFunctionBegin;
7733ba16761SJacob Faibussowitsch   if (incall) PetscFunctionReturn(PETSC_SUCCESS);
774173f9484SMatthew G. Knepley   incall = PETSC_TRUE;
7754f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
7769566063dSJacob Faibussowitsch   if (bobj) PetscCall(PetscObjectGetOptionsPrefix(bobj, &bprefix));
777173f9484SMatthew G. Knepley   prefix = bobj ? bprefix : bag->bagprefix;
7789566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg));
779173f9484SMatthew G. Knepley   if (flg) {
7809566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, format));
7819566063dSJacob Faibussowitsch     PetscCall(PetscBagView(bag, viewer));
7829566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(viewer));
7839566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
784cd791dc2SBarry Smith     PetscCall(PetscOptionsRestoreViewer(&viewer));
785173f9484SMatthew G. Knepley   }
786173f9484SMatthew G. Knepley   incall = PETSC_FALSE;
7873ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
788173f9484SMatthew G. Knepley }
789173f9484SMatthew G. Knepley 
790*ffeef943SBarry Smith /*@
7915c6c1daeSBarry Smith   PetscBagLoad - Loads a bag of values from a binary file
7925c6c1daeSBarry Smith 
793c3339decSBarry Smith   Collective
7945c6c1daeSBarry Smith 
795d8d19677SJose E. Roman   Input Parameters:
796aec76313SJacob Faibussowitsch + view - file to load values from
7975c6c1daeSBarry Smith - bag  - the bag of values
7985c6c1daeSBarry Smith 
7995c6c1daeSBarry Smith   Level: beginner
8005c6c1daeSBarry Smith 
80109cbc92aSBarry Smith   Note:
80209cbc92aSBarry Smith   You must have created and registered all the fields in the bag before loading into it. This only loads values.
80309cbc92aSBarry Smith 
804db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagView()`, `PetscBagGetData()`
805db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
806db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
8075c6c1daeSBarry Smith @*/
808d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagLoad(PetscViewer view, PetscBag bag)
809d71ae5a4SJacob Faibussowitsch {
8105c6c1daeSBarry Smith   PetscBool    isbinary;
8115f80ce2aSJacob Faibussowitsch   PetscInt     classid, bagcount, dtype, msize, offset, deprecatedbagsize;
8125c6c1daeSBarry Smith   char         name[PETSC_BAG_NAME_LENGTH], help[PETSC_BAG_HELP_LENGTH], **list;
8135c6c1daeSBarry Smith   PetscBagItem nitem;
8145c6c1daeSBarry Smith   MPI_Comm     comm;
8155c6c1daeSBarry Smith   PetscMPIInt  flag;
8165c6c1daeSBarry Smith 
8175c6c1daeSBarry Smith   PetscFunctionBegin;
8185f80ce2aSJacob Faibussowitsch   PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 1);
8194f572ea9SToby Isaac   PetscAssertPointer(bag, 2);
8209566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)view, &comm));
8219566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_compare(comm, bag->bagcomm, &flag));
8225f80ce2aSJacob Faibussowitsch   PetscCheck(flag == MPI_CONGRUENT || flag == MPI_IDENT, PETSC_COMM_SELF, PETSC_ERR_ARG_NOTSAMECOMM, "Different communicators in the viewer and bag");
8239566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary));
8245f80ce2aSJacob Faibussowitsch   PetscCheck(isbinary, PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for this viewer type");
8255c6c1daeSBarry Smith 
8269566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &classid, 1, NULL, PETSC_INT));
8275f80ce2aSJacob Faibussowitsch   PetscCheck(classid == PETSC_BAG_FILE_CLASSID, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Not PetscBag next in binary file");
8289566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &deprecatedbagsize, 1, NULL, PETSC_INT));
8299566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &bagcount, 1, NULL, PETSC_INT));
8305f80ce2aSJacob 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);
8319566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, bag->bagname, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR));
8329566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR));
8335c6c1daeSBarry Smith 
8345c6c1daeSBarry Smith   nitem = bag->bagitems;
8355f80ce2aSJacob Faibussowitsch   for (PetscInt i = 0; i < bagcount; i++) {
8369566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &offset, 1, NULL, PETSC_INT));
8375c6c1daeSBarry Smith     /* ignore the offset in the file */
8389566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &dtype, 1, NULL, PETSC_INT));
8399566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, name, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR));
8409566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, help, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR));
8419566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &msize, 1, NULL, PETSC_INT));
8425c6c1daeSBarry Smith 
8435c6c1daeSBarry Smith     if (dtype == (PetscInt)PETSC_CHAR) {
8449566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_CHAR));
8455c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_REAL) {
8469566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_REAL));
8475c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_SCALAR) {
8489566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_SCALAR));
8495c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_INT) {
8509566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_INT));
8515c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_BOOL) {
8529566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_BOOL));
8535c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_ENUM) {
8549566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_ENUM));
8559566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryReadStringArray(view, &list));
8565c6c1daeSBarry Smith       /* don't need to save list because it is already registered in the bag */
8579566063dSJacob Faibussowitsch       PetscCall(PetscFree(list));
8585c6c1daeSBarry Smith     }
8595c6c1daeSBarry Smith     nitem = nitem->next;
8605c6c1daeSBarry Smith   }
8613ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8625c6c1daeSBarry Smith }
8635c6c1daeSBarry Smith 
864e8976759SBarry Smith /*@C
86509cbc92aSBarry 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,
86609cbc92aSBarry Smith   can have values set from the options database
8675c6c1daeSBarry Smith 
868d083f849SBarry Smith   Collective
8695c6c1daeSBarry Smith 
8705c6c1daeSBarry Smith   Input Parameters:
8715c6c1daeSBarry Smith + comm    - communicator to share bag
872811af0c4SBarry Smith - bagsize - size of the C structure holding the values, for example sizeof(mystruct)
8735c6c1daeSBarry Smith 
8745c6c1daeSBarry Smith   Output Parameter:
8755c6c1daeSBarry Smith . bag - the bag of values
8765c6c1daeSBarry Smith 
877aec76313SJacob Faibussowitsch   Level: intermediate
87809cbc92aSBarry Smith 
8795c6c1daeSBarry Smith   Notes:
880811af0c4SBarry Smith   After creating the bag, for each entry in the C struct call the appropriate `PetscBagRegisterInt()` etc to define the C structs layout
881811af0c4SBarry Smith 
882811af0c4SBarry Smith   The size of the A struct must be small enough to fit in a `PetscInt`; by default
883811af0c4SBarry Smith   `PetscInt` is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length.
8845c6c1daeSBarry Smith   The warning about casting to a shorter length can be ignored below unless your A struct is too large
8855c6c1daeSBarry Smith 
886db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
887db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
88842747ad1SJacob Faibussowitsch           `PetscBagSetFromOptions()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
8895c6c1daeSBarry Smith @*/
890d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag)
891d71ae5a4SJacob Faibussowitsch {
8925f80ce2aSJacob Faibussowitsch   const size_t totalsize = bagsize + sizeof(struct _n_PetscBag) + sizeof(PetscScalar);
8935c6c1daeSBarry Smith 
8945c6c1daeSBarry Smith   PetscFunctionBegin;
8954f572ea9SToby Isaac   PetscAssertPointer(bag, 3);
8969566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Creating Bag with total size %d\n", (int)totalsize));
8979566063dSJacob Faibussowitsch   PetscCall(PetscCalloc(totalsize, bag));
898a297a907SKarl Rupp 
8995f80ce2aSJacob Faibussowitsch   (*bag)->bagsize        = totalsize;
9005c6c1daeSBarry Smith   (*bag)->bagcomm        = comm;
9010298fd71SBarry Smith   (*bag)->bagprefix      = NULL;
9025c6c1daeSBarry Smith   (*bag)->structlocation = (void *)(((char *)(*bag)) + sizeof(PetscScalar) * (sizeof(struct _n_PetscBag) / sizeof(PetscScalar)) + sizeof(PetscScalar));
9033ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9045c6c1daeSBarry Smith }
9055c6c1daeSBarry Smith 
906cc4c1da9SBarry Smith /*@
9075c6c1daeSBarry Smith   PetscBagSetName - Sets the name of a bag of values
9085c6c1daeSBarry Smith 
9095c6c1daeSBarry Smith   Not Collective
9105c6c1daeSBarry Smith 
911aec76313SJacob Faibussowitsch   Level: intermediate
9125c6c1daeSBarry Smith 
9135c6c1daeSBarry Smith   Input Parameters:
9145c6c1daeSBarry Smith + bag  - the bag of values
9155c6c1daeSBarry Smith . name - the name assigned to the bag
9165c6c1daeSBarry Smith - help - help message for bag
9175c6c1daeSBarry Smith 
918db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
919db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
920db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9215c6c1daeSBarry Smith @*/
922d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help)
923d71ae5a4SJacob Faibussowitsch {
9245c6c1daeSBarry Smith   PetscFunctionBegin;
9254f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
9264f572ea9SToby Isaac   PetscAssertPointer(name, 2);
9274f572ea9SToby Isaac   PetscAssertPointer(help, 3);
9289566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(bag->bagname, name, PETSC_BAG_NAME_LENGTH - 1));
9299566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(bag->baghelp, help, PETSC_BAG_HELP_LENGTH - 1));
9303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9315c6c1daeSBarry Smith }
9325c6c1daeSBarry Smith 
9335c6c1daeSBarry Smith /*@C
9345c6c1daeSBarry Smith   PetscBagGetName - Gets the name of a bag of values
9355c6c1daeSBarry Smith 
9365c6c1daeSBarry Smith   Not Collective
9375c6c1daeSBarry Smith 
938aec76313SJacob Faibussowitsch   Level: intermediate
9395c6c1daeSBarry Smith 
9405c6c1daeSBarry Smith   Input Parameter:
9415c6c1daeSBarry Smith . bag - the bag of values
9425c6c1daeSBarry Smith 
9435c6c1daeSBarry Smith   Output Parameter:
9445c6c1daeSBarry Smith . name - the name assigned to the bag
9455c6c1daeSBarry Smith 
946db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
947db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
948db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9495c6c1daeSBarry Smith @*/
950cc4c1da9SBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, const char **name)
951d71ae5a4SJacob Faibussowitsch {
9525c6c1daeSBarry Smith   PetscFunctionBegin;
9534f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
9544f572ea9SToby Isaac   PetscAssertPointer(name, 2);
9555c6c1daeSBarry Smith   *name = bag->bagname;
9563ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9575c6c1daeSBarry Smith }
9585c6c1daeSBarry Smith 
9595c6c1daeSBarry Smith /*@C
9605c6c1daeSBarry Smith   PetscBagGetData - Gives back the user - access to memory that
961811af0c4SBarry Smith   can be used for storing user-data-structure
9625c6c1daeSBarry Smith 
9635c6c1daeSBarry Smith   Not Collective
9645c6c1daeSBarry Smith 
9655c6c1daeSBarry Smith   Input Parameter:
9665c6c1daeSBarry Smith . bag - the bag of values
9675c6c1daeSBarry Smith 
9685c6c1daeSBarry Smith   Output Parameter:
96909cbc92aSBarry 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
97009cbc92aSBarry Smith     defining the bag
97109cbc92aSBarry Smith 
972aec76313SJacob Faibussowitsch   Level: intermediate
9735c6c1daeSBarry Smith 
974db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`
975db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
976db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9775c6c1daeSBarry Smith @*/
978d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagGetData(PetscBag bag, void **data)
979d71ae5a4SJacob Faibussowitsch {
9805c6c1daeSBarry Smith   PetscFunctionBegin;
9814f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
9824f572ea9SToby Isaac   PetscAssertPointer(data, 2);
9835c6c1daeSBarry Smith   *data = bag->structlocation;
9843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9855c6c1daeSBarry Smith }
9865c6c1daeSBarry Smith 
987cc4c1da9SBarry Smith /*@
9885c6c1daeSBarry Smith   PetscBagSetOptionsPrefix - Sets the prefix used for searching for all
989811af0c4SBarry Smith   `PetscBag` items in the options database.
9905c6c1daeSBarry Smith 
99109cbc92aSBarry Smith   Logically Collective
9925c6c1daeSBarry Smith 
993aec76313SJacob Faibussowitsch   Level: intermediate
9945c6c1daeSBarry Smith 
9955c6c1daeSBarry Smith   Input Parameters:
9965c6c1daeSBarry Smith + bag - the bag of values
997aec76313SJacob Faibussowitsch - pre - the prefix to prepend all Bag item names with.
9985c6c1daeSBarry Smith 
99909cbc92aSBarry Smith   Note:
100009cbc92aSBarry Smith   Must be called prior to registering any of the bag items.
10015c6c1daeSBarry Smith 
1002db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
1003db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
10045c6c1daeSBarry Smith @*/
1005d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[])
1006d71ae5a4SJacob Faibussowitsch {
10075c6c1daeSBarry Smith   PetscFunctionBegin;
10084f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
10095f80ce2aSJacob Faibussowitsch   if (pre) {
10104f572ea9SToby Isaac     PetscAssertPointer(pre, 2);
10115f80ce2aSJacob Faibussowitsch     PetscCheck(pre[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Options prefix should not begin with a hyphen");
10129566063dSJacob Faibussowitsch     PetscCall(PetscFree(bag->bagprefix));
1013f4f49eeaSPierre Jolivet     PetscCall(PetscStrallocpy(pre, &bag->bagprefix));
10149566063dSJacob Faibussowitsch   } else PetscCall(PetscFree(bag->bagprefix));
10153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10165c6c1daeSBarry Smith }
1017ffb7e86cSMatthew G. Knepley 
1018ffb7e86cSMatthew G. Knepley /*@C
1019ffb7e86cSMatthew G. Knepley   PetscBagGetNames - Get the names of all entries in the bag
1020ffb7e86cSMatthew G. Knepley 
102109cbc92aSBarry Smith   Not Collective
1022ffb7e86cSMatthew G. Knepley 
10232fe279fdSBarry Smith   Input Parameter:
10242fe279fdSBarry Smith . bag - the bag of values
1025ffb7e86cSMatthew G. Knepley 
1026ffb7e86cSMatthew G. Knepley   Output Parameter:
1027ffb7e86cSMatthew G. Knepley . names - array of char pointers for names
1028ffb7e86cSMatthew G. Knepley 
1029ffb7e86cSMatthew G. Knepley   Level: intermediate
1030ffb7e86cSMatthew G. Knepley 
1031db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagSetName()`, `PetscBagCreate()`, `PetscBagGetData()`
1032db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
1033ffb7e86cSMatthew G. Knepley @*/
1034d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[])
1035d71ae5a4SJacob Faibussowitsch {
1036ffb7e86cSMatthew G. Knepley   PetscBagItem nitem = bag->bagitems;
1037ffb7e86cSMatthew G. Knepley 
1038ffb7e86cSMatthew G. Knepley   PetscFunctionBegin;
10394f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
10404f572ea9SToby Isaac   PetscAssertPointer(names, 2);
10415f80ce2aSJacob Faibussowitsch   for (PetscInt n = 0; nitem; ++n, nitem = nitem->next) names[n] = nitem->name;
10423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1043ffb7e86cSMatthew G. Knepley }
1044