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