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