xref: /petsc/src/sys/objects/aoptions.c (revision 0f5d826a8a3961d28a20703f4390975100ca0e26)
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,&currentvalue,&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