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,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(NULL,bag->bagprefix,nname,list,&mdefault,NULL);CHKERRQ(ierr); 72 73 ierr = PetscNew(&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,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(NULL,bag->bagprefix,nname,(PetscInt*)addr,&tmp,NULL);CHKERRQ(ierr); 128 129 ierr = PetscNew(&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,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 ",(double)*((PetscReal*)addr)+i);CHKERRQ(ierr); 178 } 179 ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); 180 } 181 ierr = PetscOptionsGetRealArray(NULL,bag->bagprefix,nname,(PetscReal*)addr,&tmp,NULL);CHKERRQ(ierr); 182 183 ierr = PetscNew(&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 PetscBagRegister64bitInt(), 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,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(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 230 231 ierr = PetscNew(&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__ "PetscBagRegister64bitInt" 244 /*@C 245 PetscBagRegister64bitInt - add an integer value to the bag 246 247 Logically Collective on PetscBag 248 249 Input Parameter: 250 + bag - the bag of values 251 . addr - location of integer in struct 252 . mdefault - the initial value 253 . name - name of the integer 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 PetscBagRegister64bitInt(PetscBag bag,void *addr,Petsc64bitInt mdefault,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 odefault = (PetscInt)mdefault; 270 PetscBool flg; 271 272 PetscFunctionBegin; 273 nname[0] = '-'; 274 nname[1] = 0; 275 ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 276 ierr = PetscOptionsHasName(NULL,NULL,"-help",&printhelp);CHKERRQ(ierr); 277 if (printhelp) { 278 ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%d>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,odefault,help);CHKERRQ(ierr); 279 } 280 ierr = PetscOptionsGetInt(NULL,bag->bagprefix,nname,&odefault,&flg);CHKERRQ(ierr); 281 if (flg) mdefault = (Petsc64bitInt)odefault; 282 283 ierr = PetscNew(&item);CHKERRQ(ierr); 284 item->dtype = PETSC_INT; 285 item->offset = ((char*)addr) - ((char*)bag); 286 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); 287 item->next = 0; 288 item->msize = 1; 289 *(Petsc64bitInt*)addr = mdefault; 290 ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 291 PetscFunctionReturn(0); 292 } 293 294 #undef __FUNCT__ 295 #define __FUNCT__ "PetscBagRegisterBoolArray" 296 /*@C 297 PetscBagRegisterBoolArray - add a n logical values to the bag 298 299 Logically Collective on PetscBag 300 301 Input Parameter: 302 + bag - the bag of values 303 . addr - location of boolean array in struct 304 . msize - number of entries in array 305 . name - name of the boolean array 306 - help - longer string with more information about the value 307 308 Level: beginner 309 310 .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 311 PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 312 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 313 314 @*/ 315 PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag,void *addr,PetscInt msize, const char* name, const char* help) 316 { 317 PetscErrorCode ierr; 318 PetscBagItem item; 319 char nname[PETSC_BAG_NAME_LENGTH+1]; 320 PetscBool printhelp; 321 PetscInt i,tmp = msize; 322 323 PetscFunctionBegin; 324 /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/ 325 nname[0] = '-'; 326 nname[1] = 0; 327 ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 328 ierr = PetscOptionsHasName(NULL,NULL,"-help",&printhelp);CHKERRQ(ierr); 329 if (printhelp) { 330 ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix?bag->bagprefix:"",name);CHKERRQ(ierr); 331 for (i=0; i<msize; i++) { 332 ierr = (*PetscHelpPrintf)(bag->bagcomm,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr); 333 } 334 ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); 335 } 336 ierr = PetscOptionsGetBoolArray(NULL,bag->bagprefix,nname,(PetscBool*)addr,&tmp,NULL);CHKERRQ(ierr); 337 338 ierr = PetscNew(&item);CHKERRQ(ierr); 339 item->dtype = PETSC_BOOL; 340 item->offset = ((char*)addr) - ((char*)bag); 341 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); 342 item->next = 0; 343 item->msize = msize; 344 ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 345 PetscFunctionReturn(0); 346 } 347 348 #undef __FUNCT__ 349 #define __FUNCT__ "PetscBagRegisterString" 350 /*@C 351 PetscBagRegisterString - add a string value to the bag 352 353 Logically Collective on PetscBag 354 355 Input Parameter: 356 + bag - the bag of values 357 . addr - location of start of string in struct 358 . msize - length of the string space in the struct 359 . mdefault - the initial value 360 . name - name of the string 361 - help - longer string with more information about the value 362 363 Level: beginner 364 365 Note: The struct should have the field char mystring[msize]; not char *mystring 366 367 .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 368 PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 369 PetscBagSetFromOptions(),PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 370 371 @*/ 372 PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* mdefault,const char* name,const char* help) 373 { 374 PetscErrorCode ierr; 375 PetscBagItem item; 376 char nname[PETSC_BAG_NAME_LENGTH+1]; 377 PetscBool printhelp; 378 379 PetscFunctionBegin; 380 nname[0] = '-'; 381 nname[1] = 0; 382 ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 383 ierr = PetscOptionsHasName(NULL,NULL,"-help",&printhelp);CHKERRQ(ierr); 384 if (printhelp) { 385 ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr); 386 } 387 388 ierr = PetscNew(&item);CHKERRQ(ierr); 389 item->dtype = PETSC_CHAR; 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 = msize; 394 if (mdefault != (char*)addr) { 395 ierr = PetscStrncpy((char*)addr,mdefault,msize-1);CHKERRQ(ierr); 396 } 397 ierr = PetscOptionsGetString(NULL,bag->bagprefix,nname,(char*)addr,msize,NULL);CHKERRQ(ierr); 398 ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 399 PetscFunctionReturn(0); 400 } 401 402 #undef __FUNCT__ 403 #define __FUNCT__ "PetscBagRegisterReal" 404 /*@C 405 PetscBagRegisterReal - add a real value to the bag 406 407 Logically Collective on PetscBag 408 409 Input Parameter: 410 + bag - the bag of values 411 . addr - location of double in struct 412 . mdefault - the initial value 413 . name - name of the variable 414 - help - longer string with more information about the value 415 416 Level: beginner 417 418 .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 419 PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 420 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 421 422 @*/ 423 PetscErrorCode PetscBagRegisterReal(PetscBag bag,void *addr,PetscReal mdefault, const char *name, const char *help) 424 { 425 PetscErrorCode ierr; 426 PetscBagItem item; 427 char nname[PETSC_BAG_NAME_LENGTH+1]; 428 PetscBool printhelp; 429 430 PetscFunctionBegin; 431 nname[0] = '-'; 432 nname[1] = 0; 433 ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 434 ierr = PetscOptionsHasName(NULL,NULL,"-help",&printhelp);CHKERRQ(ierr); 435 if (printhelp) { 436 ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%g>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)mdefault,help);CHKERRQ(ierr); 437 } 438 ierr = PetscOptionsGetReal(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 439 440 ierr = PetscNew(&item);CHKERRQ(ierr); 441 item->dtype = PETSC_REAL; 442 item->offset = ((char*)addr) - ((char*)bag); 443 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); 444 item->next = 0; 445 item->msize = 1; 446 *(PetscReal*)addr = mdefault; 447 ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 448 PetscFunctionReturn(0); 449 } 450 451 #undef __FUNCT__ 452 #define __FUNCT__ "PetscBagRegisterScalar" 453 /*@C 454 PetscBagRegisterScalar - add a real or complex number value to the bag 455 456 Logically Collective on PetscBag 457 458 Input Parameter: 459 + bag - the bag of values 460 . addr - location of scalar in struct 461 . mdefault - the initial value 462 . name - name of the variable 463 - help - longer string with more information about the value 464 465 466 Level: beginner 467 468 .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 469 PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 470 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 471 472 @*/ 473 PetscErrorCode PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar mdefault,const char *name,const char *help) 474 { 475 PetscErrorCode ierr; 476 PetscBagItem item; 477 char nname[PETSC_BAG_NAME_LENGTH+1]; 478 PetscBool printhelp; 479 480 PetscFunctionBegin; 481 nname[0] = '-'; 482 nname[1] = 0; 483 ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 484 ierr = PetscOptionsHasName(NULL,NULL,"-help",&printhelp);CHKERRQ(ierr); 485 if (printhelp) { 486 ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%g + %gi>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)PetscRealPart(mdefault),(double)PetscImaginaryPart(mdefault),help);CHKERRQ(ierr); 487 } 488 ierr = PetscOptionsGetScalar(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 489 490 ierr = PetscNew(&item);CHKERRQ(ierr); 491 item->dtype = PETSC_SCALAR; 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 *(PetscScalar*)addr = mdefault; 497 ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 498 PetscFunctionReturn(0); 499 } 500 501 #undef __FUNCT__ 502 #define __FUNCT__ "PetscBagRegisterBool" 503 /*@C 504 PetscBagRegisterBool - add a logical value to the bag 505 506 Logically Collective on PetscBag 507 508 Input Parameter: 509 + bag - the bag of values 510 . addr - location of logical in struct 511 . mdefault - the initial value 512 . name - name of the variable 513 - help - longer string with more information about the value 514 515 516 Level: beginner 517 518 .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 519 PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 520 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 521 522 @*/ 523 PetscErrorCode PetscBagRegisterBool(PetscBag bag,void *addr,PetscBool mdefault,const char *name,const char *help) 524 { 525 PetscErrorCode ierr; 526 PetscBagItem item; 527 char nname[PETSC_BAG_NAME_LENGTH+1]; 528 PetscBool printhelp; 529 530 PetscFunctionBegin; 531 /* the checks here with != PETSC_FALSE and PETSC_TRUE is a special case; here we truly demand that the value be 0 or 1 */ 532 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); 533 nname[0] = '-'; 534 nname[1] = 0; 535 ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 536 ierr = PetscOptionsHasName(NULL,NULL,"-help",&printhelp);CHKERRQ(ierr); 537 if (printhelp) { 538 ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,PetscBools[mdefault],help);CHKERRQ(ierr); 539 } 540 ierr = PetscOptionsGetBool(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); 541 542 ierr = PetscNew(&item);CHKERRQ(ierr); 543 item->dtype = PETSC_BOOL; 544 item->offset = ((char*)addr) - ((char*)bag); 545 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); 546 item->next = 0; 547 item->msize = 1; 548 *(PetscBool*)addr = mdefault; 549 ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); 550 PetscFunctionReturn(0); 551 } 552 553 #undef __FUNCT__ 554 #define __FUNCT__ "PetscBagDestroy" 555 /*@C 556 PetscBagDestroy - Destroys a bag values 557 558 Collective on PetscBag 559 560 Input Parameter: 561 . bag - the bag of values 562 563 Level: beginner 564 565 .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 566 PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 567 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 568 569 @*/ 570 PetscErrorCode PetscBagDestroy(PetscBag *bag) 571 { 572 PetscErrorCode ierr; 573 PetscBagItem nitem = (*bag)->bagitems,item; 574 575 PetscFunctionBegin; 576 while (nitem) { 577 item = nitem->next; 578 if (nitem->list) { 579 ierr = PetscStrArrayDestroy(&nitem->list);CHKERRQ(ierr); 580 } 581 ierr = PetscFree(nitem);CHKERRQ(ierr); 582 nitem = item; 583 } 584 if ((*bag)->bagprefix) { ierr = PetscFree((*bag)->bagprefix);CHKERRQ(ierr); } 585 ierr = PetscFree(*bag);CHKERRQ(ierr); 586 PetscFunctionReturn(0); 587 } 588 589 #undef __FUNCT__ 590 #define __FUNCT__ "PetscBagSetFromOptions" 591 /*@ 592 PetscBagSetFromOptions - Allows setting options from a bag 593 594 Collective on PetscBag 595 596 Input Parameter: 597 . bag - the bag of values 598 599 Level: beginner 600 601 .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData() 602 PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 603 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagView(), PetscBagRegisterEnum() 604 605 @*/ 606 PetscErrorCode PetscBagSetFromOptions(PetscBag bag) 607 { 608 PetscErrorCode ierr; 609 PetscBagItem nitem = bag->bagitems; 610 char name[PETSC_BAG_NAME_LENGTH+1],helpname[PETSC_BAG_NAME_LENGTH+PETSC_BAG_HELP_LENGTH+3]; 611 PetscInt n; 612 613 PetscFunctionBegin; 614 ierr = PetscStrcpy(helpname,bag->bagname);CHKERRQ(ierr); 615 ierr = PetscStrcat(helpname," ");CHKERRQ(ierr); 616 ierr = PetscStrcat(helpname,bag->baghelp);CHKERRQ(ierr); 617 ierr = PetscOptionsBegin(bag->bagcomm,bag->bagprefix,helpname,0);CHKERRQ(ierr); 618 while (nitem) { 619 name[0] = '-'; 620 name[1] = 0; 621 ierr = PetscStrcat(name,nitem->name);CHKERRQ(ierr); 622 if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */ 623 char *value = (char*)(((char*)bag) + nitem->offset); 624 ierr = PetscOptionsString(name,nitem->help,"",value,value,nitem->msize,NULL);CHKERRQ(ierr); 625 } else if (nitem->dtype == PETSC_REAL) { 626 PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset); 627 if (nitem->msize == 1) { 628 ierr = PetscOptionsReal(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 629 } else { 630 n = nitem->msize; 631 ierr = PetscOptionsRealArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr); 632 } 633 } else if (nitem->dtype == PETSC_SCALAR) { 634 PetscScalar *value = (PetscScalar*)(((char*)bag) + nitem->offset); 635 ierr = PetscOptionsScalar(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 636 } else if (nitem->dtype == PETSC_INT) { 637 PetscInt *value = (PetscInt*)(((char*)bag) + nitem->offset); 638 if (nitem->msize == 1) { 639 ierr = PetscOptionsInt(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 640 } else { 641 n = nitem->msize; 642 ierr = PetscOptionsIntArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr); 643 } 644 } else if (nitem->dtype == PETSC_ENUM) { 645 PetscEnum *value = (PetscEnum*)(((char*)bag) + nitem->offset); 646 PetscInt i = 0; 647 while (nitem->list[i++]) ; 648 ierr = PetscOptionsEnum(name,nitem->help,nitem->list[i-3],(const char*const*)nitem->list,*value,value,NULL);CHKERRQ(ierr); 649 } else if (nitem->dtype == PETSC_BOOL) { 650 PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset); 651 if (nitem->msize == 1) { 652 ierr = PetscOptionsBool(name,nitem->help,"",*value,value,NULL);CHKERRQ(ierr); 653 } else { 654 n = nitem->msize; 655 ierr = PetscOptionsBoolArray(name,nitem->help,"",value,&n,NULL);CHKERRQ(ierr); 656 } 657 } 658 nitem = nitem->next; 659 } 660 PetscOptionsEnd(); 661 PetscFunctionReturn(0); 662 } 663 664 #undef __FUNCT__ 665 #define __FUNCT__ "PetscBagView" 666 /*@C 667 PetscBagView - Views a bag of values as either ASCII text or a binary file 668 669 Collective on PetscBag 670 671 Input Parameter: 672 + bag - the bag of values 673 - viewer - location to view the values 674 675 Level: beginner 676 677 Warning: Currently PETSc bags saved in a binary file can only be read back 678 in on a machine of the same architecture. Let us know when this is a problem 679 and we'll fix it. 680 681 .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData() 682 PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum() 683 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName() 684 685 @*/ 686 PetscErrorCode PetscBagView(PetscBag bag,PetscViewer view) 687 { 688 PetscBool isascii,isbinary; 689 PetscErrorCode ierr; 690 PetscBagItem nitem = bag->bagitems; 691 692 PetscFunctionBegin; 693 ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 694 ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 695 if (isascii) { 696 if (bag->bagprefix) { 697 ierr = PetscViewerASCIIPrintf(view,"PetscBag Object: %s (%s) %s\n",bag->bagname,bag->bagprefix,bag->baghelp);CHKERRQ(ierr); 698 } else { 699 ierr = PetscViewerASCIIPrintf(view,"PetscBag Object: %s %s\n",bag->bagname,bag->baghelp);CHKERRQ(ierr); 700 } 701 while (nitem) { 702 if (nitem->dtype == PETSC_CHAR) { 703 char *value = (char*)(((char*)bag) + nitem->offset); 704 char tmp = value[nitem->msize-1]; /* special handling for fortran chars wihout null terminator */ 705 value[nitem->msize-1] =0; 706 ierr = PetscViewerASCIIPrintf(view," %s = %s; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr); 707 value[nitem->msize-1] = tmp; 708 } else if (nitem->dtype == PETSC_REAL) { 709 PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset); 710 PetscInt i; 711 ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 712 for (i=0; i<nitem->msize; i++) { 713 ierr = PetscViewerASCIIPrintf(view,"%g ",(double)value[i]);CHKERRQ(ierr); 714 } 715 ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 716 } else if (nitem->dtype == PETSC_SCALAR) { 717 PetscScalar value = *(PetscScalar*)(((char*)bag) + nitem->offset); 718 #if defined(PETSC_USE_COMPLEX) 719 if ((double)PetscImaginaryPart(value)) { 720 ierr = PetscViewerASCIIPrintf(view," %s = %g + %gi; %s\n",nitem->name,(double)PetscRealPart(value),(double)PetscImaginaryPart(value),nitem->help);CHKERRQ(ierr); 721 } else { 722 ierr = PetscViewerASCIIPrintf(view," %s = %g; %s\n",nitem->name,(double)PetscRealPart(value),nitem->help);CHKERRQ(ierr); 723 } 724 #else 725 ierr = PetscViewerASCIIPrintf(view," %s = %g; %s\n",nitem->name,(double)value,nitem->help);CHKERRQ(ierr); 726 #endif 727 } else if (nitem->dtype == PETSC_INT) { 728 PetscInt i,*value = (PetscInt*)(((char*)bag) + nitem->offset); 729 ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 730 for (i=0; i<nitem->msize; i++) { 731 ierr = PetscViewerASCIIPrintf(view,"%D ",value[i]);CHKERRQ(ierr); 732 } 733 ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 734 } else if (nitem->dtype == PETSC_BOOL) { 735 PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset); 736 PetscInt i; 737 /* some Fortran compilers use -1 as boolean */ 738 ierr = PetscViewerASCIIPrintf(view," %s = ",nitem->name);CHKERRQ(ierr); 739 for (i=0; i<nitem->msize; i++) { 740 if (((int) value[i]) == -1) value[i] = PETSC_TRUE; 741 /* the checks here with != PETSC_FALSE and PETSC_TRUE is a special case; here we truly demand that the value be 0 or 1 */ 742 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); 743 ierr = PetscViewerASCIIPrintf(view," %s",PetscBools[value[i]]);CHKERRQ(ierr); 744 } 745 ierr = PetscViewerASCIIPrintf(view,"; %s\n",nitem->help);CHKERRQ(ierr); 746 } else if (nitem->dtype == PETSC_ENUM) { 747 PetscEnum value = *(PetscEnum*)(((char*)bag) + nitem->offset); 748 PetscInt i = 0; 749 while (nitem->list[i++]) ; 750 ierr = PetscViewerASCIIPrintf(view," %s = %s; (%s) %s\n",nitem->name,nitem->list[value],nitem->list[i-3],nitem->help);CHKERRQ(ierr); 751 } 752 nitem = nitem->next; 753 } 754 } else if (isbinary) { 755 PetscInt classid = PETSC_BAG_FILE_CLASSID, dtype; 756 PetscInt deprecatedbagsize = 0; 757 PetscViewerFormat format; 758 ierr = PetscViewerBinaryWrite(view,&classid,1,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 759 ierr = PetscViewerBinaryWrite(view,&deprecatedbagsize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 760 ierr = PetscViewerBinaryWrite(view,&bag->count,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 761 ierr = PetscViewerBinaryWrite(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 762 ierr = PetscViewerBinaryWrite(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 763 while (nitem) { 764 ierr = PetscViewerBinaryWrite(view,&nitem->offset,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 765 dtype = (PetscInt)nitem->dtype; 766 ierr = PetscViewerBinaryWrite(view,&dtype,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 767 ierr = PetscViewerBinaryWrite(view,nitem->name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 768 ierr = PetscViewerBinaryWrite(view,nitem->help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr); 769 ierr = PetscViewerBinaryWrite(view,&nitem->msize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 770 /* some Fortran compilers use -1 as boolean */ 771 if (dtype == PETSC_BOOL && ((*(int*) (((char*)bag) + nitem->offset) == -1))) *(int*) (((char*)bag) + nitem->offset) = PETSC_TRUE; 772 773 ierr = PetscViewerBinaryWrite(view,(((char*)bag) + nitem->offset),nitem->msize,nitem->dtype,PETSC_FALSE);CHKERRQ(ierr); 774 if (dtype == PETSC_ENUM) { 775 ierr = PetscViewerBinaryWriteStringArray(view,(char**)nitem->list);CHKERRQ(ierr); 776 } 777 nitem = nitem->next; 778 } 779 ierr = PetscViewerGetFormat(view,&format);CHKERRQ(ierr); 780 if (format == PETSC_VIEWER_BINARY_MATLAB) { 781 MPI_Comm comm; 782 FILE *info; 783 ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr); 784 ierr = PetscViewerBinaryGetInfoPointer(view,&info);CHKERRQ(ierr); 785 ierr = PetscFPrintf(comm,info,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n");CHKERRQ(ierr); 786 ierr = PetscFPrintf(comm,info,"#$$ Set.%s = PetscBinaryRead(fd);\n",bag->bagname);CHKERRQ(ierr); 787 ierr = PetscFPrintf(comm,info,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n");CHKERRQ(ierr); 788 } 789 } 790 PetscFunctionReturn(0); 791 } 792 793 #undef __FUNCT__ 794 #define __FUNCT__ "PetscBagLoad" 795 /*@C 796 PetscBagLoad - Loads a bag of values from a binary file 797 798 Collective on PetscViewer 799 800 Input Parameter: 801 + viewer - file to load values from 802 - bag - the bag of values 803 804 Notes: You must have created and registered all the fields in the bag before loading into it. 805 806 Notes: 807 Level: beginner 808 809 .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagView(), PetscBagGetData() 810 PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 811 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 812 813 @*/ 814 PetscErrorCode PetscBagLoad(PetscViewer view,PetscBag bag) 815 { 816 PetscErrorCode ierr; 817 PetscBool isbinary; 818 PetscInt classid,bagcount,i,dtype,msize,offset,deprecatedbagsize; 819 char name[PETSC_BAG_NAME_LENGTH],help[PETSC_BAG_HELP_LENGTH],**list; 820 PetscBagItem nitem; 821 MPI_Comm comm; 822 PetscMPIInt flag; 823 824 PetscFunctionBegin; 825 ierr = PetscObjectGetComm((PetscObject)view,&comm);CHKERRQ(ierr); 826 ierr = MPI_Comm_compare(comm,bag->bagcomm,&flag);CHKERRQ(ierr); 827 if (flag != MPI_CONGRUENT && flag != MPI_IDENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the viewer and bag"); \ 828 ierr = PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 829 if (!isbinary) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type"); 830 831 ierr = PetscViewerBinaryRead(view,&classid,1,NULL,PETSC_INT);CHKERRQ(ierr); 832 if (classid != PETSC_BAG_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not PetscBag next in binary file"); 833 ierr = PetscViewerBinaryRead(view,&deprecatedbagsize,1,NULL,PETSC_INT);CHKERRQ(ierr); 834 ierr = PetscViewerBinaryRead(view,&bagcount,1,NULL,PETSC_INT);CHKERRQ(ierr); 835 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); 836 ierr = PetscViewerBinaryRead(view,bag->bagname,PETSC_BAG_NAME_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr); 837 ierr = PetscViewerBinaryRead(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr); 838 839 nitem = bag->bagitems; 840 for (i=0; i<bagcount; i++) { 841 ierr = PetscViewerBinaryRead(view,&offset,1,NULL,PETSC_INT);CHKERRQ(ierr); 842 /* ignore the offset in the file */ 843 ierr = PetscViewerBinaryRead(view,&dtype,1,NULL,PETSC_INT);CHKERRQ(ierr); 844 ierr = PetscViewerBinaryRead(view,name,PETSC_BAG_NAME_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr); 845 ierr = PetscViewerBinaryRead(view,help,PETSC_BAG_HELP_LENGTH,NULL,PETSC_CHAR);CHKERRQ(ierr); 846 ierr = PetscViewerBinaryRead(view,&msize,1,NULL,PETSC_INT);CHKERRQ(ierr); 847 848 if (dtype == (PetscInt) PETSC_CHAR) { 849 ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_CHAR);CHKERRQ(ierr); 850 } else if (dtype == (PetscInt) PETSC_REAL) { 851 ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_REAL);CHKERRQ(ierr); 852 } else if (dtype == (PetscInt) PETSC_SCALAR) { 853 ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,NULL,PETSC_SCALAR);CHKERRQ(ierr); 854 } else if (dtype == (PetscInt) PETSC_INT) { 855 ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_INT);CHKERRQ(ierr); 856 } else if (dtype == (PetscInt) PETSC_BOOL) { 857 ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_BOOL);CHKERRQ(ierr); 858 } else if (dtype == (PetscInt) PETSC_ENUM) { 859 ierr = PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 860 ierr = PetscViewerBinaryReadStringArray(view,&list);CHKERRQ(ierr); 861 /* don't need to save list because it is already registered in the bag */ 862 ierr = PetscFree(list);CHKERRQ(ierr); 863 } 864 nitem = nitem->next; 865 } 866 PetscFunctionReturn(0); 867 } 868 869 #undef __FUNCT__ 870 #define __FUNCT__ "PetscBagCreate" 871 /*@ 872 PetscBagCreate - Create a bag of values 873 874 Collective on MPI_Comm 875 876 Level: Intermediate 877 878 Input Parameters: 879 + comm - communicator to share bag 880 - bagsize - size of the C structure holding the values 881 882 Output Parameter: 883 . bag - the bag of values 884 885 Notes: 886 The size of the A struct must be small enough to fit in a PetscInt; by default 887 PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length. 888 The warning about casting to a shorter length can be ignored below unless your A struct is too large 889 890 .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 891 PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 892 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 893 @*/ 894 PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag) 895 { 896 PetscErrorCode ierr; 897 size_t totalsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar); 898 899 PetscFunctionBegin; 900 ierr = PetscInfo1(NULL,"Creating Bag with total size %d\n",(int)totalsize);CHKERRQ(ierr); 901 ierr = PetscMalloc(totalsize,bag);CHKERRQ(ierr); 902 ierr = PetscMemzero(*bag,bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar));CHKERRQ(ierr); 903 904 (*bag)->bagsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar); 905 (*bag)->bagcomm = comm; 906 (*bag)->bagprefix = NULL; 907 (*bag)->structlocation = (void*)(((char*)(*bag)) + sizeof(PetscScalar)*(sizeof(struct _n_PetscBag)/sizeof(PetscScalar)) + sizeof(PetscScalar)); 908 PetscFunctionReturn(0); 909 } 910 911 #undef __FUNCT__ 912 #define __FUNCT__ "PetscBagSetName" 913 /*@C 914 PetscBagSetName - Sets the name of a bag of values 915 916 Not Collective 917 918 Level: Intermediate 919 920 Input Parameters: 921 + bag - the bag of values 922 . name - the name assigned to the bag 923 - help - help message for bag 924 925 .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 926 PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 927 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 928 @*/ 929 930 PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help) 931 { 932 PetscErrorCode ierr; 933 934 PetscFunctionBegin; 935 ierr = PetscStrncpy(bag->bagname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); 936 ierr = PetscStrncpy(bag->baghelp,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr); 937 PetscFunctionReturn(0); 938 } 939 940 941 #undef __FUNCT__ 942 #define __FUNCT__ "PetscBagGetName" 943 /*@C 944 PetscBagGetName - Gets the name of a bag of values 945 946 Not Collective 947 948 Level: Intermediate 949 950 Input Parameter: 951 . bag - the bag of values 952 953 Output Parameter: 954 . name - the name assigned to the bag 955 956 .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 957 PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 958 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 959 @*/ 960 PetscErrorCode PetscBagGetName(PetscBag bag, char **name) 961 { 962 PetscFunctionBegin; 963 *name = bag->bagname; 964 PetscFunctionReturn(0); 965 } 966 967 #undef __FUNCT__ 968 #define __FUNCT__ "PetscBagGetData" 969 /*@C 970 PetscBagGetData - Gives back the user - access to memory that 971 should be used for storing user-data-structure 972 973 Not Collective 974 975 Level: Intermediate 976 977 Input Parameter: 978 . bag - the bag of values 979 980 Output Parameter: 981 . data - pointer to memory that will have user-data-structure 982 983 .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad() 984 PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 985 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 986 @*/ 987 PetscErrorCode PetscBagGetData(PetscBag bag, void **data) 988 { 989 PetscFunctionBegin; 990 *data = bag->structlocation; 991 PetscFunctionReturn(0); 992 } 993 994 #undef __FUNCT__ 995 #define __FUNCT__ "PetscBagSetOptionsPrefix" 996 /*@C 997 PetscBagSetOptionsPrefix - Sets the prefix used for searching for all 998 PetscBag items in the options database. 999 1000 Logically collective on Bag. 1001 1002 Level: Intermediate 1003 1004 Input Parameters: 1005 + bag - the bag of values 1006 - prefix - the prefix to prepend all Bag item names with. 1007 1008 NOTES: Must be called prior to registering any of the bag items. 1009 1010 .seealso: PetscBag, PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 1011 PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 1012 @*/ 1013 1014 PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[]) 1015 { 1016 PetscErrorCode ierr; 1017 1018 PetscFunctionBegin; 1019 if (!pre) { 1020 ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr); 1021 } else { 1022 if (pre[0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hypen"); 1023 ierr = PetscFree(bag->bagprefix);CHKERRQ(ierr); 1024 ierr = PetscStrallocpy(pre,&(bag->bagprefix));CHKERRQ(ierr); 1025 } 1026 PetscFunctionReturn(0); 1027 } 1028 1029 #undef __FUNCT__ 1030 #define __FUNCT__ "PetscBagGetNames" 1031 /*@C 1032 PetscBagGetNames - Get the names of all entries in the bag 1033 1034 Not collective 1035 1036 Input Parameters: 1037 + bag - the bag of values 1038 - names - array of the correct size to hold names 1039 1040 Output Parameter: 1041 . names - array of char pointers for names 1042 1043 Level: intermediate 1044 1045 .seealso: PetscBag, PetscBagGetName(), PetscBagSetName(), PetscBagCreate(), PetscBagGetData() 1046 PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum() 1047 @*/ 1048 PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[]) 1049 { 1050 PetscBagItem nitem = bag->bagitems; 1051 PetscInt n; 1052 1053 PetscFunctionBegin; 1054 for (n = 0; nitem; ++n, nitem = nitem->next) {names[n] = nitem->name;} 1055 PetscFunctionReturn(0); 1056 } 1057