15c6c1daeSBarry Smith 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 */ 85c6c1daeSBarry Smith static PetscErrorCode PetscBagRegister_Private(PetscBag bag,PetscBagItem item,const char *name,const char *help) 95c6c1daeSBarry Smith { 105c6c1daeSBarry Smith PetscErrorCode ierr; 115c6c1daeSBarry Smith 125c6c1daeSBarry Smith PetscFunctionBegin; 135c6c1daeSBarry Smith ierr = PetscStrncpy(item->name,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 145c6c1daeSBarry Smith ierr = PetscStrncpy(item->help,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr); 155c6c1daeSBarry Smith if (!bag->bagitems) bag->bagitems = item; 165c6c1daeSBarry Smith else { 175c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 185c6c1daeSBarry Smith while (nitem->next) { 195c6c1daeSBarry Smith nitem = nitem->next; 205c6c1daeSBarry Smith } 215c6c1daeSBarry Smith nitem->next = item; 225c6c1daeSBarry Smith } 235c6c1daeSBarry Smith bag->count++; 245c6c1daeSBarry Smith PetscFunctionReturn(0); 255c6c1daeSBarry Smith } 265c6c1daeSBarry Smith 275c6c1daeSBarry Smith /*@C 285c6c1daeSBarry Smith PetscBagRegisterEnum - add an enum value to the bag 295c6c1daeSBarry Smith 305c6c1daeSBarry Smith Logically Collective on PetscBag 315c6c1daeSBarry Smith 325c6c1daeSBarry Smith Input Parameter: 335c6c1daeSBarry Smith + bag - the bag of values 345c6c1daeSBarry Smith . addr - location of enum in struct 355c6c1daeSBarry Smith . mdefault - the initial value 365c6c1daeSBarry Smith . list - array of strings containing names of enum values followed by enum name followed by enum prefix 375c6c1daeSBarry Smith - help - longer string with more information about the value 385c6c1daeSBarry Smith 395c6c1daeSBarry Smith Level: beginner 405c6c1daeSBarry Smith 415c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 425c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 435c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName() 445c6c1daeSBarry Smith 455c6c1daeSBarry Smith @*/ 465c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterEnum(PetscBag bag,void *addr,const char *const *list,PetscEnum mdefault, const char *name, const char *help) 475c6c1daeSBarry Smith { 485c6c1daeSBarry Smith PetscErrorCode ierr; 495c6c1daeSBarry Smith PetscBagItem item; 505c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 515c6c1daeSBarry Smith PetscBool printhelp; 525c6c1daeSBarry Smith PetscInt i = 0; 535c6c1daeSBarry Smith 545c6c1daeSBarry Smith PetscFunctionBegin; 555c6c1daeSBarry Smith nname[0] = '-'; 565c6c1daeSBarry Smith nname[1] = 0; 57a126751eSBarry Smith ierr = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr); 582d747510SLisandro Dalcin ierr = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr); 595c6c1daeSBarry Smith if (printhelp) { 605c6c1daeSBarry Smith while (list[i++]) ; 615c6c1daeSBarry 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); 625c6c1daeSBarry Smith for (i=0; list[i+2]; i++) { 635c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," %s",list[i]);CHKERRQ(ierr); 645c6c1daeSBarry Smith } 655c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,"\n");CHKERRQ(ierr); 665c6c1daeSBarry Smith } 67c5929fdfSBarry Smith ierr = PetscOptionsGetEnum(NULL,bag->bagprefix,nname,list,&mdefault,NULL);CHKERRQ(ierr); 685c6c1daeSBarry Smith 69b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 705c6c1daeSBarry Smith item->dtype = PETSC_ENUM; 715c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 725c6c1daeSBarry 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); 7302c9f0b5SLisandro Dalcin item->next = NULL; 745c6c1daeSBarry Smith item->msize = 1; 755c6c1daeSBarry Smith ierr = PetscStrArrayallocpy(list,(char***)&item->list);CHKERRQ(ierr); 765c6c1daeSBarry Smith *(PetscEnum*)addr = mdefault; 775c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 785c6c1daeSBarry Smith PetscFunctionReturn(0); 795c6c1daeSBarry Smith } 805c6c1daeSBarry Smith 815c6c1daeSBarry Smith /*@C 825c6c1daeSBarry Smith PetscBagRegisterIntArray - add an integer value to the bag 835c6c1daeSBarry Smith 845c6c1daeSBarry Smith Logically Collective on PetscBag 855c6c1daeSBarry Smith 865c6c1daeSBarry Smith Input Parameter: 875c6c1daeSBarry Smith + bag - the bag of values 885c6c1daeSBarry Smith . addr - location of integer in struct 895c6c1daeSBarry Smith . msize - number of entries in array 905c6c1daeSBarry Smith . name - name of the integer array 915c6c1daeSBarry Smith - help - longer string with more information about the value 925c6c1daeSBarry Smith 935c6c1daeSBarry Smith Level: beginner 945c6c1daeSBarry Smith 955c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 965c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 975c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 985c6c1daeSBarry Smith 995c6c1daeSBarry Smith @*/ 1005c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterIntArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help) 1015c6c1daeSBarry Smith { 1025c6c1daeSBarry Smith PetscErrorCode ierr; 1035c6c1daeSBarry Smith PetscBagItem item; 1045c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 1055c6c1daeSBarry Smith PetscBool printhelp; 1065c6c1daeSBarry Smith PetscInt i,tmp = msize; 1075c6c1daeSBarry Smith 1085c6c1daeSBarry Smith PetscFunctionBegin; 1095c6c1daeSBarry Smith nname[0] = '-'; 1105c6c1daeSBarry Smith nname[1] = 0; 111a126751eSBarry Smith ierr = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr); 1122d747510SLisandro Dalcin ierr = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr); 1135c6c1daeSBarry Smith if (printhelp) { 1145c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix ? bag->bagprefix : "",name);CHKERRQ(ierr); 1155c6c1daeSBarry Smith for (i=0; i<msize; i++) { 1165c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr); 1175c6c1daeSBarry Smith } 1185c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); 1195c6c1daeSBarry Smith } 120c5929fdfSBarry Smith ierr = PetscOptionsGetIntArray(NULL,bag->bagprefix,nname,(PetscInt*)addr,&tmp,NULL);CHKERRQ(ierr); 1215c6c1daeSBarry Smith 122b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 1235c6c1daeSBarry Smith item->dtype = PETSC_INT; 1245c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 1255c6c1daeSBarry 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); 12602c9f0b5SLisandro Dalcin item->next = NULL; 1275c6c1daeSBarry Smith item->msize = msize; 1285c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 1295c6c1daeSBarry Smith PetscFunctionReturn(0); 1305c6c1daeSBarry Smith } 1315c6c1daeSBarry Smith 1325c6c1daeSBarry Smith /*@C 1335c6c1daeSBarry Smith PetscBagRegisterRealArray - add an real array to the bag 1345c6c1daeSBarry Smith 1355c6c1daeSBarry Smith Logically Collective on PetscBag 1365c6c1daeSBarry Smith 1375c6c1daeSBarry Smith Input Parameter: 1385c6c1daeSBarry Smith + bag - the bag of values 1395c6c1daeSBarry Smith . addr - location of real array in struct 1405c6c1daeSBarry Smith . msize - number of entries in array 1415c6c1daeSBarry Smith . name - name of the integer array 1425c6c1daeSBarry Smith - help - longer string with more information about the value 1435c6c1daeSBarry Smith 1445c6c1daeSBarry Smith Level: beginner 1455c6c1daeSBarry Smith 1465c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 1475c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 1485c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 1495c6c1daeSBarry Smith 1505c6c1daeSBarry Smith @*/ 1515c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterRealArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help) 1525c6c1daeSBarry Smith { 1535c6c1daeSBarry Smith PetscErrorCode ierr; 1545c6c1daeSBarry Smith PetscBagItem item; 1555c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 1565c6c1daeSBarry Smith PetscBool printhelp; 1575c6c1daeSBarry Smith PetscInt i,tmp = msize; 1585c6c1daeSBarry Smith 1595c6c1daeSBarry Smith PetscFunctionBegin; 1605c6c1daeSBarry Smith nname[0] = '-'; 1615c6c1daeSBarry Smith nname[1] = 0; 162a126751eSBarry Smith ierr = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr); 1632d747510SLisandro Dalcin ierr = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr); 1645c6c1daeSBarry Smith if (printhelp) { 1655c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix ? bag->bagprefix : "",name);CHKERRQ(ierr); 1665c6c1daeSBarry Smith for (i=0; i<msize; i++) { 16757622a8eSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,"%g ",(double)*((PetscReal*)addr)+i);CHKERRQ(ierr); 1685c6c1daeSBarry Smith } 1695c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); 1705c6c1daeSBarry Smith } 171c5929fdfSBarry Smith ierr = PetscOptionsGetRealArray(NULL,bag->bagprefix,nname,(PetscReal*)addr,&tmp,NULL);CHKERRQ(ierr); 1725c6c1daeSBarry Smith 173b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 1745c6c1daeSBarry Smith item->dtype = PETSC_REAL; 1755c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 1765c6c1daeSBarry 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); 17702c9f0b5SLisandro Dalcin item->next = NULL; 1785c6c1daeSBarry Smith item->msize = msize; 1795c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 1805c6c1daeSBarry Smith PetscFunctionReturn(0); 1815c6c1daeSBarry Smith } 1825c6c1daeSBarry Smith 1835c6c1daeSBarry Smith /*@C 1845c6c1daeSBarry Smith PetscBagRegisterInt - add an integer value to the bag 1855c6c1daeSBarry Smith 1865c6c1daeSBarry Smith Logically Collective on PetscBag 1875c6c1daeSBarry Smith 1885c6c1daeSBarry Smith Input Parameter: 1895c6c1daeSBarry Smith + bag - the bag of values 1905c6c1daeSBarry Smith . addr - location of integer in struct 1915c6c1daeSBarry Smith . mdefault - the initial value 1925c6c1daeSBarry Smith . name - name of the integer 1935c6c1daeSBarry Smith - help - longer string with more information about the value 1945c6c1daeSBarry Smith 1955c6c1daeSBarry Smith Level: beginner 1965c6c1daeSBarry Smith 1975c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 198bafee8b4SSatish Balay PetscBagRegisterInt64(), PetscBagRegisterBool(), PetscBagRegisterScalar() 1995c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 2005c6c1daeSBarry Smith 2015c6c1daeSBarry Smith @*/ 2025c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterInt(PetscBag bag,void *addr,PetscInt mdefault,const char *name,const char *help) 2035c6c1daeSBarry Smith { 2045c6c1daeSBarry Smith PetscErrorCode ierr; 2055c6c1daeSBarry Smith PetscBagItem item; 2065c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 2075c6c1daeSBarry Smith PetscBool printhelp; 2085c6c1daeSBarry Smith 2095c6c1daeSBarry Smith PetscFunctionBegin; 2105c6c1daeSBarry Smith nname[0] = '-'; 2115c6c1daeSBarry Smith nname[1] = 0; 212a126751eSBarry Smith ierr = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr); 2132d747510SLisandro Dalcin ierr = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr); 2145c6c1daeSBarry Smith if (printhelp) { 2155c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%d>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr); 2165c6c1daeSBarry Smith } 217c5929fdfSBarry Smith ierr = PetscOptionsGetInt(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 2185c6c1daeSBarry Smith 219b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 2205c6c1daeSBarry Smith item->dtype = PETSC_INT; 2215c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 2225c6c1daeSBarry 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); 22302c9f0b5SLisandro Dalcin item->next = NULL; 2245c6c1daeSBarry Smith item->msize = 1; 2255c6c1daeSBarry Smith *(PetscInt*)addr = mdefault; 2265c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 2275c6c1daeSBarry Smith PetscFunctionReturn(0); 2285c6c1daeSBarry Smith } 2295c6c1daeSBarry Smith 2300d349d43SBarry Smith /*@C 231bafee8b4SSatish Balay PetscBagRegisterInt64 - add an integer value to the bag 2320d349d43SBarry Smith 2330d349d43SBarry Smith Logically Collective on PetscBag 2340d349d43SBarry Smith 2350d349d43SBarry Smith Input Parameter: 2360d349d43SBarry Smith + bag - the bag of values 2370d349d43SBarry Smith . addr - location of integer in struct 2380d349d43SBarry Smith . mdefault - the initial value 2390d349d43SBarry Smith . name - name of the integer 2400d349d43SBarry Smith - help - longer string with more information about the value 2410d349d43SBarry Smith 2420d349d43SBarry Smith Level: beginner 2430d349d43SBarry Smith 2440d349d43SBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 2450d349d43SBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 2460d349d43SBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 2470d349d43SBarry Smith 2480d349d43SBarry Smith @*/ 249bafee8b4SSatish Balay PetscErrorCode PetscBagRegisterInt64(PetscBag bag,void *addr,PetscInt64 mdefault,const char *name,const char *help) 2500d349d43SBarry Smith { 2510d349d43SBarry Smith PetscErrorCode ierr; 2520d349d43SBarry Smith PetscBagItem item; 2530d349d43SBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 2540d349d43SBarry Smith PetscBool printhelp; 2550d349d43SBarry Smith PetscInt odefault = (PetscInt)mdefault; 2560d349d43SBarry Smith PetscBool flg; 2570d349d43SBarry Smith 2580d349d43SBarry Smith PetscFunctionBegin; 2590d349d43SBarry Smith nname[0] = '-'; 2600d349d43SBarry Smith nname[1] = 0; 261a126751eSBarry Smith ierr = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr); 2622d747510SLisandro Dalcin ierr = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr); 2630d349d43SBarry Smith if (printhelp) { 2640d349d43SBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%d>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,odefault,help);CHKERRQ(ierr); 2650d349d43SBarry Smith } 266c5929fdfSBarry Smith ierr = PetscOptionsGetInt(NULL,bag->bagprefix,nname,&odefault,&flg);CHKERRQ(ierr); 267bafee8b4SSatish Balay if (flg) mdefault = (PetscInt64)odefault; 2680d349d43SBarry Smith 2690d349d43SBarry Smith ierr = PetscNew(&item);CHKERRQ(ierr); 2700d349d43SBarry Smith item->dtype = PETSC_INT; 2710d349d43SBarry Smith item->offset = ((char*)addr) - ((char*)bag); 2720d349d43SBarry 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); 27302c9f0b5SLisandro Dalcin item->next = NULL; 2740d349d43SBarry Smith item->msize = 1; 275bafee8b4SSatish Balay *(PetscInt64*)addr = mdefault; 2760d349d43SBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 2770d349d43SBarry Smith PetscFunctionReturn(0); 2780d349d43SBarry Smith } 2790d349d43SBarry Smith 280dd66f111SBlaise Bourdin /*@C 281dd66f111SBlaise Bourdin PetscBagRegisterBoolArray - add a n logical values to the bag 282dd66f111SBlaise Bourdin 283dd66f111SBlaise Bourdin Logically Collective on PetscBag 284dd66f111SBlaise Bourdin 285dd66f111SBlaise Bourdin Input Parameter: 286dd66f111SBlaise Bourdin + bag - the bag of values 287dd66f111SBlaise Bourdin . addr - location of boolean array in struct 288dd66f111SBlaise Bourdin . msize - number of entries in array 289dd66f111SBlaise Bourdin . name - name of the boolean array 290dd66f111SBlaise Bourdin - help - longer string with more information about the value 291dd66f111SBlaise Bourdin 292dd66f111SBlaise Bourdin Level: beginner 293dd66f111SBlaise Bourdin 294dd66f111SBlaise Bourdin .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 295dd66f111SBlaise Bourdin PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 296dd66f111SBlaise Bourdin PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 297dd66f111SBlaise Bourdin 298dd66f111SBlaise Bourdin @*/ 299dd66f111SBlaise Bourdin PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag,void *addr,PetscInt msize, const char* name, const char* help) 300dd66f111SBlaise Bourdin { 301dd66f111SBlaise Bourdin PetscErrorCode ierr; 302dd66f111SBlaise Bourdin PetscBagItem item; 303dd66f111SBlaise Bourdin char nname[PETSC_BAG_NAME_LENGTH+1]; 304dd66f111SBlaise Bourdin PetscBool printhelp; 305dd66f111SBlaise Bourdin PetscInt i,tmp = msize; 306dd66f111SBlaise Bourdin 307dd66f111SBlaise Bourdin PetscFunctionBegin; 308dd66f111SBlaise Bourdin nname[0] = '-'; 309dd66f111SBlaise Bourdin nname[1] = 0; 310a126751eSBarry Smith ierr = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr); 3112d747510SLisandro Dalcin ierr = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr); 312dd66f111SBlaise Bourdin if (printhelp) { 313dd66f111SBlaise Bourdin ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix?bag->bagprefix:"",name);CHKERRQ(ierr); 314dd66f111SBlaise Bourdin for (i=0; i<msize; i++) { 315dd66f111SBlaise Bourdin ierr = (*PetscHelpPrintf)(bag->bagcomm,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr); 316dd66f111SBlaise Bourdin } 317dd66f111SBlaise Bourdin ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); 318dd66f111SBlaise Bourdin } 319c5929fdfSBarry Smith ierr = PetscOptionsGetBoolArray(NULL,bag->bagprefix,nname,(PetscBool*)addr,&tmp,NULL);CHKERRQ(ierr); 320dd66f111SBlaise Bourdin 321b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 322dd66f111SBlaise Bourdin item->dtype = PETSC_BOOL; 323dd66f111SBlaise Bourdin item->offset = ((char*)addr) - ((char*)bag); 324dd66f111SBlaise 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); 32502c9f0b5SLisandro Dalcin item->next = NULL; 326dd66f111SBlaise Bourdin item->msize = msize; 327dd66f111SBlaise Bourdin ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 328dd66f111SBlaise Bourdin PetscFunctionReturn(0); 329dd66f111SBlaise Bourdin } 330dd66f111SBlaise Bourdin 3315c6c1daeSBarry Smith /*@C 3325c6c1daeSBarry Smith PetscBagRegisterString - add a string value to the bag 3335c6c1daeSBarry Smith 3345c6c1daeSBarry Smith Logically Collective on PetscBag 3355c6c1daeSBarry Smith 3365c6c1daeSBarry Smith Input Parameter: 3375c6c1daeSBarry Smith + bag - the bag of values 3385c6c1daeSBarry Smith . addr - location of start of string in struct 3395c6c1daeSBarry Smith . msize - length of the string space in the struct 3405c6c1daeSBarry Smith . mdefault - the initial value 3415c6c1daeSBarry Smith . name - name of the string 3425c6c1daeSBarry Smith - help - longer string with more information about the value 3435c6c1daeSBarry Smith 3445c6c1daeSBarry Smith Level: beginner 3455c6c1daeSBarry Smith 3465c6c1daeSBarry Smith Note: The struct should have the field char mystring[msize]; not char *mystring 3475c6c1daeSBarry Smith 3485c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 3495c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 3505c6c1daeSBarry Smith PetscBagSetFromOptions(),PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 3515c6c1daeSBarry Smith 3525c6c1daeSBarry Smith @*/ 3535c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* mdefault,const char* name,const char* help) 3545c6c1daeSBarry Smith { 3555c6c1daeSBarry Smith PetscErrorCode ierr; 3565c6c1daeSBarry Smith PetscBagItem item; 3575c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 3585c6c1daeSBarry Smith PetscBool printhelp; 3595c6c1daeSBarry Smith 3605c6c1daeSBarry Smith PetscFunctionBegin; 3615c6c1daeSBarry Smith nname[0] = '-'; 3625c6c1daeSBarry Smith nname[1] = 0; 363a126751eSBarry Smith ierr = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr); 3642d747510SLisandro Dalcin ierr = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr); 3655c6c1daeSBarry Smith if (printhelp) { 3665c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr); 3675c6c1daeSBarry Smith } 3685c6c1daeSBarry Smith 369b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 3705c6c1daeSBarry Smith item->dtype = PETSC_CHAR; 3715c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 3725c6c1daeSBarry 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); 37302c9f0b5SLisandro Dalcin item->next = NULL; 3745c6c1daeSBarry Smith item->msize = msize; 3755c6c1daeSBarry Smith if (mdefault != (char*)addr) { 3765c6c1daeSBarry Smith ierr = PetscStrncpy((char*)addr,mdefault,msize-1);CHKERRQ(ierr); 3775c6c1daeSBarry Smith } 378c5929fdfSBarry Smith ierr = PetscOptionsGetString(NULL,bag->bagprefix,nname,(char*)addr,msize,NULL);CHKERRQ(ierr); 3795c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 3805c6c1daeSBarry Smith PetscFunctionReturn(0); 3815c6c1daeSBarry Smith } 3825c6c1daeSBarry Smith 3835c6c1daeSBarry Smith /*@C 3845c6c1daeSBarry Smith PetscBagRegisterReal - add a real value to the bag 3855c6c1daeSBarry Smith 3865c6c1daeSBarry Smith Logically Collective on PetscBag 3875c6c1daeSBarry Smith 3885c6c1daeSBarry Smith Input Parameter: 3895c6c1daeSBarry Smith + bag - the bag of values 3905c6c1daeSBarry Smith . addr - location of double in struct 3915c6c1daeSBarry Smith . mdefault - the initial value 3925c6c1daeSBarry Smith . name - name of the variable 3935c6c1daeSBarry Smith - help - longer string with more information about the value 3945c6c1daeSBarry Smith 3955c6c1daeSBarry Smith Level: beginner 3965c6c1daeSBarry Smith 3975c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 3985c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 3995c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 4005c6c1daeSBarry Smith 4015c6c1daeSBarry Smith @*/ 4025c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterReal(PetscBag bag,void *addr,PetscReal mdefault, const char *name, const char *help) 4035c6c1daeSBarry Smith { 4045c6c1daeSBarry Smith PetscErrorCode ierr; 4055c6c1daeSBarry Smith PetscBagItem item; 4065c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 4075c6c1daeSBarry Smith PetscBool printhelp; 4085c6c1daeSBarry Smith 4095c6c1daeSBarry Smith PetscFunctionBegin; 4105c6c1daeSBarry Smith nname[0] = '-'; 4115c6c1daeSBarry Smith nname[1] = 0; 412a126751eSBarry Smith ierr = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr); 4132d747510SLisandro Dalcin ierr = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr); 4145c6c1daeSBarry Smith if (printhelp) { 41557622a8eSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%g>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)mdefault,help);CHKERRQ(ierr); 4165c6c1daeSBarry Smith } 417c5929fdfSBarry Smith ierr = PetscOptionsGetReal(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 4185c6c1daeSBarry Smith 419b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 4205c6c1daeSBarry Smith item->dtype = PETSC_REAL; 4215c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 4225c6c1daeSBarry 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); 42302c9f0b5SLisandro Dalcin item->next = NULL; 4245c6c1daeSBarry Smith item->msize = 1; 4255c6c1daeSBarry Smith *(PetscReal*)addr = mdefault; 4265c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 4275c6c1daeSBarry Smith PetscFunctionReturn(0); 4285c6c1daeSBarry Smith } 4295c6c1daeSBarry Smith 4305c6c1daeSBarry Smith /*@C 4315c6c1daeSBarry Smith PetscBagRegisterScalar - add a real or complex number value to the bag 4325c6c1daeSBarry Smith 4335c6c1daeSBarry Smith Logically Collective on PetscBag 4345c6c1daeSBarry Smith 4355c6c1daeSBarry Smith Input Parameter: 4365c6c1daeSBarry Smith + bag - the bag of values 4375c6c1daeSBarry Smith . addr - location of scalar in struct 4385c6c1daeSBarry Smith . mdefault - the initial value 4395c6c1daeSBarry Smith . name - name of the variable 4405c6c1daeSBarry Smith - help - longer string with more information about the value 4415c6c1daeSBarry Smith 4425c6c1daeSBarry Smith 4435c6c1daeSBarry Smith Level: beginner 4445c6c1daeSBarry Smith 4455c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 4465c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 4475c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 4485c6c1daeSBarry Smith 4495c6c1daeSBarry Smith @*/ 4505c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar mdefault,const char *name,const char *help) 4515c6c1daeSBarry Smith { 4525c6c1daeSBarry Smith PetscErrorCode ierr; 4535c6c1daeSBarry Smith PetscBagItem item; 4545c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 4555c6c1daeSBarry Smith PetscBool printhelp; 4565c6c1daeSBarry Smith 4575c6c1daeSBarry Smith PetscFunctionBegin; 4585c6c1daeSBarry Smith nname[0] = '-'; 4595c6c1daeSBarry Smith nname[1] = 0; 460a126751eSBarry Smith ierr = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr); 4612d747510SLisandro Dalcin ierr = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr); 4625c6c1daeSBarry Smith if (printhelp) { 46357622a8eSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%g + %gi>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)PetscRealPart(mdefault),(double)PetscImaginaryPart(mdefault),help);CHKERRQ(ierr); 4645c6c1daeSBarry Smith } 465c5929fdfSBarry Smith ierr = PetscOptionsGetScalar(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 4665c6c1daeSBarry Smith 467b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 4685c6c1daeSBarry Smith item->dtype = PETSC_SCALAR; 4695c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 4705c6c1daeSBarry 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); 47102c9f0b5SLisandro Dalcin item->next = NULL; 4725c6c1daeSBarry Smith item->msize = 1; 4735c6c1daeSBarry Smith *(PetscScalar*)addr = mdefault; 4745c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 4755c6c1daeSBarry Smith PetscFunctionReturn(0); 4765c6c1daeSBarry Smith } 4775c6c1daeSBarry Smith 4785c6c1daeSBarry Smith /*@C 4795c6c1daeSBarry Smith PetscBagRegisterBool - add a logical value to the bag 4805c6c1daeSBarry Smith 4815c6c1daeSBarry Smith Logically Collective on PetscBag 4825c6c1daeSBarry Smith 4835c6c1daeSBarry Smith Input Parameter: 4845c6c1daeSBarry Smith + bag - the bag of values 4855c6c1daeSBarry Smith . addr - location of logical in struct 4865c6c1daeSBarry Smith . mdefault - the initial value 4875c6c1daeSBarry Smith . name - name of the variable 4885c6c1daeSBarry Smith - help - longer string with more information about the value 4895c6c1daeSBarry Smith 4905c6c1daeSBarry Smith 4915c6c1daeSBarry Smith Level: beginner 4925c6c1daeSBarry Smith 4935c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 4945c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 4955c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 4965c6c1daeSBarry Smith 4975c6c1daeSBarry Smith @*/ 4985c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterBool(PetscBag bag,void *addr,PetscBool mdefault,const char *name,const char *help) 4995c6c1daeSBarry Smith { 5005c6c1daeSBarry Smith PetscErrorCode ierr; 5015c6c1daeSBarry Smith PetscBagItem item; 5025c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 5035c6c1daeSBarry Smith PetscBool printhelp; 5045c6c1daeSBarry Smith 5055c6c1daeSBarry Smith PetscFunctionBegin; 5065c6c1daeSBarry 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 */ 5075c6c1daeSBarry 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); 5085c6c1daeSBarry Smith nname[0] = '-'; 5095c6c1daeSBarry Smith nname[1] = 0; 510a126751eSBarry Smith ierr = PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH);CHKERRQ(ierr); 5112d747510SLisandro Dalcin ierr = PetscOptionsHasHelp(NULL,&printhelp);CHKERRQ(ierr); 5125c6c1daeSBarry Smith if (printhelp) { 5135c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,PetscBools[mdefault],help);CHKERRQ(ierr); 5145c6c1daeSBarry Smith } 515c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 5165c6c1daeSBarry Smith 517b00a9115SJed Brown ierr = PetscNew(&item);CHKERRQ(ierr); 5185c6c1daeSBarry Smith item->dtype = PETSC_BOOL; 5195c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 5205c6c1daeSBarry 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); 52102c9f0b5SLisandro Dalcin item->next = NULL; 5225c6c1daeSBarry Smith item->msize = 1; 5235c6c1daeSBarry Smith *(PetscBool*)addr = mdefault; 5245c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 5255c6c1daeSBarry Smith PetscFunctionReturn(0); 5265c6c1daeSBarry Smith } 5275c6c1daeSBarry Smith 5285c6c1daeSBarry Smith /*@C 5295c6c1daeSBarry Smith PetscBagDestroy - Destroys a bag values 5305c6c1daeSBarry Smith 5315c6c1daeSBarry Smith Collective on PetscBag 5325c6c1daeSBarry Smith 5335c6c1daeSBarry Smith Input Parameter: 5345c6c1daeSBarry Smith . bag - the bag of values 5355c6c1daeSBarry Smith 5365c6c1daeSBarry Smith Level: beginner 5375c6c1daeSBarry Smith 5385c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 5395c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 5405c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 5415c6c1daeSBarry Smith 5425c6c1daeSBarry Smith @*/ 5435c6c1daeSBarry Smith PetscErrorCode PetscBagDestroy(PetscBag *bag) 5445c6c1daeSBarry Smith { 5455c6c1daeSBarry Smith PetscErrorCode ierr; 5465c6c1daeSBarry Smith PetscBagItem nitem = (*bag)->bagitems,item; 5475c6c1daeSBarry Smith 5485c6c1daeSBarry Smith PetscFunctionBegin; 5495c6c1daeSBarry Smith while (nitem) { 5505c6c1daeSBarry Smith item = nitem->next; 5515c6c1daeSBarry Smith if (nitem->list) { 5525c6c1daeSBarry Smith ierr = PetscStrArrayDestroy(&nitem->list);CHKERRQ(ierr); 5535c6c1daeSBarry Smith } 5545c6c1daeSBarry Smith ierr = PetscFree(nitem);CHKERRQ(ierr); 5555c6c1daeSBarry Smith nitem = item; 5565c6c1daeSBarry Smith } 5575c6c1daeSBarry Smith if ((*bag)->bagprefix) { ierr = PetscFree((*bag)->bagprefix);CHKERRQ(ierr); } 5585c6c1daeSBarry Smith ierr = PetscFree(*bag);CHKERRQ(ierr); 5595c6c1daeSBarry Smith PetscFunctionReturn(0); 5605c6c1daeSBarry Smith } 5615c6c1daeSBarry Smith 5625c6c1daeSBarry Smith /*@ 5635c6c1daeSBarry Smith PetscBagSetFromOptions - Allows setting options from a bag 5645c6c1daeSBarry Smith 5655c6c1daeSBarry Smith Collective on PetscBag 5665c6c1daeSBarry Smith 5675c6c1daeSBarry Smith Input Parameter: 5685c6c1daeSBarry Smith . bag - the bag of values 5695c6c1daeSBarry Smith 5705c6c1daeSBarry Smith Level: beginner 5715c6c1daeSBarry Smith 5725c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData() 5735c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 5745c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagView(), PetscBagRegisterEnum() 5755c6c1daeSBarry Smith 5765c6c1daeSBarry Smith @*/ 5775c6c1daeSBarry Smith PetscErrorCode PetscBagSetFromOptions(PetscBag bag) 5785c6c1daeSBarry Smith { 5795c6c1daeSBarry Smith PetscErrorCode ierr; 5805c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 5815c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH+1],helpname[PETSC_BAG_NAME_LENGTH+PETSC_BAG_HELP_LENGTH+3]; 5825c6c1daeSBarry Smith PetscInt n; 5835c6c1daeSBarry Smith 5845c6c1daeSBarry Smith PetscFunctionBegin; 585a126751eSBarry Smith ierr = PetscStrncpy(helpname,bag->bagname,sizeof(helpname));CHKERRQ(ierr); 586a126751eSBarry Smith ierr = PetscStrlcat(helpname," ",sizeof(helpname));CHKERRQ(ierr); 587a126751eSBarry Smith ierr = PetscStrlcat(helpname,bag->baghelp,sizeof(helpname));CHKERRQ(ierr); 58802c9f0b5SLisandro Dalcin ierr = PetscOptionsBegin(bag->bagcomm,bag->bagprefix,helpname,NULL);CHKERRQ(ierr); 5895c6c1daeSBarry Smith while (nitem) { 5905c6c1daeSBarry Smith name[0] = '-'; 5915c6c1daeSBarry Smith name[1] = 0; 592a126751eSBarry Smith ierr = PetscStrlcat(name,nitem->name,sizeof(name));CHKERRQ(ierr); 5935c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */ 5945c6c1daeSBarry Smith char *value = (char*)(((char*)bag) + nitem->offset); 5950298fd71SBarry Smith ierr = PetscOptionsString(name,nitem->help,"",value,value,nitem->msize,NULL);CHKERRQ(ierr); 5965c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 5975c6c1daeSBarry Smith PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset); 5985c6c1daeSBarry Smith if (nitem->msize == 1) { 5990298fd71SBarry Smith ierr = PetscOptionsReal(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 6005c6c1daeSBarry Smith } else { 6015c6c1daeSBarry Smith n = nitem->msize; 6020298fd71SBarry Smith ierr = PetscOptionsRealArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr); 6035c6c1daeSBarry Smith } 6045c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 6055c6c1daeSBarry Smith PetscScalar *value = (PetscScalar*)(((char*)bag) + nitem->offset); 6060298fd71SBarry Smith ierr = PetscOptionsScalar(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 6075c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 6085c6c1daeSBarry Smith PetscInt *value = (PetscInt*)(((char*)bag) + nitem->offset); 6095c6c1daeSBarry Smith if (nitem->msize == 1) { 6100298fd71SBarry Smith ierr = PetscOptionsInt(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 6115c6c1daeSBarry Smith } else { 6125c6c1daeSBarry Smith n = nitem->msize; 6130298fd71SBarry Smith ierr = PetscOptionsIntArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr); 6145c6c1daeSBarry Smith } 6155c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 6165c6c1daeSBarry Smith PetscEnum *value = (PetscEnum*)(((char*)bag) + nitem->offset); 6175c6c1daeSBarry Smith PetscInt i = 0; 6185c6c1daeSBarry Smith while (nitem->list[i++]) ; 6190298fd71SBarry Smith ierr = PetscOptionsEnum(name,nitem->help,nitem->list[i-3],(const char*const*)nitem->list,*value,value,NULL);CHKERRQ(ierr); 6205c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 6215c6c1daeSBarry Smith PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset); 622dd66f111SBlaise Bourdin if (nitem->msize == 1) { 6230298fd71SBarry Smith ierr = PetscOptionsBool(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 624dd66f111SBlaise Bourdin } else { 625dd66f111SBlaise Bourdin n = nitem->msize; 626dd66f111SBlaise Bourdin ierr = PetscOptionsBoolArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr); 627dd66f111SBlaise Bourdin } 6285c6c1daeSBarry Smith } 6295c6c1daeSBarry Smith nitem = nitem->next; 6305c6c1daeSBarry Smith } 6315c6c1daeSBarry Smith PetscOptionsEnd(); 6325c6c1daeSBarry Smith PetscFunctionReturn(0); 6335c6c1daeSBarry Smith } 6345c6c1daeSBarry Smith 6355c6c1daeSBarry Smith /*@C 6365c6c1daeSBarry Smith PetscBagView - Views a bag of values as either ASCII text or a binary file 6375c6c1daeSBarry Smith 6385c6c1daeSBarry Smith Collective on PetscBag 6395c6c1daeSBarry Smith 6405c6c1daeSBarry Smith Input Parameter: 6415c6c1daeSBarry Smith + bag - the bag of values 6425c6c1daeSBarry Smith - viewer - location to view the values 6435c6c1daeSBarry Smith 6445c6c1daeSBarry Smith Level: beginner 6455c6c1daeSBarry Smith 6465c6c1daeSBarry Smith Warning: Currently PETSc bags saved in a binary file can only be read back 6475c6c1daeSBarry Smith in on a machine of the same architecture. Let us know when this is a problem 6485c6c1daeSBarry Smith and we'll fix it. 6495c6c1daeSBarry Smith 6505c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData() 6515c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum() 6525c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName() 6535c6c1daeSBarry Smith 6545c6c1daeSBarry Smith @*/ 6555c6c1daeSBarry Smith PetscErrorCode PetscBagView(PetscBag bag,PetscViewer view) 6565c6c1daeSBarry Smith { 6575c6c1daeSBarry Smith PetscBool isascii,isbinary; 6585c6c1daeSBarry Smith PetscErrorCode ierr; 6595c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 6605c6c1daeSBarry Smith 6615c6c1daeSBarry Smith PetscFunctionBegin; 6625c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 6635c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 6645c6c1daeSBarry Smith if (isascii) { 6653ffde785SBarry Smith if (bag->bagprefix) { 6663ffde785SBarry Smith ierr = PetscViewerASCIIPrintf(view,"PetscBag Object: %s (%s) %s\n",bag->bagname,bag->bagprefix,bag->baghelp);CHKERRQ(ierr); 6673ffde785SBarry Smith } else { 6685c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"PetscBag Object: %s %s\n",bag->bagname,bag->baghelp);CHKERRQ(ierr); 6693ffde785SBarry Smith } 6705c6c1daeSBarry Smith while (nitem) { 6715c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { 6725c6c1daeSBarry Smith char *value = (char*)(((char*)bag) + nitem->offset); 6735c6c1daeSBarry Smith char tmp = value[nitem->msize-1]; /* special handling for fortran chars wihout null terminator */ 6745c6c1daeSBarry Smith value[nitem->msize-1] =0; 6755c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %s; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr); 6765c6c1daeSBarry Smith value[nitem->msize-1] = tmp; 6775c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 6785c6c1daeSBarry Smith PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset); 6795c6c1daeSBarry Smith PetscInt i; 6805c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 6815c6c1daeSBarry Smith for (i=0; i<nitem->msize; i++) { 68257622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(view,"%g ",(double)value[i]);CHKERRQ(ierr); 6835c6c1daeSBarry Smith } 6845c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 6855c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 6865c6c1daeSBarry Smith PetscScalar value = *(PetscScalar*)(((char*)bag) + nitem->offset); 6875c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 6888627564fSBarry Smith if ((double)PetscImaginaryPart(value)) { 68957622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %g + %gi; %s\n",nitem->name,(double)PetscRealPart(value),(double)PetscImaginaryPart(value),nitem->help);CHKERRQ(ierr); 6908627564fSBarry Smith } else { 6918627564fSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %g; %s\n",nitem->name,(double)PetscRealPart(value),nitem->help);CHKERRQ(ierr); 6928627564fSBarry Smith } 6935c6c1daeSBarry Smith #else 69457622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %g; %s\n",nitem->name,(double)value,nitem->help);CHKERRQ(ierr); 6955c6c1daeSBarry Smith #endif 6965c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 6975c6c1daeSBarry Smith PetscInt i,*value = (PetscInt*)(((char*)bag) + nitem->offset); 6985c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 6995c6c1daeSBarry Smith for (i=0; i<nitem->msize; i++) { 7005c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"%D ",value[i]);CHKERRQ(ierr); 7015c6c1daeSBarry Smith } 7025c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 7035c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 704dd66f111SBlaise Bourdin PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset); 705dd66f111SBlaise Bourdin PetscInt i; 7065c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 707dd66f111SBlaise Bourdin ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 708dd66f111SBlaise Bourdin for (i=0; i<nitem->msize; i++) { 709dd66f111SBlaise Bourdin if (((int) value[i]) == -1) value[i] = PETSC_TRUE; 7105c6c1daeSBarry 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 */ 711dd66f111SBlaise 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); 712dd66f111SBlaise Bourdin ierr = PetscViewerASCIIPrintf(view," %s",PetscBools[value[i]]);CHKERRQ(ierr); 713dd66f111SBlaise Bourdin } 714dd66f111SBlaise Bourdin ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 7155c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 7165c6c1daeSBarry Smith PetscEnum value = *(PetscEnum*)(((char*)bag) + nitem->offset); 7175c6c1daeSBarry Smith PetscInt i = 0; 7185c6c1daeSBarry Smith while (nitem->list[i++]) ; 7195c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %s; (%s) %s\n",nitem->name,nitem->list[value],nitem->list[i-3],nitem->help);CHKERRQ(ierr); 7205c6c1daeSBarry Smith } 7215c6c1daeSBarry Smith nitem = nitem->next; 7225c6c1daeSBarry Smith } 7235c6c1daeSBarry Smith } else if (isbinary) { 7245c6c1daeSBarry Smith PetscInt classid = PETSC_BAG_FILE_CLASSID, dtype; 7255c6c1daeSBarry Smith PetscInt deprecatedbagsize = 0; 726a261c58fSBarry Smith PetscViewerFormat format; 727f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,&classid,1,PETSC_INT);CHKERRQ(ierr); 728f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,&deprecatedbagsize,1,PETSC_INT);CHKERRQ(ierr); 729f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,&bag->count,1,PETSC_INT);CHKERRQ(ierr); 730f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 731f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 7325c6c1daeSBarry Smith while (nitem) { 733f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,&nitem->offset,1,PETSC_INT);CHKERRQ(ierr); 7345c6c1daeSBarry Smith dtype = (PetscInt)nitem->dtype; 735f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,&dtype,1,PETSC_INT);CHKERRQ(ierr); 736f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,nitem->name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 737f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,nitem->help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 738f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,&nitem->msize,1,PETSC_INT);CHKERRQ(ierr); 7395c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 7405c6c1daeSBarry Smith if (dtype == PETSC_BOOL && ((*(int*) (((char*)bag) + nitem->offset) == -1))) *(int*) (((char*)bag) + nitem->offset) = PETSC_TRUE; 7415c6c1daeSBarry Smith 742f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(view,(((char*)bag) + nitem->offset),nitem->msize,nitem->dtype);CHKERRQ(ierr); 7435c6c1daeSBarry Smith if (dtype == PETSC_ENUM) { 744196bbcbdSSatish Balay ierr = PetscViewerBinaryWriteStringArray(view,(const char* const*)nitem->list);CHKERRQ(ierr); 7455c6c1daeSBarry Smith } 7465c6c1daeSBarry Smith nitem = nitem->next; 7475c6c1daeSBarry Smith } 748a261c58fSBarry Smith ierr = PetscViewerGetFormat(view,&format);CHKERRQ(ierr); 749a261c58fSBarry Smith if (format == PETSC_VIEWER_BINARY_MATLAB) { 750a261c58fSBarry Smith MPI_Comm comm; 751a261c58fSBarry Smith FILE *info; 752a261c58fSBarry Smith ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr); 753a261c58fSBarry Smith ierr = PetscViewerBinaryGetInfoPointer(view,&info);CHKERRQ(ierr); 754da88d4d4SJed Brown ierr = PetscFPrintf(comm,info,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n");CHKERRQ(ierr); 755da88d4d4SJed Brown ierr = PetscFPrintf(comm,info,"#$$ Set.%s = PetscBinaryRead(fd);\n",bag->bagname);CHKERRQ(ierr); 756da88d4d4SJed Brown ierr = PetscFPrintf(comm,info,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n");CHKERRQ(ierr); 757a261c58fSBarry Smith } 758a261c58fSBarry Smith } 7595c6c1daeSBarry Smith PetscFunctionReturn(0); 7605c6c1daeSBarry Smith } 7615c6c1daeSBarry Smith 7625c6c1daeSBarry Smith /*@C 763173f9484SMatthew G. Knepley PetscBagViewFromOptions - Processes command line options to determine if/how a PetscBag is to be viewed. 764173f9484SMatthew G. Knepley 765173f9484SMatthew G. Knepley Collective on PetscBag 766173f9484SMatthew G. Knepley 767173f9484SMatthew G. Knepley Input Parameters: 768173f9484SMatthew G. Knepley + obj - the object 769173f9484SMatthew G. Knepley . bobj - optional other object that provides prefix (if NULL then the prefix in obj is used) 770173f9484SMatthew G. Knepley - optionname - option to activate viewing 771*478db826SMatthew G. Knepley 772173f9484SMatthew G. Knepley Level: intermediate 773*478db826SMatthew G. Knepley 774*478db826SMatthew G. Knepley .seealso: PetscBagCreate(), PetscBag, PetscViewer 775173f9484SMatthew G. Knepley @*/ 776173f9484SMatthew G. Knepley PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[]) 777173f9484SMatthew G. Knepley { 778173f9484SMatthew G. Knepley static PetscBool incall = PETSC_FALSE; 779173f9484SMatthew G. Knepley PetscViewer viewer; 780173f9484SMatthew G. Knepley PetscViewerFormat format; 781173f9484SMatthew G. Knepley const char *prefix, *bprefix = NULL; 782173f9484SMatthew G. Knepley PetscBool flg; 783173f9484SMatthew G. Knepley PetscErrorCode ierr; 784173f9484SMatthew G. Knepley 785173f9484SMatthew G. Knepley PetscFunctionBegin; 786173f9484SMatthew G. Knepley if (incall) PetscFunctionReturn(0); 787173f9484SMatthew G. Knepley incall = PETSC_TRUE; 788173f9484SMatthew G. Knepley if (bobj) {ierr = PetscObjectGetOptionsPrefix(bobj, &bprefix);CHKERRQ(ierr);} 789173f9484SMatthew G. Knepley prefix = bobj ? bprefix : bag->bagprefix; 790173f9484SMatthew G. Knepley ierr = PetscOptionsGetViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg);CHKERRQ(ierr); 791173f9484SMatthew G. Knepley if (flg) { 792173f9484SMatthew G. Knepley ierr = PetscViewerPushFormat(viewer, format);CHKERRQ(ierr); 793173f9484SMatthew G. Knepley ierr = PetscBagView(bag, viewer);CHKERRQ(ierr); 794173f9484SMatthew G. Knepley ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 795173f9484SMatthew G. Knepley ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 796173f9484SMatthew G. Knepley ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 797173f9484SMatthew G. Knepley } 798173f9484SMatthew G. Knepley incall = PETSC_FALSE; 799173f9484SMatthew G. Knepley PetscFunctionReturn(0); 800173f9484SMatthew G. Knepley } 801173f9484SMatthew G. Knepley 802173f9484SMatthew G. Knepley /*@C 8035c6c1daeSBarry Smith PetscBagLoad - Loads a bag of values from a binary file 8045c6c1daeSBarry Smith 8055c6c1daeSBarry Smith Collective on PetscViewer 8065c6c1daeSBarry Smith 8075c6c1daeSBarry Smith Input Parameter: 8085c6c1daeSBarry Smith + viewer - file to load values from 8095c6c1daeSBarry Smith - bag - the bag of values 8105c6c1daeSBarry Smith 81195452b02SPatrick Sanan Notes: 81295452b02SPatrick Sanan You must have created and registered all the fields in the bag before loading into it. 8135c6c1daeSBarry Smith 8145c6c1daeSBarry Smith Notes: 8155c6c1daeSBarry Smith Level: beginner 8165c6c1daeSBarry Smith 8175c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagView(), PetscBagGetData() 8185c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 8195c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 8205c6c1daeSBarry Smith 8215c6c1daeSBarry Smith @*/ 8225c6c1daeSBarry Smith PetscErrorCode PetscBagLoad(PetscViewer view,PetscBag bag) 8235c6c1daeSBarry Smith { 8245c6c1daeSBarry Smith PetscErrorCode ierr; 8255c6c1daeSBarry Smith PetscBool isbinary; 826060da220SMatthew G. Knepley PetscInt classid,bagcount,i,dtype,msize,offset,deprecatedbagsize; 8275c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH],help[PETSC_BAG_HELP_LENGTH],**list; 8285c6c1daeSBarry Smith PetscBagItem nitem; 8295c6c1daeSBarry Smith MPI_Comm comm; 8305c6c1daeSBarry Smith PetscMPIInt flag; 8315c6c1daeSBarry Smith 8325c6c1daeSBarry Smith PetscFunctionBegin; 8335c6c1daeSBarry Smith ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr); 8345c6c1daeSBarry Smith ierr = MPI_Comm_compare(comm,bag->bagcomm,&flag);CHKERRQ(ierr); 8355c6c1daeSBarry Smith if (flag != MPI_CONGRUENT && flag != MPI_IDENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the viewer and bag"); \ 8365c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 8375c6c1daeSBarry Smith if (!isbinary) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type"); 8385c6c1daeSBarry Smith 839060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,&classid,1,NULL,PETSC_INT);CHKERRQ(ierr); 8405c6c1daeSBarry Smith if (classid != PETSC_BAG_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not PetscBag next in binary file"); 841060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,&deprecatedbagsize,1,NULL,PETSC_INT);CHKERRQ(ierr); 842060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,&bagcount,1,NULL,PETSC_INT);CHKERRQ(ierr); 84313903a91SSatish Balay 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); 844060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,bag->bagname,PETSC_BAG_NAME_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr); 845060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr); 8465c6c1daeSBarry Smith 8475c6c1daeSBarry Smith nitem = bag->bagitems; 8485c6c1daeSBarry Smith for (i=0; i<bagcount; i++) { 849060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,&offset,1,NULL,PETSC_INT);CHKERRQ(ierr); 8505c6c1daeSBarry Smith /* ignore the offset in the file */ 851060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,&dtype,1,NULL,PETSC_INT);CHKERRQ(ierr); 852060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,name,PETSC_BAG_NAME_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr); 853060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,help,PETSC_BAG_HELP_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr); 854060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,&msize,1,NULL,PETSC_INT);CHKERRQ(ierr); 8555c6c1daeSBarry Smith 8565c6c1daeSBarry Smith if (dtype == (PetscInt) PETSC_CHAR) { 857060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_CHAR);CHKERRQ(ierr); 8585c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_REAL) { 859060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_REAL);CHKERRQ(ierr); 8605c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_SCALAR) { 861060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,NULL,PETSC_SCALAR);CHKERRQ(ierr); 8625c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_INT) { 863060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_INT);CHKERRQ(ierr); 8645c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_BOOL) { 865060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_BOOL);CHKERRQ(ierr); 8665c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_ENUM) { 867060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 8685c6c1daeSBarry Smith ierr = PetscViewerBinaryReadStringArray(view,&list);CHKERRQ(ierr); 8695c6c1daeSBarry Smith /* don't need to save list because it is already registered in the bag */ 8705c6c1daeSBarry Smith ierr = PetscFree(list);CHKERRQ(ierr); 8715c6c1daeSBarry Smith } 8725c6c1daeSBarry Smith nitem = nitem->next; 8735c6c1daeSBarry Smith } 8745c6c1daeSBarry Smith PetscFunctionReturn(0); 8755c6c1daeSBarry Smith } 8765c6c1daeSBarry Smith 877e8976759SBarry Smith /*@C 8785c6c1daeSBarry Smith PetscBagCreate - Create a bag of values 8795c6c1daeSBarry Smith 880d083f849SBarry Smith Collective 8815c6c1daeSBarry Smith 8825c6c1daeSBarry Smith Level: Intermediate 8835c6c1daeSBarry Smith 8845c6c1daeSBarry Smith Input Parameters: 8855c6c1daeSBarry Smith + comm - communicator to share bag 8865c6c1daeSBarry Smith - bagsize - size of the C structure holding the values 8875c6c1daeSBarry Smith 8885c6c1daeSBarry Smith Output Parameter: 8895c6c1daeSBarry Smith . bag - the bag of values 8905c6c1daeSBarry Smith 8915c6c1daeSBarry Smith Notes: 8925c6c1daeSBarry Smith The size of the A struct must be small enough to fit in a PetscInt; by default 8935c6c1daeSBarry Smith PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length. 8945c6c1daeSBarry Smith The warning about casting to a shorter length can be ignored below unless your A struct is too large 8955c6c1daeSBarry Smith 8965c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 8975c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 8985c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 8995c6c1daeSBarry Smith @*/ 9005c6c1daeSBarry Smith PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag) 9015c6c1daeSBarry Smith { 9025c6c1daeSBarry Smith PetscErrorCode ierr; 9035c6c1daeSBarry Smith size_t totalsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar); 9045c6c1daeSBarry Smith 9055c6c1daeSBarry Smith PetscFunctionBegin; 9060298fd71SBarry Smith ierr = PetscInfo1(NULL,"Creating Bag with total size %d\n",(int)totalsize);CHKERRQ(ierr); 9075c6c1daeSBarry Smith ierr = PetscMalloc(totalsize,bag);CHKERRQ(ierr); 9085c6c1daeSBarry Smith ierr = PetscMemzero(*bag,bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar));CHKERRQ(ierr); 909a297a907SKarl Rupp 9105c6c1daeSBarry Smith (*bag)->bagsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar); 9115c6c1daeSBarry Smith (*bag)->bagcomm = comm; 9120298fd71SBarry Smith (*bag)->bagprefix = NULL; 9135c6c1daeSBarry Smith (*bag)->structlocation = (void*)(((char*)(*bag)) + sizeof(PetscScalar)*(sizeof(struct _n_PetscBag)/sizeof(PetscScalar)) + sizeof(PetscScalar)); 9145c6c1daeSBarry Smith PetscFunctionReturn(0); 9155c6c1daeSBarry Smith } 9165c6c1daeSBarry Smith 9175c6c1daeSBarry Smith /*@C 9185c6c1daeSBarry Smith PetscBagSetName - Sets the name of a bag of values 9195c6c1daeSBarry Smith 9205c6c1daeSBarry Smith Not Collective 9215c6c1daeSBarry Smith 9225c6c1daeSBarry Smith Level: Intermediate 9235c6c1daeSBarry Smith 9245c6c1daeSBarry Smith Input Parameters: 9255c6c1daeSBarry Smith + bag - the bag of values 9265c6c1daeSBarry Smith . name - the name assigned to the bag 9275c6c1daeSBarry Smith - help - help message for bag 9285c6c1daeSBarry Smith 9295c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 9305c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 9315c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 9325c6c1daeSBarry Smith @*/ 9335c6c1daeSBarry Smith 9345c6c1daeSBarry Smith PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help) 9355c6c1daeSBarry Smith { 9365c6c1daeSBarry Smith PetscErrorCode ierr; 9375fd66863SKarl Rupp 9385c6c1daeSBarry Smith PetscFunctionBegin; 9395c6c1daeSBarry Smith ierr = PetscStrncpy(bag->bagname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 9405c6c1daeSBarry Smith ierr = PetscStrncpy(bag->baghelp,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr); 9415c6c1daeSBarry Smith PetscFunctionReturn(0); 9425c6c1daeSBarry Smith } 9435c6c1daeSBarry Smith 9445c6c1daeSBarry Smith 9455c6c1daeSBarry Smith /*@C 9465c6c1daeSBarry Smith PetscBagGetName - Gets the name of a bag of values 9475c6c1daeSBarry Smith 9485c6c1daeSBarry Smith Not Collective 9495c6c1daeSBarry Smith 9505c6c1daeSBarry Smith Level: Intermediate 9515c6c1daeSBarry Smith 9525c6c1daeSBarry Smith Input Parameter: 9535c6c1daeSBarry Smith . bag - the bag of values 9545c6c1daeSBarry Smith 9555c6c1daeSBarry Smith Output Parameter: 9565c6c1daeSBarry Smith . name - the name assigned to the bag 9575c6c1daeSBarry Smith 9585c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 9595c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 9605c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 9615c6c1daeSBarry Smith @*/ 9625c6c1daeSBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, char **name) 9635c6c1daeSBarry Smith { 9645c6c1daeSBarry Smith PetscFunctionBegin; 9655c6c1daeSBarry Smith *name = bag->bagname; 9665c6c1daeSBarry Smith PetscFunctionReturn(0); 9675c6c1daeSBarry Smith } 9685c6c1daeSBarry Smith 9695c6c1daeSBarry Smith /*@C 9705c6c1daeSBarry Smith PetscBagGetData - Gives back the user - access to memory that 9715c6c1daeSBarry Smith should be used for storing user-data-structure 9725c6c1daeSBarry Smith 9735c6c1daeSBarry Smith Not Collective 9745c6c1daeSBarry Smith 9755c6c1daeSBarry Smith Level: Intermediate 9765c6c1daeSBarry Smith 9775c6c1daeSBarry Smith Input Parameter: 9785c6c1daeSBarry Smith . bag - the bag of values 9795c6c1daeSBarry Smith 9805c6c1daeSBarry Smith Output Parameter: 9815c6c1daeSBarry Smith . data - pointer to memory that will have user-data-structure 9825c6c1daeSBarry Smith 9835c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad() 9845c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 9855c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 9865c6c1daeSBarry Smith @*/ 9875c6c1daeSBarry Smith PetscErrorCode PetscBagGetData(PetscBag bag, void **data) 9885c6c1daeSBarry Smith { 9895c6c1daeSBarry Smith PetscFunctionBegin; 9905c6c1daeSBarry Smith *data = bag->structlocation; 9915c6c1daeSBarry Smith PetscFunctionReturn(0); 9925c6c1daeSBarry Smith } 9935c6c1daeSBarry Smith 9945c6c1daeSBarry Smith /*@C 9955c6c1daeSBarry Smith PetscBagSetOptionsPrefix - Sets the prefix used for searching for all 9965c6c1daeSBarry Smith PetscBag items in the options database. 9975c6c1daeSBarry Smith 9985c6c1daeSBarry Smith Logically collective on Bag. 9995c6c1daeSBarry Smith 10005c6c1daeSBarry Smith Level: Intermediate 10015c6c1daeSBarry Smith 10025c6c1daeSBarry Smith Input Parameters: 10035c6c1daeSBarry Smith + bag - the bag of values 10045c6c1daeSBarry Smith - prefix - the prefix to prepend all Bag item names with. 10055c6c1daeSBarry Smith 10065c6c1daeSBarry Smith NOTES: Must be called prior to registering any of the bag items. 10075c6c1daeSBarry Smith 10085c6c1daeSBarry Smith .seealso: PetscBag, PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 10095c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 10105c6c1daeSBarry Smith @*/ 10115c6c1daeSBarry Smith 10125c6c1daeSBarry Smith PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[]) 10135c6c1daeSBarry Smith { 10145c6c1daeSBarry Smith PetscErrorCode ierr; 10155fd66863SKarl Rupp 10165c6c1daeSBarry Smith PetscFunctionBegin; 10175c6c1daeSBarry Smith if (!pre) { 10185c6c1daeSBarry Smith ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr); 10195c6c1daeSBarry Smith } else { 10205c6c1daeSBarry Smith if (pre[0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hypen"); 10215c6c1daeSBarry Smith ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr); 10225c6c1daeSBarry Smith ierr = PetscStrallocpy(pre,&(bag->bagprefix));CHKERRQ(ierr); 10235c6c1daeSBarry Smith } 10245c6c1daeSBarry Smith PetscFunctionReturn(0); 10255c6c1daeSBarry Smith } 1026ffb7e86cSMatthew G. Knepley 1027ffb7e86cSMatthew G. Knepley /*@C 1028ffb7e86cSMatthew G. Knepley PetscBagGetNames - Get the names of all entries in the bag 1029ffb7e86cSMatthew G. Knepley 1030ffb7e86cSMatthew G. Knepley Not collective 1031ffb7e86cSMatthew G. Knepley 1032ffb7e86cSMatthew G. Knepley Input Parameters: 1033ffb7e86cSMatthew G. Knepley + bag - the bag of values 1034ffb7e86cSMatthew G. Knepley - names - array of the correct size to hold names 1035ffb7e86cSMatthew G. Knepley 1036ffb7e86cSMatthew G. Knepley Output Parameter: 1037ffb7e86cSMatthew G. Knepley . names - array of char pointers for names 1038ffb7e86cSMatthew G. Knepley 1039ffb7e86cSMatthew G. Knepley Level: intermediate 1040ffb7e86cSMatthew G. Knepley 1041ffb7e86cSMatthew G. Knepley .seealso: PetscBag, PetscBagGetName(), PetscBagSetName(), PetscBagCreate(), PetscBagGetData() 1042ffb7e86cSMatthew G. Knepley PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum() 1043ffb7e86cSMatthew G. Knepley @*/ 1044ffb7e86cSMatthew G. Knepley PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[]) 1045ffb7e86cSMatthew G. Knepley { 1046ffb7e86cSMatthew G. Knepley PetscBagItem nitem = bag->bagitems; 1047ffb7e86cSMatthew G. Knepley PetscInt n; 1048ffb7e86cSMatthew G. Knepley 1049ffb7e86cSMatthew G. Knepley PetscFunctionBegin; 1050ffb7e86cSMatthew G. Knepley for (n = 0; nitem; ++n, nitem = nitem->next) {names[n] = nitem->name;} 1051ffb7e86cSMatthew G. Knepley PetscFunctionReturn(0); 1052ffb7e86cSMatthew G. Knepley } 1053