1 2 /* 3 Implements the higher-level options database querying methods. These are self-documenting and can attach at runtime to 4 GUI code to display the options and get values from the users. 5 6 */ 7 8 #include <petsc-private/petscimpl.h> /*I "petscsys.h" I*/ 9 #include <petscviewer.h> 10 11 #define ManSection(str) ((str) ? (str) : "None") 12 13 /* 14 Keep a linked list of options that have been posted and we are waiting for 15 user selection. See the manual page for PetscOptionsBegin() 16 17 Eventually we'll attach this beast to a MPI_Comm 18 */ 19 PetscOptionsObjectType PetscOptionsObject; 20 PetscInt PetscOptionsPublishCount = 0; 21 22 #undef __FUNCT__ 23 #define __FUNCT__ "PetscOptionsBegin_Private" 24 /* 25 Handles setting up the data structure in a call to PetscOptionsBegin() 26 */ 27 PetscErrorCode PetscOptionsBegin_Private(MPI_Comm comm,const char prefix[],const char title[],const char mansec[]) 28 { 29 PetscErrorCode ierr; 30 31 PetscFunctionBegin; 32 PetscOptionsObject.next = 0; 33 PetscOptionsObject.comm = comm; 34 PetscOptionsObject.changedmethod = PETSC_FALSE; 35 36 ierr = PetscFree(PetscOptionsObject.prefix);CHKERRQ(ierr); 37 ierr = PetscStrallocpy(prefix,&PetscOptionsObject.prefix);CHKERRQ(ierr); 38 ierr = PetscFree(PetscOptionsObject.title);CHKERRQ(ierr); 39 ierr = PetscStrallocpy(title,&PetscOptionsObject.title);CHKERRQ(ierr); 40 41 ierr = PetscOptionsHasName(NULL,"-help",&PetscOptionsObject.printhelp);CHKERRQ(ierr); 42 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1) { 43 if (!PetscOptionsObject.alreadyprinted) { 44 ierr = (*PetscHelpPrintf)(comm,"%s -------------------------------------------------\n",title);CHKERRQ(ierr); 45 } 46 } 47 PetscFunctionReturn(0); 48 } 49 50 #undef __FUNCT__ 51 #define __FUNCT__ "PetscObjectOptionsBegin_Private" 52 /* 53 Handles setting up the data structure in a call to PetscObjectOptionsBegin() 54 */ 55 PetscErrorCode PetscObjectOptionsBegin_Private(PetscObject obj) 56 { 57 PetscErrorCode ierr; 58 char title[256]; 59 PetscBool flg; 60 61 PetscFunctionBegin; 62 PetscValidHeader(obj,1); 63 PetscOptionsObject.object = obj; 64 PetscOptionsObject.alreadyprinted = obj->optionsprinted; 65 66 ierr = PetscStrcmp(obj->description,obj->class_name,&flg);CHKERRQ(ierr); 67 if (flg) { 68 ierr = PetscSNPrintf(title,sizeof(title),"%s options",obj->class_name);CHKERRQ(ierr); 69 } else { 70 ierr = PetscSNPrintf(title,sizeof(title),"%s (%s) options",obj->description,obj->class_name);CHKERRQ(ierr); 71 } 72 ierr = PetscOptionsBegin_Private(obj->comm,obj->prefix,title,obj->mansec);CHKERRQ(ierr); 73 PetscFunctionReturn(0); 74 } 75 76 /* 77 Handles adding another option to the list of options within this particular PetscOptionsBegin() PetscOptionsEnd() 78 */ 79 #undef __FUNCT__ 80 #define __FUNCT__ "PetscOptionsCreate_Private" 81 static int PetscOptionsCreate_Private(const char opt[],const char text[],const char man[],PetscOptionType t,PetscOptions *amsopt) 82 { 83 int ierr; 84 PetscOptions next; 85 PetscBool valid; 86 87 PetscFunctionBegin; 88 ierr = PetscOptionsValidKey(opt,&valid);CHKERRQ(ierr); 89 if (!valid) SETERRQ1(PETSC_COMM_WORLD,PETSC_ERR_ARG_INCOMP,"The option '%s' is not a valid key",opt); 90 91 ierr = PetscNew(amsopt);CHKERRQ(ierr); 92 (*amsopt)->next = 0; 93 (*amsopt)->set = PETSC_FALSE; 94 (*amsopt)->type = t; 95 (*amsopt)->data = 0; 96 97 ierr = PetscStrallocpy(text,&(*amsopt)->text);CHKERRQ(ierr); 98 ierr = PetscStrallocpy(opt,&(*amsopt)->option);CHKERRQ(ierr); 99 ierr = PetscStrallocpy(man,&(*amsopt)->man);CHKERRQ(ierr); 100 101 if (!PetscOptionsObject.next) PetscOptionsObject.next = *amsopt; 102 else { 103 next = PetscOptionsObject.next; 104 while (next->next) next = next->next; 105 next->next = *amsopt; 106 } 107 PetscFunctionReturn(0); 108 } 109 110 #undef __FUNCT__ 111 #define __FUNCT__ "PetscScanString" 112 /* 113 PetscScanString - Gets user input via stdin from process and broadcasts to all processes 114 115 Collective on MPI_Comm 116 117 Input Parameters: 118 + commm - communicator for the broadcast, must be PETSC_COMM_WORLD 119 . n - length of the string, must be the same on all processes 120 - str - location to store input 121 122 Bugs: 123 . Assumes process 0 of the given communicator has access to stdin 124 125 */ 126 static PetscErrorCode PetscScanString(MPI_Comm comm,size_t n,char str[]) 127 { 128 size_t i; 129 char c; 130 PetscMPIInt rank,nm; 131 PetscErrorCode ierr; 132 133 PetscFunctionBegin; 134 ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 135 if (!rank) { 136 c = (char) getchar(); 137 i = 0; 138 while (c != '\n' && i < n-1) { 139 str[i++] = c; 140 c = (char)getchar(); 141 } 142 str[i] = 0; 143 } 144 ierr = PetscMPIIntCast(n,&nm);CHKERRQ(ierr); 145 ierr = MPI_Bcast(str,nm,MPI_CHAR,0,comm);CHKERRQ(ierr); 146 PetscFunctionReturn(0); 147 } 148 149 #undef __FUNCT__ 150 #define __FUNCT__ "PetscStrdup" 151 /* 152 This is needed because certain strings may be freed by SAWs, hence we cannot use PetscStrallocpy() 153 */ 154 static PetscErrorCode PetscStrdup(const char s[],char *t[]) 155 { 156 PetscErrorCode ierr; 157 size_t len; 158 char *tmp = 0; 159 160 PetscFunctionBegin; 161 if (s) { 162 ierr = PetscStrlen(s,&len);CHKERRQ(ierr); 163 tmp = (char*) malloc((len+1)*sizeof(char*)); 164 if (!tmp) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"No memory to duplicate string"); 165 ierr = PetscStrcpy(tmp,s);CHKERRQ(ierr); 166 } 167 *t = tmp; 168 PetscFunctionReturn(0); 169 } 170 171 172 #undef __FUNCT__ 173 #define __FUNCT__ "PetscOptionsGetFromTextInput" 174 /* 175 PetscOptionsGetFromTextInput - Presents all the PETSc Options processed by the program so the user may change them at runtime 176 177 Notes: this isn't really practical, it is just to demonstrate the principle 178 179 A carriage return indicates no change from the default; but this like -ksp_monitor <stdout> the default is actually not stdout the default 180 is to do nothing so to get it to use stdout you need to type stdout. This is kind of bug? 181 182 Bugs: 183 + All processes must traverse through the exact same set of option queries due to the call to PetscScanString() 184 . Internal strings have arbitrary length and string copies are not checked that they fit into string space 185 - Only works for PetscInt == int, PetscReal == double etc 186 187 Developer Notes: Normally the GUI that presents the options the user and retrieves the values would be running in a different 188 address space and communicating with the PETSc program 189 190 */ 191 PetscErrorCode PetscOptionsGetFromTextInput() 192 { 193 PetscErrorCode ierr; 194 PetscOptions next = PetscOptionsObject.next; 195 char str[512]; 196 PetscBool bid; 197 PetscReal ir,*valr; 198 PetscInt *vald; 199 size_t i; 200 201 ierr = (*PetscPrintf)(PETSC_COMM_WORLD,"%s -------------------------------------------------\n",PetscOptionsObject.title);CHKERRQ(ierr); 202 while (next) { 203 switch (next->type) { 204 case OPTION_HEAD: 205 break; 206 case OPTION_INT_ARRAY: 207 ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",next->option+1);CHKERRQ(ierr); 208 vald = (PetscInt*) next->data; 209 for (i=0; i<next->arraylength; i++) { 210 ierr = PetscPrintf(PETSC_COMM_WORLD,"%d",vald[i]);CHKERRQ(ierr); 211 if (i < next->arraylength-1) { 212 ierr = PetscPrintf(PETSC_COMM_WORLD,",");CHKERRQ(ierr); 213 } 214 } 215 ierr = PetscPrintf(PETSC_COMM_WORLD,">: %s (%s) ",next->text,next->man);CHKERRQ(ierr); 216 ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr); 217 if (str[0]) { 218 PetscToken token; 219 PetscInt n=0,nmax = next->arraylength,*dvalue = (PetscInt*)next->data,start,end; 220 size_t len; 221 char *value; 222 PetscBool foundrange; 223 224 next->set = PETSC_TRUE; 225 value = str; 226 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 227 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 228 while (n < nmax) { 229 if (!value) break; 230 231 /* look for form d-D where d and D are integers */ 232 foundrange = PETSC_FALSE; 233 ierr = PetscStrlen(value,&len);CHKERRQ(ierr); 234 if (value[0] == '-') i=2; 235 else i=1; 236 for (;i<len; i++) { 237 if (value[i] == '-') { 238 if (i == len-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value); 239 value[i] = 0; 240 ierr = PetscOptionsStringToInt(value,&start);CHKERRQ(ierr); 241 ierr = PetscOptionsStringToInt(value+i+1,&end);CHKERRQ(ierr); 242 if (end <= start) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry, %s-%s cannot have decreasing list",n,value,value+i+1); 243 if (n + end - start - 1 >= nmax) SETERRQ4(PETSC_COMM_SELF,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); 244 for (; start<end; start++) { 245 *dvalue = start; dvalue++;n++; 246 } 247 foundrange = PETSC_TRUE; 248 break; 249 } 250 } 251 if (!foundrange) { 252 ierr = PetscOptionsStringToInt(value,dvalue);CHKERRQ(ierr); 253 dvalue++; 254 n++; 255 } 256 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 257 } 258 ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 259 } 260 break; 261 case OPTION_REAL_ARRAY: 262 ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",next->option+1);CHKERRQ(ierr); 263 valr = (PetscReal*) next->data; 264 for (i=0; i<next->arraylength; i++) { 265 ierr = PetscPrintf(PETSC_COMM_WORLD,"%g",valr[i]);CHKERRQ(ierr); 266 if (i < next->arraylength-1) { 267 ierr = PetscPrintf(PETSC_COMM_WORLD,",");CHKERRQ(ierr); 268 } 269 } 270 ierr = PetscPrintf(PETSC_COMM_WORLD,">: %s (%s) ",next->text,next->man);CHKERRQ(ierr); 271 ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr); 272 if (str[0]) { 273 PetscToken token; 274 PetscInt n = 0,nmax = next->arraylength; 275 PetscReal *dvalue = (PetscReal*)next->data; 276 char *value; 277 278 next->set = PETSC_TRUE; 279 value = str; 280 ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr); 281 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 282 while (n < nmax) { 283 if (!value) break; 284 ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr); 285 dvalue++; 286 n++; 287 ierr = PetscTokenFind(token,&value);CHKERRQ(ierr); 288 } 289 ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); 290 } 291 break; 292 case OPTION_INT: 293 ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <%d>: %s (%s) ",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",next->option+1,*(int*)next->data,next->text,next->man);CHKERRQ(ierr); 294 ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr); 295 if (str[0]) { 296 #if defined(PETSC_SIZEOF_LONG_LONG) 297 long long lid; 298 sscanf(str,"%lld",&lid); 299 if (lid > PETSC_MAX_INT || lid < PETSC_MIN_INT) SETERRQ3(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Argument: -%s%s %lld",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",next->option+1,lid); 300 #else 301 long lid; 302 sscanf(str,"%ld",&lid); 303 if (lid > PETSC_MAX_INT || lid < PETSC_MIN_INT) SETERRQ3(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Argument: -%s%s %ld",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",next->option+1,lid); 304 #endif 305 306 next->set = PETSC_TRUE; 307 *((PetscInt*)next->data) = (PetscInt)lid; 308 } 309 break; 310 case OPTION_REAL: 311 ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <%g>: %s (%s) ",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",next->option+1,*(double*)next->data,next->text,next->man);CHKERRQ(ierr); 312 ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr); 313 if (str[0]) { 314 #if defined(PETSC_USE_REAL_SINGLE) 315 sscanf(str,"%e",&ir); 316 #elif defined(PETSC_USE_REAL_DOUBLE) 317 sscanf(str,"%le",&ir); 318 #elif defined(PETSC_USE_REAL___FLOAT128) 319 ir = strtoflt128(str,0); 320 #else 321 SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unknown scalar type"); 322 #endif 323 next->set = PETSC_TRUE; 324 *((PetscReal*)next->data) = ir; 325 } 326 break; 327 case OPTION_BOOL: 328 ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <%s>: %s (%s) ",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",next->option+1,*(PetscBool*)next->data ? "true": "false",next->text,next->man);CHKERRQ(ierr); 329 ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr); 330 if (str[0]) { 331 ierr = PetscOptionsStringToBool(str,&bid);CHKERRQ(ierr); 332 next->set = PETSC_TRUE; 333 *((PetscBool*)next->data) = bid; 334 } 335 break; 336 case OPTION_STRING: 337 ierr = PetscPrintf(PETSC_COMM_WORLD,"-%s%s <%s>: %s (%s) ",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",next->option+1,(char*)next->data,next->text,next->man);CHKERRQ(ierr); 338 ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr); 339 if (str[0]) { 340 next->set = PETSC_TRUE; 341 /* must use system malloc since SAWs may free this */ 342 ierr = PetscStrdup(str,(char**)&next->data);CHKERRQ(ierr); 343 } 344 break; 345 case OPTION_FLIST: 346 ierr = PetscFunctionListPrintTypes(PETSC_COMM_WORLD,stdout,PetscOptionsObject.prefix,next->option,next->text,next->man,next->flist,(char*)next->data);CHKERRQ(ierr); 347 ierr = PetscScanString(PETSC_COMM_WORLD,512,str);CHKERRQ(ierr); 348 if (str[0]) { 349 PetscOptionsObject.changedmethod = PETSC_TRUE; 350 next->set = PETSC_TRUE; 351 /* must use system malloc since SAWs may free this */ 352 ierr = PetscStrdup(str,(char**)&next->data);CHKERRQ(ierr); 353 } 354 break; 355 default: 356 break; 357 } 358 next = next->next; 359 } 360 PetscFunctionReturn(0); 361 } 362 363 #if defined(PETSC_HAVE_SAWS) 364 #include <petscviewersaws.h> 365 366 static int count = 0; 367 368 #undef __FUNCT__ 369 #define __FUNCT__ "PetscOptionsSAWsDestroy" 370 PetscErrorCode PetscOptionsSAWsDestroy(void) 371 { 372 PetscFunctionBegin; 373 PetscFunctionReturn(0); 374 } 375 376 #undef __FUNCT__ 377 #define __FUNCT__ "PetscOptionsSAWsInput" 378 /* 379 PetscOptionsSAWsInput - Presents all the PETSc Options processed by the program so the user may change them at runtime using the SAWs 380 381 Bugs: 382 + All processes must traverse through the exact same set of option queries do to the call to PetscScanString() 383 . Internal strings have arbitrary length and string copies are not checked that they fit into string space 384 - Only works for PetscInt == int, PetscReal == double etc 385 386 387 */ 388 PetscErrorCode PetscOptionsSAWsInput() 389 { 390 PetscErrorCode ierr; 391 PetscOptions next = PetscOptionsObject.next; 392 static int mancount = 0; 393 char options[16]; 394 PetscBool changedmethod = PETSC_FALSE; 395 char manname[16],textname[16]; 396 char dir[1024]; 397 398 /* the next line is a bug, this will only work if all processors are here, the comm passed in is ignored!!! */ 399 sprintf(options,"Options_%d",count++); 400 401 PetscOptionsObject.pprefix = PetscOptionsObject.prefix; /* SAWs will change this, so cannot pass prefix directly */ 402 403 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s","_title");CHKERRQ(ierr); 404 PetscStackCallSAWs(SAWs_Register,(dir,&PetscOptionsObject.title,1,SAWs_READ,SAWs_STRING)); 405 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s","prefix");CHKERRQ(ierr); 406 PetscStackCallSAWs(SAWs_Register,(dir,&PetscOptionsObject.pprefix,1,SAWs_READ,SAWs_STRING)); 407 PetscStackCallSAWs(SAWs_Register,("/PETSc/Options/ChangedMethod",&changedmethod,1,SAWs_WRITE,SAWs_BOOLEAN)); 408 409 while (next) { 410 sprintf(manname,"_man_%d",mancount); 411 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",manname);CHKERRQ(ierr); 412 PetscStackCallSAWs(SAWs_Register,(dir,&next->man,1,SAWs_READ,SAWs_STRING)); 413 sprintf(textname,"_text_%d",mancount++); 414 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",textname);CHKERRQ(ierr); 415 PetscStackCallSAWs(SAWs_Register,(dir,&next->text,1,SAWs_READ,SAWs_STRING)); 416 417 switch (next->type) { 418 case OPTION_HEAD: 419 break; 420 case OPTION_INT_ARRAY: 421 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 422 PetscStackCallSAWs(SAWs_Register,(dir,next->data,next->arraylength,SAWs_WRITE,SAWs_INT)); 423 break; 424 case OPTION_REAL_ARRAY: 425 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 426 PetscStackCallSAWs(SAWs_Register,(dir,next->data,next->arraylength,SAWs_WRITE,SAWs_DOUBLE)); 427 break; 428 case OPTION_INT: 429 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 430 PetscStackCallSAWs(SAWs_Register,(dir,next->data,1,SAWs_WRITE,SAWs_INT)); 431 break; 432 case OPTION_REAL: 433 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 434 PetscStackCallSAWs(SAWs_Register,(dir,next->data,1,SAWs_WRITE,SAWs_DOUBLE)); 435 break; 436 case OPTION_BOOL: 437 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 438 PetscStackCallSAWs(SAWs_Register,(dir,next->data,1,SAWs_WRITE,SAWs_BOOLEAN)); 439 break; 440 case OPTION_BOOL_ARRAY: 441 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 442 PetscStackCallSAWs(SAWs_Register,(dir,next->data,next->arraylength,SAWs_WRITE,SAWs_BOOLEAN)); 443 break; 444 case OPTION_STRING: 445 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 446 PetscStackCallSAWs(SAWs_Register,(dir,&next->data,1,SAWs_WRITE,SAWs_STRING)); 447 break; 448 case OPTION_STRING_ARRAY: 449 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 450 PetscStackCallSAWs(SAWs_Register,(dir,next->data,next->arraylength,SAWs_WRITE,SAWs_STRING)); 451 break; 452 case OPTION_FLIST: 453 { 454 PetscInt ntext; 455 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 456 PetscStackCallSAWs(SAWs_Register,(dir,&next->data,1,SAWs_WRITE,SAWs_STRING)); 457 ierr = PetscFunctionListGet(next->flist,(const char***)&next->edata,&ntext);CHKERRQ(ierr); 458 PetscStackCallSAWs(SAWs_Set_Legal_Variable_Values,(dir,ntext,next->edata)); 459 } 460 break; 461 case OPTION_ELIST: 462 { 463 PetscInt ntext = next->nlist; 464 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 465 PetscStackCallSAWs(SAWs_Register,(dir,&next->data,1,SAWs_WRITE,SAWs_STRING)); 466 ierr = PetscMalloc((ntext+1)*sizeof(char),&next->edata);CHKERRQ(ierr); 467 ierr = PetscMemcpy(next->edata,next->list,ntext*sizeof(char*));CHKERRQ(ierr); 468 PetscStackCallSAWs(SAWs_Set_Legal_Variable_Values,(dir,ntext,next->edata)); 469 } 470 break; 471 default: 472 break; 473 } 474 next = next->next; 475 } 476 477 /* wait until accessor has unlocked the memory */ 478 ierr = PetscSAWsBlock();CHKERRQ(ierr); 479 480 /* determine if any values have been set in GUI */ 481 next = PetscOptionsObject.next; 482 while (next) { 483 ierr = PetscSNPrintf(dir,1024,"/PETSc/Options/%s",next->option);CHKERRQ(ierr); 484 PetscStackCallSAWs(SAWs_Selected,(dir,&next->set)); 485 next = next->next; 486 } 487 488 /* reset counter to -2; this updates the screen with the new options for the selected method */ 489 if (changedmethod) PetscOptionsPublishCount = -2; 490 491 PetscStackCallSAWs(SAWs_Delete,("/PETSc/Options")); 492 PetscFunctionReturn(0); 493 } 494 #endif 495 496 #undef __FUNCT__ 497 #define __FUNCT__ "PetscOptionsEnd_Private" 498 PetscErrorCode PetscOptionsEnd_Private(void) 499 { 500 PetscErrorCode ierr; 501 PetscOptions last; 502 char option[256],value[1024],tmp[32]; 503 size_t j; 504 505 PetscFunctionBegin; 506 if (PetscOptionsObject.next) { 507 if (!PetscOptionsPublishCount) { 508 #if defined(PETSC_HAVE_SAWS) 509 ierr = PetscOptionsSAWsInput();CHKERRQ(ierr); 510 #else 511 ierr = PetscOptionsGetFromTextInput();CHKERRQ(ierr); 512 #endif 513 } 514 } 515 516 ierr = PetscFree(PetscOptionsObject.title);CHKERRQ(ierr); 517 ierr = PetscFree(PetscOptionsObject.prefix);CHKERRQ(ierr); 518 519 /* reset counter to -2; this updates the screen with the new options for the selected method */ 520 if (PetscOptionsObject.changedmethod) PetscOptionsPublishCount = -2; 521 /* reset alreadyprinted flag */ 522 PetscOptionsObject.alreadyprinted = PETSC_FALSE; 523 if (PetscOptionsObject.object) PetscOptionsObject.object->optionsprinted = PETSC_TRUE; 524 PetscOptionsObject.object = NULL; 525 526 while (PetscOptionsObject.next) { 527 if (PetscOptionsObject.next->set) { 528 if (PetscOptionsObject.prefix) { 529 ierr = PetscStrcpy(option,"-");CHKERRQ(ierr); 530 ierr = PetscStrcat(option,PetscOptionsObject.prefix);CHKERRQ(ierr); 531 ierr = PetscStrcat(option,PetscOptionsObject.next->option+1);CHKERRQ(ierr); 532 } else { 533 ierr = PetscStrcpy(option,PetscOptionsObject.next->option);CHKERRQ(ierr); 534 } 535 536 switch (PetscOptionsObject.next->type) { 537 case OPTION_HEAD: 538 break; 539 case OPTION_INT_ARRAY: 540 sprintf(value,"%d",(int)((PetscInt*)PetscOptionsObject.next->data)[0]); 541 for (j=1; j<PetscOptionsObject.next->arraylength; j++) { 542 sprintf(tmp,"%d",(int)((PetscInt*)PetscOptionsObject.next->data)[j]); 543 ierr = PetscStrcat(value,",");CHKERRQ(ierr); 544 ierr = PetscStrcat(value,tmp);CHKERRQ(ierr); 545 } 546 break; 547 case OPTION_INT: 548 sprintf(value,"%d",(int) *(PetscInt*)PetscOptionsObject.next->data); 549 break; 550 case OPTION_REAL: 551 sprintf(value,"%g",(double) *(PetscReal*)PetscOptionsObject.next->data); 552 break; 553 case OPTION_REAL_ARRAY: 554 sprintf(value,"%g",(double)((PetscReal*)PetscOptionsObject.next->data)[0]); 555 for (j=1; j<PetscOptionsObject.next->arraylength; j++) { 556 sprintf(tmp,"%g",(double)((PetscReal*)PetscOptionsObject.next->data)[j]); 557 ierr = PetscStrcat(value,",");CHKERRQ(ierr); 558 ierr = PetscStrcat(value,tmp);CHKERRQ(ierr); 559 } 560 break; 561 case OPTION_BOOL: 562 sprintf(value,"%d",*(int*)PetscOptionsObject.next->data); 563 break; 564 case OPTION_BOOL_ARRAY: 565 sprintf(value,"%d",(int)((PetscBool*)PetscOptionsObject.next->data)[0]); 566 for (j=1; j<PetscOptionsObject.next->arraylength; j++) { 567 sprintf(tmp,"%d",(int)((PetscBool*)PetscOptionsObject.next->data)[j]); 568 ierr = PetscStrcat(value,",");CHKERRQ(ierr); 569 ierr = PetscStrcat(value,tmp);CHKERRQ(ierr); 570 } 571 break; 572 case OPTION_FLIST: 573 case OPTION_ELIST: 574 ierr = PetscStrcpy(value,(char*)PetscOptionsObject.next->data);CHKERRQ(ierr); 575 break; 576 case OPTION_STRING: 577 ierr = PetscStrcpy(value,(char*)PetscOptionsObject.next->data);CHKERRQ(ierr); 578 break; 579 case OPTION_STRING_ARRAY: 580 sprintf(value,"%s",((char**)PetscOptionsObject.next->data)[0]); 581 for (j=1; j<PetscOptionsObject.next->arraylength; j++) { 582 sprintf(tmp,"%s",((char**)PetscOptionsObject.next->data)[j]); 583 ierr = PetscStrcat(value,",");CHKERRQ(ierr); 584 ierr = PetscStrcat(value,tmp);CHKERRQ(ierr); 585 } 586 break; 587 } 588 ierr = PetscOptionsSetValue(option,value);CHKERRQ(ierr); 589 } 590 ierr = PetscFree(PetscOptionsObject.next->text);CHKERRQ(ierr); 591 ierr = PetscFree(PetscOptionsObject.next->option);CHKERRQ(ierr); 592 ierr = PetscFree(PetscOptionsObject.next->man);CHKERRQ(ierr); 593 ierr = PetscFree(PetscOptionsObject.next->edata);CHKERRQ(ierr); 594 595 if ((PetscOptionsObject.next->type == OPTION_STRING) || (PetscOptionsObject.next->type == OPTION_FLIST) || (PetscOptionsObject.next->type == OPTION_ELIST)){ 596 /* must use system free since SAWs may have allocated it */ 597 free(PetscOptionsObject.next->data); 598 } else { 599 ierr = PetscFree(PetscOptionsObject.next->data);CHKERRQ(ierr); 600 } 601 602 last = PetscOptionsObject.next; 603 PetscOptionsObject.next = PetscOptionsObject.next->next; 604 ierr = PetscFree(last);CHKERRQ(ierr); 605 } 606 PetscOptionsObject.next = 0; 607 PetscFunctionReturn(0); 608 } 609 610 #undef __FUNCT__ 611 #define __FUNCT__ "PetscOptionsEnum" 612 /*@C 613 PetscOptionsEnum - Gets the enum value for a particular option in the database. 614 615 Logically Collective on the communicator passed in PetscOptionsBegin() 616 617 Input Parameters: 618 + opt - option name 619 . text - short string that describes the option 620 . man - manual page with additional information on option 621 . list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 622 - currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either 623 $ PetscOptionsEnum(..., obj->value,&object->value,...) or 624 $ value = defaultvalue 625 $ PetscOptionsEnum(..., value,&value,&flg); 626 $ if (flg) { 627 628 Output Parameter: 629 + value - the value to return 630 - set - PETSC_TRUE if found, else PETSC_FALSE 631 632 Level: beginner 633 634 Concepts: options database 635 636 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 637 638 list is usually something like PCASMTypes or some other predefined list of enum names 639 640 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 641 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 642 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 643 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 644 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 645 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 646 PetscOptionsFList(), PetscOptionsEList() 647 @*/ 648 PetscErrorCode PetscOptionsEnum(const char opt[],const char text[],const char man[],const char *const *list,PetscEnum currentvalue,PetscEnum *value,PetscBool *set) 649 { 650 PetscErrorCode ierr; 651 PetscInt ntext = 0; 652 PetscInt tval; 653 PetscBool tflg; 654 655 PetscFunctionBegin; 656 while (list[ntext++]) { 657 if (ntext > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries"); 658 } 659 if (ntext < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix"); 660 ntext -= 3; 661 ierr = PetscOptionsEList(opt,text,man,list,ntext,list[currentvalue],&tval,&tflg);CHKERRQ(ierr); 662 /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */ 663 if (tflg) *value = (PetscEnum)tval; 664 if (set) *set = tflg; 665 PetscFunctionReturn(0); 666 } 667 668 /* -------------------------------------------------------------------------------------------------------------*/ 669 #undef __FUNCT__ 670 #define __FUNCT__ "PetscOptionsInt" 671 /*@C 672 PetscOptionsInt - Gets the integer value for a particular option in the database. 673 674 Logically Collective on the communicator passed in PetscOptionsBegin() 675 676 Input Parameters: 677 + opt - option name 678 . text - short string that describes the option 679 . man - manual page with additional information on option 680 - currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either 681 $ PetscOptionsInt(..., obj->value,&object->value,...) or 682 $ value = defaultvalue 683 $ PetscOptionsInt(..., value,&value,&flg); 684 $ if (flg) { 685 686 Output Parameter: 687 + value - the integer value to return 688 - flg - PETSC_TRUE if found, else PETSC_FALSE 689 690 Level: beginner 691 692 Concepts: options database^has int 693 694 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 695 696 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 697 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 698 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 699 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 700 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 701 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 702 PetscOptionsFList(), PetscOptionsEList() 703 @*/ 704 PetscErrorCode PetscOptionsInt(const char opt[],const char text[],const char man[],PetscInt currentvalue,PetscInt *value,PetscBool *set) 705 { 706 PetscErrorCode ierr; 707 PetscOptions amsopt; 708 709 PetscFunctionBegin; 710 if (!PetscOptionsPublishCount) { 711 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_INT,&amsopt);CHKERRQ(ierr); 712 ierr = PetscMalloc(sizeof(PetscInt),&amsopt->data);CHKERRQ(ierr); 713 714 *(PetscInt*)amsopt->data = currentvalue; 715 } 716 ierr = PetscOptionsGetInt(PetscOptionsObject.prefix,opt,value,set);CHKERRQ(ierr); 717 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 718 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%d>: %s (%s)\n",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,currentvalue,text,ManSection(man));CHKERRQ(ierr); 719 } 720 PetscFunctionReturn(0); 721 } 722 723 #undef __FUNCT__ 724 #define __FUNCT__ "PetscOptionsString" 725 /*@C 726 PetscOptionsString - Gets the string value for a particular option in the database. 727 728 Logically Collective on the communicator passed in PetscOptionsBegin() 729 730 Input Parameters: 731 + opt - option name 732 . text - short string that describes the option 733 . man - manual page with additional information on option 734 . currentvalue - the current value; caller is responsible for setting this value correctly. This is not used to set value 735 - len - length of the result string including null terminator 736 737 Output Parameter: 738 + value - the value to return 739 - flg - PETSC_TRUE if found, else PETSC_FALSE 740 741 Level: beginner 742 743 Concepts: options database^has int 744 745 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 746 747 Even if the user provided no string (for example -optionname -someotheroption) the flag is set to PETSC_TRUE (and the string is fulled with nulls). 748 749 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 750 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 751 PetscOptionsInt(), PetscOptionsReal(), PetscOptionsBool(), 752 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 753 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 754 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 755 PetscOptionsFList(), PetscOptionsEList() 756 @*/ 757 PetscErrorCode PetscOptionsString(const char opt[],const char text[],const char man[],const char currentvalue[],char value[],size_t len,PetscBool *set) 758 { 759 PetscErrorCode ierr; 760 PetscOptions amsopt; 761 762 PetscFunctionBegin; 763 if (!PetscOptionsPublishCount) { 764 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_STRING,&amsopt);CHKERRQ(ierr); 765 /* must use system malloc since SAWs may free this */ 766 ierr = PetscStrdup(currentvalue ? currentvalue : "",(char**)&amsopt->data);CHKERRQ(ierr); 767 } 768 ierr = PetscOptionsGetString(PetscOptionsObject.prefix,opt,value,len,set);CHKERRQ(ierr); 769 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 770 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%s>: %s (%s)\n",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,currentvalue,text,ManSection(man));CHKERRQ(ierr); 771 } 772 PetscFunctionReturn(0); 773 } 774 775 #undef __FUNCT__ 776 #define __FUNCT__ "PetscOptionsReal" 777 /*@C 778 PetscOptionsReal - Gets the PetscReal value for a particular option in the database. 779 780 Logically Collective on the communicator passed in PetscOptionsBegin() 781 782 Input Parameters: 783 + opt - option name 784 . text - short string that describes the option 785 . man - manual page with additional information on option 786 - currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either 787 $ PetscOptionsReal(..., obj->value,&object->value,...) or 788 $ value = defaultvalue 789 $ PetscOptionsReal(..., value,&value,&flg); 790 $ if (flg) { 791 792 Output Parameter: 793 + value - the value to return 794 - flg - PETSC_TRUE if found, else PETSC_FALSE 795 796 Level: beginner 797 798 Concepts: options database^has int 799 800 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 801 802 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 803 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 804 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 805 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 806 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 807 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 808 PetscOptionsFList(), PetscOptionsEList() 809 @*/ 810 PetscErrorCode PetscOptionsReal(const char opt[],const char text[],const char man[],PetscReal currentvalue,PetscReal *value,PetscBool *set) 811 { 812 PetscErrorCode ierr; 813 PetscOptions amsopt; 814 815 PetscFunctionBegin; 816 if (!PetscOptionsPublishCount) { 817 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_REAL,&amsopt);CHKERRQ(ierr); 818 ierr = PetscMalloc(sizeof(PetscReal),&amsopt->data);CHKERRQ(ierr); 819 820 *(PetscReal*)amsopt->data = currentvalue; 821 } 822 ierr = PetscOptionsGetReal(PetscOptionsObject.prefix,opt,value,set);CHKERRQ(ierr); 823 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 824 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%g>: %s (%s)\n",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,(double)currentvalue,text,ManSection(man));CHKERRQ(ierr); 825 } 826 PetscFunctionReturn(0); 827 } 828 829 #undef __FUNCT__ 830 #define __FUNCT__ "PetscOptionsScalar" 831 /*@C 832 PetscOptionsScalar - Gets the scalar value for a particular option in the database. 833 834 Logically Collective on the communicator passed in PetscOptionsBegin() 835 836 Input Parameters: 837 + opt - option name 838 . text - short string that describes the option 839 . man - manual page with additional information on option 840 - currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either 841 $ PetscOptionsScalar(..., obj->value,&object->value,...) or 842 $ value = defaultvalue 843 $ PetscOptionsScalar(..., value,&value,&flg); 844 $ if (flg) { 845 846 847 Output Parameter: 848 + value - the value to return 849 - flg - PETSC_TRUE if found, else PETSC_FALSE 850 851 Level: beginner 852 853 Concepts: options database^has int 854 855 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 856 857 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 858 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 859 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 860 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 861 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 862 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 863 PetscOptionsFList(), PetscOptionsEList() 864 @*/ 865 PetscErrorCode PetscOptionsScalar(const char opt[],const char text[],const char man[],PetscScalar currentvalue,PetscScalar *value,PetscBool *set) 866 { 867 PetscErrorCode ierr; 868 869 PetscFunctionBegin; 870 #if !defined(PETSC_USE_COMPLEX) 871 ierr = PetscOptionsReal(opt,text,man,currentvalue,value,set);CHKERRQ(ierr); 872 #else 873 ierr = PetscOptionsGetScalar(PetscOptionsObject.prefix,opt,value,set);CHKERRQ(ierr); 874 #endif 875 PetscFunctionReturn(0); 876 } 877 878 #undef __FUNCT__ 879 #define __FUNCT__ "PetscOptionsName" 880 /*@C 881 PetscOptionsName - Determines if a particular option has been set in the database. This returns true whether the option is a number, string or boolean, even 882 its value is set to false. 883 884 Logically Collective on the communicator passed in PetscOptionsBegin() 885 886 Input Parameters: 887 + opt - option name 888 . text - short string that describes the option 889 - man - manual page with additional information on option 890 891 Output Parameter: 892 . flg - PETSC_TRUE if found, else PETSC_FALSE 893 894 Level: beginner 895 896 Concepts: options database^has int 897 898 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 899 900 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 901 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 902 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 903 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 904 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 905 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 906 PetscOptionsFList(), PetscOptionsEList() 907 @*/ 908 PetscErrorCode PetscOptionsName(const char opt[],const char text[],const char man[],PetscBool *flg) 909 { 910 PetscErrorCode ierr; 911 PetscOptions amsopt; 912 913 PetscFunctionBegin; 914 if (!PetscOptionsPublishCount) { 915 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr); 916 ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr); 917 918 *(PetscBool*)amsopt->data = PETSC_FALSE; 919 } 920 ierr = PetscOptionsHasName(PetscOptionsObject.prefix,opt,flg);CHKERRQ(ierr); 921 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 922 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s: %s (%s)\n",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr); 923 } 924 PetscFunctionReturn(0); 925 } 926 927 #undef __FUNCT__ 928 #define __FUNCT__ "PetscOptionsFList" 929 /*@C 930 PetscOptionsFList - Puts a list of option values that a single one may be selected from 931 932 Logically Collective on the communicator passed in PetscOptionsBegin() 933 934 Input Parameters: 935 + opt - option name 936 . text - short string that describes the option 937 . man - manual page with additional information on option 938 . list - the possible choices 939 . currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with 940 $ PetscOptionsFlist(..., obj->value,value,len,&flg); 941 $ if (flg) { 942 - len - the length of the character array value 943 944 Output Parameter: 945 + value - the value to return 946 - set - PETSC_TRUE if found, else PETSC_FALSE 947 948 Level: intermediate 949 950 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 951 952 See PetscOptionsEList() for when the choices are given in a string array 953 954 To get a listing of all currently specified options, 955 see PetscOptionsView() or PetscOptionsGetAll() 956 957 Developer Note: This cannot check for invalid selection because of things like MATAIJ that are not included in the list 958 959 Concepts: options database^list 960 961 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 962 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 963 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 964 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 965 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 966 PetscOptionsFList(), PetscOptionsEList(), PetscOptionsEnum() 967 @*/ 968 PetscErrorCode PetscOptionsFList(const char opt[],const char ltext[],const char man[],PetscFunctionList list,const char currentvalue[],char value[],size_t len,PetscBool *set) 969 { 970 PetscErrorCode ierr; 971 PetscOptions amsopt; 972 973 PetscFunctionBegin; 974 if (!PetscOptionsPublishCount) { 975 ierr = PetscOptionsCreate_Private(opt,ltext,man,OPTION_FLIST,&amsopt);CHKERRQ(ierr); 976 /* must use system malloc since SAWs may free this */ 977 ierr = PetscStrdup(currentvalue ? currentvalue : "",(char**)&amsopt->data);CHKERRQ(ierr); 978 amsopt->flist = list; 979 } 980 ierr = PetscOptionsGetString(PetscOptionsObject.prefix,opt,value,len,set);CHKERRQ(ierr); 981 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 982 ierr = PetscFunctionListPrintTypes(PetscOptionsObject.comm,stdout,PetscOptionsObject.prefix,opt,ltext,man,list,currentvalue);CHKERRQ(ierr);CHKERRQ(ierr); 983 } 984 PetscFunctionReturn(0); 985 } 986 987 #undef __FUNCT__ 988 #define __FUNCT__ "PetscOptionsEList" 989 /*@C 990 PetscOptionsEList - Puts a list of option values that a single one may be selected from 991 992 Logically Collective on the communicator passed in PetscOptionsBegin() 993 994 Input Parameters: 995 + opt - option name 996 . ltext - short string that describes the option 997 . man - manual page with additional information on option 998 . list - the possible choices (one of these must be selected, anything else is invalid) 999 . ntext - number of choices 1000 - currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with 1001 $ PetscOptionsElist(..., obj->value,&value,&flg); 1002 $ if (flg) { 1003 1004 1005 Output Parameter: 1006 + value - the index of the value to return 1007 - set - PETSC_TRUE if found, else PETSC_FALSE 1008 1009 Level: intermediate 1010 1011 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1012 1013 See PetscOptionsFList() for when the choices are given in a PetscFunctionList() 1014 1015 Concepts: options database^list 1016 1017 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1018 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1019 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1020 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1021 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1022 PetscOptionsFList(), PetscOptionsEnum() 1023 @*/ 1024 PetscErrorCode PetscOptionsEList(const char opt[],const char ltext[],const char man[],const char *const *list,PetscInt ntext,const char currentvalue[],PetscInt *value,PetscBool *set) 1025 { 1026 PetscErrorCode ierr; 1027 PetscInt i; 1028 PetscOptions amsopt; 1029 1030 PetscFunctionBegin; 1031 if (!PetscOptionsPublishCount) { 1032 ierr = PetscOptionsCreate_Private(opt,ltext,man,OPTION_ELIST,&amsopt);CHKERRQ(ierr); 1033 /* must use system malloc since SAWs may free this */ 1034 ierr = PetscStrdup(currentvalue ? currentvalue : "",(char**)&amsopt->data);CHKERRQ(ierr); 1035 amsopt->list = list; 1036 amsopt->nlist = ntext; 1037 } 1038 ierr = PetscOptionsGetEList(PetscOptionsObject.prefix,opt,list,ntext,value,set);CHKERRQ(ierr); 1039 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1040 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%s> (choose one of)",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,currentvalue);CHKERRQ(ierr); 1041 for (i=0; i<ntext; i++) { 1042 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," %s",list[i]);CHKERRQ(ierr); 1043 } 1044 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," (%s)\n",ManSection(man));CHKERRQ(ierr); 1045 } 1046 PetscFunctionReturn(0); 1047 } 1048 1049 #undef __FUNCT__ 1050 #define __FUNCT__ "PetscOptionsBoolGroupBegin" 1051 /*@C 1052 PetscOptionsBoolGroupBegin - First in a series of logical queries on the options database for 1053 which at most a single value can be true. 1054 1055 Logically Collective on the communicator passed in PetscOptionsBegin() 1056 1057 Input Parameters: 1058 + opt - option name 1059 . text - short string that describes the option 1060 - man - manual page with additional information on option 1061 1062 Output Parameter: 1063 . flg - whether that option was set or not 1064 1065 Level: intermediate 1066 1067 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1068 1069 Must be followed by 0 or more PetscOptionsBoolGroup()s and PetscOptionsBoolGroupEnd() 1070 1071 Concepts: options database^logical group 1072 1073 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1074 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1075 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1076 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1077 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1078 PetscOptionsFList(), PetscOptionsEList() 1079 @*/ 1080 PetscErrorCode PetscOptionsBoolGroupBegin(const char opt[],const char text[],const char man[],PetscBool *flg) 1081 { 1082 PetscErrorCode ierr; 1083 PetscOptions amsopt; 1084 1085 PetscFunctionBegin; 1086 if (!PetscOptionsPublishCount) { 1087 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr); 1088 ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr); 1089 1090 *(PetscBool*)amsopt->data = PETSC_FALSE; 1091 } 1092 *flg = PETSC_FALSE; 1093 ierr = PetscOptionsGetBool(PetscOptionsObject.prefix,opt,flg,NULL);CHKERRQ(ierr); 1094 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1095 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," Pick at most one of -------------\n");CHKERRQ(ierr); 1096 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s: %s (%s)\n",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr); 1097 } 1098 PetscFunctionReturn(0); 1099 } 1100 1101 #undef __FUNCT__ 1102 #define __FUNCT__ "PetscOptionsBoolGroup" 1103 /*@C 1104 PetscOptionsBoolGroup - One in a series of logical queries on the options database for 1105 which at most a single value can be true. 1106 1107 Logically Collective on the communicator passed in PetscOptionsBegin() 1108 1109 Input Parameters: 1110 + opt - option name 1111 . text - short string that describes the option 1112 - man - manual page with additional information on option 1113 1114 Output Parameter: 1115 . flg - PETSC_TRUE if found, else PETSC_FALSE 1116 1117 Level: intermediate 1118 1119 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1120 1121 Must follow a PetscOptionsBoolGroupBegin() and preceded a PetscOptionsBoolGroupEnd() 1122 1123 Concepts: options database^logical group 1124 1125 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1126 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1127 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1128 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1129 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1130 PetscOptionsFList(), PetscOptionsEList() 1131 @*/ 1132 PetscErrorCode PetscOptionsBoolGroup(const char opt[],const char text[],const char man[],PetscBool *flg) 1133 { 1134 PetscErrorCode ierr; 1135 PetscOptions amsopt; 1136 1137 PetscFunctionBegin; 1138 if (!PetscOptionsPublishCount) { 1139 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr); 1140 ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr); 1141 1142 *(PetscBool*)amsopt->data = PETSC_FALSE; 1143 } 1144 *flg = PETSC_FALSE; 1145 ierr = PetscOptionsGetBool(PetscOptionsObject.prefix,opt,flg,NULL);CHKERRQ(ierr); 1146 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1147 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s: %s (%s)\n",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr); 1148 } 1149 PetscFunctionReturn(0); 1150 } 1151 1152 #undef __FUNCT__ 1153 #define __FUNCT__ "PetscOptionsBoolGroupEnd" 1154 /*@C 1155 PetscOptionsBoolGroupEnd - Last in a series of logical queries on the options database for 1156 which at most a single value can be true. 1157 1158 Logically Collective on the communicator passed in PetscOptionsBegin() 1159 1160 Input Parameters: 1161 + opt - option name 1162 . text - short string that describes the option 1163 - man - manual page with additional information on option 1164 1165 Output Parameter: 1166 . flg - PETSC_TRUE if found, else PETSC_FALSE 1167 1168 Level: intermediate 1169 1170 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1171 1172 Must follow a PetscOptionsBoolGroupBegin() 1173 1174 Concepts: options database^logical group 1175 1176 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1177 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1178 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1179 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1180 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1181 PetscOptionsFList(), PetscOptionsEList() 1182 @*/ 1183 PetscErrorCode PetscOptionsBoolGroupEnd(const char opt[],const char text[],const char man[],PetscBool *flg) 1184 { 1185 PetscErrorCode ierr; 1186 PetscOptions amsopt; 1187 1188 PetscFunctionBegin; 1189 if (!PetscOptionsPublishCount) { 1190 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr); 1191 ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr); 1192 1193 *(PetscBool*)amsopt->data = PETSC_FALSE; 1194 } 1195 *flg = PETSC_FALSE; 1196 ierr = PetscOptionsGetBool(PetscOptionsObject.prefix,opt,flg,NULL);CHKERRQ(ierr); 1197 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1198 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s: %s (%s)\n",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr); 1199 } 1200 PetscFunctionReturn(0); 1201 } 1202 1203 #undef __FUNCT__ 1204 #define __FUNCT__ "PetscOptionsBool" 1205 /*@C 1206 PetscOptionsBool - Determines if a particular option is in the database with a true or false 1207 1208 Logically Collective on the communicator passed in PetscOptionsBegin() 1209 1210 Input Parameters: 1211 + opt - option name 1212 . text - short string that describes the option 1213 . man - manual page with additional information on option 1214 - currentvalue - the current value 1215 1216 Output Parameter: 1217 . flg - PETSC_TRUE or PETSC_FALSE 1218 . set - PETSC_TRUE if found, else PETSC_FALSE 1219 1220 Level: beginner 1221 1222 Concepts: options database^logical 1223 1224 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1225 1226 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 1227 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 1228 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 1229 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1230 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1231 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1232 PetscOptionsFList(), PetscOptionsEList() 1233 @*/ 1234 PetscErrorCode PetscOptionsBool(const char opt[],const char text[],const char man[],PetscBool currentvalue,PetscBool *flg,PetscBool *set) 1235 { 1236 PetscErrorCode ierr; 1237 PetscBool iset; 1238 PetscOptions amsopt; 1239 1240 PetscFunctionBegin; 1241 if (!PetscOptionsPublishCount) { 1242 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr); 1243 ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr); 1244 1245 *(PetscBool*)amsopt->data = currentvalue; 1246 } 1247 ierr = PetscOptionsGetBool(PetscOptionsObject.prefix,opt,flg,&iset);CHKERRQ(ierr); 1248 if (set) *set = iset; 1249 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1250 const char *v = PetscBools[currentvalue]; 1251 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s: <%s> %s (%s)\n",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,v,text,ManSection(man));CHKERRQ(ierr); 1252 } 1253 PetscFunctionReturn(0); 1254 } 1255 1256 #undef __FUNCT__ 1257 #define __FUNCT__ "PetscOptionsRealArray" 1258 /*@C 1259 PetscOptionsRealArray - Gets an array of double values for a particular 1260 option in the database. The values must be separated with commas with 1261 no intervening spaces. 1262 1263 Logically Collective on the communicator passed in PetscOptionsBegin() 1264 1265 Input Parameters: 1266 + opt - the option one is seeking 1267 . text - short string describing option 1268 . man - manual page for option 1269 - nmax - maximum number of values 1270 1271 Output Parameter: 1272 + value - location to copy values 1273 . nmax - actual number of values found 1274 - set - PETSC_TRUE if found, else PETSC_FALSE 1275 1276 Level: beginner 1277 1278 Notes: 1279 The user should pass in an array of doubles 1280 1281 Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1282 1283 Concepts: options database^array of strings 1284 1285 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1286 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1287 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1288 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1289 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1290 PetscOptionsFList(), PetscOptionsEList() 1291 @*/ 1292 PetscErrorCode PetscOptionsRealArray(const char opt[],const char text[],const char man[],PetscReal value[],PetscInt *n,PetscBool *set) 1293 { 1294 PetscErrorCode ierr; 1295 PetscInt i; 1296 PetscOptions amsopt; 1297 1298 PetscFunctionBegin; 1299 if (!PetscOptionsPublishCount) { 1300 PetscReal *vals; 1301 1302 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_REAL_ARRAY,&amsopt);CHKERRQ(ierr); 1303 ierr = PetscMalloc1((*n),(PetscReal**)&amsopt->data);CHKERRQ(ierr); 1304 vals = (PetscReal*)amsopt->data; 1305 for (i=0; i<*n; i++) vals[i] = value[i]; 1306 amsopt->arraylength = *n; 1307 } 1308 ierr = PetscOptionsGetRealArray(PetscOptionsObject.prefix,opt,value,n,set);CHKERRQ(ierr); 1309 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1310 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%g",PetscOptionsObject.prefix?PetscOptionsObject.prefix:"",opt+1,(double)value[0]);CHKERRQ(ierr); 1311 for (i=1; i<*n; i++) { 1312 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,",%g",(double)value[i]);CHKERRQ(ierr); 1313 } 1314 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr); 1315 } 1316 PetscFunctionReturn(0); 1317 } 1318 1319 1320 #undef __FUNCT__ 1321 #define __FUNCT__ "PetscOptionsIntArray" 1322 /*@C 1323 PetscOptionsIntArray - Gets an array of integers for a particular 1324 option in the database. 1325 1326 Logically Collective on the communicator passed in PetscOptionsBegin() 1327 1328 Input Parameters: 1329 + opt - the option one is seeking 1330 . text - short string describing option 1331 . man - manual page for option 1332 - n - maximum number of values 1333 1334 Output Parameter: 1335 + value - location to copy values 1336 . n - actual number of values found 1337 - set - PETSC_TRUE if found, else PETSC_FALSE 1338 1339 Level: beginner 1340 1341 Notes: 1342 The array can be passed as 1343 a comma seperated list: 0,1,2,3,4,5,6,7 1344 a range (start-end+1): 0-8 1345 a range with given increment (start-end+1:inc): 0-7:2 1346 a combination of values and ranges seperated by commas: 0,1-8,8-15:2 1347 1348 There must be no intervening spaces between the values. 1349 1350 Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1351 1352 Concepts: options database^array of ints 1353 1354 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1355 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1356 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1357 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1358 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1359 PetscOptionsFList(), PetscOptionsEList(), PetscOptionsRealArray() 1360 @*/ 1361 PetscErrorCode PetscOptionsIntArray(const char opt[],const char text[],const char man[],PetscInt value[],PetscInt *n,PetscBool *set) 1362 { 1363 PetscErrorCode ierr; 1364 PetscInt i; 1365 PetscOptions amsopt; 1366 1367 PetscFunctionBegin; 1368 if (!PetscOptionsPublishCount) { 1369 PetscInt *vals; 1370 1371 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_INT_ARRAY,&amsopt);CHKERRQ(ierr); 1372 ierr = PetscMalloc1((*n),(PetscInt**)&amsopt->data);CHKERRQ(ierr); 1373 vals = (PetscInt*)amsopt->data; 1374 for (i=0; i<*n; i++) vals[i] = value[i]; 1375 amsopt->arraylength = *n; 1376 } 1377 ierr = PetscOptionsGetIntArray(PetscOptionsObject.prefix,opt,value,n,set);CHKERRQ(ierr); 1378 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1379 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%d",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,value[0]);CHKERRQ(ierr); 1380 for (i=1; i<*n; i++) { 1381 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,",%d",value[i]);CHKERRQ(ierr); 1382 } 1383 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr); 1384 } 1385 PetscFunctionReturn(0); 1386 } 1387 1388 #undef __FUNCT__ 1389 #define __FUNCT__ "PetscOptionsStringArray" 1390 /*@C 1391 PetscOptionsStringArray - Gets an array of string values for a particular 1392 option in the database. The values must be separated with commas with 1393 no intervening spaces. 1394 1395 Logically Collective on the communicator passed in PetscOptionsBegin() 1396 1397 Input Parameters: 1398 + opt - the option one is seeking 1399 . text - short string describing option 1400 . man - manual page for option 1401 - nmax - maximum number of strings 1402 1403 Output Parameter: 1404 + value - location to copy strings 1405 . nmax - actual number of strings found 1406 - set - PETSC_TRUE if found, else PETSC_FALSE 1407 1408 Level: beginner 1409 1410 Notes: 1411 The user should pass in an array of pointers to char, to hold all the 1412 strings returned by this function. 1413 1414 The user is responsible for deallocating the strings that are 1415 returned. The Fortran interface for this routine is not supported. 1416 1417 Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1418 1419 Concepts: options database^array of strings 1420 1421 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1422 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1423 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1424 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1425 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1426 PetscOptionsFList(), PetscOptionsEList() 1427 @*/ 1428 PetscErrorCode PetscOptionsStringArray(const char opt[],const char text[],const char man[],char *value[],PetscInt *nmax,PetscBool *set) 1429 { 1430 PetscErrorCode ierr; 1431 PetscOptions amsopt; 1432 1433 PetscFunctionBegin; 1434 if (!PetscOptionsPublishCount) { 1435 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_STRING_ARRAY,&amsopt);CHKERRQ(ierr); 1436 ierr = PetscMalloc1((*nmax),(char**)&amsopt->data);CHKERRQ(ierr); 1437 1438 amsopt->arraylength = *nmax; 1439 } 1440 ierr = PetscOptionsGetStringArray(PetscOptionsObject.prefix,opt,value,nmax,set);CHKERRQ(ierr); 1441 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1442 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <string1,string2,...>: %s (%s)\n",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr); 1443 } 1444 PetscFunctionReturn(0); 1445 } 1446 1447 #undef __FUNCT__ 1448 #define __FUNCT__ "PetscOptionsBoolArray" 1449 /*@C 1450 PetscOptionsBoolArray - Gets an array of logical values (true or false) for a particular 1451 option in the database. The values must be separated with commas with 1452 no intervening spaces. 1453 1454 Logically Collective on the communicator passed in PetscOptionsBegin() 1455 1456 Input Parameters: 1457 + opt - the option one is seeking 1458 . text - short string describing option 1459 . man - manual page for option 1460 - nmax - maximum number of values 1461 1462 Output Parameter: 1463 + value - location to copy values 1464 . nmax - actual number of values found 1465 - set - PETSC_TRUE if found, else PETSC_FALSE 1466 1467 Level: beginner 1468 1469 Notes: 1470 The user should pass in an array of doubles 1471 1472 Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1473 1474 Concepts: options database^array of strings 1475 1476 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1477 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1478 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1479 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1480 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1481 PetscOptionsFList(), PetscOptionsEList() 1482 @*/ 1483 PetscErrorCode PetscOptionsBoolArray(const char opt[],const char text[],const char man[],PetscBool value[],PetscInt *n,PetscBool *set) 1484 { 1485 PetscErrorCode ierr; 1486 PetscInt i; 1487 PetscOptions amsopt; 1488 1489 PetscFunctionBegin; 1490 if (!PetscOptionsPublishCount) { 1491 PetscBool *vals; 1492 1493 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_BOOL_ARRAY,&amsopt);CHKERRQ(ierr); 1494 ierr = PetscMalloc1((*n),(PetscBool**)&amsopt->data);CHKERRQ(ierr); 1495 vals = (PetscBool*)amsopt->data; 1496 for (i=0; i<*n; i++) vals[i] = value[i]; 1497 amsopt->arraylength = *n; 1498 } 1499 ierr = PetscOptionsGetBoolArray(PetscOptionsObject.prefix,opt,value,n,set);CHKERRQ(ierr); 1500 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1501 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%d",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,value[0]);CHKERRQ(ierr); 1502 for (i=1; i<*n; i++) { 1503 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,",%d",value[i]);CHKERRQ(ierr); 1504 } 1505 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr); 1506 } 1507 PetscFunctionReturn(0); 1508 } 1509 1510 #undef __FUNCT__ 1511 #define __FUNCT__ "PetscOptionsViewer" 1512 /*@C 1513 PetscOptionsViewer - Gets a viewer appropriate for the type indicated by the user 1514 1515 Logically Collective on the communicator passed in PetscOptionsBegin() 1516 1517 Input Parameters: 1518 + opt - option name 1519 . text - short string that describes the option 1520 - man - manual page with additional information on option 1521 1522 Output Parameter: 1523 + viewer - the viewer 1524 - set - PETSC_TRUE if found, else PETSC_FALSE 1525 1526 Level: beginner 1527 1528 Concepts: options database^has int 1529 1530 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1531 1532 See PetscOptionsGetVieweer() for the format of the supplied viewer and its options 1533 1534 .seealso: PetscOptionsGetViewer(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(), 1535 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 1536 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 1537 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1538 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1539 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1540 PetscOptionsFList(), PetscOptionsEList() 1541 @*/ 1542 PetscErrorCode PetscOptionsViewer(const char opt[],const char text[],const char man[],PetscViewer *viewer,PetscViewerFormat *format,PetscBool *set) 1543 { 1544 PetscErrorCode ierr; 1545 PetscOptions amsopt; 1546 1547 PetscFunctionBegin; 1548 if (!PetscOptionsPublishCount) { 1549 ierr = PetscOptionsCreate_Private(opt,text,man,OPTION_STRING,&amsopt);CHKERRQ(ierr); 1550 /* must use system malloc since SAWs may free this */ 1551 ierr = PetscStrdup("",(char**)&amsopt->data);CHKERRQ(ierr); 1552 } 1553 ierr = PetscOptionsGetViewer(PetscOptionsObject.comm,PetscOptionsObject.prefix,opt,viewer,format,set);CHKERRQ(ierr); 1554 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1555 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," -%s%s <%s>: %s (%s)\n",PetscOptionsObject.prefix ? PetscOptionsObject.prefix : "",opt+1,"",text,ManSection(man));CHKERRQ(ierr); 1556 } 1557 PetscFunctionReturn(0); 1558 } 1559 1560 1561 #undef __FUNCT__ 1562 #define __FUNCT__ "PetscOptionsHead" 1563 /*@C 1564 PetscOptionsHead - Puts a heading before listing any more published options. Used, for example, 1565 in KSPSetFromOptions_GMRES(). 1566 1567 Logically Collective on the communicator passed in PetscOptionsBegin() 1568 1569 Input Parameter: 1570 . head - the heading text 1571 1572 1573 Level: intermediate 1574 1575 Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd() 1576 1577 Can be followed by a call to PetscOptionsTail() in the same function. 1578 1579 Concepts: options database^subheading 1580 1581 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(), 1582 PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), 1583 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 1584 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 1585 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 1586 PetscOptionsFList(), PetscOptionsEList() 1587 @*/ 1588 PetscErrorCode PetscOptionsHead(const char head[]) 1589 { 1590 PetscErrorCode ierr; 1591 1592 PetscFunctionBegin; 1593 if (PetscOptionsObject.printhelp && PetscOptionsPublishCount == 1 && !PetscOptionsObject.alreadyprinted) { 1594 ierr = (*PetscHelpPrintf)(PetscOptionsObject.comm," %s\n",head);CHKERRQ(ierr); 1595 } 1596 PetscFunctionReturn(0); 1597 } 1598 1599 1600 1601 1602 1603 1604