xref: /petsc/src/sys/classes/bag/bag.c (revision 835f2295474254850a9de28f274be7ce943244c7)
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;
696497c311SBarry Smith   item->offset = (PetscInt)(((size_t)addr) - ((size_t)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;
73*835f2295SStefano Zampini   PetscCall(PetscStrArrayallocpy(list, &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;
1226497c311SBarry Smith   item->offset = (PetscInt)(((size_t)addr) - ((size_t)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));
1666497c311SBarry Smith     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;
1736497c311SBarry Smith   item->offset = (PetscInt)(((size_t)addr) - ((size_t)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;
2196497c311SBarry Smith   item->offset = (PetscInt)(((size_t)addr) - ((size_t)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;
251*835f2295SStefano Zampini   PetscInt     odefault;
2520d349d43SBarry Smith   PetscBool    flg;
2530d349d43SBarry Smith 
2540d349d43SBarry Smith   PetscFunctionBegin;
2550d349d43SBarry Smith   nname[0] = '-';
2560d349d43SBarry Smith   nname[1] = 0;
257*835f2295SStefano Zampini 
258*835f2295SStefano Zampini   PetscCall(PetscIntCast(mdefault, &odefault));
2599566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
2609566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
26148a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, odefault, help));
2629566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &odefault, &flg));
263*835f2295SStefano Zampini   if (flg) mdefault = odefault;
2640d349d43SBarry Smith 
2659566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
2660d349d43SBarry Smith   item->dtype  = PETSC_INT;
2676497c311SBarry Smith   item->offset = (PetscInt)(((size_t)addr) - ((size_t)bag));
2685f80ce2aSJacob 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);
26902c9f0b5SLisandro Dalcin   item->next          = NULL;
2700d349d43SBarry Smith   item->msize         = 1;
271bafee8b4SSatish Balay   *(PetscInt64 *)addr = mdefault;
2729566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
2733ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2740d349d43SBarry Smith }
2750d349d43SBarry Smith 
276dd66f111SBlaise Bourdin /*@C
277811af0c4SBarry Smith   PetscBagRegisterBoolArray - add a n `PetscBool` values to a `PetscBag`
278dd66f111SBlaise Bourdin 
279c3339decSBarry Smith   Logically Collective
280dd66f111SBlaise Bourdin 
281d8d19677SJose E. Roman   Input Parameters:
282dd66f111SBlaise Bourdin + bag   - the bag of values
283811af0c4SBarry Smith . addr  - location of boolean array in struct, for example `&params->b`
284dd66f111SBlaise Bourdin . msize - number of entries in array
285dd66f111SBlaise Bourdin . name  - name of the boolean array
286dd66f111SBlaise Bourdin - help  - longer string with more information about the value
287dd66f111SBlaise Bourdin 
288dd66f111SBlaise Bourdin   Level: beginner
289dd66f111SBlaise Bourdin 
290db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
291db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
292db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
293dd66f111SBlaise Bourdin @*/
294d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help)
295d71ae5a4SJacob Faibussowitsch {
296dd66f111SBlaise Bourdin   PetscBagItem item;
297dd66f111SBlaise Bourdin   char         nname[PETSC_BAG_NAME_LENGTH + 1];
298dd66f111SBlaise Bourdin   PetscBool    printhelp;
299dd66f111SBlaise Bourdin   PetscInt     i, tmp = msize;
300dd66f111SBlaise Bourdin 
301dd66f111SBlaise Bourdin   PetscFunctionBegin;
3024f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
3034f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
3044f572ea9SToby Isaac   PetscAssertPointer(name, 4);
3054f572ea9SToby Isaac   PetscAssertPointer(help, 5);
306dd66f111SBlaise Bourdin   nname[0] = '-';
307dd66f111SBlaise Bourdin   nname[1] = 0;
3089566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
3099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
310dd66f111SBlaise Bourdin   if (printhelp) {
3119566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <", bag->bagprefix ? bag->bagprefix : "", name));
31248a46eb9SPierre Jolivet     for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i));
3139566063dSJacob Faibussowitsch     PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help));
314dd66f111SBlaise Bourdin   }
3159566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBoolArray(NULL, bag->bagprefix, nname, (PetscBool *)addr, &tmp, NULL));
316dd66f111SBlaise Bourdin 
3179566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
318dd66f111SBlaise Bourdin   item->dtype  = PETSC_BOOL;
3196497c311SBarry Smith   item->offset = (PetscInt)(((size_t)addr) - ((size_t)bag));
3205f80ce2aSJacob 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);
32102c9f0b5SLisandro Dalcin   item->next  = NULL;
322dd66f111SBlaise Bourdin   item->msize = msize;
3239566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
3243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
325dd66f111SBlaise Bourdin }
326dd66f111SBlaise Bourdin 
3275c6c1daeSBarry Smith /*@C
328811af0c4SBarry Smith   PetscBagRegisterString - add a string value to a `PetscBag`
3295c6c1daeSBarry Smith 
330c3339decSBarry Smith   Logically Collective
3315c6c1daeSBarry Smith 
332d8d19677SJose E. Roman   Input Parameters:
3335c6c1daeSBarry Smith + bag      - the bag of values
334811af0c4SBarry Smith . addr     - location of start of string in struct, for example `&params->mystring`
3355c6c1daeSBarry Smith . msize    - length of the string space in the struct
3365c6c1daeSBarry Smith . mdefault - the initial value
3375c6c1daeSBarry Smith . name     - name of the string
3385c6c1daeSBarry Smith - help     - longer string with more information about the value
3395c6c1daeSBarry Smith 
3405c6c1daeSBarry Smith   Level: beginner
3415c6c1daeSBarry Smith 
34209cbc92aSBarry Smith   Note:
34309cbc92aSBarry Smith   The struct must have the field char mystring[`msize`]; not char *mystring
3445c6c1daeSBarry Smith 
345db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
346db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
347c2e3fba1SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
3485c6c1daeSBarry Smith @*/
349d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterString(PetscBag bag, void *addr, PetscInt msize, const char *mdefault, const char *name, const char *help)
350d71ae5a4SJacob Faibussowitsch {
3515c6c1daeSBarry Smith   PetscBagItem item;
3525c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
3535c6c1daeSBarry Smith   PetscBool    printhelp;
3545c6c1daeSBarry Smith 
3555c6c1daeSBarry Smith   PetscFunctionBegin;
3564f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
3574f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
3584f572ea9SToby Isaac   PetscAssertPointer(mdefault, 4);
3594f572ea9SToby Isaac   PetscAssertPointer(name, 5);
3604f572ea9SToby Isaac   PetscAssertPointer(help, 6);
3615c6c1daeSBarry Smith   nname[0] = '-';
3625c6c1daeSBarry Smith   nname[1] = 0;
3639566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
3649566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
36548a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help));
3665c6c1daeSBarry Smith 
3679566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
3685c6c1daeSBarry Smith   item->dtype  = PETSC_CHAR;
3696497c311SBarry Smith   item->offset = (PetscInt)(((size_t)addr) - ((size_t)bag));
3705f80ce2aSJacob 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);
37102c9f0b5SLisandro Dalcin   item->next  = NULL;
3725c6c1daeSBarry Smith   item->msize = msize;
37348a46eb9SPierre Jolivet   if (mdefault != (char *)addr) PetscCall(PetscStrncpy((char *)addr, mdefault, msize - 1));
3749566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, bag->bagprefix, nname, (char *)addr, msize, NULL));
3759566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
3763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3775c6c1daeSBarry Smith }
3785c6c1daeSBarry Smith 
3795c6c1daeSBarry Smith /*@C
380811af0c4SBarry Smith   PetscBagRegisterReal - add a `PetscReal` value to a `PetscBag`
3815c6c1daeSBarry Smith 
382c3339decSBarry Smith   Logically Collective
3835c6c1daeSBarry Smith 
384d8d19677SJose E. Roman   Input Parameters:
3855c6c1daeSBarry Smith + bag      - the bag of values
38609cbc92aSBarry Smith . addr     - location of `PetscReal` in struct, for example `&params->r`
3875c6c1daeSBarry Smith . mdefault - the initial value
3885c6c1daeSBarry Smith . name     - name of the variable
3895c6c1daeSBarry Smith - help     - longer string with more information about the value
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith   Level: beginner
3925c6c1daeSBarry Smith 
393db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
394db781477SPatrick Sanan           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
395db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
3965c6c1daeSBarry Smith @*/
397d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterReal(PetscBag bag, void *addr, PetscReal mdefault, const char *name, const char *help)
398d71ae5a4SJacob Faibussowitsch {
3995c6c1daeSBarry Smith   PetscBagItem item;
4005c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
4015c6c1daeSBarry Smith   PetscBool    printhelp;
4025c6c1daeSBarry Smith 
4035c6c1daeSBarry Smith   PetscFunctionBegin;
4044f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
4054f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
4064f572ea9SToby Isaac   PetscAssertPointer(name, 4);
4074f572ea9SToby Isaac   PetscAssertPointer(help, 5);
4085c6c1daeSBarry Smith   nname[0] = '-';
4095c6c1daeSBarry Smith   nname[1] = 0;
4109566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
4119566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
41248a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%g>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, (double)mdefault, help));
4139566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetReal(NULL, bag->bagprefix, nname, &mdefault, NULL));
4145c6c1daeSBarry Smith 
4159566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4165c6c1daeSBarry Smith   item->dtype  = PETSC_REAL;
4176497c311SBarry Smith   item->offset = (PetscInt)(((size_t)addr) - ((size_t)bag));
4185f80ce2aSJacob 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);
41902c9f0b5SLisandro Dalcin   item->next         = NULL;
4205c6c1daeSBarry Smith   item->msize        = 1;
4215c6c1daeSBarry Smith   *(PetscReal *)addr = mdefault;
4229566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
4233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4245c6c1daeSBarry Smith }
4255c6c1daeSBarry Smith 
4265c6c1daeSBarry Smith /*@C
427811af0c4SBarry Smith   PetscBagRegisterScalar - add a `PetscScalar` value to a `PetscBag`
4285c6c1daeSBarry Smith 
429c3339decSBarry Smith   Logically Collective
4305c6c1daeSBarry Smith 
431d8d19677SJose E. Roman   Input Parameters:
4325c6c1daeSBarry Smith + bag      - the bag of values
43309cbc92aSBarry Smith . addr     - location of `PetscScalar` in struct, for example `&params->c`
4345c6c1daeSBarry Smith . mdefault - the initial value
4355c6c1daeSBarry Smith . name     - name of the variable
4365c6c1daeSBarry Smith - help     - longer string with more information about the value
4375c6c1daeSBarry Smith 
4385c6c1daeSBarry Smith   Level: beginner
4395c6c1daeSBarry Smith 
440db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
44142747ad1SJacob Faibussowitsch           `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagSetFromOptions()`,
44242747ad1SJacob Faibussowitsch           `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
4435c6c1daeSBarry Smith @*/
444d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterScalar(PetscBag bag, void *addr, PetscScalar mdefault, const char *name, const char *help)
445d71ae5a4SJacob Faibussowitsch {
4465c6c1daeSBarry Smith   PetscBagItem item;
4475c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
4485c6c1daeSBarry Smith   PetscBool    printhelp;
4495c6c1daeSBarry Smith 
4505c6c1daeSBarry Smith   PetscFunctionBegin;
4514f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
4524f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
4534f572ea9SToby Isaac   PetscAssertPointer(name, 4);
4544f572ea9SToby Isaac   PetscAssertPointer(help, 5);
4555c6c1daeSBarry Smith   nname[0] = '-';
4565c6c1daeSBarry Smith   nname[1] = 0;
4579566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
4589566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
45948a46eb9SPierre 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));
4609566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetScalar(NULL, bag->bagprefix, nname, &mdefault, NULL));
4615c6c1daeSBarry Smith 
4629566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
4635c6c1daeSBarry Smith   item->dtype  = PETSC_SCALAR;
4646497c311SBarry Smith   item->offset = (PetscInt)(((size_t)addr) - ((size_t)bag));
4655f80ce2aSJacob 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);
46602c9f0b5SLisandro Dalcin   item->next           = NULL;
4675c6c1daeSBarry Smith   item->msize          = 1;
4685c6c1daeSBarry Smith   *(PetscScalar *)addr = mdefault;
4699566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
4703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4715c6c1daeSBarry Smith }
4725c6c1daeSBarry Smith 
4735c6c1daeSBarry Smith /*@C
474811af0c4SBarry Smith   PetscBagRegisterBool - add a `PetscBool` to a `PetscBag`
4755c6c1daeSBarry Smith 
476c3339decSBarry Smith   Logically Collective
4775c6c1daeSBarry Smith 
478d8d19677SJose E. Roman   Input Parameters:
4795c6c1daeSBarry Smith + bag      - the bag of values
48009cbc92aSBarry Smith . addr     - location of `PetscBool` in struct, for example `&params->b`
481811af0c4SBarry Smith . mdefault - the initial value, either `PETSC_FALSE` or `PETSC_TRUE`
4825c6c1daeSBarry Smith . name     - name of the variable
4835c6c1daeSBarry Smith - help     - longer string with more information about the value
4845c6c1daeSBarry Smith 
4855c6c1daeSBarry Smith   Level: beginner
4865c6c1daeSBarry Smith 
487db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
48842747ad1SJacob Faibussowitsch           `PetscBagRegisterInt()`, `PetscBagRegisterScalar()`
489db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
4905c6c1daeSBarry Smith @*/
491d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterBool(PetscBag bag, void *addr, PetscBool mdefault, const char *name, const char *help)
492d71ae5a4SJacob Faibussowitsch {
4935c6c1daeSBarry Smith   PetscBagItem item;
4945c6c1daeSBarry Smith   char         nname[PETSC_BAG_NAME_LENGTH + 1];
4955c6c1daeSBarry Smith   PetscBool    printhelp;
4965c6c1daeSBarry Smith 
4975c6c1daeSBarry Smith   PetscFunctionBegin;
4984f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
4994f572ea9SToby Isaac   PetscAssertPointer(addr, 2);
5004f572ea9SToby Isaac   PetscAssertPointer(name, 4);
5014f572ea9SToby Isaac   PetscAssertPointer(help, 5);
5025c6c1daeSBarry 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 */
5035f80ce2aSJacob 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);
5045c6c1daeSBarry Smith   nname[0] = '-';
5055c6c1daeSBarry Smith   nname[1] = 0;
5069566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH));
5079566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasHelp(NULL, &printhelp));
50848a46eb9SPierre Jolivet   if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "  -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, PetscBools[mdefault], help));
5099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, bag->bagprefix, nname, &mdefault, NULL));
5105c6c1daeSBarry Smith 
5119566063dSJacob Faibussowitsch   PetscCall(PetscNew(&item));
5125c6c1daeSBarry Smith   item->dtype  = PETSC_BOOL;
5136497c311SBarry Smith   item->offset = (PetscInt)(((size_t)addr) - ((size_t)bag));
5145f80ce2aSJacob 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);
51502c9f0b5SLisandro Dalcin   item->next         = NULL;
5165c6c1daeSBarry Smith   item->msize        = 1;
5175c6c1daeSBarry Smith   *(PetscBool *)addr = mdefault;
5189566063dSJacob Faibussowitsch   PetscCall(PetscBagRegister_Private(bag, item, name, help));
5193ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5205c6c1daeSBarry Smith }
5215c6c1daeSBarry Smith 
5220764c050SBarry Smith /*@
523811af0c4SBarry Smith   PetscBagDestroy - Destroys a `PetscBag`
5245c6c1daeSBarry Smith 
525c3339decSBarry Smith   Collective
5265c6c1daeSBarry Smith 
5275c6c1daeSBarry Smith   Input Parameter:
5285c6c1daeSBarry Smith . bag - the bag of values
5295c6c1daeSBarry Smith 
5305c6c1daeSBarry Smith   Level: beginner
5315c6c1daeSBarry Smith 
532db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
533db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
534db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
5355c6c1daeSBarry Smith @*/
536d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagDestroy(PetscBag *bag)
537d71ae5a4SJacob Faibussowitsch {
5385f80ce2aSJacob Faibussowitsch   PetscBagItem nitem;
5395c6c1daeSBarry Smith 
5405c6c1daeSBarry Smith   PetscFunctionBegin;
5413ba16761SJacob Faibussowitsch   if (!*bag) PetscFunctionReturn(PETSC_SUCCESS);
5424f572ea9SToby Isaac   PetscAssertPointer(*bag, 1);
5435f80ce2aSJacob Faibussowitsch   nitem = (*bag)->bagitems;
5445c6c1daeSBarry Smith   while (nitem) {
5455f80ce2aSJacob Faibussowitsch     PetscBagItem item = nitem->next;
5465f80ce2aSJacob Faibussowitsch 
5479566063dSJacob Faibussowitsch     if (nitem->list) PetscCall(PetscStrArrayDestroy(&nitem->list));
5489566063dSJacob Faibussowitsch     PetscCall(PetscFree(nitem));
5495c6c1daeSBarry Smith     nitem = item;
5505c6c1daeSBarry Smith   }
5519566063dSJacob Faibussowitsch   if ((*bag)->bagprefix) PetscCall(PetscFree((*bag)->bagprefix));
5529566063dSJacob Faibussowitsch   PetscCall(PetscFree(*bag));
5533ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5545c6c1daeSBarry Smith }
5555c6c1daeSBarry Smith 
5565c6c1daeSBarry Smith /*@
557811af0c4SBarry Smith   PetscBagSetFromOptions - Allows setting entries to a `PetscBag` using the options database
5585c6c1daeSBarry Smith 
559c3339decSBarry Smith   Collective
5605c6c1daeSBarry Smith 
5615c6c1daeSBarry Smith   Input Parameter:
5625c6c1daeSBarry Smith . bag - the bag of values
5635c6c1daeSBarry Smith 
5645c6c1daeSBarry Smith   Level: beginner
5655c6c1daeSBarry Smith 
566811af0c4SBarry Smith   Note:
567811af0c4SBarry Smith   The options database keys for the entries are of the form `-[bagprefix]_name value`
568811af0c4SBarry Smith 
569db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()`
570db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
57142747ad1SJacob Faibussowitsch           `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagRegisterEnum()`
5725c6c1daeSBarry Smith @*/
573d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagSetFromOptions(PetscBag bag)
574d71ae5a4SJacob Faibussowitsch {
5755c6c1daeSBarry Smith   PetscBagItem nitem = bag->bagitems;
5765c6c1daeSBarry Smith   char         name[PETSC_BAG_NAME_LENGTH + 1], helpname[PETSC_BAG_NAME_LENGTH + PETSC_BAG_HELP_LENGTH + 3];
5775c6c1daeSBarry Smith   PetscInt     n;
5785c6c1daeSBarry Smith 
5795c6c1daeSBarry Smith   PetscFunctionBegin;
5804f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
5819566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(helpname, bag->bagname, sizeof(helpname)));
5829566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(helpname, " ", sizeof(helpname)));
5839566063dSJacob Faibussowitsch   PetscCall(PetscStrlcat(helpname, bag->baghelp, sizeof(helpname)));
584d0609cedSBarry Smith   PetscOptionsBegin(bag->bagcomm, bag->bagprefix, helpname, NULL);
5855c6c1daeSBarry Smith   while (nitem) {
5865c6c1daeSBarry Smith     name[0] = '-';
5875c6c1daeSBarry Smith     name[1] = 0;
5889566063dSJacob Faibussowitsch     PetscCall(PetscStrlcat(name, nitem->name, sizeof(name)));
5895c6c1daeSBarry Smith     if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */
590*835f2295SStefano Zampini       char *value = ((char *)bag) + nitem->offset;
5919566063dSJacob Faibussowitsch       PetscCall(PetscOptionsString(name, nitem->help, "", value, value, nitem->msize, NULL));
5925c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_REAL) {
5935c6c1daeSBarry Smith       PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset);
5945c6c1daeSBarry Smith       if (nitem->msize == 1) {
5959566063dSJacob Faibussowitsch         PetscCall(PetscOptionsReal(name, nitem->help, "", *value, value, NULL));
5965c6c1daeSBarry Smith       } else {
5975c6c1daeSBarry Smith         n = nitem->msize;
5989566063dSJacob Faibussowitsch         PetscCall(PetscOptionsRealArray(name, nitem->help, "", value, &n, NULL));
5995c6c1daeSBarry Smith       }
6005c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_SCALAR) {
6015c6c1daeSBarry Smith       PetscScalar *value = (PetscScalar *)(((char *)bag) + nitem->offset);
6029566063dSJacob Faibussowitsch       PetscCall(PetscOptionsScalar(name, nitem->help, "", *value, value, NULL));
6035c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_INT) {
6045c6c1daeSBarry Smith       PetscInt *value = (PetscInt *)(((char *)bag) + nitem->offset);
6055c6c1daeSBarry Smith       if (nitem->msize == 1) {
6069566063dSJacob Faibussowitsch         PetscCall(PetscOptionsInt(name, nitem->help, "", *value, value, NULL));
6075c6c1daeSBarry Smith       } else {
6085c6c1daeSBarry Smith         n = nitem->msize;
6099566063dSJacob Faibussowitsch         PetscCall(PetscOptionsIntArray(name, nitem->help, "", value, &n, NULL));
6105c6c1daeSBarry Smith       }
6115c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_ENUM) {
6125c6c1daeSBarry Smith       PetscEnum *value = (PetscEnum *)(((char *)bag) + nitem->offset);
6135c6c1daeSBarry Smith       PetscInt   i     = 0;
614fbccb6d4SPierre Jolivet       while (nitem->list[i++]);
6159566063dSJacob Faibussowitsch       PetscCall(PetscOptionsEnum(name, nitem->help, nitem->list[i - 3], (const char *const *)nitem->list, *value, value, NULL));
6165c6c1daeSBarry Smith     } else if (nitem->dtype == PETSC_BOOL) {
6175c6c1daeSBarry Smith       PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset);
618dd66f111SBlaise Bourdin       if (nitem->msize == 1) {
6199566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBool(name, nitem->help, "", *value, value, NULL));
620dd66f111SBlaise Bourdin       } else {
621dd66f111SBlaise Bourdin         n = nitem->msize;
6229566063dSJacob Faibussowitsch         PetscCall(PetscOptionsBoolArray(name, nitem->help, "", value, &n, NULL));
623dd66f111SBlaise Bourdin       }
6245c6c1daeSBarry Smith     }
6255c6c1daeSBarry Smith     nitem = nitem->next;
6265c6c1daeSBarry Smith   }
627d0609cedSBarry Smith   PetscOptionsEnd();
6283ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6295c6c1daeSBarry Smith }
6305c6c1daeSBarry Smith 
631ffeef943SBarry Smith /*@
6325c6c1daeSBarry Smith   PetscBagView - Views a bag of values as either ASCII text or a binary file
6335c6c1daeSBarry Smith 
634c3339decSBarry Smith   Collective
6355c6c1daeSBarry Smith 
636d8d19677SJose E. Roman   Input Parameters:
6375c6c1daeSBarry Smith + bag  - the bag of values
638aec76313SJacob Faibussowitsch - view - location to view the values
6395c6c1daeSBarry Smith 
6405c6c1daeSBarry Smith   Level: beginner
6415c6c1daeSBarry Smith 
642811af0c4SBarry Smith   Note:
643811af0c4SBarry Smith   Currently PETSc bags saved in a binary file can only be read back
64409cbc92aSBarry Smith   in on a machine with the same binary format.
6455c6c1daeSBarry Smith 
646db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()`
647db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
648db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`
6495c6c1daeSBarry Smith @*/
650d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagView(PetscBag bag, PetscViewer view)
651d71ae5a4SJacob Faibussowitsch {
6525c6c1daeSBarry Smith   PetscBool    isascii, isbinary;
6535c6c1daeSBarry Smith   PetscBagItem nitem = bag->bagitems;
6545c6c1daeSBarry Smith 
6555c6c1daeSBarry Smith   PetscFunctionBegin;
6564f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
6575f80ce2aSJacob Faibussowitsch   PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 2);
6589566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERASCII, &isascii));
6599566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary));
6605c6c1daeSBarry Smith   if (isascii) {
6613ffde785SBarry Smith     if (bag->bagprefix) {
6629566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object:  %s (%s) %s\n", bag->bagname, bag->bagprefix, bag->baghelp));
6633ffde785SBarry Smith     } else {
6649566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object:  %s %s\n", bag->bagname, bag->baghelp));
6653ffde785SBarry Smith     }
6665c6c1daeSBarry Smith     while (nitem) {
6675c6c1daeSBarry Smith       if (nitem->dtype == PETSC_CHAR) {
668*835f2295SStefano Zampini         char *value             = ((char *)bag) + nitem->offset;
669da81f932SPierre Jolivet         char  tmp               = value[nitem->msize - 1]; /* special handling for fortran chars without null terminator */
6705c6c1daeSBarry Smith         value[nitem->msize - 1] = 0;
6719566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %s; %s\n", nitem->name, value, nitem->help));
6725c6c1daeSBarry Smith         value[nitem->msize - 1] = tmp;
6735c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_REAL) {
6745c6c1daeSBarry Smith         PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset);
6755c6c1daeSBarry Smith         PetscInt   i;
6769566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
67748a46eb9SPierre Jolivet         for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%g ", (double)value[i]));
6789566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
6795c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_SCALAR) {
6805c6c1daeSBarry Smith         PetscScalar value = *(PetscScalar *)(((char *)bag) + nitem->offset);
6815c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
6828627564fSBarry Smith         if ((double)PetscImaginaryPart(value)) {
6839566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g + %gi; %s\n", nitem->name, (double)PetscRealPart(value), (double)PetscImaginaryPart(value), nitem->help));
6848627564fSBarry Smith         } else {
6859566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g; %s\n", nitem->name, (double)PetscRealPart(value), nitem->help));
6868627564fSBarry Smith         }
6875c6c1daeSBarry Smith #else
6889566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %g; %s\n", nitem->name, (double)value, nitem->help));
6895c6c1daeSBarry Smith #endif
6905c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_INT) {
6915c6c1daeSBarry Smith         PetscInt i, *value = (PetscInt *)(((char *)bag) + nitem->offset);
6929566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
69348a46eb9SPierre Jolivet         for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%" PetscInt_FMT " ", value[i]));
6949566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
6955c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_BOOL) {
696dd66f111SBlaise Bourdin         PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset);
697dd66f111SBlaise Bourdin         PetscInt   i;
6985c6c1daeSBarry Smith         /* some Fortran compilers use -1 as boolean */
6999566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = ", nitem->name));
700dd66f111SBlaise Bourdin         for (i = 0; i < nitem->msize; i++) {
701dd66f111SBlaise Bourdin           if (((int)value[i]) == -1) value[i] = PETSC_TRUE;
7025c6c1daeSBarry 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 */
703f4f49eeaSPierre 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]);
7049566063dSJacob Faibussowitsch           PetscCall(PetscViewerASCIIPrintf(view, " %s", PetscBools[value[i]]));
705dd66f111SBlaise Bourdin         }
7069566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
7075c6c1daeSBarry Smith       } else if (nitem->dtype == PETSC_ENUM) {
7085c6c1daeSBarry Smith         PetscEnum value = *(PetscEnum *)(((char *)bag) + nitem->offset);
7095c6c1daeSBarry Smith         PetscInt  i     = 0;
710fbccb6d4SPierre Jolivet         while (nitem->list[i++]);
7119566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(view, "  %s = %s; (%s) %s\n", nitem->name, nitem->list[value], nitem->list[i - 3], nitem->help));
7125c6c1daeSBarry Smith       }
7135c6c1daeSBarry Smith       nitem = nitem->next;
7145c6c1daeSBarry Smith     }
7155c6c1daeSBarry Smith   } else if (isbinary) {
7165c6c1daeSBarry Smith     PetscInt          classid           = PETSC_BAG_FILE_CLASSID, dtype;
7175c6c1daeSBarry Smith     PetscInt          deprecatedbagsize = 0;
718a261c58fSBarry Smith     PetscViewerFormat format;
7199566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &classid, 1, PETSC_INT));
7209566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &deprecatedbagsize, 1, PETSC_INT));
7219566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, &bag->count, 1, PETSC_INT));
7229566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, bag->bagname, PETSC_BAG_NAME_LENGTH, PETSC_CHAR));
7239566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, PETSC_CHAR));
7245c6c1daeSBarry Smith     while (nitem) {
7259566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &nitem->offset, 1, PETSC_INT));
7265c6c1daeSBarry Smith       dtype = (PetscInt)nitem->dtype;
7279566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &dtype, 1, PETSC_INT));
7289566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, nitem->name, PETSC_BAG_NAME_LENGTH, PETSC_CHAR));
7299566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, nitem->help, PETSC_BAG_HELP_LENGTH, PETSC_CHAR));
7309566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(view, &nitem->msize, 1, PETSC_INT));
7315c6c1daeSBarry Smith       /* some Fortran compilers use -1 as boolean */
732f4f49eeaSPierre Jolivet       if (dtype == PETSC_BOOL && (*(int *)(((char *)bag) + nitem->offset) == -1)) *(int *)(((char *)bag) + nitem->offset) = PETSC_TRUE;
7335c6c1daeSBarry Smith 
73457508eceSPierre Jolivet       PetscCall(PetscViewerBinaryWrite(view, (char *)bag + nitem->offset, nitem->msize, nitem->dtype));
73548a46eb9SPierre Jolivet       if (dtype == PETSC_ENUM) PetscCall(PetscViewerBinaryWriteStringArray(view, (const char *const *)nitem->list));
7365c6c1daeSBarry Smith       nitem = nitem->next;
7375c6c1daeSBarry Smith     }
7389566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(view, &format));
739a261c58fSBarry Smith     if (format == PETSC_VIEWER_BINARY_MATLAB) {
740a261c58fSBarry Smith       MPI_Comm comm;
741a261c58fSBarry Smith       FILE    *info;
7429566063dSJacob Faibussowitsch       PetscCall(PetscObjectGetComm((PetscObject)view, &comm));
7439566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryGetInfoPointer(view, &info));
7449566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#--- begin code written by PetscViewerBinary for MATLAB format ---#\n"));
7459566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#$$ Set.%s = PetscBinaryRead(fd);\n", bag->bagname));
7469566063dSJacob Faibussowitsch       PetscCall(PetscFPrintf(comm, info, "#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n"));
747a261c58fSBarry Smith     }
748a261c58fSBarry Smith   }
7493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7505c6c1daeSBarry Smith }
7515c6c1daeSBarry Smith 
752ffeef943SBarry Smith /*@
75309cbc92aSBarry Smith   PetscBagViewFromOptions - Processes command line options to determine if/how a `PetscBag` is to be viewed.
754173f9484SMatthew G. Knepley 
755c3339decSBarry Smith   Collective
756173f9484SMatthew G. Knepley 
757173f9484SMatthew G. Knepley   Input Parameters:
758aec76313SJacob Faibussowitsch + bag        - the object
75909cbc92aSBarry Smith . bobj       - optional other object that provides prefix (if `NULL` then the prefix in obj is used)
760173f9484SMatthew G. Knepley - optionname - option to activate viewing
761478db826SMatthew G. Knepley 
762173f9484SMatthew G. Knepley   Level: intermediate
763478db826SMatthew G. Knepley 
764db781477SPatrick Sanan .seealso: `PetscBagCreate()`, `PetscBag`, `PetscViewer`
765173f9484SMatthew G. Knepley @*/
766d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[])
767d71ae5a4SJacob Faibussowitsch {
768173f9484SMatthew G. Knepley   static PetscBool  incall = PETSC_FALSE;
769173f9484SMatthew G. Knepley   PetscViewer       viewer;
770173f9484SMatthew G. Knepley   PetscViewerFormat format;
771173f9484SMatthew G. Knepley   const char       *prefix, *bprefix = NULL;
772173f9484SMatthew G. Knepley   PetscBool         flg;
773173f9484SMatthew G. Knepley 
774173f9484SMatthew G. Knepley   PetscFunctionBegin;
7753ba16761SJacob Faibussowitsch   if (incall) PetscFunctionReturn(PETSC_SUCCESS);
776173f9484SMatthew G. Knepley   incall = PETSC_TRUE;
7774f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
7789566063dSJacob Faibussowitsch   if (bobj) PetscCall(PetscObjectGetOptionsPrefix(bobj, &bprefix));
779173f9484SMatthew G. Knepley   prefix = bobj ? bprefix : bag->bagprefix;
780648c30bcSBarry Smith   PetscCall(PetscOptionsCreateViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg));
781173f9484SMatthew G. Knepley   if (flg) {
7829566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, format));
7839566063dSJacob Faibussowitsch     PetscCall(PetscBagView(bag, viewer));
7849566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(viewer));
7859566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
786648c30bcSBarry Smith     PetscCall(PetscViewerDestroy(&viewer));
787173f9484SMatthew G. Knepley   }
788173f9484SMatthew G. Knepley   incall = PETSC_FALSE;
7893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
790173f9484SMatthew G. Knepley }
791173f9484SMatthew G. Knepley 
792ffeef943SBarry Smith /*@
7935c6c1daeSBarry Smith   PetscBagLoad - Loads a bag of values from a binary file
7945c6c1daeSBarry Smith 
795c3339decSBarry Smith   Collective
7965c6c1daeSBarry Smith 
797d8d19677SJose E. Roman   Input Parameters:
798aec76313SJacob Faibussowitsch + view - file to load values from
7995c6c1daeSBarry Smith - bag  - the bag of values
8005c6c1daeSBarry Smith 
8015c6c1daeSBarry Smith   Level: beginner
8025c6c1daeSBarry Smith 
80309cbc92aSBarry Smith   Note:
80409cbc92aSBarry Smith   You must have created and registered all the fields in the bag before loading into it. This only loads values.
80509cbc92aSBarry Smith 
806db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagView()`, `PetscBagGetData()`
807db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
808db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
8095c6c1daeSBarry Smith @*/
810d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagLoad(PetscViewer view, PetscBag bag)
811d71ae5a4SJacob Faibussowitsch {
8125c6c1daeSBarry Smith   PetscBool    isbinary;
8135f80ce2aSJacob Faibussowitsch   PetscInt     classid, bagcount, dtype, msize, offset, deprecatedbagsize;
8145c6c1daeSBarry Smith   char         name[PETSC_BAG_NAME_LENGTH], help[PETSC_BAG_HELP_LENGTH], **list;
8155c6c1daeSBarry Smith   PetscBagItem nitem;
8165c6c1daeSBarry Smith   MPI_Comm     comm;
8175c6c1daeSBarry Smith   PetscMPIInt  flag;
8185c6c1daeSBarry Smith 
8195c6c1daeSBarry Smith   PetscFunctionBegin;
8205f80ce2aSJacob Faibussowitsch   PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 1);
8214f572ea9SToby Isaac   PetscAssertPointer(bag, 2);
8229566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)view, &comm));
8239566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_compare(comm, bag->bagcomm, &flag));
8245f80ce2aSJacob Faibussowitsch   PetscCheck(flag == MPI_CONGRUENT || flag == MPI_IDENT, PETSC_COMM_SELF, PETSC_ERR_ARG_NOTSAMECOMM, "Different communicators in the viewer and bag");
8259566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary));
8265f80ce2aSJacob Faibussowitsch   PetscCheck(isbinary, PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for this viewer type");
8275c6c1daeSBarry Smith 
8289566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &classid, 1, NULL, PETSC_INT));
8295f80ce2aSJacob Faibussowitsch   PetscCheck(classid == PETSC_BAG_FILE_CLASSID, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Not PetscBag next in binary file");
8309566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &deprecatedbagsize, 1, NULL, PETSC_INT));
8319566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, &bagcount, 1, NULL, PETSC_INT));
832*835f2295SStefano Zampini   PetscCheck(bagcount == bag->count, comm, PETSC_ERR_ARG_INCOMP, "Bag in file has different number of entries %" PetscInt_FMT " then passed in bag %" PetscInt_FMT, bagcount, bag->count);
8339566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, bag->bagname, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR));
8349566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryRead(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR));
8355c6c1daeSBarry Smith 
8365c6c1daeSBarry Smith   nitem = bag->bagitems;
8375f80ce2aSJacob Faibussowitsch   for (PetscInt i = 0; i < bagcount; i++) {
8389566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &offset, 1, NULL, PETSC_INT));
8395c6c1daeSBarry Smith     /* ignore the offset in the file */
8409566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &dtype, 1, NULL, PETSC_INT));
8419566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, name, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR));
8429566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, help, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR));
8439566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryRead(view, &msize, 1, NULL, PETSC_INT));
8445c6c1daeSBarry Smith 
8455c6c1daeSBarry Smith     if (dtype == (PetscInt)PETSC_CHAR) {
8469566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_CHAR));
8475c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_REAL) {
8489566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_REAL));
8495c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_SCALAR) {
8509566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_SCALAR));
8515c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_INT) {
8529566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_INT));
8535c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_BOOL) {
8549566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_BOOL));
8555c6c1daeSBarry Smith     } else if (dtype == (PetscInt)PETSC_ENUM) {
8569566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_ENUM));
8579566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryReadStringArray(view, &list));
8585c6c1daeSBarry Smith       /* don't need to save list because it is already registered in the bag */
8599566063dSJacob Faibussowitsch       PetscCall(PetscFree(list));
8605c6c1daeSBarry Smith     }
8615c6c1daeSBarry Smith     nitem = nitem->next;
8625c6c1daeSBarry Smith   }
8633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8645c6c1daeSBarry Smith }
8655c6c1daeSBarry Smith 
866e8976759SBarry Smith /*@C
86709cbc92aSBarry 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,
86809cbc92aSBarry Smith   can have values set from the options database
8695c6c1daeSBarry Smith 
870d083f849SBarry Smith   Collective
8715c6c1daeSBarry Smith 
8725c6c1daeSBarry Smith   Input Parameters:
8735c6c1daeSBarry Smith + comm    - communicator to share bag
874811af0c4SBarry Smith - bagsize - size of the C structure holding the values, for example sizeof(mystruct)
8755c6c1daeSBarry Smith 
8765c6c1daeSBarry Smith   Output Parameter:
8775c6c1daeSBarry Smith . bag - the bag of values
8785c6c1daeSBarry Smith 
879aec76313SJacob Faibussowitsch   Level: intermediate
88009cbc92aSBarry Smith 
8815c6c1daeSBarry Smith   Notes:
882811af0c4SBarry Smith   After creating the bag, for each entry in the C struct call the appropriate `PetscBagRegisterInt()` etc to define the C structs layout
883811af0c4SBarry Smith 
884377f809aSBarry Smith   The size of the struct must be small enough to fit in a `PetscInt`; by default
885811af0c4SBarry Smith   `PetscInt` is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length.
886377f809aSBarry Smith   The warning about casting to a shorter length can be ignored below unless your struct is too large
8875c6c1daeSBarry Smith 
888db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
889db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
89042747ad1SJacob Faibussowitsch           `PetscBagSetFromOptions()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
8915c6c1daeSBarry Smith @*/
892d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag)
893d71ae5a4SJacob Faibussowitsch {
8945f80ce2aSJacob Faibussowitsch   const size_t totalsize = bagsize + sizeof(struct _n_PetscBag) + sizeof(PetscScalar);
8955c6c1daeSBarry Smith 
8965c6c1daeSBarry Smith   PetscFunctionBegin;
8974f572ea9SToby Isaac   PetscAssertPointer(bag, 3);
898377f809aSBarry Smith 
8999566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Creating Bag with total size %d\n", (int)totalsize));
9009566063dSJacob Faibussowitsch   PetscCall(PetscCalloc(totalsize, bag));
9016497c311SBarry Smith   PetscCall(PetscIntCast(totalsize, &(*bag)->bagsize));
9025c6c1daeSBarry Smith   (*bag)->bagcomm        = comm;
9030298fd71SBarry Smith   (*bag)->bagprefix      = NULL;
9045c6c1daeSBarry Smith   (*bag)->structlocation = (void *)(((char *)(*bag)) + sizeof(PetscScalar) * (sizeof(struct _n_PetscBag) / sizeof(PetscScalar)) + sizeof(PetscScalar));
9053ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9065c6c1daeSBarry Smith }
9075c6c1daeSBarry Smith 
908cc4c1da9SBarry Smith /*@
9095c6c1daeSBarry Smith   PetscBagSetName - Sets the name of a bag of values
9105c6c1daeSBarry Smith 
9115c6c1daeSBarry Smith   Not Collective
9125c6c1daeSBarry Smith 
913aec76313SJacob Faibussowitsch   Level: intermediate
9145c6c1daeSBarry Smith 
9155c6c1daeSBarry Smith   Input Parameters:
9165c6c1daeSBarry Smith + bag  - the bag of values
9175c6c1daeSBarry Smith . name - the name assigned to the bag
9185c6c1daeSBarry Smith - help - help message for bag
9195c6c1daeSBarry Smith 
920db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
921db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
922db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9235c6c1daeSBarry Smith @*/
924d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help)
925d71ae5a4SJacob Faibussowitsch {
9265c6c1daeSBarry Smith   PetscFunctionBegin;
9274f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
9284f572ea9SToby Isaac   PetscAssertPointer(name, 2);
9294f572ea9SToby Isaac   PetscAssertPointer(help, 3);
9309566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(bag->bagname, name, PETSC_BAG_NAME_LENGTH - 1));
9319566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(bag->baghelp, help, PETSC_BAG_HELP_LENGTH - 1));
9323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9335c6c1daeSBarry Smith }
9345c6c1daeSBarry Smith 
9355c6c1daeSBarry Smith /*@C
9365c6c1daeSBarry Smith   PetscBagGetName - Gets the name of a bag of values
9375c6c1daeSBarry Smith 
9385c6c1daeSBarry Smith   Not Collective
9395c6c1daeSBarry Smith 
940aec76313SJacob Faibussowitsch   Level: intermediate
9415c6c1daeSBarry Smith 
9425c6c1daeSBarry Smith   Input Parameter:
9435c6c1daeSBarry Smith . bag - the bag of values
9445c6c1daeSBarry Smith 
9455c6c1daeSBarry Smith   Output Parameter:
9465c6c1daeSBarry Smith . name - the name assigned to the bag
9475c6c1daeSBarry Smith 
948db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
949db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
950db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9515c6c1daeSBarry Smith @*/
952cc4c1da9SBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, const char **name)
953d71ae5a4SJacob Faibussowitsch {
9545c6c1daeSBarry Smith   PetscFunctionBegin;
9554f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
9564f572ea9SToby Isaac   PetscAssertPointer(name, 2);
9575c6c1daeSBarry Smith   *name = bag->bagname;
9583ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9595c6c1daeSBarry Smith }
9605c6c1daeSBarry Smith 
9615c6c1daeSBarry Smith /*@C
9625c6c1daeSBarry Smith   PetscBagGetData - Gives back the user - access to memory that
963811af0c4SBarry Smith   can be used for storing user-data-structure
9645c6c1daeSBarry Smith 
9655c6c1daeSBarry Smith   Not Collective
9665c6c1daeSBarry Smith 
9675c6c1daeSBarry Smith   Input Parameter:
9685c6c1daeSBarry Smith . bag - the bag of values
9695c6c1daeSBarry Smith 
9705c6c1daeSBarry Smith   Output Parameter:
97109cbc92aSBarry 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
97209cbc92aSBarry Smith     defining the bag
97309cbc92aSBarry Smith 
974aec76313SJacob Faibussowitsch   Level: intermediate
9755c6c1daeSBarry Smith 
976db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`
977db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
978db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9795c6c1daeSBarry Smith @*/
980d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagGetData(PetscBag bag, void **data)
981d71ae5a4SJacob Faibussowitsch {
9825c6c1daeSBarry Smith   PetscFunctionBegin;
9834f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
9844f572ea9SToby Isaac   PetscAssertPointer(data, 2);
9855c6c1daeSBarry Smith   *data = bag->structlocation;
9863ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9875c6c1daeSBarry Smith }
9885c6c1daeSBarry Smith 
989cc4c1da9SBarry Smith /*@
9905c6c1daeSBarry Smith   PetscBagSetOptionsPrefix - Sets the prefix used for searching for all
991811af0c4SBarry Smith   `PetscBag` items in the options database.
9925c6c1daeSBarry Smith 
99309cbc92aSBarry Smith   Logically Collective
9945c6c1daeSBarry Smith 
995aec76313SJacob Faibussowitsch   Level: intermediate
9965c6c1daeSBarry Smith 
9975c6c1daeSBarry Smith   Input Parameters:
9985c6c1daeSBarry Smith + bag - the bag of values
999aec76313SJacob Faibussowitsch - pre - the prefix to prepend all Bag item names with.
10005c6c1daeSBarry Smith 
100109cbc92aSBarry Smith   Note:
100209cbc92aSBarry Smith   Must be called prior to registering any of the bag items.
10035c6c1daeSBarry Smith 
1004db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
1005db781477SPatrick Sanan           `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
10065c6c1daeSBarry Smith @*/
1007d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[])
1008d71ae5a4SJacob Faibussowitsch {
10095c6c1daeSBarry Smith   PetscFunctionBegin;
10104f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
10115f80ce2aSJacob Faibussowitsch   if (pre) {
10124f572ea9SToby Isaac     PetscAssertPointer(pre, 2);
10135f80ce2aSJacob Faibussowitsch     PetscCheck(pre[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Options prefix should not begin with a hyphen");
10149566063dSJacob Faibussowitsch     PetscCall(PetscFree(bag->bagprefix));
1015f4f49eeaSPierre Jolivet     PetscCall(PetscStrallocpy(pre, &bag->bagprefix));
10169566063dSJacob Faibussowitsch   } else PetscCall(PetscFree(bag->bagprefix));
10173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10185c6c1daeSBarry Smith }
1019ffb7e86cSMatthew G. Knepley 
1020ffb7e86cSMatthew G. Knepley /*@C
1021ffb7e86cSMatthew G. Knepley   PetscBagGetNames - Get the names of all entries in the bag
1022ffb7e86cSMatthew G. Knepley 
102309cbc92aSBarry Smith   Not Collective
1024ffb7e86cSMatthew G. Knepley 
10252fe279fdSBarry Smith   Input Parameter:
10262fe279fdSBarry Smith . bag - the bag of values
1027ffb7e86cSMatthew G. Knepley 
1028ffb7e86cSMatthew G. Knepley   Output Parameter:
1029ffb7e86cSMatthew G. Knepley . names - array of char pointers for names
1030ffb7e86cSMatthew G. Knepley 
1031ffb7e86cSMatthew G. Knepley   Level: intermediate
1032ffb7e86cSMatthew G. Knepley 
1033db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagSetName()`, `PetscBagCreate()`, `PetscBagGetData()`
1034db781477SPatrick Sanan           `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
1035ffb7e86cSMatthew G. Knepley @*/
1036d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[])
1037d71ae5a4SJacob Faibussowitsch {
1038ffb7e86cSMatthew G. Knepley   PetscBagItem nitem = bag->bagitems;
1039ffb7e86cSMatthew G. Knepley 
1040ffb7e86cSMatthew G. Knepley   PetscFunctionBegin;
10414f572ea9SToby Isaac   PetscAssertPointer(bag, 1);
10424f572ea9SToby Isaac   PetscAssertPointer(names, 2);
10435f80ce2aSJacob Faibussowitsch   for (PetscInt n = 0; nitem; ++n, nitem = nitem->next) names[n] = nitem->name;
10443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1045ffb7e86cSMatthew G. Knepley }
1046