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 235c6c1daeSBarry Smith PetscBagRegisterEnum - add an enum value to the bag 245c6c1daeSBarry Smith 255c6c1daeSBarry Smith Logically Collective on PetscBag 265c6c1daeSBarry Smith 27d8d19677SJose E. Roman Input Parameters: 285c6c1daeSBarry Smith + bag - the bag of values 295c6c1daeSBarry Smith . addr - location of enum in struct 305c6c1daeSBarry Smith . mdefault - the initial value 315c6c1daeSBarry Smith . list - array of strings containing names of enum values followed by enum name followed by enum prefix 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 405c6c1daeSBarry Smith @*/ 419371c9d4SSatish Balay PetscErrorCode PetscBagRegisterEnum(PetscBag bag, void *addr, const char *const *list, PetscEnum mdefault, const char *name, const char *help) { 425c6c1daeSBarry Smith PetscBagItem item; 435c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 445c6c1daeSBarry Smith PetscBool printhelp; 455c6c1daeSBarry Smith PetscInt i = 0; 465c6c1daeSBarry Smith 475c6c1daeSBarry Smith PetscFunctionBegin; 485f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 495f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 505f80ce2aSJacob Faibussowitsch PetscValidPointer(list, 3); 515f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 5); 525f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 6); 535c6c1daeSBarry Smith nname[0] = '-'; 545c6c1daeSBarry Smith nname[1] = 0; 559566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 569566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 575c6c1daeSBarry Smith if (printhelp) { 589371c9d4SSatish Balay while (list[i++]) 599371c9d4SSatish Balay ; 609566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%s>: (%s) %s (choose one of) ", bag->bagprefix ? bag->bagprefix : "", name, list[mdefault], list[i - 3], help)); 619566063dSJacob Faibussowitsch for (i = 0; list[i + 2]; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " %s", list[i])); 629566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, "\n")); 635c6c1daeSBarry Smith } 649566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetEnum(NULL, bag->bagprefix, nname, list, &mdefault, NULL)); 655c6c1daeSBarry Smith 669566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 675c6c1daeSBarry Smith item->dtype = PETSC_ENUM; 685c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 695f80ce2aSJacob 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); 7002c9f0b5SLisandro Dalcin item->next = NULL; 715c6c1daeSBarry Smith item->msize = 1; 729566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(list, (char ***)&item->list)); 735c6c1daeSBarry Smith *(PetscEnum *)addr = mdefault; 749566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 755c6c1daeSBarry Smith PetscFunctionReturn(0); 765c6c1daeSBarry Smith } 775c6c1daeSBarry Smith 785c6c1daeSBarry Smith /*@C 795c6c1daeSBarry Smith PetscBagRegisterIntArray - add an integer value to the bag 805c6c1daeSBarry Smith 815c6c1daeSBarry Smith Logically Collective on PetscBag 825c6c1daeSBarry Smith 83d8d19677SJose E. Roman Input Parameters: 845c6c1daeSBarry Smith + bag - the bag of values 855c6c1daeSBarry Smith . addr - location of integer in struct 865c6c1daeSBarry Smith . msize - number of entries in array 875c6c1daeSBarry Smith . name - name of the integer array 885c6c1daeSBarry Smith - help - longer string with more information about the value 895c6c1daeSBarry Smith 905c6c1daeSBarry Smith Level: beginner 915c6c1daeSBarry Smith 92db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 93db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 94db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 955c6c1daeSBarry Smith 965c6c1daeSBarry Smith @*/ 979371c9d4SSatish Balay PetscErrorCode PetscBagRegisterIntArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help) { 985c6c1daeSBarry Smith PetscBagItem item; 995c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 1005c6c1daeSBarry Smith PetscBool printhelp; 1015c6c1daeSBarry Smith PetscInt i, tmp = msize; 1025c6c1daeSBarry Smith 1035c6c1daeSBarry Smith PetscFunctionBegin; 1045f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 1055f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 1065f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 1075f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 1085c6c1daeSBarry Smith nname[0] = '-'; 1095c6c1daeSBarry Smith nname[1] = 0; 1109566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 1119566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 1125c6c1daeSBarry Smith if (printhelp) { 1139566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <", bag->bagprefix ? bag->bagprefix : "", name)); 114*48a46eb9SPierre Jolivet for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i)); 1159566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help)); 1165c6c1daeSBarry Smith } 1179566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetIntArray(NULL, bag->bagprefix, nname, (PetscInt *)addr, &tmp, NULL)); 1185c6c1daeSBarry Smith 1199566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 1205c6c1daeSBarry Smith item->dtype = PETSC_INT; 1215c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 1225f80ce2aSJacob 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); 12302c9f0b5SLisandro Dalcin item->next = NULL; 1245c6c1daeSBarry Smith item->msize = msize; 1259566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 1265c6c1daeSBarry Smith PetscFunctionReturn(0); 1275c6c1daeSBarry Smith } 1285c6c1daeSBarry Smith 1295c6c1daeSBarry Smith /*@C 1305c6c1daeSBarry Smith PetscBagRegisterRealArray - add an real array to the bag 1315c6c1daeSBarry Smith 1325c6c1daeSBarry Smith Logically Collective on PetscBag 1335c6c1daeSBarry Smith 134d8d19677SJose E. Roman Input Parameters: 1355c6c1daeSBarry Smith + bag - the bag of values 1365c6c1daeSBarry Smith . addr - location of real array in struct 1375c6c1daeSBarry Smith . msize - number of entries in array 1385c6c1daeSBarry Smith . name - name of the integer array 1395c6c1daeSBarry Smith - help - longer string with more information about the value 1405c6c1daeSBarry Smith 1415c6c1daeSBarry Smith Level: beginner 1425c6c1daeSBarry Smith 143db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 144db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 145db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 1465c6c1daeSBarry Smith 1475c6c1daeSBarry Smith @*/ 1489371c9d4SSatish Balay PetscErrorCode PetscBagRegisterRealArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help) { 1495c6c1daeSBarry Smith PetscBagItem item; 1505c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 1515c6c1daeSBarry Smith PetscBool printhelp; 1525c6c1daeSBarry Smith PetscInt i, tmp = msize; 1535c6c1daeSBarry Smith 1545c6c1daeSBarry Smith PetscFunctionBegin; 1555f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 1565f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 1575f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 1585f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 1595c6c1daeSBarry Smith nname[0] = '-'; 1605c6c1daeSBarry Smith nname[1] = 0; 1619566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 1629566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 1635c6c1daeSBarry Smith if (printhelp) { 1649566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <", bag->bagprefix ? bag->bagprefix : "", name)); 165*48a46eb9SPierre Jolivet for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%g ", (double)*((PetscReal *)addr) + i)); 1669566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help)); 1675c6c1daeSBarry Smith } 1689566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetRealArray(NULL, bag->bagprefix, nname, (PetscReal *)addr, &tmp, NULL)); 1695c6c1daeSBarry Smith 1709566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 1715c6c1daeSBarry Smith item->dtype = PETSC_REAL; 1725c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 1735f80ce2aSJacob 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); 17402c9f0b5SLisandro Dalcin item->next = NULL; 1755c6c1daeSBarry Smith item->msize = msize; 1769566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 1775c6c1daeSBarry Smith PetscFunctionReturn(0); 1785c6c1daeSBarry Smith } 1795c6c1daeSBarry Smith 1805c6c1daeSBarry Smith /*@C 1815c6c1daeSBarry Smith PetscBagRegisterInt - add an integer value to the bag 1825c6c1daeSBarry Smith 1835c6c1daeSBarry Smith Logically Collective on PetscBag 1845c6c1daeSBarry Smith 185d8d19677SJose E. Roman Input Parameters: 1865c6c1daeSBarry Smith + bag - the bag of values 1875c6c1daeSBarry Smith . addr - location of integer in struct 1885c6c1daeSBarry Smith . mdefault - the initial value 1895c6c1daeSBarry Smith . name - name of the integer 1905c6c1daeSBarry Smith - help - longer string with more information about the value 1915c6c1daeSBarry Smith 1925c6c1daeSBarry Smith Level: beginner 1935c6c1daeSBarry Smith 194db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 195db781477SPatrick Sanan `PetscBagRegisterInt64()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 196db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 1975c6c1daeSBarry Smith 1985c6c1daeSBarry Smith @*/ 1999371c9d4SSatish Balay PetscErrorCode PetscBagRegisterInt(PetscBag bag, void *addr, PetscInt mdefault, const char *name, const char *help) { 2005c6c1daeSBarry Smith PetscBagItem item; 2015c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 2025c6c1daeSBarry Smith PetscBool printhelp; 2035c6c1daeSBarry Smith 2045c6c1daeSBarry Smith PetscFunctionBegin; 2055f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 2065f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 2075f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 2085f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 2095c6c1daeSBarry Smith nname[0] = '-'; 2105c6c1daeSBarry Smith nname[1] = 0; 2119566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 2129566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 213*48a46eb9SPierre Jolivet if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help)); 2149566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &mdefault, NULL)); 2155c6c1daeSBarry Smith 2169566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 2175c6c1daeSBarry Smith item->dtype = PETSC_INT; 2185c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 2195f80ce2aSJacob 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); 22002c9f0b5SLisandro Dalcin item->next = NULL; 2215c6c1daeSBarry Smith item->msize = 1; 2225c6c1daeSBarry Smith *(PetscInt *)addr = mdefault; 2239566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 2245c6c1daeSBarry Smith PetscFunctionReturn(0); 2255c6c1daeSBarry Smith } 2265c6c1daeSBarry Smith 2270d349d43SBarry Smith /*@C 228bafee8b4SSatish Balay PetscBagRegisterInt64 - add an integer value to the bag 2290d349d43SBarry Smith 2300d349d43SBarry Smith Logically Collective on PetscBag 2310d349d43SBarry Smith 232d8d19677SJose E. Roman Input Parameters: 2330d349d43SBarry Smith + bag - the bag of values 2340d349d43SBarry Smith . addr - location of integer in struct 2350d349d43SBarry Smith . mdefault - the initial value 2360d349d43SBarry Smith . name - name of the integer 2370d349d43SBarry Smith - help - longer string with more information about the value 2380d349d43SBarry Smith 2390d349d43SBarry Smith Level: beginner 2400d349d43SBarry Smith 241db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 242db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 243db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 2440d349d43SBarry Smith 2450d349d43SBarry Smith @*/ 2469371c9d4SSatish Balay PetscErrorCode PetscBagRegisterInt64(PetscBag bag, void *addr, PetscInt64 mdefault, const char *name, const char *help) { 2470d349d43SBarry Smith PetscBagItem item; 2480d349d43SBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 2490d349d43SBarry Smith PetscBool printhelp; 2500d349d43SBarry Smith PetscInt odefault = (PetscInt)mdefault; 2510d349d43SBarry Smith PetscBool flg; 2520d349d43SBarry Smith 2530d349d43SBarry Smith PetscFunctionBegin; 2540d349d43SBarry Smith nname[0] = '-'; 2550d349d43SBarry Smith nname[1] = 0; 2569566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 2579566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 258*48a46eb9SPierre Jolivet if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%" PetscInt_FMT ">: %s \n", bag->bagprefix ? bag->bagprefix : "", name, odefault, help)); 2599566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, bag->bagprefix, nname, &odefault, &flg)); 260bafee8b4SSatish Balay if (flg) mdefault = (PetscInt64)odefault; 2610d349d43SBarry Smith 2629566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 2630d349d43SBarry Smith item->dtype = PETSC_INT; 2640d349d43SBarry Smith item->offset = ((char *)addr) - ((char *)bag); 2655f80ce2aSJacob 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); 26602c9f0b5SLisandro Dalcin item->next = NULL; 2670d349d43SBarry Smith item->msize = 1; 268bafee8b4SSatish Balay *(PetscInt64 *)addr = mdefault; 2699566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 2700d349d43SBarry Smith PetscFunctionReturn(0); 2710d349d43SBarry Smith } 2720d349d43SBarry Smith 273dd66f111SBlaise Bourdin /*@C 274dd66f111SBlaise Bourdin PetscBagRegisterBoolArray - add a n logical values to the bag 275dd66f111SBlaise Bourdin 276dd66f111SBlaise Bourdin Logically Collective on PetscBag 277dd66f111SBlaise Bourdin 278d8d19677SJose E. Roman Input Parameters: 279dd66f111SBlaise Bourdin + bag - the bag of values 280dd66f111SBlaise Bourdin . addr - location of boolean array in struct 281dd66f111SBlaise Bourdin . msize - number of entries in array 282dd66f111SBlaise Bourdin . name - name of the boolean array 283dd66f111SBlaise Bourdin - help - longer string with more information about the value 284dd66f111SBlaise Bourdin 285dd66f111SBlaise Bourdin Level: beginner 286dd66f111SBlaise Bourdin 287db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 288db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 289db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 290dd66f111SBlaise Bourdin 291dd66f111SBlaise Bourdin @*/ 2929371c9d4SSatish Balay PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag, void *addr, PetscInt msize, const char *name, const char *help) { 293dd66f111SBlaise Bourdin PetscBagItem item; 294dd66f111SBlaise Bourdin char nname[PETSC_BAG_NAME_LENGTH + 1]; 295dd66f111SBlaise Bourdin PetscBool printhelp; 296dd66f111SBlaise Bourdin PetscInt i, tmp = msize; 297dd66f111SBlaise Bourdin 298dd66f111SBlaise Bourdin PetscFunctionBegin; 2995f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 3005f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 3015f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 3025f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 303dd66f111SBlaise Bourdin nname[0] = '-'; 304dd66f111SBlaise Bourdin nname[1] = 0; 3059566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 3069566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 307dd66f111SBlaise Bourdin if (printhelp) { 3089566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <", bag->bagprefix ? bag->bagprefix : "", name)); 309*48a46eb9SPierre Jolivet for (i = 0; i < msize; i++) PetscCall((*PetscHelpPrintf)(bag->bagcomm, "%" PetscInt_FMT " ", *((PetscInt *)addr) + i)); 3109566063dSJacob Faibussowitsch PetscCall((*PetscHelpPrintf)(bag->bagcomm, ">: %s \n", help)); 311dd66f111SBlaise Bourdin } 3129566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBoolArray(NULL, bag->bagprefix, nname, (PetscBool *)addr, &tmp, NULL)); 313dd66f111SBlaise Bourdin 3149566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 315dd66f111SBlaise Bourdin item->dtype = PETSC_BOOL; 316dd66f111SBlaise Bourdin item->offset = ((char *)addr) - ((char *)bag); 3175f80ce2aSJacob 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); 31802c9f0b5SLisandro Dalcin item->next = NULL; 319dd66f111SBlaise Bourdin item->msize = msize; 3209566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 321dd66f111SBlaise Bourdin PetscFunctionReturn(0); 322dd66f111SBlaise Bourdin } 323dd66f111SBlaise Bourdin 3245c6c1daeSBarry Smith /*@C 3255c6c1daeSBarry Smith PetscBagRegisterString - add a string value to the bag 3265c6c1daeSBarry Smith 3275c6c1daeSBarry Smith Logically Collective on PetscBag 3285c6c1daeSBarry Smith 329d8d19677SJose E. Roman Input Parameters: 3305c6c1daeSBarry Smith + bag - the bag of values 3315c6c1daeSBarry Smith . addr - location of start of string in struct 3325c6c1daeSBarry Smith . msize - length of the string space in the struct 3335c6c1daeSBarry Smith . mdefault - the initial value 3345c6c1daeSBarry Smith . name - name of the string 3355c6c1daeSBarry Smith - help - longer string with more information about the value 3365c6c1daeSBarry Smith 3375c6c1daeSBarry Smith Level: beginner 3385c6c1daeSBarry Smith 3395c6c1daeSBarry Smith Note: The struct should have the field char mystring[msize]; not char *mystring 3405c6c1daeSBarry Smith 341db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 342db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 343c2e3fba1SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 3445c6c1daeSBarry Smith 3455c6c1daeSBarry Smith @*/ 3469371c9d4SSatish Balay PetscErrorCode PetscBagRegisterString(PetscBag bag, void *addr, PetscInt msize, const char *mdefault, const char *name, const char *help) { 3475c6c1daeSBarry Smith PetscBagItem item; 3485c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 3495c6c1daeSBarry Smith PetscBool printhelp; 3505c6c1daeSBarry Smith 3515c6c1daeSBarry Smith PetscFunctionBegin; 3525f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 3535f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 3545f80ce2aSJacob Faibussowitsch PetscValidCharPointer(mdefault, 4); 3555f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 5); 3565f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 6); 3575c6c1daeSBarry Smith nname[0] = '-'; 3585c6c1daeSBarry Smith nname[1] = 0; 3599566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 3609566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 361*48a46eb9SPierre Jolivet if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, mdefault, help)); 3625c6c1daeSBarry Smith 3639566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 3645c6c1daeSBarry Smith item->dtype = PETSC_CHAR; 3655c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 3665f80ce2aSJacob 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); 36702c9f0b5SLisandro Dalcin item->next = NULL; 3685c6c1daeSBarry Smith item->msize = msize; 369*48a46eb9SPierre Jolivet if (mdefault != (char *)addr) PetscCall(PetscStrncpy((char *)addr, mdefault, msize - 1)); 3709566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, bag->bagprefix, nname, (char *)addr, msize, NULL)); 3719566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 3725c6c1daeSBarry Smith PetscFunctionReturn(0); 3735c6c1daeSBarry Smith } 3745c6c1daeSBarry Smith 3755c6c1daeSBarry Smith /*@C 3765c6c1daeSBarry Smith PetscBagRegisterReal - add a real value to the bag 3775c6c1daeSBarry Smith 3785c6c1daeSBarry Smith Logically Collective on PetscBag 3795c6c1daeSBarry Smith 380d8d19677SJose E. Roman Input Parameters: 3815c6c1daeSBarry Smith + bag - the bag of values 3825c6c1daeSBarry Smith . addr - location of double in struct 3835c6c1daeSBarry Smith . mdefault - the initial value 3845c6c1daeSBarry Smith . name - name of the variable 3855c6c1daeSBarry Smith - help - longer string with more information about the value 3865c6c1daeSBarry Smith 3875c6c1daeSBarry Smith Level: beginner 3885c6c1daeSBarry Smith 389db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 390db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 391db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 3925c6c1daeSBarry Smith 3935c6c1daeSBarry Smith @*/ 3949371c9d4SSatish Balay PetscErrorCode PetscBagRegisterReal(PetscBag bag, void *addr, PetscReal mdefault, const char *name, const char *help) { 3955c6c1daeSBarry Smith PetscBagItem item; 3965c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 3975c6c1daeSBarry Smith PetscBool printhelp; 3985c6c1daeSBarry Smith 3995c6c1daeSBarry Smith PetscFunctionBegin; 4005f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 4015f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 4025f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 4035f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 4045c6c1daeSBarry Smith nname[0] = '-'; 4055c6c1daeSBarry Smith nname[1] = 0; 4069566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 4079566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 408*48a46eb9SPierre Jolivet if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%g>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, (double)mdefault, help)); 4099566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetReal(NULL, bag->bagprefix, nname, &mdefault, NULL)); 4105c6c1daeSBarry Smith 4119566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 4125c6c1daeSBarry Smith item->dtype = PETSC_REAL; 4135c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 4145f80ce2aSJacob 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); 41502c9f0b5SLisandro Dalcin item->next = NULL; 4165c6c1daeSBarry Smith item->msize = 1; 4175c6c1daeSBarry Smith *(PetscReal *)addr = mdefault; 4189566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 4195c6c1daeSBarry Smith PetscFunctionReturn(0); 4205c6c1daeSBarry Smith } 4215c6c1daeSBarry Smith 4225c6c1daeSBarry Smith /*@C 4235c6c1daeSBarry Smith PetscBagRegisterScalar - add a real or complex number value to the bag 4245c6c1daeSBarry Smith 4255c6c1daeSBarry Smith Logically Collective on PetscBag 4265c6c1daeSBarry Smith 427d8d19677SJose E. Roman Input Parameters: 4285c6c1daeSBarry Smith + bag - the bag of values 4295c6c1daeSBarry Smith . addr - location of scalar in struct 4305c6c1daeSBarry Smith . mdefault - the initial value 4315c6c1daeSBarry Smith . name - name of the variable 4325c6c1daeSBarry Smith - help - longer string with more information about the value 4335c6c1daeSBarry Smith 4345c6c1daeSBarry Smith Level: beginner 4355c6c1daeSBarry Smith 436db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 437db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 438db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 4395c6c1daeSBarry Smith 4405c6c1daeSBarry Smith @*/ 4419371c9d4SSatish Balay PetscErrorCode PetscBagRegisterScalar(PetscBag bag, void *addr, PetscScalar mdefault, const char *name, const char *help) { 4425c6c1daeSBarry Smith PetscBagItem item; 4435c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 4445c6c1daeSBarry Smith PetscBool printhelp; 4455c6c1daeSBarry Smith 4465c6c1daeSBarry Smith PetscFunctionBegin; 4475f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 4485f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 4495f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 4505f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 4515c6c1daeSBarry Smith nname[0] = '-'; 4525c6c1daeSBarry Smith nname[1] = 0; 4539566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 4549566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 455*48a46eb9SPierre 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)); 4569566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetScalar(NULL, bag->bagprefix, nname, &mdefault, NULL)); 4575c6c1daeSBarry Smith 4589566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 4595c6c1daeSBarry Smith item->dtype = PETSC_SCALAR; 4605c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 4615f80ce2aSJacob 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); 46202c9f0b5SLisandro Dalcin item->next = NULL; 4635c6c1daeSBarry Smith item->msize = 1; 4645c6c1daeSBarry Smith *(PetscScalar *)addr = mdefault; 4659566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 4665c6c1daeSBarry Smith PetscFunctionReturn(0); 4675c6c1daeSBarry Smith } 4685c6c1daeSBarry Smith 4695c6c1daeSBarry Smith /*@C 4705c6c1daeSBarry Smith PetscBagRegisterBool - add a logical value to the bag 4715c6c1daeSBarry Smith 4725c6c1daeSBarry Smith Logically Collective on PetscBag 4735c6c1daeSBarry Smith 474d8d19677SJose E. Roman Input Parameters: 4755c6c1daeSBarry Smith + bag - the bag of values 4765c6c1daeSBarry Smith . addr - location of logical in struct 4775c6c1daeSBarry Smith . mdefault - the initial value 4785c6c1daeSBarry Smith . name - name of the variable 4795c6c1daeSBarry Smith - help - longer string with more information about the value 4805c6c1daeSBarry Smith 4815c6c1daeSBarry Smith Level: beginner 4825c6c1daeSBarry Smith 483db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 484db781477SPatrick Sanan `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 485db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 4865c6c1daeSBarry Smith 4875c6c1daeSBarry Smith @*/ 4889371c9d4SSatish Balay PetscErrorCode PetscBagRegisterBool(PetscBag bag, void *addr, PetscBool mdefault, const char *name, const char *help) { 4895c6c1daeSBarry Smith PetscBagItem item; 4905c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH + 1]; 4915c6c1daeSBarry Smith PetscBool printhelp; 4925c6c1daeSBarry Smith 4935c6c1daeSBarry Smith PetscFunctionBegin; 4945f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 4955f80ce2aSJacob Faibussowitsch PetscValidPointer(addr, 2); 4965f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 4); 4975f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 5); 4985c6c1daeSBarry 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 */ 4995f80ce2aSJacob 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); 5005c6c1daeSBarry Smith nname[0] = '-'; 5015c6c1daeSBarry Smith nname[1] = 0; 5029566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(nname, name, PETSC_BAG_NAME_LENGTH)); 5039566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasHelp(NULL, &printhelp)); 504*48a46eb9SPierre Jolivet if (printhelp) PetscCall((*PetscHelpPrintf)(bag->bagcomm, " -%s%s <%s>: %s \n", bag->bagprefix ? bag->bagprefix : "", name, PetscBools[mdefault], help)); 5059566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, bag->bagprefix, nname, &mdefault, NULL)); 5065c6c1daeSBarry Smith 5079566063dSJacob Faibussowitsch PetscCall(PetscNew(&item)); 5085c6c1daeSBarry Smith item->dtype = PETSC_BOOL; 5095c6c1daeSBarry Smith item->offset = ((char *)addr) - ((char *)bag); 5105f80ce2aSJacob 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); 51102c9f0b5SLisandro Dalcin item->next = NULL; 5125c6c1daeSBarry Smith item->msize = 1; 5135c6c1daeSBarry Smith *(PetscBool *)addr = mdefault; 5149566063dSJacob Faibussowitsch PetscCall(PetscBagRegister_Private(bag, item, name, help)); 5155c6c1daeSBarry Smith PetscFunctionReturn(0); 5165c6c1daeSBarry Smith } 5175c6c1daeSBarry Smith 5185c6c1daeSBarry Smith /*@C 5195c6c1daeSBarry Smith PetscBagDestroy - Destroys a bag values 5205c6c1daeSBarry Smith 5215c6c1daeSBarry Smith Collective on PetscBag 5225c6c1daeSBarry Smith 5235c6c1daeSBarry Smith Input Parameter: 5245c6c1daeSBarry Smith . bag - the bag of values 5255c6c1daeSBarry Smith 5265c6c1daeSBarry Smith Level: beginner 5275c6c1daeSBarry Smith 528db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 529db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 530db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 5315c6c1daeSBarry Smith 5325c6c1daeSBarry Smith @*/ 5339371c9d4SSatish Balay PetscErrorCode PetscBagDestroy(PetscBag *bag) { 5345f80ce2aSJacob Faibussowitsch PetscBagItem nitem; 5355c6c1daeSBarry Smith 5365c6c1daeSBarry Smith PetscFunctionBegin; 5375f80ce2aSJacob Faibussowitsch if (!*bag) PetscFunctionReturn(0); 5385f80ce2aSJacob Faibussowitsch PetscValidPointer(*bag, 1); 5395f80ce2aSJacob Faibussowitsch nitem = (*bag)->bagitems; 5405c6c1daeSBarry Smith while (nitem) { 5415f80ce2aSJacob Faibussowitsch PetscBagItem item = nitem->next; 5425f80ce2aSJacob Faibussowitsch 5439566063dSJacob Faibussowitsch if (nitem->list) PetscCall(PetscStrArrayDestroy(&nitem->list)); 5449566063dSJacob Faibussowitsch PetscCall(PetscFree(nitem)); 5455c6c1daeSBarry Smith nitem = item; 5465c6c1daeSBarry Smith } 5479566063dSJacob Faibussowitsch if ((*bag)->bagprefix) PetscCall(PetscFree((*bag)->bagprefix)); 5489566063dSJacob Faibussowitsch PetscCall(PetscFree(*bag)); 5495c6c1daeSBarry Smith PetscFunctionReturn(0); 5505c6c1daeSBarry Smith } 5515c6c1daeSBarry Smith 5525c6c1daeSBarry Smith /*@ 5535c6c1daeSBarry Smith PetscBagSetFromOptions - Allows setting options from a bag 5545c6c1daeSBarry Smith 5555c6c1daeSBarry Smith Collective on PetscBag 5565c6c1daeSBarry Smith 5575c6c1daeSBarry Smith Input Parameter: 5585c6c1daeSBarry Smith . bag - the bag of values 5595c6c1daeSBarry Smith 5605c6c1daeSBarry Smith Level: beginner 5615c6c1daeSBarry Smith 562db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()` 563db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 564db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagRegisterEnum()` 5655c6c1daeSBarry Smith 5665c6c1daeSBarry Smith @*/ 5679371c9d4SSatish Balay PetscErrorCode PetscBagSetFromOptions(PetscBag bag) { 5685c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 5695c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH + 1], helpname[PETSC_BAG_NAME_LENGTH + PETSC_BAG_HELP_LENGTH + 3]; 5705c6c1daeSBarry Smith PetscInt n; 5715c6c1daeSBarry Smith 5725c6c1daeSBarry Smith PetscFunctionBegin; 5735f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 5749566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(helpname, bag->bagname, sizeof(helpname))); 5759566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(helpname, " ", sizeof(helpname))); 5769566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(helpname, bag->baghelp, sizeof(helpname))); 577d0609cedSBarry Smith PetscOptionsBegin(bag->bagcomm, bag->bagprefix, helpname, NULL); 5785c6c1daeSBarry Smith while (nitem) { 5795c6c1daeSBarry Smith name[0] = '-'; 5805c6c1daeSBarry Smith name[1] = 0; 5819566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(name, nitem->name, sizeof(name))); 5825c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */ 5835c6c1daeSBarry Smith char *value = (char *)(((char *)bag) + nitem->offset); 5849566063dSJacob Faibussowitsch PetscCall(PetscOptionsString(name, nitem->help, "", value, value, nitem->msize, NULL)); 5855c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 5865c6c1daeSBarry Smith PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset); 5875c6c1daeSBarry Smith if (nitem->msize == 1) { 5889566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal(name, nitem->help, "", *value, value, NULL)); 5895c6c1daeSBarry Smith } else { 5905c6c1daeSBarry Smith n = nitem->msize; 5919566063dSJacob Faibussowitsch PetscCall(PetscOptionsRealArray(name, nitem->help, "", value, &n, NULL)); 5925c6c1daeSBarry Smith } 5935c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 5945c6c1daeSBarry Smith PetscScalar *value = (PetscScalar *)(((char *)bag) + nitem->offset); 5959566063dSJacob Faibussowitsch PetscCall(PetscOptionsScalar(name, nitem->help, "", *value, value, NULL)); 5965c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 5975c6c1daeSBarry Smith PetscInt *value = (PetscInt *)(((char *)bag) + nitem->offset); 5985c6c1daeSBarry Smith if (nitem->msize == 1) { 5999566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt(name, nitem->help, "", *value, value, NULL)); 6005c6c1daeSBarry Smith } else { 6015c6c1daeSBarry Smith n = nitem->msize; 6029566063dSJacob Faibussowitsch PetscCall(PetscOptionsIntArray(name, nitem->help, "", value, &n, NULL)); 6035c6c1daeSBarry Smith } 6045c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 6055c6c1daeSBarry Smith PetscEnum *value = (PetscEnum *)(((char *)bag) + nitem->offset); 6065c6c1daeSBarry Smith PetscInt i = 0; 6079371c9d4SSatish Balay while (nitem->list[i++]) 6089371c9d4SSatish Balay ; 6099566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum(name, nitem->help, nitem->list[i - 3], (const char *const *)nitem->list, *value, value, NULL)); 6105c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 6115c6c1daeSBarry Smith PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset); 612dd66f111SBlaise Bourdin if (nitem->msize == 1) { 6139566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool(name, nitem->help, "", *value, value, NULL)); 614dd66f111SBlaise Bourdin } else { 615dd66f111SBlaise Bourdin n = nitem->msize; 6169566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoolArray(name, nitem->help, "", value, &n, NULL)); 617dd66f111SBlaise Bourdin } 6185c6c1daeSBarry Smith } 6195c6c1daeSBarry Smith nitem = nitem->next; 6205c6c1daeSBarry Smith } 621d0609cedSBarry Smith PetscOptionsEnd(); 6225c6c1daeSBarry Smith PetscFunctionReturn(0); 6235c6c1daeSBarry Smith } 6245c6c1daeSBarry Smith 6255c6c1daeSBarry Smith /*@C 6265c6c1daeSBarry Smith PetscBagView - Views a bag of values as either ASCII text or a binary file 6275c6c1daeSBarry Smith 6285c6c1daeSBarry Smith Collective on PetscBag 6295c6c1daeSBarry Smith 630d8d19677SJose E. Roman Input Parameters: 6315c6c1daeSBarry Smith + bag - the bag of values 6325c6c1daeSBarry Smith - viewer - location to view the values 6335c6c1daeSBarry Smith 6345c6c1daeSBarry Smith Level: beginner 6355c6c1daeSBarry Smith 6365c6c1daeSBarry Smith Warning: Currently PETSc bags saved in a binary file can only be read back 6375c6c1daeSBarry Smith in on a machine of the same architecture. Let us know when this is a problem 6385c6c1daeSBarry Smith and we'll fix it. 6395c6c1daeSBarry Smith 640db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagLoad()`, `PetscBagGetData()` 641db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()` 642db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()` 6435c6c1daeSBarry Smith 6445c6c1daeSBarry Smith @*/ 6459371c9d4SSatish Balay PetscErrorCode PetscBagView(PetscBag bag, PetscViewer view) { 6465c6c1daeSBarry Smith PetscBool isascii, isbinary; 6475c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 6485c6c1daeSBarry Smith 6495c6c1daeSBarry Smith PetscFunctionBegin; 6505f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 6515f80ce2aSJacob Faibussowitsch PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 2); 6529566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERASCII, &isascii)); 6539566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary)); 6545c6c1daeSBarry Smith if (isascii) { 6553ffde785SBarry Smith if (bag->bagprefix) { 6569566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object: %s (%s) %s\n", bag->bagname, bag->bagprefix, bag->baghelp)); 6573ffde785SBarry Smith } else { 6589566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "PetscBag Object: %s %s\n", bag->bagname, bag->baghelp)); 6593ffde785SBarry Smith } 6605c6c1daeSBarry Smith while (nitem) { 6615c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { 6625c6c1daeSBarry Smith char *value = (char *)(((char *)bag) + nitem->offset); 6635c6c1daeSBarry Smith char tmp = value[nitem->msize - 1]; /* special handling for fortran chars wihout null terminator */ 6645c6c1daeSBarry Smith value[nitem->msize - 1] = 0; 6659566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %s; %s\n", nitem->name, value, nitem->help)); 6665c6c1daeSBarry Smith value[nitem->msize - 1] = tmp; 6675c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 6685c6c1daeSBarry Smith PetscReal *value = (PetscReal *)(((char *)bag) + nitem->offset); 6695c6c1daeSBarry Smith PetscInt i; 6709566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = ", nitem->name)); 671*48a46eb9SPierre Jolivet for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%g ", (double)value[i])); 6729566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help)); 6735c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 6745c6c1daeSBarry Smith PetscScalar value = *(PetscScalar *)(((char *)bag) + nitem->offset); 6755c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 6768627564fSBarry Smith if ((double)PetscImaginaryPart(value)) { 6779566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %g + %gi; %s\n", nitem->name, (double)PetscRealPart(value), (double)PetscImaginaryPart(value), nitem->help)); 6788627564fSBarry Smith } else { 6799566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %g; %s\n", nitem->name, (double)PetscRealPart(value), nitem->help)); 6808627564fSBarry Smith } 6815c6c1daeSBarry Smith #else 6829566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %g; %s\n", nitem->name, (double)value, nitem->help)); 6835c6c1daeSBarry Smith #endif 6845c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 6855c6c1daeSBarry Smith PetscInt i, *value = (PetscInt *)(((char *)bag) + nitem->offset); 6869566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = ", nitem->name)); 687*48a46eb9SPierre Jolivet for (i = 0; i < nitem->msize; i++) PetscCall(PetscViewerASCIIPrintf(view, "%" PetscInt_FMT " ", value[i])); 6889566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help)); 6895c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 690dd66f111SBlaise Bourdin PetscBool *value = (PetscBool *)(((char *)bag) + nitem->offset); 691dd66f111SBlaise Bourdin PetscInt i; 6925c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 6939566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = ", nitem->name)); 694dd66f111SBlaise Bourdin for (i = 0; i < nitem->msize; i++) { 695dd66f111SBlaise Bourdin if (((int)value[i]) == -1) value[i] = PETSC_TRUE; 6965c6c1daeSBarry 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 */ 6975f80ce2aSJacob 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])); 6989566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s", PetscBools[value[i]])); 699dd66f111SBlaise Bourdin } 7009566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, "; %s\n", nitem->help)); 7015c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 7025c6c1daeSBarry Smith PetscEnum value = *(PetscEnum *)(((char *)bag) + nitem->offset); 7035c6c1daeSBarry Smith PetscInt i = 0; 7049371c9d4SSatish Balay while (nitem->list[i++]) 7059371c9d4SSatish Balay ; 7069566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(view, " %s = %s; (%s) %s\n", nitem->name, nitem->list[value], nitem->list[i - 3], nitem->help)); 7075c6c1daeSBarry Smith } 7085c6c1daeSBarry Smith nitem = nitem->next; 7095c6c1daeSBarry Smith } 7105c6c1daeSBarry Smith } else if (isbinary) { 7115c6c1daeSBarry Smith PetscInt classid = PETSC_BAG_FILE_CLASSID, dtype; 7125c6c1daeSBarry Smith PetscInt deprecatedbagsize = 0; 713a261c58fSBarry Smith PetscViewerFormat format; 7149566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &classid, 1, PETSC_INT)); 7159566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &deprecatedbagsize, 1, PETSC_INT)); 7169566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &bag->count, 1, PETSC_INT)); 7179566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, bag->bagname, PETSC_BAG_NAME_LENGTH, PETSC_CHAR)); 7189566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, PETSC_CHAR)); 7195c6c1daeSBarry Smith while (nitem) { 7209566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &nitem->offset, 1, PETSC_INT)); 7215c6c1daeSBarry Smith dtype = (PetscInt)nitem->dtype; 7229566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &dtype, 1, PETSC_INT)); 7239566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, nitem->name, PETSC_BAG_NAME_LENGTH, PETSC_CHAR)); 7249566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, nitem->help, PETSC_BAG_HELP_LENGTH, PETSC_CHAR)); 7259566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, &nitem->msize, 1, PETSC_INT)); 7265c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 7275c6c1daeSBarry Smith if (dtype == PETSC_BOOL && ((*(int *)(((char *)bag) + nitem->offset) == -1))) *(int *)(((char *)bag) + nitem->offset) = PETSC_TRUE; 7285c6c1daeSBarry Smith 7299566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(view, (((char *)bag) + nitem->offset), nitem->msize, nitem->dtype)); 730*48a46eb9SPierre Jolivet if (dtype == PETSC_ENUM) PetscCall(PetscViewerBinaryWriteStringArray(view, (const char *const *)nitem->list)); 7315c6c1daeSBarry Smith nitem = nitem->next; 7325c6c1daeSBarry Smith } 7339566063dSJacob Faibussowitsch PetscCall(PetscViewerGetFormat(view, &format)); 734a261c58fSBarry Smith if (format == PETSC_VIEWER_BINARY_MATLAB) { 735a261c58fSBarry Smith MPI_Comm comm; 736a261c58fSBarry Smith FILE *info; 7379566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)view, &comm)); 7389566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetInfoPointer(view, &info)); 7399566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(comm, info, "#--- begin code written by PetscViewerBinary for MATLAB format ---#\n")); 7409566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(comm, info, "#$$ Set.%s = PetscBinaryRead(fd);\n", bag->bagname)); 7419566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(comm, info, "#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n")); 742a261c58fSBarry Smith } 743a261c58fSBarry Smith } 7445c6c1daeSBarry Smith PetscFunctionReturn(0); 7455c6c1daeSBarry Smith } 7465c6c1daeSBarry Smith 7475c6c1daeSBarry Smith /*@C 748173f9484SMatthew G. Knepley PetscBagViewFromOptions - Processes command line options to determine if/how a PetscBag is to be viewed. 749173f9484SMatthew G. Knepley 750173f9484SMatthew G. Knepley Collective on PetscBag 751173f9484SMatthew G. Knepley 752173f9484SMatthew G. Knepley Input Parameters: 753173f9484SMatthew G. Knepley + obj - the object 754173f9484SMatthew G. Knepley . bobj - optional other object that provides prefix (if NULL then the prefix in obj is used) 755173f9484SMatthew G. Knepley - optionname - option to activate viewing 756478db826SMatthew G. Knepley 757173f9484SMatthew G. Knepley Level: intermediate 758478db826SMatthew G. Knepley 759db781477SPatrick Sanan .seealso: `PetscBagCreate()`, `PetscBag`, `PetscViewer` 760173f9484SMatthew G. Knepley @*/ 7619371c9d4SSatish Balay PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[]) { 762173f9484SMatthew G. Knepley static PetscBool incall = PETSC_FALSE; 763173f9484SMatthew G. Knepley PetscViewer viewer; 764173f9484SMatthew G. Knepley PetscViewerFormat format; 765173f9484SMatthew G. Knepley const char *prefix, *bprefix = NULL; 766173f9484SMatthew G. Knepley PetscBool flg; 767173f9484SMatthew G. Knepley 768173f9484SMatthew G. Knepley PetscFunctionBegin; 769173f9484SMatthew G. Knepley if (incall) PetscFunctionReturn(0); 770173f9484SMatthew G. Knepley incall = PETSC_TRUE; 7715f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 7729566063dSJacob Faibussowitsch if (bobj) PetscCall(PetscObjectGetOptionsPrefix(bobj, &bprefix)); 773173f9484SMatthew G. Knepley prefix = bobj ? bprefix : bag->bagprefix; 7749566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg)); 775173f9484SMatthew G. Knepley if (flg) { 7769566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, format)); 7779566063dSJacob Faibussowitsch PetscCall(PetscBagView(bag, viewer)); 7789566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 7799566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 7809566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 781173f9484SMatthew G. Knepley } 782173f9484SMatthew G. Knepley incall = PETSC_FALSE; 783173f9484SMatthew G. Knepley PetscFunctionReturn(0); 784173f9484SMatthew G. Knepley } 785173f9484SMatthew G. Knepley 786173f9484SMatthew G. Knepley /*@C 7875c6c1daeSBarry Smith PetscBagLoad - Loads a bag of values from a binary file 7885c6c1daeSBarry Smith 7895c6c1daeSBarry Smith Collective on PetscViewer 7905c6c1daeSBarry Smith 791d8d19677SJose E. Roman Input Parameters: 7925c6c1daeSBarry Smith + viewer - file to load values from 7935c6c1daeSBarry Smith - bag - the bag of values 7945c6c1daeSBarry Smith 79595452b02SPatrick Sanan Notes: 79695452b02SPatrick Sanan You must have created and registered all the fields in the bag before loading into it. 7975c6c1daeSBarry Smith 7985c6c1daeSBarry Smith Notes: 7995c6c1daeSBarry Smith Level: beginner 8005c6c1daeSBarry Smith 801db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagDestroy()`, `PetscBagView()`, `PetscBagGetData()` 802db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 803db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagGetName()`, `PetscBagRegisterEnum()` 8045c6c1daeSBarry Smith 8055c6c1daeSBarry Smith @*/ 8069371c9d4SSatish Balay PetscErrorCode PetscBagLoad(PetscViewer view, PetscBag bag) { 8075c6c1daeSBarry Smith PetscBool isbinary; 8085f80ce2aSJacob Faibussowitsch PetscInt classid, bagcount, dtype, msize, offset, deprecatedbagsize; 8095c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH], help[PETSC_BAG_HELP_LENGTH], **list; 8105c6c1daeSBarry Smith PetscBagItem nitem; 8115c6c1daeSBarry Smith MPI_Comm comm; 8125c6c1daeSBarry Smith PetscMPIInt flag; 8135c6c1daeSBarry Smith 8145c6c1daeSBarry Smith PetscFunctionBegin; 8155f80ce2aSJacob Faibussowitsch PetscValidHeaderSpecific(view, PETSC_VIEWER_CLASSID, 1); 8165f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 2); 8179566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)view, &comm)); 8189566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_compare(comm, bag->bagcomm, &flag)); 8195f80ce2aSJacob Faibussowitsch PetscCheck(flag == MPI_CONGRUENT || flag == MPI_IDENT, PETSC_COMM_SELF, PETSC_ERR_ARG_NOTSAMECOMM, "Different communicators in the viewer and bag"); 8209566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)view, PETSCVIEWERBINARY, &isbinary)); 8215f80ce2aSJacob Faibussowitsch PetscCheck(isbinary, PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for this viewer type"); 8225c6c1daeSBarry Smith 8239566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &classid, 1, NULL, PETSC_INT)); 8245f80ce2aSJacob Faibussowitsch PetscCheck(classid == PETSC_BAG_FILE_CLASSID, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Not PetscBag next in binary file"); 8259566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &deprecatedbagsize, 1, NULL, PETSC_INT)); 8269566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &bagcount, 1, NULL, PETSC_INT)); 8275f80ce2aSJacob 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); 8289566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, bag->bagname, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR)); 8299566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, bag->baghelp, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR)); 8305c6c1daeSBarry Smith 8315c6c1daeSBarry Smith nitem = bag->bagitems; 8325f80ce2aSJacob Faibussowitsch for (PetscInt i = 0; i < bagcount; i++) { 8339566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &offset, 1, NULL, PETSC_INT)); 8345c6c1daeSBarry Smith /* ignore the offset in the file */ 8359566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &dtype, 1, NULL, PETSC_INT)); 8369566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, name, PETSC_BAG_NAME_LENGTH, NULL, PETSC_CHAR)); 8379566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, help, PETSC_BAG_HELP_LENGTH, NULL, PETSC_CHAR)); 8389566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, &msize, 1, NULL, PETSC_INT)); 8395c6c1daeSBarry Smith 8405c6c1daeSBarry Smith if (dtype == (PetscInt)PETSC_CHAR) { 8419566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_CHAR)); 8425c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_REAL) { 8439566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_REAL)); 8445c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_SCALAR) { 8459566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_SCALAR)); 8465c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_INT) { 8479566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_INT)); 8485c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_BOOL) { 8499566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, msize, NULL, PETSC_BOOL)); 8505c6c1daeSBarry Smith } else if (dtype == (PetscInt)PETSC_ENUM) { 8519566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(view, ((char *)bag) + nitem->offset, 1, NULL, PETSC_ENUM)); 8529566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryReadStringArray(view, &list)); 8535c6c1daeSBarry Smith /* don't need to save list because it is already registered in the bag */ 8549566063dSJacob Faibussowitsch PetscCall(PetscFree(list)); 8555c6c1daeSBarry Smith } 8565c6c1daeSBarry Smith nitem = nitem->next; 8575c6c1daeSBarry Smith } 8585c6c1daeSBarry Smith PetscFunctionReturn(0); 8595c6c1daeSBarry Smith } 8605c6c1daeSBarry Smith 861e8976759SBarry Smith /*@C 8625c6c1daeSBarry Smith PetscBagCreate - Create a bag of values 8635c6c1daeSBarry Smith 864d083f849SBarry Smith Collective 8655c6c1daeSBarry Smith 8665c6c1daeSBarry Smith Level: Intermediate 8675c6c1daeSBarry Smith 8685c6c1daeSBarry Smith Input Parameters: 8695c6c1daeSBarry Smith + comm - communicator to share bag 8705c6c1daeSBarry Smith - bagsize - size of the C structure holding the values 8715c6c1daeSBarry Smith 8725c6c1daeSBarry Smith Output Parameter: 8735c6c1daeSBarry Smith . bag - the bag of values 8745c6c1daeSBarry Smith 8755c6c1daeSBarry Smith Notes: 8765c6c1daeSBarry Smith The size of the A struct must be small enough to fit in a PetscInt; by default 8775c6c1daeSBarry Smith PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length. 8785c6c1daeSBarry Smith The warning about casting to a shorter length can be ignored below unless your A struct is too large 8795c6c1daeSBarry Smith 880db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 881db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 882db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()` 8835c6c1daeSBarry Smith @*/ 8849371c9d4SSatish Balay PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag) { 8855f80ce2aSJacob Faibussowitsch const size_t totalsize = bagsize + sizeof(struct _n_PetscBag) + sizeof(PetscScalar); 8865c6c1daeSBarry Smith 8875c6c1daeSBarry Smith PetscFunctionBegin; 8885f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 3); 8899566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Creating Bag with total size %d\n", (int)totalsize)); 8909566063dSJacob Faibussowitsch PetscCall(PetscCalloc(totalsize, bag)); 891a297a907SKarl Rupp 8925f80ce2aSJacob Faibussowitsch (*bag)->bagsize = totalsize; 8935c6c1daeSBarry Smith (*bag)->bagcomm = comm; 8940298fd71SBarry Smith (*bag)->bagprefix = NULL; 8955c6c1daeSBarry Smith (*bag)->structlocation = (void *)(((char *)(*bag)) + sizeof(PetscScalar) * (sizeof(struct _n_PetscBag) / sizeof(PetscScalar)) + sizeof(PetscScalar)); 8965c6c1daeSBarry Smith PetscFunctionReturn(0); 8975c6c1daeSBarry Smith } 8985c6c1daeSBarry Smith 8995c6c1daeSBarry Smith /*@C 9005c6c1daeSBarry Smith PetscBagSetName - Sets the name of a bag of values 9015c6c1daeSBarry Smith 9025c6c1daeSBarry Smith Not Collective 9035c6c1daeSBarry Smith 9045c6c1daeSBarry Smith Level: Intermediate 9055c6c1daeSBarry Smith 9065c6c1daeSBarry Smith Input Parameters: 9075c6c1daeSBarry Smith + bag - the bag of values 9085c6c1daeSBarry Smith . name - the name assigned to the bag 9095c6c1daeSBarry Smith - help - help message for bag 9105c6c1daeSBarry Smith 911db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 912db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 913db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()` 9145c6c1daeSBarry Smith @*/ 9155c6c1daeSBarry Smith 9169371c9d4SSatish Balay PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help) { 9175c6c1daeSBarry Smith PetscFunctionBegin; 9185f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 9195f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name, 2); 9205f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help, 3); 9219566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(bag->bagname, name, PETSC_BAG_NAME_LENGTH - 1)); 9229566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(bag->baghelp, help, PETSC_BAG_HELP_LENGTH - 1)); 9235c6c1daeSBarry Smith PetscFunctionReturn(0); 9245c6c1daeSBarry Smith } 9255c6c1daeSBarry Smith 9265c6c1daeSBarry Smith /*@C 9275c6c1daeSBarry Smith PetscBagGetName - Gets the name of a bag of values 9285c6c1daeSBarry Smith 9295c6c1daeSBarry Smith Not Collective 9305c6c1daeSBarry Smith 9315c6c1daeSBarry Smith Level: Intermediate 9325c6c1daeSBarry Smith 9335c6c1daeSBarry Smith Input Parameter: 9345c6c1daeSBarry Smith . bag - the bag of values 9355c6c1daeSBarry Smith 9365c6c1daeSBarry Smith Output Parameter: 9375c6c1daeSBarry Smith . name - the name assigned to the bag 9385c6c1daeSBarry Smith 939db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()`, `PetscBagGetData()` 940db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 941db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()` 9425c6c1daeSBarry Smith @*/ 9439371c9d4SSatish Balay PetscErrorCode PetscBagGetName(PetscBag bag, char **name) { 9445c6c1daeSBarry Smith PetscFunctionBegin; 9455f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 9465f80ce2aSJacob Faibussowitsch PetscValidPointer(name, 2); 9475c6c1daeSBarry Smith *name = bag->bagname; 9485c6c1daeSBarry Smith PetscFunctionReturn(0); 9495c6c1daeSBarry Smith } 9505c6c1daeSBarry Smith 9515c6c1daeSBarry Smith /*@C 9525c6c1daeSBarry Smith PetscBagGetData - Gives back the user - access to memory that 9535c6c1daeSBarry Smith should be used for storing user-data-structure 9545c6c1daeSBarry Smith 9555c6c1daeSBarry Smith Not Collective 9565c6c1daeSBarry Smith 9575c6c1daeSBarry Smith Level: Intermediate 9585c6c1daeSBarry Smith 9595c6c1daeSBarry Smith Input Parameter: 9605c6c1daeSBarry Smith . bag - the bag of values 9615c6c1daeSBarry Smith 9625c6c1daeSBarry Smith Output Parameter: 9635c6c1daeSBarry Smith . data - pointer to memory that will have user-data-structure 9645c6c1daeSBarry Smith 965db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagSetName()`, `PetscBagView()`, `PetscBagLoad()` 966db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 967db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()` 9685c6c1daeSBarry Smith @*/ 9699371c9d4SSatish Balay PetscErrorCode PetscBagGetData(PetscBag bag, void **data) { 9705c6c1daeSBarry Smith PetscFunctionBegin; 9715f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 9725f80ce2aSJacob Faibussowitsch PetscValidPointer(data, 2); 9735c6c1daeSBarry Smith *data = bag->structlocation; 9745c6c1daeSBarry Smith PetscFunctionReturn(0); 9755c6c1daeSBarry Smith } 9765c6c1daeSBarry Smith 9775c6c1daeSBarry Smith /*@C 9785c6c1daeSBarry Smith PetscBagSetOptionsPrefix - Sets the prefix used for searching for all 9795c6c1daeSBarry Smith PetscBag items in the options database. 9805c6c1daeSBarry Smith 9815c6c1daeSBarry Smith Logically collective on Bag. 9825c6c1daeSBarry Smith 9835c6c1daeSBarry Smith Level: Intermediate 9845c6c1daeSBarry Smith 9855c6c1daeSBarry Smith Input Parameters: 9865c6c1daeSBarry Smith + bag - the bag of values 9875c6c1daeSBarry Smith - prefix - the prefix to prepend all Bag item names with. 9885c6c1daeSBarry Smith 9895c6c1daeSBarry Smith NOTES: Must be called prior to registering any of the bag items. 9905c6c1daeSBarry Smith 991db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()` 992db781477SPatrick Sanan `PetscBagSetFromOptions()`, `PetscBagCreate()`, `PetscBagDestroy()`, `PetscBagRegisterEnum()` 9935c6c1daeSBarry Smith @*/ 9945c6c1daeSBarry Smith 9959371c9d4SSatish Balay PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[]) { 9965c6c1daeSBarry Smith PetscFunctionBegin; 9975f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 9985f80ce2aSJacob Faibussowitsch if (pre) { 9995f80ce2aSJacob Faibussowitsch PetscValidCharPointer(pre, 2); 10005f80ce2aSJacob Faibussowitsch PetscCheck(pre[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Options prefix should not begin with a hyphen"); 10019566063dSJacob Faibussowitsch PetscCall(PetscFree(bag->bagprefix)); 10029566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(pre, &(bag->bagprefix))); 10039566063dSJacob Faibussowitsch } else PetscCall(PetscFree(bag->bagprefix)); 10045c6c1daeSBarry Smith PetscFunctionReturn(0); 10055c6c1daeSBarry Smith } 1006ffb7e86cSMatthew G. Knepley 1007ffb7e86cSMatthew G. Knepley /*@C 1008ffb7e86cSMatthew G. Knepley PetscBagGetNames - Get the names of all entries in the bag 1009ffb7e86cSMatthew G. Knepley 1010ffb7e86cSMatthew G. Knepley Not collective 1011ffb7e86cSMatthew G. Knepley 1012ffb7e86cSMatthew G. Knepley Input Parameters: 1013ffb7e86cSMatthew G. Knepley + bag - the bag of values 1014ffb7e86cSMatthew G. Knepley - names - array of the correct size to hold names 1015ffb7e86cSMatthew G. Knepley 1016ffb7e86cSMatthew G. Knepley Output Parameter: 1017ffb7e86cSMatthew G. Knepley . names - array of char pointers for names 1018ffb7e86cSMatthew G. Knepley 1019ffb7e86cSMatthew G. Knepley Level: intermediate 1020ffb7e86cSMatthew G. Knepley 1021db781477SPatrick Sanan .seealso: `PetscBag`, `PetscBagGetName()`, `PetscBagSetName()`, `PetscBagCreate()`, `PetscBagGetData()` 1022db781477SPatrick Sanan `PetscBagRegisterReal()`, `PetscBagRegisterInt()`, `PetscBagRegisterBool()`, `PetscBagRegisterScalar()`, `PetscBagRegisterEnum()` 1023ffb7e86cSMatthew G. Knepley @*/ 10249371c9d4SSatish Balay PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[]) { 1025ffb7e86cSMatthew G. Knepley PetscBagItem nitem = bag->bagitems; 1026ffb7e86cSMatthew G. Knepley 1027ffb7e86cSMatthew G. Knepley PetscFunctionBegin; 10285f80ce2aSJacob Faibussowitsch PetscValidPointer(bag, 1); 10295f80ce2aSJacob Faibussowitsch PetscValidPointer(names, 2); 10305f80ce2aSJacob Faibussowitsch for (PetscInt n = 0; nitem; ++n, nitem = nitem->next) names[n] = nitem->name; 1031ffb7e86cSMatthew G. Knepley PetscFunctionReturn(0); 1032ffb7e86cSMatthew G. Knepley } 1033