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++; 205c6c1daeSBarry Smith PetscFunctionReturn(0); 215c6c1daeSBarry Smith } 225c6c1daeSBarry Smith 235c6c1daeSBarry Smith /*@C 24811af0c4SBarry Smith PetscBagRegisterEnum - add an enum value to a `PetscBag` 255c6c1daeSBarry Smith 26*c3339decSBarry 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`) 335c6c1daeSBarry Smith - help - longer string with more information about the value 345c6c1daeSBarry Smith 355c6c1daeSBarry Smith Level: beginner 365c6c1daeSBarry Smith 37db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 38db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 39db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()` 405c6c1daeSBarry Smith @*/ 41d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterEnum(PetscBag bag, void *addr, const char *const *list, PetscEnum mdefault, const char *name, const char *help) 42d71ae5a4SJacob Faibussowitsch { 435c6c1daeSBarry Smith PetscBagItem item; 445c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 455c6c1daeSBarry Smith PetscBool printhelp; 465c6c1daeSBarry Smith PetscInt i = 0; 475c6c1daeSBarry Smith 485c6c1daeSBarry Smith PetscFunctionBegin; 495f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 505f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 515f80ce2aSJacob Faibussowitsch PetscValidPointer(list, 3); 525f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 5); 535f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 6); 545c6c1daeSBarry Smith nname[0] = '-'; 555c6c1daeSBarry Smith nname[1] = 0; 569566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 579566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 585c6c1daeSBarry Smith if (printhelp) { 599371c9d4SSatish Balay while (list[i++]) 609371c9d4SSatish Balay ; 619566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%s>: (%s) %s (choose one of) ", bag->bagprefix ? bag->bagprefix : "", name, list[mdefault], list[i - 3], help)); 629566063dSJacob Faibussowitsch for (i = 0; list[i + 2]; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " %s", list[i])); 639566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, "\n")); 645c6c1daeSBarry Smith } 659566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetEnum(NULL, bag->bagprefix, nname, list, &mdefault, NULL)); 665c6c1daeSBarry Smith 679566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 685c6c1daeSBarry Smith item->dtype = PETSC_ENUM; 695c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 705f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Registered item %s %s is not in bag memory space", name, help); 7102c9f0b5SLisandro Dalcin item->next = NULL; 725c6c1daeSBarry Smith item->msize = 1; 739566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(list, (char ***)&item->list)); 745c6c1daeSBarry Smith *(PetscEnum *)addr = mdefault; 759566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 765c6c1daeSBarry Smith PetscFunctionReturn(0); 775c6c1daeSBarry Smith } 785c6c1daeSBarry Smith 795c6c1daeSBarry Smith /*@C 80811af0c4SBarry Smith PetscBagRegisterIntArray - add an `PetscInt` array to a `PetscBag` 815c6c1daeSBarry Smith 82*c3339decSBarry 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 @*/ 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; 1055f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 1065f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 1075f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 1085f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 1095c6c1daeSBarry Smith nname[0] = '-'; 1105c6c1daeSBarry Smith nname[1] = 0; 1119566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 1129566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 1135c6c1daeSBarry Smith if (printhelp) { 1149566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <", bag->bagprefix ? bag->bagprefix : "", name)); 11548a46eb9SPierre Jolivet for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i)); 1169566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help)); 1175c6c1daeSBarry Smith } 1189566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetIntArray(NULL, bag->bagprefix, nname, (PetscInt *)addr, &tmp, NULL)); 1195c6c1daeSBarry Smith 1209566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 1215c6c1daeSBarry Smith item->dtype = PETSC_INT; 1225c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 1235f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Registered item %s %s is not in bag memory space", name, help); 12402c9f0b5SLisandro Dalcin item->next = NULL; 1255c6c1daeSBarry Smith item->msize = msize; 1269566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 1275c6c1daeSBarry Smith PetscFunctionReturn(0); 1285c6c1daeSBarry Smith } 1295c6c1daeSBarry Smith 1305c6c1daeSBarry Smith /*@C 131811af0c4SBarry Smith PetscBagRegisterRealArray - add an `PetscReal` array to a `PetscBag` 1325c6c1daeSBarry Smith 133*c3339decSBarry 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 @*/ 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; 1565f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 1575f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 1585f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 1595f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 1605c6c1daeSBarry Smith nname[0] = '-'; 1615c6c1daeSBarry Smith nname[1] = 0; 1629566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 1639566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 1645c6c1daeSBarry Smith if (printhelp) { 1659566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <", bag->bagprefix ? bag->bagprefix : "", name)); 16648a46eb9SPierre Jolivet for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%g ", (double)*((PetscReal *)addr) + i)); 1679566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help)); 1685c6c1daeSBarry Smith } 1699566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetRealArray(NULL, bag->bagprefix, nname, (PetscReal *)addr, &tmp, NULL)); 1705c6c1daeSBarry Smith 1719566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 1725c6c1daeSBarry Smith item->dtype = PETSC_REAL; 1735c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 1745f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Registered item %s %s is not in bag memory space", name, help); 17502c9f0b5SLisandro Dalcin item->next = NULL; 1765c6c1daeSBarry Smith item->msize = msize; 1779566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 1785c6c1daeSBarry Smith PetscFunctionReturn(0); 1795c6c1daeSBarry Smith } 1805c6c1daeSBarry Smith 1815c6c1daeSBarry Smith /*@C 182811af0c4SBarry Smith PetscBagRegisterInt - add an `PetscInt` value to a `PetscBag` 1835c6c1daeSBarry Smith 184*c3339decSBarry 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 @*/ 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; 2065f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 2075f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 2085f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 2095f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 2105c6c1daeSBarry Smith nname[0] = '-'; 2115c6c1daeSBarry Smith nname[1] = 0; 2129566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 2139566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 21448a46eb9SPierre Jolivet if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help)); 2159566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &mdefault, NULL)); 2165c6c1daeSBarry Smith 2179566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 2185c6c1daeSBarry Smith item->dtype = PETSC_INT; 2195c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 2205f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Registered item %s %s is not in bag memory space", name, help); 22102c9f0b5SLisandro Dalcin item->next = NULL; 2225c6c1daeSBarry Smith item->msize = 1; 2235c6c1daeSBarry Smith *(PetscInt *)addr = mdefault; 2249566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 2255c6c1daeSBarry Smith PetscFunctionReturn(0); 2265c6c1daeSBarry Smith } 2275c6c1daeSBarry Smith 2280d349d43SBarry Smith /*@C 229811af0c4SBarry Smith PetscBagRegisterInt64 - add a `PetscInt64` value to a `PetscBag` 2300d349d43SBarry Smith 231*c3339decSBarry 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 @*/ 246d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterInt64(PetscBag bag, void *addr, PetscInt64 mdefault, const char *name, const char *help) 247d71ae5a4SJacob Faibussowitsch { 2480d349d43SBarry Smith PetscBagItem item; 2490d349d43SBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 2500d349d43SBarry Smith PetscBool printhelp; 2510d349d43SBarry Smith PetscInt odefault = (PetscInt)mdefault; 2520d349d43SBarry Smith PetscBool flg; 2530d349d43SBarry Smith 2540d349d43SBarry Smith PetscFunctionBegin; 2550d349d43SBarry Smith nname[0] = '-'; 2560d349d43SBarry Smith nname[1] = 0; 2579566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 2589566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 25948a46eb9SPierre Jolivet if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, odefault, help)); 2609566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &odefault, &flg)); 261bafee8b4SSatish Balay if (flg) mdefault = (PetscInt64)odefault; 2620d349d43SBarry Smith 2639566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 2640d349d43SBarry Smith item->dtype = PETSC_INT; 2650d349d43SBarry Smith item->offset = ((char *)addr) - ((char *)bag); 2665f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Registered item %s %s is not in bag memory space", name, help); 26702c9f0b5SLisandro Dalcin item->next = NULL; 2680d349d43SBarry Smith item->msize = 1; 269bafee8b4SSatish Balay *(PetscInt64 *)addr = mdefault; 2709566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 2710d349d43SBarry Smith PetscFunctionReturn(0); 2720d349d43SBarry Smith } 2730d349d43SBarry Smith 274dd66f111SBlaise Bourdin /*@C 275811af0c4SBarry Smith PetscBagRegisterBoolArray - add a n `PetscBool` values to a `PetscBag` 276dd66f111SBlaise Bourdin 277*c3339decSBarry Smith Logically Collective 278dd66f111SBlaise Bourdin 279d8d19677SJose E. Roman Input Parameters: 280dd66f111SBlaise Bourdin + bag - the bag of values 281811af0c4SBarry Smith . addr - location of boolean array in struct, for example `¶ms->b` 282dd66f111SBlaise Bourdin . msize - number of entries in array 283dd66f111SBlaise Bourdin . name - name of the boolean array 284dd66f111SBlaise Bourdin - help - longer string with more information about the value 285dd66f111SBlaise Bourdin 286dd66f111SBlaise Bourdin Level: beginner 287dd66f111SBlaise Bourdin 288db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 289db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 290db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 291dd66f111SBlaise Bourdin @*/ 292d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help) 293d71ae5a4SJacob Faibussowitsch { 294dd66f111SBlaise Bourdin PetscBagItem item; 295dd66f111SBlaise Bourdin char nname[PETSC_BAG_NAME_LENGTH + 1]; 296dd66f111SBlaise Bourdin PetscBool printhelp; 297dd66f111SBlaise Bourdin PetscInt i, tmp = msize; 298dd66f111SBlaise Bourdin 299dd66f111SBlaise Bourdin PetscFunctionBegin; 3005f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 3015f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 3025f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 3035f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 304dd66f111SBlaise Bourdin nname[0] = '-'; 305dd66f111SBlaise Bourdin nname[1] = 0; 3069566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 3079566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 308dd66f111SBlaise Bourdin if (printhelp) { 3099566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <", bag->bagprefix ? bag->bagprefix : "", name)); 31048a46eb9SPierre Jolivet for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i)); 3119566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help)); 312dd66f111SBlaise Bourdin } 3139566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBoolArray(NULL, bag->bagprefix, nname, (PetscBool *)addr, &tmp, NULL)); 314dd66f111SBlaise Bourdin 3159566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 316dd66f111SBlaise Bourdin item->dtype = PETSC_BOOL; 317dd66f111SBlaise Bourdin item->offset = ((char *)addr) - ((char *)bag); 3185f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Registered item %s %s is not in bag memory space", name, help); 31902c9f0b5SLisandro Dalcin item->next = NULL; 320dd66f111SBlaise Bourdin item->msize = msize; 3219566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 322dd66f111SBlaise Bourdin PetscFunctionReturn(0); 323dd66f111SBlaise Bourdin } 324dd66f111SBlaise Bourdin 3255c6c1daeSBarry Smith /*@C 326811af0c4SBarry Smith PetscBagRegisterString - add a string value to a `PetscBag` 3275c6c1daeSBarry Smith 328*c3339decSBarry Smith Logically Collective 3295c6c1daeSBarry Smith 330d8d19677SJose E. Roman Input Parameters: 3315c6c1daeSBarry Smith + bag - the bag of values 332811af0c4SBarry Smith . addr - location of start of string in struct, for example `¶ms->mystring` 3335c6c1daeSBarry Smith . msize - length of the string space in the struct 3345c6c1daeSBarry Smith . mdefault - the initial value 3355c6c1daeSBarry Smith . name - name of the string 3365c6c1daeSBarry Smith - help - longer string with more information about the value 3375c6c1daeSBarry Smith 3385c6c1daeSBarry Smith Level: beginner 3395c6c1daeSBarry Smith 3405c6c1daeSBarry Smith Note: The struct should have the field char mystring[msize]; not char *mystring 3415c6c1daeSBarry Smith 342db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 343db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 344c2e3fba1SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 3455c6c1daeSBarry Smith @*/ 346d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterString(PetscBag bag, void *addr, PetscInt msize, const char *mdefault, const char *name, const char *help) 347d71ae5a4SJacob Faibussowitsch { 3485c6c1daeSBarry Smith PetscBagItem item; 3495c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 3505c6c1daeSBarry Smith PetscBool printhelp; 3515c6c1daeSBarry Smith 3525c6c1daeSBarry Smith PetscFunctionBegin; 3535f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 3545f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 3555f80ce2aSJacob Faibussowitsch PetscValidCharPointer(mdefault, 4); 3565f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 5); 3575f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 6); 3585c6c1daeSBarry Smith nname[0] = '-'; 3595c6c1daeSBarry Smith nname[1] = 0; 3609566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 3619566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 36248a46eb9SPierre Jolivet if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help)); 3635c6c1daeSBarry Smith 3649566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 3655c6c1daeSBarry Smith item->dtype = PETSC_CHAR; 3665c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 3675f80ce2aSJacob 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); 36802c9f0b5SLisandro Dalcin item->next = NULL; 3695c6c1daeSBarry Smith item->msize = msize; 37048a46eb9SPierre Jolivet if (mdefault != (char *)addr) PetscCall(PetscStrncpy((char *)addr, mdefault, msize - 1)); 3719566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, bag->bagprefix, nname, (char *)addr, msize, NULL)); 3729566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 3735c6c1daeSBarry Smith PetscFunctionReturn(0); 3745c6c1daeSBarry Smith } 3755c6c1daeSBarry Smith 3765c6c1daeSBarry Smith /*@C 377811af0c4SBarry Smith PetscBagRegisterReal - add a `PetscReal` value to a `PetscBag` 3785c6c1daeSBarry Smith 379*c3339decSBarry Smith Logically Collective 3805c6c1daeSBarry Smith 381d8d19677SJose E. Roman Input Parameters: 3825c6c1daeSBarry Smith + bag - the bag of values 383811af0c4SBarry Smith . addr - location of double in struct, for example `¶ms->r` 3845c6c1daeSBarry Smith . mdefault - the initial value 3855c6c1daeSBarry Smith . name - name of the variable 3865c6c1daeSBarry Smith - help - longer string with more information about the value 3875c6c1daeSBarry Smith 3885c6c1daeSBarry Smith Level: beginner 3895c6c1daeSBarry Smith 390db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 391db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 392db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 3935c6c1daeSBarry Smith @*/ 394d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterReal(PetscBag bag, void *addr, PetscReal mdefault, const char *name, const char *help) 395d71ae5a4SJacob Faibussowitsch { 3965c6c1daeSBarry Smith PetscBagItem item; 3975c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 3985c6c1daeSBarry Smith PetscBool printhelp; 3995c6c1daeSBarry Smith 4005c6c1daeSBarry Smith PetscFunctionBegin; 4015f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 4025f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 4035f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 4045f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 4055c6c1daeSBarry Smith nname[0] = '-'; 4065c6c1daeSBarry Smith nname[1] = 0; 4079566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 4089566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 40948a46eb9SPierre Jolivet if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%g>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, (double)mdefault, help)); 4109566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetReal(NULL, bag->bagprefix, nname, &mdefault, NULL)); 4115c6c1daeSBarry Smith 4129566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 4135c6c1daeSBarry Smith item->dtype = PETSC_REAL; 4145c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 4155f80ce2aSJacob 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); 41602c9f0b5SLisandro Dalcin item->next = NULL; 4175c6c1daeSBarry Smith item->msize = 1; 4185c6c1daeSBarry Smith *(PetscReal *)addr = mdefault; 4199566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 4205c6c1daeSBarry Smith PetscFunctionReturn(0); 4215c6c1daeSBarry Smith } 4225c6c1daeSBarry Smith 4235c6c1daeSBarry Smith /*@C 424811af0c4SBarry Smith PetscBagRegisterScalar - add a `PetscScalar` value to a `PetscBag` 4255c6c1daeSBarry Smith 426*c3339decSBarry Smith Logically Collective 4275c6c1daeSBarry Smith 428d8d19677SJose E. Roman Input Parameters: 4295c6c1daeSBarry Smith + bag - the bag of values 430811af0c4SBarry Smith . addr - location of scalar in struct, for example `¶ms->c` 4315c6c1daeSBarry Smith . mdefault - the initial value 4325c6c1daeSBarry Smith . name - name of the variable 4335c6c1daeSBarry Smith - help - longer string with more information about the value 4345c6c1daeSBarry Smith 4355c6c1daeSBarry Smith Level: beginner 4365c6c1daeSBarry Smith 437db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 438db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 439db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 4405c6c1daeSBarry Smith @*/ 441d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterScalar(PetscBag bag, void *addr, PetscScalar mdefault, const char *name, const char *help) 442d71ae5a4SJacob Faibussowitsch { 4435c6c1daeSBarry Smith PetscBagItem item; 4445c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 4455c6c1daeSBarry Smith PetscBool printhelp; 4465c6c1daeSBarry Smith 4475c6c1daeSBarry Smith PetscFunctionBegin; 4485f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 4495f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 4505f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 4515f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 4525c6c1daeSBarry Smith nname[0] = '-'; 4535c6c1daeSBarry Smith nname[1] = 0; 4549566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 4559566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 45648a46eb9SPierre 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)); 4579566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetScalar(NULL, bag->bagprefix, nname, &mdefault, NULL)); 4585c6c1daeSBarry Smith 4599566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 4605c6c1daeSBarry Smith item->dtype = PETSC_SCALAR; 4615c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 4625f80ce2aSJacob 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); 46302c9f0b5SLisandro Dalcin item->next = NULL; 4645c6c1daeSBarry Smith item->msize = 1; 4655c6c1daeSBarry Smith *(PetscScalar *)addr = mdefault; 4669566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 4675c6c1daeSBarry Smith PetscFunctionReturn(0); 4685c6c1daeSBarry Smith } 4695c6c1daeSBarry Smith 4705c6c1daeSBarry Smith /*@C 471811af0c4SBarry Smith PetscBagRegisterBool - add a `PetscBool` to a `PetscBag` 4725c6c1daeSBarry Smith 473*c3339decSBarry Smith Logically Collective 4745c6c1daeSBarry Smith 475d8d19677SJose E. Roman Input Parameters: 4765c6c1daeSBarry Smith + bag - the bag of values 477811af0c4SBarry Smith . addr - location of logical in struct, for example `¶ms->b` 478811af0c4SBarry Smith . mdefault - the initial value, either `PETSC_FALSE` or `PETSC_TRUE` 4795c6c1daeSBarry Smith . name - name of the variable 4805c6c1daeSBarry Smith - help - longer string with more information about the value 4815c6c1daeSBarry Smith 4825c6c1daeSBarry Smith Level: beginner 4835c6c1daeSBarry Smith 484db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 485db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 486db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 4875c6c1daeSBarry Smith @*/ 488d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagRegisterBool(PetscBag bag, void *addr, PetscBool mdefault, const char *name, const char *help) 489d71ae5a4SJacob Faibussowitsch { 4905c6c1daeSBarry Smith PetscBagItem item; 4915c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 4925c6c1daeSBarry Smith PetscBool printhelp; 4935c6c1daeSBarry Smith 4945c6c1daeSBarry Smith PetscFunctionBegin; 4955f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 4965f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 4975f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 4985f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 4995c6c1daeSBarry 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 */ 5005f80ce2aSJacob 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); 5015c6c1daeSBarry Smith nname[0] = '-'; 5025c6c1daeSBarry Smith nname[1] = 0; 5039566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 5049566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 50548a46eb9SPierre Jolivet if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, PetscBools[mdefault], help)); 5069566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, bag->bagprefix, nname, &mdefault, NULL)); 5075c6c1daeSBarry Smith 5089566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 5095c6c1daeSBarry Smith item->dtype = PETSC_BOOL; 5105c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 5115f80ce2aSJacob 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); 51202c9f0b5SLisandro Dalcin item->next = NULL; 5135c6c1daeSBarry Smith item->msize = 1; 5145c6c1daeSBarry Smith *(PetscBool *)addr = mdefault; 5159566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 5165c6c1daeSBarry Smith PetscFunctionReturn(0); 5175c6c1daeSBarry Smith } 5185c6c1daeSBarry Smith 5195c6c1daeSBarry Smith /*@C 520811af0c4SBarry Smith PetscBagDestroy - Destroys a `PetscBag` 5215c6c1daeSBarry Smith 522*c3339decSBarry Smith Collective 5235c6c1daeSBarry Smith 5245c6c1daeSBarry Smith Input Parameter: 5255c6c1daeSBarry Smith . bag - the bag of values 5265c6c1daeSBarry Smith 5275c6c1daeSBarry Smith Level: beginner 5285c6c1daeSBarry Smith 529db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 530db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 531db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 5325c6c1daeSBarry Smith @*/ 533d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagDestroy(PetscBag *bag) 534d71ae5a4SJacob Faibussowitsch { 5355f80ce2aSJacob Faibussowitsch PetscBagItem nitem; 5365c6c1daeSBarry Smith 5375c6c1daeSBarry Smith PetscFunctionBegin; 5385f80ce2aSJacob Faibussowitsch if (!*bag) PetscFunctionReturn(0); 5395f80ce2aSJacob Faibussowitsch PetscValidPointer(*bag, 1); 5405f80ce2aSJacob Faibussowitsch nitem = (*bag)->bagitems; 5415c6c1daeSBarry Smith while (nitem) { 5425f80ce2aSJacob Faibussowitsch PetscBagItem item = nitem->next; 5435f80ce2aSJacob Faibussowitsch 5449566063dSJacob Faibussowitsch if (nitem->list) PetscCall(PetscStrArrayDestroy(&nitem->list)); 5459566063dSJacob Faibussowitsch PetscCall(PetscFree(nitem)); 5465c6c1daeSBarry Smith nitem = item; 5475c6c1daeSBarry Smith } 5489566063dSJacob Faibussowitsch if ((*bag)->bagprefix) PetscCall(PetscFree((*bag)->bagprefix)); 5499566063dSJacob Faibussowitsch PetscCall(PetscFree(*bag)); 5505c6c1daeSBarry Smith PetscFunctionReturn(0); 5515c6c1daeSBarry Smith } 5525c6c1daeSBarry Smith 5535c6c1daeSBarry Smith /*@ 554811af0c4SBarry Smith PetscBagSetFromOptions - Allows setting entries to a `PetscBag` using the options database 5555c6c1daeSBarry Smith 556*c3339decSBarry Smith Collective 5575c6c1daeSBarry Smith 5585c6c1daeSBarry Smith Input Parameter: 5595c6c1daeSBarry Smith . bag - the bag of values 5605c6c1daeSBarry Smith 5615c6c1daeSBarry Smith Level: beginner 5625c6c1daeSBarry Smith 563811af0c4SBarry Smith Note: 564811af0c4SBarry Smith The options database keys for the entries are of the form `-[bagprefix]_name value` 565811af0c4SBarry Smith 566db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()` 567db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 568db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagRegisterEnum()` 5695c6c1daeSBarry Smith @*/ 570d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagSetFromOptions(PetscBag bag) 571d71ae5a4SJacob Faibussowitsch { 5725c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 5735c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH + 1], helpname[PETSC_BAG_NAME_LENGTH + PETSC_BAG_HELP_LENGTH + 3]; 5745c6c1daeSBarry Smith PetscInt n; 5755c6c1daeSBarry Smith 5765c6c1daeSBarry Smith PetscFunctionBegin; 5775f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 5789566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(helpname, bag->bagname, sizeof(helpname))); 5799566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(helpname, " ", sizeof(helpname))); 5809566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(helpname, bag->baghelp, sizeof(helpname))); 581d0609cedSBarry Smith PetscOptionsBegin(bag->bagcomm, bag->bagprefix, helpname, NULL); 5825c6c1daeSBarry Smith while (nitem) { 5835c6c1daeSBarry Smith name[0] = '-'; 5845c6c1daeSBarry Smith name[1] = 0; 5859566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(name, nitem->name, sizeof(name))); 5865c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */ 5875c6c1daeSBarry Smith char *value = (char *)(((char *)bag) + nitem->offset); 5889566063dSJacob Faibussowitsch PetscCall(PetscOptionsString(name, nitem->help, "", value, value, nitem->msize, NULL)); 5895c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 5905c6c1daeSBarry Smith PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset); 5915c6c1daeSBarry Smith if (nitem->msize == 1) { 5929566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal(name, nitem->help, "", *value, value, NULL)); 5935c6c1daeSBarry Smith } else { 5945c6c1daeSBarry Smith n = nitem->msize; 5959566063dSJacob Faibussowitsch PetscCall(PetscOptionsRealArray(name, nitem->help, "", value, &n, NULL)); 5965c6c1daeSBarry Smith } 5975c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 5985c6c1daeSBarry Smith PetscScalar *value = (PetscScalar *)(((char *)bag) + nitem->offset); 5999566063dSJacob Faibussowitsch PetscCall(PetscOptionsScalar(name, nitem->help, "", *value, value, NULL)); 6005c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 6015c6c1daeSBarry Smith PetscInt *value = (PetscInt *)(((char *)bag) + nitem->offset); 6025c6c1daeSBarry Smith if (nitem->msize == 1) { 6039566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt(name, nitem->help, "", *value, value, NULL)); 6045c6c1daeSBarry Smith } else { 6055c6c1daeSBarry Smith n = nitem->msize; 6069566063dSJacob Faibussowitsch PetscCall(PetscOptionsIntArray(name, nitem->help, "", value, &n, NULL)); 6075c6c1daeSBarry Smith } 6085c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 6095c6c1daeSBarry Smith PetscEnum *value = (PetscEnum *)(((char *)bag) + nitem->offset); 6105c6c1daeSBarry Smith PetscInt i = 0; 6119371c9d4SSatish Balay while (nitem->list[i++]) 6129371c9d4SSatish Balay ; 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(); 6265c6c1daeSBarry Smith PetscFunctionReturn(0); 6275c6c1daeSBarry Smith } 6285c6c1daeSBarry Smith 6295c6c1daeSBarry Smith /*@C 6305c6c1daeSBarry Smith PetscBagView - Views a bag of values as either ASCII text or a binary file 6315c6c1daeSBarry Smith 632*c3339decSBarry Smith Collective 6335c6c1daeSBarry Smith 634d8d19677SJose E. Roman Input Parameters: 6355c6c1daeSBarry Smith + bag - the bag of values 6365c6c1daeSBarry Smith - viewer - 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 642811af0c4SBarry Smith in on a machine of the same architecture. 6435c6c1daeSBarry Smith 644db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()` 645db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()` 646db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()` 6475c6c1daeSBarry Smith @*/ 648d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagView(PetscBag bag, PetscViewer view) 649d71ae5a4SJacob Faibussowitsch { 6505c6c1daeSBarry Smith PetscBool isascii, isbinary; 6515c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 6525c6c1daeSBarry Smith 6535c6c1daeSBarry Smith PetscFunctionBegin; 6545f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 6555f80ce2aSJacob Faibussowitsch PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 2); 6569566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERASCII, &isascii)); 6579566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary)); 6585c6c1daeSBarry Smith if (isascii) { 6593ffde785SBarry Smith if (bag->bagprefix) { 6609566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object: %s (%s) %s\n", bag->bagname, bag->bagprefix, bag->baghelp)); 6613ffde785SBarry Smith } else { 6629566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object: %s %s\n", bag->bagname, bag->baghelp)); 6633ffde785SBarry Smith } 6645c6c1daeSBarry Smith while (nitem) { 6655c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { 6665c6c1daeSBarry Smith char *value = (char *)(((char *)bag) + nitem->offset); 6675c6c1daeSBarry Smith char tmp = value[nitem->msize - 1]; /* special handling for fortran chars wihout null terminator */ 6685c6c1daeSBarry Smith value[nitem->msize - 1] = 0; 6699566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %s; %s\n", nitem->name, value, nitem->help)); 6705c6c1daeSBarry Smith value[nitem->msize - 1] = tmp; 6715c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 6725c6c1daeSBarry Smith PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset); 6735c6c1daeSBarry Smith PetscInt i; 6749566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = ", nitem->name)); 67548a46eb9SPierre Jolivet for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%g ", (double)value[i])); 6769566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help)); 6775c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 6785c6c1daeSBarry Smith PetscScalar value = *(PetscScalar *)(((char *)bag) + nitem->offset); 6795c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 6808627564fSBarry Smith if ((double)PetscImaginaryPart(value)) { 6819566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %g + %gi; %s\n", nitem->name, (double)PetscRealPart(value), (double)PetscImaginaryPart(value), nitem->help)); 6828627564fSBarry Smith } else { 6839566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %g; %s\n", nitem->name, (double)PetscRealPart(value), nitem->help)); 6848627564fSBarry Smith } 6855c6c1daeSBarry Smith #else 6869566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %g; %s\n", nitem->name, (double)value, nitem->help)); 6875c6c1daeSBarry Smith #endif 6885c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 6895c6c1daeSBarry Smith PetscInt i, *value = (PetscInt *)(((char *)bag) + nitem->offset); 6909566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = ", nitem->name)); 69148a46eb9SPierre Jolivet for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%" PetscInt_FMT " ", value[i])); 6929566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help)); 6935c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 694dd66f111SBlaise Bourdin PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset); 695dd66f111SBlaise Bourdin PetscInt i; 6965c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 6979566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = ", nitem->name)); 698dd66f111SBlaise Bourdin for (i = 0; i < nitem->msize; i++) { 699dd66f111SBlaise Bourdin if (((int)value[i]) == -1) value[i] = PETSC_TRUE; 7005c6c1daeSBarry Smith /* the checks here with != PETSC_FALSE and PETSC_TRUE is a special case; here we truly demand that the value be 0 or 1 */ 7015f80ce2aSJacob Faibussowitsch PetscCheck(value[i] == PETSC_FALSE || value[i] == PETSC_TRUE, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Boolean value for %s %s is corrupt; integer value %" PetscInt_FMT, nitem->name, nitem->help, (PetscInt)(value[i])); 7029566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s", PetscBools[value[i]])); 703dd66f111SBlaise Bourdin } 7049566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help)); 7055c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 7065c6c1daeSBarry Smith PetscEnum value = *(PetscEnum *)(((char *)bag) + nitem->offset); 7075c6c1daeSBarry Smith PetscInt i = 0; 7089371c9d4SSatish Balay while (nitem->list[i++]) 7099371c9d4SSatish Balay ; 7109566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %s; (%s) %s\n", nitem->name, nitem->list[value], nitem->list[i - 3], nitem->help)); 7115c6c1daeSBarry Smith } 7125c6c1daeSBarry Smith nitem = nitem->next; 7135c6c1daeSBarry Smith } 7145c6c1daeSBarry Smith } else if (isbinary) { 7155c6c1daeSBarry Smith PetscInt classid = PETSC_BAG_FILE_CLASSID, dtype; 7165c6c1daeSBarry Smith PetscInt deprecatedbagsize = 0; 717a261c58fSBarry Smith PetscViewerFormat format; 7189566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &classid, 1, PETSC_INT)); 7199566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &deprecatedbagsize, 1, PETSC_INT)); 7209566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &bag->count, 1, PETSC_INT)); 7219566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, bag->bagname, PETSC_BAG_NAME_LENGTH, PETSC_CHAR)); 7229566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, PETSC_CHAR)); 7235c6c1daeSBarry Smith while (nitem) { 7249566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &nitem->offset, 1, PETSC_INT)); 7255c6c1daeSBarry Smith dtype = (PetscInt)nitem->dtype; 7269566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &dtype, 1, PETSC_INT)); 7279566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, nitem->name, PETSC_BAG_NAME_LENGTH, PETSC_CHAR)); 7289566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, nitem->help, PETSC_BAG_HELP_LENGTH, PETSC_CHAR)); 7299566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &nitem->msize, 1, PETSC_INT)); 7305c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 7315c6c1daeSBarry Smith if (dtype == PETSC_BOOL && ((*(int *)(((char *)bag) + nitem->offset) == -1))) *(int *)(((char *)bag) + nitem->offset) = PETSC_TRUE; 7325c6c1daeSBarry Smith 7339566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, (((char *)bag) + nitem->offset), nitem->msize, nitem->dtype)); 73448a46eb9SPierre Jolivet if (dtype == PETSC_ENUM) PetscCall(PetscViewerBinaryWriteStringArray(view, (const char *const *)nitem->list)); 7355c6c1daeSBarry Smith nitem = nitem->next; 7365c6c1daeSBarry Smith } 7379566063dSJacob Faibussowitsch PetscCall(PetscViewerGetFormat(view, &format)); 738a261c58fSBarry Smith if (format == PETSC_VIEWER_BINARY_MATLAB) { 739a261c58fSBarry Smith MPI_Comm comm; 740a261c58fSBarry Smith FILE *info; 7419566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)view, &comm)); 7429566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetInfoPointer(view, &info)); 7439566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(comm, info, "#--- begin code written by PetscViewerBinary for MATLAB format ---#\n")); 7449566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(comm, info, "#$$ Set.%s = PetscBinaryRead(fd);\n", bag->bagname)); 7459566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(comm, info, "#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n")); 746a261c58fSBarry Smith } 747a261c58fSBarry Smith } 7485c6c1daeSBarry Smith PetscFunctionReturn(0); 7495c6c1daeSBarry Smith } 7505c6c1daeSBarry Smith 7515c6c1daeSBarry Smith /*@C 752173f9484SMatthew G. Knepley PetscBagViewFromOptions - Processes command line options to determine if/how a PetscBag is to be viewed. 753173f9484SMatthew G. Knepley 754*c3339decSBarry Smith Collective 755173f9484SMatthew G. Knepley 756173f9484SMatthew G. Knepley Input Parameters: 757173f9484SMatthew G. Knepley + obj - the object 758173f9484SMatthew G. Knepley . bobj - optional other object that provides prefix (if NULL then the prefix in obj is used) 759173f9484SMatthew G. Knepley - optionname - option to activate viewing 760478db826SMatthew G. Knepley 761173f9484SMatthew G. Knepley Level: intermediate 762478db826SMatthew G. Knepley 763db781477SPatrick Sanan .seealso: `PetscBagCreate()`, `PetscBag`, `PetscViewer` 764173f9484SMatthew G. Knepley @*/ 765d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[]) 766d71ae5a4SJacob Faibussowitsch { 767173f9484SMatthew G. Knepley static PetscBool incall = PETSC_FALSE; 768173f9484SMatthew G. Knepley PetscViewer viewer; 769173f9484SMatthew G. Knepley PetscViewerFormat format; 770173f9484SMatthew G. Knepley const char *prefix, *bprefix = NULL; 771173f9484SMatthew G. Knepley PetscBool flg; 772173f9484SMatthew G. Knepley 773173f9484SMatthew G. Knepley PetscFunctionBegin; 774173f9484SMatthew G. Knepley if (incall) PetscFunctionReturn(0); 775173f9484SMatthew G. Knepley incall = PETSC_TRUE; 7765f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 7779566063dSJacob Faibussowitsch if (bobj) PetscCall(PetscObjectGetOptionsPrefix(bobj, &bprefix)); 778173f9484SMatthew G. Knepley prefix = bobj ? bprefix : bag->bagprefix; 7799566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg)); 780173f9484SMatthew G. Knepley if (flg) { 7819566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, format)); 7829566063dSJacob Faibussowitsch PetscCall(PetscBagView(bag, viewer)); 7839566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 7849566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 7859566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 786173f9484SMatthew G. Knepley } 787173f9484SMatthew G. Knepley incall = PETSC_FALSE; 788173f9484SMatthew G. Knepley PetscFunctionReturn(0); 789173f9484SMatthew G. Knepley } 790173f9484SMatthew G. Knepley 791173f9484SMatthew G. Knepley /*@C 7925c6c1daeSBarry Smith PetscBagLoad - Loads a bag of values from a binary file 7935c6c1daeSBarry Smith 794*c3339decSBarry Smith Collective 7955c6c1daeSBarry Smith 796d8d19677SJose E. Roman Input Parameters: 7975c6c1daeSBarry Smith + viewer - file to load values from 7985c6c1daeSBarry Smith - bag - the bag of values 7995c6c1daeSBarry Smith 800811af0c4SBarry Smith Note: 80195452b02SPatrick Sanan You must have created and registered all the fields in the bag before loading into it. 8025c6c1daeSBarry Smith 8035c6c1daeSBarry Smith Level: beginner 8045c6c1daeSBarry Smith 805db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagView()`, `PetscBagGetData()` 806db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 807db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 8085c6c1daeSBarry Smith @*/ 809d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagLoad(PetscViewer view, PetscBag bag) 810d71ae5a4SJacob Faibussowitsch { 8115c6c1daeSBarry Smith PetscBool isbinary; 8125f80ce2aSJacob Faibussowitsch PetscInt classid, bagcount, dtype, msize, offset, deprecatedbagsize; 8135c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH], help[PETSC_BAG_HELP_LENGTH], **list; 8145c6c1daeSBarry Smith PetscBagItem nitem; 8155c6c1daeSBarry Smith MPI_Comm comm; 8165c6c1daeSBarry Smith PetscMPIInt flag; 8175c6c1daeSBarry Smith 8185c6c1daeSBarry Smith PetscFunctionBegin; 8195f80ce2aSJacob Faibussowitsch PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 1); 8205f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 2); 8219566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)view, &comm)); 8229566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_compare(comm, bag->bagcomm, &flag)); 8235f80ce2aSJacob Faibussowitsch PetscCheck(flag == MPI_CONGRUENT || flag == MPI_IDENT, PETSC_COMM_SELF, PETSC_ERR_ARG_NOTSAMECOMM, "Different communicators in the viewer and bag"); 8249566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary)); 8255f80ce2aSJacob Faibussowitsch PetscCheck(isbinary, PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for this viewer type"); 8265c6c1daeSBarry Smith 8279566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &classid, 1, NULL, PETSC_INT)); 8285f80ce2aSJacob Faibussowitsch PetscCheck(classid == PETSC_BAG_FILE_CLASSID, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Not PetscBag next in binary file"); 8299566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &deprecatedbagsize, 1, NULL, PETSC_INT)); 8309566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &bagcount, 1, NULL, PETSC_INT)); 8315f80ce2aSJacob Faibussowitsch PetscCheck(bagcount == bag->count, comm, PETSC_ERR_ARG_INCOMP, "Bag in file has different number of entries %d then passed in bag %d", (int)bagcount, (int)bag->count); 8329566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, bag->bagname, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR)); 8339566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR)); 8345c6c1daeSBarry Smith 8355c6c1daeSBarry Smith nitem = bag->bagitems; 8365f80ce2aSJacob Faibussowitsch for (PetscInt i = 0; i < bagcount; i++) { 8379566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &offset, 1, NULL, PETSC_INT)); 8385c6c1daeSBarry Smith /* ignore the offset in the file */ 8399566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &dtype, 1, NULL, PETSC_INT)); 8409566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, name, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR)); 8419566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, help, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR)); 8429566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &msize, 1, NULL, PETSC_INT)); 8435c6c1daeSBarry Smith 8445c6c1daeSBarry Smith if (dtype == (PetscInt)PETSC_CHAR) { 8459566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_CHAR)); 8465c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_REAL) { 8479566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_REAL)); 8485c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_SCALAR) { 8499566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_SCALAR)); 8505c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_INT) { 8519566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_INT)); 8525c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_BOOL) { 8539566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_BOOL)); 8545c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_ENUM) { 8559566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_ENUM)); 8569566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadStringArray(view, &list)); 8575c6c1daeSBarry Smith /* don't need to save list because it is already registered in the bag */ 8589566063dSJacob Faibussowitsch PetscCall(PetscFree(list)); 8595c6c1daeSBarry Smith } 8605c6c1daeSBarry Smith nitem = nitem->next; 8615c6c1daeSBarry Smith } 8625c6c1daeSBarry Smith PetscFunctionReturn(0); 8635c6c1daeSBarry Smith } 8645c6c1daeSBarry Smith 865e8976759SBarry Smith /*@C 866811af0c4SBarry Smith PetscBagCreate - Create a bag of values. A `PetscBag` is a representation of a C struct that can be saved to and read from files, can have values set from the 867811af0c4SBarry Smith options database 8685c6c1daeSBarry Smith 869d083f849SBarry Smith Collective 8705c6c1daeSBarry Smith 8715c6c1daeSBarry Smith Level: Intermediate 8725c6c1daeSBarry Smith 8735c6c1daeSBarry Smith Input Parameters: 8745c6c1daeSBarry Smith + comm - communicator to share bag 875811af0c4SBarry Smith - bagsize - size of the C structure holding the values, for example sizeof(mystruct) 8765c6c1daeSBarry Smith 8775c6c1daeSBarry Smith Output Parameter: 8785c6c1daeSBarry Smith . bag - the bag of values 8795c6c1daeSBarry Smith 8805c6c1daeSBarry Smith Notes: 881811af0c4SBarry Smith After creating the bag, for each entry in the C struct call the appropriate `PetscBagRegisterInt()` etc to define the C structs layout 882811af0c4SBarry Smith 883811af0c4SBarry Smith The size of the A struct must be small enough to fit in a `PetscInt`; by default 884811af0c4SBarry Smith `PetscInt` is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length. 8855c6c1daeSBarry Smith The warning about casting to a shorter length can be ignored below unless your A struct is too large 8865c6c1daeSBarry Smith 887db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 888db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 889db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()` 8905c6c1daeSBarry Smith @*/ 891d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag) 892d71ae5a4SJacob Faibussowitsch { 8935f80ce2aSJacob Faibussowitsch const size_t totalsize = bagsize + sizeof(struct _n_PetscBag) + sizeof(PetscScalar); 8945c6c1daeSBarry Smith 8955c6c1daeSBarry Smith PetscFunctionBegin; 8965f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 3); 8979566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Creating Bag with total size %d\n", (int)totalsize)); 8989566063dSJacob Faibussowitsch PetscCall(PetscCalloc(totalsize, bag)); 899a297a907SKarl Rupp 9005f80ce2aSJacob Faibussowitsch (*bag)->bagsize = totalsize; 9015c6c1daeSBarry Smith (*bag)->bagcomm = comm; 9020298fd71SBarry Smith (*bag)->bagprefix = NULL; 9035c6c1daeSBarry Smith (*bag)->structlocation = (void *)(((char *)(*bag)) + sizeof(PetscScalar) * (sizeof(struct _n_PetscBag) / sizeof(PetscScalar)) + sizeof(PetscScalar)); 9045c6c1daeSBarry Smith PetscFunctionReturn(0); 9055c6c1daeSBarry Smith } 9065c6c1daeSBarry Smith 9075c6c1daeSBarry Smith /*@C 9085c6c1daeSBarry Smith PetscBagSetName - Sets the name of a bag of values 9095c6c1daeSBarry Smith 9105c6c1daeSBarry Smith Not Collective 9115c6c1daeSBarry Smith 9125c6c1daeSBarry Smith Level: Intermediate 9135c6c1daeSBarry Smith 9145c6c1daeSBarry Smith Input Parameters: 9155c6c1daeSBarry Smith + bag - the bag of values 9165c6c1daeSBarry Smith . name - the name assigned to the bag 9175c6c1daeSBarry Smith - help - help message for bag 9185c6c1daeSBarry Smith 919db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 920db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 921db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()` 9225c6c1daeSBarry Smith @*/ 923d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help) 924d71ae5a4SJacob Faibussowitsch { 9255c6c1daeSBarry Smith PetscFunctionBegin; 9265f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 9275f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 2); 9285f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 3); 9299566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(bag->bagname, name, PETSC_BAG_NAME_LENGTH - 1)); 9309566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(bag->baghelp, help, PETSC_BAG_HELP_LENGTH - 1)); 9315c6c1daeSBarry Smith PetscFunctionReturn(0); 9325c6c1daeSBarry Smith } 9335c6c1daeSBarry Smith 9345c6c1daeSBarry Smith /*@C 9355c6c1daeSBarry Smith PetscBagGetName - Gets the name of a bag of values 9365c6c1daeSBarry Smith 9375c6c1daeSBarry Smith Not Collective 9385c6c1daeSBarry Smith 9395c6c1daeSBarry Smith Level: Intermediate 9405c6c1daeSBarry Smith 9415c6c1daeSBarry Smith Input Parameter: 9425c6c1daeSBarry Smith . bag - the bag of values 9435c6c1daeSBarry Smith 9445c6c1daeSBarry Smith Output Parameter: 9455c6c1daeSBarry Smith . name - the name assigned to the bag 9465c6c1daeSBarry Smith 947db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 948db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 949db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()` 9505c6c1daeSBarry Smith @*/ 951d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagGetName(PetscBag bag, char **name) 952d71ae5a4SJacob Faibussowitsch { 9535c6c1daeSBarry Smith PetscFunctionBegin; 9545f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 9555f80ce2aSJacob Faibussowitsch PetscValidPointer(name, 2); 9565c6c1daeSBarry Smith *name = bag->bagname; 9575c6c1daeSBarry Smith PetscFunctionReturn(0); 9585c6c1daeSBarry Smith } 9595c6c1daeSBarry Smith 9605c6c1daeSBarry Smith /*@C 9615c6c1daeSBarry Smith PetscBagGetData - Gives back the user - access to memory that 962811af0c4SBarry Smith can be used for storing user-data-structure 9635c6c1daeSBarry Smith 9645c6c1daeSBarry Smith Not Collective 9655c6c1daeSBarry Smith 9665c6c1daeSBarry Smith Level: Intermediate 9675c6c1daeSBarry Smith 9685c6c1daeSBarry Smith Input Parameter: 9695c6c1daeSBarry Smith . bag - the bag of values 9705c6c1daeSBarry Smith 9715c6c1daeSBarry Smith Output Parameter: 972811af0c4SBarry Smith . data - pointer to memory that will have user-data-structure, this can be cast to a pointer of the type the C struct used in defining the bag 9735c6c1daeSBarry Smith 974db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()` 975db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 976db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()` 9775c6c1daeSBarry Smith @*/ 978d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagGetData(PetscBag bag, void **data) 979d71ae5a4SJacob Faibussowitsch { 9805c6c1daeSBarry Smith PetscFunctionBegin; 9815f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 9825f80ce2aSJacob Faibussowitsch PetscValidPointer(data, 2); 9835c6c1daeSBarry Smith *data = bag->structlocation; 9845c6c1daeSBarry Smith PetscFunctionReturn(0); 9855c6c1daeSBarry Smith } 9865c6c1daeSBarry Smith 9875c6c1daeSBarry Smith /*@C 9885c6c1daeSBarry Smith PetscBagSetOptionsPrefix - Sets the prefix used for searching for all 989811af0c4SBarry Smith `PetscBag` items in the options database. 9905c6c1daeSBarry Smith 991*c3339decSBarry Smith Logically collective 9925c6c1daeSBarry Smith 9935c6c1daeSBarry Smith Level: Intermediate 9945c6c1daeSBarry Smith 9955c6c1daeSBarry Smith Input Parameters: 9965c6c1daeSBarry Smith + bag - the bag of values 9975c6c1daeSBarry Smith - prefix - the prefix to prepend all Bag item names with. 9985c6c1daeSBarry Smith 9995c6c1daeSBarry Smith NOTES: Must be called prior to registering any of the bag items. 10005c6c1daeSBarry Smith 1001db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 1002db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()` 10035c6c1daeSBarry Smith @*/ 10045c6c1daeSBarry Smith 1005d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[]) 1006d71ae5a4SJacob Faibussowitsch { 10075c6c1daeSBarry Smith PetscFunctionBegin; 10085f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 10095f80ce2aSJacob Faibussowitsch if (pre) { 10105f80ce2aSJacob Faibussowitsch PetscValidCharPointer(pre, 2); 10115f80ce2aSJacob Faibussowitsch PetscCheck(pre[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Options prefix should not begin with a hyphen"); 10129566063dSJacob Faibussowitsch PetscCall(PetscFree(bag->bagprefix)); 10139566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(pre, &(bag->bagprefix))); 10149566063dSJacob Faibussowitsch } else PetscCall(PetscFree(bag->bagprefix)); 10155c6c1daeSBarry Smith PetscFunctionReturn(0); 10165c6c1daeSBarry Smith } 1017ffb7e86cSMatthew G. Knepley 1018ffb7e86cSMatthew G. Knepley /*@C 1019ffb7e86cSMatthew G. Knepley PetscBagGetNames - Get the names of all entries in the bag 1020ffb7e86cSMatthew G. Knepley 1021ffb7e86cSMatthew G. Knepley Not collective 1022ffb7e86cSMatthew G. Knepley 1023ffb7e86cSMatthew G. Knepley Input Parameters: 1024ffb7e86cSMatthew G. Knepley + bag - the bag of values 1025811af0c4SBarry Smith - names - array of the correct size to hold names, must be long enough to hold all the names 1026ffb7e86cSMatthew G. Knepley 1027ffb7e86cSMatthew G. Knepley Output Parameter: 1028ffb7e86cSMatthew G. Knepley . names - array of char pointers for names 1029ffb7e86cSMatthew G. Knepley 1030ffb7e86cSMatthew G. Knepley Level: intermediate 1031ffb7e86cSMatthew G. Knepley 1032db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagSetName()`, `PetscBagCreate()`, `PetscBagGetData()` 1033db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()` 1034ffb7e86cSMatthew G. Knepley @*/ 1035d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[]) 1036d71ae5a4SJacob Faibussowitsch { 1037ffb7e86cSMatthew G. Knepley PetscBagItem nitem = bag->bagitems; 1038ffb7e86cSMatthew G. Knepley 1039ffb7e86cSMatthew G. Knepley PetscFunctionBegin; 10405f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 10415f80ce2aSJacob Faibussowitsch PetscValidPointer(names, 2); 10425f80ce2aSJacob Faibussowitsch for (PetscInt n = 0; nitem; ++n, nitem = nitem->next) names[n] = nitem->name; 1043ffb7e86cSMatthew G. Knepley PetscFunctionReturn(0); 1044ffb7e86cSMatthew G. Knepley } 1045