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