xref: /petsc/src/sys/objects/aoptions.c (revision 4211eb483909a9a6403702befc20456a00a91081)
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
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,(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 /*@C
767    PetscOptionsBoundedInt - Gets an integer value greater than or equal a given bound for a particular option in the database.
768 
769    Logically Collective on the communicator passed in PetscOptionsBegin()
770 
771    Input Parameters:
772 +  opt - option name
773 .  text - short string that describes the option
774 .  man - manual page with additional information on option
775 .  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either
776 $                 PetscOptionsInt(..., obj->value,&object->value,...) or
777 $                 value = defaultvalue
778 $                 PetscOptionsInt(..., value,&value,&flg);
779 $                 if (flg) {
780 -  bound - the requested value should be large than this bound
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     Errors if the supplied integer does not satisfy the bound
793 
794     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
795 
796    Level: beginner
797 
798 .seealso: PetscOptionsInt(), PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
799           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), PetscOptionsRangeInt()
800           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
801           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
802           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
803           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
804           PetscOptionsFList(), PetscOptionsEList()
805 @*/
806 
807 /*@C
808    PetscOptionsRangeInt - Gets an integer value within a range of values for a particular option in the database.
809 
810    Logically Collective on the communicator passed in PetscOptionsBegin()
811 
812    Input Parameters:
813 +  opt - option name
814 .  text - short string that describes the option
815 .  man - manual page with additional information on option
816 .  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either
817 $                 PetscOptionsInt(..., obj->value,&object->value,...) or
818 $                 value = defaultvalue
819 $                 PetscOptionsInt(..., value,&value,&flg);
820 $                 if (flg) {
821 .  lb - the lower bound
822 -  ub - the upper bound
823 
824    Output Parameter:
825 +  value - the integer value to return
826 -  flg - PETSC_TRUE if found, else PETSC_FALSE
827 
828    Notes:
829     If the user does not supply the option at all value is NOT changed. Thus
830     you should ALWAYS initialize value if you access it without first checking if the set flag is true.
831 
832     The default/currentvalue passed into this routine does not get transferred to the output value variable automatically.
833 
834     Errors if the supplied integer does not satisfy the range
835 
836     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
837 
838    Level: beginner
839 
840 .seealso: PetscOptionsInt(), PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
841           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), PetscOptionsBoundedInt()
842           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
843           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
844           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
845           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
846           PetscOptionsFList(), PetscOptionsEList()
847 @*/
848 
849 /*@C
850    PetscOptionsInt - Gets the integer value for a particular option in the database.
851 
852    Logically Collective on the communicator passed in PetscOptionsBegin()
853 
854    Input Parameters:
855 +  opt - option name
856 .  text - short string that describes the option
857 .  man - manual page with additional information on option
858 -  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either
859 $                 PetscOptionsInt(..., obj->value,&object->value,...) or
860 $                 value = defaultvalue
861 $                 PetscOptionsInt(..., value,&value,&flg);
862 $                 if (flg) {
863 
864    Output Parameter:
865 +  value - the integer value to return
866 -  flg - PETSC_TRUE if found, else PETSC_FALSE
867 
868    Notes:
869     If the user does not supply the option at all value is NOT changed. Thus
870     you should ALWAYS initialize value if you access it without first checking if the set flag is true.
871 
872     The default/currentvalue passed into this routine does not get transferred to the output value variable automatically.
873 
874     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
875 
876    Level: beginner
877 
878 .seealso: PetscOptionsBoundedInt(), PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
879           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(), PetscOptionsRangeInt()
880           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
881           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
882           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
883           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
884           PetscOptionsFList(), PetscOptionsEList()
885 @*/
886 PetscErrorCode  PetscOptionsInt_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscInt currentvalue,PetscInt *value,PetscBool  *set,PetscInt lb,PetscInt ub)
887 {
888   PetscErrorCode  ierr;
889   PetscOptionItem amsopt;
890   PetscBool       wasset;
891 
892   PetscFunctionBegin;
893   if (currentvalue < lb) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Current value %D less than allowed bound %D",currentvalue,lb);
894   if (currentvalue > ub ) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Newly set value %D greater than allowed bound %D",currentvalue,ub);
895      if (!PetscOptionsObject->count) {
896     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_INT,&amsopt);CHKERRQ(ierr);
897     ierr = PetscMalloc(sizeof(PetscInt),&amsopt->data);CHKERRQ(ierr);
898     *(PetscInt*)amsopt->data = currentvalue;
899 
900     ierr = PetscOptionsGetInt(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,&currentvalue,&wasset);CHKERRQ(ierr);
901     if (wasset) {
902       *(PetscInt*)amsopt->data = currentvalue;
903     }
904   }
905   ierr = PetscOptionsGetInt(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,&wasset);CHKERRQ(ierr);
906   if (wasset && *value < lb ) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Newly set value %D less than allowed bound %D",*value,lb);
907   if (wasset && *value > ub ) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Newly set value %D greater than allowed bound %D",*value,ub);
908   if (set) *set = wasset;
909   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
910     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <now %D : formerly %D>: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,wasset && value ? *value : currentvalue,currentvalue,text,ManSection(man));CHKERRQ(ierr);
911   }
912   PetscFunctionReturn(0);
913 }
914 
915 /*@C
916    PetscOptionsString - Gets the string value for a particular option in the database.
917 
918    Logically Collective on the communicator passed in PetscOptionsBegin()
919 
920    Input Parameters:
921 +  opt - option name
922 .  text - short string that describes the option
923 .  man - manual page with additional information on option
924 .  currentvalue - the current value; caller is responsible for setting this value correctly. This is not used to set value
925 -  len - length of the result string including null terminator
926 
927    Output Parameter:
928 +  value - the value to return
929 -  flg - PETSC_TRUE if found, else PETSC_FALSE
930 
931    Level: beginner
932 
933    Notes:
934     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
935 
936    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).
937 
938           If the user does not supply the option at all value is NOT changed. Thus
939           you should ALWAYS initialize value if you access it without first checking if the set flag is true.
940 
941           The default/currentvalue passed into this routine does not get transferred to the output value variable automatically.
942 
943 
944 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
945           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
946           PetscOptionsInt(), PetscOptionsReal(), PetscOptionsBool(),
947           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
948           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
949           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
950           PetscOptionsFList(), PetscOptionsEList()
951 @*/
952 PetscErrorCode  PetscOptionsString_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],const char currentvalue[],char value[],size_t len,PetscBool  *set)
953 {
954   PetscErrorCode  ierr;
955   PetscOptionItem amsopt;
956   PetscBool       lset;
957 
958   PetscFunctionBegin;
959   if (!PetscOptionsObject->count) {
960     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_STRING,&amsopt);CHKERRQ(ierr);
961     /* must use system malloc since SAWs may free this */
962     ierr = PetscStrdup(currentvalue ? currentvalue : "",(char**)&amsopt->data);CHKERRQ(ierr);
963   }
964   ierr = PetscOptionsGetString(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,len,&lset);CHKERRQ(ierr);
965   if (set) *set = lset;
966   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
967     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <now %s : formerly %s>: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,lset && value ? value : currentvalue,currentvalue,text,ManSection(man));CHKERRQ(ierr);
968   }
969   PetscFunctionReturn(0);
970 }
971 
972 /*@C
973    PetscOptionsReal - Gets the PetscReal value for a particular option in the database.
974 
975    Logically Collective on the communicator passed in PetscOptionsBegin()
976 
977    Input Parameters:
978 +  opt - option name
979 .  text - short string that describes the option
980 .  man - manual page with additional information on option
981 -  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either
982 $                 PetscOptionsReal(..., obj->value,&object->value,...) or
983 $                 value = defaultvalue
984 $                 PetscOptionsReal(..., value,&value,&flg);
985 $                 if (flg) {
986 
987    Output Parameter:
988 +  value - the value to return
989 -  flg - PETSC_TRUE if found, else PETSC_FALSE
990 
991    Notes:
992     If the user does not supply the option at all value is NOT changed. Thus
993     you should ALWAYS initialize value if you access it without first checking if the set flag is true.
994 
995     The default/currentvalue passed into this routine does not get transferred to the output value variable automatically.
996 
997     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
998 
999    Level: beginner
1000 
1001 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
1002           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
1003           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
1004           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1005           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1006           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1007           PetscOptionsFList(), PetscOptionsEList()
1008 @*/
1009 PetscErrorCode  PetscOptionsReal_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscReal currentvalue,PetscReal *value,PetscBool  *set)
1010 {
1011   PetscErrorCode  ierr;
1012   PetscOptionItem amsopt;
1013   PetscBool       lset;
1014 
1015   PetscFunctionBegin;
1016   if (!PetscOptionsObject->count) {
1017     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_REAL,&amsopt);CHKERRQ(ierr);
1018     ierr = PetscMalloc(sizeof(PetscReal),&amsopt->data);CHKERRQ(ierr);
1019 
1020     *(PetscReal*)amsopt->data = currentvalue;
1021   }
1022   ierr = PetscOptionsGetReal(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,&lset);CHKERRQ(ierr);
1023   if (set) *set = lset;
1024   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1025     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%g : %g>: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,lset && value ? (double)*value : (double) currentvalue,(double)currentvalue,text,ManSection(man));CHKERRQ(ierr);
1026   }
1027   PetscFunctionReturn(0);
1028 }
1029 
1030 /*@C
1031    PetscOptionsScalar - Gets the scalar value for a particular option in the database.
1032 
1033    Logically Collective on the communicator passed in PetscOptionsBegin()
1034 
1035    Input Parameters:
1036 +  opt - option name
1037 .  text - short string that describes the option
1038 .  man - manual page with additional information on option
1039 -  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with either
1040 $                 PetscOptionsScalar(..., obj->value,&object->value,...) or
1041 $                 value = defaultvalue
1042 $                 PetscOptionsScalar(..., value,&value,&flg);
1043 $                 if (flg) {
1044 
1045 
1046    Output Parameter:
1047 +  value - the value to return
1048 -  flg - PETSC_TRUE if found, else PETSC_FALSE
1049 
1050    Notes:
1051     If the user does not supply the option at all value is NOT changed. Thus
1052     you should ALWAYS initialize value if you access it without first checking if the set flag is true.
1053 
1054     The default/currentvalue passed into this routine does not get transferred to the output value variable automatically.
1055 
1056     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1057 
1058    Level: beginner
1059 
1060 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
1061           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
1062           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
1063           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1064           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1065           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1066           PetscOptionsFList(), PetscOptionsEList()
1067 @*/
1068 PetscErrorCode  PetscOptionsScalar_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscScalar currentvalue,PetscScalar *value,PetscBool  *set)
1069 {
1070   PetscErrorCode ierr;
1071 
1072   PetscFunctionBegin;
1073 #if !defined(PETSC_USE_COMPLEX)
1074   ierr = PetscOptionsReal(opt,text,man,currentvalue,value,set);CHKERRQ(ierr);
1075 #else
1076   ierr = PetscOptionsGetScalar(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,set);CHKERRQ(ierr);
1077 #endif
1078   PetscFunctionReturn(0);
1079 }
1080 
1081 /*@C
1082    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
1083                       its value is set to false.
1084 
1085    Logically Collective on the communicator passed in PetscOptionsBegin()
1086 
1087    Input Parameters:
1088 +  opt - option name
1089 .  text - short string that describes the option
1090 -  man - manual page with additional information on option
1091 
1092    Output Parameter:
1093 .  flg - PETSC_TRUE if found, else PETSC_FALSE
1094 
1095    Level: beginner
1096 
1097    Notes:
1098     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1099 
1100 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
1101           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
1102           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
1103           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1104           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1105           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1106           PetscOptionsFList(), PetscOptionsEList()
1107 @*/
1108 PetscErrorCode  PetscOptionsName_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool  *flg)
1109 {
1110   PetscErrorCode  ierr;
1111   PetscOptionItem amsopt;
1112 
1113   PetscFunctionBegin;
1114   if (!PetscOptionsObject->count) {
1115     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
1116     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
1117 
1118     *(PetscBool*)amsopt->data = PETSC_FALSE;
1119   }
1120   ierr = PetscOptionsHasName(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg);CHKERRQ(ierr);
1121   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1122     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr);
1123   }
1124   PetscFunctionReturn(0);
1125 }
1126 
1127 /*@C
1128      PetscOptionsFList - Puts a list of option values that a single one may be selected from
1129 
1130    Logically Collective on the communicator passed in PetscOptionsBegin()
1131 
1132    Input Parameters:
1133 +  opt - option name
1134 .  text - short string that describes the option
1135 .  man - manual page with additional information on option
1136 .  list - the possible choices
1137 .  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with
1138 $                 PetscOptionsFlist(..., obj->value,value,len,&flg);
1139 $                 if (flg) {
1140 -  len - the length of the character array value
1141 
1142    Output Parameter:
1143 +  value - the value to return
1144 -  set - PETSC_TRUE if found, else PETSC_FALSE
1145 
1146    Level: intermediate
1147 
1148    Notes:
1149     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1150 
1151           If the user does not supply the option at all value is NOT changed. Thus
1152           you should ALWAYS initialize value if you access it without first checking if the set flag is true.
1153 
1154           The default/currentvalue passed into this routine does not get transferred to the output value variable automatically.
1155 
1156    See PetscOptionsEList() for when the choices are given in a string array
1157 
1158    To get a listing of all currently specified options,
1159     see PetscOptionsView() or PetscOptionsGetAll()
1160 
1161    Developer Note: This cannot check for invalid selection because of things like MATAIJ that are not included in the list
1162 
1163 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1164            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1165           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1166           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1167           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1168           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsEnum()
1169 @*/
1170 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)
1171 {
1172   PetscErrorCode  ierr;
1173   PetscOptionItem amsopt;
1174   PetscBool       lset;
1175 
1176   PetscFunctionBegin;
1177   if (!PetscOptionsObject->count) {
1178     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,ltext,man,OPTION_FLIST,&amsopt);CHKERRQ(ierr);
1179     /* must use system malloc since SAWs may free this */
1180     ierr = PetscStrdup(currentvalue ? currentvalue : "",(char**)&amsopt->data);CHKERRQ(ierr);
1181     amsopt->flist = list;
1182   }
1183   ierr = PetscOptionsGetString(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,len,&lset);CHKERRQ(ierr);
1184   if (set) *set = lset;
1185   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1186     ierr = PetscFunctionListPrintTypes(PetscOptionsObject->comm,stdout,PetscOptionsObject->prefix,opt,ltext,man,list,currentvalue,lset && value ? value : currentvalue);CHKERRQ(ierr);CHKERRQ(ierr);
1187   }
1188   PetscFunctionReturn(0);
1189 }
1190 
1191 /*@C
1192      PetscOptionsEList - Puts a list of option values that a single one may be selected from
1193 
1194    Logically Collective on the communicator passed in PetscOptionsBegin()
1195 
1196    Input Parameters:
1197 +  opt - option name
1198 .  ltext - short string that describes the option
1199 .  man - manual page with additional information on option
1200 .  list - the possible choices (one of these must be selected, anything else is invalid)
1201 .  ntext - number of choices
1202 -  currentvalue - the current value; caller is responsible for setting this value correctly. Normally this is done with
1203 $                 PetscOptionsElist(..., obj->value,&value,&flg);
1204 $                 if (flg) {
1205 
1206 
1207    Output Parameter:
1208 +  value - the index of the value to return
1209 -  set - PETSC_TRUE if found, else PETSC_FALSE
1210 
1211    Level: intermediate
1212 
1213    Notes:
1214     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1215 
1216          If the user does not supply the option at all value is NOT changed. Thus
1217           you should ALWAYS initialize value if you access it without first checking if the set flag is true.
1218 
1219    See PetscOptionsFList() for when the choices are given in a PetscFunctionList()
1220 
1221 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1222            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1223           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1224           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1225           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1226           PetscOptionsFList(), PetscOptionsEnum()
1227 @*/
1228 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)
1229 {
1230   PetscErrorCode  ierr;
1231   PetscInt        i;
1232   PetscOptionItem amsopt;
1233   PetscBool       lset;
1234 
1235   PetscFunctionBegin;
1236   if (!PetscOptionsObject->count) {
1237     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,ltext,man,OPTION_ELIST,&amsopt);CHKERRQ(ierr);
1238     /* must use system malloc since SAWs may free this */
1239     ierr = PetscStrdup(currentvalue ? currentvalue : "",(char**)&amsopt->data);CHKERRQ(ierr);
1240     ierr = PetscStrNArrayallocpy(ntext,list,(char***)&amsopt->list);CHKERRQ(ierr);
1241     amsopt->nlist = ntext;
1242   }
1243   ierr = PetscOptionsGetEList(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,list,ntext,value,&lset);CHKERRQ(ierr);
1244   if (set) *set = lset;
1245   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1246     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <now %s : formerly %s> %s (choose one of)",PetscOptionsObject->prefix?PetscOptionsObject->prefix:"",opt+1,lset && value ? list[*value] : currentvalue,currentvalue,ltext);CHKERRQ(ierr);
1247     for (i=0; i<ntext; i++) {
1248       ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm," %s",list[i]);CHKERRQ(ierr);
1249     }
1250     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm," (%s)\n",ManSection(man));CHKERRQ(ierr);
1251   }
1252   PetscFunctionReturn(0);
1253 }
1254 
1255 /*@C
1256      PetscOptionsBoolGroupBegin - First in a series of logical queries on the options database for
1257        which at most a single value can be true.
1258 
1259    Logically Collective on the communicator passed in PetscOptionsBegin()
1260 
1261    Input Parameters:
1262 +  opt - option name
1263 .  text - short string that describes the option
1264 -  man - manual page with additional information on option
1265 
1266    Output Parameter:
1267 .  flg - whether that option was set or not
1268 
1269    Level: intermediate
1270 
1271    Notes:
1272     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1273 
1274    Must be followed by 0 or more PetscOptionsBoolGroup()s and PetscOptionsBoolGroupEnd()
1275 
1276 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1277            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1278           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1279           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1280           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1281           PetscOptionsFList(), PetscOptionsEList()
1282 @*/
1283 PetscErrorCode  PetscOptionsBoolGroupBegin_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool  *flg)
1284 {
1285   PetscErrorCode  ierr;
1286   PetscOptionItem amsopt;
1287 
1288   PetscFunctionBegin;
1289   if (!PetscOptionsObject->count) {
1290     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
1291     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
1292 
1293     *(PetscBool*)amsopt->data = PETSC_FALSE;
1294   }
1295   *flg = PETSC_FALSE;
1296   ierr = PetscOptionsGetBool(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg,NULL);CHKERRQ(ierr);
1297   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1298     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  Pick at most one of -------------\n");CHKERRQ(ierr);
1299     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"    -%s%s: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr);
1300   }
1301   PetscFunctionReturn(0);
1302 }
1303 
1304 /*@C
1305      PetscOptionsBoolGroup - One in a series of logical queries on the options database for
1306        which at most a single value can be true.
1307 
1308    Logically Collective on the communicator passed in PetscOptionsBegin()
1309 
1310    Input Parameters:
1311 +  opt - option name
1312 .  text - short string that describes the option
1313 -  man - manual page with additional information on option
1314 
1315    Output Parameter:
1316 .  flg - PETSC_TRUE if found, else PETSC_FALSE
1317 
1318    Level: intermediate
1319 
1320    Notes:
1321     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1322 
1323    Must follow a PetscOptionsBoolGroupBegin() and preceded a PetscOptionsBoolGroupEnd()
1324 
1325 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1326            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1327           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1328           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1329           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1330           PetscOptionsFList(), PetscOptionsEList()
1331 @*/
1332 PetscErrorCode  PetscOptionsBoolGroup_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool  *flg)
1333 {
1334   PetscErrorCode  ierr;
1335   PetscOptionItem amsopt;
1336 
1337   PetscFunctionBegin;
1338   if (!PetscOptionsObject->count) {
1339     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
1340     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
1341 
1342     *(PetscBool*)amsopt->data = PETSC_FALSE;
1343   }
1344   *flg = PETSC_FALSE;
1345   ierr = PetscOptionsGetBool(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg,NULL);CHKERRQ(ierr);
1346   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1347     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"    -%s%s: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr);
1348   }
1349   PetscFunctionReturn(0);
1350 }
1351 
1352 /*@C
1353      PetscOptionsBoolGroupEnd - Last in a series of logical queries on the options database for
1354        which at most a single value can be true.
1355 
1356    Logically Collective on the communicator passed in PetscOptionsBegin()
1357 
1358    Input Parameters:
1359 +  opt - option name
1360 .  text - short string that describes the option
1361 -  man - manual page with additional information on option
1362 
1363    Output Parameter:
1364 .  flg - PETSC_TRUE if found, else PETSC_FALSE
1365 
1366    Level: intermediate
1367 
1368    Notes:
1369     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1370 
1371    Must follow a PetscOptionsBoolGroupBegin()
1372 
1373 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1374            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1375           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1376           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1377           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1378           PetscOptionsFList(), PetscOptionsEList()
1379 @*/
1380 PetscErrorCode  PetscOptionsBoolGroupEnd_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool  *flg)
1381 {
1382   PetscErrorCode  ierr;
1383   PetscOptionItem amsopt;
1384 
1385   PetscFunctionBegin;
1386   if (!PetscOptionsObject->count) {
1387     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
1388     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
1389 
1390     *(PetscBool*)amsopt->data = PETSC_FALSE;
1391   }
1392   *flg = PETSC_FALSE;
1393   ierr = PetscOptionsGetBool(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg,NULL);CHKERRQ(ierr);
1394   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1395     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"    -%s%s: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr);
1396   }
1397   PetscFunctionReturn(0);
1398 }
1399 
1400 /*@C
1401    PetscOptionsBool - Determines if a particular option is in the database with a true or false
1402 
1403    Logically Collective on the communicator passed in PetscOptionsBegin()
1404 
1405    Input Parameters:
1406 +  opt - option name
1407 .  text - short string that describes the option
1408 .  man - manual page with additional information on option
1409 -  currentvalue - the current value
1410 
1411    Output Parameter:
1412 .  flg - PETSC_TRUE or PETSC_FALSE
1413 .  set - PETSC_TRUE if found, else PETSC_FALSE
1414 
1415    Notes:
1416        TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE
1417        FALSE, false, NO, no, and 0 all translate to PETSC_FALSE
1418 
1419       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
1420      is equivalent to -requested_bool true
1421 
1422        If the user does not supply the option at all flg is NOT changed. Thus
1423      you should ALWAYS initialize the flg if you access it without first checking if the set flag is true.
1424 
1425     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1426 
1427    Level: beginner
1428 
1429 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
1430           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
1431           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
1432           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1433           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1434           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1435           PetscOptionsFList(), PetscOptionsEList()
1436 @*/
1437 PetscErrorCode  PetscOptionsBool_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool currentvalue,PetscBool  *flg,PetscBool  *set)
1438 {
1439   PetscErrorCode  ierr;
1440   PetscBool       iset;
1441   PetscOptionItem amsopt;
1442 
1443   PetscFunctionBegin;
1444   if (!PetscOptionsObject->count) {
1445     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
1446     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
1447 
1448     *(PetscBool*)amsopt->data = currentvalue;
1449   }
1450   ierr = PetscOptionsGetBool(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg,&iset);CHKERRQ(ierr);
1451   if (set) *set = iset;
1452   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1453     const char *v = PetscBools[currentvalue], *vn = PetscBools[iset && flg ? *flg : currentvalue];
1454     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s: <%s : %s> %s (%s)\n",PetscOptionsObject->prefix?PetscOptionsObject->prefix:"",opt+1,v,vn,text,ManSection(man));CHKERRQ(ierr);
1455   }
1456   PetscFunctionReturn(0);
1457 }
1458 
1459 /*@C
1460    PetscOptionsRealArray - Gets an array of double values for a particular
1461    option in the database. The values must be separated with commas with
1462    no intervening spaces.
1463 
1464    Logically Collective on the communicator passed in PetscOptionsBegin()
1465 
1466    Input Parameters:
1467 +  opt - the option one is seeking
1468 .  text - short string describing option
1469 .  man - manual page for option
1470 -  nmax - maximum number of values
1471 
1472    Output Parameter:
1473 +  value - location to copy values
1474 .  nmax - actual number of values found
1475 -  set - PETSC_TRUE if found, else PETSC_FALSE
1476 
1477    Level: beginner
1478 
1479    Notes:
1480    The user should pass in an array of doubles
1481 
1482    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1483 
1484 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1485            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1486           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1487           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1488           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1489           PetscOptionsFList(), PetscOptionsEList()
1490 @*/
1491 PetscErrorCode PetscOptionsRealArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscReal value[],PetscInt *n,PetscBool  *set)
1492 {
1493   PetscErrorCode  ierr;
1494   PetscInt        i;
1495   PetscOptionItem amsopt;
1496 
1497   PetscFunctionBegin;
1498   if (!PetscOptionsObject->count) {
1499     PetscReal *vals;
1500 
1501     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_REAL_ARRAY,&amsopt);CHKERRQ(ierr);
1502     ierr = PetscMalloc((*n)*sizeof(PetscReal),&amsopt->data);CHKERRQ(ierr);
1503     vals = (PetscReal*)amsopt->data;
1504     for (i=0; i<*n; i++) vals[i] = value[i];
1505     amsopt->arraylength = *n;
1506   }
1507   ierr = PetscOptionsGetRealArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,n,set);CHKERRQ(ierr);
1508   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1509     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%g",PetscOptionsObject->prefix?PetscOptionsObject->prefix:"",opt+1,(double)value[0]);CHKERRQ(ierr);
1510     for (i=1; i<*n; i++) {
1511       ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,",%g",(double)value[i]);CHKERRQ(ierr);
1512     }
1513     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr);
1514   }
1515   PetscFunctionReturn(0);
1516 }
1517 
1518 /*@C
1519    PetscOptionsScalarArray - Gets an array of Scalar values for a particular
1520    option in the database. The values must be separated with commas with
1521    no intervening spaces.
1522 
1523    Logically Collective on the communicator passed in PetscOptionsBegin()
1524 
1525    Input Parameters:
1526 +  opt - the option one is seeking
1527 .  text - short string describing option
1528 .  man - manual page for option
1529 -  nmax - maximum number of values
1530 
1531    Output Parameter:
1532 +  value - location to copy values
1533 .  nmax - actual number of values found
1534 -  set - PETSC_TRUE if found, else PETSC_FALSE
1535 
1536    Level: beginner
1537 
1538    Notes:
1539    The user should pass in an array of doubles
1540 
1541    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1542 
1543 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1544           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1545           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1546           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1547           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1548           PetscOptionsFList(), PetscOptionsEList()
1549 @*/
1550 PetscErrorCode PetscOptionsScalarArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscScalar value[],PetscInt *n,PetscBool  *set)
1551 {
1552   PetscErrorCode  ierr;
1553   PetscInt        i;
1554   PetscOptionItem amsopt;
1555 
1556   PetscFunctionBegin;
1557   if (!PetscOptionsObject->count) {
1558     PetscScalar *vals;
1559 
1560     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_SCALAR_ARRAY,&amsopt);CHKERRQ(ierr);
1561     ierr = PetscMalloc((*n)*sizeof(PetscScalar),&amsopt->data);CHKERRQ(ierr);
1562     vals = (PetscScalar*)amsopt->data;
1563     for (i=0; i<*n; i++) vals[i] = value[i];
1564     amsopt->arraylength = *n;
1565   }
1566   ierr = PetscOptionsGetScalarArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,n,set);CHKERRQ(ierr);
1567   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1568     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%g+%gi",PetscOptionsObject->prefix?PetscOptionsObject->prefix:"",opt+1,(double)PetscRealPart(value[0]),(double)PetscImaginaryPart(value[0]));CHKERRQ(ierr);
1569     for (i=1; i<*n; i++) {
1570       ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,",%g+%gi",(double)PetscRealPart(value[i]),(double)PetscImaginaryPart(value[i]));CHKERRQ(ierr);
1571     }
1572     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr);
1573   }
1574   PetscFunctionReturn(0);
1575 }
1576 
1577 /*@C
1578    PetscOptionsIntArray - Gets an array of integers for a particular
1579    option in the database.
1580 
1581    Logically Collective on the communicator passed in PetscOptionsBegin()
1582 
1583    Input Parameters:
1584 +  opt - the option one is seeking
1585 .  text - short string describing option
1586 .  man - manual page for option
1587 -  n - maximum number of values
1588 
1589    Output Parameter:
1590 +  value - location to copy values
1591 .  n - actual number of values found
1592 -  set - PETSC_TRUE if found, else PETSC_FALSE
1593 
1594    Level: beginner
1595 
1596    Notes:
1597    The array can be passed as
1598    a comma separated list:                                 0,1,2,3,4,5,6,7
1599    a range (start-end+1):                                  0-8
1600    a range with given increment (start-end+1:inc):         0-7:2
1601    a combination of values and ranges separated by commas: 0,1-8,8-15:2
1602 
1603    There must be no intervening spaces between the values.
1604 
1605    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1606 
1607 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1608            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1609           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1610           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1611           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1612           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsRealArray()
1613 @*/
1614 PetscErrorCode  PetscOptionsIntArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscInt value[],PetscInt *n,PetscBool  *set)
1615 {
1616   PetscErrorCode ierr;
1617   PetscInt        i;
1618   PetscOptionItem amsopt;
1619 
1620   PetscFunctionBegin;
1621   if (!PetscOptionsObject->count) {
1622     PetscInt *vals;
1623 
1624     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_INT_ARRAY,&amsopt);CHKERRQ(ierr);
1625     ierr = PetscMalloc1(*n,(PetscInt**)&amsopt->data);CHKERRQ(ierr);
1626     vals = (PetscInt*)amsopt->data;
1627     for (i=0; i<*n; i++) vals[i] = value[i];
1628     amsopt->arraylength = *n;
1629   }
1630   ierr = PetscOptionsGetIntArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,n,set);CHKERRQ(ierr);
1631   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1632     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%d",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,value[0]);CHKERRQ(ierr);
1633     for (i=1; i<*n; i++) {
1634       ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,",%d",value[i]);CHKERRQ(ierr);
1635     }
1636     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr);
1637   }
1638   PetscFunctionReturn(0);
1639 }
1640 
1641 /*@C
1642    PetscOptionsStringArray - Gets an array of string values for a particular
1643    option in the database. The values must be separated with commas with
1644    no intervening spaces.
1645 
1646    Logically Collective on the communicator passed in PetscOptionsBegin()
1647 
1648    Input Parameters:
1649 +  opt - the option one is seeking
1650 .  text - short string describing option
1651 .  man - manual page for option
1652 -  nmax - maximum number of strings
1653 
1654    Output Parameter:
1655 +  value - location to copy strings
1656 .  nmax - actual number of strings found
1657 -  set - PETSC_TRUE if found, else PETSC_FALSE
1658 
1659    Level: beginner
1660 
1661    Notes:
1662    The user should pass in an array of pointers to char, to hold all the
1663    strings returned by this function.
1664 
1665    The user is responsible for deallocating the strings that are
1666    returned. The Fortran interface for this routine is not supported.
1667 
1668    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1669 
1670 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1671            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1672           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1673           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1674           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1675           PetscOptionsFList(), PetscOptionsEList()
1676 @*/
1677 PetscErrorCode  PetscOptionsStringArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],char *value[],PetscInt *nmax,PetscBool  *set)
1678 {
1679   PetscErrorCode  ierr;
1680   PetscOptionItem amsopt;
1681 
1682   PetscFunctionBegin;
1683   if (!PetscOptionsObject->count) {
1684     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_STRING_ARRAY,&amsopt);CHKERRQ(ierr);
1685     ierr = PetscMalloc1(*nmax,(char**)&amsopt->data);CHKERRQ(ierr);
1686 
1687     amsopt->arraylength = *nmax;
1688   }
1689   ierr = PetscOptionsGetStringArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,nmax,set);CHKERRQ(ierr);
1690   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1691     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <string1,string2,...>: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,text,ManSection(man));CHKERRQ(ierr);
1692   }
1693   PetscFunctionReturn(0);
1694 }
1695 
1696 /*@C
1697    PetscOptionsBoolArray - Gets an array of logical values (true or false) for a particular
1698    option in the database. The values must be separated with commas with
1699    no intervening spaces.
1700 
1701    Logically Collective on the communicator passed in PetscOptionsBegin()
1702 
1703    Input Parameters:
1704 +  opt - the option one is seeking
1705 .  text - short string describing option
1706 .  man - manual page for option
1707 -  nmax - maximum number of values
1708 
1709    Output Parameter:
1710 +  value - location to copy values
1711 .  nmax - actual number of values found
1712 -  set - PETSC_TRUE if found, else PETSC_FALSE
1713 
1714    Level: beginner
1715 
1716    Notes:
1717    The user should pass in an array of doubles
1718 
1719    Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1720 
1721 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1722            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1723           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1724           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1725           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1726           PetscOptionsFList(), PetscOptionsEList()
1727 @*/
1728 PetscErrorCode  PetscOptionsBoolArray_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscBool value[],PetscInt *n,PetscBool *set)
1729 {
1730   PetscErrorCode   ierr;
1731   PetscInt         i;
1732   PetscOptionItem  amsopt;
1733 
1734   PetscFunctionBegin;
1735   if (!PetscOptionsObject->count) {
1736     PetscBool *vals;
1737 
1738     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL_ARRAY,&amsopt);CHKERRQ(ierr);
1739     ierr = PetscMalloc1(*n,(PetscBool**)&amsopt->data);CHKERRQ(ierr);
1740     vals = (PetscBool*)amsopt->data;
1741     for (i=0; i<*n; i++) vals[i] = value[i];
1742     amsopt->arraylength = *n;
1743   }
1744   ierr = PetscOptionsGetBoolArray(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,value,n,set);CHKERRQ(ierr);
1745   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1746     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%d",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,value[0]);CHKERRQ(ierr);
1747     for (i=1; i<*n; i++) {
1748       ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,",%d",value[i]);CHKERRQ(ierr);
1749     }
1750     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,">: %s (%s)\n",text,ManSection(man));CHKERRQ(ierr);
1751   }
1752   PetscFunctionReturn(0);
1753 }
1754 
1755 /*@C
1756    PetscOptionsViewer - Gets a viewer appropriate for the type indicated by the user
1757 
1758    Logically Collective on the communicator passed in PetscOptionsBegin()
1759 
1760    Input Parameters:
1761 +  opt - option name
1762 .  text - short string that describes the option
1763 -  man - manual page with additional information on option
1764 
1765    Output Parameter:
1766 +  viewer - the viewer
1767 -  set - PETSC_TRUE if found, else PETSC_FALSE
1768 
1769    Level: beginner
1770 
1771    Notes:
1772     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1773 
1774    See PetscOptionsGetViewer() for the format of the supplied viewer and its options
1775 
1776 .seealso: PetscOptionsGetViewer(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
1777           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
1778           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
1779           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1780           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1781           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1782           PetscOptionsFList(), PetscOptionsEList()
1783 @*/
1784 PetscErrorCode  PetscOptionsViewer_Private(PetscOptionItems *PetscOptionsObject,const char opt[],const char text[],const char man[],PetscViewer *viewer,PetscViewerFormat *format,PetscBool  *set)
1785 {
1786   PetscErrorCode  ierr;
1787   PetscOptionItem amsopt;
1788 
1789   PetscFunctionBegin;
1790   if (!PetscOptionsObject->count) {
1791     ierr = PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_STRING,&amsopt);CHKERRQ(ierr);
1792     /* must use system malloc since SAWs may free this */
1793     ierr = PetscStrdup("",(char**)&amsopt->data);CHKERRQ(ierr);
1794   }
1795   ierr = PetscOptionsGetViewer(PetscOptionsObject->comm,PetscOptionsObject->options,PetscOptionsObject->prefix,opt,viewer,format,set);CHKERRQ(ierr);
1796   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1797     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s <%s>: %s (%s)\n",PetscOptionsObject->prefix ? PetscOptionsObject->prefix : "",opt+1,"",text,ManSection(man));CHKERRQ(ierr);
1798   }
1799   PetscFunctionReturn(0);
1800 }
1801 
1802 
1803 /*@C
1804      PetscOptionsHead - Puts a heading before listing any more published options. Used, for example,
1805             in KSPSetFromOptions_GMRES().
1806 
1807    Logically Collective on the communicator passed in PetscOptionsBegin()
1808 
1809    Input Parameter:
1810 .   head - the heading text
1811 
1812 
1813    Level: intermediate
1814 
1815    Notes:
1816     Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1817 
1818           Can be followed by a call to PetscOptionsTail() in the same function.
1819 
1820 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1821            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1822           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1823           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1824           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1825           PetscOptionsFList(), PetscOptionsEList()
1826 @*/
1827 PetscErrorCode  PetscOptionsHead(PetscOptionItems *PetscOptionsObject,const char head[])
1828 {
1829   PetscErrorCode ierr;
1830 
1831   PetscFunctionBegin;
1832   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && !PetscOptionsObject->alreadyprinted) {
1833     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  %s\n",head);CHKERRQ(ierr);
1834   }
1835   PetscFunctionReturn(0);
1836 }
1837 
1838 
1839 
1840 
1841 
1842 
1843