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