1 #define PETSC_DLL 2 /* 3 These routines simplify the use of command line, file options, etc., and are used to manipulate the options database. 4 This provides the low-level interface, the high level interface is in aoptions.c 5 6 Some routines use regular malloc and free because it cannot know what malloc is requested with the 7 options database until it has already processed the input. 8 */ 9 10 #include "petscsys.h" /*I "petscsys.h" I*/ 11 #if defined(PETSC_HAVE_STDLIB_H) 12 #include <stdlib.h> 13 #endif 14 #if defined(PETSC_HAVE_MALLOC_H) 15 #include <malloc.h> 16 #endif 17 #if defined(PETSC_HAVE_SYS_PARAM_H) 18 #include "sys/param.h" 19 #endif 20 21 /* 22 This table holds all the options set by the user. For simplicity, we use a static size database 23 */ 24 #define MAXOPTIONS 512 25 #define MAXALIASES 25 26 #define MAXOPTIONSMONITORS 5 27 28 typedef struct { 29 int N,argc,Naliases; 30 char **args,*names[MAXOPTIONS],*values[MAXOPTIONS]; 31 char *aliases1[MAXALIASES],*aliases2[MAXALIASES]; 32 PetscTruth used[MAXOPTIONS]; 33 PetscTruth namegiven; 34 char programname[PETSC_MAX_PATH_LEN]; /* HP includes entire path in name */ 35 36 /* --------User (or default) routines (most return -1 on error) --------*/ 37 PetscErrorCode (*monitor[MAXOPTIONSMONITORS])(const char[], const char[], void*); /* returns control to user after */ 38 PetscErrorCode (*monitordestroy[MAXOPTIONSMONITORS])(void*); /* */ 39 void *monitorcontext[MAXOPTIONSMONITORS]; /* to pass arbitrary user data into monitor */ 40 PetscInt numbermonitors; /* to, for instance, detect options being set */ 41 42 } PetscOptionsTable; 43 44 45 static PetscOptionsTable *options = 0; 46 extern PetscOptionsObjectType PetscOptionsObject; 47 48 /* 49 Options events monitor 50 */ 51 #define PetscOptionsMonitor(name,value) \ 52 { PetscErrorCode _ierr; PetscInt _i,_im = options->numbermonitors; \ 53 for (_i=0; _i<_im; _i++) {\ 54 _ierr = (*options->monitor[_i])(name, value, options->monitorcontext[_i]);CHKERRQ(_ierr); \ 55 } \ 56 } 57 58 #undef __FUNCT__ 59 #define __FUNCT__ "PetscOptionsAtoi" 60 /* 61 PetscOptionsAtoi - Converts a string to an integer value. Handles special cases such as "default" and "decide" 62 */ 63 PetscErrorCode PETSC_DLLEXPORT PetscOptionsAtoi(const char name[],PetscInt *a) 64 { 65 PetscErrorCode ierr; 66 size_t i,len; 67 PetscTruth decide,tdefault,mouse; 68 69 PetscFunctionBegin; 70 ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 71 if (!len) SETERRQ(PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 72 73 ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr); 74 if (!tdefault) { 75 ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr); 76 } 77 ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr); 78 if (!decide) { 79 ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr); 80 } 81 ierr = PetscStrcasecmp(name,"mouse",&mouse);CHKERRQ(ierr); 82 83 if (tdefault) { 84 *a = PETSC_DEFAULT; 85 } else if (decide) { 86 *a = PETSC_DECIDE; 87 } else if (mouse) { 88 *a = -1; 89 } else { 90 if (name[0] != '+' && name[0] != '-' && name[0] < '0' && name[0] > '9') { 91 SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no integer value (do not include . in it)",name); 92 } 93 for (i=1; i<len; i++) { 94 if (name[i] < '0' || name[i] > '9') { 95 SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no integer value (do not include . in it)",name); 96 } 97 } 98 *a = atoi(name); 99 } 100 PetscFunctionReturn(0); 101 } 102 103 #undef __FUNCT__ 104 #define __FUNCT__ "PetscOptionsAtod" 105 /* 106 Converts a string to PetscReal value. Handles special cases like "default" and "decide" 107 */ 108 PetscErrorCode PETSC_DLLEXPORT PetscOptionsAtod(const char name[],PetscReal *a) 109 { 110 PetscErrorCode ierr; 111 size_t len; 112 PetscTruth decide,tdefault; 113 114 PetscFunctionBegin; 115 ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 116 if (!len) SETERRQ(PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value"); 117 118 ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr); 119 if (!tdefault) { 120 ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr); 121 } 122 ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr); 123 if (!decide) { 124 ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr); 125 } 126 127 if (tdefault) { 128 *a = PETSC_DEFAULT; 129 } else if (decide) { 130 *a = PETSC_DECIDE; 131 } else { 132 if (name[0] != '+' && name[0] != '-' && name[0] != '.' && name[0] < '0' && name[0] > '9') { 133 SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name); 134 } 135 *a = atof(name); 136 } 137 PetscFunctionReturn(0); 138 } 139 140 #undef __FUNCT__ 141 #define __FUNCT__ "PetscOptionsAtol" 142 /* 143 PetscOptionsAtol - Converts string to PetscTruth, handles cases like "yes", "no", "true", "false", "0", "1" 144 */ 145 PetscErrorCode PETSC_DLLEXPORT PetscOptionsAtol(const char value[], PetscTruth *a) 146 { 147 PetscTruth istrue, isfalse; 148 size_t len; 149 PetscErrorCode ierr; 150 151 PetscFunctionBegin; 152 ierr = PetscStrlen(value, &len);CHKERRQ(ierr); 153 if (!len) SETERRQ(PETSC_ERR_ARG_WRONG, "Character string of length zero has no logical value"); 154 ierr = PetscStrcasecmp(value,"TRUE",&istrue);CHKERRQ(ierr); 155 if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 156 ierr = PetscStrcasecmp(value,"YES",&istrue);CHKERRQ(ierr); 157 if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 158 ierr = PetscStrcasecmp(value,"1",&istrue);CHKERRQ(ierr); 159 if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 160 ierr = PetscStrcasecmp(value,"on",&istrue);CHKERRQ(ierr); 161 if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);} 162 ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr); 163 if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 164 ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr); 165 if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 166 ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr); 167 if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 168 ierr = PetscStrcasecmp(value,"off",&isfalse);CHKERRQ(ierr); 169 if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);} 170 SETERRQ1(PETSC_ERR_ARG_WRONG, "Unknown logical value: %s", value); 171 PetscFunctionReturn(0); 172 } 173 174 #undef __FUNCT__ 175 #define __FUNCT__ "PetscGetProgramName" 176 /*@C 177 PetscGetProgramName - Gets the name of the running program. 178 179 Not Collective 180 181 Input Parameter: 182 . len - length of the string name 183 184 Output Parameter: 185 . name - the name of the running program 186 187 Level: advanced 188 189 Notes: 190 The name of the program is copied into the user-provided character 191 array of length len. On some machines the program name includes 192 its entire path, so one should generally set len >= PETSC_MAX_PATH_LEN. 193 @*/ 194 PetscErrorCode PETSC_DLLEXPORT PetscGetProgramName(char name[],size_t len) 195 { 196 PetscErrorCode ierr; 197 198 PetscFunctionBegin; 199 if (!options) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call PetscInitialize() first"); 200 if (!options->namegiven) SETERRQ(PETSC_ERR_PLIB,"Unable to determine program name"); 201 ierr = PetscStrncpy(name,options->programname,len);CHKERRQ(ierr); 202 PetscFunctionReturn(0); 203 } 204 205 #undef __FUNCT__ 206 #define __FUNCT__ "PetscSetProgramName" 207 PetscErrorCode PETSC_DLLEXPORT PetscSetProgramName(const char name[]) 208 { 209 PetscErrorCode ierr; 210 211 PetscFunctionBegin; 212 options->namegiven = PETSC_TRUE; 213 ierr = PetscStrncpy(options->programname,name,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 214 PetscFunctionReturn(0); 215 } 216 217 #undef __FUNCT__ 218 #define __FUNCT__ "PetscOptionsValidKey" 219 /*@ 220 PetscOptionsValidKey - PETSc Options database keys must begin with a - followed by a letter. 221 222 Input Parameter: 223 . in_str - string to check if valid 224 225 Output Parameter: 226 . key - PETSC_TRUE if a valid key 227 228 @*/ 229 PetscErrorCode PETSC_DLLEXPORT PetscOptionsValidKey(const char in_str[],PetscTruth *key) 230 { 231 PetscFunctionBegin; 232 *key = PETSC_FALSE; 233 if (!in_str) PetscFunctionReturn(0); 234 if (in_str[0] != '-') PetscFunctionReturn(0); 235 if ((in_str[1] < 'A') || (in_str[1] > 'z')) PetscFunctionReturn(0); 236 *key = PETSC_TRUE; 237 PetscFunctionReturn(0); 238 } 239 240 #undef __FUNCT__ 241 #define __FUNCT__ "PetscOptionsInsertString" 242 /*@C 243 PetscOptionsInsertString - Inserts options into the database from a string 244 245 Not collective: but only processes that call this routine will set the options 246 included in the file 247 248 Input Parameter: 249 . in_str - string that contains options separated by blanks 250 251 252 Level: intermediate 253 254 Contributed by Boyana Norris 255 256 .seealso: PetscOptionsSetValue(), PetscOptionsPrint(), PetscOptionsHasName(), PetscOptionsGetInt(), 257 PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsTruth(), 258 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 259 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 260 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 261 PetscOptionsList(), PetscOptionsEList(), PetscOptionsInsertFile() 262 263 @*/ 264 PetscErrorCode PETSC_DLLEXPORT PetscOptionsInsertString(const char in_str[]) 265 { 266 char *first,*second; 267 PetscErrorCode ierr; 268 PetscToken token; 269 PetscTruth key; 270 271 PetscFunctionBegin; 272 ierr = PetscTokenCreate(in_str,' ',&token);CHKERRQ(ierr); 273 ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 274 while (first) { 275 ierr = PetscOptionsValidKey(first,&key);CHKERRQ(ierr); 276 if (key) { 277 ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 278 ierr = PetscOptionsValidKey(second,&key);CHKERRQ(ierr); 279 if (!key) { 280 ierr = PetscOptionsSetValue(first,second);CHKERRQ(ierr); 281 ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 282 } else { 283 ierr = PetscOptionsSetValue(first,PETSC_NULL);CHKERRQ(ierr); 284 first = second; 285 } 286 } else { 287 ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 288 } 289 } 290 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 291 PetscFunctionReturn(0); 292 } 293 294 /* 295 Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free() 296 */ 297 static char *Petscgetline(FILE * f) 298 { 299 size_t size = 0; 300 size_t len = 0; 301 size_t last = 0; 302 char * buf = PETSC_NULL; 303 304 if (feof(f)) return 0; 305 do { 306 size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */ 307 buf = (char*)realloc((void *)buf,size); /* realloc(NULL,n) is the same as malloc(n) */ 308 /* Actually do the read. Note that fgets puts a terminal '\0' on the 309 end of the string, so we make sure we overwrite this */ 310 if (!fgets(buf+len,size,f)) buf[len]=0; 311 PetscStrlen(buf,&len); 312 last = len - 1; 313 } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r'); 314 if (len) return buf; 315 free(buf); 316 return 0; 317 } 318 319 320 #undef __FUNCT__ 321 #define __FUNCT__ "PetscOptionsInsertFile" 322 /*@C 323 PetscOptionsInsertFile - Inserts options into the database from a file. 324 325 Collective on MPI_Comm 326 327 Input Parameter: 328 + comm - the processes that will share the options (usually PETSC_COMM_WORLD) 329 . file - name of file 330 - require - if PETSC_TRUE will generate an error if the file does not exist 331 332 333 Level: intermediate 334 335 .seealso: PetscOptionsSetValue(), PetscOptionsPrint(), PetscOptionsHasName(), PetscOptionsGetInt(), 336 PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsTruth(), 337 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 338 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 339 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 340 PetscOptionsList(), PetscOptionsEList() 341 342 @*/ 343 PetscErrorCode PETSC_DLLEXPORT PetscOptionsInsertFile(MPI_Comm comm,const char file[],PetscTruth require) 344 { 345 char *string,fname[PETSC_MAX_PATH_LEN],*first,*second,*third,*vstring = 0,*astring = 0; 346 PetscErrorCode ierr; 347 size_t i,len; 348 FILE *fd; 349 PetscToken token; 350 int err; 351 char cmt[3]={'#','!','%'},*cmatch; 352 PetscMPIInt rank,cnt=0,acnt=0; 353 354 PetscFunctionBegin; 355 ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 356 if (!rank) { 357 /* Warning: assume a maximum size for all options in a string */ 358 ierr = PetscMalloc(128000*sizeof(char),&vstring);CHKERRQ(ierr); 359 vstring[0] = 0; 360 ierr = PetscMalloc(64000*sizeof(char),&astring);CHKERRQ(ierr); 361 astring[0] = 0; 362 cnt = 0; 363 acnt = 0; 364 365 ierr = PetscFixFilename(file,fname);CHKERRQ(ierr); 366 fd = fopen(fname,"r"); 367 if (fd) { 368 /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */ 369 ierr = PetscInfo1(0,"Opened options file %s\n",file);CHKERRQ(ierr); 370 while ((string = Petscgetline(fd))) { 371 /* eliminate comments from each line */ 372 for (i=0; i<3; i++){ 373 ierr = PetscStrchr(string,cmt[i],&cmatch); 374 if (cmatch) *cmatch = 0; 375 } 376 ierr = PetscStrlen(string,&len);CHKERRQ(ierr); 377 /* replace tabs, ^M, \n with " " */ 378 for (i=0; i<len; i++) { 379 if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') { 380 string[i] = ' '; 381 } 382 } 383 ierr = PetscTokenCreate(string,' ',&token);CHKERRQ(ierr); 384 free(string); 385 ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 386 if (!first) { 387 goto destroy; 388 } else if (!first[0]) { /* if first token is empty spaces, redo first token */ 389 ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 390 } 391 ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 392 if (!first) { 393 goto destroy; 394 } else if (first[0] == '-') { 395 /* warning: should be making sure we do not overfill vstring */ 396 ierr = PetscStrcat(vstring,first);CHKERRQ(ierr); 397 ierr = PetscStrcat(vstring," ");CHKERRQ(ierr); 398 if (second) { 399 /* protect second with quotes in case it contains strings */ 400 ierr = PetscStrcat(vstring,"\"");CHKERRQ(ierr); 401 ierr = PetscStrcat(vstring,second);CHKERRQ(ierr); 402 ierr = PetscStrcat(vstring,"\"");CHKERRQ(ierr); 403 } 404 ierr = PetscStrcat(vstring," ");CHKERRQ(ierr); 405 } else { 406 PetscTruth match; 407 408 ierr = PetscStrcasecmp(first,"alias",&match);CHKERRQ(ierr); 409 if (match) { 410 ierr = PetscTokenFind(token,&third);CHKERRQ(ierr); 411 if (!third) SETERRQ1(PETSC_ERR_ARG_WRONG,"Error in options file:alias missing (%s)",second); 412 ierr = PetscStrcat(astring,second);CHKERRQ(ierr); 413 ierr = PetscStrcat(astring," ");CHKERRQ(ierr); 414 ierr = PetscStrcat(astring,third);CHKERRQ(ierr); 415 ierr = PetscStrcat(astring," ");CHKERRQ(ierr); 416 } else { 417 SETERRQ1(PETSC_ERR_ARG_WRONG,"Unknown statement in options file: (%s)",string); 418 } 419 } 420 destroy: 421 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 422 } 423 err = fclose(fd); 424 if (err) SETERRQ(PETSC_ERR_SYS,"fclose() failed on file"); 425 ierr = PetscStrlen(astring,&len);CHKERRQ(ierr); 426 acnt = PetscMPIIntCast(len);CHKERRQ(ierr); 427 ierr = PetscStrlen(vstring,&len);CHKERRQ(ierr); 428 cnt = PetscMPIIntCast(len);CHKERRQ(ierr); 429 } else if (require) { 430 SETERRQ1(PETSC_ERR_USER,"Unable to open Options File %s",fname); 431 } 432 } 433 434 ierr = MPI_Bcast(&acnt,1,MPI_INT,0,comm);CHKERRQ(ierr); 435 if (acnt) { 436 PetscToken token; 437 char *first,*second; 438 439 if (rank) { 440 ierr = PetscMalloc((acnt+1)*sizeof(char),&astring);CHKERRQ(ierr); 441 } 442 ierr = MPI_Bcast(astring,acnt,MPI_CHAR,0,comm);CHKERRQ(ierr); 443 astring[acnt] = 0; 444 ierr = PetscTokenCreate(astring,' ',&token);CHKERRQ(ierr); 445 ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 446 while (first) { 447 ierr = PetscTokenFind(token,&second);CHKERRQ(ierr); 448 ierr = PetscOptionsSetAlias(first,second);CHKERRQ(ierr); 449 ierr = PetscTokenFind(token,&first);CHKERRQ(ierr); 450 } 451 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 452 } 453 454 ierr = MPI_Bcast(&cnt,1,MPI_INT,0,comm);CHKERRQ(ierr); 455 if (cnt) { 456 if (rank) { 457 ierr = PetscMalloc((cnt+1)*sizeof(char),&vstring);CHKERRQ(ierr); 458 } 459 ierr = MPI_Bcast(vstring,cnt,MPI_CHAR,0,comm);CHKERRQ(ierr); 460 vstring[cnt] = 0; 461 ierr = PetscOptionsInsertString(vstring);CHKERRQ(ierr); 462 } 463 ierr = PetscFree(astring);CHKERRQ(ierr); 464 ierr = PetscFree(vstring);CHKERRQ(ierr); 465 PetscFunctionReturn(0); 466 } 467 468 #undef __FUNCT__ 469 #define __FUNCT__ "PetscOptionsInsert" 470 /*@C 471 PetscOptionsInsert - Inserts into the options database from the command line, 472 the environmental variable and a file. 473 474 Input Parameters: 475 + argc - count of number of command line arguments 476 . args - the command line arguments 477 - file - optional filename, defaults to ~username/.petscrc 478 479 Note: 480 Since PetscOptionsInsert() is automatically called by PetscInitialize(), 481 the user does not typically need to call this routine. PetscOptionsInsert() 482 can be called several times, adding additional entries into the database. 483 484 Options Database Keys: 485 + -options_monitor <optional filename> - print options names and values as they are set 486 487 Level: advanced 488 489 Concepts: options database^adding 490 491 .seealso: PetscOptionsDestroy_Private(), PetscOptionsPrint(), PetscOptionsInsertString(), PetscOptionsInsertFile(), 492 PetscInitialize() 493 @*/ 494 PetscErrorCode PETSC_DLLEXPORT PetscOptionsInsert(int *argc,char ***args,const char file[]) 495 { 496 PetscErrorCode ierr; 497 PetscMPIInt rank; 498 char pfile[PETSC_MAX_PATH_LEN]; 499 PetscTruth flag = PETSC_FALSE; 500 501 PetscFunctionBegin; 502 if (options == PETSC_NULL) { 503 fprintf(stderr, "Options have not been enabled.\nYou might have forgotten to call PetscInitialize().\n"); 504 MPI_Abort(MPI_COMM_WORLD, PETSC_ERR_SUP); 505 } 506 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 507 508 options->argc = (argc) ? *argc : 0; 509 options->args = (args) ? *args : PETSC_NULL; 510 511 if (file) { 512 ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,file,PETSC_TRUE);CHKERRQ(ierr); 513 } 514 ierr = PetscOptionsGetTruth(PETSC_NULL,"-skip_petscrc",&flag,PETSC_NULL);CHKERRQ(ierr); 515 if (!flag) { 516 ierr = PetscGetHomeDirectory(pfile,PETSC_MAX_PATH_LEN-16);CHKERRQ(ierr); 517 /* warning: assumes all processes have a home directory or none, but nothing in between */ 518 if (pfile[0]) { 519 ierr = PetscStrcat(pfile,"/.petscrc");CHKERRQ(ierr); 520 ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,pfile,PETSC_FALSE);CHKERRQ(ierr); 521 } 522 ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,".petscrc",PETSC_FALSE);CHKERRQ(ierr); 523 ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,"petscrc",PETSC_FALSE);CHKERRQ(ierr); 524 } 525 526 /* insert environmental options */ 527 { 528 char *eoptions = 0; 529 size_t len = 0; 530 if (!rank) { 531 eoptions = (char*)getenv("PETSC_OPTIONS"); 532 ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr); 533 ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 534 } else { 535 ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 536 if (len) { 537 ierr = PetscMalloc((len+1)*sizeof(char*),&eoptions);CHKERRQ(ierr); 538 } 539 } 540 if (len) { 541 ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 542 if (rank) eoptions[len] = 0; 543 ierr = PetscOptionsInsertString(eoptions);CHKERRQ(ierr); 544 if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);} 545 } 546 } 547 548 /* insert command line options */ 549 if (argc && args && *argc) { 550 int left = *argc - 1; 551 char **eargs = *args + 1; 552 PetscTruth isoptions_file,isp4,tisp4,isp4yourname,isp4rmrank; 553 554 while (left) { 555 ierr = PetscStrcasecmp(eargs[0],"-options_file",&isoptions_file);CHKERRQ(ierr); 556 ierr = PetscStrcasecmp(eargs[0],"-p4pg",&isp4);CHKERRQ(ierr); 557 ierr = PetscStrcasecmp(eargs[0],"-p4yourname",&isp4yourname);CHKERRQ(ierr); 558 ierr = PetscStrcasecmp(eargs[0],"-p4rmrank",&isp4rmrank);CHKERRQ(ierr); 559 ierr = PetscStrcasecmp(eargs[0],"-p4wd",&tisp4);CHKERRQ(ierr); 560 isp4 = (PetscTruth) (isp4 || tisp4); 561 ierr = PetscStrcasecmp(eargs[0],"-np",&tisp4);CHKERRQ(ierr); 562 isp4 = (PetscTruth) (isp4 || tisp4); 563 ierr = PetscStrcasecmp(eargs[0],"-p4amslave",&tisp4);CHKERRQ(ierr); 564 565 if (eargs[0][0] != '-') { 566 eargs++; left--; 567 } else if (isoptions_file) { 568 if (left <= 1) SETERRQ(PETSC_ERR_USER,"Missing filename for -options_file filename option"); 569 if (eargs[1][0] == '-') SETERRQ(PETSC_ERR_USER,"Missing filename for -options_file filename option"); 570 ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,eargs[1],PETSC_TRUE);CHKERRQ(ierr); 571 eargs += 2; left -= 2; 572 573 /* 574 These are "bad" options that MPICH, etc put on the command line 575 we strip them out here. 576 */ 577 } else if (tisp4 || isp4rmrank) { 578 eargs += 1; left -= 1; 579 } else if (isp4 || isp4yourname) { 580 eargs += 2; left -= 2; 581 } else if ((left < 2) || ((eargs[1][0] == '-') && 582 ((eargs[1][1] > '9') || (eargs[1][1] < '0')))) { 583 ierr = PetscOptionsSetValue(eargs[0],PETSC_NULL);CHKERRQ(ierr); 584 eargs++; left--; 585 } else { 586 ierr = PetscOptionsSetValue(eargs[0],eargs[1]);CHKERRQ(ierr); 587 eargs += 2; left -= 2; 588 } 589 } 590 } 591 PetscFunctionReturn(0); 592 } 593 594 #undef __FUNCT__ 595 #define __FUNCT__ "PetscOptionsPrint" 596 /*@C 597 PetscOptionsPrint - Prints the options that have been loaded. This is 598 useful for debugging purposes. 599 600 Collective on PETSC_COMM_WORLD 601 602 Input Parameter: 603 . FILE fd - location to print options (usually stdout or stderr) 604 605 Options Database Key: 606 . -optionstable - Activates PetscOptionsPrint() within PetscFinalize() 607 608 Level: advanced 609 610 Concepts: options database^printing 611 612 .seealso: PetscOptionsAllUsed() 613 @*/ 614 PetscErrorCode PETSC_DLLEXPORT PetscOptionsPrint(FILE *fd) 615 { 616 PetscErrorCode ierr; 617 PetscInt i; 618 619 PetscFunctionBegin; 620 if (!fd) fd = PETSC_STDOUT; 621 if (!options) {ierr = PetscOptionsInsert(0,0,0);CHKERRQ(ierr);} 622 if (options->N) { 623 ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"#PETSc Option Table entries:\n");CHKERRQ(ierr); 624 } else { 625 ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"#No PETSc Option Table entries\n");CHKERRQ(ierr); 626 } 627 for (i=0; i<options->N; i++) { 628 if (options->values[i]) { 629 ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"-%s %s\n",options->names[i],options->values[i]);CHKERRQ(ierr); 630 } else { 631 ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"-%s\n",options->names[i]);CHKERRQ(ierr); 632 } 633 } 634 if (options->N) { 635 ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"#End of PETSc Option Table entries\n");CHKERRQ(ierr); 636 } 637 PetscFunctionReturn(0); 638 } 639 640 #undef __FUNCT__ 641 #define __FUNCT__ "PetscOptionsGetAll" 642 /*@C 643 PetscOptionsGetAll - Lists all the options the program was run with in a single string. 644 645 Not Collective 646 647 Output Parameter: 648 . copts - pointer where string pointer is stored 649 650 Notes: the array and each entry in the array should be freed with PetscFree() 651 652 Level: advanced 653 654 Concepts: options database^listing 655 656 .seealso: PetscOptionsAllUsed(), PetscOptionsPrint() 657 @*/ 658 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetAll(char *copts[]) 659 { 660 PetscErrorCode ierr; 661 PetscInt i; 662 size_t len = 1,lent; 663 char *coptions; 664 665 PetscFunctionBegin; 666 if (!options) {ierr = PetscOptionsInsert(0,0,0);CHKERRQ(ierr);} 667 668 /* count the length of the required string */ 669 for (i=0; i<options->N; i++) { 670 ierr = PetscStrlen(options->names[i],&lent);CHKERRQ(ierr); 671 len += 2 + lent; 672 if (options->values[i]) { 673 ierr = PetscStrlen(options->values[i],&lent);CHKERRQ(ierr); 674 len += 1 + lent; 675 } 676 } 677 ierr = PetscMalloc(len*sizeof(char),&coptions);CHKERRQ(ierr); 678 coptions[0] = 0; 679 for (i=0; i<options->N; i++) { 680 ierr = PetscStrcat(coptions,"-");CHKERRQ(ierr); 681 ierr = PetscStrcat(coptions,options->names[i]);CHKERRQ(ierr); 682 ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 683 if (options->values[i]) { 684 ierr = PetscStrcat(coptions,options->values[i]);CHKERRQ(ierr); 685 ierr = PetscStrcat(coptions," ");CHKERRQ(ierr); 686 } 687 } 688 *copts = coptions; 689 PetscFunctionReturn(0); 690 } 691 692 #undef __FUNCT__ 693 #define __FUNCT__ "PetscOptionsClear" 694 /*@C 695 PetscOptionsClear - Removes all options form the database leaving it empty. 696 697 Level: developer 698 699 .seealso: PetscOptionsInsert() 700 @*/ 701 PetscErrorCode PETSC_DLLEXPORT PetscOptionsClear(void) 702 { 703 PetscInt i; 704 705 PetscFunctionBegin; 706 if (!options) PetscFunctionReturn(0); 707 for (i=0; i<options->N; i++) { 708 if (options->names[i]) free(options->names[i]); 709 if (options->values[i]) free(options->values[i]); 710 } 711 for (i=0; i<options->Naliases; i++) { 712 free(options->aliases1[i]); 713 free(options->aliases2[i]); 714 } 715 options->N = 0; 716 options->Naliases = 0; 717 PetscFunctionReturn(0); 718 } 719 720 #undef __FUNCT__ 721 #define __FUNCT__ "PetscOptionsDestroy" 722 /*@C 723 PetscOptionsDestroy - Destroys the option database. 724 725 Note: 726 Since PetscOptionsDestroy() is called by PetscFinalize(), the user 727 typically does not need to call this routine. 728 729 Level: developer 730 731 .seealso: PetscOptionsInsert() 732 @*/ 733 PetscErrorCode PETSC_DLLEXPORT PetscOptionsDestroy(void) 734 { 735 PetscErrorCode ierr; 736 737 PetscFunctionBegin; 738 if (!options) PetscFunctionReturn(0); 739 ierr = PetscOptionsClear();CHKERRQ(ierr); 740 free(options); 741 options = 0; 742 PetscFunctionReturn(0); 743 } 744 745 #undef __FUNCT__ 746 #define __FUNCT__ "PetscOptionsSetValue" 747 /*@C 748 PetscOptionsSetValue - Sets an option name-value pair in the options 749 database, overriding whatever is already present. 750 751 Not collective, but setting values on certain processors could cause problems 752 for parallel objects looking for options. 753 754 Input Parameters: 755 + name - name of option, this SHOULD have the - prepended 756 - value - the option value (not used for all options) 757 758 Level: intermediate 759 760 Note: 761 Only some options have values associated with them, such as 762 -ksp_rtol tol. Other options stand alone, such as -ksp_monitor. 763 764 Concepts: options database^adding option 765 766 .seealso: PetscOptionsInsert() 767 @*/ 768 PetscErrorCode PETSC_DLLEXPORT PetscOptionsSetValue(const char iname[],const char value[]) 769 { 770 size_t len; 771 PetscErrorCode ierr; 772 PetscInt N,n,i; 773 char **names; 774 const char *name = (char*)iname; 775 PetscTruth gt,match; 776 777 PetscFunctionBegin; 778 if (!options) {ierr = PetscOptionsInsert(0,0,0);CHKERRQ(ierr);} 779 780 /* this is so that -h and -hel\p are equivalent (p4 does not like -help)*/ 781 ierr = PetscStrcasecmp(name,"-h",&match);CHKERRQ(ierr); 782 if (match) name = "-help"; 783 784 name++; 785 /* first check against aliases */ 786 N = options->Naliases; 787 for (i=0; i<N; i++) { 788 ierr = PetscStrcasecmp(options->aliases1[i],name,&match);CHKERRQ(ierr); 789 if (match) { 790 name = options->aliases2[i]; 791 break; 792 } 793 } 794 795 N = options->N; 796 n = N; 797 names = options->names; 798 799 for (i=0; i<N; i++) { 800 ierr = PetscStrcasecmp(names[i],name,&match);CHKERRQ(ierr); 801 ierr = PetscStrgrt(names[i],name,>);CHKERRQ(ierr); 802 if (match) { 803 if (options->values[i]) free(options->values[i]); 804 ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 805 if (len) { 806 options->values[i] = (char*)malloc((len+1)*sizeof(char)); 807 ierr = PetscStrcpy(options->values[i],value);CHKERRQ(ierr); 808 } else { options->values[i] = 0;} 809 PetscOptionsMonitor(name,value); 810 PetscFunctionReturn(0); 811 } else if (gt) { 812 n = i; 813 break; 814 } 815 } 816 if (N >= MAXOPTIONS) { 817 SETERRQ1(PETSC_ERR_PLIB,"No more room in option table, limit %d recompile \n src/sys/objects/options.c with larger value for MAXOPTIONS\n",MAXOPTIONS); 818 } 819 /* shift remaining values down 1 */ 820 for (i=N; i>n; i--) { 821 options->names[i] = options->names[i-1]; 822 options->values[i] = options->values[i-1]; 823 options->used[i] = options->used[i-1]; 824 } 825 /* insert new name and value */ 826 ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 827 options->names[n] = (char*)malloc((len+1)*sizeof(char)); 828 ierr = PetscStrcpy(options->names[n],name);CHKERRQ(ierr); 829 ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 830 if (len) { 831 options->values[n] = (char*)malloc((len+1)*sizeof(char)); 832 ierr = PetscStrcpy(options->values[n],value);CHKERRQ(ierr); 833 } else {options->values[n] = 0;} 834 options->used[n] = PETSC_FALSE; 835 options->N++; 836 PetscOptionsMonitor(name,value); 837 PetscFunctionReturn(0); 838 } 839 840 #undef __FUNCT__ 841 #define __FUNCT__ "PetscOptionsClearValue" 842 /*@C 843 PetscOptionsClearValue - Clears an option name-value pair in the options 844 database, overriding whatever is already present. 845 846 Not Collective, but setting values on certain processors could cause problems 847 for parallel objects looking for options. 848 849 Input Parameter: 850 . name - name of option, this SHOULD have the - prepended 851 852 Level: intermediate 853 854 Concepts: options database^removing option 855 .seealso: PetscOptionsInsert() 856 @*/ 857 PetscErrorCode PETSC_DLLEXPORT PetscOptionsClearValue(const char iname[]) 858 { 859 PetscErrorCode ierr; 860 PetscInt N,n,i; 861 char **names,*name=(char*)iname; 862 PetscTruth gt,match; 863 864 PetscFunctionBegin; 865 if (name[0] != '-') SETERRQ1(PETSC_ERR_ARG_WRONG,"Name must begin with -: Instead %s",name); 866 if (!options) {ierr = PetscOptionsInsert(0,0,0);CHKERRQ(ierr);} 867 868 name++; 869 870 N = options->N; n = 0; 871 names = options->names; 872 873 for (i=0; i<N; i++) { 874 ierr = PetscStrcasecmp(names[i],name,&match);CHKERRQ(ierr); 875 ierr = PetscStrgrt(names[i],name,>);CHKERRQ(ierr); 876 if (match) { 877 if (options->names[i]) free(options->names[i]); 878 if (options->values[i]) free(options->values[i]); 879 PetscOptionsMonitor(name,""); 880 break; 881 } else if (gt) { 882 PetscFunctionReturn(0); /* it was not listed */ 883 } 884 n++; 885 } 886 if (n == N) PetscFunctionReturn(0); /* it was not listed */ 887 888 /* shift remaining values down 1 */ 889 for (i=n; i<N-1; i++) { 890 options->names[i] = options->names[i+1]; 891 options->values[i] = options->values[i+1]; 892 options->used[i] = options->used[i+1]; 893 } 894 options->N--; 895 PetscFunctionReturn(0); 896 } 897 898 #undef __FUNCT__ 899 #define __FUNCT__ "PetscOptionsSetAlias" 900 /*@C 901 PetscOptionsSetAlias - Makes a key and alias for another key 902 903 Not Collective, but setting values on certain processors could cause problems 904 for parallel objects looking for options. 905 906 Input Parameters: 907 + inewname - the alias 908 - ioldname - the name that alias will refer to 909 910 Level: advanced 911 912 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 913 PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsTruth(), 914 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 915 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 916 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 917 PetscOptionsList(), PetscOptionsEList() 918 @*/ 919 PetscErrorCode PETSC_DLLEXPORT PetscOptionsSetAlias(const char inewname[],const char ioldname[]) 920 { 921 PetscErrorCode ierr; 922 PetscInt n = options->Naliases; 923 size_t len; 924 char *newname = (char *)inewname,*oldname = (char*)ioldname; 925 926 PetscFunctionBegin; 927 if (newname[0] != '-') SETERRQ1(PETSC_ERR_ARG_WRONG,"aliased must have -: Instead %s",newname); 928 if (oldname[0] != '-') SETERRQ1(PETSC_ERR_ARG_WRONG,"aliasee must have -: Instead %s",oldname); 929 if (n >= MAXALIASES) { 930 SETERRQ1(PETSC_ERR_MEM,"You have defined to many PETSc options aliases, limit %d recompile \n src/sys/objects/options.c with larger value for MAXALIASES",MAXALIASES); 931 } 932 933 newname++; oldname++; 934 ierr = PetscStrlen(newname,&len);CHKERRQ(ierr); 935 options->aliases1[n] = (char*)malloc((len+1)*sizeof(char)); 936 ierr = PetscStrcpy(options->aliases1[n],newname);CHKERRQ(ierr); 937 ierr = PetscStrlen(oldname,&len);CHKERRQ(ierr); 938 options->aliases2[n] = (char*)malloc((len+1)*sizeof(char)); 939 ierr = PetscStrcpy(options->aliases2[n],oldname);CHKERRQ(ierr); 940 options->Naliases++; 941 PetscFunctionReturn(0); 942 } 943 944 #undef __FUNCT__ 945 #define __FUNCT__ "PetscOptionsFindPair_Private" 946 static PetscErrorCode PetscOptionsFindPair_Private(const char pre[],const char name[],char *value[],PetscTruth *flg) 947 { 948 PetscErrorCode ierr; 949 PetscInt i,N; 950 size_t len; 951 char **names,tmp[256]; 952 PetscTruth match; 953 954 PetscFunctionBegin; 955 if (!options) {ierr = PetscOptionsInsert(0,0,0);CHKERRQ(ierr);} 956 N = options->N; 957 names = options->names; 958 959 if (name[0] != '-') SETERRQ1(PETSC_ERR_ARG_WRONG,"Name must begin with -: Instead %s",name); 960 961 /* append prefix to name */ 962 if (pre) { 963 if (pre[0] == '-') SETERRQ(PETSC_ERR_ARG_WRONG,"Prefix should not begin with a -"); 964 ierr = PetscStrncpy(tmp,pre,256);CHKERRQ(ierr); 965 ierr = PetscStrlen(tmp,&len);CHKERRQ(ierr); 966 ierr = PetscStrncat(tmp,name+1,256-len-1);CHKERRQ(ierr); 967 } else { 968 ierr = PetscStrncpy(tmp,name+1,256);CHKERRQ(ierr); 969 } 970 971 /* slow search */ 972 *flg = PETSC_FALSE; 973 for (i=0; i<N; i++) { 974 ierr = PetscStrcasecmp(names[i],tmp,&match);CHKERRQ(ierr); 975 if (match) { 976 *value = options->values[i]; 977 options->used[i] = PETSC_TRUE; 978 *flg = PETSC_TRUE; 979 break; 980 } 981 } 982 if (!*flg) { 983 PetscInt j,cnt = 0,locs[16],loce[16]; 984 size_t n; 985 ierr = PetscStrlen(tmp,&n);CHKERRQ(ierr); 986 /* determine the location and number of all _%d_ in the key */ 987 for (i=0; i< (PetscInt)n; i++) { 988 if (tmp[i] == '_') { 989 for (j=i+1; j< (PetscInt)n; j++) { 990 if (tmp[j] >= '0' && tmp[j] <= '9') continue; 991 if (tmp[j] == '_' && j > i+1) { /* found a number */ 992 locs[cnt] = i+1; 993 loce[cnt++] = j+1; 994 } 995 break; 996 } 997 } 998 } 999 if (cnt) { 1000 char tmp2[256]; 1001 for (i=0; i<cnt; i++) { 1002 ierr = PetscStrcpy(tmp2,"-");CHKERRQ(ierr); 1003 ierr = PetscStrncat(tmp2,tmp,locs[i]);CHKERRQ(ierr); 1004 ierr = PetscStrcat(tmp2,tmp+loce[i]);CHKERRQ(ierr); 1005 ierr = PetscOptionsFindPair_Private(PETSC_NULL,tmp2,value,flg);CHKERRQ(ierr); 1006 if (*flg) break; 1007 } 1008 } 1009 } 1010 PetscFunctionReturn(0); 1011 } 1012 1013 #undef __FUNCT__ 1014 #define __FUNCT__ "PetscOptionsReject" 1015 /*@C 1016 PetscOptionsReject - Generates an error if a certain option is given. 1017 1018 Not Collective, but setting values on certain processors could cause problems 1019 for parallel objects looking for options. 1020 1021 Input Parameters: 1022 + name - the option one is seeking 1023 - mess - error message (may be PETSC_NULL) 1024 1025 Level: advanced 1026 1027 Concepts: options database^rejecting option 1028 1029 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(), 1030 PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1031 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1032 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1033 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1034 PetscOptionsList(), PetscOptionsEList() 1035 @*/ 1036 PetscErrorCode PETSC_DLLEXPORT PetscOptionsReject(const char name[],const char mess[]) 1037 { 1038 PetscErrorCode ierr; 1039 PetscTruth flag = PETSC_FALSE; 1040 1041 PetscFunctionBegin; 1042 ierr = PetscOptionsHasName(PETSC_NULL,name,&flag);CHKERRQ(ierr); 1043 if (flag) { 1044 if (mess) { 1045 SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: %s with %s",name,mess); 1046 } else { 1047 SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: %s",name); 1048 } 1049 } 1050 PetscFunctionReturn(0); 1051 } 1052 1053 #undef __FUNCT__ 1054 #define __FUNCT__ "PetscOptionsHasName" 1055 /*@C 1056 PetscOptionsHasName - Determines whether a certain option is given in the database. This returns true whether the option is a number, string or boolean, even 1057 its value is set to false. 1058 1059 Not Collective 1060 1061 Input Parameters: 1062 + name - the option one is seeking 1063 - pre - string to prepend to the name or PETSC_NULL 1064 1065 Output Parameters: 1066 . flg - PETSC_TRUE if found else PETSC_FALSE. 1067 1068 Level: beginner 1069 1070 Concepts: options database^has option name 1071 1072 Notes: Name cannot be simply -h 1073 1074 In many cases you probably want to use PetscOptionsGetTruth() instead of calling this, to allowing toggling values. 1075 1076 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1077 PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1078 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1079 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1080 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1081 PetscOptionsList(), PetscOptionsEList() 1082 @*/ 1083 PetscErrorCode PETSC_DLLEXPORT PetscOptionsHasName(const char pre[],const char name[],PetscTruth *flg) 1084 { 1085 char *value; 1086 PetscErrorCode ierr; 1087 PetscTruth flag; 1088 1089 PetscFunctionBegin; 1090 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1091 if (flg) *flg = flag; 1092 PetscFunctionReturn(0); 1093 } 1094 1095 #undef __FUNCT__ 1096 #define __FUNCT__ "PetscOptionsGetInt" 1097 /*@C 1098 PetscOptionsGetInt - Gets the integer value for a particular option in the database. 1099 1100 Not Collective 1101 1102 Input Parameters: 1103 + pre - the string to prepend to the name or PETSC_NULL 1104 - name - the option one is seeking 1105 1106 Output Parameter: 1107 + ivalue - the integer value to return 1108 - flg - PETSC_TRUE if found, else PETSC_FALSE 1109 1110 Level: beginner 1111 1112 Concepts: options database^has int 1113 1114 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 1115 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth() 1116 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(), 1117 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1118 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1119 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1120 PetscOptionsList(), PetscOptionsEList() 1121 @*/ 1122 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetInt(const char pre[],const char name[],PetscInt *ivalue,PetscTruth *flg) 1123 { 1124 char *value; 1125 PetscErrorCode ierr; 1126 PetscTruth flag; 1127 1128 PetscFunctionBegin; 1129 PetscValidCharPointer(name,2); 1130 PetscValidIntPointer(ivalue,3); 1131 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1132 if (flag) { 1133 if (!value) {if (flg) *flg = PETSC_FALSE;} 1134 else { 1135 if (flg) *flg = PETSC_TRUE; 1136 ierr = PetscOptionsAtoi(value,ivalue);CHKERRQ(ierr); 1137 } 1138 } else { 1139 if (flg) *flg = PETSC_FALSE; 1140 } 1141 PetscFunctionReturn(0); 1142 } 1143 1144 #undef __FUNCT__ 1145 #define __FUNCT__ "PetscOptionsGetEList" 1146 /*@C 1147 PetscOptionsGetEList - Puts a list of option values that a single one may be selected from 1148 1149 Not Collective 1150 1151 Input Parameters: 1152 + pre - the string to prepend to the name or PETSC_NULL 1153 . opt - option name 1154 . list - the possible choices 1155 . ntext - number of choices 1156 1157 Output Parameter: 1158 + value - the index of the value to return 1159 - set - PETSC_TRUE if found, else PETSC_FALSE 1160 1161 Level: intermediate 1162 1163 See PetscOptionsList() for when the choices are given in a PetscFList() 1164 1165 Concepts: options database^list 1166 1167 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1168 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1169 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1170 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1171 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1172 PetscOptionsList(), PetscOptionsEList() 1173 @*/ 1174 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetEList(const char pre[],const char opt[],const char *const*list,PetscInt ntext,PetscInt *value,PetscTruth *set) 1175 { 1176 PetscErrorCode ierr; 1177 size_t alen,len = 0; 1178 char *svalue; 1179 PetscTruth aset,flg = PETSC_FALSE; 1180 PetscInt i; 1181 1182 PetscFunctionBegin; 1183 for ( i=0; i<ntext; i++) { 1184 ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr); 1185 if (alen > len) len = alen; 1186 } 1187 len += 5; /* a little extra space for user mistypes */ 1188 ierr = PetscMalloc(len*sizeof(char),&svalue);CHKERRQ(ierr); 1189 ierr = PetscOptionsGetString(pre,opt,svalue,len,&aset);CHKERRQ(ierr); 1190 if (aset) { 1191 if (set) *set = PETSC_TRUE; 1192 for (i=0; i<ntext; i++) { 1193 ierr = PetscStrcasecmp(svalue,list[i],&flg);CHKERRQ(ierr); 1194 if (flg) { 1195 *value = i; 1196 break; 1197 } 1198 } 1199 if (!flg) SETERRQ3(PETSC_ERR_USER,"Unknown option %s for -%s%s",svalue,pre?pre:"",opt+1); 1200 } else if (set) { 1201 *set = PETSC_FALSE; 1202 } 1203 ierr = PetscFree(svalue);CHKERRQ(ierr); 1204 PetscFunctionReturn(0); 1205 } 1206 1207 #undef __FUNCT__ 1208 #define __FUNCT__ "PetscOptionsEnum" 1209 /*@C 1210 PetscOptionsGetEnum - Gets the enum value for a particular option in the database. 1211 1212 Not Collective 1213 1214 Input Parameters: 1215 + pre - option prefix or PETSC_NULL 1216 . opt - option name 1217 . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 1218 - defaultv - the default (current) value 1219 1220 Output Parameter: 1221 + value - the value to return 1222 - flg - PETSC_TRUE if found, else PETSC_FALSE 1223 1224 Level: beginner 1225 1226 Concepts: options database 1227 1228 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1229 1230 list is usually something like PCASMTypes or some other predefined list of enum names 1231 1232 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 1233 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth() 1234 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(), 1235 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1236 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1237 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1238 PetscOptionsList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum() 1239 @*/ 1240 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetEnum(const char pre[],const char opt[],const char *const*list,PetscEnum *value,PetscTruth *set) 1241 { 1242 PetscErrorCode ierr; 1243 PetscInt ntext = 0,tval; 1244 PetscTruth fset; 1245 1246 PetscFunctionBegin; 1247 while (list[ntext++]) { 1248 if (ntext > 50) SETERRQ(PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 1249 } 1250 if (ntext < 3) SETERRQ(PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 1251 ntext -= 3; 1252 ierr = PetscOptionsGetEList(pre,opt,list,ntext,&tval,&fset);CHKERRQ(ierr); 1253 /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */ 1254 if (fset) *value = (PetscEnum)tval; 1255 if (set) *set = fset; 1256 PetscFunctionReturn(0); 1257 } 1258 1259 #undef __FUNCT__ 1260 #define __FUNCT__ "PetscOptionsGetTruth" 1261 /*@C 1262 PetscOptionsGetTruth - Gets the Logical (true or false) value for a particular 1263 option in the database. 1264 1265 Not Collective 1266 1267 Input Parameters: 1268 + pre - the string to prepend to the name or PETSC_NULL 1269 - name - the option one is seeking 1270 1271 Output Parameter: 1272 + ivalue - the logical value to return 1273 - flg - PETSC_TRUE if found, else PETSC_FALSE 1274 1275 Level: beginner 1276 1277 Notes: 1278 TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 1279 FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 1280 1281 If the user does not supply the option (as either true or false) ivalue is NOT changed. Thus 1282 you NEED TO ALWAYS initialize the ivalue. 1283 1284 Concepts: options database^has logical 1285 1286 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 1287 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsTruth(), 1288 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1289 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1290 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1291 PetscOptionsList(), PetscOptionsEList() 1292 @*/ 1293 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetTruth(const char pre[],const char name[],PetscTruth *ivalue,PetscTruth *flg) 1294 { 1295 char *value; 1296 PetscTruth flag; 1297 PetscErrorCode ierr; 1298 1299 PetscFunctionBegin; 1300 PetscValidCharPointer(name,2); 1301 PetscValidIntPointer(ivalue,3); 1302 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1303 if (flag) { 1304 if (flg) *flg = PETSC_TRUE; 1305 if (!value) { 1306 *ivalue = PETSC_TRUE; 1307 } else { 1308 ierr = PetscOptionsAtol(value, ivalue);CHKERRQ(ierr); 1309 } 1310 } else { 1311 if (flg) *flg = PETSC_FALSE; 1312 } 1313 PetscFunctionReturn(0); 1314 } 1315 1316 #undef __FUNCT__ 1317 #define __FUNCT__ "PetscOptionsGetTruthArray" 1318 /*@C 1319 PetscOptionsGetTruthArray - Gets an array of Logical (true or false) values for a particular 1320 option in the database. The values must be separated with commas with 1321 no intervening spaces. 1322 1323 Not Collective 1324 1325 Input Parameters: 1326 + pre - string to prepend to each name or PETSC_NULL 1327 . name - the option one is seeking 1328 - nmax - maximum number of values to retrieve 1329 1330 Output Parameter: 1331 + dvalue - the integer values to return 1332 . nmax - actual number of values retreived 1333 - flg - PETSC_TRUE if found, else PETSC_FALSE 1334 1335 Level: beginner 1336 1337 Concepts: options database^array of ints 1338 1339 Notes: 1340 TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 1341 FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 1342 1343 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 1344 PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1345 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1346 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1347 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1348 PetscOptionsList(), PetscOptionsEList() 1349 @*/ 1350 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetTruthArray(const char pre[],const char name[],PetscTruth dvalue[],PetscInt *nmax,PetscTruth *flg) 1351 { 1352 char *value; 1353 PetscErrorCode ierr; 1354 PetscInt n = 0; 1355 PetscTruth flag; 1356 PetscToken token; 1357 1358 PetscFunctionBegin; 1359 PetscValidCharPointer(name,2); 1360 PetscValidIntPointer(dvalue,3); 1361 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1362 if (!flag) {if (flg) *flg = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 1363 if (!value) {if (flg) *flg = PETSC_TRUE; *nmax = 0; PetscFunctionReturn(0);} 1364 1365 if (flg) *flg = PETSC_TRUE; 1366 1367 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 1368 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1369 while (n < *nmax) { 1370 if (!value) break; 1371 ierr = PetscOptionsAtol(value,dvalue);CHKERRQ(ierr); 1372 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1373 dvalue++; 1374 n++; 1375 } 1376 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 1377 *nmax = n; 1378 PetscFunctionReturn(0); 1379 } 1380 1381 #undef __FUNCT__ 1382 #define __FUNCT__ "PetscOptionsGetReal" 1383 /*@C 1384 PetscOptionsGetReal - Gets the double precision value for a particular 1385 option in the database. 1386 1387 Not Collective 1388 1389 Input Parameters: 1390 + pre - string to prepend to each name or PETSC_NULL 1391 - name - the option one is seeking 1392 1393 Output Parameter: 1394 + dvalue - the double value to return 1395 - flg - PETSC_TRUE if found, PETSC_FALSE if not found 1396 1397 Level: beginner 1398 1399 Concepts: options database^has double 1400 1401 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 1402 PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsTruth(), 1403 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1404 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1405 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1406 PetscOptionsList(), PetscOptionsEList() 1407 @*/ 1408 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetReal(const char pre[],const char name[],PetscReal *dvalue,PetscTruth *flg) 1409 { 1410 char *value; 1411 PetscErrorCode ierr; 1412 PetscTruth flag; 1413 1414 PetscFunctionBegin; 1415 PetscValidCharPointer(name,2); 1416 PetscValidDoublePointer(dvalue,3); 1417 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1418 if (flag) { 1419 if (!value) {if (flg) *flg = PETSC_FALSE;} 1420 else {if (flg) *flg = PETSC_TRUE; ierr = PetscOptionsAtod(value,dvalue);CHKERRQ(ierr);} 1421 } else { 1422 if (flg) *flg = PETSC_FALSE; 1423 } 1424 PetscFunctionReturn(0); 1425 } 1426 1427 #undef __FUNCT__ 1428 #define __FUNCT__ "PetscOptionsGetScalar" 1429 /*@C 1430 PetscOptionsGetScalar - Gets the scalar value for a particular 1431 option in the database. 1432 1433 Not Collective 1434 1435 Input Parameters: 1436 + pre - string to prepend to each name or PETSC_NULL 1437 - name - the option one is seeking 1438 1439 Output Parameter: 1440 + dvalue - the double value to return 1441 - flg - PETSC_TRUE if found, else PETSC_FALSE 1442 1443 Level: beginner 1444 1445 Usage: 1446 A complex number 2+3i can be specified as 2,3 at the command line. 1447 or a number 2.0e-10 - 3.3e-20 i can be specified as 2.0e-10,3.3e-20 1448 1449 Concepts: options database^has scalar 1450 1451 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 1452 PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1453 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1454 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1455 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1456 PetscOptionsList(), PetscOptionsEList() 1457 @*/ 1458 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetScalar(const char pre[],const char name[],PetscScalar *dvalue,PetscTruth *flg) 1459 { 1460 char *value; 1461 PetscTruth flag; 1462 PetscErrorCode ierr; 1463 1464 PetscFunctionBegin; 1465 PetscValidCharPointer(name,2); 1466 PetscValidScalarPointer(dvalue,3); 1467 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1468 if (flag) { 1469 if (!value) { 1470 if (flg) *flg = PETSC_FALSE; 1471 } else { 1472 #if !defined(PETSC_USE_COMPLEX) 1473 ierr = PetscOptionsAtod(value,dvalue);CHKERRQ(ierr); 1474 #else 1475 PetscReal re=0.0,im=0.0; 1476 PetscToken token; 1477 char *tvalue = 0; 1478 1479 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 1480 ierr = PetscTokenFind(token,&tvalue);CHKERRQ(ierr); 1481 if (!tvalue) { SETERRQ(PETSC_ERR_ARG_WRONG,"unknown string specified\n"); } 1482 ierr = PetscOptionsAtod(tvalue,&re);CHKERRQ(ierr); 1483 ierr = PetscTokenFind(token,&tvalue);CHKERRQ(ierr); 1484 if (!tvalue) { /* Unknown separator used. using only real value */ 1485 *dvalue = re; 1486 } else { 1487 ierr = PetscOptionsAtod(tvalue,&im);CHKERRQ(ierr); 1488 *dvalue = re + PETSC_i*im; 1489 } 1490 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 1491 #endif 1492 if (flg) *flg = PETSC_TRUE; 1493 } 1494 } else { /* flag */ 1495 if (flg) *flg = PETSC_FALSE; 1496 } 1497 PetscFunctionReturn(0); 1498 } 1499 1500 #undef __FUNCT__ 1501 #define __FUNCT__ "PetscOptionsGetRealArray" 1502 /*@C 1503 PetscOptionsGetRealArray - Gets an array of double precision values for a 1504 particular option in the database. The values must be separated with 1505 commas with no intervening spaces. 1506 1507 Not Collective 1508 1509 Input Parameters: 1510 + pre - string to prepend to each name or PETSC_NULL 1511 . name - the option one is seeking 1512 - nmax - maximum number of values to retrieve 1513 1514 Output Parameters: 1515 + dvalue - the double value to return 1516 . nmax - actual number of values retreived 1517 - flg - PETSC_TRUE if found, else PETSC_FALSE 1518 1519 Level: beginner 1520 1521 Concepts: options database^array of doubles 1522 1523 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 1524 PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsTruth(), 1525 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1526 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1527 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1528 PetscOptionsList(), PetscOptionsEList() 1529 @*/ 1530 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetRealArray(const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscTruth *flg) 1531 { 1532 char *value; 1533 PetscErrorCode ierr; 1534 PetscInt n = 0; 1535 PetscTruth flag; 1536 PetscToken token; 1537 1538 PetscFunctionBegin; 1539 PetscValidCharPointer(name,2); 1540 PetscValidDoublePointer(dvalue,3); 1541 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1542 if (!flag) {if (flg) *flg = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 1543 if (!value) {if (flg) *flg = PETSC_TRUE; *nmax = 0; PetscFunctionReturn(0);} 1544 1545 if (flg) *flg = PETSC_TRUE; 1546 1547 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 1548 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1549 while (n < *nmax) { 1550 if (!value) break; 1551 ierr = PetscOptionsAtod(value,dvalue++);CHKERRQ(ierr); 1552 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1553 n++; 1554 } 1555 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 1556 *nmax = n; 1557 PetscFunctionReturn(0); 1558 } 1559 1560 #undef __FUNCT__ 1561 #define __FUNCT__ "PetscOptionsGetIntArray" 1562 /*@C 1563 PetscOptionsGetIntArray - Gets an array of integer values for a particular 1564 option in the database. The values must be separated with commas with 1565 no intervening spaces. 1566 1567 Not Collective 1568 1569 Input Parameters: 1570 + pre - string to prepend to each name or PETSC_NULL 1571 . name - the option one is seeking 1572 - nmax - maximum number of values to retrieve, can include d-D to indicate d,d+1,..,D-1 1573 1574 Output Parameter: 1575 + dvalue - the integer values to return 1576 . nmax - actual number of values retreived 1577 - flg - PETSC_TRUE if found, else PETSC_FALSE 1578 1579 Level: beginner 1580 1581 Concepts: options database^array of ints 1582 1583 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 1584 PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1585 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1586 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1587 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1588 PetscOptionsList(), PetscOptionsEList() 1589 @*/ 1590 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetIntArray(const char pre[],const char name[],PetscInt dvalue[],PetscInt *nmax,PetscTruth *flg) 1591 { 1592 char *value; 1593 PetscErrorCode ierr; 1594 PetscInt n = 0,i,start,end; 1595 size_t len; 1596 PetscTruth flag,foundrange; 1597 PetscToken token; 1598 1599 PetscFunctionBegin; 1600 PetscValidCharPointer(name,2); 1601 PetscValidIntPointer(dvalue,3); 1602 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1603 if (!flag) {if (flg) *flg = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 1604 if (!value) {if (flg) *flg = PETSC_TRUE; *nmax = 0; PetscFunctionReturn(0);} 1605 1606 if (flg) *flg = PETSC_TRUE; 1607 1608 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 1609 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1610 while (n < *nmax) { 1611 if (!value) break; 1612 1613 /* look for form d-D where d and D are integers */ 1614 foundrange = PETSC_FALSE; 1615 ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 1616 if (value[0] == '-') i=2; 1617 else i=1; 1618 for (;i<(int)len; i++) { 1619 if (value[i] == '-') { 1620 if (i == (int)len-1) SETERRQ2(PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value); 1621 value[i] = 0; 1622 ierr = PetscOptionsAtoi(value,&start);CHKERRQ(ierr); 1623 ierr = PetscOptionsAtoi(value+i+1,&end);CHKERRQ(ierr); 1624 if (end <= start) SETERRQ3(PETSC_ERR_USER,"Error in %D-th array entry, %s-%s cannot have decreasing list",n,value,value+i+1); 1625 if (n + end - start - 1 >= *nmax) SETERRQ4(PETSC_ERR_USER,"Error in %D-th array entry, not enough space in left in array (%D) to contain entire range from %D to %D",n,*nmax-n,start,end); 1626 for (;start<end; start++) { 1627 *dvalue = start; dvalue++;n++; 1628 } 1629 foundrange = PETSC_TRUE; 1630 break; 1631 } 1632 } 1633 if (!foundrange) { 1634 ierr = PetscOptionsAtoi(value,dvalue);CHKERRQ(ierr); 1635 dvalue++; 1636 n++; 1637 } 1638 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1639 } 1640 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 1641 *nmax = n; 1642 PetscFunctionReturn(0); 1643 } 1644 1645 #undef __FUNCT__ 1646 #define __FUNCT__ "PetscOptionsGetString" 1647 /*@C 1648 PetscOptionsGetString - Gets the string value for a particular option in 1649 the database. 1650 1651 Not Collective 1652 1653 Input Parameters: 1654 + pre - string to prepend to name or PETSC_NULL 1655 . name - the option one is seeking 1656 - len - maximum string length 1657 1658 Output Parameters: 1659 + string - location to copy string 1660 - flg - PETSC_TRUE if found, else PETSC_FALSE 1661 1662 Level: beginner 1663 1664 Fortran Note: 1665 The Fortran interface is slightly different from the C/C++ 1666 interface (len is not used). Sample usage in Fortran follows 1667 .vb 1668 character *20 string 1669 integer flg, ierr 1670 call PetscOptionsGetString(PETSC_NULL_CHARACTER,'-s',string,flg,ierr) 1671 .ve 1672 1673 Concepts: options database^string 1674 1675 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1676 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1677 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1678 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1679 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1680 PetscOptionsList(), PetscOptionsEList() 1681 @*/ 1682 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetString(const char pre[],const char name[],char string[],size_t len,PetscTruth *flg) 1683 { 1684 char *value; 1685 PetscErrorCode ierr; 1686 PetscTruth flag; 1687 1688 PetscFunctionBegin; 1689 PetscValidCharPointer(name,2); 1690 PetscValidCharPointer(string,3); 1691 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1692 if (!flag) { 1693 if (flg) *flg = PETSC_FALSE; 1694 } else { 1695 if (flg) *flg = PETSC_TRUE; 1696 if (value) { 1697 ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr); 1698 } else { 1699 ierr = PetscMemzero(string,len);CHKERRQ(ierr); 1700 } 1701 } 1702 PetscFunctionReturn(0); 1703 } 1704 1705 #undef __FUNCT__ 1706 #define __FUNCT__ "PetscOptionsGetStringArray" 1707 /*@C 1708 PetscOptionsGetStringArray - Gets an array of string values for a particular 1709 option in the database. The values must be separated with commas with 1710 no intervening spaces. 1711 1712 Not Collective 1713 1714 Input Parameters: 1715 + pre - string to prepend to name or PETSC_NULL 1716 . name - the option one is seeking 1717 - nmax - maximum number of strings 1718 1719 Output Parameter: 1720 + strings - location to copy strings 1721 - flg - PETSC_TRUE if found, else PETSC_FALSE 1722 1723 Level: beginner 1724 1725 Notes: 1726 The user should pass in an array of pointers to char, to hold all the 1727 strings returned by this function. 1728 1729 The user is responsible for deallocating the strings that are 1730 returned. The Fortran interface for this routine is not supported. 1731 1732 Contributed by Matthew Knepley. 1733 1734 Concepts: options database^array of strings 1735 1736 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1737 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1738 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1739 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1740 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1741 PetscOptionsList(), PetscOptionsEList() 1742 @*/ 1743 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetStringArray(const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscTruth *flg) 1744 { 1745 char *value; 1746 PetscErrorCode ierr; 1747 PetscInt n; 1748 PetscTruth flag; 1749 PetscToken token; 1750 1751 PetscFunctionBegin; 1752 PetscValidCharPointer(name,2); 1753 PetscValidPointer(strings,3); 1754 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1755 if (!flag) {*nmax = 0; if (flg) *flg = PETSC_FALSE; PetscFunctionReturn(0);} 1756 if (!value) {*nmax = 0; if (flg) *flg = PETSC_FALSE;PetscFunctionReturn(0);} 1757 if (!*nmax) {if (flg) *flg = PETSC_FALSE;PetscFunctionReturn(0);} 1758 if (flg) *flg = PETSC_TRUE; 1759 1760 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 1761 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1762 n = 0; 1763 while (n < *nmax) { 1764 if (!value) break; 1765 ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr); 1766 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1767 n++; 1768 } 1769 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 1770 *nmax = n; 1771 PetscFunctionReturn(0); 1772 } 1773 1774 #undef __FUNCT__ 1775 #define __FUNCT__ "PetscOptionsAllUsed" 1776 /*@C 1777 PetscOptionsAllUsed - Returns a count of the number of options in the 1778 database that have never been selected. 1779 1780 Not Collective 1781 1782 Output Parameter: 1783 . N - count of options not used 1784 1785 Level: advanced 1786 1787 .seealso: PetscOptionsPrint() 1788 @*/ 1789 PetscErrorCode PETSC_DLLEXPORT PetscOptionsAllUsed(int *N) 1790 { 1791 PetscInt i,n = 0; 1792 1793 PetscFunctionBegin; 1794 for (i=0; i<options->N; i++) { 1795 if (!options->used[i]) { n++; } 1796 } 1797 *N = n; 1798 PetscFunctionReturn(0); 1799 } 1800 1801 #undef __FUNCT__ 1802 #define __FUNCT__ "PetscOptionsLeft" 1803 /*@ 1804 PetscOptionsLeft - Prints to screen any options that were set and never used. 1805 1806 Not collective 1807 1808 Options Database Key: 1809 . -options_left - Activates OptionsAllUsed() within PetscFinalize() 1810 1811 Level: advanced 1812 1813 .seealso: PetscOptionsAllUsed() 1814 @*/ 1815 PetscErrorCode PETSC_DLLEXPORT PetscOptionsLeft(void) 1816 { 1817 PetscErrorCode ierr; 1818 PetscInt i; 1819 1820 PetscFunctionBegin; 1821 for (i=0; i<options->N; i++) { 1822 if (!options->used[i]) { 1823 if (options->values[i]) { 1824 ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",options->names[i],options->values[i]);CHKERRQ(ierr); 1825 } else { 1826 ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s no value \n",options->names[i]);CHKERRQ(ierr); 1827 } 1828 } 1829 } 1830 PetscFunctionReturn(0); 1831 } 1832 1833 1834 #undef __FUNCT__ 1835 #define __FUNCT__ "PetscOptionsCreate" 1836 /* 1837 PetscOptionsCreate - Creates the empty options database. 1838 1839 */ 1840 PetscErrorCode PETSC_DLLEXPORT PetscOptionsCreate(void) 1841 { 1842 PetscErrorCode ierr; 1843 1844 PetscFunctionBegin; 1845 options = (PetscOptionsTable*)malloc(sizeof(PetscOptionsTable)); 1846 ierr = PetscMemzero(options->used,MAXOPTIONS*sizeof(PetscTruth));CHKERRQ(ierr); 1847 options->namegiven = PETSC_FALSE; 1848 options->N = 0; 1849 options->Naliases = 0; 1850 options->numbermonitors = 0; 1851 1852 PetscOptionsObject.prefix = PETSC_NULL; 1853 PetscOptionsObject.title = PETSC_NULL; 1854 1855 PetscFunctionReturn(0); 1856 } 1857 1858 #undef __FUNCT__ 1859 #define __FUNCT__ "PetscOptionsSetFromOptions" 1860 /*@ 1861 PetscOptionsSetFromOptions - Sets various SNES and KSP parameters from user options. 1862 1863 Collective on PETSC_COMM_WORLD 1864 1865 Options Database Keys: 1866 + -options_monitor <optional filename> - prints the names and values of all runtime options as they are set. The monitor functionality is not 1867 available for options set through a file, environment variable, or on 1868 the command line. Only options set after PetscInitialize completes will 1869 be monitored. 1870 . -options_monitor_cancel - cancel all options database monitors 1871 1872 Notes: 1873 To see all options, run your program with the -help option or consult 1874 the users manual. 1875 1876 Level: intermediate 1877 1878 .keywords: set, options, database 1879 @*/ 1880 PetscErrorCode PETSC_DLLEXPORT PetscOptionsSetFromOptions(void) 1881 { 1882 PetscTruth flgc,flgm; 1883 PetscErrorCode ierr; 1884 char monfilename[PETSC_MAX_PATH_LEN]; 1885 PetscViewer monviewer; 1886 1887 PetscFunctionBegin; 1888 ierr = PetscOptionsBegin(PETSC_COMM_WORLD,"","Options database options","PetscOptions");CHKERRQ(ierr); 1889 ierr = PetscOptionsString("-options_monitor","Monitor options database","PetscOptionsMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flgm);CHKERRQ(ierr); 1890 ierr = PetscOptionsName("-options_monitor_cancel","Cancel all options database monitors","PetscOptionsMonitorCancel",&flgc);CHKERRQ(ierr); 1891 ierr = PetscOptionsEnd();CHKERRQ(ierr); 1892 if (flgm) { 1893 ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,monfilename,&monviewer);CHKERRQ(ierr); 1894 ierr = PetscOptionsMonitorSet(PetscOptionsMonitorDefault,monviewer,(PetscErrorCode (*)(void*))PetscViewerDestroy);CHKERRQ(ierr); 1895 } 1896 if (flgc) { ierr = PetscOptionsMonitorCancel();CHKERRQ(ierr); } 1897 PetscFunctionReturn(0); 1898 } 1899 1900 1901 #undef __FUNCT__ 1902 #define __FUNCT__ "PetscOptionsMonitorDefault" 1903 /*@C 1904 PetscOptionsMonitorDefault - Print all options set value events. 1905 1906 Collective on PETSC_COMM_WORLD 1907 1908 Input Parameters: 1909 + name - option name string 1910 . value - option value string 1911 - dummy - unused monitor context 1912 1913 Level: intermediate 1914 1915 .keywords: PetscOptions, default, monitor 1916 1917 .seealso: PetscOptionsMonitorSet() 1918 @*/ 1919 PetscErrorCode PETSC_DLLEXPORT PetscOptionsMonitorDefault(const char name[], const char value[], void *dummy) 1920 { 1921 PetscErrorCode ierr; 1922 PetscViewer viewer = (PetscViewer) dummy; 1923 1924 PetscFunctionBegin; 1925 if (!viewer) { 1926 ierr = PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer);CHKERRQ(ierr); 1927 } 1928 ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr); 1929 PetscFunctionReturn(0); 1930 } 1931 1932 #undef __FUNCT__ 1933 #define __FUNCT__ "PetscOptionsMonitorSet" 1934 /*@C 1935 PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that 1936 modified the PETSc options database. 1937 1938 Not collective 1939 1940 Input Parameters: 1941 + monitor - pointer to function (if this is PETSC_NULL, it turns off monitoring 1942 . mctx - [optional] context for private data for the 1943 monitor routine (use PETSC_NULL if no context is desired) 1944 - monitordestroy - [optional] routine that frees monitor context 1945 (may be PETSC_NULL) 1946 1947 Calling Sequence of monitor: 1948 $ monitor (const char name[], const char value[], void *mctx) 1949 1950 + name - option name string 1951 . value - option value string 1952 - mctx - optional monitoring context, as set by PetscOptionsMonitorSet() 1953 1954 Options Database Keys: 1955 + -options_monitor - sets PetscOptionsMonitorDefault() 1956 - -options_monitor_cancel - cancels all monitors that have 1957 been hardwired into a code by 1958 calls to PetscOptionsMonitorSet(), but 1959 does not cancel those set via 1960 the options database. 1961 1962 Notes: 1963 The default is to do nothing. To print the name and value of options 1964 being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine, 1965 with a null monitoring context. 1966 1967 Several different monitoring routines may be set by calling 1968 PetscOptionsMonitorSet() multiple times; all will be called in the 1969 order in which they were set. 1970 1971 Level: beginner 1972 1973 .keywords: PetscOptions, set, monitor 1974 1975 .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorCancel() 1976 @*/ 1977 PetscErrorCode PETSC_DLLEXPORT PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void*)) 1978 { 1979 PetscFunctionBegin; 1980 if (options->numbermonitors >= MAXOPTIONSMONITORS) { 1981 SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set"); 1982 } 1983 options->monitor[options->numbermonitors] = monitor; 1984 options->monitordestroy[options->numbermonitors] = monitordestroy; 1985 options->monitorcontext[options->numbermonitors++] = (void*)mctx; 1986 PetscFunctionReturn(0); 1987 } 1988 1989 #undef __FUNCT__ 1990 #define __FUNCT__ "PetscOptionsMonitorCancel" 1991 /*@ 1992 PetscOptionsMonitorCancel - Clears all monitors for a PetscOptions object. 1993 1994 Not collective 1995 1996 Options Database Key: 1997 . -options_monitor_cancel - Cancels all monitors that have 1998 been hardwired into a code by calls to PetscOptionsMonitorSet(), 1999 but does not cancel those set via the options database. 2000 2001 Level: intermediate 2002 2003 .keywords: PetscOptions, set, monitor 2004 2005 .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorSet() 2006 @*/ 2007 PetscErrorCode PETSC_DLLEXPORT PetscOptionsMonitorCancel(void) 2008 { 2009 PetscErrorCode ierr; 2010 PetscInt i; 2011 2012 PetscFunctionBegin; 2013 for (i=0; i<options->numbermonitors; i++) { 2014 if (options->monitordestroy[i]) { 2015 ierr = (*options->monitordestroy[i])(options->monitorcontext[i]);CHKERRQ(ierr); 2016 } 2017 } 2018 options->numbermonitors = 0; 2019 PetscFunctionReturn(0); 2020 } 2021