xref: /petsc/src/sys/objects/options.c (revision 4704e88546f6c0f1984724fda7816c0de849ab2a)
1 #define PETSC_DLL
2 /*
3    These routines simplify the use of command line, file options, etc.,
4    and are used to manipulate the options database.
5 
6   This file uses regular malloc and free because it cannot know
7   what malloc is being used until it has already processed the input.
8 */
9 
10 #include "petsc.h"        /*I  "petsc.h"   I*/
11 #include "petscsys.h"
12 #if defined(PETSC_HAVE_STDLIB_H)
13 #include <stdlib.h>
14 #endif
15 #if defined(PETSC_HAVE_MALLOC_H)
16 #include <malloc.h>
17 #endif
18 #if defined(PETSC_HAVE_SYS_PARAM_H)
19 #include "sys/param.h"
20 #endif
21 #include "petscfix.h"
22 
23 /*
24     For simplicity, we use a static size database
25 */
26 #define MAXOPTIONS 512
27 #define MAXALIASES 25
28 #define MAXOPTIONSMONITORS 5
29 
30 typedef struct {
31   int        N,argc,Naliases;
32   char       **args,*names[MAXOPTIONS],*values[MAXOPTIONS];
33   char       *aliases1[MAXALIASES],*aliases2[MAXALIASES];
34   PetscTruth used[MAXOPTIONS];
35   PetscTruth namegiven;
36   char       programname[PETSC_MAX_PATH_LEN]; /* HP includes entire path in name */
37 
38   /* --------User (or default) routines (most return -1 on error) --------*/
39   PetscErrorCode (*monitor[MAXOPTIONSMONITORS])(const char[], const char[], void*); /* returns control to user after */
40   PetscErrorCode (*monitordestroy[MAXOPTIONSMONITORS])(void*);         /* */
41   void           *monitorcontext[MAXOPTIONSMONITORS];                  /* to pass arbitrary user data into monitor */
42   PetscInt       numbermonitors;                                       /* to, for instance, detect options being set */
43 
44 } PetscOptionsTable;
45 
46 
47 static PetscOptionsTable *options = 0;
48 
49 extern PetscOptionsObjectType PetscOptionsObject;
50 
51 /*
52     Options events monitor
53 */
54 #define PetscOptionsMonitor(name,value)                                     \
55         { PetscErrorCode _ierr; PetscInt _i,_im = options->numbermonitors; \
56           for (_i=0; _i<_im; _i++) {\
57             _ierr = (*options->monitor[_i])(name, value, options->monitorcontext[_i]);CHKERRQ(_ierr); \
58 	  } \
59 	}
60 
61 #undef __FUNCT__
62 #define __FUNCT__ "PetscOptionsAtoi"
63 PetscErrorCode PETSC_DLLEXPORT PetscOptionsAtoi(const char name[],PetscInt *a)
64 {
65   PetscErrorCode ierr;
66   size_t         i,len;
67   PetscTruth     decide,tdefault,mouse;
68 
69   PetscFunctionBegin;
70   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
71   if (!len) SETERRQ(PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value");
72 
73   ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr);
74   if (!tdefault) {
75     ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr);
76   }
77   ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr);
78   if (!decide) {
79     ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr);
80   }
81   ierr = PetscStrcasecmp(name,"mouse",&mouse);CHKERRQ(ierr);
82 
83   if (tdefault) {
84     *a = PETSC_DEFAULT;
85   } else if (decide) {
86     *a = PETSC_DECIDE;
87   } else if (mouse) {
88     *a = -1;
89   } else {
90     if (name[0] != '+' && name[0] != '-' && name[0] < '0' && name[0] > '9') {
91       SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no integer value (do not include . in it)",name);
92     }
93     for (i=1; i<len; i++) {
94       if (name[i] < '0' || name[i] > '9') {
95         SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no integer value (do not include . in it)",name);
96       }
97     }
98     *a  = atoi(name);
99   }
100   PetscFunctionReturn(0);
101 }
102 
103 #undef __FUNCT__
104 #define __FUNCT__ "PetscOptionsAtod"
105 PetscErrorCode PETSC_DLLEXPORT PetscOptionsAtod(const char name[],PetscReal *a)
106 {
107   PetscErrorCode ierr;
108   size_t         len;
109   PetscTruth     decide,tdefault;
110 
111   PetscFunctionBegin;
112   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
113   if (!len) SETERRQ(PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value");
114 
115   ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr);
116   if (!tdefault) {
117     ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr);
118   }
119   ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr);
120   if (!decide) {
121     ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr);
122   }
123 
124   if (tdefault) {
125     *a = PETSC_DEFAULT;
126   } else if (decide) {
127     *a = PETSC_DECIDE;
128   } else {
129     if (name[0] != '+' && name[0] != '-' && name[0] != '.' && name[0] < '0' && name[0] > '9') {
130       SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name);
131     }
132     *a  = atof(name);
133   }
134   PetscFunctionReturn(0);
135 }
136 
137 #undef __FUNCT__
138 #define __FUNCT__ "PetscGetProgramName"
139 /*@C
140     PetscGetProgramName - Gets the name of the running program.
141 
142     Not Collective
143 
144     Input Parameter:
145 .   len - length of the string name
146 
147     Output Parameter:
148 .   name - the name of the running program
149 
150    Level: advanced
151 
152     Notes:
153     The name of the program is copied into the user-provided character
154     array of length len.  On some machines the program name includes
155     its entire path, so one should generally set len >= PETSC_MAX_PATH_LEN.
156 @*/
157 PetscErrorCode PETSC_DLLEXPORT PetscGetProgramName(char name[],size_t len)
158 {
159   PetscErrorCode ierr;
160 
161   PetscFunctionBegin;
162   if (!options) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call PetscInitialize() first");
163   if (!options->namegiven) SETERRQ(PETSC_ERR_PLIB,"Unable to determine program name");
164   ierr = PetscStrncpy(name,options->programname,len);CHKERRQ(ierr);
165   PetscFunctionReturn(0);
166 }
167 
168 #undef __FUNCT__
169 #define __FUNCT__ "PetscSetProgramName"
170 PetscErrorCode PETSC_DLLEXPORT PetscSetProgramName(const char name[])
171 {
172   PetscErrorCode ierr;
173 
174   PetscFunctionBegin;
175   options->namegiven = PETSC_TRUE;
176   ierr  = PetscStrncpy(options->programname,name,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
177   PetscFunctionReturn(0);
178 }
179 
180 #undef __FUNCT__
181 #define __FUNCT__ "PetscOptionsValidKey"
182 PetscErrorCode PETSC_DLLEXPORT PetscOptionsValidKey(const char in_str[],PetscTruth *key)
183 {
184   PetscFunctionBegin;
185   *key = PETSC_FALSE;
186   if (!in_str) PetscFunctionReturn(0);
187   if (in_str[0] != '-') PetscFunctionReturn(0);
188   if ((in_str[1] < 'A') || (in_str[1] > 'z')) PetscFunctionReturn(0);
189   *key = PETSC_TRUE;
190   PetscFunctionReturn(0);
191 }
192 
193 #undef __FUNCT__
194 #define __FUNCT__ "PetscOptionsInsertString"
195 /*@C
196      PetscOptionsInsertString - Inserts options into the database from a string
197 
198      Not collective: but only processes that call this routine will set the options
199                      included in the file
200 
201   Input Parameter:
202 .   in_str - string that contains options separated by blanks
203 
204 
205   Level: intermediate
206 
207   Contributed by Boyana Norris
208 
209 .seealso: PetscOptionsSetValue(), PetscOptionsPrint(), PetscOptionsHasName(), PetscOptionsGetInt(),
210           PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsTruth(),
211           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
212           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
213           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
214           PetscOptionsList(), PetscOptionsEList(), PetscOptionsInsertFile()
215 
216 @*/
217 PetscErrorCode PETSC_DLLEXPORT PetscOptionsInsertString(const char in_str[])
218 {
219   char           *first,*second;
220   PetscErrorCode ierr;
221   PetscToken     token;
222   PetscTruth     key;
223 
224   PetscFunctionBegin;
225   ierr = PetscTokenCreate(in_str,' ',&token);CHKERRQ(ierr);
226   ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
227   while (first) {
228     ierr = PetscOptionsValidKey(first,&key);CHKERRQ(ierr);
229     if (key) {
230       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
231       ierr = PetscOptionsValidKey(second,&key);CHKERRQ(ierr);
232       if (!key) {
233         ierr = PetscOptionsSetValue(first,second);CHKERRQ(ierr);
234         ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
235       } else {
236         ierr  = PetscOptionsSetValue(first,PETSC_NULL);CHKERRQ(ierr);
237         first = second;
238       }
239     } else {
240       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
241     }
242   }
243   ierr = PetscTokenDestroy(token);CHKERRQ(ierr);
244   PetscFunctionReturn(0);
245 }
246 
247 #undef __FUNCT__
248 #define __FUNCT__ "PetscOptionsInsertFile"
249 /*@C
250      PetscOptionsInsertFile - Inserts options into the database from a file.
251 
252      Not collective: but only processes that call this routine will set the options
253                      included in the file
254 
255   Input Parameter:
256 .   file - name of file
257 
258 
259   Level: intermediate
260 
261 .seealso: PetscOptionsSetValue(), PetscOptionsPrint(), PetscOptionsHasName(), PetscOptionsGetInt(),
262           PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsTruth(),
263           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
264           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
265           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
266           PetscOptionsList(), PetscOptionsEList()
267 
268 @*/
269 PetscErrorCode PETSC_DLLEXPORT PetscOptionsInsertFile(const char file[])
270 {
271   char           string[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],*first,*second,*third;
272   PetscErrorCode ierr;
273   size_t         i,len;
274   FILE           *fd;
275   PetscToken     token;
276   int            err;
277   char           cmt[3]={'#','!','%'},*cmatch;
278 
279   PetscFunctionBegin;
280   ierr = PetscFixFilename(file,fname);CHKERRQ(ierr);
281   fd   = fopen(fname,"r");
282   if (fd) {
283     while (fgets(string,PETSC_MAX_PATH_LEN,fd)) {
284       /* eliminate comments from each line */
285       for (i=0; i<3; i++){
286         ierr = PetscStrchr(string,cmt[i],&cmatch);
287         if (cmatch) *cmatch = 0;
288       }
289       ierr = PetscStrlen(string,&len);CHKERRQ(ierr);
290       /* replace tabs, ^M, \n with " " */
291       for (i=0; i<len; i++) {
292         if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') {
293           string[i] = ' ';
294         }
295       }
296       ierr = PetscTokenCreate(string,' ',&token);CHKERRQ(ierr);
297       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
298       if (!first) {
299         goto destroy;
300       } else if (!first[0]) { /* if first token is empty spaces, redo first token */
301         ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
302       }
303       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
304       if (first[0] == '-') {
305         ierr = PetscOptionsSetValue(first,second);CHKERRQ(ierr);
306       } else {
307         PetscTruth match;
308 
309         ierr = PetscStrcasecmp(first,"alias",&match);CHKERRQ(ierr);
310         if (match) {
311           ierr = PetscTokenFind(token,&third);CHKERRQ(ierr);
312           if (!third) SETERRQ1(PETSC_ERR_ARG_WRONG,"Error in options file:alias missing (%s)",second);
313           ierr = PetscOptionsSetAlias(second,third);CHKERRQ(ierr);
314         }
315       }
316       destroy:
317       ierr = PetscTokenDestroy(token);CHKERRQ(ierr);
318     }
319     err = fclose(fd);
320     if (err) SETERRQ(PETSC_ERR_SYS,"fclose() failed on file");
321   } else {
322     SETERRQ1(PETSC_ERR_USER,"Unable to open Options File %s",fname);
323   }
324   PetscFunctionReturn(0);
325 }
326 
327 #undef __FUNCT__
328 #define __FUNCT__ "PetscOptionsInsert"
329 /*@C
330    PetscOptionsInsert - Inserts into the options database from the command line,
331                    the environmental variable and a file.
332 
333    Input Parameters:
334 +  argc - count of number of command line arguments
335 .  args - the command line arguments
336 -  file - optional filename, defaults to ~username/.petscrc
337 
338    Note:
339    Since PetscOptionsInsert() is automatically called by PetscInitialize(),
340    the user does not typically need to call this routine. PetscOptionsInsert()
341    can be called several times, adding additional entries into the database.
342 
343    Options Database Keys:
344 +   -options_monitor <optional filename> - print options names and values as they are set
345 
346    Level: advanced
347 
348    Concepts: options database^adding
349 
350 .seealso: PetscOptionsDestroy_Private(), PetscOptionsPrint(), PetscOptionsInsertString(), PetscOptionsInsertFile(),
351           PetscInitialize()
352 @*/
353 PetscErrorCode PETSC_DLLEXPORT PetscOptionsInsert(int *argc,char ***args,const char file[])
354 {
355   PetscErrorCode ierr;
356   PetscMPIInt    rank;
357   char           pfile[PETSC_MAX_PATH_LEN];
358   PetscTruth     flag;
359 
360   PetscFunctionBegin;
361   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
362 
363   options->argc     = (argc) ? *argc : 0;
364   options->args     = (args) ? *args : PETSC_NULL;
365 
366   if (file) {
367     ierr = PetscOptionsInsertFile(file);CHKERRQ(ierr);
368   }
369   ierr = PetscOptionsHasName(PETSC_NULL,"-skip_petscrc",&flag);CHKERRQ(ierr);
370   if (!flag) {
371     ierr = PetscGetHomeDirectory(pfile,PETSC_MAX_PATH_LEN-16);CHKERRQ(ierr);
372     if (pfile[0]) {
373       ierr = PetscStrcat(pfile,"/.petscrc");CHKERRQ(ierr);
374       ierr = PetscTestFile(pfile,'r',&flag);CHKERRQ(ierr);
375       if (flag) {
376 	ierr = PetscOptionsInsertFile(pfile);CHKERRQ(ierr);
377 	ierr = PetscInfo(0,"Loading ~/.petscrc\n");CHKERRQ(ierr);
378       }
379     }
380     ierr = PetscTestFile(".petscrc",'r',&flag);CHKERRQ(ierr);
381     if (flag) {
382       ierr = PetscOptionsInsertFile(".petscrc");CHKERRQ(ierr);
383       ierr = PetscInfo(0,"Loading local directory file .petscrc\n");CHKERRQ(ierr);
384     }
385   }
386 
387   /* insert environmental options */
388   {
389     char   *eoptions = 0;
390     size_t len = 0;
391     if (!rank) {
392       eoptions = (char*)getenv("PETSC_OPTIONS");
393       ierr     = PetscStrlen(eoptions,&len);CHKERRQ(ierr);
394       ierr     = MPI_Bcast(&len,1,MPI_INT,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
395     } else {
396       ierr = MPI_Bcast(&len,1,MPI_INT,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
397       if (len) {
398         ierr = PetscMalloc((len+1)*sizeof(char*),&eoptions);CHKERRQ(ierr);
399       }
400     }
401     if (len) {
402       ierr          = MPI_Bcast(eoptions,len,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
403       if (rank) eoptions[len] = 0;
404       ierr = PetscOptionsInsertString(eoptions);CHKERRQ(ierr);
405       if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);}
406     }
407   }
408 
409   /* insert command line options */
410   if (argc && args && *argc) {
411     int        left    = *argc - 1;
412     char       **eargs = *args + 1;
413     PetscTruth isoptions_file,isp4,tisp4,isp4yourname,isp4rmrank;
414 
415     while (left) {
416       ierr = PetscStrcasecmp(eargs[0],"-options_file",&isoptions_file);CHKERRQ(ierr);
417       ierr = PetscStrcasecmp(eargs[0],"-p4pg",&isp4);CHKERRQ(ierr);
418       ierr = PetscStrcasecmp(eargs[0],"-p4yourname",&isp4yourname);CHKERRQ(ierr);
419       ierr = PetscStrcasecmp(eargs[0],"-p4rmrank",&isp4rmrank);CHKERRQ(ierr);
420       ierr = PetscStrcasecmp(eargs[0],"-p4wd",&tisp4);CHKERRQ(ierr);
421       isp4 = (PetscTruth) (isp4 || tisp4);
422       ierr = PetscStrcasecmp(eargs[0],"-np",&tisp4);CHKERRQ(ierr);
423       isp4 = (PetscTruth) (isp4 || tisp4);
424       ierr = PetscStrcasecmp(eargs[0],"-p4amslave",&tisp4);CHKERRQ(ierr);
425 
426       if (eargs[0][0] != '-') {
427         eargs++; left--;
428       } else if (isoptions_file) {
429         if (left <= 1) SETERRQ(PETSC_ERR_USER,"Missing filename for -options_file filename option");
430         if (eargs[1][0] == '-') SETERRQ(PETSC_ERR_USER,"Missing filename for -options_file filename option");
431         ierr = PetscOptionsInsertFile(eargs[1]);CHKERRQ(ierr);
432         eargs += 2; left -= 2;
433 
434       /*
435          These are "bad" options that MPICH, etc put on the command line
436          we strip them out here.
437       */
438       } else if (tisp4 || isp4rmrank) {
439         eargs += 1; left -= 1;
440       } else if (isp4 || isp4yourname) {
441         eargs += 2; left -= 2;
442       } else if ((left < 2) || ((eargs[1][0] == '-') &&
443                ((eargs[1][1] > '9') || (eargs[1][1] < '0')))) {
444         ierr = PetscOptionsSetValue(eargs[0],PETSC_NULL);CHKERRQ(ierr);
445         eargs++; left--;
446       } else {
447         ierr = PetscOptionsSetValue(eargs[0],eargs[1]);CHKERRQ(ierr);
448         eargs += 2; left -= 2;
449       }
450     }
451   }
452   PetscFunctionReturn(0);
453 }
454 
455 #undef __FUNCT__
456 #define __FUNCT__ "PetscOptionsPrint"
457 /*@C
458    PetscOptionsPrint - Prints the options that have been loaded. This is
459    useful for debugging purposes.
460 
461    Collective on PETSC_COMM_WORLD
462 
463    Input Parameter:
464 .  FILE fd - location to print options (usually stdout or stderr)
465 
466    Options Database Key:
467 .  -optionstable - Activates PetscOptionsPrint() within PetscFinalize()
468 
469    Level: advanced
470 
471    Concepts: options database^printing
472 
473 .seealso: PetscOptionsAllUsed()
474 @*/
475 PetscErrorCode PETSC_DLLEXPORT PetscOptionsPrint(FILE *fd)
476 {
477   PetscErrorCode ierr;
478   PetscInt       i;
479 
480   PetscFunctionBegin;
481   if (!fd) fd = PETSC_STDOUT;
482   if (!options) {ierr = PetscOptionsInsert(0,0,0);CHKERRQ(ierr);}
483   for (i=0; i<options->N; i++) {
484     if (options->values[i]) {
485       ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"OptionTable: -%s %s\n",options->names[i],options->values[i]);CHKERRQ(ierr);
486     } else {
487       ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"OptionTable: -%s\n",options->names[i]);CHKERRQ(ierr);
488     }
489   }
490   PetscFunctionReturn(0);
491 }
492 
493 #undef __FUNCT__
494 #define __FUNCT__ "PetscOptionsGetAll"
495 /*@C
496    PetscOptionsGetAll - Lists all the options the program was run with in a single string.
497 
498    Not Collective
499 
500    Output Parameter:
501 .  copts - pointer where string pointer is stored
502 
503    Level: advanced
504 
505    Concepts: options database^listing
506 
507 .seealso: PetscOptionsAllUsed(), PetscOptionsPrint()
508 @*/
509 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetAll(char *copts[])
510 {
511   PetscErrorCode ierr;
512   PetscInt       i;
513   size_t         len = 1,lent;
514   char           *coptions;
515 
516   PetscFunctionBegin;
517   if (!options) {ierr = PetscOptionsInsert(0,0,0);CHKERRQ(ierr);}
518 
519   /* count the length of the required string */
520   for (i=0; i<options->N; i++) {
521     ierr = PetscStrlen(options->names[i],&lent);CHKERRQ(ierr);
522     len += 2 + lent;
523     if (options->values[i]) {
524       ierr = PetscStrlen(options->values[i],&lent);CHKERRQ(ierr);
525       len += 1 + lent;
526     }
527   }
528   ierr = PetscMalloc(len*sizeof(char),&coptions);CHKERRQ(ierr);
529   coptions[0] = 0;
530   for (i=0; i<options->N; i++) {
531     ierr = PetscStrcat(coptions,"-");CHKERRQ(ierr);
532     ierr = PetscStrcat(coptions,options->names[i]);CHKERRQ(ierr);
533     ierr = PetscStrcat(coptions," ");CHKERRQ(ierr);
534     if (options->values[i]) {
535       ierr = PetscStrcat(coptions,options->values[i]);CHKERRQ(ierr);
536       ierr = PetscStrcat(coptions," ");CHKERRQ(ierr);
537     }
538   }
539   *copts = coptions;
540   PetscFunctionReturn(0);
541 }
542 
543 #undef __FUNCT__
544 #define __FUNCT__ "PetscOptionsDestroy"
545 /*@C
546     PetscOptionsDestroy - Destroys the option database.
547 
548     Note:
549     Since PetscOptionsDestroy() is called by PetscFinalize(), the user
550     typically does not need to call this routine.
551 
552    Level: developer
553 
554 .seealso: PetscOptionsInsert()
555 @*/
556 PetscErrorCode PETSC_DLLEXPORT PetscOptionsDestroy(void)
557 {
558   PetscInt i;
559 
560   PetscFunctionBegin;
561   if (!options) PetscFunctionReturn(0);
562   for (i=0; i<options->N; i++) {
563     if (options->names[i]) free(options->names[i]);
564     if (options->values[i]) free(options->values[i]);
565   }
566   for (i=0; i<options->Naliases; i++) {
567     free(options->aliases1[i]);
568     free(options->aliases2[i]);
569   }
570   free(options);
571   options = 0;
572   PetscFunctionReturn(0);
573 }
574 
575 #undef __FUNCT__
576 #define __FUNCT__ "PetscOptionsSetValue"
577 /*@C
578    PetscOptionsSetValue - Sets an option name-value pair in the options
579    database, overriding whatever is already present.
580 
581    Not collective, but setting values on certain processors could cause problems
582    for parallel objects looking for options.
583 
584    Input Parameters:
585 +  name - name of option, this SHOULD have the - prepended
586 -  value - the option value (not used for all options)
587 
588    Level: intermediate
589 
590    Note:
591    Only some options have values associated with them, such as
592    -ksp_rtol tol.  Other options stand alone, such as -ksp_monitor.
593 
594   Concepts: options database^adding option
595 
596 .seealso: PetscOptionsInsert()
597 @*/
598 PetscErrorCode PETSC_DLLEXPORT PetscOptionsSetValue(const char iname[],const char value[])
599 {
600   size_t         len;
601   PetscErrorCode ierr;
602   PetscInt       N,n,i;
603   char           **names;
604   const char     *name = (char*)iname;
605   PetscTruth     gt,match;
606 
607   PetscFunctionBegin;
608   if (!options) {ierr = PetscOptionsInsert(0,0,0);CHKERRQ(ierr);}
609 
610   /* this is so that -h and -help are equivalent (p4 does not like -help)*/
611   ierr = PetscStrcasecmp(name,"-h",&match);CHKERRQ(ierr);
612   if (match) name = "-help";
613 
614   name++;
615   /* first check against aliases */
616   N = options->Naliases;
617   for (i=0; i<N; i++) {
618     ierr = PetscStrcasecmp(options->aliases1[i],name,&match);CHKERRQ(ierr);
619     if (match) {
620       name = options->aliases2[i];
621       break;
622     }
623   }
624 
625   N     = options->N;
626   n     = N;
627   names = options->names;
628 
629   for (i=0; i<N; i++) {
630     ierr = PetscStrcasecmp(names[i],name,&match);CHKERRQ(ierr);
631     ierr  = PetscStrgrt(names[i],name,&gt);CHKERRQ(ierr);
632     if (match) {
633       if (options->values[i]) free(options->values[i]);
634       ierr = PetscStrlen(value,&len);CHKERRQ(ierr);
635       if (len) {
636         options->values[i] = (char*)malloc((len+1)*sizeof(char));
637         ierr = PetscStrcpy(options->values[i],value);CHKERRQ(ierr);
638       } else { options->values[i] = 0;}
639       PetscOptionsMonitor(name,value);
640       PetscFunctionReturn(0);
641     } else if (gt) {
642       n = i;
643       break;
644     }
645   }
646   if (N >= MAXOPTIONS) {
647     SETERRQ1(PETSC_ERR_PLIB,"No more room in option table, limit %d recompile \n src/sys/objects/options.c with larger value for MAXOPTIONS\n",MAXOPTIONS);
648   }
649   /* shift remaining values down 1 */
650   for (i=N; i>n; i--) {
651     names[i]           = names[i-1];
652     options->values[i] = options->values[i-1];
653     options->used[i]   = options->used[i-1];
654   }
655   /* insert new name and value */
656   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
657   names[n] = (char*)malloc((len+1)*sizeof(char));
658   ierr = PetscStrcpy(names[n],name);CHKERRQ(ierr);
659   if (value) {
660     ierr = PetscStrlen(value,&len);CHKERRQ(ierr);
661     options->values[n] = (char*)malloc((len+1)*sizeof(char));
662     ierr = PetscStrcpy(options->values[n],value);CHKERRQ(ierr);
663   } else {options->values[n] = 0;}
664   options->used[n] = PETSC_FALSE;
665   options->N++;
666   PetscOptionsMonitor(name,value);
667   PetscFunctionReturn(0);
668 }
669 
670 #undef __FUNCT__
671 #define __FUNCT__ "PetscOptionsClearValue"
672 /*@C
673    PetscOptionsClearValue - Clears an option name-value pair in the options
674    database, overriding whatever is already present.
675 
676    Not Collective, but setting values on certain processors could cause problems
677    for parallel objects looking for options.
678 
679    Input Parameter:
680 .  name - name of option, this SHOULD have the - prepended
681 
682    Level: intermediate
683 
684    Concepts: options database^removing option
685 .seealso: PetscOptionsInsert()
686 @*/
687 PetscErrorCode PETSC_DLLEXPORT PetscOptionsClearValue(const char iname[])
688 {
689   PetscErrorCode ierr;
690   PetscInt       N,n,i;
691   char           **names,*name=(char*)iname;
692   PetscTruth     gt,match;
693 
694   PetscFunctionBegin;
695   if (name[0] != '-') SETERRQ1(PETSC_ERR_ARG_WRONG,"Name must begin with -: Instead %s",name);
696   if (!options) {ierr = PetscOptionsInsert(0,0,0);CHKERRQ(ierr);}
697 
698   name++;
699 
700   N     = options->N; n = 0;
701   names = options->names;
702 
703   for (i=0; i<N; i++) {
704     ierr  = PetscStrcasecmp(names[i],name,&match);CHKERRQ(ierr);
705     ierr  = PetscStrgrt(names[i],name,&gt);CHKERRQ(ierr);
706     if (match) {
707       if (options->values[i]) free(options->values[i]);
708       PetscOptionsMonitor(name,"");
709       break;
710     } else if (gt) {
711       PetscFunctionReturn(0); /* it was not listed */
712     }
713     n++;
714   }
715   if (n == N) PetscFunctionReturn(0); /* it was not listed */
716 
717   /* shift remaining values down 1 */
718   for (i=n; i<N-1; i++) {
719     names[i]           = names[i+1];
720     options->values[i] = options->values[i+1];
721     options->used[i]   = options->used[i+1];
722   }
723   options->N--;
724   PetscFunctionReturn(0);
725 }
726 
727 #undef __FUNCT__
728 #define __FUNCT__ "PetscOptionsSetAlias"
729 /*@C
730    PetscOptionsReject - Generates an error if a certain option is given.
731 
732    Not Collective, but setting values on certain processors could cause problems
733    for parallel objects looking for options.
734 
735    Input Parameters:
736 +  name - the option one is seeking
737 -  mess - error message (may be PETSC_NULL)
738 
739    Level: advanced
740 
741    Concepts: options database^rejecting option
742 
743 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(),
744            PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsTruth(),
745           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
746           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
747           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
748           PetscOptionsList(), PetscOptionsEList()
749 @*/
750 PetscErrorCode PETSC_DLLEXPORT PetscOptionsSetAlias(const char inewname[],const char ioldname[])
751 {
752   PetscErrorCode ierr;
753   PetscInt       n = options->Naliases;
754   size_t         len;
755   char           *newname = (char *)inewname,*oldname = (char*)ioldname;
756 
757   PetscFunctionBegin;
758   if (newname[0] != '-') SETERRQ1(PETSC_ERR_ARG_WRONG,"aliased must have -: Instead %s",newname);
759   if (oldname[0] != '-') SETERRQ1(PETSC_ERR_ARG_WRONG,"aliasee must have -: Instead %s",oldname);
760   if (n >= MAXALIASES) {
761     SETERRQ1(PETSC_ERR_MEM,"You have defined to many PETSc options aliases, limit %d recompile \n  src/sys/objects/options.c with larger value for MAXALIASES",MAXALIASES);
762   }
763 
764   newname++; oldname++;
765   ierr = PetscStrlen(newname,&len);CHKERRQ(ierr);
766   options->aliases1[n] = (char*)malloc((len+1)*sizeof(char));
767   ierr = PetscStrcpy(options->aliases1[n],newname);CHKERRQ(ierr);
768   ierr = PetscStrlen(oldname,&len);CHKERRQ(ierr);
769   options->aliases2[n] = (char*)malloc((len+1)*sizeof(char));
770   ierr = PetscStrcpy(options->aliases2[n],oldname);CHKERRQ(ierr);
771   options->Naliases++;
772   PetscFunctionReturn(0);
773 }
774 
775 #undef __FUNCT__
776 #define __FUNCT__ "PetscOptionsFindPair_Private"
777 static PetscErrorCode PetscOptionsFindPair_Private(const char pre[],const char name[],char *value[],PetscTruth *flg)
778 {
779   PetscErrorCode ierr;
780   PetscInt       i,N;
781   size_t         len;
782   char           **names,tmp[256];
783   PetscTruth     match;
784 
785   PetscFunctionBegin;
786   if (!options) {ierr = PetscOptionsInsert(0,0,0);CHKERRQ(ierr);}
787   N = options->N;
788   names = options->names;
789 
790   if (name[0] != '-') SETERRQ1(PETSC_ERR_ARG_WRONG,"Name must begin with -: Instead %s",name);
791 
792   /* append prefix to name */
793   if (pre) {
794     if (pre[0] == '-') SETERRQ(PETSC_ERR_ARG_WRONG,"Prefix should not begin with a -");
795     ierr = PetscStrncpy(tmp,pre,256);CHKERRQ(ierr);
796     ierr = PetscStrlen(tmp,&len);CHKERRQ(ierr);
797     ierr = PetscStrncat(tmp,name+1,256-len-1);CHKERRQ(ierr);
798   } else {
799     ierr = PetscStrncpy(tmp,name+1,256);CHKERRQ(ierr);
800   }
801 
802   /* slow search */
803   *flg = PETSC_FALSE;
804   for (i=0; i<N; i++) {
805     ierr = PetscStrcasecmp(names[i],tmp,&match);CHKERRQ(ierr);
806     if (match) {
807        *value           = options->values[i];
808        options->used[i] = PETSC_TRUE;
809        *flg             = PETSC_TRUE;
810        break;
811      }
812   }
813   if (!*flg) {
814     PetscInt j,cnt = 0,locs[16],loce[16];
815     size_t   n;
816     ierr = PetscStrlen(tmp,&n);CHKERRQ(ierr);
817     /* determine the location and number of all _%d_ in the key */
818     for (i=0; i< (PetscInt)n; i++) {
819       if (tmp[i] == '_') {
820         for (j=i+1; j< (PetscInt)n; j++) {
821           if (tmp[j] >= '0' && tmp[j] <= '9') continue;
822           if (tmp[j] == '_' && j > i+1) { /* found a number */
823             locs[cnt]   = i+1;
824             loce[cnt++] = j+1;
825           }
826           break;
827         }
828       }
829     }
830     if (cnt) {
831       char tmp2[256];
832       for (i=0; i<cnt; i++) {
833         ierr = PetscStrcpy(tmp2,"-");CHKERRQ(ierr);
834         ierr = PetscStrncat(tmp2,tmp,locs[i]);CHKERRQ(ierr);
835         ierr = PetscStrcat(tmp2,tmp+loce[i]);CHKERRQ(ierr);
836         ierr = PetscOptionsFindPair_Private(PETSC_NULL,tmp2,value,flg);CHKERRQ(ierr);
837         if (*flg) break;
838       }
839     }
840   }
841   PetscFunctionReturn(0);
842 }
843 
844 #undef __FUNCT__
845 #define __FUNCT__ "PetscOptionsReject"
846 /*@C
847    PetscOptionsReject - Generates an error if a certain option is given.
848 
849    Not Collective, but setting values on certain processors could cause problems
850    for parallel objects looking for options.
851 
852    Input Parameters:
853 +  name - the option one is seeking
854 -  mess - error message (may be PETSC_NULL)
855 
856    Level: advanced
857 
858    Concepts: options database^rejecting option
859 
860 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(),
861            PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(),
862           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
863           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
864           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
865           PetscOptionsList(), PetscOptionsEList()
866 @*/
867 PetscErrorCode PETSC_DLLEXPORT PetscOptionsReject(const char name[],const char mess[])
868 {
869   PetscErrorCode ierr;
870   PetscTruth     flag;
871 
872   PetscFunctionBegin;
873   ierr = PetscOptionsHasName(PETSC_NULL,name,&flag);CHKERRQ(ierr);
874   if (flag) {
875     if (mess) {
876       SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: %s with %s",name,mess);
877     } else {
878       SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: %s",name);
879     }
880   }
881   PetscFunctionReturn(0);
882 }
883 
884 #undef __FUNCT__
885 #define __FUNCT__ "PetscOptionsHasName"
886 /*@C
887    PetscOptionsHasName - Determines whether a certain option is given in the database.
888 
889    Not Collective
890 
891    Input Parameters:
892 +  name - the option one is seeking
893 -  pre - string to prepend to the name or PETSC_NULL
894 
895    Output Parameters:
896 .  flg - PETSC_TRUE if found else PETSC_FALSE.
897 
898    Level: beginner
899 
900    Concepts: options database^has option name
901 
902    Notes: Name cannot be simply -h
903 
904 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
905            PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(),
906           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
907           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
908           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
909           PetscOptionsList(), PetscOptionsEList()
910 @*/
911 PetscErrorCode PETSC_DLLEXPORT PetscOptionsHasName(const char pre[],const char name[],PetscTruth *flg)
912 {
913   char           *value;
914   PetscErrorCode ierr;
915   PetscTruth     isfalse,flag;
916 
917   PetscFunctionBegin;
918   ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr);
919 
920   /* remove if turned off */
921   if (flag) {
922     ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr);
923     if (isfalse) flag = PETSC_FALSE;
924     ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr);
925     if (isfalse) flag = PETSC_FALSE;
926     ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr);
927     if (isfalse) flag = PETSC_FALSE;
928   }
929   if (flg) *flg = flag;
930   PetscFunctionReturn(0);
931 }
932 
933 #undef __FUNCT__
934 #define __FUNCT__ "PetscOptionsGetInt"
935 /*@C
936    PetscOptionsGetInt - Gets the integer value for a particular option in the database.
937 
938    Not Collective
939 
940    Input Parameters:
941 +  pre - the string to prepend to the name or PETSC_NULL
942 -  name - the option one is seeking
943 
944    Output Parameter:
945 +  ivalue - the integer value to return
946 -  flg - PETSC_TRUE if found, else PETSC_FALSE
947 
948    Level: beginner
949 
950    Concepts: options database^has int
951 
952 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
953           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth()
954           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(),
955           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
956           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
957           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
958           PetscOptionsList(), PetscOptionsEList()
959 @*/
960 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetInt(const char pre[],const char name[],PetscInt *ivalue,PetscTruth *flg)
961 {
962   char           *value;
963   PetscErrorCode ierr;
964   PetscTruth     flag;
965 
966   PetscFunctionBegin;
967   PetscValidCharPointer(name,2);
968   PetscValidIntPointer(ivalue,3);
969   ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr);
970   if (flag) {
971     if (!value) {if (flg) *flg = PETSC_FALSE;}
972     else {
973       if (flg) *flg = PETSC_TRUE;
974       ierr = PetscOptionsAtoi(value,ivalue);CHKERRQ(ierr);
975     }
976   } else {
977     if (flg) *flg = PETSC_FALSE;
978   }
979   PetscFunctionReturn(0);
980 }
981 
982 #undef __FUNCT__
983 #define __FUNCT__ "PetscOptionsGetEList"
984 /*@C
985      PetscOptionsGetEList - Puts a list of option values that a single one may be selected from
986 
987    Not Collective
988 
989    Input Parameters:
990 +  pre - the string to prepend to the name or PETSC_NULL
991 .  opt - option name
992 .  list - the possible choices
993 .  ntext - number of choices
994 
995    Output Parameter:
996 +  value - the index of the value to return
997 -  set - PETSC_TRUE if found, else PETSC_FALSE
998 
999    Level: intermediate
1000 
1001    See PetscOptionsList() for when the choices are given in a PetscFList()
1002 
1003    Concepts: options database^list
1004 
1005 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1006            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(),
1007           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1008           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1009           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
1010           PetscOptionsList(), PetscOptionsEList()
1011 @*/
1012 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetEList(const char pre[],const char opt[],const char **list,PetscInt ntext,PetscInt *value,PetscTruth *set)
1013 {
1014   PetscErrorCode ierr;
1015   size_t         alen,len = 0;
1016   char           *svalue;
1017   PetscTruth     aset,flg = PETSC_FALSE;
1018   PetscInt       i;
1019 
1020   PetscFunctionBegin;
1021   for ( i=0; i<ntext; i++) {
1022     ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr);
1023     if (alen > len) len = alen;
1024   }
1025   len += 5; /* a little extra space for user mistypes */
1026   ierr = PetscMalloc(len*sizeof(char),&svalue);CHKERRQ(ierr);
1027   ierr = PetscOptionsGetString(pre,opt,svalue,len,&aset);CHKERRQ(ierr);
1028   if (aset) {
1029     if (set) *set = PETSC_TRUE;
1030     for (i=0; i<ntext; i++) {
1031       ierr = PetscStrcasecmp(svalue,list[i],&flg);CHKERRQ(ierr);
1032       if (flg) {
1033         *value = i;
1034         break;
1035       }
1036     }
1037     if (!flg) SETERRQ3(PETSC_ERR_USER,"Unknown option %s for -%s%s",svalue,pre?pre:"",opt+1);
1038   } else if (set) {
1039     *set = PETSC_FALSE;
1040   }
1041   ierr = PetscFree(svalue);CHKERRQ(ierr);
1042   PetscFunctionReturn(0);
1043 }
1044 
1045 #undef __FUNCT__
1046 #define __FUNCT__ "PetscOptionsEnum"
1047 /*@C
1048    PetscOptionsGetEnum - Gets the enum value for a particular option in the database.
1049 
1050    Not Collective
1051 
1052    Input Parameters:
1053 +  pre - option prefix or PETSC_NULL
1054 .  opt - option name
1055 .  list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
1056 -  defaultv - the default (current) value
1057 
1058    Output Parameter:
1059 +  value - the  value to return
1060 -  flg - PETSC_TRUE if found, else PETSC_FALSE
1061 
1062    Level: beginner
1063 
1064    Concepts: options database
1065 
1066    Notes: Must be between a PetscOptionsBegin() and a PetscOptionsEnd()
1067 
1068           list is usually something like PCASMTypes or some other predefined list of enum names
1069 
1070 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
1071           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth()
1072           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsTruth(),
1073           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1074           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1075           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
1076           PetscOptionsList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum()
1077 @*/
1078 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetEnum(const char pre[],const char opt[],const char **list,PetscEnum *value,PetscTruth *set)
1079 {
1080   PetscErrorCode ierr;
1081   PetscInt       ntext = 0;
1082 
1083   PetscFunctionBegin;
1084   while (list[ntext++]) {
1085     if (ntext > 50) SETERRQ(PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries");
1086   }
1087   if (ntext < 3) SETERRQ(PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix");
1088   ntext -= 3;
1089   ierr = PetscOptionsGetEList(pre,opt,list,ntext,(PetscInt*)value,set);CHKERRQ(ierr);
1090   PetscFunctionReturn(0);
1091 }
1092 
1093 #undef __FUNCT__
1094 #define __FUNCT__ "PetscOptionsGetTruth"
1095 /*@C
1096    PetscOptionsGetTruth - Gets the Logical (true or false) value for a particular
1097             option in the database.
1098 
1099    Not Collective
1100 
1101    Input Parameters:
1102 +  pre - the string to prepend to the name or PETSC_NULL
1103 -  name - the option one is seeking
1104 
1105    Output Parameter:
1106 +  ivalue - the logical value to return
1107 -  flg - PETSC_TRUE  if found, else PETSC_FALSE
1108 
1109    Level: beginner
1110 
1111    Notes:
1112        TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE
1113        FALSE, false, NO, no, and 0 all translate to PETSC_FALSE
1114 
1115    Concepts: options database^has logical
1116 
1117 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
1118           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsTruth(),
1119           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1120           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1121           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
1122           PetscOptionsList(), PetscOptionsEList()
1123 @*/
1124 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetTruth(const char pre[],const char name[],PetscTruth *ivalue,PetscTruth *flg)
1125 {
1126   char           *value;
1127   PetscTruth     flag,istrue,isfalse;
1128   PetscErrorCode ierr;
1129 
1130   PetscFunctionBegin;
1131   PetscValidCharPointer(name,2);
1132   PetscValidIntPointer(ivalue,3);
1133   ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr);
1134   if (flag) {
1135     if (flg) *flg = PETSC_TRUE;
1136     if (!value) {
1137       *ivalue = PETSC_TRUE;
1138     } else {
1139       *ivalue = PETSC_TRUE;
1140       ierr = PetscStrcasecmp(value,"TRUE",&istrue);CHKERRQ(ierr);
1141       if (istrue) PetscFunctionReturn(0);
1142       ierr = PetscStrcasecmp(value,"YES",&istrue);CHKERRQ(ierr);
1143       if (istrue) PetscFunctionReturn(0);
1144       ierr = PetscStrcasecmp(value,"1",&istrue);CHKERRQ(ierr);
1145       if (istrue) PetscFunctionReturn(0);
1146       ierr = PetscStrcasecmp(value,"on",&istrue);CHKERRQ(ierr);
1147       if (istrue) PetscFunctionReturn(0);
1148 
1149       *ivalue = PETSC_FALSE;
1150       ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr);
1151       if (isfalse) PetscFunctionReturn(0);
1152       ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr);
1153       if (isfalse) PetscFunctionReturn(0);
1154       ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr);
1155       if (isfalse) PetscFunctionReturn(0);
1156       ierr = PetscStrcasecmp(value,"off",&isfalse);CHKERRQ(ierr);
1157       if (isfalse) PetscFunctionReturn(0);
1158 
1159       SETERRQ1(PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value);
1160     }
1161   } else {
1162     if (flg) *flg = PETSC_FALSE;
1163   }
1164   PetscFunctionReturn(0);
1165 }
1166 
1167 #undef __FUNCT__
1168 #define __FUNCT__ "PetscOptionsGetReal"
1169 /*@C
1170    PetscOptionsGetReal - Gets the double precision value for a particular
1171    option in the database.
1172 
1173    Not Collective
1174 
1175    Input Parameters:
1176 +  pre - string to prepend to each name or PETSC_NULL
1177 -  name - the option one is seeking
1178 
1179    Output Parameter:
1180 +  dvalue - the double value to return
1181 -  flg - PETSC_TRUE if found, PETSC_FALSE if not found
1182 
1183    Level: beginner
1184 
1185    Concepts: options database^has double
1186 
1187 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
1188            PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsTruth(),
1189           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1190           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1191           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
1192           PetscOptionsList(), PetscOptionsEList()
1193 @*/
1194 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetReal(const char pre[],const char name[],PetscReal *dvalue,PetscTruth *flg)
1195 {
1196   char           *value;
1197   PetscErrorCode ierr;
1198   PetscTruth     flag;
1199 
1200   PetscFunctionBegin;
1201   PetscValidCharPointer(name,2);
1202   PetscValidDoublePointer(dvalue,3);
1203   ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr);
1204   if (flag) {
1205     if (!value) {if (flg) *flg = PETSC_FALSE;}
1206     else        {if (flg) *flg = PETSC_TRUE; ierr = PetscOptionsAtod(value,dvalue);CHKERRQ(ierr);}
1207   } else {
1208     if (flg) *flg = PETSC_FALSE;
1209   }
1210   PetscFunctionReturn(0);
1211 }
1212 
1213 #undef __FUNCT__
1214 #define __FUNCT__ "PetscOptionsGetScalar"
1215 /*@C
1216    PetscOptionsGetScalar - Gets the scalar value for a particular
1217    option in the database.
1218 
1219    Not Collective
1220 
1221    Input Parameters:
1222 +  pre - string to prepend to each name or PETSC_NULL
1223 -  name - the option one is seeking
1224 
1225    Output Parameter:
1226 +  dvalue - the double value to return
1227 -  flg - PETSC_TRUE if found, else PETSC_FALSE
1228 
1229    Level: beginner
1230 
1231    Usage:
1232    A complex number 2+3i can be specified as 2,3 at the command line.
1233    or a number 2.0e-10 - 3.3e-20 i  can be specified as 2.0e-10,3.3e-20
1234 
1235    Concepts: options database^has scalar
1236 
1237 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
1238            PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(),
1239           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1240           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1241           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
1242           PetscOptionsList(), PetscOptionsEList()
1243 @*/
1244 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetScalar(const char pre[],const char name[],PetscScalar *dvalue,PetscTruth *flg)
1245 {
1246   char           *value;
1247   PetscTruth     flag;
1248   PetscErrorCode ierr;
1249 
1250   PetscFunctionBegin;
1251   PetscValidCharPointer(name,2);
1252   PetscValidScalarPointer(dvalue,3);
1253   ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr);
1254   if (flag) {
1255     if (!value) {
1256       if (flg) *flg = PETSC_FALSE;
1257     } else {
1258 #if !defined(PETSC_USE_COMPLEX)
1259       ierr = PetscOptionsAtod(value,dvalue);CHKERRQ(ierr);
1260 #else
1261       PetscReal  re=0.0,im=0.0;
1262       PetscToken token;
1263       char       *tvalue = 0;
1264 
1265       ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr);
1266       ierr = PetscTokenFind(token,&tvalue);CHKERRQ(ierr);
1267       if (!tvalue) { SETERRQ(PETSC_ERR_ARG_WRONG,"unknown string specified\n"); }
1268       ierr    = PetscOptionsAtod(tvalue,&re);CHKERRQ(ierr);
1269       ierr    = PetscTokenFind(token,&tvalue);CHKERRQ(ierr);
1270       if (!tvalue) { /* Unknown separator used. using only real value */
1271         *dvalue = re;
1272       } else {
1273         ierr    = PetscOptionsAtod(tvalue,&im);CHKERRQ(ierr);
1274         *dvalue = re + PETSC_i*im;
1275       }
1276       ierr    = PetscTokenDestroy(token);CHKERRQ(ierr);
1277 #endif
1278       if (flg) *flg    = PETSC_TRUE;
1279     }
1280   } else { /* flag */
1281     if (flg) *flg = PETSC_FALSE;
1282   }
1283   PetscFunctionReturn(0);
1284 }
1285 
1286 #undef __FUNCT__
1287 #define __FUNCT__ "PetscOptionsGetRealArray"
1288 /*@C
1289    PetscOptionsGetRealArray - Gets an array of double precision values for a
1290    particular option in the database.  The values must be separated with
1291    commas with no intervening spaces.
1292 
1293    Not Collective
1294 
1295    Input Parameters:
1296 +  pre - string to prepend to each name or PETSC_NULL
1297 .  name - the option one is seeking
1298 -  nmax - maximum number of values to retrieve
1299 
1300    Output Parameters:
1301 +  dvalue - the double value to return
1302 .  nmax - actual number of values retreived
1303 -  flg - PETSC_TRUE if found, else PETSC_FALSE
1304 
1305    Level: beginner
1306 
1307    Concepts: options database^array of doubles
1308 
1309 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
1310            PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsTruth(),
1311           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1312           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1313           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
1314           PetscOptionsList(), PetscOptionsEList()
1315 @*/
1316 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetRealArray(const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscTruth *flg)
1317 {
1318   char           *value;
1319   PetscErrorCode ierr;
1320   PetscInt       n = 0;
1321   PetscTruth     flag;
1322   PetscToken     token;
1323 
1324   PetscFunctionBegin;
1325   PetscValidCharPointer(name,2);
1326   PetscValidDoublePointer(dvalue,3);
1327   ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr);
1328   if (!flag)  {if (flg) *flg = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
1329   if (!value) {if (flg) *flg = PETSC_TRUE; *nmax = 0; PetscFunctionReturn(0);}
1330 
1331   if (flg) *flg = PETSC_TRUE;
1332 
1333   ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr);
1334   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
1335   while (n < *nmax) {
1336     if (!value) break;
1337     ierr = PetscOptionsAtod(value,dvalue++);CHKERRQ(ierr);
1338     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
1339     n++;
1340   }
1341   ierr = PetscTokenDestroy(token);CHKERRQ(ierr);
1342   *nmax = n;
1343   PetscFunctionReturn(0);
1344 }
1345 
1346 #undef __FUNCT__
1347 #define __FUNCT__ "PetscOptionsGetIntArray"
1348 /*@C
1349    PetscOptionsGetIntArray - Gets an array of integer values for a particular
1350    option in the database.  The values must be separated with commas with
1351    no intervening spaces.
1352 
1353    Not Collective
1354 
1355    Input Parameters:
1356 +  pre - string to prepend to each name or PETSC_NULL
1357 .  name - the option one is seeking
1358 -  nmax - maximum number of values to retrieve
1359 
1360    Output Parameter:
1361 +  dvalue - the integer values to return
1362 .  nmax - actual number of values retreived
1363 -  flg - PETSC_TRUE if found, else PETSC_FALSE
1364 
1365    Level: beginner
1366 
1367    Concepts: options database^array of ints
1368 
1369 .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
1370            PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsTruth(),
1371           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1372           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1373           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
1374           PetscOptionsList(), PetscOptionsEList()
1375 @*/
1376 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetIntArray(const char pre[],const char name[],PetscInt dvalue[],PetscInt *nmax,PetscTruth *flg)
1377 {
1378   char           *value;
1379   PetscErrorCode ierr;
1380   PetscInt       n = 0,i,start,end;
1381   size_t         len;
1382   PetscTruth     flag,foundrange;
1383   PetscToken     token;
1384 
1385   PetscFunctionBegin;
1386   PetscValidCharPointer(name,2);
1387   PetscValidIntPointer(dvalue,3);
1388   ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr);
1389   if (!flag)  {if (flg) *flg = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
1390   if (!value) {if (flg) *flg = PETSC_TRUE; *nmax = 0; PetscFunctionReturn(0);}
1391 
1392   if (flg) *flg = PETSC_TRUE;
1393 
1394   ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr);
1395   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
1396   while (n < *nmax) {
1397     if (!value) break;
1398 
1399     /* look for form  d-D where d and D are integers */
1400     foundrange = PETSC_FALSE;
1401     ierr      = PetscStrlen(value,&len);CHKERRQ(ierr);
1402     if (value[0] == '-') i=2;
1403     else i=1;
1404     for (;i<(int)len; i++) {
1405       if (value[i] == '-') {
1406         if (i == (int)len-1) SETERRQ2(PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value);
1407         value[i] = 0;
1408         ierr     = PetscOptionsAtoi(value,&start);CHKERRQ(ierr);
1409         ierr     = PetscOptionsAtoi(value+i+1,&end);CHKERRQ(ierr);
1410         if (end <= start) SETERRQ3(PETSC_ERR_USER,"Error in %D-th array entry, %s-%s cannot have decreasing list",n,value,value+i+1);
1411         if (n + end - start - 1 >= *nmax) SETERRQ4(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);
1412         for (;start<end; start++) {
1413           *dvalue = start; dvalue++;n++;
1414         }
1415         foundrange = PETSC_TRUE;
1416         break;
1417       }
1418     }
1419     if (!foundrange) {
1420       ierr      = PetscOptionsAtoi(value,dvalue);CHKERRQ(ierr);
1421       dvalue++;
1422       n++;
1423     }
1424     ierr      = PetscTokenFind(token,&value);CHKERRQ(ierr);
1425   }
1426   ierr      = PetscTokenDestroy(token);CHKERRQ(ierr);
1427   *nmax = n;
1428   PetscFunctionReturn(0);
1429 }
1430 
1431 #undef __FUNCT__
1432 #define __FUNCT__ "PetscOptionsGetString"
1433 /*@C
1434    PetscOptionsGetString - Gets the string value for a particular option in
1435    the database.
1436 
1437    Not Collective
1438 
1439    Input Parameters:
1440 +  pre - string to prepend to name or PETSC_NULL
1441 .  name - the option one is seeking
1442 -  len - maximum string length
1443 
1444    Output Parameters:
1445 +  string - location to copy string
1446 -  flg - PETSC_TRUE if found, else PETSC_FALSE
1447 
1448    Level: beginner
1449 
1450    Fortran Note:
1451    The Fortran interface is slightly different from the C/C++
1452    interface (len is not used).  Sample usage in Fortran follows
1453 .vb
1454       character *20 string
1455       integer   flg, ierr
1456       call PetscOptionsGetString(PETSC_NULL_CHARACTER,'-s',string,flg,ierr)
1457 .ve
1458 
1459    Concepts: options database^string
1460 
1461 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1462            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(),
1463           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1464           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1465           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
1466           PetscOptionsList(), PetscOptionsEList()
1467 @*/
1468 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetString(const char pre[],const char name[],char string[],size_t len,PetscTruth *flg)
1469 {
1470   char           *value;
1471   PetscErrorCode ierr;
1472   PetscTruth     flag;
1473 
1474   PetscFunctionBegin;
1475   PetscValidCharPointer(name,2);
1476   PetscValidCharPointer(string,3);
1477   ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr);
1478   if (!flag) {
1479     if (flg) *flg = PETSC_FALSE;
1480   } else {
1481     if (flg) *flg = PETSC_TRUE;
1482     if (value) {
1483       ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr);
1484     } else {
1485       ierr = PetscMemzero(string,len);CHKERRQ(ierr);
1486     }
1487   }
1488   PetscFunctionReturn(0);
1489 }
1490 
1491 #undef __FUNCT__
1492 #define __FUNCT__ "PetscOptionsGetStringArray"
1493 /*@C
1494    PetscOptionsGetStringArray - Gets an array of string values for a particular
1495    option in the database. The values must be separated with commas with
1496    no intervening spaces.
1497 
1498    Not Collective
1499 
1500    Input Parameters:
1501 +  pre - string to prepend to name or PETSC_NULL
1502 .  name - the option one is seeking
1503 -  nmax - maximum number of strings
1504 
1505    Output Parameter:
1506 +  strings - location to copy strings
1507 -  flg - PETSC_TRUE if found, else PETSC_FALSE
1508 
1509    Level: beginner
1510 
1511    Notes:
1512    The user should pass in an array of pointers to char, to hold all the
1513    strings returned by this function.
1514 
1515    The user is responsible for deallocating the strings that are
1516    returned. The Fortran interface for this routine is not supported.
1517 
1518    Contributed by Matthew Knepley.
1519 
1520    Concepts: options database^array of strings
1521 
1522 .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1523            PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsTruth(),
1524           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1525           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1526           PetscOptionsTruthGroupBegin(), PetscOptionsTruthGroup(), PetscOptionsTruthGroupEnd(),
1527           PetscOptionsList(), PetscOptionsEList()
1528 @*/
1529 PetscErrorCode PETSC_DLLEXPORT PetscOptionsGetStringArray(const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscTruth *flg)
1530 {
1531   char           *value;
1532   PetscErrorCode ierr;
1533   PetscInt       n;
1534   PetscTruth     flag;
1535   PetscToken     token;
1536 
1537   PetscFunctionBegin;
1538   PetscValidCharPointer(name,2);
1539   PetscValidPointer(strings,3);
1540   ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr);
1541   if (!flag)  {*nmax = 0; if (flg) *flg = PETSC_FALSE; PetscFunctionReturn(0);}
1542   if (!value) {*nmax = 0; if (flg) *flg = PETSC_FALSE;PetscFunctionReturn(0);}
1543   if (!*nmax) {if (flg) *flg = PETSC_FALSE;PetscFunctionReturn(0);}
1544   if (flg) *flg = PETSC_TRUE;
1545 
1546   ierr = PetscTokenCreate(value,',',&token);CHKERRQ(ierr);
1547   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
1548   n = 0;
1549   while (n < *nmax) {
1550     if (!value) break;
1551     ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr);
1552     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
1553     n++;
1554   }
1555   ierr = PetscTokenDestroy(token);CHKERRQ(ierr);
1556   *nmax = n;
1557   PetscFunctionReturn(0);
1558 }
1559 
1560 #undef __FUNCT__
1561 #define __FUNCT__ "PetscOptionsAllUsed"
1562 /*@C
1563    PetscOptionsAllUsed - Returns a count of the number of options in the
1564    database that have never been selected.
1565 
1566    Not Collective
1567 
1568    Output Parameter:
1569 .   N - count of options not used
1570 
1571    Level: advanced
1572 
1573 .seealso: PetscOptionsPrint()
1574 @*/
1575 PetscErrorCode PETSC_DLLEXPORT PetscOptionsAllUsed(int *N)
1576 {
1577   PetscInt i,n = 0;
1578 
1579   PetscFunctionBegin;
1580   for (i=0; i<options->N; i++) {
1581     if (!options->used[i]) { n++; }
1582   }
1583   *N = n;
1584   PetscFunctionReturn(0);
1585 }
1586 
1587 #undef __FUNCT__
1588 #define __FUNCT__ "PetscOptionsLeft"
1589 /*@
1590     PetscOptionsLeft - Prints to screen any options that were set and never used.
1591 
1592   Not collective
1593 
1594    Options Database Key:
1595 .  -options_left - Activates OptionsAllUsed() within PetscFinalize()
1596 
1597   Level: advanced
1598 
1599 .seealso: PetscOptionsAllUsed()
1600 @*/
1601 PetscErrorCode PETSC_DLLEXPORT PetscOptionsLeft(void)
1602 {
1603   PetscErrorCode ierr;
1604   PetscInt       i;
1605 
1606   PetscFunctionBegin;
1607   for (i=0; i<options->N; i++) {
1608     if (!options->used[i]) {
1609       if (options->values[i]) {
1610         ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",options->names[i],options->values[i]);CHKERRQ(ierr);
1611       } else {
1612         ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s no value \n",options->names[i]);CHKERRQ(ierr);
1613       }
1614     }
1615   }
1616   PetscFunctionReturn(0);
1617 }
1618 
1619 
1620 /*
1621     PetscOptionsCreate - Creates the empty options database.
1622 
1623 */
1624 #undef __FUNCT__
1625 #define __FUNCT__ "PetscOptionsCreate"
1626 PetscErrorCode PETSC_DLLEXPORT PetscOptionsCreate(void)
1627 {
1628   PetscErrorCode ierr;
1629 
1630   PetscFunctionBegin;
1631   options = (PetscOptionsTable*)malloc(sizeof(PetscOptionsTable));
1632   ierr    = PetscMemzero(options->used,MAXOPTIONS*sizeof(PetscTruth));CHKERRQ(ierr);
1633   options->namegiven 		= PETSC_FALSE;
1634   options->N         		= 0;
1635   options->Naliases  		= 0;
1636   options->numbermonitors 	= 0;
1637 
1638   PetscOptionsObject.prefix = PETSC_NULL;
1639   PetscOptionsObject.title  = PETSC_NULL;
1640 
1641   PetscFunctionReturn(0);
1642 }
1643 
1644 #undef __FUNCT__
1645 #define __FUNCT__ "PetscOptionsSetFromOptions"
1646 /*@
1647    PetscOptionsSetFromOptions - Sets various SNES and KSP parameters from user options.
1648 
1649    Collective on PETSC_COMM_WORLD
1650 
1651    Options Database Keys:
1652 +  -options_monitor <optional filename> - prints the names and values of all
1653  				runtime options as they are set. The monitor functionality is not
1654                 available for options set through a file, environment variable, or on
1655                 the command line. Only options set after PetscInitialize completes will
1656                 be monitored.
1657 .  -options_monitor_cancel - cancel all options database monitors
1658 
1659    Notes:
1660    To see all options, run your program with the -help option or consult
1661    the users manual.
1662 
1663    Level: intermediate
1664 
1665 .keywords: set, options, database
1666 @*/
1667 PetscErrorCode PETSC_DLLEXPORT PetscOptionsSetFromOptions(void)
1668 {
1669   PetscTruth          flg;
1670   PetscErrorCode      ierr;
1671   char                monfilename[PETSC_MAX_PATH_LEN];
1672   PetscViewer         monviewer;
1673 
1674   PetscFunctionBegin;
1675 
1676   ierr = PetscOptionsBegin(PETSC_COMM_WORLD,"","Options database options","PetscOptions");CHKERRQ(ierr);
1677   ierr = PetscOptionsString("-options_monitor","Monitor options database","PetscOptionsMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
1678   if (flg && (!options->numbermonitors)) {
1679     ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,monfilename,&monviewer);CHKERRQ(ierr);
1680     ierr = PetscOptionsMonitorSet(PetscOptionsMonitorDefault,monviewer,(PetscErrorCode (*)(void*))PetscViewerDestroy);CHKERRQ(ierr);
1681   }
1682 
1683   ierr = PetscOptionsName("-options_monitor_cancel","Cancel all options database monitors","PetscOptionsMonitorCancel",&flg);CHKERRQ(ierr);
1684   if (flg) { ierr = PetscOptionsMonitorCancel();CHKERRQ(ierr); }
1685 
1686   ierr = PetscOptionsEnd();CHKERRQ(ierr);
1687 
1688   PetscFunctionReturn(0);
1689 }
1690 
1691 
1692 #undef __FUNCT__
1693 #define __FUNCT__ "PetscOptionsMonitorDefault"
1694 /*@C
1695    PetscOptionsMonitorDefault - Print all options set value events.
1696 
1697    Collective on PETSC_COMM_WORLD
1698 
1699    Input Parameters:
1700 +  name  - option name string
1701 .  value - option value string
1702 -  dummy - unused monitor context
1703 
1704    Level: intermediate
1705 
1706 .keywords: PetscOptions, default, monitor
1707 
1708 .seealso: PetscOptionsMonitorSet()
1709 @*/
1710 PetscErrorCode PETSC_DLLEXPORT PetscOptionsMonitorDefault(const char name[], const char value[], void *dummy)
1711 {
1712   PetscErrorCode ierr;
1713   PetscViewer    viewer = (PetscViewer) dummy;
1714 
1715   PetscFunctionBegin;
1716   if (!viewer) {
1717     ierr = PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer);CHKERRQ(ierr);
1718   }
1719   ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr);
1720   PetscFunctionReturn(0);
1721 }
1722 
1723 #undef __FUNCT__
1724 #define __FUNCT__ "PetscOptionsMonitorSet"
1725 /*@C
1726    PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that
1727    modified the PETSc options database.
1728 
1729    Not collective
1730 
1731    Input Parameters:
1732 +  monitor - pointer to function (if this is PETSC_NULL, it turns off monitoring
1733 .  mctx    - [optional] context for private data for the
1734              monitor routine (use PETSC_NULL if no context is desired)
1735 -  monitordestroy - [optional] routine that frees monitor context
1736           (may be PETSC_NULL)
1737 
1738    Calling Sequence of monitor:
1739 $     monitor (const char name[], const char value[], void *mctx)
1740 
1741 +  name - option name string
1742 .  value - option value string
1743 -  mctx  - optional monitoring context, as set by PetscOptionsMonitorSet()
1744 
1745    Options Database Keys:
1746 +    -options_monitor    - sets PetscOptionsMonitorDefault()
1747 -    -options_monitor_cancel - cancels all monitors that have
1748                           been hardwired into a code by
1749                           calls to PetscOptionsMonitorSet(), but
1750                           does not cancel those set via
1751                           the options database.
1752 
1753    Notes:
1754    The default is to do nothing.  To print the name and value of options
1755    being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine,
1756    with a null monitoring context.
1757 
1758    Several different monitoring routines may be set by calling
1759    PetscOptionsMonitorSet() multiple times; all will be called in the
1760    order in which they were set.
1761 
1762    Level: beginner
1763 
1764 .keywords: PetscOptions, set, monitor
1765 
1766 .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorCancel()
1767 @*/
1768 PetscErrorCode PETSC_DLLEXPORT PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void*))
1769 {
1770   PetscFunctionBegin;
1771   if (options->numbermonitors >= MAXOPTIONSMONITORS) {
1772     SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set");
1773   }
1774   options->monitor[options->numbermonitors]           = monitor;
1775   options->monitordestroy[options->numbermonitors]    = monitordestroy;
1776   options->monitorcontext[options->numbermonitors++]  = (void*)mctx;
1777   PetscFunctionReturn(0);
1778 }
1779 
1780 #undef __FUNCT__
1781 #define __FUNCT__ "PetscOptionsMonitorCancel"
1782 /*@
1783    PetscOptionsMonitorCancel - Clears all monitors for a PetscOptions object.
1784 
1785    Not collective
1786 
1787    Options Database Key:
1788 .  -options_monitor_cancel - Cancels all monitors that have
1789     been hardwired into a code by calls to PetscOptionsMonitorSet(),
1790     but does not cancel those set via the options database.
1791 
1792    Level: intermediate
1793 
1794 .keywords: PetscOptions, set, monitor
1795 
1796 .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorSet()
1797 @*/
1798 PetscErrorCode PETSC_DLLEXPORT PetscOptionsMonitorCancel(void)
1799 {
1800   PetscErrorCode ierr;
1801   PetscInt       i;
1802 
1803   PetscFunctionBegin;
1804   for (i=0; i<options->numbermonitors; i++) {
1805     if (options->monitordestroy[i]) {
1806       ierr = (*options->monitordestroy[i])(options->monitorcontext[i]);CHKERRQ(ierr);
1807     }
1808   }
1809   options->numbermonitors = 0;
1810   PetscFunctionReturn(0);
1811 }
1812