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 "petsc.h" /*I "petsc.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; 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 **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 **list,PetscEnum *value,PetscTruth *set) 1241 { 1242 PetscErrorCode ierr; 1243 PetscInt ntext = 0; 1244 1245 PetscFunctionBegin; 1246 while (list[ntext++]) { 1247 if (ntext > 50) SETERRQ(PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 1248 } 1249 if (ntext < 3) SETERRQ(PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 1250 ntext -= 3; 1251 ierr = PetscOptionsGetEList(pre,opt,list,ntext,(PetscInt*)value,set);CHKERRQ(ierr); 1252 PetscFunctionReturn(0); 1253 } 1254 1255 #undef __FUNCT__ 1256 #define __FUNCT__ "PetscOptionsGetTruth" 1257 /*@C 1258 PetscOptionsGetTruth - Gets the Logical (true or false) value for a particular 1259 option in the database. 1260 1261 Not Collective 1262 1263 Input Parameters: 1264 + pre - the string to prepend to the name or PETSC_NULL 1265 - name - the option one is seeking 1266 1267 Output Parameter: 1268 + ivalue - the logical value to return 1269 - flg - PETSC_TRUE if found, else PETSC_FALSE 1270 1271 Level: beginner 1272 1273 Notes: 1274 TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 1275 FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 1276 1277 If the user does not supply the option (as either true or false) ivalue is NOT changed. Thus 1278 you NEED TO ALWAYS initialize the ivalue. 1279 1280 Concepts: options database^has logical 1281 1282 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 1283 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsTruth(), 1284 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1285 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1286 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1287 PetscOptionsList(), PetscOptionsEList() 1288 @*/ 1289 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetTruth(const char pre[],const char name[],PetscTruth *ivalue,PetscTruth *flg) 1290 { 1291 char *value; 1292 PetscTruth flag; 1293 PetscErrorCode ierr; 1294 1295 PetscFunctionBegin; 1296 PetscValidCharPointer(name,2); 1297 PetscValidIntPointer(ivalue,3); 1298 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1299 if (flag) { 1300 if (flg) *flg = PETSC_TRUE; 1301 if (!value) { 1302 *ivalue = PETSC_TRUE; 1303 } else { 1304 ierr = PetscOptionsAtol(value, ivalue);CHKERRQ(ierr); 1305 } 1306 } else { 1307 if (flg) *flg = PETSC_FALSE; 1308 } 1309 PetscFunctionReturn(0); 1310 } 1311 1312 #undef __FUNCT__ 1313 #define __FUNCT__ "PetscOptionsGetTruthArray" 1314 /*@C 1315 PetscOptionsGetTruthArray - Gets an array of Logical (true or false) values for a particular 1316 option in the database. The values must be separated with commas with 1317 no intervening spaces. 1318 1319 Not Collective 1320 1321 Input Parameters: 1322 + pre - string to prepend to each name or PETSC_NULL 1323 . name - the option one is seeking 1324 - nmax - maximum number of values to retrieve 1325 1326 Output Parameter: 1327 + dvalue - the integer values to return 1328 . nmax - actual number of values retreived 1329 - flg - PETSC_TRUE if found, else PETSC_FALSE 1330 1331 Level: beginner 1332 1333 Concepts: options database^array of ints 1334 1335 Notes: 1336 TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE 1337 FALSE, false, NO, no, and 0 all translate to PETSC_FALSE 1338 1339 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 1340 PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1341 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1342 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1343 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1344 PetscOptionsList(), PetscOptionsEList() 1345 @*/ 1346 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetTruthArray(const char pre[],const char name[],PetscTruth dvalue[],PetscInt *nmax,PetscTruth *flg) 1347 { 1348 char *value; 1349 PetscErrorCode ierr; 1350 PetscInt n = 0; 1351 PetscTruth flag; 1352 PetscToken token; 1353 1354 PetscFunctionBegin; 1355 PetscValidCharPointer(name,2); 1356 PetscValidIntPointer(dvalue,3); 1357 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1358 if (!flag) {if (flg) *flg = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 1359 if (!value) {if (flg) *flg = PETSC_TRUE; *nmax = 0; PetscFunctionReturn(0);} 1360 1361 if (flg) *flg = PETSC_TRUE; 1362 1363 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 1364 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1365 while (n < *nmax) { 1366 if (!value) break; 1367 ierr = PetscOptionsAtol(value,dvalue);CHKERRQ(ierr); 1368 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1369 dvalue++; 1370 n++; 1371 } 1372 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 1373 *nmax = n; 1374 PetscFunctionReturn(0); 1375 } 1376 1377 #undef __FUNCT__ 1378 #define __FUNCT__ "PetscOptionsGetReal" 1379 /*@C 1380 PetscOptionsGetReal - Gets the double precision value for a particular 1381 option in the database. 1382 1383 Not Collective 1384 1385 Input Parameters: 1386 + pre - string to prepend to each name or PETSC_NULL 1387 - name - the option one is seeking 1388 1389 Output Parameter: 1390 + dvalue - the double value to return 1391 - flg - PETSC_TRUE if found, PETSC_FALSE if not found 1392 1393 Level: beginner 1394 1395 Concepts: options database^has double 1396 1397 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 1398 PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsTruth(), 1399 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1400 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1401 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1402 PetscOptionsList(), PetscOptionsEList() 1403 @*/ 1404 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetReal(const char pre[],const char name[],PetscReal *dvalue,PetscTruth *flg) 1405 { 1406 char *value; 1407 PetscErrorCode ierr; 1408 PetscTruth flag; 1409 1410 PetscFunctionBegin; 1411 PetscValidCharPointer(name,2); 1412 PetscValidDoublePointer(dvalue,3); 1413 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1414 if (flag) { 1415 if (!value) {if (flg) *flg = PETSC_FALSE;} 1416 else {if (flg) *flg = PETSC_TRUE; ierr = PetscOptionsAtod(value,dvalue);CHKERRQ(ierr);} 1417 } else { 1418 if (flg) *flg = PETSC_FALSE; 1419 } 1420 PetscFunctionReturn(0); 1421 } 1422 1423 #undef __FUNCT__ 1424 #define __FUNCT__ "PetscOptionsGetScalar" 1425 /*@C 1426 PetscOptionsGetScalar - Gets the scalar value for a particular 1427 option in the database. 1428 1429 Not Collective 1430 1431 Input Parameters: 1432 + pre - string to prepend to each name or PETSC_NULL 1433 - name - the option one is seeking 1434 1435 Output Parameter: 1436 + dvalue - the double value to return 1437 - flg - PETSC_TRUE if found, else PETSC_FALSE 1438 1439 Level: beginner 1440 1441 Usage: 1442 A complex number 2+3i can be specified as 2,3 at the command line. 1443 or a number 2.0e-10 - 3.3e-20 i can be specified as 2.0e-10,3.3e-20 1444 1445 Concepts: options database^has scalar 1446 1447 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 1448 PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1449 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1450 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1451 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1452 PetscOptionsList(), PetscOptionsEList() 1453 @*/ 1454 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetScalar(const char pre[],const char name[],PetscScalar *dvalue,PetscTruth *flg) 1455 { 1456 char *value; 1457 PetscTruth flag; 1458 PetscErrorCode ierr; 1459 1460 PetscFunctionBegin; 1461 PetscValidCharPointer(name,2); 1462 PetscValidScalarPointer(dvalue,3); 1463 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1464 if (flag) { 1465 if (!value) { 1466 if (flg) *flg = PETSC_FALSE; 1467 } else { 1468 #if !defined(PETSC_USE_COMPLEX) 1469 ierr = PetscOptionsAtod(value,dvalue);CHKERRQ(ierr); 1470 #else 1471 PetscReal re=0.0,im=0.0; 1472 PetscToken token; 1473 char *tvalue = 0; 1474 1475 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 1476 ierr = PetscTokenFind(token,&tvalue);CHKERRQ(ierr); 1477 if (!tvalue) { SETERRQ(PETSC_ERR_ARG_WRONG,"unknown string specified\n"); } 1478 ierr = PetscOptionsAtod(tvalue,&re);CHKERRQ(ierr); 1479 ierr = PetscTokenFind(token,&tvalue);CHKERRQ(ierr); 1480 if (!tvalue) { /* Unknown separator used. using only real value */ 1481 *dvalue = re; 1482 } else { 1483 ierr = PetscOptionsAtod(tvalue,&im);CHKERRQ(ierr); 1484 *dvalue = re + PETSC_i*im; 1485 } 1486 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 1487 #endif 1488 if (flg) *flg = PETSC_TRUE; 1489 } 1490 } else { /* flag */ 1491 if (flg) *flg = PETSC_FALSE; 1492 } 1493 PetscFunctionReturn(0); 1494 } 1495 1496 #undef __FUNCT__ 1497 #define __FUNCT__ "PetscOptionsGetRealArray" 1498 /*@C 1499 PetscOptionsGetRealArray - Gets an array of double precision values for a 1500 particular option in the database. The values must be separated with 1501 commas with no intervening spaces. 1502 1503 Not Collective 1504 1505 Input Parameters: 1506 + pre - string to prepend to each name or PETSC_NULL 1507 . name - the option one is seeking 1508 - nmax - maximum number of values to retrieve 1509 1510 Output Parameters: 1511 + dvalue - the double value to return 1512 . nmax - actual number of values retreived 1513 - flg - PETSC_TRUE if found, else PETSC_FALSE 1514 1515 Level: beginner 1516 1517 Concepts: options database^array of doubles 1518 1519 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 1520 PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsTruth(), 1521 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1522 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1523 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1524 PetscOptionsList(), PetscOptionsEList() 1525 @*/ 1526 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetRealArray(const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscTruth *flg) 1527 { 1528 char *value; 1529 PetscErrorCode ierr; 1530 PetscInt n = 0; 1531 PetscTruth flag; 1532 PetscToken token; 1533 1534 PetscFunctionBegin; 1535 PetscValidCharPointer(name,2); 1536 PetscValidDoublePointer(dvalue,3); 1537 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1538 if (!flag) {if (flg) *flg = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 1539 if (!value) {if (flg) *flg = PETSC_TRUE; *nmax = 0; PetscFunctionReturn(0);} 1540 1541 if (flg) *flg = PETSC_TRUE; 1542 1543 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 1544 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1545 while (n < *nmax) { 1546 if (!value) break; 1547 ierr = PetscOptionsAtod(value,dvalue++);CHKERRQ(ierr); 1548 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1549 n++; 1550 } 1551 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 1552 *nmax = n; 1553 PetscFunctionReturn(0); 1554 } 1555 1556 #undef __FUNCT__ 1557 #define __FUNCT__ "PetscOptionsGetIntArray" 1558 /*@C 1559 PetscOptionsGetIntArray - Gets an array of integer values for a particular 1560 option in the database. The values must be separated with commas with 1561 no intervening spaces. 1562 1563 Not Collective 1564 1565 Input Parameters: 1566 + pre - string to prepend to each name or PETSC_NULL 1567 . name - the option one is seeking 1568 - nmax - maximum number of values to retrieve, can include d-D to indicate d,d+1,..,D-1 1569 1570 Output Parameter: 1571 + dvalue - the integer values to return 1572 . nmax - actual number of values retreived 1573 - flg - PETSC_TRUE if found, else PETSC_FALSE 1574 1575 Level: beginner 1576 1577 Concepts: options database^array of ints 1578 1579 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(), 1580 PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1581 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1582 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1583 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1584 PetscOptionsList(), PetscOptionsEList() 1585 @*/ 1586 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetIntArray(const char pre[],const char name[],PetscInt dvalue[],PetscInt *nmax,PetscTruth *flg) 1587 { 1588 char *value; 1589 PetscErrorCode ierr; 1590 PetscInt n = 0,i,start,end; 1591 size_t len; 1592 PetscTruth flag,foundrange; 1593 PetscToken token; 1594 1595 PetscFunctionBegin; 1596 PetscValidCharPointer(name,2); 1597 PetscValidIntPointer(dvalue,3); 1598 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1599 if (!flag) {if (flg) *flg = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);} 1600 if (!value) {if (flg) *flg = PETSC_TRUE; *nmax = 0; PetscFunctionReturn(0);} 1601 1602 if (flg) *flg = PETSC_TRUE; 1603 1604 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 1605 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1606 while (n < *nmax) { 1607 if (!value) break; 1608 1609 /* look for form d-D where d and D are integers */ 1610 foundrange = PETSC_FALSE; 1611 ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 1612 if (value[0] == '-') i=2; 1613 else i=1; 1614 for (;i<(int)len; i++) { 1615 if (value[i] == '-') { 1616 if (i == (int)len-1) SETERRQ2(PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value); 1617 value[i] = 0; 1618 ierr = PetscOptionsAtoi(value,&start);CHKERRQ(ierr); 1619 ierr = PetscOptionsAtoi(value+i+1,&end);CHKERRQ(ierr); 1620 if (end <= start) SETERRQ3(PETSC_ERR_USER,"Error in %D-th array entry, %s-%s cannot have decreasing list",n,value,value+i+1); 1621 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); 1622 for (;start<end; start++) { 1623 *dvalue = start; dvalue++;n++; 1624 } 1625 foundrange = PETSC_TRUE; 1626 break; 1627 } 1628 } 1629 if (!foundrange) { 1630 ierr = PetscOptionsAtoi(value,dvalue);CHKERRQ(ierr); 1631 dvalue++; 1632 n++; 1633 } 1634 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1635 } 1636 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 1637 *nmax = n; 1638 PetscFunctionReturn(0); 1639 } 1640 1641 #undef __FUNCT__ 1642 #define __FUNCT__ "PetscOptionsGetString" 1643 /*@C 1644 PetscOptionsGetString - Gets the string value for a particular option in 1645 the database. 1646 1647 Not Collective 1648 1649 Input Parameters: 1650 + pre - string to prepend to name or PETSC_NULL 1651 . name - the option one is seeking 1652 - len - maximum string length 1653 1654 Output Parameters: 1655 + string - location to copy string 1656 - flg - PETSC_TRUE if found, else PETSC_FALSE 1657 1658 Level: beginner 1659 1660 Fortran Note: 1661 The Fortran interface is slightly different from the C/C++ 1662 interface (len is not used). Sample usage in Fortran follows 1663 .vb 1664 character *20 string 1665 integer flg, ierr 1666 call PetscOptionsGetString(PETSC_NULL_CHARACTER,'-s',string,flg,ierr) 1667 .ve 1668 1669 Concepts: options database^string 1670 1671 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1672 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1673 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1674 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1675 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1676 PetscOptionsList(), PetscOptionsEList() 1677 @*/ 1678 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetString(const char pre[],const char name[],char string[],size_t len,PetscTruth *flg) 1679 { 1680 char *value; 1681 PetscErrorCode ierr; 1682 PetscTruth flag; 1683 1684 PetscFunctionBegin; 1685 PetscValidCharPointer(name,2); 1686 PetscValidCharPointer(string,3); 1687 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1688 if (!flag) { 1689 if (flg) *flg = PETSC_FALSE; 1690 } else { 1691 if (flg) *flg = PETSC_TRUE; 1692 if (value) { 1693 ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr); 1694 } else { 1695 ierr = PetscMemzero(string,len);CHKERRQ(ierr); 1696 } 1697 } 1698 PetscFunctionReturn(0); 1699 } 1700 1701 #undef __FUNCT__ 1702 #define __FUNCT__ "PetscOptionsGetStringArray" 1703 /*@C 1704 PetscOptionsGetStringArray - Gets an array of string values for a particular 1705 option in the database. The values must be separated with commas with 1706 no intervening spaces. 1707 1708 Not Collective 1709 1710 Input Parameters: 1711 + pre - string to prepend to name or PETSC_NULL 1712 . name - the option one is seeking 1713 - nmax - maximum number of strings 1714 1715 Output Parameter: 1716 + strings - location to copy strings 1717 - flg - PETSC_TRUE if found, else PETSC_FALSE 1718 1719 Level: beginner 1720 1721 Notes: 1722 The user should pass in an array of pointers to char, to hold all the 1723 strings returned by this function. 1724 1725 The user is responsible for deallocating the strings that are 1726 returned. The Fortran interface for this routine is not supported. 1727 1728 Contributed by Matthew Knepley. 1729 1730 Concepts: options database^array of strings 1731 1732 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1733 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(), 1734 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1735 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1736 PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(), 1737 PetscOptionsList(), PetscOptionsEList() 1738 @*/ 1739 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetStringArray(const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscTruth *flg) 1740 { 1741 char *value; 1742 PetscErrorCode ierr; 1743 PetscInt n; 1744 PetscTruth flag; 1745 PetscToken token; 1746 1747 PetscFunctionBegin; 1748 PetscValidCharPointer(name,2); 1749 PetscValidPointer(strings,3); 1750 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 1751 if (!flag) {*nmax = 0; if (flg) *flg = PETSC_FALSE; PetscFunctionReturn(0);} 1752 if (!value) {*nmax = 0; if (flg) *flg = PETSC_FALSE;PetscFunctionReturn(0);} 1753 if (!*nmax) {if (flg) *flg = PETSC_FALSE;PetscFunctionReturn(0);} 1754 if (flg) *flg = PETSC_TRUE; 1755 1756 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 1757 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1758 n = 0; 1759 while (n < *nmax) { 1760 if (!value) break; 1761 ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr); 1762 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 1763 n++; 1764 } 1765 ierr = PetscTokenDestroy(token);CHKERRQ(ierr); 1766 *nmax = n; 1767 PetscFunctionReturn(0); 1768 } 1769 1770 #undef __FUNCT__ 1771 #define __FUNCT__ "PetscOptionsAllUsed" 1772 /*@C 1773 PetscOptionsAllUsed - Returns a count of the number of options in the 1774 database that have never been selected. 1775 1776 Not Collective 1777 1778 Output Parameter: 1779 . N - count of options not used 1780 1781 Level: advanced 1782 1783 .seealso: PetscOptionsPrint() 1784 @*/ 1785 PetscErrorCode PETSC_DLLEXPORT PetscOptionsAllUsed(int *N) 1786 { 1787 PetscInt i,n = 0; 1788 1789 PetscFunctionBegin; 1790 for (i=0; i<options->N; i++) { 1791 if (!options->used[i]) { n++; } 1792 } 1793 *N = n; 1794 PetscFunctionReturn(0); 1795 } 1796 1797 #undef __FUNCT__ 1798 #define __FUNCT__ "PetscOptionsLeft" 1799 /*@ 1800 PetscOptionsLeft - Prints to screen any options that were set and never used. 1801 1802 Not collective 1803 1804 Options Database Key: 1805 . -options_left - Activates OptionsAllUsed() within PetscFinalize() 1806 1807 Level: advanced 1808 1809 .seealso: PetscOptionsAllUsed() 1810 @*/ 1811 PetscErrorCode PETSC_DLLEXPORT PetscOptionsLeft(void) 1812 { 1813 PetscErrorCode ierr; 1814 PetscInt i; 1815 1816 PetscFunctionBegin; 1817 for (i=0; i<options->N; i++) { 1818 if (!options->used[i]) { 1819 if (options->values[i]) { 1820 ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",options->names[i],options->values[i]);CHKERRQ(ierr); 1821 } else { 1822 ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s no value \n",options->names[i]);CHKERRQ(ierr); 1823 } 1824 } 1825 } 1826 PetscFunctionReturn(0); 1827 } 1828 1829 1830 #undef __FUNCT__ 1831 #define __FUNCT__ "PetscOptionsCreate" 1832 /* 1833 PetscOptionsCreate - Creates the empty options database. 1834 1835 */ 1836 PetscErrorCode PETSC_DLLEXPORT PetscOptionsCreate(void) 1837 { 1838 PetscErrorCode ierr; 1839 1840 PetscFunctionBegin; 1841 options = (PetscOptionsTable*)malloc(sizeof(PetscOptionsTable)); 1842 ierr = PetscMemzero(options->used,MAXOPTIONS*sizeof(PetscTruth));CHKERRQ(ierr); 1843 options->namegiven = PETSC_FALSE; 1844 options->N = 0; 1845 options->Naliases = 0; 1846 options->numbermonitors = 0; 1847 1848 PetscOptionsObject.prefix = PETSC_NULL; 1849 PetscOptionsObject.title = PETSC_NULL; 1850 1851 PetscFunctionReturn(0); 1852 } 1853 1854 #undef __FUNCT__ 1855 #define __FUNCT__ "PetscOptionsSetFromOptions" 1856 /*@ 1857 PetscOptionsSetFromOptions - Sets various SNES and KSP parameters from user options. 1858 1859 Collective on PETSC_COMM_WORLD 1860 1861 Options Database Keys: 1862 + -options_monitor <optional filename> - prints the names and values of all runtime options as they are set. The monitor functionality is not 1863 available for options set through a file, environment variable, or on 1864 the command line. Only options set after PetscInitialize completes will 1865 be monitored. 1866 . -options_monitor_cancel - cancel all options database monitors 1867 1868 Notes: 1869 To see all options, run your program with the -help option or consult 1870 the users manual. 1871 1872 Level: intermediate 1873 1874 .keywords: set, options, database 1875 @*/ 1876 PetscErrorCode PETSC_DLLEXPORT PetscOptionsSetFromOptions(void) 1877 { 1878 PetscTruth flgc,flgm; 1879 PetscErrorCode ierr; 1880 char monfilename[PETSC_MAX_PATH_LEN]; 1881 PetscViewer monviewer; 1882 1883 PetscFunctionBegin; 1884 ierr = PetscOptionsBegin(PETSC_COMM_WORLD,"","Options database options","PetscOptions");CHKERRQ(ierr); 1885 ierr = PetscOptionsString("-options_monitor","Monitor options database","PetscOptionsMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flgm);CHKERRQ(ierr); 1886 ierr = PetscOptionsName("-options_monitor_cancel","Cancel all options database monitors","PetscOptionsMonitorCancel",&flgc);CHKERRQ(ierr); 1887 ierr = PetscOptionsEnd();CHKERRQ(ierr); 1888 if (flgm) { 1889 ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,monfilename,&monviewer);CHKERRQ(ierr); 1890 ierr = PetscOptionsMonitorSet(PetscOptionsMonitorDefault,monviewer,(PetscErrorCode (*)(void*))PetscViewerDestroy);CHKERRQ(ierr); 1891 } 1892 if (flgc) { ierr = PetscOptionsMonitorCancel();CHKERRQ(ierr); } 1893 PetscFunctionReturn(0); 1894 } 1895 1896 1897 #undef __FUNCT__ 1898 #define __FUNCT__ "PetscOptionsMonitorDefault" 1899 /*@C 1900 PetscOptionsMonitorDefault - Print all options set value events. 1901 1902 Collective on PETSC_COMM_WORLD 1903 1904 Input Parameters: 1905 + name - option name string 1906 . value - option value string 1907 - dummy - unused monitor context 1908 1909 Level: intermediate 1910 1911 .keywords: PetscOptions, default, monitor 1912 1913 .seealso: PetscOptionsMonitorSet() 1914 @*/ 1915 PetscErrorCode PETSC_DLLEXPORT PetscOptionsMonitorDefault(const char name[], const char value[], void *dummy) 1916 { 1917 PetscErrorCode ierr; 1918 PetscViewer viewer = (PetscViewer) dummy; 1919 1920 PetscFunctionBegin; 1921 if (!viewer) { 1922 ierr = PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer);CHKERRQ(ierr); 1923 } 1924 ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr); 1925 PetscFunctionReturn(0); 1926 } 1927 1928 #undef __FUNCT__ 1929 #define __FUNCT__ "PetscOptionsMonitorSet" 1930 /*@C 1931 PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that 1932 modified the PETSc options database. 1933 1934 Not collective 1935 1936 Input Parameters: 1937 + monitor - pointer to function (if this is PETSC_NULL, it turns off monitoring 1938 . mctx - [optional] context for private data for the 1939 monitor routine (use PETSC_NULL if no context is desired) 1940 - monitordestroy - [optional] routine that frees monitor context 1941 (may be PETSC_NULL) 1942 1943 Calling Sequence of monitor: 1944 $ monitor (const char name[], const char value[], void *mctx) 1945 1946 + name - option name string 1947 . value - option value string 1948 - mctx - optional monitoring context, as set by PetscOptionsMonitorSet() 1949 1950 Options Database Keys: 1951 + -options_monitor - sets PetscOptionsMonitorDefault() 1952 - -options_monitor_cancel - cancels all monitors that have 1953 been hardwired into a code by 1954 calls to PetscOptionsMonitorSet(), but 1955 does not cancel those set via 1956 the options database. 1957 1958 Notes: 1959 The default is to do nothing. To print the name and value of options 1960 being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine, 1961 with a null monitoring context. 1962 1963 Several different monitoring routines may be set by calling 1964 PetscOptionsMonitorSet() multiple times; all will be called in the 1965 order in which they were set. 1966 1967 Level: beginner 1968 1969 .keywords: PetscOptions, set, monitor 1970 1971 .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorCancel() 1972 @*/ 1973 PetscErrorCode PETSC_DLLEXPORT PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void*)) 1974 { 1975 PetscFunctionBegin; 1976 if (options->numbermonitors >= MAXOPTIONSMONITORS) { 1977 SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set"); 1978 } 1979 options->monitor[options->numbermonitors] = monitor; 1980 options->monitordestroy[options->numbermonitors] = monitordestroy; 1981 options->monitorcontext[options->numbermonitors++] = (void*)mctx; 1982 PetscFunctionReturn(0); 1983 } 1984 1985 #undef __FUNCT__ 1986 #define __FUNCT__ "PetscOptionsMonitorCancel" 1987 /*@ 1988 PetscOptionsMonitorCancel - Clears all monitors for a PetscOptions object. 1989 1990 Not collective 1991 1992 Options Database Key: 1993 . -options_monitor_cancel - Cancels all monitors that have 1994 been hardwired into a code by calls to PetscOptionsMonitorSet(), 1995 but does not cancel those set via the options database. 1996 1997 Level: intermediate 1998 1999 .keywords: PetscOptions, set, monitor 2000 2001 .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorSet() 2002 @*/ 2003 PetscErrorCode PETSC_DLLEXPORT PetscOptionsMonitorCancel(void) 2004 { 2005 PetscErrorCode ierr; 2006 PetscInt i; 2007 2008 PetscFunctionBegin; 2009 for (i=0; i<options->numbermonitors; i++) { 2010 if (options->monitordestroy[i]) { 2011 ierr = (*options->monitordestroy[i])(options->monitorcontext[i]);CHKERRQ(ierr); 2012 } 2013 } 2014 options->numbermonitors = 0; 2015 PetscFunctionReturn(0); 2016 } 2017