1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith #include <../src/sys/classes/bag/bagimpl.h> /*I "petscbag.h" I*/ 3*5c6c1daeSBarry Smith 4*5c6c1daeSBarry Smith 5*5c6c1daeSBarry Smith #undef __FUNCT__ 6*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegister_Private" 7*5c6c1daeSBarry Smith /* 8*5c6c1daeSBarry Smith Adds item to the linked list in a bag 9*5c6c1daeSBarry Smith */ 10*5c6c1daeSBarry Smith static PetscErrorCode PetscBagRegister_Private(PetscBag bag,PetscBagItem item,const char*name,const char*help) 11*5c6c1daeSBarry Smith { 12*5c6c1daeSBarry Smith PetscErrorCode ierr; 13*5c6c1daeSBarry Smith 14*5c6c1daeSBarry Smith PetscFunctionBegin; 15*5c6c1daeSBarry Smith ierr = PetscStrncpy(item->name,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 16*5c6c1daeSBarry Smith ierr = PetscStrncpy(item->help,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr); 17*5c6c1daeSBarry Smith if (!bag->bagitems) bag->bagitems = item; 18*5c6c1daeSBarry Smith else { 19*5c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 20*5c6c1daeSBarry Smith while (nitem->next) { 21*5c6c1daeSBarry Smith nitem = nitem->next; 22*5c6c1daeSBarry Smith } 23*5c6c1daeSBarry Smith nitem->next = item; 24*5c6c1daeSBarry Smith } 25*5c6c1daeSBarry Smith bag->count++; 26*5c6c1daeSBarry Smith PetscFunctionReturn(0); 27*5c6c1daeSBarry Smith } 28*5c6c1daeSBarry Smith 29*5c6c1daeSBarry Smith #undef __FUNCT__ 30*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterEnum" 31*5c6c1daeSBarry Smith /*@C 32*5c6c1daeSBarry Smith PetscBagRegisterEnum - add an enum value to the bag 33*5c6c1daeSBarry Smith 34*5c6c1daeSBarry Smith Logically Collective on PetscBag 35*5c6c1daeSBarry Smith 36*5c6c1daeSBarry Smith Input Parameter: 37*5c6c1daeSBarry Smith + bag - the bag of values 38*5c6c1daeSBarry Smith . addr - location of enum in struct 39*5c6c1daeSBarry Smith . mdefault - the initial value 40*5c6c1daeSBarry Smith . list - array of strings containing names of enum values followed by enum name followed by enum prefix 41*5c6c1daeSBarry Smith - help - longer string with more information about the value 42*5c6c1daeSBarry Smith 43*5c6c1daeSBarry Smith Level: beginner 44*5c6c1daeSBarry Smith 45*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 46*5c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 47*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName() 48*5c6c1daeSBarry Smith 49*5c6c1daeSBarry Smith @*/ 50*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterEnum(PetscBag bag,void *addr,const char *const*list,PetscEnum mdefault, const char *name, const char* help) 51*5c6c1daeSBarry Smith { 52*5c6c1daeSBarry Smith PetscErrorCode ierr; 53*5c6c1daeSBarry Smith PetscBagItem item; 54*5c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 55*5c6c1daeSBarry Smith PetscBool printhelp; 56*5c6c1daeSBarry Smith PetscInt i = 0; 57*5c6c1daeSBarry Smith 58*5c6c1daeSBarry Smith PetscFunctionBegin; 59*5c6c1daeSBarry Smith nname[0] = '-'; 60*5c6c1daeSBarry Smith nname[1] = 0; 61*5c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 62*5c6c1daeSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr); 63*5c6c1daeSBarry Smith if (printhelp) { 64*5c6c1daeSBarry Smith while (list[i++]); 65*5c6c1daeSBarry 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); 66*5c6c1daeSBarry Smith for (i=0; list[i+2]; i++){ 67*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," %s",list[i]);CHKERRQ(ierr); 68*5c6c1daeSBarry Smith } 69*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,"\n");CHKERRQ(ierr); 70*5c6c1daeSBarry Smith } 71*5c6c1daeSBarry Smith ierr = PetscOptionsGetEnum(bag->bagprefix,nname,list,&mdefault,PETSC_NULL);CHKERRQ(ierr); 72*5c6c1daeSBarry Smith 73*5c6c1daeSBarry Smith ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr); 74*5c6c1daeSBarry Smith item->dtype = PETSC_ENUM; 75*5c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 76*5c6c1daeSBarry 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); 77*5c6c1daeSBarry Smith item->next = 0; 78*5c6c1daeSBarry Smith item->msize = 1; 79*5c6c1daeSBarry Smith ierr = PetscStrArrayallocpy(list,(char ***)&item->list);CHKERRQ(ierr); 80*5c6c1daeSBarry Smith *(PetscEnum*)addr = mdefault; 81*5c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 82*5c6c1daeSBarry Smith PetscFunctionReturn(0); 83*5c6c1daeSBarry Smith } 84*5c6c1daeSBarry Smith 85*5c6c1daeSBarry Smith #undef __FUNCT__ 86*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterIntArray" 87*5c6c1daeSBarry Smith /*@C 88*5c6c1daeSBarry Smith PetscBagRegisterIntArray - add an integer value to the bag 89*5c6c1daeSBarry Smith 90*5c6c1daeSBarry Smith Logically Collective on PetscBag 91*5c6c1daeSBarry Smith 92*5c6c1daeSBarry Smith Input Parameter: 93*5c6c1daeSBarry Smith + bag - the bag of values 94*5c6c1daeSBarry Smith . addr - location of integer in struct 95*5c6c1daeSBarry Smith . msize - number of entries in array 96*5c6c1daeSBarry Smith . name - name of the integer array 97*5c6c1daeSBarry Smith - help - longer string with more information about the value 98*5c6c1daeSBarry Smith 99*5c6c1daeSBarry Smith Level: beginner 100*5c6c1daeSBarry Smith 101*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 102*5c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 103*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 104*5c6c1daeSBarry Smith 105*5c6c1daeSBarry Smith @*/ 106*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterIntArray(PetscBag bag,void *addr,PetscInt msize, const char* name, const char* help) 107*5c6c1daeSBarry Smith { 108*5c6c1daeSBarry Smith PetscErrorCode ierr; 109*5c6c1daeSBarry Smith PetscBagItem item; 110*5c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 111*5c6c1daeSBarry Smith PetscBool printhelp; 112*5c6c1daeSBarry Smith PetscInt i,tmp = msize; 113*5c6c1daeSBarry Smith 114*5c6c1daeSBarry Smith PetscFunctionBegin; 115*5c6c1daeSBarry Smith /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/ 116*5c6c1daeSBarry Smith nname[0] = '-'; 117*5c6c1daeSBarry Smith nname[1] = 0; 118*5c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 119*5c6c1daeSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr); 120*5c6c1daeSBarry Smith if (printhelp) { 121*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix?bag->bagprefix:"",name);CHKERRQ(ierr); 122*5c6c1daeSBarry Smith for (i=0; i<msize; i++) { 123*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr); 124*5c6c1daeSBarry Smith } 125*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); 126*5c6c1daeSBarry Smith } 127*5c6c1daeSBarry Smith ierr = PetscOptionsGetIntArray(bag->bagprefix,nname,(PetscInt*)addr,&tmp,PETSC_NULL);CHKERRQ(ierr); 128*5c6c1daeSBarry Smith 129*5c6c1daeSBarry Smith ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr); 130*5c6c1daeSBarry Smith item->dtype = PETSC_INT; 131*5c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 132*5c6c1daeSBarry 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); 133*5c6c1daeSBarry Smith item->next = 0; 134*5c6c1daeSBarry Smith item->msize = msize; 135*5c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 136*5c6c1daeSBarry Smith PetscFunctionReturn(0); 137*5c6c1daeSBarry Smith } 138*5c6c1daeSBarry Smith 139*5c6c1daeSBarry Smith #undef __FUNCT__ 140*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterRealArray" 141*5c6c1daeSBarry Smith /*@C 142*5c6c1daeSBarry Smith PetscBagRegisterRealArray - add an real array to the bag 143*5c6c1daeSBarry Smith 144*5c6c1daeSBarry Smith Logically Collective on PetscBag 145*5c6c1daeSBarry Smith 146*5c6c1daeSBarry Smith Input Parameter: 147*5c6c1daeSBarry Smith + bag - the bag of values 148*5c6c1daeSBarry Smith . addr - location of real array in struct 149*5c6c1daeSBarry Smith . msize - number of entries in array 150*5c6c1daeSBarry Smith . name - name of the integer array 151*5c6c1daeSBarry Smith - help - longer string with more information about the value 152*5c6c1daeSBarry Smith 153*5c6c1daeSBarry Smith Level: beginner 154*5c6c1daeSBarry Smith 155*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 156*5c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 157*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 158*5c6c1daeSBarry Smith 159*5c6c1daeSBarry Smith @*/ 160*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterRealArray(PetscBag bag,void *addr,PetscInt msize, const char* name, const char* help) 161*5c6c1daeSBarry Smith { 162*5c6c1daeSBarry Smith PetscErrorCode ierr; 163*5c6c1daeSBarry Smith PetscBagItem item; 164*5c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 165*5c6c1daeSBarry Smith PetscBool printhelp; 166*5c6c1daeSBarry Smith PetscInt i,tmp = msize; 167*5c6c1daeSBarry Smith 168*5c6c1daeSBarry Smith PetscFunctionBegin; 169*5c6c1daeSBarry Smith /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/ 170*5c6c1daeSBarry Smith nname[0] = '-'; 171*5c6c1daeSBarry Smith nname[1] = 0; 172*5c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 173*5c6c1daeSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr); 174*5c6c1daeSBarry Smith if (printhelp) { 175*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix?bag->bagprefix:"",name);CHKERRQ(ierr); 176*5c6c1daeSBarry Smith for (i=0; i<msize; i++) { 177*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,"%G ",*((PetscReal*)addr)+i);CHKERRQ(ierr); 178*5c6c1daeSBarry Smith } 179*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); 180*5c6c1daeSBarry Smith } 181*5c6c1daeSBarry Smith ierr = PetscOptionsGetRealArray(bag->bagprefix,nname,(PetscReal*)addr,&tmp,PETSC_NULL);CHKERRQ(ierr); 182*5c6c1daeSBarry Smith 183*5c6c1daeSBarry Smith ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr); 184*5c6c1daeSBarry Smith item->dtype = PETSC_REAL; 185*5c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 186*5c6c1daeSBarry 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); 187*5c6c1daeSBarry Smith item->next = 0; 188*5c6c1daeSBarry Smith item->msize = msize; 189*5c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 190*5c6c1daeSBarry Smith PetscFunctionReturn(0); 191*5c6c1daeSBarry Smith } 192*5c6c1daeSBarry Smith 193*5c6c1daeSBarry Smith #undef __FUNCT__ 194*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterInt" 195*5c6c1daeSBarry Smith /*@C 196*5c6c1daeSBarry Smith PetscBagRegisterInt - add an integer value to the bag 197*5c6c1daeSBarry Smith 198*5c6c1daeSBarry Smith Logically Collective on PetscBag 199*5c6c1daeSBarry Smith 200*5c6c1daeSBarry Smith Input Parameter: 201*5c6c1daeSBarry Smith + bag - the bag of values 202*5c6c1daeSBarry Smith . addr - location of integer in struct 203*5c6c1daeSBarry Smith . mdefault - the initial value 204*5c6c1daeSBarry Smith . name - name of the integer 205*5c6c1daeSBarry Smith - help - longer string with more information about the value 206*5c6c1daeSBarry Smith 207*5c6c1daeSBarry Smith Level: beginner 208*5c6c1daeSBarry Smith 209*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 210*5c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 211*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 212*5c6c1daeSBarry Smith 213*5c6c1daeSBarry Smith @*/ 214*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterInt(PetscBag bag,void *addr,PetscInt mdefault, const char* name, const char* help) 215*5c6c1daeSBarry Smith { 216*5c6c1daeSBarry Smith PetscErrorCode ierr; 217*5c6c1daeSBarry Smith PetscBagItem item; 218*5c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 219*5c6c1daeSBarry Smith PetscBool printhelp; 220*5c6c1daeSBarry Smith 221*5c6c1daeSBarry Smith PetscFunctionBegin; 222*5c6c1daeSBarry Smith nname[0] = '-'; 223*5c6c1daeSBarry Smith nname[1] = 0; 224*5c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 225*5c6c1daeSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr); 226*5c6c1daeSBarry Smith if (printhelp) { 227*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%d>: %s \n",bag->bagprefix?bag->bagprefix:"",name,mdefault,help);CHKERRQ(ierr); 228*5c6c1daeSBarry Smith } 229*5c6c1daeSBarry Smith ierr = PetscOptionsGetInt(bag->bagprefix,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr); 230*5c6c1daeSBarry Smith 231*5c6c1daeSBarry Smith ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr); 232*5c6c1daeSBarry Smith item->dtype = PETSC_INT; 233*5c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 234*5c6c1daeSBarry 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); 235*5c6c1daeSBarry Smith item->next = 0; 236*5c6c1daeSBarry Smith item->msize = 1; 237*5c6c1daeSBarry Smith *(PetscInt*)addr = mdefault; 238*5c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 239*5c6c1daeSBarry Smith PetscFunctionReturn(0); 240*5c6c1daeSBarry Smith } 241*5c6c1daeSBarry Smith 242*5c6c1daeSBarry Smith #undef __FUNCT__ 243*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterString" 244*5c6c1daeSBarry Smith /*@C 245*5c6c1daeSBarry Smith PetscBagRegisterString - add a string value to the bag 246*5c6c1daeSBarry Smith 247*5c6c1daeSBarry Smith Logically Collective on PetscBag 248*5c6c1daeSBarry Smith 249*5c6c1daeSBarry Smith Input Parameter: 250*5c6c1daeSBarry Smith + bag - the bag of values 251*5c6c1daeSBarry Smith . addr - location of start of string in struct 252*5c6c1daeSBarry Smith . msize - length of the string space in the struct 253*5c6c1daeSBarry Smith . mdefault - the initial value 254*5c6c1daeSBarry Smith . name - name of the string 255*5c6c1daeSBarry Smith - help - longer string with more information about the value 256*5c6c1daeSBarry Smith 257*5c6c1daeSBarry Smith Level: beginner 258*5c6c1daeSBarry Smith 259*5c6c1daeSBarry Smith Note: The struct should have the field char mystring[msize]; not char *mystring 260*5c6c1daeSBarry Smith 261*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 262*5c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 263*5c6c1daeSBarry Smith PetscBagSetFromOptions(),PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 264*5c6c1daeSBarry Smith 265*5c6c1daeSBarry Smith @*/ 266*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* mdefault, const char* name, const char* help) 267*5c6c1daeSBarry Smith { 268*5c6c1daeSBarry Smith PetscErrorCode ierr; 269*5c6c1daeSBarry Smith PetscBagItem item; 270*5c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 271*5c6c1daeSBarry Smith PetscBool printhelp; 272*5c6c1daeSBarry Smith 273*5c6c1daeSBarry Smith PetscFunctionBegin; 274*5c6c1daeSBarry Smith nname[0] = '-'; 275*5c6c1daeSBarry Smith nname[1] = 0; 276*5c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 277*5c6c1daeSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr); 278*5c6c1daeSBarry Smith if (printhelp) { 279*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix?bag->bagprefix:"",name,mdefault,help);CHKERRQ(ierr); 280*5c6c1daeSBarry Smith } 281*5c6c1daeSBarry Smith 282*5c6c1daeSBarry Smith ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr); 283*5c6c1daeSBarry Smith item->dtype = PETSC_CHAR; 284*5c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 285*5c6c1daeSBarry 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); 286*5c6c1daeSBarry Smith item->next = 0; 287*5c6c1daeSBarry Smith item->msize = msize; 288*5c6c1daeSBarry Smith if (mdefault != (char*)addr) { 289*5c6c1daeSBarry Smith ierr = PetscStrncpy((char*)addr,mdefault,msize-1);CHKERRQ(ierr); 290*5c6c1daeSBarry Smith } 291*5c6c1daeSBarry Smith ierr = PetscOptionsGetString(bag->bagprefix,nname,(char*)addr,msize,PETSC_NULL);CHKERRQ(ierr); 292*5c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 293*5c6c1daeSBarry Smith PetscFunctionReturn(0); 294*5c6c1daeSBarry Smith } 295*5c6c1daeSBarry Smith 296*5c6c1daeSBarry Smith #undef __FUNCT__ 297*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterReal" 298*5c6c1daeSBarry Smith /*@C 299*5c6c1daeSBarry Smith PetscBagRegisterReal - add a real value to the bag 300*5c6c1daeSBarry Smith 301*5c6c1daeSBarry Smith Logically Collective on PetscBag 302*5c6c1daeSBarry Smith 303*5c6c1daeSBarry Smith Input Parameter: 304*5c6c1daeSBarry Smith + bag - the bag of values 305*5c6c1daeSBarry Smith . addr - location of double in struct 306*5c6c1daeSBarry Smith . mdefault - the initial value 307*5c6c1daeSBarry Smith . name - name of the variable 308*5c6c1daeSBarry Smith - help - longer string with more information about the value 309*5c6c1daeSBarry Smith 310*5c6c1daeSBarry Smith Level: beginner 311*5c6c1daeSBarry Smith 312*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 313*5c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 314*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 315*5c6c1daeSBarry Smith 316*5c6c1daeSBarry Smith @*/ 317*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterReal(PetscBag bag,void *addr,PetscReal mdefault, const char* name, const char* help) 318*5c6c1daeSBarry Smith { 319*5c6c1daeSBarry Smith PetscErrorCode ierr; 320*5c6c1daeSBarry Smith PetscBagItem item; 321*5c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 322*5c6c1daeSBarry Smith PetscBool printhelp; 323*5c6c1daeSBarry Smith 324*5c6c1daeSBarry Smith PetscFunctionBegin; 325*5c6c1daeSBarry Smith nname[0] = '-'; 326*5c6c1daeSBarry Smith nname[1] = 0; 327*5c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 328*5c6c1daeSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr); 329*5c6c1daeSBarry Smith if (printhelp) { 330*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%G>: %s \n",bag->bagprefix?bag->bagprefix:"",name,mdefault,help);CHKERRQ(ierr); 331*5c6c1daeSBarry Smith } 332*5c6c1daeSBarry Smith ierr = PetscOptionsGetReal(bag->bagprefix,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr); 333*5c6c1daeSBarry Smith 334*5c6c1daeSBarry Smith ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr); 335*5c6c1daeSBarry Smith item->dtype = PETSC_REAL; 336*5c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 337*5c6c1daeSBarry 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); 338*5c6c1daeSBarry Smith item->next = 0; 339*5c6c1daeSBarry Smith item->msize = 1; 340*5c6c1daeSBarry Smith *(PetscReal*)addr = mdefault; 341*5c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 342*5c6c1daeSBarry Smith PetscFunctionReturn(0); 343*5c6c1daeSBarry Smith } 344*5c6c1daeSBarry Smith 345*5c6c1daeSBarry Smith #undef __FUNCT__ 346*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterScalar" 347*5c6c1daeSBarry Smith /*@C 348*5c6c1daeSBarry Smith PetscBagRegisterScalar - add a real or complex number value to the bag 349*5c6c1daeSBarry Smith 350*5c6c1daeSBarry Smith Logically Collective on PetscBag 351*5c6c1daeSBarry Smith 352*5c6c1daeSBarry Smith Input Parameter: 353*5c6c1daeSBarry Smith + bag - the bag of values 354*5c6c1daeSBarry Smith . addr - location of scalar in struct 355*5c6c1daeSBarry Smith . mdefault - the initial value 356*5c6c1daeSBarry Smith . name - name of the variable 357*5c6c1daeSBarry Smith - help - longer string with more information about the value 358*5c6c1daeSBarry Smith 359*5c6c1daeSBarry Smith 360*5c6c1daeSBarry Smith Level: beginner 361*5c6c1daeSBarry Smith 362*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 363*5c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 364*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 365*5c6c1daeSBarry Smith 366*5c6c1daeSBarry Smith @*/ 367*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar mdefault, const char* name, const char* help) 368*5c6c1daeSBarry Smith { 369*5c6c1daeSBarry Smith PetscErrorCode ierr; 370*5c6c1daeSBarry Smith PetscBagItem item; 371*5c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 372*5c6c1daeSBarry Smith PetscBool printhelp; 373*5c6c1daeSBarry Smith 374*5c6c1daeSBarry Smith PetscFunctionBegin; 375*5c6c1daeSBarry Smith nname[0] = '-'; 376*5c6c1daeSBarry Smith nname[1] = 0; 377*5c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 378*5c6c1daeSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr); 379*5c6c1daeSBarry Smith if (printhelp) { 380*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%G + %Gi>: %s \n",bag->bagprefix?bag->bagprefix:"",name,PetscRealPart(mdefault),PetscImaginaryPart(mdefault),help);CHKERRQ(ierr); 381*5c6c1daeSBarry Smith } 382*5c6c1daeSBarry Smith ierr = PetscOptionsGetScalar(bag->bagprefix,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr); 383*5c6c1daeSBarry Smith 384*5c6c1daeSBarry Smith ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr); 385*5c6c1daeSBarry Smith item->dtype = PETSC_SCALAR; 386*5c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 387*5c6c1daeSBarry 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); 388*5c6c1daeSBarry Smith item->next = 0; 389*5c6c1daeSBarry Smith item->msize = 1; 390*5c6c1daeSBarry Smith *(PetscScalar*)addr = mdefault; 391*5c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 392*5c6c1daeSBarry Smith PetscFunctionReturn(0); 393*5c6c1daeSBarry Smith } 394*5c6c1daeSBarry Smith 395*5c6c1daeSBarry Smith #undef __FUNCT__ 396*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagRegisterBool" 397*5c6c1daeSBarry Smith /*@C 398*5c6c1daeSBarry Smith PetscBagRegisterBool - add a logical value to the bag 399*5c6c1daeSBarry Smith 400*5c6c1daeSBarry Smith Logically Collective on PetscBag 401*5c6c1daeSBarry Smith 402*5c6c1daeSBarry Smith Input Parameter: 403*5c6c1daeSBarry Smith + bag - the bag of values 404*5c6c1daeSBarry Smith . addr - location of logical in struct 405*5c6c1daeSBarry Smith . mdefault - the initial value 406*5c6c1daeSBarry Smith . name - name of the variable 407*5c6c1daeSBarry Smith - help - longer string with more information about the value 408*5c6c1daeSBarry Smith 409*5c6c1daeSBarry Smith 410*5c6c1daeSBarry Smith Level: beginner 411*5c6c1daeSBarry Smith 412*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 413*5c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 414*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 415*5c6c1daeSBarry Smith 416*5c6c1daeSBarry Smith @*/ 417*5c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterBool(PetscBag bag,void *addr,PetscBool mdefault, const char* name, const char* help) 418*5c6c1daeSBarry Smith { 419*5c6c1daeSBarry Smith PetscErrorCode ierr; 420*5c6c1daeSBarry Smith PetscBagItem item; 421*5c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 422*5c6c1daeSBarry Smith PetscBool printhelp; 423*5c6c1daeSBarry Smith 424*5c6c1daeSBarry Smith PetscFunctionBegin; 425*5c6c1daeSBarry 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 */ 426*5c6c1daeSBarry 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); 427*5c6c1daeSBarry Smith nname[0] = '-'; 428*5c6c1daeSBarry Smith nname[1] = 0; 429*5c6c1daeSBarry Smith ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 430*5c6c1daeSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr); 431*5c6c1daeSBarry Smith if (printhelp) { 432*5c6c1daeSBarry Smith ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix?bag->bagprefix:"",name,PetscBools[mdefault],help);CHKERRQ(ierr); 433*5c6c1daeSBarry Smith } 434*5c6c1daeSBarry Smith ierr = PetscOptionsGetBool(bag->bagprefix,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr); 435*5c6c1daeSBarry Smith 436*5c6c1daeSBarry Smith ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr); 437*5c6c1daeSBarry Smith item->dtype = PETSC_BOOL; 438*5c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 439*5c6c1daeSBarry 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); 440*5c6c1daeSBarry Smith item->next = 0; 441*5c6c1daeSBarry Smith item->msize = 1; 442*5c6c1daeSBarry Smith *(PetscBool*)addr = mdefault; 443*5c6c1daeSBarry Smith ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 444*5c6c1daeSBarry Smith PetscFunctionReturn(0); 445*5c6c1daeSBarry Smith } 446*5c6c1daeSBarry Smith 447*5c6c1daeSBarry Smith #undef __FUNCT__ 448*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagDestroy" 449*5c6c1daeSBarry Smith /*@C 450*5c6c1daeSBarry Smith PetscBagDestroy - Destroys a bag values 451*5c6c1daeSBarry Smith 452*5c6c1daeSBarry Smith Collective on PetscBag 453*5c6c1daeSBarry Smith 454*5c6c1daeSBarry Smith Input Parameter: 455*5c6c1daeSBarry Smith . bag - the bag of values 456*5c6c1daeSBarry Smith 457*5c6c1daeSBarry Smith Level: beginner 458*5c6c1daeSBarry Smith 459*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 460*5c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 461*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 462*5c6c1daeSBarry Smith 463*5c6c1daeSBarry Smith @*/ 464*5c6c1daeSBarry Smith PetscErrorCode PetscBagDestroy(PetscBag *bag) 465*5c6c1daeSBarry Smith { 466*5c6c1daeSBarry Smith PetscErrorCode ierr; 467*5c6c1daeSBarry Smith PetscBagItem nitem = (*bag)->bagitems,item; 468*5c6c1daeSBarry Smith 469*5c6c1daeSBarry Smith PetscFunctionBegin; 470*5c6c1daeSBarry Smith while (nitem) { 471*5c6c1daeSBarry Smith item = nitem->next; 472*5c6c1daeSBarry Smith if (nitem->list) { 473*5c6c1daeSBarry Smith ierr = PetscStrArrayDestroy(&nitem->list);CHKERRQ(ierr); 474*5c6c1daeSBarry Smith } 475*5c6c1daeSBarry Smith ierr = PetscFree(nitem);CHKERRQ(ierr); 476*5c6c1daeSBarry Smith nitem = item; 477*5c6c1daeSBarry Smith } 478*5c6c1daeSBarry Smith if ((*bag)->bagprefix) { ierr = PetscFree((*bag)->bagprefix);CHKERRQ(ierr); } 479*5c6c1daeSBarry Smith ierr = PetscFree(*bag);CHKERRQ(ierr); 480*5c6c1daeSBarry Smith PetscFunctionReturn(0); 481*5c6c1daeSBarry Smith } 482*5c6c1daeSBarry Smith 483*5c6c1daeSBarry Smith #undef __FUNCT__ 484*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetFromOptions" 485*5c6c1daeSBarry Smith /*@ 486*5c6c1daeSBarry Smith PetscBagSetFromOptions - Allows setting options from a bag 487*5c6c1daeSBarry Smith 488*5c6c1daeSBarry Smith Collective on PetscBag 489*5c6c1daeSBarry Smith 490*5c6c1daeSBarry Smith Input Parameter: 491*5c6c1daeSBarry Smith . bag - the bag of values 492*5c6c1daeSBarry Smith 493*5c6c1daeSBarry Smith Level: beginner 494*5c6c1daeSBarry Smith 495*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData() 496*5c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 497*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagView(), PetscBagRegisterEnum() 498*5c6c1daeSBarry Smith 499*5c6c1daeSBarry Smith @*/ 500*5c6c1daeSBarry Smith PetscErrorCode PetscBagSetFromOptions(PetscBag bag) 501*5c6c1daeSBarry Smith { 502*5c6c1daeSBarry Smith PetscErrorCode ierr; 503*5c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 504*5c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH+1],helpname[PETSC_BAG_NAME_LENGTH+PETSC_BAG_HELP_LENGTH+3]; 505*5c6c1daeSBarry Smith PetscInt n; 506*5c6c1daeSBarry Smith 507*5c6c1daeSBarry Smith PetscFunctionBegin; 508*5c6c1daeSBarry Smith ierr = PetscStrcpy(helpname,bag->bagname);CHKERRQ(ierr); 509*5c6c1daeSBarry Smith ierr = PetscStrcat(helpname," ");CHKERRQ(ierr); 510*5c6c1daeSBarry Smith ierr = PetscStrcat(helpname,bag->baghelp);CHKERRQ(ierr); 511*5c6c1daeSBarry Smith ierr = PetscOptionsBegin(bag->bagcomm,bag->bagprefix,helpname,0); 512*5c6c1daeSBarry Smith while (nitem) { 513*5c6c1daeSBarry Smith name[0] = '-'; 514*5c6c1daeSBarry Smith name[1] = 0; 515*5c6c1daeSBarry Smith ierr = PetscStrcat(name,nitem->name);CHKERRQ(ierr); 516*5c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */ 517*5c6c1daeSBarry Smith char *value = (char*)(((char*)bag) + nitem->offset); 518*5c6c1daeSBarry Smith ierr = PetscOptionsString(name,nitem->help,"",value,value,nitem->msize,PETSC_NULL);CHKERRQ(ierr); 519*5c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 520*5c6c1daeSBarry Smith PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset); 521*5c6c1daeSBarry Smith if (nitem->msize == 1) { 522*5c6c1daeSBarry Smith ierr = PetscOptionsReal(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr); 523*5c6c1daeSBarry Smith } else { 524*5c6c1daeSBarry Smith n = nitem->msize; 525*5c6c1daeSBarry Smith ierr = PetscOptionsRealArray(name,nitem->help,"",value,&n,PETSC_NULL);CHKERRQ(ierr); 526*5c6c1daeSBarry Smith } 527*5c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 528*5c6c1daeSBarry Smith PetscScalar *value = (PetscScalar*)(((char*)bag) + nitem->offset); 529*5c6c1daeSBarry Smith ierr = PetscOptionsScalar(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr); 530*5c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 531*5c6c1daeSBarry Smith PetscInt *value = (PetscInt*)(((char*)bag) + nitem->offset); 532*5c6c1daeSBarry Smith if (nitem->msize == 1) { 533*5c6c1daeSBarry Smith ierr = PetscOptionsInt(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr); 534*5c6c1daeSBarry Smith } else { 535*5c6c1daeSBarry Smith n = nitem->msize; 536*5c6c1daeSBarry Smith ierr = PetscOptionsIntArray(name,nitem->help,"",value,&n,PETSC_NULL);CHKERRQ(ierr); 537*5c6c1daeSBarry Smith } 538*5c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 539*5c6c1daeSBarry Smith PetscEnum *value = (PetscEnum*)(((char*)bag) + nitem->offset); 540*5c6c1daeSBarry Smith PetscInt i = 0; 541*5c6c1daeSBarry Smith while (nitem->list[i++]); 542*5c6c1daeSBarry Smith ierr = PetscOptionsEnum(name,nitem->help,nitem->list[i-3],(const char*const*)nitem->list,*value,value,PETSC_NULL);CHKERRQ(ierr); 543*5c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 544*5c6c1daeSBarry Smith PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset); 545*5c6c1daeSBarry Smith ierr = PetscOptionsBool(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr); 546*5c6c1daeSBarry Smith } 547*5c6c1daeSBarry Smith nitem = nitem->next; 548*5c6c1daeSBarry Smith } 549*5c6c1daeSBarry Smith PetscOptionsEnd(); 550*5c6c1daeSBarry Smith PetscFunctionReturn(0); 551*5c6c1daeSBarry Smith } 552*5c6c1daeSBarry Smith 553*5c6c1daeSBarry Smith #undef __FUNCT__ 554*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagView" 555*5c6c1daeSBarry Smith /*@C 556*5c6c1daeSBarry Smith PetscBagView - Views a bag of values as either ASCII text or a binary file 557*5c6c1daeSBarry Smith 558*5c6c1daeSBarry Smith Collective on PetscBag 559*5c6c1daeSBarry Smith 560*5c6c1daeSBarry Smith Input Parameter: 561*5c6c1daeSBarry Smith + bag - the bag of values 562*5c6c1daeSBarry Smith - viewer - location to view the values 563*5c6c1daeSBarry Smith 564*5c6c1daeSBarry Smith Level: beginner 565*5c6c1daeSBarry Smith 566*5c6c1daeSBarry Smith Warning: Currently PETSc bags saved in a binary file can only be read back 567*5c6c1daeSBarry Smith in on a machine of the same architecture. Let us know when this is a problem 568*5c6c1daeSBarry Smith and we'll fix it. 569*5c6c1daeSBarry Smith 570*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData() 571*5c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum() 572*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName() 573*5c6c1daeSBarry Smith 574*5c6c1daeSBarry Smith @*/ 575*5c6c1daeSBarry Smith PetscErrorCode PetscBagView(PetscBag bag,PetscViewer view) 576*5c6c1daeSBarry Smith { 577*5c6c1daeSBarry Smith PetscBool isascii,isbinary; 578*5c6c1daeSBarry Smith PetscErrorCode ierr; 579*5c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 580*5c6c1daeSBarry Smith 581*5c6c1daeSBarry Smith PetscFunctionBegin; 582*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 583*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 584*5c6c1daeSBarry Smith if (isascii) { 585*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"PetscBag Object: %s %s\n",bag->bagname,bag->baghelp);CHKERRQ(ierr); 586*5c6c1daeSBarry Smith while (nitem) { 587*5c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { 588*5c6c1daeSBarry Smith char* value = (char*)(((char*)bag) + nitem->offset); 589*5c6c1daeSBarry Smith char tmp = value[nitem->msize-1]; /* special handling for fortran chars wihout null terminator */ 590*5c6c1daeSBarry Smith value[nitem->msize-1] =0; 591*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %s; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr); 592*5c6c1daeSBarry Smith value[nitem->msize-1] =tmp; 593*5c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 594*5c6c1daeSBarry Smith PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset); 595*5c6c1daeSBarry Smith PetscInt i; 596*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 597*5c6c1daeSBarry Smith for (i=0; i<nitem->msize; i++) { 598*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"%G ",value[i]);CHKERRQ(ierr); 599*5c6c1daeSBarry Smith } 600*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 601*5c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 602*5c6c1daeSBarry Smith PetscScalar value = *(PetscScalar*)(((char*)bag) + nitem->offset); 603*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 604*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %G + %Gi; %s\n",nitem->name,PetscRealPart(value),PetscImaginaryPart(value),nitem->help);CHKERRQ(ierr); 605*5c6c1daeSBarry Smith #else 606*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %G; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr); 607*5c6c1daeSBarry Smith #endif 608*5c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 609*5c6c1daeSBarry Smith PetscInt i,*value = (PetscInt*)(((char*)bag) + nitem->offset); 610*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 611*5c6c1daeSBarry Smith for (i=0; i<nitem->msize; i++) { 612*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"%D ",value[i]);CHKERRQ(ierr); 613*5c6c1daeSBarry Smith } 614*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 615*5c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 616*5c6c1daeSBarry Smith PetscBool value = *(PetscBool*)(((char*)bag) + nitem->offset); 617*5c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 618*5c6c1daeSBarry Smith if (((int) value) == -1) value = PETSC_TRUE; 619*5c6c1daeSBarry 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 */ 620*5c6c1daeSBarry Smith if (value != PETSC_FALSE && value != PETSC_TRUE) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Boolean value for %s %s is corrupt; integer value %d",nitem->name,nitem->help,value); 621*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %s; %s\n",nitem->name,PetscBools[value],nitem->help);CHKERRQ(ierr); 622*5c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 623*5c6c1daeSBarry Smith PetscEnum value = *(PetscEnum*)(((char*)bag) + nitem->offset); 624*5c6c1daeSBarry Smith PetscInt i = 0; 625*5c6c1daeSBarry Smith while (nitem->list[i++]); 626*5c6c1daeSBarry Smith ierr = PetscViewerASCIIPrintf(view," %s = %s; (%s) %s\n",nitem->name,nitem->list[value],nitem->list[i-3],nitem->help);CHKERRQ(ierr); 627*5c6c1daeSBarry Smith } 628*5c6c1daeSBarry Smith nitem = nitem->next; 629*5c6c1daeSBarry Smith } 630*5c6c1daeSBarry Smith } else if (isbinary) { 631*5c6c1daeSBarry Smith PetscInt classid = PETSC_BAG_FILE_CLASSID, dtype; 632*5c6c1daeSBarry Smith PetscInt deprecatedbagsize = 0; 633*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&classid,1,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 634*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&deprecatedbagsize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 635*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&bag->count,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 636*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 637*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 638*5c6c1daeSBarry Smith while (nitem) { 639*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&nitem->offset,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 640*5c6c1daeSBarry Smith dtype = (PetscInt)nitem->dtype; 641*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&dtype,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 642*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,nitem->name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 643*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,nitem->help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 644*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,&nitem->msize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 645*5c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 646*5c6c1daeSBarry Smith if (dtype == PETSC_BOOL && ((*(int*) (((char*)bag) + nitem->offset) == -1))) *(int*) (((char*)bag) + nitem->offset) = PETSC_TRUE; 647*5c6c1daeSBarry Smith 648*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWrite(view,(((char*)bag) + nitem->offset),nitem->msize,nitem->dtype,PETSC_FALSE);CHKERRQ(ierr); 649*5c6c1daeSBarry Smith if (dtype == PETSC_ENUM) { 650*5c6c1daeSBarry Smith ierr = PetscViewerBinaryWriteStringArray(view,(char **)nitem->list);CHKERRQ(ierr); 651*5c6c1daeSBarry Smith } 652*5c6c1daeSBarry Smith nitem = nitem->next; 653*5c6c1daeSBarry Smith } 654*5c6c1daeSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type"); 655*5c6c1daeSBarry Smith PetscFunctionReturn(0); 656*5c6c1daeSBarry Smith } 657*5c6c1daeSBarry Smith 658*5c6c1daeSBarry Smith #undef __FUNCT__ 659*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagLoad" 660*5c6c1daeSBarry Smith /*@C 661*5c6c1daeSBarry Smith PetscBagLoad - Loads a bag of values from a binary file 662*5c6c1daeSBarry Smith 663*5c6c1daeSBarry Smith Collective on PetscViewer 664*5c6c1daeSBarry Smith 665*5c6c1daeSBarry Smith Input Parameter: 666*5c6c1daeSBarry Smith + viewer - file to load values from 667*5c6c1daeSBarry Smith - bag - the bag of values 668*5c6c1daeSBarry Smith 669*5c6c1daeSBarry Smith Notes: You must have created and registered all the fields in the bag before loading into it. 670*5c6c1daeSBarry Smith 671*5c6c1daeSBarry Smith Notes: 672*5c6c1daeSBarry Smith Level: beginner 673*5c6c1daeSBarry Smith 674*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagView(), PetscBagGetData() 675*5c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 676*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 677*5c6c1daeSBarry Smith 678*5c6c1daeSBarry Smith @*/ 679*5c6c1daeSBarry Smith PetscErrorCode PetscBagLoad(PetscViewer view,PetscBag bag) 680*5c6c1daeSBarry Smith { 681*5c6c1daeSBarry Smith PetscErrorCode ierr; 682*5c6c1daeSBarry Smith PetscBool isbinary; 683*5c6c1daeSBarry Smith PetscInt classid,bagcount,i,dtype,msize,offset,deprecatedbagsize; 684*5c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH],help[PETSC_BAG_HELP_LENGTH],**list; 685*5c6c1daeSBarry Smith PetscBagItem nitem; 686*5c6c1daeSBarry Smith MPI_Comm comm; 687*5c6c1daeSBarry Smith PetscMPIInt flag; 688*5c6c1daeSBarry Smith 689*5c6c1daeSBarry Smith PetscFunctionBegin; 690*5c6c1daeSBarry Smith ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr); 691*5c6c1daeSBarry Smith ierr = MPI_Comm_compare(comm,bag->bagcomm,&flag);CHKERRQ(ierr); 692*5c6c1daeSBarry Smith if (flag != MPI_CONGRUENT && flag != MPI_IDENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the viewer and bag"); \ 693*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 694*5c6c1daeSBarry Smith if (!isbinary) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type"); 695*5c6c1daeSBarry Smith 696*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&classid,1,PETSC_INT);CHKERRQ(ierr); 697*5c6c1daeSBarry Smith if (classid != PETSC_BAG_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not PetscBag next in binary file"); 698*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&deprecatedbagsize,1,PETSC_INT);CHKERRQ(ierr); 699*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&bagcount,1,PETSC_INT);CHKERRQ(ierr); 700*5c6c1daeSBarry 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); 701*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 702*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 703*5c6c1daeSBarry Smith 704*5c6c1daeSBarry Smith nitem = bag->bagitems; 705*5c6c1daeSBarry Smith for (i=0; i<bagcount; i++) { 706*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&offset,1,PETSC_INT);CHKERRQ(ierr); 707*5c6c1daeSBarry Smith /* ignore the offset in the file */ 708*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&dtype,1,PETSC_INT);CHKERRQ(ierr); 709*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 710*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr); 711*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,&msize,1,PETSC_INT);CHKERRQ(ierr); 712*5c6c1daeSBarry Smith 713*5c6c1daeSBarry Smith if (dtype == (PetscInt) PETSC_CHAR) { 714*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_CHAR);CHKERRQ(ierr); 715*5c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_REAL) { 716*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_REAL);CHKERRQ(ierr); 717*5c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_SCALAR) { 718*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_SCALAR);CHKERRQ(ierr); 719*5c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_INT) { 720*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,PETSC_INT);CHKERRQ(ierr); 721*5c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_BOOL) { 722*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_BOOL);CHKERRQ(ierr); 723*5c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_ENUM) { 724*5c6c1daeSBarry Smith ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,PETSC_ENUM);CHKERRQ(ierr); 725*5c6c1daeSBarry Smith ierr = PetscViewerBinaryReadStringArray(view,&list);CHKERRQ(ierr); 726*5c6c1daeSBarry Smith /* don't need to save list because it is already registered in the bag */ 727*5c6c1daeSBarry Smith ierr = PetscFree(list);CHKERRQ(ierr); 728*5c6c1daeSBarry Smith } 729*5c6c1daeSBarry Smith nitem = nitem->next; 730*5c6c1daeSBarry Smith } 731*5c6c1daeSBarry Smith PetscFunctionReturn(0); 732*5c6c1daeSBarry Smith } 733*5c6c1daeSBarry Smith 734*5c6c1daeSBarry Smith #undef __FUNCT__ 735*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagCreate" 736*5c6c1daeSBarry Smith /*@ 737*5c6c1daeSBarry Smith PetscBagCreate - Create a bag of values 738*5c6c1daeSBarry Smith 739*5c6c1daeSBarry Smith Collective on MPI_Comm 740*5c6c1daeSBarry Smith 741*5c6c1daeSBarry Smith Level: Intermediate 742*5c6c1daeSBarry Smith 743*5c6c1daeSBarry Smith Input Parameters: 744*5c6c1daeSBarry Smith + comm - communicator to share bag 745*5c6c1daeSBarry Smith - bagsize - size of the C structure holding the values 746*5c6c1daeSBarry Smith 747*5c6c1daeSBarry Smith Output Parameter: 748*5c6c1daeSBarry Smith . bag - the bag of values 749*5c6c1daeSBarry Smith 750*5c6c1daeSBarry Smith Notes: 751*5c6c1daeSBarry Smith The size of the A struct must be small enough to fit in a PetscInt; by default 752*5c6c1daeSBarry Smith PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length. 753*5c6c1daeSBarry Smith The warning about casting to a shorter length can be ignored below unless your A struct is too large 754*5c6c1daeSBarry Smith 755*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 756*5c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 757*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 758*5c6c1daeSBarry Smith @*/ 759*5c6c1daeSBarry Smith PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag) 760*5c6c1daeSBarry Smith { 761*5c6c1daeSBarry Smith PetscErrorCode ierr; 762*5c6c1daeSBarry Smith size_t totalsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar); 763*5c6c1daeSBarry Smith 764*5c6c1daeSBarry Smith PetscFunctionBegin; 765*5c6c1daeSBarry Smith ierr = PetscInfo1(PETSC_NULL,"Creating Bag with total size %d\n",(int)totalsize);CHKERRQ(ierr); 766*5c6c1daeSBarry Smith ierr = PetscMalloc(totalsize,bag);CHKERRQ(ierr); 767*5c6c1daeSBarry Smith ierr = PetscMemzero(*bag,bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar));CHKERRQ(ierr); 768*5c6c1daeSBarry Smith (*bag)->bagsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar); 769*5c6c1daeSBarry Smith (*bag)->bagcomm = comm; 770*5c6c1daeSBarry Smith (*bag)->bagprefix = PETSC_NULL; 771*5c6c1daeSBarry Smith (*bag)->structlocation = (void*)(((char*)(*bag)) + sizeof(PetscScalar)*(sizeof(struct _n_PetscBag)/sizeof(PetscScalar)) + sizeof(PetscScalar)); 772*5c6c1daeSBarry Smith PetscFunctionReturn(0); 773*5c6c1daeSBarry Smith } 774*5c6c1daeSBarry Smith 775*5c6c1daeSBarry Smith #undef __FUNCT__ 776*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetName" 777*5c6c1daeSBarry Smith /*@C 778*5c6c1daeSBarry Smith PetscBagSetName - Sets the name of a bag of values 779*5c6c1daeSBarry Smith 780*5c6c1daeSBarry Smith Not Collective 781*5c6c1daeSBarry Smith 782*5c6c1daeSBarry Smith Level: Intermediate 783*5c6c1daeSBarry Smith 784*5c6c1daeSBarry Smith Input Parameters: 785*5c6c1daeSBarry Smith + bag - the bag of values 786*5c6c1daeSBarry Smith . name - the name assigned to the bag 787*5c6c1daeSBarry Smith - help - help message for bag 788*5c6c1daeSBarry Smith 789*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 790*5c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 791*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 792*5c6c1daeSBarry Smith @*/ 793*5c6c1daeSBarry Smith 794*5c6c1daeSBarry Smith PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help) 795*5c6c1daeSBarry Smith { 796*5c6c1daeSBarry Smith PetscErrorCode ierr; 797*5c6c1daeSBarry Smith PetscFunctionBegin; 798*5c6c1daeSBarry Smith ierr = PetscStrncpy(bag->bagname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 799*5c6c1daeSBarry Smith ierr = PetscStrncpy(bag->baghelp,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr); 800*5c6c1daeSBarry Smith PetscFunctionReturn(0); 801*5c6c1daeSBarry Smith } 802*5c6c1daeSBarry Smith 803*5c6c1daeSBarry Smith 804*5c6c1daeSBarry Smith #undef __FUNCT__ 805*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagGetName" 806*5c6c1daeSBarry Smith /*@C 807*5c6c1daeSBarry Smith PetscBagGetName - Gets the name of a bag of values 808*5c6c1daeSBarry Smith 809*5c6c1daeSBarry Smith Not Collective 810*5c6c1daeSBarry Smith 811*5c6c1daeSBarry Smith Level: Intermediate 812*5c6c1daeSBarry Smith 813*5c6c1daeSBarry Smith Input Parameter: 814*5c6c1daeSBarry Smith . bag - the bag of values 815*5c6c1daeSBarry Smith 816*5c6c1daeSBarry Smith Output Parameter: 817*5c6c1daeSBarry Smith . name - the name assigned to the bag 818*5c6c1daeSBarry Smith 819*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 820*5c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 821*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 822*5c6c1daeSBarry Smith @*/ 823*5c6c1daeSBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, char **name) 824*5c6c1daeSBarry Smith { 825*5c6c1daeSBarry Smith PetscFunctionBegin; 826*5c6c1daeSBarry Smith *name = bag->bagname; 827*5c6c1daeSBarry Smith PetscFunctionReturn(0); 828*5c6c1daeSBarry Smith } 829*5c6c1daeSBarry Smith 830*5c6c1daeSBarry Smith #undef __FUNCT__ 831*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagGetData" 832*5c6c1daeSBarry Smith /*@C 833*5c6c1daeSBarry Smith PetscBagGetData - Gives back the user - access to memory that 834*5c6c1daeSBarry Smith should be used for storing user-data-structure 835*5c6c1daeSBarry Smith 836*5c6c1daeSBarry Smith Not Collective 837*5c6c1daeSBarry Smith 838*5c6c1daeSBarry Smith Level: Intermediate 839*5c6c1daeSBarry Smith 840*5c6c1daeSBarry Smith Input Parameter: 841*5c6c1daeSBarry Smith . bag - the bag of values 842*5c6c1daeSBarry Smith 843*5c6c1daeSBarry Smith Output Parameter: 844*5c6c1daeSBarry Smith . data - pointer to memory that will have user-data-structure 845*5c6c1daeSBarry Smith 846*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad() 847*5c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 848*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 849*5c6c1daeSBarry Smith @*/ 850*5c6c1daeSBarry Smith PetscErrorCode PetscBagGetData(PetscBag bag, void **data) 851*5c6c1daeSBarry Smith { 852*5c6c1daeSBarry Smith PetscFunctionBegin; 853*5c6c1daeSBarry Smith *data = bag->structlocation; 854*5c6c1daeSBarry Smith PetscFunctionReturn(0); 855*5c6c1daeSBarry Smith } 856*5c6c1daeSBarry Smith 857*5c6c1daeSBarry Smith #undef __FUNCT__ 858*5c6c1daeSBarry Smith #define __FUNCT__ "PetscBagSetOptionsPrefix" 859*5c6c1daeSBarry Smith /*@C 860*5c6c1daeSBarry Smith PetscBagSetOptionsPrefix - Sets the prefix used for searching for all 861*5c6c1daeSBarry Smith PetscBag items in the options database. 862*5c6c1daeSBarry Smith 863*5c6c1daeSBarry Smith Logically collective on Bag. 864*5c6c1daeSBarry Smith 865*5c6c1daeSBarry Smith Level: Intermediate 866*5c6c1daeSBarry Smith 867*5c6c1daeSBarry Smith Input Parameters: 868*5c6c1daeSBarry Smith + bag - the bag of values 869*5c6c1daeSBarry Smith - prefix - the prefix to prepend all Bag item names with. 870*5c6c1daeSBarry Smith 871*5c6c1daeSBarry Smith NOTES: Must be called prior to registering any of the bag items. 872*5c6c1daeSBarry Smith 873*5c6c1daeSBarry Smith .seealso: PetscBag, PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 874*5c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 875*5c6c1daeSBarry Smith @*/ 876*5c6c1daeSBarry Smith 877*5c6c1daeSBarry Smith PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[]) 878*5c6c1daeSBarry Smith { 879*5c6c1daeSBarry Smith PetscErrorCode ierr; 880*5c6c1daeSBarry Smith PetscFunctionBegin; 881*5c6c1daeSBarry Smith if (!pre) { 882*5c6c1daeSBarry Smith ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr); 883*5c6c1daeSBarry Smith } else { 884*5c6c1daeSBarry Smith if (pre[0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hypen"); 885*5c6c1daeSBarry Smith ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr); 886*5c6c1daeSBarry Smith ierr = PetscStrallocpy(pre,&(bag->bagprefix));CHKERRQ(ierr); 887*5c6c1daeSBarry Smith } 888*5c6c1daeSBarry Smith PetscFunctionReturn(0); 889*5c6c1daeSBarry Smith } 890