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