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 */
PetscBagRegister_Private(PetscBag bag,PetscBagItem item,const char * name,const char * help)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 `¶ms->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 @*/
PetscBagRegisterEnum(PetscBag bag,void * addr,const char * const * list,PetscEnum mdefault,const char * name,const char * help)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;
73835f2295SStefano 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 `¶ms->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 @*/
PetscBagRegisterIntArray(PetscBag bag,void * addr,PetscInt msize,const char * name,const char * help)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 `¶ms->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 @*/
PetscBagRegisterRealArray(PetscBag bag,void * addr,PetscInt msize,const char * name,const char * help)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 `¶ms->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 @*/
PetscBagRegisterInt(PetscBag bag,void * addr,PetscInt mdefault,const char * name,const char * help)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 `¶ms->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 @*/
PetscBagRegisterInt64(PetscBag bag,void * addr,PetscInt64 mdefault,const char * name,const char * help)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;
251835f2295SStefano Zampini PetscInt odefault;
2520d349d43SBarry Smith PetscBool flg;
2530d349d43SBarry Smith
2540d349d43SBarry Smith PetscFunctionBegin;
2550d349d43SBarry Smith nname[0] = '-';
2560d349d43SBarry Smith nname[1] = 0;
257835f2295SStefano Zampini
258835f2295SStefano 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));
263835f2295SStefano 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 `¶ms->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 @*/
PetscBagRegisterBoolArray(PetscBag bag,void * addr,PetscInt msize,const char * name,const char * help)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 `¶ms->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 @*/
PetscBagRegisterString(PetscBag bag,void * addr,PetscInt msize,const char * mdefault,const char * name,const char * help)349ce78bad3SBarry Smith PetscErrorCode PetscBagRegisterString(PetscBag bag, void *addr, PetscInt msize, const char *mdefault, const char *name, const char *help) PeNS
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 `¶ms->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 @*/
PetscBagRegisterReal(PetscBag bag,void * addr,PetscReal mdefault,const char * name,const char * help)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 `¶ms->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 @*/
PetscBagRegisterScalar(PetscBag bag,void * addr,PetscScalar mdefault,const char * name,const char * help)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 `¶ms->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 @*/
PetscBagRegisterBool(PetscBag bag,void * addr,PetscBool mdefault,const char * name,const char * help)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 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;
5116497c311SBarry Smith item->offset = (PetscInt)(((size_t)addr) - ((size_t)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
5200764c050SBarry Smith /*@
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 @*/
PetscBagDestroy(PetscBag * bag)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 @*/
PetscBagSetFromOptions(PetscBag bag)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] */
588835f2295SStefano Zampini char *value = ((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
629ffeef943SBarry 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 @*/
PetscBagView(PetscBag bag,PetscViewer view)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) {
666835f2295SStefano Zampini char *value = ((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;
6969566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = ", nitem->name));
697dd66f111SBlaise Bourdin for (i = 0; i < nitem->msize; i++) {
698ad49c6e3SMartin Diehl /* stdbool.h defines true=1 and false=0, but non-conformant Fortran compilers define .true.=0xff (-1 if signed, 255 if unsigned).
699ad49c6e3SMartin Diehl with the checks for either PETSC_FALSE or PETSC_TRUE we truly demand that the value be 0 or 1 */
700f4f49eeaSPierre 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]);
7019566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s", PetscBools[value[i]]));
702dd66f111SBlaise Bourdin }
7039566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help));
7045c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) {
7055c6c1daeSBarry Smith PetscEnum value = *(PetscEnum *)(((char *)bag) + nitem->offset);
7065c6c1daeSBarry Smith PetscInt i = 0;
707fbccb6d4SPierre Jolivet while (nitem->list[i++]);
7089566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %s; (%s) %s\n", nitem->name, nitem->list[value], nitem->list[i - 3], nitem->help));
7095c6c1daeSBarry Smith }
7105c6c1daeSBarry Smith nitem = nitem->next;
7115c6c1daeSBarry Smith }
7125c6c1daeSBarry Smith } else if (isbinary) {
7135c6c1daeSBarry Smith PetscInt classid = PETSC_BAG_FILE_CLASSID, dtype;
7145c6c1daeSBarry Smith PetscInt deprecatedbagsize = 0;
715a261c58fSBarry Smith PetscViewerFormat format;
7169566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &classid, 1, PETSC_INT));
7179566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &deprecatedbagsize, 1, PETSC_INT));
7189566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &bag->count, 1, PETSC_INT));
7199566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, bag->bagname, PETSC_BAG_NAME_LENGTH, PETSC_CHAR));
7209566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, PETSC_CHAR));
7215c6c1daeSBarry Smith while (nitem) {
7229566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &nitem->offset, 1, PETSC_INT));
7235c6c1daeSBarry Smith dtype = (PetscInt)nitem->dtype;
7249566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &dtype, 1, PETSC_INT));
7259566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, nitem->name, PETSC_BAG_NAME_LENGTH, PETSC_CHAR));
7269566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, nitem->help, PETSC_BAG_HELP_LENGTH, PETSC_CHAR));
7279566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &nitem->msize, 1, PETSC_INT));
7285c6c1daeSBarry Smith
72957508eceSPierre Jolivet PetscCall(PetscViewerBinaryWrite(view, (char *)bag + nitem->offset, nitem->msize, nitem->dtype));
73048a46eb9SPierre Jolivet if (dtype == PETSC_ENUM) PetscCall(PetscViewerBinaryWriteStringArray(view, (const char *const *)nitem->list));
7315c6c1daeSBarry Smith nitem = nitem->next;
7325c6c1daeSBarry Smith }
7339566063dSJacob Faibussowitsch PetscCall(PetscViewerGetFormat(view, &format));
734a261c58fSBarry Smith if (format == PETSC_VIEWER_BINARY_MATLAB) {
735a261c58fSBarry Smith MPI_Comm comm;
736a261c58fSBarry Smith FILE *info;
7379566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)view, &comm));
7389566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetInfoPointer(view, &info));
7399566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(comm, info, "#--- begin code written by PetscViewerBinary for MATLAB format ---#\n"));
7409566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(comm, info, "#$$ Set.%s = PetscBinaryRead(fd);\n", bag->bagname));
7419566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(comm, info, "#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n"));
742a261c58fSBarry Smith }
743a261c58fSBarry Smith }
7443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
7455c6c1daeSBarry Smith }
7465c6c1daeSBarry Smith
747ffeef943SBarry Smith /*@
74809cbc92aSBarry Smith PetscBagViewFromOptions - Processes command line options to determine if/how a `PetscBag` is to be viewed.
749173f9484SMatthew G. Knepley
750c3339decSBarry Smith Collective
751173f9484SMatthew G. Knepley
752173f9484SMatthew G. Knepley Input Parameters:
753aec76313SJacob Faibussowitsch + bag - the object
75409cbc92aSBarry Smith . bobj - optional other object that provides prefix (if `NULL` then the prefix in obj is used)
755173f9484SMatthew G. Knepley - optionname - option to activate viewing
756478db826SMatthew G. Knepley
757173f9484SMatthew G. Knepley Level: intermediate
758478db826SMatthew G. Knepley
759db781477SPatrick Sanan .seealso: `PetscBagCreate()`, `PetscBag`, `PetscViewer`
760173f9484SMatthew G. Knepley @*/
PetscBagViewFromOptions(PetscBag bag,PetscObject bobj,const char optionname[])761d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[])
762d71ae5a4SJacob Faibussowitsch {
763173f9484SMatthew G. Knepley static PetscBool incall = PETSC_FALSE;
764173f9484SMatthew G. Knepley PetscViewer viewer;
765173f9484SMatthew G. Knepley PetscViewerFormat format;
766173f9484SMatthew G. Knepley const char *prefix, *bprefix = NULL;
767173f9484SMatthew G. Knepley PetscBool flg;
768173f9484SMatthew G. Knepley
769173f9484SMatthew G. Knepley PetscFunctionBegin;
7703ba16761SJacob Faibussowitsch if (incall) PetscFunctionReturn(PETSC_SUCCESS);
771173f9484SMatthew G. Knepley incall = PETSC_TRUE;
7724f572ea9SToby Isaac PetscAssertPointer(bag, 1);
7739566063dSJacob Faibussowitsch if (bobj) PetscCall(PetscObjectGetOptionsPrefix(bobj, &bprefix));
774173f9484SMatthew G. Knepley prefix = bobj ? bprefix : bag->bagprefix;
775648c30bcSBarry Smith PetscCall(PetscOptionsCreateViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg));
776173f9484SMatthew G. Knepley if (flg) {
7779566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, format));
7789566063dSJacob Faibussowitsch PetscCall(PetscBagView(bag, viewer));
7799566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer));
7809566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer));
781648c30bcSBarry Smith PetscCall(PetscViewerDestroy(&viewer));
782173f9484SMatthew G. Knepley }
783173f9484SMatthew G. Knepley incall = PETSC_FALSE;
7843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
785173f9484SMatthew G. Knepley }
786173f9484SMatthew G. Knepley
787ffeef943SBarry Smith /*@
7885c6c1daeSBarry Smith PetscBagLoad - Loads a bag of values from a binary file
7895c6c1daeSBarry Smith
790c3339decSBarry Smith Collective
7915c6c1daeSBarry Smith
792d8d19677SJose E. Roman Input Parameters:
793aec76313SJacob Faibussowitsch + view - file to load values from
7945c6c1daeSBarry Smith - bag - the bag of values
7955c6c1daeSBarry Smith
7965c6c1daeSBarry Smith Level: beginner
7975c6c1daeSBarry Smith
79809cbc92aSBarry Smith Note:
79909cbc92aSBarry Smith You must have created and registered all the fields in the bag before loading into it. This only loads values.
80009cbc92aSBarry Smith
801db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagView()`, `PetscBagGetData()`
802db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
803db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()`
8045c6c1daeSBarry Smith @*/
PetscBagLoad(PetscViewer view,PetscBag bag)805d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagLoad(PetscViewer view, PetscBag bag)
806d71ae5a4SJacob Faibussowitsch {
8075c6c1daeSBarry Smith PetscBool isbinary;
8085f80ce2aSJacob Faibussowitsch PetscInt classid, bagcount, dtype, msize, offset, deprecatedbagsize;
8095c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH], help[PETSC_BAG_HELP_LENGTH], **list;
8105c6c1daeSBarry Smith PetscBagItem nitem;
8115c6c1daeSBarry Smith MPI_Comm comm;
8125c6c1daeSBarry Smith PetscMPIInt flag;
8135c6c1daeSBarry Smith
8145c6c1daeSBarry Smith PetscFunctionBegin;
8155f80ce2aSJacob Faibussowitsch PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 1);
8164f572ea9SToby Isaac PetscAssertPointer(bag, 2);
8179566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)view, &comm));
8189566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_compare(comm, bag->bagcomm, &flag));
8195f80ce2aSJacob Faibussowitsch PetscCheck(flag == MPI_CONGRUENT || flag == MPI_IDENT, PETSC_COMM_SELF, PETSC_ERR_ARG_NOTSAMECOMM, "Different communicators in the viewer and bag");
8209566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary));
8215f80ce2aSJacob Faibussowitsch PetscCheck(isbinary, PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for this viewer type");
8225c6c1daeSBarry Smith
8239566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &classid, 1, NULL, PETSC_INT));
8245f80ce2aSJacob Faibussowitsch PetscCheck(classid == PETSC_BAG_FILE_CLASSID, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Not PetscBag next in binary file");
8259566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &deprecatedbagsize, 1, NULL, PETSC_INT));
8269566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &bagcount, 1, NULL, PETSC_INT));
827835f2295SStefano 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);
8289566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, bag->bagname, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR));
8299566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR));
8305c6c1daeSBarry Smith
8315c6c1daeSBarry Smith nitem = bag->bagitems;
8325f80ce2aSJacob Faibussowitsch for (PetscInt i = 0; i < bagcount; i++) {
8339566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &offset, 1, NULL, PETSC_INT));
8345c6c1daeSBarry Smith /* ignore the offset in the file */
8359566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &dtype, 1, NULL, PETSC_INT));
8369566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, name, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR));
8379566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, help, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR));
8389566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &msize, 1, NULL, PETSC_INT));
8395c6c1daeSBarry Smith
8405c6c1daeSBarry Smith if (dtype == (PetscInt)PETSC_CHAR) {
8419566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_CHAR));
8425c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_REAL) {
8439566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_REAL));
8445c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_SCALAR) {
8459566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_SCALAR));
8465c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_INT) {
8479566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_INT));
8485c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_BOOL) {
8499566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_BOOL));
8505c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_ENUM) {
8519566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_ENUM));
8529566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadStringArray(view, &list));
8535c6c1daeSBarry Smith /* don't need to save list because it is already registered in the bag */
8549566063dSJacob Faibussowitsch PetscCall(PetscFree(list));
8555c6c1daeSBarry Smith }
8565c6c1daeSBarry Smith nitem = nitem->next;
8575c6c1daeSBarry Smith }
8583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
8595c6c1daeSBarry Smith }
8605c6c1daeSBarry Smith
861e8976759SBarry Smith /*@C
86209cbc92aSBarry 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,
86309cbc92aSBarry Smith can have values set from the options database
8645c6c1daeSBarry Smith
865d083f849SBarry Smith Collective
8665c6c1daeSBarry Smith
8675c6c1daeSBarry Smith Input Parameters:
8685c6c1daeSBarry Smith + comm - communicator to share bag
869ce78bad3SBarry Smith - bagsize - size of the C structure holding the values, for example `sizeof(mystruct)`
8705c6c1daeSBarry Smith
8715c6c1daeSBarry Smith Output Parameter:
8725c6c1daeSBarry Smith . bag - the bag of values
8735c6c1daeSBarry Smith
874aec76313SJacob Faibussowitsch Level: intermediate
87509cbc92aSBarry Smith
8765c6c1daeSBarry Smith Notes:
877811af0c4SBarry Smith After creating the bag, for each entry in the C struct call the appropriate `PetscBagRegisterInt()` etc to define the C structs layout
878811af0c4SBarry Smith
879377f809aSBarry Smith The size of the struct must be small enough to fit in a `PetscInt`; by default
880811af0c4SBarry Smith `PetscInt` is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length.
881377f809aSBarry Smith The warning about casting to a shorter length can be ignored below unless your struct is too large
8825c6c1daeSBarry Smith
883db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
884db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
88542747ad1SJacob Faibussowitsch `PetscBagSetFromOptions()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
8865c6c1daeSBarry Smith @*/
PetscBagCreate(MPI_Comm comm,size_t bagsize,PetscBag * bag)887d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag)
888d71ae5a4SJacob Faibussowitsch {
8895f80ce2aSJacob Faibussowitsch const size_t totalsize = bagsize + sizeof(struct _n_PetscBag) + sizeof(PetscScalar);
8905c6c1daeSBarry Smith
8915c6c1daeSBarry Smith PetscFunctionBegin;
8924f572ea9SToby Isaac PetscAssertPointer(bag, 3);
893377f809aSBarry Smith
8949566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Creating Bag with total size %d\n", (int)totalsize));
8959566063dSJacob Faibussowitsch PetscCall(PetscCalloc(totalsize, bag));
8966497c311SBarry Smith PetscCall(PetscIntCast(totalsize, &(*bag)->bagsize));
8975c6c1daeSBarry Smith (*bag)->bagcomm = comm;
8980298fd71SBarry Smith (*bag)->bagprefix = NULL;
8995c6c1daeSBarry Smith (*bag)->structlocation = (void *)(((char *)(*bag)) + sizeof(PetscScalar) * (sizeof(struct _n_PetscBag) / sizeof(PetscScalar)) + sizeof(PetscScalar));
9003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
9015c6c1daeSBarry Smith }
9025c6c1daeSBarry Smith
903cc4c1da9SBarry Smith /*@
9045c6c1daeSBarry Smith PetscBagSetName - Sets the name of a bag of values
9055c6c1daeSBarry Smith
9065c6c1daeSBarry Smith Not Collective
9075c6c1daeSBarry Smith
908aec76313SJacob Faibussowitsch Level: intermediate
9095c6c1daeSBarry Smith
9105c6c1daeSBarry Smith Input Parameters:
9115c6c1daeSBarry Smith + bag - the bag of values
9125c6c1daeSBarry Smith . name - the name assigned to the bag
9135c6c1daeSBarry Smith - help - help message for bag
9145c6c1daeSBarry Smith
915db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
916db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
917db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9185c6c1daeSBarry Smith @*/
PetscBagSetName(PetscBag bag,const char name[],const char help[])919ce78bad3SBarry Smith PetscErrorCode PetscBagSetName(PetscBag bag, const char name[], const char help[])
920d71ae5a4SJacob Faibussowitsch {
9215c6c1daeSBarry Smith PetscFunctionBegin;
9224f572ea9SToby Isaac PetscAssertPointer(bag, 1);
9234f572ea9SToby Isaac PetscAssertPointer(name, 2);
9244f572ea9SToby Isaac PetscAssertPointer(help, 3);
9259566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(bag->bagname, name, PETSC_BAG_NAME_LENGTH - 1));
9269566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(bag->baghelp, help, PETSC_BAG_HELP_LENGTH - 1));
9273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
9285c6c1daeSBarry Smith }
9295c6c1daeSBarry Smith
9305c6c1daeSBarry Smith /*@C
9315c6c1daeSBarry Smith PetscBagGetName - Gets the name of a bag of values
9325c6c1daeSBarry Smith
9335c6c1daeSBarry Smith Not Collective
9345c6c1daeSBarry Smith
935aec76313SJacob Faibussowitsch Level: intermediate
9365c6c1daeSBarry Smith
9375c6c1daeSBarry Smith Input Parameter:
9385c6c1daeSBarry Smith . bag - the bag of values
9395c6c1daeSBarry Smith
9405c6c1daeSBarry Smith Output Parameter:
9415c6c1daeSBarry Smith . name - the name assigned to the bag
9425c6c1daeSBarry Smith
943db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()`
944db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
945db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9465c6c1daeSBarry Smith @*/
PetscBagGetName(PetscBag bag,const char ** name)947cc4c1da9SBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, const char **name)
948d71ae5a4SJacob Faibussowitsch {
9495c6c1daeSBarry Smith PetscFunctionBegin;
9504f572ea9SToby Isaac PetscAssertPointer(bag, 1);
9514f572ea9SToby Isaac PetscAssertPointer(name, 2);
9525c6c1daeSBarry Smith *name = bag->bagname;
9533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
9545c6c1daeSBarry Smith }
9555c6c1daeSBarry Smith
9565c6c1daeSBarry Smith /*@C
9575c6c1daeSBarry Smith PetscBagGetData - Gives back the user - access to memory that
958811af0c4SBarry Smith can be used for storing user-data-structure
9595c6c1daeSBarry Smith
9605c6c1daeSBarry Smith Not Collective
9615c6c1daeSBarry Smith
9625c6c1daeSBarry Smith Input Parameter:
9635c6c1daeSBarry Smith . bag - the bag of values
9645c6c1daeSBarry Smith
9655c6c1daeSBarry Smith Output Parameter:
96609cbc92aSBarry 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
96709cbc92aSBarry Smith defining the bag
96809cbc92aSBarry Smith
969aec76313SJacob Faibussowitsch Level: intermediate
9705c6c1daeSBarry Smith
971db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`
972db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
973db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
9745c6c1daeSBarry Smith @*/
PetscBagGetData(PetscBag bag,PetscCtxRt data)975*2a8381b2SBarry Smith PetscErrorCode PetscBagGetData(PetscBag bag, PetscCtxRt data)
976d71ae5a4SJacob Faibussowitsch {
9775c6c1daeSBarry Smith PetscFunctionBegin;
9784f572ea9SToby Isaac PetscAssertPointer(bag, 1);
9794f572ea9SToby Isaac PetscAssertPointer(data, 2);
980ce78bad3SBarry Smith *(void **)data = bag->structlocation;
9813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
9825c6c1daeSBarry Smith }
9835c6c1daeSBarry Smith
984cc4c1da9SBarry Smith /*@
9855c6c1daeSBarry Smith PetscBagSetOptionsPrefix - Sets the prefix used for searching for all
986811af0c4SBarry Smith `PetscBag` items in the options database.
9875c6c1daeSBarry Smith
98809cbc92aSBarry Smith Logically Collective
9895c6c1daeSBarry Smith
990aec76313SJacob Faibussowitsch Level: intermediate
9915c6c1daeSBarry Smith
9925c6c1daeSBarry Smith Input Parameters:
9935c6c1daeSBarry Smith + bag - the bag of values
994aec76313SJacob Faibussowitsch - pre - the prefix to prepend all Bag item names with.
9955c6c1daeSBarry Smith
99609cbc92aSBarry Smith Note:
99709cbc92aSBarry Smith Must be called prior to registering any of the bag items.
9985c6c1daeSBarry Smith
999db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`
1000db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()`
10015c6c1daeSBarry Smith @*/
PetscBagSetOptionsPrefix(PetscBag bag,const char pre[])1002d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[])
1003d71ae5a4SJacob Faibussowitsch {
10045c6c1daeSBarry Smith PetscFunctionBegin;
10054f572ea9SToby Isaac PetscAssertPointer(bag, 1);
10065f80ce2aSJacob Faibussowitsch if (pre) {
10074f572ea9SToby Isaac PetscAssertPointer(pre, 2);
10085f80ce2aSJacob Faibussowitsch PetscCheck(pre[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Options prefix should not begin with a hyphen");
10099566063dSJacob Faibussowitsch PetscCall(PetscFree(bag->bagprefix));
1010f4f49eeaSPierre Jolivet PetscCall(PetscStrallocpy(pre, &bag->bagprefix));
10119566063dSJacob Faibussowitsch } else PetscCall(PetscFree(bag->bagprefix));
10123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
10135c6c1daeSBarry Smith }
1014ffb7e86cSMatthew G. Knepley
1015ffb7e86cSMatthew G. Knepley /*@C
1016ffb7e86cSMatthew G. Knepley PetscBagGetNames - Get the names of all entries in the bag
1017ffb7e86cSMatthew G. Knepley
101809cbc92aSBarry Smith Not Collective
1019ffb7e86cSMatthew G. Knepley
10202fe279fdSBarry Smith Input Parameter:
10212fe279fdSBarry Smith . bag - the bag of values
1022ffb7e86cSMatthew G. Knepley
1023ffb7e86cSMatthew G. Knepley Output Parameter:
102426a11704SBarry Smith . names - pass in an array of char pointers to hold the names. The array must be as long as the number of items in the bag.
1025ffb7e86cSMatthew G. Knepley
1026ffb7e86cSMatthew G. Knepley Level: intermediate
1027ffb7e86cSMatthew G. Knepley
1028db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagSetName()`, `PetscBagCreate()`, `PetscBagGetData()`
1029db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()`
1030ffb7e86cSMatthew G. Knepley @*/
PetscBagGetNames(PetscBag bag,const char * names[])1031d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[])
1032d71ae5a4SJacob Faibussowitsch {
1033ffb7e86cSMatthew G. Knepley PetscBagItem nitem = bag->bagitems;
1034ffb7e86cSMatthew G. Knepley
1035ffb7e86cSMatthew G. Knepley PetscFunctionBegin;
10364f572ea9SToby Isaac PetscAssertPointer(bag, 1);
10374f572ea9SToby Isaac PetscAssertPointer(names, 2);
10385f80ce2aSJacob Faibussowitsch for (PetscInt n = 0; nitem; ++n, nitem = nitem->next) names[n] = nitem->name;
10393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1040ffb7e86cSMatthew G. Knepley }
1041