15c6c1daeSBarry Smith 29bb5e83dSBarry Smith #include <petsc-private/bagimpl.h> /*I "petscbag.h" I*/ 3665c2dedSJed Brown #include <petscviewer.h> 45c6c1daeSBarry Smith 55c6c1daeSBarry Smith #undef __FUNCT__ 65c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegister_Private" 75c6c1daeSBarry Smith /* 85c6c1daeSBarry Smith Adds item to the linked list in a bag 95c6c1daeSBarry Smith */ 105c6c1daeSBarry Smith static PetscErrorCode PetscBagRegister_Private(PetscBag bag,PetscBagItem item,const char *name,const char *help) 115c6c1daeSBarry Smith { 125c6c1daeSBarry Smith PetscErrorCode ierr; 135c6c1daeSBarry Smith 145c6c1daeSBarry Smith PetscFunctionBegin; 155c6c1daeSBarry Smith ierr = PetscStrncpy(item->name,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 165c6c1daeSBarry Smith ierr = PetscStrncpy(item->help,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr); 175c6c1daeSBarry Smith if (!bag->bagitems) bag->bagitems = item; 185c6c1daeSBarry Smith else { 195c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 205c6c1daeSBarry Smith while (nitem->next) { 215c6c1daeSBarry Smith nitem = nitem->next; 225c6c1daeSBarry Smith } 235c6c1daeSBarry Smith nitem->next = item; 245c6c1daeSBarry Smith } 255c6c1daeSBarry Smith bag->count++; 265c6c1daeSBarry Smith PetscFunctionReturn(0); 275c6c1daeSBarry Smith } 285c6c1daeSBarry Smith 295c6c1daeSBarry Smith #undef __FUNCT__ 305c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterEnum" 315c6c1daeSBarry Smith /*@C 325c6c1daeSBarry Smith PetscBagRegisterEnum - add an enum value to the bag 335c6c1daeSBarry Smith 345c6c1daeSBarry Smith Logically Collective on PetscBag 355c6c1daeSBarry Smith 365c6c1daeSBarry Smith Input Parameter: 375c6c1daeSBarry Smith + bag - the bag of values 385c6c1daeSBarry Smith . addr - location of enum in struct 395c6c1daeSBarry Smith . mdefault - the initial value 405c6c1daeSBarry Smith . list - array of strings containing names of enum values followed by enum name followed by enum prefix 415c6c1daeSBarry Smith - help - longer string with more information about the value 425c6c1daeSBarry Smith 435c6c1daeSBarry Smith Level: beginner 445c6c1daeSBarry Smith 455c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 465c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 475c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName() 485c6c1daeSBarry Smith 495c6c1daeSBarry Smith @*/ 505c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterEnum(PetscBag bag,void *addr,const char *const *list,PetscEnum mdefault, const char *name, const char *help) 515c6c1daeSBarry Smith { 525c6c1daeSBarry Smith PetscErrorCode ierr; 535c6c1daeSBarry Smith PetscBagItem item; 545c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 555c6c1daeSBarry Smith PetscBool printhelp; 565c6c1daeSBarry Smith PetscInt i = 0; 575c6c1daeSBarry Smith 585c6c1daeSBarry Smith PetscFunctionBegin; 595c6c1daeSBarry Smith nname[0] = '-'; 605c6c1daeSBarry Smith nname[1] = 0; 615c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 620298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr); 635c6c1daeSBarry Smith if (printhelp) { 645c6c1daeSBarry Smith while (list[i++]) ; 655c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: (%s) %s (choose one of) ",bag->bagprefix ? bag->bagprefix : "",name,list[mdefault],list[i-3],help);CHKERRQ(ierr); 665c6c1daeSBarry Smith for (i=0; list[i+2]; i++) { 675c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," %s",list[i]);CHKERRQ(ierr); 685c6c1daeSBarry Smith } 695c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,"\n");CHKERRQ(ierr); 705c6c1daeSBarry Smith } 710298fd71SBarry Smith ierr = PetscOptionsGetEnum(bag->bagprefix,nname,list,&mdefault,NULL);CHKERRQ(ierr); 725c6c1daeSBarry Smith 73*b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 745c6c1daeSBarry Smith item->dtype = PETSC_ENUM; 755c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 765c6c1daeSBarry Smith if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 775c6c1daeSBarry Smith item->next = 0; 785c6c1daeSBarry Smith item->msize = 1; 795c6c1daeSBarry Smith ierr = PetscStrArrayallocpy(list,(char***)&item->list);CHKERRQ(ierr); 805c6c1daeSBarry Smith *(PetscEnum*)addr = mdefault; 815c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 825c6c1daeSBarry Smith PetscFunctionReturn(0); 835c6c1daeSBarry Smith } 845c6c1daeSBarry Smith 855c6c1daeSBarry Smith #undef __FUNCT__ 865c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterIntArray" 875c6c1daeSBarry Smith /*@C 885c6c1daeSBarry Smith PetscBagRegisterIntArray - add an integer value to the bag 895c6c1daeSBarry Smith 905c6c1daeSBarry Smith Logically Collective on PetscBag 915c6c1daeSBarry Smith 925c6c1daeSBarry Smith Input Parameter: 935c6c1daeSBarry Smith + bag - the bag of values 945c6c1daeSBarry Smith . addr - location of integer in struct 955c6c1daeSBarry Smith . msize - number of entries in array 965c6c1daeSBarry Smith . name - name of the integer array 975c6c1daeSBarry Smith - help - longer string with more information about the value 985c6c1daeSBarry Smith 995c6c1daeSBarry Smith Level: beginner 1005c6c1daeSBarry Smith 1015c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 1025c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 1035c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 1045c6c1daeSBarry Smith 1055c6c1daeSBarry Smith @*/ 1065c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterIntArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help) 1075c6c1daeSBarry Smith { 1085c6c1daeSBarry Smith PetscErrorCode ierr; 1095c6c1daeSBarry Smith PetscBagItem item; 1105c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 1115c6c1daeSBarry Smith PetscBool printhelp; 1125c6c1daeSBarry Smith PetscInt i,tmp = msize; 1135c6c1daeSBarry Smith 1145c6c1daeSBarry Smith PetscFunctionBegin; 1155c6c1daeSBarry Smith /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/ 1165c6c1daeSBarry Smith nname[0] = '-'; 1175c6c1daeSBarry Smith nname[1] = 0; 1185c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 1190298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr); 1205c6c1daeSBarry Smith if (printhelp) { 1215c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix ? bag->bagprefix : "",name);CHKERRQ(ierr); 1225c6c1daeSBarry Smith for (i=0; i<msize; i++) { 1235c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr); 1245c6c1daeSBarry Smith } 1255c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); 1265c6c1daeSBarry Smith } 1270298fd71SBarry Smith ierr = PetscOptionsGetIntArray(bag->bagprefix,nname,(PetscInt*)addr,&tmp,NULL);CHKERRQ(ierr); 1285c6c1daeSBarry Smith 129*b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 1305c6c1daeSBarry Smith item->dtype = PETSC_INT; 1315c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 1325c6c1daeSBarry Smith if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 1335c6c1daeSBarry Smith item->next = 0; 1345c6c1daeSBarry Smith item->msize = msize; 1355c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 1365c6c1daeSBarry Smith PetscFunctionReturn(0); 1375c6c1daeSBarry Smith } 1385c6c1daeSBarry Smith 1395c6c1daeSBarry Smith #undef __FUNCT__ 1405c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterRealArray" 1415c6c1daeSBarry Smith /*@C 1425c6c1daeSBarry Smith PetscBagRegisterRealArray - add an real array to the bag 1435c6c1daeSBarry Smith 1445c6c1daeSBarry Smith Logically Collective on PetscBag 1455c6c1daeSBarry Smith 1465c6c1daeSBarry Smith Input Parameter: 1475c6c1daeSBarry Smith + bag - the bag of values 1485c6c1daeSBarry Smith . addr - location of real array in struct 1495c6c1daeSBarry Smith . msize - number of entries in array 1505c6c1daeSBarry Smith . name - name of the integer array 1515c6c1daeSBarry Smith - help - longer string with more information about the value 1525c6c1daeSBarry Smith 1535c6c1daeSBarry Smith Level: beginner 1545c6c1daeSBarry Smith 1555c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 1565c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 1575c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 1585c6c1daeSBarry Smith 1595c6c1daeSBarry Smith @*/ 1605c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterRealArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help) 1615c6c1daeSBarry Smith { 1625c6c1daeSBarry Smith PetscErrorCode ierr; 1635c6c1daeSBarry Smith PetscBagItem item; 1645c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 1655c6c1daeSBarry Smith PetscBool printhelp; 1665c6c1daeSBarry Smith PetscInt i,tmp = msize; 1675c6c1daeSBarry Smith 1685c6c1daeSBarry Smith PetscFunctionBegin; 1695c6c1daeSBarry Smith /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/ 1705c6c1daeSBarry Smith nname[0] = '-'; 1715c6c1daeSBarry Smith nname[1] = 0; 1725c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 1730298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr); 1745c6c1daeSBarry Smith if (printhelp) { 1755c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix ? bag->bagprefix : "",name);CHKERRQ(ierr); 1765c6c1daeSBarry Smith for (i=0; i<msize; i++) { 1775c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,"%G ",*((PetscReal*)addr)+i);CHKERRQ(ierr); 1785c6c1daeSBarry Smith } 1795c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); 1805c6c1daeSBarry Smith } 1810298fd71SBarry Smith ierr = PetscOptionsGetRealArray(bag->bagprefix,nname,(PetscReal*)addr,&tmp,NULL);CHKERRQ(ierr); 1825c6c1daeSBarry Smith 183*b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 1845c6c1daeSBarry Smith item->dtype = PETSC_REAL; 1855c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 1865c6c1daeSBarry Smith if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 1875c6c1daeSBarry Smith item->next = 0; 1885c6c1daeSBarry Smith item->msize = msize; 1895c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 1905c6c1daeSBarry Smith PetscFunctionReturn(0); 1915c6c1daeSBarry Smith } 1925c6c1daeSBarry Smith 1935c6c1daeSBarry Smith #undef __FUNCT__ 1945c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterInt" 1955c6c1daeSBarry Smith /*@C 1965c6c1daeSBarry Smith PetscBagRegisterInt - add an integer value to the bag 1975c6c1daeSBarry Smith 1985c6c1daeSBarry Smith Logically Collective on PetscBag 1995c6c1daeSBarry Smith 2005c6c1daeSBarry Smith Input Parameter: 2015c6c1daeSBarry Smith + bag - the bag of values 2025c6c1daeSBarry Smith . addr - location of integer in struct 2035c6c1daeSBarry Smith . mdefault - the initial value 2045c6c1daeSBarry Smith . name - name of the integer 2055c6c1daeSBarry Smith - help - longer string with more information about the value 2065c6c1daeSBarry Smith 2075c6c1daeSBarry Smith Level: beginner 2085c6c1daeSBarry Smith 2095c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 2105c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 2115c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 2125c6c1daeSBarry Smith 2135c6c1daeSBarry Smith @*/ 2145c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterInt(PetscBag bag,void *addr,PetscInt mdefault,const char *name,const char *help) 2155c6c1daeSBarry Smith { 2165c6c1daeSBarry Smith PetscErrorCode ierr; 2175c6c1daeSBarry Smith PetscBagItem item; 2185c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 2195c6c1daeSBarry Smith PetscBool printhelp; 2205c6c1daeSBarry Smith 2215c6c1daeSBarry Smith PetscFunctionBegin; 2225c6c1daeSBarry Smith nname[0] = '-'; 2235c6c1daeSBarry Smith nname[1] = 0; 2245c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 2250298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr); 2265c6c1daeSBarry Smith if (printhelp) { 2275c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%d>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr); 2285c6c1daeSBarry Smith } 2290298fd71SBarry Smith ierr = PetscOptionsGetInt(bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 2305c6c1daeSBarry Smith 231*b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 2325c6c1daeSBarry Smith item->dtype = PETSC_INT; 2335c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 2345c6c1daeSBarry Smith if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 2355c6c1daeSBarry Smith item->next = 0; 2365c6c1daeSBarry Smith item->msize = 1; 2375c6c1daeSBarry Smith *(PetscInt*)addr = mdefault; 2385c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 2395c6c1daeSBarry Smith PetscFunctionReturn(0); 2405c6c1daeSBarry Smith } 2415c6c1daeSBarry Smith 2425c6c1daeSBarry Smith #undef __FUNCT__ 243dd66f111SBlaise Bourdin #define __FUNCT__ "PetscBagRegisterBoolArray" 244dd66f111SBlaise Bourdin /*@C 245dd66f111SBlaise Bourdin PetscBagRegisterBoolArray - add a n logical values to the bag 246dd66f111SBlaise Bourdin 247dd66f111SBlaise Bourdin Logically Collective on PetscBag 248dd66f111SBlaise Bourdin 249dd66f111SBlaise Bourdin Input Parameter: 250dd66f111SBlaise Bourdin + bag - the bag of values 251dd66f111SBlaise Bourdin . addr - location of boolean array in struct 252dd66f111SBlaise Bourdin . msize - number of entries in array 253dd66f111SBlaise Bourdin . name - name of the boolean array 254dd66f111SBlaise Bourdin - help - longer string with more information about the value 255dd66f111SBlaise Bourdin 256dd66f111SBlaise Bourdin Level: beginner 257dd66f111SBlaise Bourdin 258dd66f111SBlaise Bourdin .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 259dd66f111SBlaise Bourdin PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 260dd66f111SBlaise Bourdin PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 261dd66f111SBlaise Bourdin 262dd66f111SBlaise Bourdin @*/ 263dd66f111SBlaise Bourdin PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag,void *addr,PetscInt msize, const char* name, const char* help) 264dd66f111SBlaise Bourdin { 265dd66f111SBlaise Bourdin PetscErrorCode ierr; 266dd66f111SBlaise Bourdin PetscBagItem item; 267dd66f111SBlaise Bourdin char nname[PETSC_BAG_NAME_LENGTH+1]; 268dd66f111SBlaise Bourdin PetscBool printhelp; 269dd66f111SBlaise Bourdin PetscInt i,tmp = msize; 270dd66f111SBlaise Bourdin 271dd66f111SBlaise Bourdin PetscFunctionBegin; 272dd66f111SBlaise Bourdin /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/ 273dd66f111SBlaise Bourdin nname[0] = '-'; 274dd66f111SBlaise Bourdin nname[1] = 0; 275dd66f111SBlaise Bourdin ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 276dd66f111SBlaise Bourdin ierr = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr); 277dd66f111SBlaise Bourdin if (printhelp) { 278dd66f111SBlaise Bourdin ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix?bag->bagprefix:"",name);CHKERRQ(ierr); 279dd66f111SBlaise Bourdin for (i=0; i<msize; i++) { 280dd66f111SBlaise Bourdin ierr = (*PetscHelpPrintf)(bag->bagcomm,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr); 281dd66f111SBlaise Bourdin } 282dd66f111SBlaise Bourdin ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); 283dd66f111SBlaise Bourdin } 284dd66f111SBlaise Bourdin ierr = PetscOptionsGetBoolArray(bag->bagprefix,nname,(PetscBool*)addr,&tmp,NULL);CHKERRQ(ierr); 285dd66f111SBlaise Bourdin 286*b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 287dd66f111SBlaise Bourdin item->dtype = PETSC_BOOL; 288dd66f111SBlaise Bourdin item->offset = ((char*)addr) - ((char*)bag); 289dd66f111SBlaise Bourdin if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 290dd66f111SBlaise Bourdin item->next = 0; 291dd66f111SBlaise Bourdin item->msize = msize; 292dd66f111SBlaise Bourdin ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 293dd66f111SBlaise Bourdin PetscFunctionReturn(0); 294dd66f111SBlaise Bourdin } 295dd66f111SBlaise Bourdin 296dd66f111SBlaise Bourdin #undef __FUNCT__ 2975c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterString" 2985c6c1daeSBarry Smith /*@C 2995c6c1daeSBarry Smith PetscBagRegisterString - add a string value to the bag 3005c6c1daeSBarry Smith 3015c6c1daeSBarry Smith Logically Collective on PetscBag 3025c6c1daeSBarry Smith 3035c6c1daeSBarry Smith Input Parameter: 3045c6c1daeSBarry Smith + bag - the bag of values 3055c6c1daeSBarry Smith . addr - location of start of string in struct 3065c6c1daeSBarry Smith . msize - length of the string space in the struct 3075c6c1daeSBarry Smith . mdefault - the initial value 3085c6c1daeSBarry Smith . name - name of the string 3095c6c1daeSBarry Smith - help - longer string with more information about the value 3105c6c1daeSBarry Smith 3115c6c1daeSBarry Smith Level: beginner 3125c6c1daeSBarry Smith 3135c6c1daeSBarry Smith Note: The struct should have the field char mystring[msize]; not char *mystring 3145c6c1daeSBarry Smith 3155c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 3165c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 3175c6c1daeSBarry Smith PetscBagSetFromOptions(),PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 3185c6c1daeSBarry Smith 3195c6c1daeSBarry Smith @*/ 3205c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* mdefault,const char* name,const char* help) 3215c6c1daeSBarry Smith { 3225c6c1daeSBarry Smith PetscErrorCode ierr; 3235c6c1daeSBarry Smith PetscBagItem item; 3245c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 3255c6c1daeSBarry Smith PetscBool printhelp; 3265c6c1daeSBarry Smith 3275c6c1daeSBarry Smith PetscFunctionBegin; 3285c6c1daeSBarry Smith nname[0] = '-'; 3295c6c1daeSBarry Smith nname[1] = 0; 3305c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 3310298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr); 3325c6c1daeSBarry Smith if (printhelp) { 3335c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr); 3345c6c1daeSBarry Smith } 3355c6c1daeSBarry Smith 336*b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 3375c6c1daeSBarry Smith item->dtype = PETSC_CHAR; 3385c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 3395c6c1daeSBarry Smith if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 3405c6c1daeSBarry Smith item->next = 0; 3415c6c1daeSBarry Smith item->msize = msize; 3425c6c1daeSBarry Smith if (mdefault != (char*)addr) { 3435c6c1daeSBarry Smith ierr = PetscStrncpy((char*)addr,mdefault,msize-1);CHKERRQ(ierr); 3445c6c1daeSBarry Smith } 3450298fd71SBarry Smith ierr = PetscOptionsGetString(bag->bagprefix,nname,(char*)addr,msize,NULL);CHKERRQ(ierr); 3465c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 3475c6c1daeSBarry Smith PetscFunctionReturn(0); 3485c6c1daeSBarry Smith } 3495c6c1daeSBarry Smith 3505c6c1daeSBarry Smith #undef __FUNCT__ 3515c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterReal" 3525c6c1daeSBarry Smith /*@C 3535c6c1daeSBarry Smith PetscBagRegisterReal - add a real value to the bag 3545c6c1daeSBarry Smith 3555c6c1daeSBarry Smith Logically Collective on PetscBag 3565c6c1daeSBarry Smith 3575c6c1daeSBarry Smith Input Parameter: 3585c6c1daeSBarry Smith + bag - the bag of values 3595c6c1daeSBarry Smith . addr - location of double in struct 3605c6c1daeSBarry Smith . mdefault - the initial value 3615c6c1daeSBarry Smith . name - name of the variable 3625c6c1daeSBarry Smith - help - longer string with more information about the value 3635c6c1daeSBarry Smith 3645c6c1daeSBarry Smith Level: beginner 3655c6c1daeSBarry Smith 3665c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 3675c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 3685c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 3695c6c1daeSBarry Smith 3705c6c1daeSBarry Smith @*/ 3715c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterReal(PetscBag bag,void *addr,PetscReal mdefault, const char *name, const char *help) 3725c6c1daeSBarry Smith { 3735c6c1daeSBarry Smith PetscErrorCode ierr; 3745c6c1daeSBarry Smith PetscBagItem item; 3755c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 3765c6c1daeSBarry Smith PetscBool printhelp; 3775c6c1daeSBarry Smith 3785c6c1daeSBarry Smith PetscFunctionBegin; 3795c6c1daeSBarry Smith nname[0] = '-'; 3805c6c1daeSBarry Smith nname[1] = 0; 3815c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 3820298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr); 3835c6c1daeSBarry Smith if (printhelp) { 3845c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%G>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr); 3855c6c1daeSBarry Smith } 3860298fd71SBarry Smith ierr = PetscOptionsGetReal(bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 3875c6c1daeSBarry Smith 388*b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 3895c6c1daeSBarry Smith item->dtype = PETSC_REAL; 3905c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 3915c6c1daeSBarry Smith if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 3925c6c1daeSBarry Smith item->next = 0; 3935c6c1daeSBarry Smith item->msize = 1; 3945c6c1daeSBarry Smith *(PetscReal*)addr = mdefault; 3955c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 3965c6c1daeSBarry Smith PetscFunctionReturn(0); 3975c6c1daeSBarry Smith } 3985c6c1daeSBarry Smith 3995c6c1daeSBarry Smith #undef __FUNCT__ 4005c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterScalar" 4015c6c1daeSBarry Smith /*@C 4025c6c1daeSBarry Smith PetscBagRegisterScalar - add a real or complex number value to the bag 4035c6c1daeSBarry Smith 4045c6c1daeSBarry Smith Logically Collective on PetscBag 4055c6c1daeSBarry Smith 4065c6c1daeSBarry Smith Input Parameter: 4075c6c1daeSBarry Smith + bag - the bag of values 4085c6c1daeSBarry Smith . addr - location of scalar in struct 4095c6c1daeSBarry Smith . mdefault - the initial value 4105c6c1daeSBarry Smith . name - name of the variable 4115c6c1daeSBarry Smith - help - longer string with more information about the value 4125c6c1daeSBarry Smith 4135c6c1daeSBarry Smith 4145c6c1daeSBarry Smith Level: beginner 4155c6c1daeSBarry Smith 4165c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 4175c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 4185c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 4195c6c1daeSBarry Smith 4205c6c1daeSBarry Smith @*/ 4215c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar mdefault,const char *name,const char *help) 4225c6c1daeSBarry Smith { 4235c6c1daeSBarry Smith PetscErrorCode ierr; 4245c6c1daeSBarry Smith PetscBagItem item; 4255c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 4265c6c1daeSBarry Smith PetscBool printhelp; 4275c6c1daeSBarry Smith 4285c6c1daeSBarry Smith PetscFunctionBegin; 4295c6c1daeSBarry Smith nname[0] = '-'; 4305c6c1daeSBarry Smith nname[1] = 0; 4315c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 4320298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr); 4335c6c1daeSBarry Smith if (printhelp) { 4345c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%G + %Gi>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,PetscRealPart(mdefault),PetscImaginaryPart(mdefault),help);CHKERRQ(ierr); 4355c6c1daeSBarry Smith } 4360298fd71SBarry Smith ierr = PetscOptionsGetScalar(bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 4375c6c1daeSBarry Smith 438*b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 4395c6c1daeSBarry Smith item->dtype = PETSC_SCALAR; 4405c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 4415c6c1daeSBarry Smith if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 4425c6c1daeSBarry Smith item->next = 0; 4435c6c1daeSBarry Smith item->msize = 1; 4445c6c1daeSBarry Smith *(PetscScalar*)addr = mdefault; 4455c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 4465c6c1daeSBarry Smith PetscFunctionReturn(0); 4475c6c1daeSBarry Smith } 4485c6c1daeSBarry Smith 4495c6c1daeSBarry Smith #undef __FUNCT__ 4505c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterBool" 4515c6c1daeSBarry Smith /*@C 4525c6c1daeSBarry Smith PetscBagRegisterBool - add a logical value to the bag 4535c6c1daeSBarry Smith 4545c6c1daeSBarry Smith Logically Collective on PetscBag 4555c6c1daeSBarry Smith 4565c6c1daeSBarry Smith Input Parameter: 4575c6c1daeSBarry Smith + bag - the bag of values 4585c6c1daeSBarry Smith . addr - location of logical in struct 4595c6c1daeSBarry Smith . mdefault - the initial value 4605c6c1daeSBarry Smith . name - name of the variable 4615c6c1daeSBarry Smith - help - longer string with more information about the value 4625c6c1daeSBarry Smith 4635c6c1daeSBarry Smith 4645c6c1daeSBarry Smith Level: beginner 4655c6c1daeSBarry Smith 4665c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 4675c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 4685c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 4695c6c1daeSBarry Smith 4705c6c1daeSBarry Smith @*/ 4715c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterBool(PetscBag bag,void *addr,PetscBool mdefault,const char *name,const char *help) 4725c6c1daeSBarry Smith { 4735c6c1daeSBarry Smith PetscErrorCode ierr; 4745c6c1daeSBarry Smith PetscBagItem item; 4755c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 4765c6c1daeSBarry Smith PetscBool printhelp; 4775c6c1daeSBarry Smith 4785c6c1daeSBarry Smith PetscFunctionBegin; 4795c6c1daeSBarry 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 */ 4805c6c1daeSBarry Smith if (mdefault != PETSC_FALSE && mdefault != PETSC_TRUE) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Boolean %s %s must be boolean; integer value %d",name,help,(int)mdefault); 4815c6c1daeSBarry Smith nname[0] = '-'; 4825c6c1daeSBarry Smith nname[1] = 0; 4835c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 4840298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-help",&printhelp);CHKERRQ(ierr); 4855c6c1daeSBarry Smith if (printhelp) { 4865c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,PetscBools[mdefault],help);CHKERRQ(ierr); 4875c6c1daeSBarry Smith } 4880298fd71SBarry Smith ierr = PetscOptionsGetBool(bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 4895c6c1daeSBarry Smith 490*b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 4915c6c1daeSBarry Smith item->dtype = PETSC_BOOL; 4925c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 4935c6c1daeSBarry Smith if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 4945c6c1daeSBarry Smith item->next = 0; 4955c6c1daeSBarry Smith item->msize = 1; 4965c6c1daeSBarry Smith *(PetscBool*)addr = mdefault; 4975c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 4985c6c1daeSBarry Smith PetscFunctionReturn(0); 4995c6c1daeSBarry Smith } 5005c6c1daeSBarry Smith 5015c6c1daeSBarry Smith #undef __FUNCT__ 5025c6c1daeSBarry Smith #define __FUNCT__ "PetscBagDestroy" 5035c6c1daeSBarry Smith /*@C 5045c6c1daeSBarry Smith PetscBagDestroy - Destroys a bag values 5055c6c1daeSBarry Smith 5065c6c1daeSBarry Smith Collective on PetscBag 5075c6c1daeSBarry Smith 5085c6c1daeSBarry Smith Input Parameter: 5095c6c1daeSBarry Smith . bag - the bag of values 5105c6c1daeSBarry Smith 5115c6c1daeSBarry Smith Level: beginner 5125c6c1daeSBarry Smith 5135c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 5145c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 5155c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 5165c6c1daeSBarry Smith 5175c6c1daeSBarry Smith @*/ 5185c6c1daeSBarry Smith PetscErrorCode PetscBagDestroy(PetscBag *bag) 5195c6c1daeSBarry Smith { 5205c6c1daeSBarry Smith PetscErrorCode ierr; 5215c6c1daeSBarry Smith PetscBagItem nitem = (*bag)->bagitems,item; 5225c6c1daeSBarry Smith 5235c6c1daeSBarry Smith PetscFunctionBegin; 5245c6c1daeSBarry Smith while (nitem) { 5255c6c1daeSBarry Smith item = nitem->next; 5265c6c1daeSBarry Smith if (nitem->list) { 5275c6c1daeSBarry Smith ierr = PetscStrArrayDestroy(&nitem->list);CHKERRQ(ierr); 5285c6c1daeSBarry Smith } 5295c6c1daeSBarry Smith ierr = PetscFree(nitem);CHKERRQ(ierr); 5305c6c1daeSBarry Smith nitem = item; 5315c6c1daeSBarry Smith } 5325c6c1daeSBarry Smith if ((*bag)->bagprefix) { ierr = PetscFree((*bag)->bagprefix);CHKERRQ(ierr); } 5335c6c1daeSBarry Smith ierr = PetscFree(*bag);CHKERRQ(ierr); 5345c6c1daeSBarry Smith PetscFunctionReturn(0); 5355c6c1daeSBarry Smith } 5365c6c1daeSBarry Smith 5375c6c1daeSBarry Smith #undef __FUNCT__ 5385c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetFromOptions" 5395c6c1daeSBarry Smith /*@ 5405c6c1daeSBarry Smith PetscBagSetFromOptions - Allows setting options from a bag 5415c6c1daeSBarry Smith 5425c6c1daeSBarry Smith Collective on PetscBag 5435c6c1daeSBarry Smith 5445c6c1daeSBarry Smith Input Parameter: 5455c6c1daeSBarry Smith . bag - the bag of values 5465c6c1daeSBarry Smith 5475c6c1daeSBarry Smith Level: beginner 5485c6c1daeSBarry Smith 5495c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData() 5505c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 5515c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagView(), PetscBagRegisterEnum() 5525c6c1daeSBarry Smith 5535c6c1daeSBarry Smith @*/ 5545c6c1daeSBarry Smith PetscErrorCode PetscBagSetFromOptions(PetscBag bag) 5555c6c1daeSBarry Smith { 5565c6c1daeSBarry Smith PetscErrorCode ierr; 5575c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 5585c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH+1],helpname[PETSC_BAG_NAME_LENGTH+PETSC_BAG_HELP_LENGTH+3]; 5595c6c1daeSBarry Smith PetscInt n; 5605c6c1daeSBarry Smith 5615c6c1daeSBarry Smith PetscFunctionBegin; 5625c6c1daeSBarry Smith ierr = PetscStrcpy(helpname,bag->bagname);CHKERRQ(ierr); 5635c6c1daeSBarry Smith ierr = PetscStrcat(helpname," ");CHKERRQ(ierr); 5645c6c1daeSBarry Smith ierr = PetscStrcat(helpname,bag->baghelp);CHKERRQ(ierr); 5655c6c1daeSBarry Smith ierr = PetscOptionsBegin(bag->bagcomm,bag->bagprefix,helpname,0); 5665c6c1daeSBarry Smith while (nitem) { 5675c6c1daeSBarry Smith name[0] = '-'; 5685c6c1daeSBarry Smith name[1] = 0; 5695c6c1daeSBarry Smith ierr = PetscStrcat(name,nitem->name);CHKERRQ(ierr); 5705c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */ 5715c6c1daeSBarry Smith char *value = (char*)(((char*)bag) + nitem->offset); 5720298fd71SBarry Smith ierr = PetscOptionsString(name,nitem->help,"",value,value,nitem->msize,NULL);CHKERRQ(ierr); 5735c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 5745c6c1daeSBarry Smith PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset); 5755c6c1daeSBarry Smith if (nitem->msize == 1) { 5760298fd71SBarry Smith ierr = PetscOptionsReal(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 5775c6c1daeSBarry Smith } else { 5785c6c1daeSBarry Smith n = nitem->msize; 5790298fd71SBarry Smith ierr = PetscOptionsRealArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr); 5805c6c1daeSBarry Smith } 5815c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 5825c6c1daeSBarry Smith PetscScalar *value = (PetscScalar*)(((char*)bag) + nitem->offset); 5830298fd71SBarry Smith ierr = PetscOptionsScalar(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 5845c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 5855c6c1daeSBarry Smith PetscInt *value = (PetscInt*)(((char*)bag) + nitem->offset); 5865c6c1daeSBarry Smith if (nitem->msize == 1) { 5870298fd71SBarry Smith ierr = PetscOptionsInt(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 5885c6c1daeSBarry Smith } else { 5895c6c1daeSBarry Smith n = nitem->msize; 5900298fd71SBarry Smith ierr = PetscOptionsIntArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr); 5915c6c1daeSBarry Smith } 5925c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 5935c6c1daeSBarry Smith PetscEnum *value = (PetscEnum*)(((char*)bag) + nitem->offset); 5945c6c1daeSBarry Smith PetscInt i = 0; 5955c6c1daeSBarry Smith while (nitem->list[i++]) ; 5960298fd71SBarry Smith ierr = PetscOptionsEnum(name,nitem->help,nitem->list[i-3],(const char*const*)nitem->list,*value,value,NULL);CHKERRQ(ierr); 5975c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 5985c6c1daeSBarry Smith PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset); 599dd66f111SBlaise Bourdin if (nitem->msize == 1) { 6000298fd71SBarry Smith ierr = PetscOptionsBool(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 601dd66f111SBlaise Bourdin } else { 602dd66f111SBlaise Bourdin n = nitem->msize; 603dd66f111SBlaise Bourdin ierr = PetscOptionsBoolArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr); 604dd66f111SBlaise Bourdin } 6055c6c1daeSBarry Smith } 6065c6c1daeSBarry Smith nitem = nitem->next; 6075c6c1daeSBarry Smith } 6085c6c1daeSBarry Smith PetscOptionsEnd(); 6095c6c1daeSBarry Smith PetscFunctionReturn(0); 6105c6c1daeSBarry Smith } 6115c6c1daeSBarry Smith 6125c6c1daeSBarry Smith #undef __FUNCT__ 6135c6c1daeSBarry Smith #define __FUNCT__ "PetscBagView" 6145c6c1daeSBarry Smith /*@C 6155c6c1daeSBarry Smith PetscBagView - Views a bag of values as either ASCII text or a binary file 6165c6c1daeSBarry Smith 6175c6c1daeSBarry Smith Collective on PetscBag 6185c6c1daeSBarry Smith 6195c6c1daeSBarry Smith Input Parameter: 6205c6c1daeSBarry Smith + bag - the bag of values 6215c6c1daeSBarry Smith - viewer - location to view the values 6225c6c1daeSBarry Smith 6235c6c1daeSBarry Smith Level: beginner 6245c6c1daeSBarry Smith 6255c6c1daeSBarry Smith Warning: Currently PETSc bags saved in a binary file can only be read back 6265c6c1daeSBarry Smith in on a machine of the same architecture. Let us know when this is a problem 6275c6c1daeSBarry Smith and we'll fix it. 6285c6c1daeSBarry Smith 6295c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData() 6305c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum() 6315c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName() 6325c6c1daeSBarry Smith 6335c6c1daeSBarry Smith @*/ 6345c6c1daeSBarry Smith PetscErrorCode PetscBagView(PetscBag bag,PetscViewer view) 6355c6c1daeSBarry Smith { 6365c6c1daeSBarry Smith PetscBool isascii,isbinary; 6375c6c1daeSBarry Smith PetscErrorCode ierr; 6385c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 6395c6c1daeSBarry Smith 6405c6c1daeSBarry Smith PetscFunctionBegin; 6415c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 6425c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 6435c6c1daeSBarry Smith if (isascii) { 6443ffde785SBarry Smith if (bag->bagprefix) { 6453ffde785SBarry Smith ierr = PetscViewerASCIIPrintf(view,"PetscBag Object: %s (%s) %s\n",bag->bagname,bag->bagprefix,bag->baghelp);CHKERRQ(ierr); 6463ffde785SBarry Smith } else { 6475c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"PetscBag Object: %s %s\n",bag->bagname,bag->baghelp);CHKERRQ(ierr); 6483ffde785SBarry Smith } 6495c6c1daeSBarry Smith while (nitem) { 6505c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { 6515c6c1daeSBarry Smith char *value = (char*)(((char*)bag) + nitem->offset); 6525c6c1daeSBarry Smith char tmp = value[nitem->msize-1]; /* special handling for fortran chars wihout null terminator */ 6535c6c1daeSBarry Smith value[nitem->msize-1] =0; 6545c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %s; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr); 6555c6c1daeSBarry Smith value[nitem->msize-1] = tmp; 6565c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 6575c6c1daeSBarry Smith PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset); 6585c6c1daeSBarry Smith PetscInt i; 6595c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 6605c6c1daeSBarry Smith for (i=0; i<nitem->msize; i++) { 6615c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"%G ",value[i]);CHKERRQ(ierr); 6625c6c1daeSBarry Smith } 6635c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 6645c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 6655c6c1daeSBarry Smith PetscScalar value = *(PetscScalar*)(((char*)bag) + nitem->offset); 6665c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 6675c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %G + %Gi; %s\n",nitem->name,PetscRealPart(value),PetscImaginaryPart(value),nitem->help);CHKERRQ(ierr); 6685c6c1daeSBarry Smith #else 6695c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %G; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr); 6705c6c1daeSBarry Smith #endif 6715c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 6725c6c1daeSBarry Smith PetscInt i,*value = (PetscInt*)(((char*)bag) + nitem->offset); 6735c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 6745c6c1daeSBarry Smith for (i=0; i<nitem->msize; i++) { 6755c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"%D ",value[i]);CHKERRQ(ierr); 6765c6c1daeSBarry Smith } 6775c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 6785c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 679dd66f111SBlaise Bourdin PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset); 680dd66f111SBlaise Bourdin PetscInt i; 6815c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 682dd66f111SBlaise Bourdin ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 683dd66f111SBlaise Bourdin for (i=0; i<nitem->msize; i++) { 684dd66f111SBlaise Bourdin if (((int) value[i]) == -1) value[i] = PETSC_TRUE; 6855c6c1daeSBarry 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 */ 686dd66f111SBlaise Bourdin if (value[i] != PETSC_FALSE && value[i] != PETSC_TRUE) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Boolean value for %s %s is corrupt; integer value %d",nitem->name,nitem->help,value); 687dd66f111SBlaise Bourdin ierr = PetscViewerASCIIPrintf(view," %s",PetscBools[value[i]]);CHKERRQ(ierr); 688dd66f111SBlaise Bourdin } 689dd66f111SBlaise Bourdin ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 6905c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 6915c6c1daeSBarry Smith PetscEnum value = *(PetscEnum*)(((char*)bag) + nitem->offset); 6925c6c1daeSBarry Smith PetscInt i = 0; 6935c6c1daeSBarry Smith while (nitem->list[i++]) ; 6945c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %s; (%s) %s\n",nitem->name,nitem->list[value],nitem->list[i-3],nitem->help);CHKERRQ(ierr); 6955c6c1daeSBarry Smith } 6965c6c1daeSBarry Smith nitem = nitem->next; 6975c6c1daeSBarry Smith } 6985c6c1daeSBarry Smith } else if (isbinary) { 6995c6c1daeSBarry Smith PetscInt classid = PETSC_BAG_FILE_CLASSID, dtype; 7005c6c1daeSBarry Smith PetscInt deprecatedbagsize = 0; 701a261c58fSBarry Smith PetscViewerFormat format; 7025c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&classid,1,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 7035c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&deprecatedbagsize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 7045c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&bag->count,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 7055c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 7065c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 7075c6c1daeSBarry Smith while (nitem) { 7085c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&nitem->offset,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 7095c6c1daeSBarry Smith dtype = (PetscInt)nitem->dtype; 7105c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&dtype,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 7115c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,nitem->name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 7125c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,nitem->help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 7135c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&nitem->msize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 7145c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 7155c6c1daeSBarry Smith if (dtype == PETSC_BOOL && ((*(int*) (((char*)bag) + nitem->offset) == -1))) *(int*) (((char*)bag) + nitem->offset) = PETSC_TRUE; 7165c6c1daeSBarry Smith 7175c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,(((char*)bag) + nitem->offset),nitem->msize,nitem->dtype,PETSC_FALSE);CHKERRQ(ierr); 7185c6c1daeSBarry Smith if (dtype == PETSC_ENUM) { 7195c6c1daeSBarry Smith ierr = PetscViewerBinaryWriteStringArray(view,(char**)nitem->list);CHKERRQ(ierr); 7205c6c1daeSBarry Smith } 7215c6c1daeSBarry Smith nitem = nitem->next; 7225c6c1daeSBarry Smith } 723a261c58fSBarry Smith ierr = PetscViewerGetFormat(view,&format);CHKERRQ(ierr); 724a261c58fSBarry Smith if (format == PETSC_VIEWER_BINARY_MATLAB) { 725a261c58fSBarry Smith MPI_Comm comm; 726a261c58fSBarry Smith FILE *info; 727a261c58fSBarry Smith ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr); 728a261c58fSBarry Smith ierr = PetscViewerBinaryGetInfoPointer(view,&info);CHKERRQ(ierr); 729da88d4d4SJed Brown ierr = PetscFPrintf(comm,info,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n");CHKERRQ(ierr); 730da88d4d4SJed Brown ierr = PetscFPrintf(comm,info,"#$$ Set.%s = PetscBinaryRead(fd);\n",bag->bagname);CHKERRQ(ierr); 731da88d4d4SJed Brown ierr = PetscFPrintf(comm,info,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n");CHKERRQ(ierr); 732a261c58fSBarry Smith } 733a261c58fSBarry Smith } 7345c6c1daeSBarry Smith PetscFunctionReturn(0); 7355c6c1daeSBarry Smith } 7365c6c1daeSBarry Smith 7375c6c1daeSBarry Smith #undef __FUNCT__ 7385c6c1daeSBarry Smith #define __FUNCT__ "PetscBagLoad" 7395c6c1daeSBarry Smith /*@C 7405c6c1daeSBarry Smith PetscBagLoad - Loads a bag of values from a binary file 7415c6c1daeSBarry Smith 7425c6c1daeSBarry Smith Collective on PetscViewer 7435c6c1daeSBarry Smith 7445c6c1daeSBarry Smith Input Parameter: 7455c6c1daeSBarry Smith + viewer - file to load values from 7465c6c1daeSBarry Smith - bag - the bag of values 7475c6c1daeSBarry Smith 7485c6c1daeSBarry Smith Notes: You must have created and registered all the fields in the bag before loading into it. 7495c6c1daeSBarry Smith 7505c6c1daeSBarry Smith Notes: 7515c6c1daeSBarry Smith Level: beginner 7525c6c1daeSBarry Smith 7535c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagView(), PetscBagGetData() 7545c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 7555c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 7565c6c1daeSBarry Smith 7575c6c1daeSBarry Smith @*/ 7585c6c1daeSBarry Smith PetscErrorCode PetscBagLoad(PetscViewer view,PetscBag bag) 7595c6c1daeSBarry Smith { 7605c6c1daeSBarry Smith PetscErrorCode ierr; 7615c6c1daeSBarry Smith PetscBool isbinary; 7625c6c1daeSBarry Smith PetscInt classid,bagcount,i,dtype,msize,offset,deprecatedbagsize; 7635c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH],help[PETSC_BAG_HELP_LENGTH],**list; 7645c6c1daeSBarry Smith PetscBagItem nitem; 7655c6c1daeSBarry Smith MPI_Comm comm; 7665c6c1daeSBarry Smith PetscMPIInt flag; 7675c6c1daeSBarry Smith 7685c6c1daeSBarry Smith PetscFunctionBegin; 7695c6c1daeSBarry Smith ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr); 7705c6c1daeSBarry Smith ierr = MPI_Comm_compare(comm,bag->bagcomm,&flag);CHKERRQ(ierr); 7715c6c1daeSBarry Smith if (flag != MPI_CONGRUENT && flag != MPI_IDENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the viewer and bag"); \ 7725c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 7735c6c1daeSBarry Smith if (!isbinary) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type"); 7745c6c1daeSBarry Smith 7755c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&classid,1,PETSC_INT);CHKERRQ(ierr); 7765c6c1daeSBarry Smith if (classid != PETSC_BAG_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not PetscBag next in binary file"); 7775c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&deprecatedbagsize,1,PETSC_INT);CHKERRQ(ierr); 7785c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&bagcount,1,PETSC_INT);CHKERRQ(ierr); 7795c6c1daeSBarry Smith if (bagcount != bag->count) SETERRQ2(comm,PETSC_ERR_ARG_INCOMP,"Bag in file has different number of entries %d then passed in bag %d\n",(int)bagcount,(int)bag->count);CHKERRQ(ierr); 7805c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 7815c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 7825c6c1daeSBarry Smith 7835c6c1daeSBarry Smith nitem = bag->bagitems; 7845c6c1daeSBarry Smith for (i=0; i<bagcount; i++) { 7855c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&offset,1,PETSC_INT);CHKERRQ(ierr); 7865c6c1daeSBarry Smith /* ignore the offset in the file */ 7875c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&dtype,1,PETSC_INT);CHKERRQ(ierr); 7885c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 7895c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 7905c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&msize,1,PETSC_INT);CHKERRQ(ierr); 7915c6c1daeSBarry Smith 7925c6c1daeSBarry Smith if (dtype == (PetscInt) PETSC_CHAR) { 7935c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_CHAR);CHKERRQ(ierr); 7945c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_REAL) { 7955c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_REAL);CHKERRQ(ierr); 7965c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_SCALAR) { 7975c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_SCALAR);CHKERRQ(ierr); 7985c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_INT) { 7995c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_INT);CHKERRQ(ierr); 8005c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_BOOL) { 801dd66f111SBlaise Bourdin ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_BOOL);CHKERRQ(ierr); 8025c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_ENUM) { 8035c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_ENUM);CHKERRQ(ierr); 8045c6c1daeSBarry Smith ierr = PetscViewerBinaryReadStringArray(view,&list);CHKERRQ(ierr); 8055c6c1daeSBarry Smith /* don't need to save list because it is already registered in the bag */ 8065c6c1daeSBarry Smith ierr = PetscFree(list);CHKERRQ(ierr); 8075c6c1daeSBarry Smith } 8085c6c1daeSBarry Smith nitem = nitem->next; 8095c6c1daeSBarry Smith } 8105c6c1daeSBarry Smith PetscFunctionReturn(0); 8115c6c1daeSBarry Smith } 8125c6c1daeSBarry Smith 8135c6c1daeSBarry Smith #undef __FUNCT__ 8145c6c1daeSBarry Smith #define __FUNCT__ "PetscBagCreate" 8155c6c1daeSBarry Smith /*@ 8165c6c1daeSBarry Smith PetscBagCreate - Create a bag of values 8175c6c1daeSBarry Smith 8185c6c1daeSBarry Smith Collective on MPI_Comm 8195c6c1daeSBarry Smith 8205c6c1daeSBarry Smith Level: Intermediate 8215c6c1daeSBarry Smith 8225c6c1daeSBarry Smith Input Parameters: 8235c6c1daeSBarry Smith + comm - communicator to share bag 8245c6c1daeSBarry Smith - bagsize - size of the C structure holding the values 8255c6c1daeSBarry Smith 8265c6c1daeSBarry Smith Output Parameter: 8275c6c1daeSBarry Smith . bag - the bag of values 8285c6c1daeSBarry Smith 8295c6c1daeSBarry Smith Notes: 8305c6c1daeSBarry Smith The size of the A struct must be small enough to fit in a PetscInt; by default 8315c6c1daeSBarry Smith PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length. 8325c6c1daeSBarry Smith The warning about casting to a shorter length can be ignored below unless your A struct is too large 8335c6c1daeSBarry Smith 8345c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 8355c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 8365c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 8375c6c1daeSBarry Smith @*/ 8385c6c1daeSBarry Smith PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag) 8395c6c1daeSBarry Smith { 8405c6c1daeSBarry Smith PetscErrorCode ierr; 8415c6c1daeSBarry Smith size_t totalsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar); 8425c6c1daeSBarry Smith 8435c6c1daeSBarry Smith PetscFunctionBegin; 8440298fd71SBarry Smith ierr = PetscInfo1(NULL,"Creating Bag with total size %d\n",(int)totalsize);CHKERRQ(ierr); 8455c6c1daeSBarry Smith ierr = PetscMalloc(totalsize,bag);CHKERRQ(ierr); 8465c6c1daeSBarry Smith ierr = PetscMemzero(*bag,bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar));CHKERRQ(ierr); 847a297a907SKarl Rupp 8485c6c1daeSBarry Smith (*bag)->bagsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar); 8495c6c1daeSBarry Smith (*bag)->bagcomm = comm; 8500298fd71SBarry Smith (*bag)->bagprefix = NULL; 8515c6c1daeSBarry Smith (*bag)->structlocation = (void*)(((char*)(*bag)) + sizeof(PetscScalar)*(sizeof(struct _n_PetscBag)/sizeof(PetscScalar)) + sizeof(PetscScalar)); 8525c6c1daeSBarry Smith PetscFunctionReturn(0); 8535c6c1daeSBarry Smith } 8545c6c1daeSBarry Smith 8555c6c1daeSBarry Smith #undef __FUNCT__ 8565c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetName" 8575c6c1daeSBarry Smith /*@C 8585c6c1daeSBarry Smith PetscBagSetName - Sets the name of a bag of values 8595c6c1daeSBarry Smith 8605c6c1daeSBarry Smith Not Collective 8615c6c1daeSBarry Smith 8625c6c1daeSBarry Smith Level: Intermediate 8635c6c1daeSBarry Smith 8645c6c1daeSBarry Smith Input Parameters: 8655c6c1daeSBarry Smith + bag - the bag of values 8665c6c1daeSBarry Smith . name - the name assigned to the bag 8675c6c1daeSBarry Smith - help - help message for bag 8685c6c1daeSBarry Smith 8695c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 8705c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 8715c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 8725c6c1daeSBarry Smith @*/ 8735c6c1daeSBarry Smith 8745c6c1daeSBarry Smith PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help) 8755c6c1daeSBarry Smith { 8765c6c1daeSBarry Smith PetscErrorCode ierr; 8775fd66863SKarl Rupp 8785c6c1daeSBarry Smith PetscFunctionBegin; 8795c6c1daeSBarry Smith ierr = PetscStrncpy(bag->bagname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 8805c6c1daeSBarry Smith ierr = PetscStrncpy(bag->baghelp,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr); 8815c6c1daeSBarry Smith PetscFunctionReturn(0); 8825c6c1daeSBarry Smith } 8835c6c1daeSBarry Smith 8845c6c1daeSBarry Smith 8855c6c1daeSBarry Smith #undef __FUNCT__ 8865c6c1daeSBarry Smith #define __FUNCT__ "PetscBagGetName" 8875c6c1daeSBarry Smith /*@C 8885c6c1daeSBarry Smith PetscBagGetName - Gets the name of a bag of values 8895c6c1daeSBarry Smith 8905c6c1daeSBarry Smith Not Collective 8915c6c1daeSBarry Smith 8925c6c1daeSBarry Smith Level: Intermediate 8935c6c1daeSBarry Smith 8945c6c1daeSBarry Smith Input Parameter: 8955c6c1daeSBarry Smith . bag - the bag of values 8965c6c1daeSBarry Smith 8975c6c1daeSBarry Smith Output Parameter: 8985c6c1daeSBarry Smith . name - the name assigned to the bag 8995c6c1daeSBarry Smith 9005c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 9015c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 9025c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 9035c6c1daeSBarry Smith @*/ 9045c6c1daeSBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, char **name) 9055c6c1daeSBarry Smith { 9065c6c1daeSBarry Smith PetscFunctionBegin; 9075c6c1daeSBarry Smith *name = bag->bagname; 9085c6c1daeSBarry Smith PetscFunctionReturn(0); 9095c6c1daeSBarry Smith } 9105c6c1daeSBarry Smith 9115c6c1daeSBarry Smith #undef __FUNCT__ 9125c6c1daeSBarry Smith #define __FUNCT__ "PetscBagGetData" 9135c6c1daeSBarry Smith /*@C 9145c6c1daeSBarry Smith PetscBagGetData - Gives back the user - access to memory that 9155c6c1daeSBarry Smith should be used for storing user-data-structure 9165c6c1daeSBarry Smith 9175c6c1daeSBarry Smith Not Collective 9185c6c1daeSBarry Smith 9195c6c1daeSBarry Smith Level: Intermediate 9205c6c1daeSBarry Smith 9215c6c1daeSBarry Smith Input Parameter: 9225c6c1daeSBarry Smith . bag - the bag of values 9235c6c1daeSBarry Smith 9245c6c1daeSBarry Smith Output Parameter: 9255c6c1daeSBarry Smith . data - pointer to memory that will have user-data-structure 9265c6c1daeSBarry Smith 9275c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad() 9285c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 9295c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 9305c6c1daeSBarry Smith @*/ 9315c6c1daeSBarry Smith PetscErrorCode PetscBagGetData(PetscBag bag, void **data) 9325c6c1daeSBarry Smith { 9335c6c1daeSBarry Smith PetscFunctionBegin; 9345c6c1daeSBarry Smith *data = bag->structlocation; 9355c6c1daeSBarry Smith PetscFunctionReturn(0); 9365c6c1daeSBarry Smith } 9375c6c1daeSBarry Smith 9385c6c1daeSBarry Smith #undef __FUNCT__ 9395c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetOptionsPrefix" 9405c6c1daeSBarry Smith /*@C 9415c6c1daeSBarry Smith PetscBagSetOptionsPrefix - Sets the prefix used for searching for all 9425c6c1daeSBarry Smith PetscBag items in the options database. 9435c6c1daeSBarry Smith 9445c6c1daeSBarry Smith Logically collective on Bag. 9455c6c1daeSBarry Smith 9465c6c1daeSBarry Smith Level: Intermediate 9475c6c1daeSBarry Smith 9485c6c1daeSBarry Smith Input Parameters: 9495c6c1daeSBarry Smith + bag - the bag of values 9505c6c1daeSBarry Smith - prefix - the prefix to prepend all Bag item names with. 9515c6c1daeSBarry Smith 9525c6c1daeSBarry Smith NOTES: Must be called prior to registering any of the bag items. 9535c6c1daeSBarry Smith 9545c6c1daeSBarry Smith .seealso: PetscBag, PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 9555c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 9565c6c1daeSBarry Smith @*/ 9575c6c1daeSBarry Smith 9585c6c1daeSBarry Smith PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[]) 9595c6c1daeSBarry Smith { 9605c6c1daeSBarry Smith PetscErrorCode ierr; 9615fd66863SKarl Rupp 9625c6c1daeSBarry Smith PetscFunctionBegin; 9635c6c1daeSBarry Smith if (!pre) { 9645c6c1daeSBarry Smith ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr); 9655c6c1daeSBarry Smith } else { 9665c6c1daeSBarry Smith if (pre[0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hypen"); 9675c6c1daeSBarry Smith ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr); 9685c6c1daeSBarry Smith ierr = PetscStrallocpy(pre,&(bag->bagprefix));CHKERRQ(ierr); 9695c6c1daeSBarry Smith } 9705c6c1daeSBarry Smith PetscFunctionReturn(0); 9715c6c1daeSBarry Smith } 972