xref: /petsc/src/sys/objects/options.c (revision 2d7475101bf02d93e875ae8727f1067be42c09d1)
173fca5a0SBarry Smith /* Define Feature test macros to make sure atoll is available (SVr4, POSIX.1-2001, 4.3BSD, C99), not in (C89 and POSIX.1-1996) */
20039db0dSBarry Smith #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for atoll() */
3e5ea902fSJed Brown 
4e5c89e4eSSatish Balay /*
53fc1eb6aSBarry Smith    These routines simplify the use of command line, file options, etc., and are used to manipulate the options database.
63fc1eb6aSBarry Smith    This provides the low-level interface, the high level interface is in aoptions.c
7e5c89e4eSSatish Balay 
83fc1eb6aSBarry Smith    Some routines use regular malloc and free because it cannot know  what malloc is requested with the
93fc1eb6aSBarry Smith    options database until it has already processed the input.
10e5c89e4eSSatish Balay */
11e5c89e4eSSatish Balay 
12af0996ceSBarry Smith #include <petsc/private/petscimpl.h>        /*I  "petscsys.h"   I*/
13665c2dedSJed Brown #include <petscviewer.h>
14ad1ac5ecSJed Brown #include <ctype.h>
15e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MALLOC_H)
16e5c89e4eSSatish Balay #include <malloc.h>
17e5c89e4eSSatish Balay #endif
18ef279fd6SBarry Smith #if defined(PETSC_HAVE_STRING_H)
19*2d747510SLisandro Dalcin #include <string.h>             /* strcasecmp */
20ef279fd6SBarry Smith #endif
21ef279fd6SBarry Smith #if defined(PETSC_HAVE_STRINGS_H)
22ef279fd6SBarry Smith #  include <strings.h>          /* strcasecmp */
23ef279fd6SBarry Smith #endif
243bcbd388SSean Farley #if defined(PETSC_HAVE_YAML)
253bcbd388SSean Farley #include <yaml.h>
263bcbd388SSean Farley #endif
27e5c89e4eSSatish Balay 
28*2d747510SLisandro Dalcin #if defined(PETSC_HAVE_STRCASECMP)
29*2d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) strcasecmp(a,b)
30*2d747510SLisandro Dalcin #elif defined(PETSC_HAVE_STRICMP)
31*2d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) stricmp(a,b)
32*2d747510SLisandro Dalcin #else
33*2d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) Error_strcasecmp_not_found
34*2d747510SLisandro Dalcin #endif
35*2d747510SLisandro Dalcin 
36*2d747510SLisandro Dalcin #include <petsc/private/hashtable.h>
37*2d747510SLisandro Dalcin 
38*2d747510SLisandro Dalcin /* This assumes ASCII encoding and ignores locale settings */
39*2d747510SLisandro Dalcin /* Using tolower() is about 2X slower in microbenchmarks   */
40*2d747510SLisandro Dalcin PETSC_STATIC_INLINE int PetscToLower(int c)
41*2d747510SLisandro Dalcin {
42*2d747510SLisandro Dalcin   return ((c >= 'A') & (c <= 'Z')) ? c + 'a' - 'A' : c;
43*2d747510SLisandro Dalcin }
44*2d747510SLisandro Dalcin 
45*2d747510SLisandro Dalcin /* Bob Jenkins's one at a time hash function (case-insensitive) */
46*2d747510SLisandro Dalcin PETSC_STATIC_INLINE unsigned int PetscOptHash(const char key[])
47*2d747510SLisandro Dalcin {
48*2d747510SLisandro Dalcin   unsigned int hash = 0;
49*2d747510SLisandro Dalcin   while (*key) {
50*2d747510SLisandro Dalcin     hash += PetscToLower(*key++);
51*2d747510SLisandro Dalcin     hash += hash << 10;
52*2d747510SLisandro Dalcin     hash ^= hash >>  6;
53*2d747510SLisandro Dalcin   }
54*2d747510SLisandro Dalcin   hash += hash <<  3;
55*2d747510SLisandro Dalcin   hash ^= hash >> 11;
56*2d747510SLisandro Dalcin   hash += hash << 15;
57*2d747510SLisandro Dalcin   return hash;
58*2d747510SLisandro Dalcin }
59*2d747510SLisandro Dalcin 
60*2d747510SLisandro Dalcin PETSC_STATIC_INLINE int PetscOptEqual(const char a[],const char b[])
61*2d747510SLisandro Dalcin {
62*2d747510SLisandro Dalcin   return !PetscOptNameCmp(a,b);
63*2d747510SLisandro Dalcin }
64*2d747510SLisandro Dalcin 
65*2d747510SLisandro Dalcin KHASH_INIT(HO, kh_cstr_t, int, 1, PetscOptHash, PetscOptEqual)
66*2d747510SLisandro Dalcin 
67e5c89e4eSSatish Balay /*
683fc1eb6aSBarry Smith     This table holds all the options set by the user. For simplicity, we use a static size database
69e5c89e4eSSatish Balay */
70*2d747510SLisandro Dalcin #define MAXOPTNAME 512
71e5c89e4eSSatish Balay #define MAXOPTIONS 512
72e5c89e4eSSatish Balay #define MAXALIASES  25
7374e0666dSJed Brown #define MAXPREFIXES 25
74*2d747510SLisandro Dalcin #define MAXOPTIONSMONITORS 5
75e5c89e4eSSatish Balay 
764416b707SBarry Smith struct  _n_PetscOptions {
77*2d747510SLisandro Dalcin   int        N;                    /* number of options */
78*2d747510SLisandro Dalcin   char       *names[MAXOPTIONS];   /* option names */
79*2d747510SLisandro Dalcin   char       *values[MAXOPTIONS];  /* option values */
80*2d747510SLisandro Dalcin   PetscBool  used[MAXOPTIONS];     /* flag option use */
81081c24baSBoyana Norris 
82*2d747510SLisandro Dalcin   /* Hash table */
83*2d747510SLisandro Dalcin   khash_t(HO) *ht;
84*2d747510SLisandro Dalcin 
85*2d747510SLisandro Dalcin   /* Prefixes */
86*2d747510SLisandro Dalcin   int   prefixind;
87*2d747510SLisandro Dalcin   int   prefixstack[MAXPREFIXES];
88*2d747510SLisandro Dalcin   char  prefix[MAXOPTNAME];
89*2d747510SLisandro Dalcin 
90*2d747510SLisandro Dalcin   /* Aliases */
91*2d747510SLisandro Dalcin   int  Naliases;                   /* number or aliases */
92*2d747510SLisandro Dalcin   char *aliases1[MAXALIASES];      /* aliased */
93*2d747510SLisandro Dalcin   char *aliases2[MAXALIASES];      /* aliasee */
94*2d747510SLisandro Dalcin 
95*2d747510SLisandro Dalcin   /* Help */
96*2d747510SLisandro Dalcin   PetscBool help; /* flag whether "-help" is in the database */
97*2d747510SLisandro Dalcin 
98*2d747510SLisandro Dalcin   /* Monitors */
99081c24baSBoyana Norris   PetscErrorCode (*monitor[MAXOPTIONSMONITORS])(const char[],const char[],void*); /* returns control to user after */
100c2efdce3SBarry Smith   PetscErrorCode (*monitordestroy[MAXOPTIONSMONITORS])(void**);         /* */
101081c24baSBoyana Norris   void           *monitorcontext[MAXOPTIONSMONITORS];                  /* to pass arbitrary user data into monitor */
102081c24baSBoyana Norris   PetscInt       numbermonitors;                                       /* to, for instance, detect options being set */
1034416b707SBarry Smith };
104e5c89e4eSSatish Balay 
1054416b707SBarry Smith static PetscOptions defaultoptions = NULL;
106f8d0b74dSMatthew Knepley 
107*2d747510SLisandro Dalcin 
108081c24baSBoyana Norris /*
109081c24baSBoyana Norris     Options events monitor
110081c24baSBoyana Norris */
111*2d747510SLisandro Dalcin static PetscErrorCode PetscOptionsMonitor(PetscOptions options,const char name[],const char value[])
112e5c89e4eSSatish Balay {
113*2d747510SLisandro Dalcin   PetscInt       i;
114e5c89e4eSSatish Balay   PetscErrorCode ierr;
115e5c89e4eSSatish Balay 
116*2d747510SLisandro Dalcin   if (!PetscInitializeCalled) return 0;
117e5c89e4eSSatish Balay   PetscFunctionBegin;
118*2d747510SLisandro Dalcin   for (i=0; i<options->numbermonitors; i++) {
119*2d747510SLisandro Dalcin     ierr = (*options->monitor[i])(name,value,options->monitorcontext[i]);CHKERRQ(ierr);
120e5c89e4eSSatish Balay   }
121e5c89e4eSSatish Balay   PetscFunctionReturn(0);
122e5c89e4eSSatish Balay }
123e5c89e4eSSatish Balay 
124*2d747510SLisandro Dalcin /*@
125*2d747510SLisandro Dalcin    PetscOptionsCreate - Creates an empty options database.
126e5c89e4eSSatish Balay 
127e5c89e4eSSatish Balay    Output Parameter:
128*2d747510SLisandro Dalcin .  options - Options database object
129e5c89e4eSSatish Balay 
130e5c89e4eSSatish Balay    Level: advanced
131e5c89e4eSSatish Balay 
132*2d747510SLisandro Dalcin .seealso: PetscOptionsDestroy()
133e5c89e4eSSatish Balay @*/
134*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreate(PetscOptions *options)
135*2d747510SLisandro Dalcin {
136*2d747510SLisandro Dalcin   if (!options) return PETSC_ERR_ARG_NULL;
137*2d747510SLisandro Dalcin   *options = (PetscOptions)calloc(1,sizeof(**options));
138*2d747510SLisandro Dalcin   if (!*options) return PETSC_ERR_MEM;
139*2d747510SLisandro Dalcin   return 0;
140*2d747510SLisandro Dalcin }
141*2d747510SLisandro Dalcin 
142*2d747510SLisandro Dalcin /*@
143*2d747510SLisandro Dalcin     PetscOptionsDestroy - Destroys an option database.
144*2d747510SLisandro Dalcin 
145*2d747510SLisandro Dalcin   Input Parameter:
146*2d747510SLisandro Dalcin .  options - the PetscOptions object
147*2d747510SLisandro Dalcin 
148*2d747510SLisandro Dalcin    Level: developer
149*2d747510SLisandro Dalcin 
150*2d747510SLisandro Dalcin .seealso: PetscOptionsInsert()
151*2d747510SLisandro Dalcin @*/
152*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroy(PetscOptions *options)
153e5c89e4eSSatish Balay {
154e5c89e4eSSatish Balay   PetscErrorCode ierr;
155e5c89e4eSSatish Balay 
156*2d747510SLisandro Dalcin   if (!*options) return 0;
157*2d747510SLisandro Dalcin   ierr = PetscOptionsClear(*options);if (ierr) return ierr;
158*2d747510SLisandro Dalcin   /* XXX what about monitors ? */
159*2d747510SLisandro Dalcin   *options = NULL;
160e5c89e4eSSatish Balay   PetscFunctionReturn(0);
161e5c89e4eSSatish Balay }
162e5c89e4eSSatish Balay 
163*2d747510SLisandro Dalcin /*
164*2d747510SLisandro Dalcin     PetscOptionsCreateDefault - Creates the default global options database
165*2d747510SLisandro Dalcin */
166*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreateDefault(void)
167e5c89e4eSSatish Balay {
168e5c89e4eSSatish Balay   PetscErrorCode ierr;
169e5c89e4eSSatish Balay 
170*2d747510SLisandro Dalcin   if (!defaultoptions) {
171*2d747510SLisandro Dalcin     ierr = PetscOptionsCreate(&defaultoptions);if (ierr) return ierr;
172*2d747510SLisandro Dalcin   }
173*2d747510SLisandro Dalcin   return 0;
174*2d747510SLisandro Dalcin }
175*2d747510SLisandro Dalcin 
176*2d747510SLisandro Dalcin /*
177*2d747510SLisandro Dalcin     PetscOptionsDestroyDefault - Destroys the default global options database
178*2d747510SLisandro Dalcin */
179*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroyDefault(void)
180*2d747510SLisandro Dalcin {
181*2d747510SLisandro Dalcin   PetscErrorCode ierr;
182*2d747510SLisandro Dalcin 
183*2d747510SLisandro Dalcin   ierr = PetscOptionsDestroy(&defaultoptions);if (ierr) return ierr;
184*2d747510SLisandro Dalcin   return 0;
185e5c89e4eSSatish Balay }
186e5c89e4eSSatish Balay 
18794ef8ddeSSatish Balay /*@C
1887cd08cecSJed Brown    PetscOptionsValidKey - PETSc Options database keys must begin with one or two dashes (-) followed by a letter.
1893fc1eb6aSBarry Smith 
1903fc1eb6aSBarry Smith    Input Parameter:
191*2d747510SLisandro Dalcin .  key - string to check if valid
1923fc1eb6aSBarry Smith 
1933fc1eb6aSBarry Smith    Output Parameter:
194*2d747510SLisandro Dalcin .  valid - PETSC_TRUE if a valid key
1953fc1eb6aSBarry Smith 
196f6680f47SSatish Balay    Level: intermediate
1973fc1eb6aSBarry Smith @*/
198*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsValidKey(const char key[],PetscBool *valid)
19996fc60bcSBarry Smith {
200f603b5e9SToby Isaac   char           *ptr;
2017c5db45bSBarry Smith 
20296fc60bcSBarry Smith   PetscFunctionBegin;
203*2d747510SLisandro Dalcin   if (key) PetscValidCharPointer(key,1);
204*2d747510SLisandro Dalcin   PetscValidPointer(valid,2);
205*2d747510SLisandro Dalcin   *valid = PETSC_FALSE;
206*2d747510SLisandro Dalcin   if (!key) PetscFunctionReturn(0);
207*2d747510SLisandro Dalcin   if (key[0] != '-') PetscFunctionReturn(0);
208*2d747510SLisandro Dalcin   if (key[1] == '-') key++;
209*2d747510SLisandro Dalcin   if (!isalpha((int)(key[1]))) PetscFunctionReturn(0);
210*2d747510SLisandro Dalcin   (void) strtod(key,&ptr);
211*2d747510SLisandro Dalcin   if (ptr != key && !(*ptr == '_' || isalnum(*ptr))) PetscFunctionReturn(0);
212*2d747510SLisandro Dalcin   *valid = PETSC_TRUE;
21396fc60bcSBarry Smith   PetscFunctionReturn(0);
21496fc60bcSBarry Smith }
21596fc60bcSBarry Smith 
216e5c89e4eSSatish Balay /*@C
217e5c89e4eSSatish Balay    PetscOptionsInsertString - Inserts options into the database from a string
218e5c89e4eSSatish Balay 
219*2d747510SLisandro Dalcin    Not Collective, but only processes that call this routine will set the options
22001508a89SJed Brown    included in the string
221e5c89e4eSSatish Balay 
222e5c89e4eSSatish Balay    Input Parameter:
223a8c7a070SBarry Smith .  in_str - string that contains options separated by blanks
224e5c89e4eSSatish Balay 
225e5c89e4eSSatish Balay 
226e5c89e4eSSatish Balay    Level: intermediate
227e5c89e4eSSatish Balay 
228e5c89e4eSSatish Balay    Contributed by Boyana Norris
229e5c89e4eSSatish Balay 
23088c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(),
231acfcf0e5SJed Brown           PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
232e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
233e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
234acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
235a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsInsertFile()
236e5c89e4eSSatish Balay @*/
237c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertString(PetscOptions options,const char in_str[])
238e5c89e4eSSatish Balay {
23996fc60bcSBarry Smith   char           *first,*second;
240e5c89e4eSSatish Balay   PetscErrorCode ierr;
2419c9d3cfdSBarry Smith   PetscToken     token;
242ace3abfcSBarry Smith   PetscBool      key,ispush,ispop;
243e5c89e4eSSatish Balay 
244e5c89e4eSSatish Balay   PetscFunctionBegin;
24596fc60bcSBarry Smith   ierr = PetscTokenCreate(in_str,' ',&token);CHKERRQ(ierr);
246e5c89e4eSSatish Balay   ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
24796fc60bcSBarry Smith   while (first) {
2489db968c8SJed Brown     ierr = PetscStrcasecmp(first,"-prefix_push",&ispush);CHKERRQ(ierr);
2499db968c8SJed Brown     ierr = PetscStrcasecmp(first,"-prefix_pop",&ispop);CHKERRQ(ierr);
25096fc60bcSBarry Smith     ierr = PetscOptionsValidKey(first,&key);CHKERRQ(ierr);
2519db968c8SJed Brown     if (ispush) {
2529db968c8SJed Brown       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
253c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPush(options,second);CHKERRQ(ierr);
2549db968c8SJed Brown       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
2559db968c8SJed Brown     } else if (ispop) {
256c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr);
2579db968c8SJed Brown       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
2589db968c8SJed Brown     } else if (key) {
259e5c89e4eSSatish Balay       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
26096fc60bcSBarry Smith       ierr = PetscOptionsValidKey(second,&key);CHKERRQ(ierr);
26196fc60bcSBarry Smith       if (!key) {
262c5929fdfSBarry Smith         ierr = PetscOptionsSetValue(options,first,second);CHKERRQ(ierr);
26396fc60bcSBarry Smith         ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
26496fc60bcSBarry Smith       } else {
265c5929fdfSBarry Smith         ierr  = PetscOptionsSetValue(options,first,NULL);CHKERRQ(ierr);
26696fc60bcSBarry Smith         first = second;
26796fc60bcSBarry Smith       }
26896fc60bcSBarry Smith     } else {
26996fc60bcSBarry Smith       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
270e5c89e4eSSatish Balay     }
271e5c89e4eSSatish Balay   }
2728c74ee41SBarry Smith   ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
273e5c89e4eSSatish Balay   PetscFunctionReturn(0);
274e5c89e4eSSatish Balay }
275e5c89e4eSSatish Balay 
2763fc1eb6aSBarry Smith /*
2773fc1eb6aSBarry Smith     Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free()
2783fc1eb6aSBarry Smith */
2795fa91da5SBarry Smith static char *Petscgetline(FILE * f)
2805fa91da5SBarry Smith {
2815fa91da5SBarry Smith   size_t size  = 0;
2825fa91da5SBarry Smith   size_t len   = 0;
2835fa91da5SBarry Smith   size_t last  = 0;
2840298fd71SBarry Smith   char   *buf  = NULL;
2855fa91da5SBarry Smith 
2865fa91da5SBarry Smith   if (feof(f)) return 0;
2875fa91da5SBarry Smith   do {
2885fa91da5SBarry Smith     size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */
2896e0c8459SSatish Balay     buf   = (char*)realloc((void*)buf,size); /* realloc(NULL,n) is the same as malloc(n) */
2905fa91da5SBarry Smith     /* Actually do the read. Note that fgets puts a terminal '\0' on the
2915fa91da5SBarry Smith     end of the string, so we make sure we overwrite this */
29208ac41f7SSatish Balay     if (!fgets(buf+len,size,f)) buf[len]=0;
2935fa91da5SBarry Smith     PetscStrlen(buf,&len);
2945fa91da5SBarry Smith     last = len - 1;
2955fa91da5SBarry Smith   } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r');
29608ac41f7SSatish Balay   if (len) return buf;
2975fa91da5SBarry Smith   free(buf);
2985fa91da5SBarry Smith   return 0;
2995fa91da5SBarry Smith }
3005fa91da5SBarry Smith 
301e5c89e4eSSatish Balay /*@C
302e5c89e4eSSatish Balay      PetscOptionsInsertFile - Inserts options into the database from a file.
303e5c89e4eSSatish Balay 
3044c48f4c1SBarry Smith      Collective on MPI_Comm
305e5c89e4eSSatish Balay 
306e5c89e4eSSatish Balay   Input Parameter:
3079b754dc9SBarry Smith +   comm - the processes that will share the options (usually PETSC_COMM_WORLD)
308c5929fdfSBarry Smith .   options - options database, use NULL for default global database
309e5c89e4eSSatish Balay .   file - name of file
3109b754dc9SBarry Smith -   require - if PETSC_TRUE will generate an error if the file does not exist
311e5c89e4eSSatish Balay 
312e5c89e4eSSatish Balay 
31395452b02SPatrick Sanan   Notes:
31495452b02SPatrick Sanan     Use  # for lines that are comments and which should be ignored.
3157c43ebc8SBarry Smith 
316f0feba65SBarry Smith    Usually, instead of using this command, one should list the file name in the call to PetscInitialize(), this insures that certain options
317609bdbeeSBarry Smith    such as -log_view or -malloc_debug are processed properly. This routine only sets options into the options database that will be processed by later
318f0feba65SBarry Smith    calls to XXXSetFromOptions() it should not be used for options listed under PetscInitialize().
319f0feba65SBarry Smith 
3203bcbd388SSean Farley   Level: developer
321e5c89e4eSSatish Balay 
32288c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(),
323acfcf0e5SJed Brown           PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
324e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
325e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
326acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
327a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
328e5c89e4eSSatish Balay 
329e5c89e4eSSatish Balay @*/
330c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require)
331e5c89e4eSSatish Balay {
3323a018368SJed Brown   char           *string,fname[PETSC_MAX_PATH_LEN],*first,*second,*third,*vstring = 0,*astring = 0,*packed = 0;
333e5c89e4eSSatish Balay   PetscErrorCode ierr;
33413e3f751SJed Brown   size_t         i,len,bytes;
335e5c89e4eSSatish Balay   FILE           *fd;
3369c9d3cfdSBarry Smith   PetscToken     token;
337ed9cf6e9SBarry Smith   int            err;
3387c43ebc8SBarry Smith   char           cmt[1]={'#'},*cmatch;
3393a018368SJed Brown   PetscMPIInt    rank,cnt=0,acnt=0,counts[2];
340ad38b122SPatrick Sanan   PetscBool      isdir;
341e5c89e4eSSatish Balay 
342e5c89e4eSSatish Balay   PetscFunctionBegin;
34305c7dedfSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
34405c7dedfSBarry Smith   if (!rank) {
34566af5158SSatish Balay     cnt        = 0;
34666af5158SSatish Balay     acnt       = 0;
34705c7dedfSBarry Smith 
348e5c89e4eSSatish Balay     ierr = PetscFixFilename(file,fname);CHKERRQ(ierr);
349e5c89e4eSSatish Balay     fd   = fopen(fname,"r");
350ad38b122SPatrick Sanan     ierr = PetscTestDirectory(fname,'r',&isdir);CHKERRQ(ierr);
351ad38b122SPatrick Sanan     if (isdir && require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified options file %s is a directory",fname);
352ad38b122SPatrick Sanan     if (fd && !isdir) {
3533a018368SJed Brown       PetscSegBuffer vseg,aseg;
3543a018368SJed Brown       ierr = PetscSegBufferCreate(1,4000,&vseg);CHKERRQ(ierr);
3553a018368SJed Brown       ierr = PetscSegBufferCreate(1,2000,&aseg);CHKERRQ(ierr);
3563a018368SJed Brown 
3579b754dc9SBarry Smith       /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */
3589b754dc9SBarry Smith       ierr = PetscInfo1(0,"Opened options file %s\n",file);CHKERRQ(ierr);
359e24ecc5dSJed Brown 
3605fa91da5SBarry Smith       while ((string = Petscgetline(fd))) {
3614704e885SBarry Smith         /* eliminate comments from each line */
3627c43ebc8SBarry Smith         for (i=0; i<1; i++) {
363a2ea699eSBarry Smith           ierr = PetscStrchr(string,cmt[i],&cmatch);CHKERRQ(ierr);
36490f79514SSatish Balay           if (cmatch) *cmatch = 0;
36590f79514SSatish Balay         }
366e5c89e4eSSatish Balay         ierr = PetscStrlen(string,&len);CHKERRQ(ierr);
3675981331cSSatish Balay         /* replace tabs, ^M, \n with " " */
368e5c89e4eSSatish Balay         for (i=0; i<len; i++) {
3695981331cSSatish Balay           if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') {
370e5c89e4eSSatish Balay             string[i] = ' ';
371e5c89e4eSSatish Balay           }
372e5c89e4eSSatish Balay         }
37390f79514SSatish Balay         ierr = PetscTokenCreate(string,' ',&token);CHKERRQ(ierr);
374e5c89e4eSSatish Balay         ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
37590f79514SSatish Balay         if (!first) {
37602b0d46eSSatish Balay           goto destroy;
37790f79514SSatish Balay         } else if (!first[0]) { /* if first token is empty spaces, redo first token */
37890f79514SSatish Balay           ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
37990f79514SSatish Balay         }
380e5c89e4eSSatish Balay         ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
3812662f744SSatish Balay         if (!first) {
3822662f744SSatish Balay           goto destroy;
3832662f744SSatish Balay         } else if (first[0] == '-') {
384e24ecc5dSJed Brown           ierr = PetscStrlen(first,&len);CHKERRQ(ierr);
38513e3f751SJed Brown           ierr = PetscSegBufferGet(vseg,len+1,&vstring);CHKERRQ(ierr);
386e24ecc5dSJed Brown           ierr = PetscMemcpy(vstring,first,len);CHKERRQ(ierr);
387e24ecc5dSJed Brown           vstring[len] = ' ';
38809192fe3SBarry Smith           if (second) {
389e24ecc5dSJed Brown             ierr = PetscStrlen(second,&len);CHKERRQ(ierr);
39013e3f751SJed Brown             ierr = PetscSegBufferGet(vseg,len+3,&vstring);CHKERRQ(ierr);
391e24ecc5dSJed Brown             vstring[0] = '"';
392e24ecc5dSJed Brown             ierr = PetscMemcpy(vstring+1,second,len);CHKERRQ(ierr);
393e24ecc5dSJed Brown             vstring[len+1] = '"';
394e24ecc5dSJed Brown             vstring[len+2] = ' ';
39509192fe3SBarry Smith           }
39690f79514SSatish Balay         } else {
397ace3abfcSBarry Smith           PetscBool match;
398e5c89e4eSSatish Balay 
399e5c89e4eSSatish Balay           ierr = PetscStrcasecmp(first,"alias",&match);CHKERRQ(ierr);
400e5c89e4eSSatish Balay           if (match) {
401e5c89e4eSSatish Balay             ierr = PetscTokenFind(token,&third);CHKERRQ(ierr);
402e32f2f54SBarry Smith             if (!third) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file:alias missing (%s)",second);
403e24ecc5dSJed Brown             ierr = PetscStrlen(second,&len);CHKERRQ(ierr);
40413e3f751SJed Brown             ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr);
405e24ecc5dSJed Brown             ierr = PetscMemcpy(astring,second,len);CHKERRQ(ierr);
406e24ecc5dSJed Brown             astring[len] = ' ';
407e24ecc5dSJed Brown 
408e24ecc5dSJed Brown             ierr = PetscStrlen(third,&len);CHKERRQ(ierr);
40913e3f751SJed Brown             ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr);
410e24ecc5dSJed Brown             ierr = PetscMemcpy(astring,third,len);CHKERRQ(ierr);
411e24ecc5dSJed Brown             astring[len] = ' ';
412f23aa3ddSBarry Smith           } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown statement in options file: (%s)",string);
413e5c89e4eSSatish Balay         }
41402b0d46eSSatish Balay destroy:
4154b40f50bSBarry Smith         free(string);
4168c74ee41SBarry Smith         ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
417e5c89e4eSSatish Balay       }
418ed9cf6e9SBarry Smith       err = fclose(fd);
419e32f2f54SBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
420e24ecc5dSJed Brown       ierr = PetscSegBufferGetSize(aseg,&bytes);CHKERRQ(ierr); /* size without null termination */
421e24ecc5dSJed Brown       ierr = PetscMPIIntCast(bytes,&acnt);CHKERRQ(ierr);
422e24ecc5dSJed Brown       ierr = PetscSegBufferGet(aseg,1,&astring);CHKERRQ(ierr);
423e24ecc5dSJed Brown       astring[0] = 0;
424e24ecc5dSJed Brown       ierr = PetscSegBufferGetSize(vseg,&bytes);CHKERRQ(ierr); /* size without null termination */
425e24ecc5dSJed Brown       ierr = PetscMPIIntCast(bytes,&cnt);CHKERRQ(ierr);
426e24ecc5dSJed Brown       ierr = PetscSegBufferGet(vseg,1,&vstring);CHKERRQ(ierr);
427e24ecc5dSJed Brown       vstring[0] = 0;
428854ce69bSBarry Smith       ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr);
4293a018368SJed Brown       ierr = PetscSegBufferExtractTo(aseg,packed);CHKERRQ(ierr);
4303a018368SJed Brown       ierr = PetscSegBufferExtractTo(vseg,packed+acnt+1);CHKERRQ(ierr);
4313a018368SJed Brown       ierr = PetscSegBufferDestroy(&aseg);CHKERRQ(ierr);
4323a018368SJed Brown       ierr = PetscSegBufferDestroy(&vseg);CHKERRQ(ierr);
433f23aa3ddSBarry Smith     } else if (require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Unable to open Options File %s",fname);
4349b754dc9SBarry Smith   }
43505c7dedfSBarry Smith 
4363a018368SJed Brown   counts[0] = acnt;
4373a018368SJed Brown   counts[1] = cnt;
4383a018368SJed Brown   ierr = MPI_Bcast(counts,2,MPI_INT,0,comm);CHKERRQ(ierr);
4393a018368SJed Brown   acnt = counts[0];
4403a018368SJed Brown   cnt = counts[1];
4413a018368SJed Brown   if (rank) {
442854ce69bSBarry Smith     ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr);
4433a018368SJed Brown   }
4443a018368SJed Brown   if (acnt || cnt) {
4453a018368SJed Brown     ierr = MPI_Bcast(packed,2+acnt+cnt,MPI_CHAR,0,comm);CHKERRQ(ierr);
4463a018368SJed Brown     astring = packed;
4473a018368SJed Brown     vstring = packed + acnt + 1;
4483a018368SJed Brown   }
4493a018368SJed Brown 
4509b754dc9SBarry Smith   if (acnt) {
4519b754dc9SBarry Smith     PetscToken token;
4529b754dc9SBarry Smith     char       *first,*second;
4539b754dc9SBarry Smith 
4549b754dc9SBarry Smith     ierr = PetscTokenCreate(astring,' ',&token);CHKERRQ(ierr);
4559b754dc9SBarry Smith     ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
4569b754dc9SBarry Smith     while (first) {
4579b754dc9SBarry Smith       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
458c5929fdfSBarry Smith       ierr = PetscOptionsSetAlias(options,first,second);CHKERRQ(ierr);
4599b754dc9SBarry Smith       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
4609b754dc9SBarry Smith     }
4618c74ee41SBarry Smith     ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
4629b754dc9SBarry Smith   }
4639b754dc9SBarry Smith 
4649b754dc9SBarry Smith   if (cnt) {
465c5929fdfSBarry Smith     ierr = PetscOptionsInsertString(options,vstring);CHKERRQ(ierr);
466e5c89e4eSSatish Balay   }
4673a018368SJed Brown   ierr = PetscFree(packed);CHKERRQ(ierr);
468e5c89e4eSSatish Balay   PetscFunctionReturn(0);
469e5c89e4eSSatish Balay }
470e5c89e4eSSatish Balay 
471*2d747510SLisandro Dalcin static PetscErrorCode PetscOptionsInsertArgs(PetscOptions options,int argc,char *args[])
47285079163SJed Brown {
47385079163SJed Brown   PetscErrorCode ierr;
47485079163SJed Brown   int            left    = argc - 1;
47585079163SJed Brown   char           **eargs = args + 1;
47685079163SJed Brown 
47785079163SJed Brown   PetscFunctionBegin;
47885079163SJed Brown   while (left) {
479093de6efSBarry Smith     PetscBool isoptions_file,isprefixpush,isprefixpop,isp4,tisp4,isp4yourname,isp4rmrank,key;
48085079163SJed Brown     ierr = PetscStrcasecmp(eargs[0],"-options_file",&isoptions_file);CHKERRQ(ierr);
4819db968c8SJed Brown     ierr = PetscStrcasecmp(eargs[0],"-prefix_push",&isprefixpush);CHKERRQ(ierr);
4829db968c8SJed Brown     ierr = PetscStrcasecmp(eargs[0],"-prefix_pop",&isprefixpop);CHKERRQ(ierr);
48385079163SJed Brown     ierr = PetscStrcasecmp(eargs[0],"-p4pg",&isp4);CHKERRQ(ierr);
48485079163SJed Brown     ierr = PetscStrcasecmp(eargs[0],"-p4yourname",&isp4yourname);CHKERRQ(ierr);
48585079163SJed Brown     ierr = PetscStrcasecmp(eargs[0],"-p4rmrank",&isp4rmrank);CHKERRQ(ierr);
48685079163SJed Brown     ierr = PetscStrcasecmp(eargs[0],"-p4wd",&tisp4);CHKERRQ(ierr);
487ace3abfcSBarry Smith     isp4 = (PetscBool) (isp4 || tisp4);
48885079163SJed Brown     ierr = PetscStrcasecmp(eargs[0],"-np",&tisp4);CHKERRQ(ierr);
489ace3abfcSBarry Smith     isp4 = (PetscBool) (isp4 || tisp4);
49085079163SJed Brown     ierr = PetscStrcasecmp(eargs[0],"-p4amslave",&tisp4);CHKERRQ(ierr);
491093de6efSBarry Smith     ierr = PetscOptionsValidKey(eargs[0],&key);CHKERRQ(ierr);
49285079163SJed Brown 
493093de6efSBarry Smith     if (!key) {
49485079163SJed Brown       eargs++; left--;
49585079163SJed Brown     } else if (isoptions_file) {
49685079163SJed Brown       if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option");
49785079163SJed Brown       if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option");
498c5929fdfSBarry Smith       ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr);
49985079163SJed Brown       eargs += 2; left -= 2;
5009db968c8SJed Brown     } else if (isprefixpush) {
5019db968c8SJed Brown       if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option");
5029db968c8SJed Brown       if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option (prefixes cannot start with '-')");
503c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPush(options,eargs[1]);CHKERRQ(ierr);
5049db968c8SJed Brown       eargs += 2; left -= 2;
5059db968c8SJed Brown     } else if (isprefixpop) {
506c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr);
5079db968c8SJed Brown       eargs++; left--;
50885079163SJed Brown 
50985079163SJed Brown       /*
51085079163SJed Brown        These are "bad" options that MPICH, etc put on the command line
51185079163SJed Brown        we strip them out here.
51285079163SJed Brown        */
51385079163SJed Brown     } else if (tisp4 || isp4rmrank) {
51485079163SJed Brown       eargs += 1; left -= 1;
51585079163SJed Brown     } else if (isp4 || isp4yourname) {
51685079163SJed Brown       eargs += 2; left -= 2;
5177935c3d8SJed Brown     } else {
5187935c3d8SJed Brown       PetscBool nextiskey = PETSC_FALSE;
5197935c3d8SJed Brown       if (left >= 2) {ierr = PetscOptionsValidKey(eargs[1],&nextiskey);CHKERRQ(ierr);}
52098b6bf53SJed Brown       if (left < 2 || nextiskey) {
521c5929fdfSBarry Smith         ierr = PetscOptionsSetValue(options,eargs[0],NULL);CHKERRQ(ierr);
52285079163SJed Brown         eargs++; left--;
52385079163SJed Brown       } else {
524c5929fdfSBarry Smith         ierr = PetscOptionsSetValue(options,eargs[0],eargs[1]);CHKERRQ(ierr);
52585079163SJed Brown         eargs += 2; left -= 2;
52685079163SJed Brown       }
52785079163SJed Brown     }
5287935c3d8SJed Brown   }
52985079163SJed Brown   PetscFunctionReturn(0);
53085079163SJed Brown }
53185079163SJed Brown 
53285079163SJed Brown 
533e5c89e4eSSatish Balay /*@C
534e5c89e4eSSatish Balay    PetscOptionsInsert - Inserts into the options database from the command line,
535e5c89e4eSSatish Balay                    the environmental variable and a file.
536e5c89e4eSSatish Balay 
537e5c89e4eSSatish Balay    Input Parameters:
538c5929fdfSBarry Smith +  options - options database or NULL for the default global database
539c5929fdfSBarry Smith .  argc - count of number of command line arguments
540e5c89e4eSSatish Balay .  args - the command line arguments
541e5c89e4eSSatish Balay -  file - optional filename, defaults to ~username/.petscrc
542e5c89e4eSSatish Balay 
543e5c89e4eSSatish Balay    Note:
544e5c89e4eSSatish Balay    Since PetscOptionsInsert() is automatically called by PetscInitialize(),
545e5c89e4eSSatish Balay    the user does not typically need to call this routine. PetscOptionsInsert()
546e5c89e4eSSatish Balay    can be called several times, adding additional entries into the database.
547e5c89e4eSSatish Balay 
548081c24baSBoyana Norris    Options Database Keys:
549081c24baSBoyana Norris +   -options_monitor <optional filename> - print options names and values as they are set
550ec873e40SMatthew G Knepley .   -options_file <filename> - read options from a file
551081c24baSBoyana Norris 
552e5c89e4eSSatish Balay    Level: advanced
553e5c89e4eSSatish Balay 
554e5c89e4eSSatish Balay    Concepts: options database^adding
555e5c89e4eSSatish Balay 
556*2d747510SLisandro Dalcin .seealso: PetscOptionsDestroy(), PetscOptionsView(), PetscOptionsInsertString(), PetscOptionsInsertFile(),
55796fc60bcSBarry Smith           PetscInitialize()
558e5c89e4eSSatish Balay @*/
559c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options,int *argc,char ***args,const char file[])
560e5c89e4eSSatish Balay {
561e5c89e4eSSatish Balay   PetscErrorCode ierr;
562e5c89e4eSSatish Balay   PetscMPIInt    rank;
563*2d747510SLisandro Dalcin   char           filename[PETSC_MAX_PATH_LEN];
564ace3abfcSBarry Smith   PetscBool      flag = PETSC_FALSE;
565e5c89e4eSSatish Balay 
5668dea33a6SBarry Smith 
567e5c89e4eSSatish Balay   PetscFunctionBegin;
568e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
569e5c89e4eSSatish Balay 
5704b09e917SBarry Smith   if (file && file[0]) {
571*2d747510SLisandro Dalcin     ierr = PetscStrreplace(PETSC_COMM_WORLD,file,filename,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
572*2d747510SLisandro Dalcin     ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,filename,PETSC_TRUE);CHKERRQ(ierr);
573321366bcSBarry Smith   }
57485079163SJed Brown   /*
57585079163SJed Brown      We want to be able to give -skip_petscrc on the command line, but need to parse it first.  Since the command line
57685079163SJed Brown      should take precedence, we insert it twice.  It would be sufficient to just scan for -skip_petscrc.
57785079163SJed Brown   */
578*2d747510SLisandro Dalcin   if (argc && args && *argc) {ierr = PetscOptionsInsertArgs(options,*argc,*args);CHKERRQ(ierr);}
579c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-skip_petscrc",&flag,NULL);CHKERRQ(ierr);
580321366bcSBarry Smith   if (!flag) {
581*2d747510SLisandro Dalcin     ierr = PetscGetHomeDirectory(filename,PETSC_MAX_PATH_LEN-16);CHKERRQ(ierr);
5821ea3218fSSatish Balay     /* PetscOptionsInsertFile() does a fopen() on rank0 only - so only rank0 HomeDir value is relavent */
583*2d747510SLisandro Dalcin     if (filename[0]) { ierr = PetscStrcat(filename,"/.petscrc");CHKERRQ(ierr); }
584*2d747510SLisandro Dalcin     ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,filename,PETSC_FALSE);CHKERRQ(ierr);
585c5929fdfSBarry Smith     ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,".petscrc",PETSC_FALSE);CHKERRQ(ierr);
586c5929fdfSBarry Smith     ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD,options,"petscrc",PETSC_FALSE);CHKERRQ(ierr);
587e5c89e4eSSatish Balay   }
588e5c89e4eSSatish Balay 
589*2d747510SLisandro Dalcin   /* insert environment options */
590e5c89e4eSSatish Balay   {
591*2d747510SLisandro Dalcin     char   *eoptions = NULL;
592e5c89e4eSSatish Balay     size_t len       = 0;
593e5c89e4eSSatish Balay     if (!rank) {
594e5c89e4eSSatish Balay       eoptions = (char*)getenv("PETSC_OPTIONS");
595e5c89e4eSSatish Balay       ierr     = PetscStrlen(eoptions,&len);CHKERRQ(ierr);
59676434e50SSatish Balay       ierr     = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
597e5c89e4eSSatish Balay     } else {
59876434e50SSatish Balay       ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
599e5c89e4eSSatish Balay       if (len) {
600854ce69bSBarry Smith         ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr);
601e5c89e4eSSatish Balay       }
602e5c89e4eSSatish Balay     }
603e5c89e4eSSatish Balay     if (len) {
604e5c89e4eSSatish Balay       ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
60596fc60bcSBarry Smith       if (rank) eoptions[len] = 0;
606c5929fdfSBarry Smith       ierr = PetscOptionsInsertString(options,eoptions);CHKERRQ(ierr);
607e5c89e4eSSatish Balay       if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);}
608e5c89e4eSSatish Balay     }
609e5c89e4eSSatish Balay   }
610e5c89e4eSSatish Balay 
6113bcbd388SSean Farley #if defined(PETSC_HAVE_YAML)
61256a31166SBarry Smith   {
6133bcbd388SSean Farley     char      yaml_file[PETSC_MAX_PATH_LEN];
61456a31166SBarry Smith     PetscBool yaml_flg;
615c5929fdfSBarry Smith     ierr = PetscOptionsGetString(NULL,NULL,"-options_file_yaml",yaml_file,PETSC_MAX_PATH_LEN,&yaml_flg);CHKERRQ(ierr);
61656a31166SBarry Smith     if (yaml_flg) {
61756a31166SBarry Smith       ierr = PetscOptionsInsertFileYAML(PETSC_COMM_WORLD,yaml_file,PETSC_TRUE);CHKERRQ(ierr);
61856a31166SBarry Smith     }
61956a31166SBarry Smith   }
6203bcbd388SSean Farley #endif
6213bcbd388SSean Farley 
62285079163SJed Brown   /* insert command line options again because they take precedence over arguments in petscrc/environment */
623*2d747510SLisandro Dalcin   if (argc && args && *argc) {ierr = PetscOptionsInsertArgs(options,*argc,*args);CHKERRQ(ierr);}
624e5c89e4eSSatish Balay   PetscFunctionReturn(0);
625e5c89e4eSSatish Balay }
626e5c89e4eSSatish Balay 
627e5c89e4eSSatish Balay /*@C
62888c29154SBarry Smith    PetscOptionsView - Prints the options that have been loaded. This is
629e5c89e4eSSatish Balay    useful for debugging purposes.
630e5c89e4eSSatish Balay 
631c139c21fSBarry Smith    Logically Collective on PetscViewer
632e5c89e4eSSatish Balay 
633e5c89e4eSSatish Balay    Input Parameter:
6345c9cc608SHong Zhang -  options - options database, use NULL for default global database
6355c9cc608SHong Zhang +  viewer - must be an PETSCVIEWERASCII viewer
636e5c89e4eSSatish Balay 
637e5c89e4eSSatish Balay    Options Database Key:
6381d1ba570SSatish Balay .  -options_table - Activates PetscOptionsView() within PetscFinalize()
639e5c89e4eSSatish Balay 
640e5c89e4eSSatish Balay    Level: advanced
641e5c89e4eSSatish Balay 
642e5c89e4eSSatish Balay    Concepts: options database^printing
643e5c89e4eSSatish Balay 
644e5c89e4eSSatish Balay .seealso: PetscOptionsAllUsed()
645e5c89e4eSSatish Balay @*/
646c5929fdfSBarry Smith PetscErrorCode PetscOptionsView(PetscOptions options,PetscViewer viewer)
647e5c89e4eSSatish Balay {
648e5c89e4eSSatish Balay   PetscErrorCode ierr;
649431c96f7SBarry Smith   PetscInt       i;
65088c29154SBarry Smith   PetscBool      isascii;
651e5c89e4eSSatish Balay 
652e5c89e4eSSatish Balay   PetscFunctionBegin;
653*2d747510SLisandro Dalcin   if (viewer) PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
654c5929fdfSBarry Smith   options = options ? options : defaultoptions;
65588c29154SBarry Smith   if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD;
656251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
657ce94432eSBarry Smith   if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer");
65888c29154SBarry Smith 
659*2d747510SLisandro Dalcin   if (!options->N) {
66088c29154SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"#No PETSc Option Table entries\n");CHKERRQ(ierr);
661*2d747510SLisandro Dalcin     PetscFunctionReturn(0);
66230694fe9SBarry Smith   }
663*2d747510SLisandro Dalcin 
664*2d747510SLisandro Dalcin   ierr = PetscViewerASCIIPrintf(viewer,"#PETSc Option Table entries:\n");CHKERRQ(ierr);
665e5c89e4eSSatish Balay   for (i=0; i<options->N; i++) {
666e5c89e4eSSatish Balay     if (options->values[i]) {
66788c29154SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"-%s %s\n",options->names[i],options->values[i]);CHKERRQ(ierr);
668e5c89e4eSSatish Balay     } else {
66988c29154SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"-%s\n",options->names[i]);CHKERRQ(ierr);
670e5c89e4eSSatish Balay     }
671e5c89e4eSSatish Balay   }
67288c29154SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"#End of PETSc Option Table entries\n");CHKERRQ(ierr);
673e5c89e4eSSatish Balay   PetscFunctionReturn(0);
674e5c89e4eSSatish Balay }
675e5c89e4eSSatish Balay 
676e11779c2SBarry Smith /*
677e11779c2SBarry Smith    Called by error handlers to print options used in run
678e11779c2SBarry Smith */
67995c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void)
680e11779c2SBarry Smith {
681e11779c2SBarry Smith   PetscInt     i;
6824416b707SBarry Smith   PetscOptions options = defaultoptions;
683e11779c2SBarry Smith 
684e11779c2SBarry Smith   PetscFunctionBegin;
685e11779c2SBarry Smith   if (options->N) {
686e11779c2SBarry Smith     (*PetscErrorPrintf)("PETSc Option Table entries:\n");
687e11779c2SBarry Smith   } else {
688e11779c2SBarry Smith     (*PetscErrorPrintf)("No PETSc Option Table entries\n");
689e11779c2SBarry Smith   }
690e11779c2SBarry Smith   for (i=0; i<options->N; i++) {
691e11779c2SBarry Smith     if (options->values[i]) {
692e11779c2SBarry Smith       (*PetscErrorPrintf)("-%s %s\n",options->names[i],options->values[i]);
693e11779c2SBarry Smith     } else {
694e11779c2SBarry Smith       (*PetscErrorPrintf)("-%s\n",options->names[i]);
695e11779c2SBarry Smith     }
696e11779c2SBarry Smith   }
697e11779c2SBarry Smith   PetscFunctionReturn(0);
698e11779c2SBarry Smith }
699e11779c2SBarry Smith 
700e5c89e4eSSatish Balay /*@C
70174e0666dSJed Brown    PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow.
70274e0666dSJed Brown 
70374e0666dSJed Brown    Not Collective, but prefix will only be applied on calling ranks
70474e0666dSJed Brown 
7059db968c8SJed Brown    Input Parameter:
706c5929fdfSBarry Smith +  options - options database, or NULL for the default global database
707c5929fdfSBarry Smith -  prefix - The string to append to the existing prefix
7089db968c8SJed Brown 
7099db968c8SJed Brown    Options Database Keys:
7109db968c8SJed Brown  +   -prefix_push <some_prefix_> - push the given prefix
7119db968c8SJed Brown  -   -prefix_pop - pop the last prefix
7129db968c8SJed Brown 
7139db968c8SJed Brown    Notes:
7149db968c8SJed Brown    It is common to use this in conjunction with -options_file as in
7159db968c8SJed Brown 
7169db968c8SJed Brown  $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop
7179db968c8SJed Brown 
7189db968c8SJed Brown    where the files no longer require all options to be prefixed with -system2_.
71974e0666dSJed Brown 
72074e0666dSJed Brown Level: advanced
72174e0666dSJed Brown 
72274e0666dSJed Brown .seealso: PetscOptionsPrefixPop()
72374e0666dSJed Brown @*/
724c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPush(PetscOptions options,const char prefix[])
72574e0666dSJed Brown {
72674e0666dSJed Brown   PetscErrorCode ierr;
72774e0666dSJed Brown   size_t         n;
72874e0666dSJed Brown   PetscInt       start;
729*2d747510SLisandro Dalcin   char           key[MAXOPTNAME+1];
730*2d747510SLisandro Dalcin   PetscBool      valid;
73174e0666dSJed Brown 
73274e0666dSJed Brown   PetscFunctionBegin;
7339db968c8SJed Brown   PetscValidCharPointer(prefix,1);
734c5929fdfSBarry Smith   options = options ? options : defaultoptions;
73574e0666dSJed Brown   if (options->prefixind >= MAXPREFIXES) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum depth of prefix stack %d exceeded, recompile \n src/sys/objects/options.c with larger value for MAXPREFIXES",MAXPREFIXES);
736*2d747510SLisandro Dalcin   key[0] = '-'; /* keys must start with '-' */
737*2d747510SLisandro Dalcin   ierr = PetscStrncpy(key+1,prefix,sizeof(key)-1);CHKERRQ(ierr);
738*2d747510SLisandro Dalcin   ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr);
739*2d747510SLisandro Dalcin   if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Given prefix \"%s\" not valid (the first character must be a letter, do not include leading '-')",prefix);
74074e0666dSJed Brown   start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0;
74174e0666dSJed Brown   ierr = PetscStrlen(prefix,&n);CHKERRQ(ierr);
74274e0666dSJed Brown   if (n+1 > sizeof(options->prefix)-start) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %d exceeded",sizeof(options->prefix));
74374e0666dSJed Brown   ierr = PetscMemcpy(options->prefix+start,prefix,n+1);CHKERRQ(ierr);
74474e0666dSJed Brown   options->prefixstack[options->prefixind++] = start+n;
74574e0666dSJed Brown   PetscFunctionReturn(0);
74674e0666dSJed Brown }
74774e0666dSJed Brown 
748c5929fdfSBarry Smith /*@C
74974e0666dSJed Brown    PetscOptionsPrefixPop - Remove the latest options prefix, see PetscOptionsPrefixPush() for details
75074e0666dSJed Brown 
75174e0666dSJed Brown    Not  Collective, but prefix will only be popped on calling ranks
75274e0666dSJed Brown 
753c5929fdfSBarry Smith   Input Parameters:
754c5929fdfSBarry Smith .  options - options database, or NULL for the default global database
755c5929fdfSBarry Smith 
75674e0666dSJed Brown    Level: advanced
75774e0666dSJed Brown 
75874e0666dSJed Brown .seealso: PetscOptionsPrefixPush()
75974e0666dSJed Brown @*/
760c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPop(PetscOptions options)
76174e0666dSJed Brown {
76274e0666dSJed Brown   PetscInt offset;
76374e0666dSJed Brown 
76474e0666dSJed Brown   PetscFunctionBegin;
765c5929fdfSBarry Smith   options = options ? options : defaultoptions;
76674e0666dSJed Brown   if (options->prefixind < 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More prefixes popped than pushed");
76774e0666dSJed Brown   options->prefixind--;
76874e0666dSJed Brown   offset = options->prefixind ? options->prefixstack[options->prefixind-1] : 0;
76974e0666dSJed Brown   options->prefix[offset] = 0;
77074e0666dSJed Brown   PetscFunctionReturn(0);
77174e0666dSJed Brown }
77274e0666dSJed Brown 
773a542b6e8SBarry Smith /*@C
774a542b6e8SBarry Smith     PetscOptionsClear - Removes all options form the database leaving it empty.
775a542b6e8SBarry Smith 
776c5929fdfSBarry Smith   Input Parameters:
777c5929fdfSBarry Smith .  options - options database, use NULL for the default global database
778c5929fdfSBarry Smith 
779a542b6e8SBarry Smith    Level: developer
780a542b6e8SBarry Smith 
781a542b6e8SBarry Smith .seealso: PetscOptionsInsert()
782a542b6e8SBarry Smith @*/
783c5929fdfSBarry Smith PetscErrorCode PetscOptionsClear(PetscOptions options)
784a542b6e8SBarry Smith {
785a542b6e8SBarry Smith   PetscInt i;
786a542b6e8SBarry Smith 
787c5929fdfSBarry Smith   options = options ? options : defaultoptions;
788*2d747510SLisandro Dalcin   if (!options) return 0;
789*2d747510SLisandro Dalcin 
790a542b6e8SBarry Smith   for (i=0; i<options->N; i++) {
791a542b6e8SBarry Smith     if (options->names[i])  free(options->names[i]);
792a542b6e8SBarry Smith     if (options->values[i]) free(options->values[i]);
793a542b6e8SBarry Smith   }
794*2d747510SLisandro Dalcin   options->N = 0;
795*2d747510SLisandro Dalcin 
796a542b6e8SBarry Smith   for (i=0; i<options->Naliases; i++) {
797a542b6e8SBarry Smith     free(options->aliases1[i]);
798a542b6e8SBarry Smith     free(options->aliases2[i]);
799a542b6e8SBarry Smith   }
800a542b6e8SBarry Smith   options->Naliases = 0;
801a542b6e8SBarry Smith 
802*2d747510SLisandro Dalcin   /* destroy hash table */
803*2d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
804*2d747510SLisandro Dalcin   options->ht = NULL;
8050eb63584SBarry Smith 
806*2d747510SLisandro Dalcin   options->prefixind = 0;
807*2d747510SLisandro Dalcin   options->prefix[0] = 0;
808*2d747510SLisandro Dalcin   options->help      = PETSC_FALSE;
8094416b707SBarry Smith   return 0;
8104416b707SBarry Smith }
8114416b707SBarry Smith 
812*2d747510SLisandro Dalcin /*@C
813*2d747510SLisandro Dalcin    PetscOptionsSetAlias - Makes a key and alias for another key
814*2d747510SLisandro Dalcin 
815*2d747510SLisandro Dalcin    Not Collective, but setting values on certain processors could cause problems
816*2d747510SLisandro Dalcin    for parallel objects looking for options.
817*2d747510SLisandro Dalcin 
818*2d747510SLisandro Dalcin    Input Parameters:
819*2d747510SLisandro Dalcin +  options - options database, or NULL for default global database
820*2d747510SLisandro Dalcin .  newname - the alias
821*2d747510SLisandro Dalcin -  oldname - the name that alias will refer to
822*2d747510SLisandro Dalcin 
823*2d747510SLisandro Dalcin    Level: advanced
824*2d747510SLisandro Dalcin 
825*2d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(),
826*2d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(),
827*2d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
828*2d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
829*2d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
830*2d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
831*2d747510SLisandro Dalcin @*/
832*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[])
833*2d747510SLisandro Dalcin {
834*2d747510SLisandro Dalcin   PetscInt       n;
835*2d747510SLisandro Dalcin   size_t         len;
836*2d747510SLisandro Dalcin   PetscErrorCode ierr;
837*2d747510SLisandro Dalcin 
838*2d747510SLisandro Dalcin   PetscFunctionBegin;
839*2d747510SLisandro Dalcin   PetscValidCharPointer(newname,2);
840*2d747510SLisandro Dalcin   PetscValidCharPointer(oldname,3);
841*2d747510SLisandro Dalcin   options = options ? options : defaultoptions;
842*2d747510SLisandro Dalcin   if (newname[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"aliased must start with '-': Instead %s",newname);
843*2d747510SLisandro Dalcin   if (oldname[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"aliasee must start with '-': Instead %s",oldname);
844*2d747510SLisandro Dalcin 
845*2d747510SLisandro Dalcin   n = options->Naliases;
846*2d747510SLisandro Dalcin   if (n >= MAXALIASES) SETERRQ1(PETSC_COMM_SELF,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);
847*2d747510SLisandro Dalcin 
848*2d747510SLisandro Dalcin   newname++; oldname++;
849*2d747510SLisandro Dalcin   ierr = PetscStrlen(newname,&len);CHKERRQ(ierr);
850*2d747510SLisandro Dalcin   options->aliases1[n] = (char*)malloc((len+1)*sizeof(char));
851*2d747510SLisandro Dalcin   ierr = PetscStrcpy(options->aliases1[n],newname);CHKERRQ(ierr);
852*2d747510SLisandro Dalcin   ierr = PetscStrlen(oldname,&len);CHKERRQ(ierr);
853*2d747510SLisandro Dalcin   options->aliases2[n] = (char*)malloc((len+1)*sizeof(char));
854*2d747510SLisandro Dalcin   ierr = PetscStrcpy(options->aliases2[n],oldname);CHKERRQ(ierr);
855*2d747510SLisandro Dalcin   options->Naliases++;
856*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
857*2d747510SLisandro Dalcin }
8584416b707SBarry Smith 
859e5c89e4eSSatish Balay /*@C
860e5c89e4eSSatish Balay    PetscOptionsSetValue - Sets an option name-value pair in the options
861e5c89e4eSSatish Balay    database, overriding whatever is already present.
862e5c89e4eSSatish Balay 
863*2d747510SLisandro Dalcin    Not Collective, but setting values on certain processors could cause problems
864e5c89e4eSSatish Balay    for parallel objects looking for options.
865e5c89e4eSSatish Balay 
866e5c89e4eSSatish Balay    Input Parameters:
867c5929fdfSBarry Smith +  options - options database, use NULL for the default global database
868c5929fdfSBarry Smith .  name - name of option, this SHOULD have the - prepended
869*2d747510SLisandro Dalcin -  value - the option value (not used for all options, so can be NULL)
870e5c89e4eSSatish Balay 
871e5c89e4eSSatish Balay    Level: intermediate
872e5c89e4eSSatish Balay 
873e5c89e4eSSatish Balay    Note:
874d49172ceSBarry Smith    This function can be called BEFORE PetscInitialize()
875d49172ceSBarry Smith 
876*2d747510SLisandro Dalcin    Developers Note: Uses malloc() directly because PETSc may not be initialized yet.
877b0250c70SBarry Smith 
878e5c89e4eSSatish Balay    Concepts: options database^adding option
879e5c89e4eSSatish Balay 
880*2d747510SLisandro Dalcin .seealso: PetscOptionsInsert(), PetscOptionsClearValue()
881e5c89e4eSSatish Balay @*/
882*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetValue(PetscOptions options,const char name[],const char value[])
883e5c89e4eSSatish Balay {
884e5c89e4eSSatish Balay   size_t         len;
885*2d747510SLisandro Dalcin   int            N,n,i;
886e5c89e4eSSatish Balay   char           **names;
887*2d747510SLisandro Dalcin   char           fullname[MAXOPTNAME] = "";
888*2d747510SLisandro Dalcin   PetscErrorCode ierr;
889e5c89e4eSSatish Balay 
890*2d747510SLisandro Dalcin   if (!options && !defaultoptions) {
891*2d747510SLisandro Dalcin     ierr = PetscOptionsCreateDefault();if (ierr) return ierr;
892c5929fdfSBarry Smith   }
893*2d747510SLisandro Dalcin   options = options ? options : defaultoptions;
894*2d747510SLisandro Dalcin 
895*2d747510SLisandro Dalcin   if (name[0] != '-') return PETSC_ERR_ARG_OUTOFRANGE;
896e5c89e4eSSatish Balay 
897d49172ceSBarry Smith   /* this is so that -h and -help are equivalent (p4 does not like -help)*/
898*2d747510SLisandro Dalcin   if (!strcmp(name,"-h")) name = "-help";
899*2d747510SLisandro Dalcin   if (!PetscOptNameCmp(name,"-help")) options->help = PETSC_TRUE;
900e5c89e4eSSatish Balay 
901*2d747510SLisandro Dalcin   name++; /* skip starting dash */
902*2d747510SLisandro Dalcin 
90374e0666dSJed Brown   if (options->prefixind > 0) {
904d49172ceSBarry Smith     strncpy(fullname,options->prefix,sizeof(fullname));
905*2d747510SLisandro Dalcin     fullname[sizeof(fullname)-1] = 0;
90689ae1891SBarry Smith     strncat(fullname,name,sizeof(fullname)-strlen(fullname)-1);
907*2d747510SLisandro Dalcin     fullname[sizeof(fullname)-1] = 0;
90874e0666dSJed Brown     name = fullname;
90974e0666dSJed Brown   }
91074e0666dSJed Brown 
91174e0666dSJed Brown   /* check against aliases */
912e5c89e4eSSatish Balay   N = options->Naliases;
913e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
914*2d747510SLisandro Dalcin     int result = PetscOptNameCmp(options->aliases1[i],name);
915*2d747510SLisandro Dalcin     if (!result) { name = options->aliases2[i]; break; }
916e5c89e4eSSatish Balay   }
917e5c89e4eSSatish Balay 
918*2d747510SLisandro Dalcin   /* slow search */
919*2d747510SLisandro Dalcin   N = n = options->N;
920e5c89e4eSSatish Balay   names = options->names;
921e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
922*2d747510SLisandro Dalcin     int result = PetscOptNameCmp(names[i],name);
923*2d747510SLisandro Dalcin     if (!result) {
924*2d747510SLisandro Dalcin       n = i; goto setvalue;
925*2d747510SLisandro Dalcin     } else if (result > 0) {
926*2d747510SLisandro Dalcin       n = i; break;
927e5c89e4eSSatish Balay     }
928e5c89e4eSSatish Balay   }
929*2d747510SLisandro Dalcin   if (N >= MAXOPTIONS) return PETSC_ERR_MEM;
930*2d747510SLisandro Dalcin   /* shift remaining values up 1 */
931e5c89e4eSSatish Balay   for (i=N; i>n; i--) {
9325e8c5e88SLisandro Dalcin     options->names[i]  = options->names[i-1];
933e5c89e4eSSatish Balay     options->values[i] = options->values[i-1];
934e5c89e4eSSatish Balay     options->used[i]   = options->used[i-1];
935e5c89e4eSSatish Balay   }
936*2d747510SLisandro Dalcin   options->names[n]  = NULL;
937*2d747510SLisandro Dalcin   options->values[n] = NULL;
938*2d747510SLisandro Dalcin   options->used[n]   = PETSC_FALSE;
939*2d747510SLisandro Dalcin   options->N++;
940*2d747510SLisandro Dalcin 
941*2d747510SLisandro Dalcin   /* destroy hash table */
942*2d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
943*2d747510SLisandro Dalcin   options->ht = NULL;
944*2d747510SLisandro Dalcin 
945*2d747510SLisandro Dalcin   /* set new name */
94670d8d27cSBarry Smith   len = strlen(name);
9475e8c5e88SLisandro Dalcin   options->names[n] = (char*)malloc((len+1)*sizeof(char));
948d49172ceSBarry Smith   if (!options->names[n]) return PETSC_ERR_MEM;
949d49172ceSBarry Smith   strcpy(options->names[n],name);
950*2d747510SLisandro Dalcin 
951*2d747510SLisandro Dalcin setvalue:
952*2d747510SLisandro Dalcin   /* set new value */
953*2d747510SLisandro Dalcin   if (options->values[n]) free(options->values[n]);
954d49172ceSBarry Smith   len = value ? strlen(value) : 0;
9555e8c5e88SLisandro Dalcin   if (len) {
956e5c89e4eSSatish Balay     options->values[n] = (char*)malloc((len+1)*sizeof(char));
957d49172ceSBarry Smith     if (!options->values[n]) return PETSC_ERR_MEM;
958d49172ceSBarry Smith     strcpy(options->values[n],value);
959*2d747510SLisandro Dalcin   } else {
960*2d747510SLisandro Dalcin     options->values[n] = NULL;
961*2d747510SLisandro Dalcin   }
962*2d747510SLisandro Dalcin 
963*2d747510SLisandro Dalcin   ierr = PetscOptionsMonitor(options,name,value?value:"");if (ierr) return ierr;
964d49172ceSBarry Smith   return 0;
965e5c89e4eSSatish Balay }
966e5c89e4eSSatish Balay 
967e5c89e4eSSatish Balay /*@C
968e5c89e4eSSatish Balay    PetscOptionsClearValue - Clears an option name-value pair in the options
969e5c89e4eSSatish Balay    database, overriding whatever is already present.
970e5c89e4eSSatish Balay 
971e5c89e4eSSatish Balay    Not Collective, but setting values on certain processors could cause problems
972e5c89e4eSSatish Balay    for parallel objects looking for options.
973e5c89e4eSSatish Balay 
974e5c89e4eSSatish Balay    Input Parameter:
975c5929fdfSBarry Smith +  options - options database, use NULL for the default global database
976e5c89e4eSSatish Balay .  name - name of option, this SHOULD have the - prepended
977e5c89e4eSSatish Balay 
978e5c89e4eSSatish Balay    Level: intermediate
979e5c89e4eSSatish Balay 
980e5c89e4eSSatish Balay    Concepts: options database^removing option
981e5c89e4eSSatish Balay .seealso: PetscOptionsInsert()
982e5c89e4eSSatish Balay @*/
983*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsClearValue(PetscOptions options,const char name[])
984e5c89e4eSSatish Balay {
985*2d747510SLisandro Dalcin   int            N,n,i;
986*2d747510SLisandro Dalcin   char           **names;
987e5c89e4eSSatish Balay   PetscErrorCode ierr;
988e5c89e4eSSatish Balay 
989e5c89e4eSSatish Balay   PetscFunctionBegin;
990c5929fdfSBarry Smith   options = options ? options : defaultoptions;
991*2d747510SLisandro Dalcin   if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
992e5c89e4eSSatish Balay 
993*2d747510SLisandro Dalcin   /* this is so that -h and -help are equivalent (p4 does not like -help)*/
994*2d747510SLisandro Dalcin   if (!strcmp(name,"-h")) name = "-help";
995*2d747510SLisandro Dalcin   if (!PetscOptNameCmp(name,"-help")) options->help = PETSC_FALSE;
996*2d747510SLisandro Dalcin 
997*2d747510SLisandro Dalcin   name++; /* skip starting dash */
998*2d747510SLisandro Dalcin 
999*2d747510SLisandro Dalcin   /* slow search */
1000*2d747510SLisandro Dalcin   N = n = options->N;
1001e5c89e4eSSatish Balay   names = options->names;
1002e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
1003*2d747510SLisandro Dalcin     int result = PetscOptNameCmp(names[i],name);
1004*2d747510SLisandro Dalcin     if (!result) {
1005*2d747510SLisandro Dalcin       n = i; break;
1006*2d747510SLisandro Dalcin     } else if (result > 0) {
1007*2d747510SLisandro Dalcin       n = N; break;
1008e5c89e4eSSatish Balay     }
1009*2d747510SLisandro Dalcin   }
1010*2d747510SLisandro Dalcin   if (n == N) PetscFunctionReturn(0); /* it was not present */
1011e5c89e4eSSatish Balay 
1012*2d747510SLisandro Dalcin   /* remove name and value */
1013*2d747510SLisandro Dalcin   if (options->names[n])  free(options->names[n]);
1014*2d747510SLisandro Dalcin   if (options->values[n]) free(options->values[n]);
1015e5c89e4eSSatish Balay   /* shift remaining values down 1 */
1016e5c89e4eSSatish Balay   for (i=n; i<N-1; i++) {
10175e8c5e88SLisandro Dalcin     options->names[i]  = options->names[i+1];
1018e5c89e4eSSatish Balay     options->values[i] = options->values[i+1];
1019e5c89e4eSSatish Balay     options->used[i]   = options->used[i+1];
1020e5c89e4eSSatish Balay   }
1021e5c89e4eSSatish Balay   options->N--;
1022*2d747510SLisandro Dalcin 
1023*2d747510SLisandro Dalcin   /* destroy hash table */
1024*2d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
1025*2d747510SLisandro Dalcin   options->ht = NULL;
1026*2d747510SLisandro Dalcin 
1027*2d747510SLisandro Dalcin   ierr = PetscOptionsMonitor(options,name,NULL);CHKERRQ(ierr);
1028e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1029e5c89e4eSSatish Balay }
1030e5c89e4eSSatish Balay 
1031e5c89e4eSSatish Balay /*@C
1032*2d747510SLisandro Dalcin    PetscOptionsFindPair - Gets an option name-value pair from the options database.
1033e5c89e4eSSatish Balay 
1034*2d747510SLisandro Dalcin    Not Collective
1035e5c89e4eSSatish Balay 
1036e5c89e4eSSatish Balay    Input Parameters:
1037*2d747510SLisandro Dalcin +  options - options database, use NULL for the default global database
1038*2d747510SLisandro Dalcin .  pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended
1039*2d747510SLisandro Dalcin -  name - name of option, this SHOULD have the "-" prepended
1040e5c89e4eSSatish Balay 
1041*2d747510SLisandro Dalcin    Output Parameters:
1042*2d747510SLisandro Dalcin +  value - the option value (optional, not used for all options)
1043*2d747510SLisandro Dalcin -  set - whether the option is set (optional)
1044e5c89e4eSSatish Balay 
1045*2d747510SLisandro Dalcin    Level: developer
1046*2d747510SLisandro Dalcin 
1047*2d747510SLisandro Dalcin   Concepts: options database^getting option
1048*2d747510SLisandro Dalcin 
1049*2d747510SLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsClearValue()
1050e5c89e4eSSatish Balay @*/
1051*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char *value[],PetscBool *set)
1052e5c89e4eSSatish Balay {
1053*2d747510SLisandro Dalcin   char           buf[MAXOPTNAME];
1054*2d747510SLisandro Dalcin   PetscBool      usehashtable = PETSC_TRUE;
1055*2d747510SLisandro Dalcin   PetscBool      matchnumbers = PETSC_TRUE;
1056e5c89e4eSSatish Balay   PetscErrorCode ierr;
1057e5c89e4eSSatish Balay 
1058e5c89e4eSSatish Balay   PetscFunctionBegin;
1059c5929fdfSBarry Smith   options = options ? options : defaultoptions;
1060*2d747510SLisandro Dalcin   if (pre && PetscUnlikely(pre[0] == '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre);
1061*2d747510SLisandro Dalcin   if (PetscUnlikely(name[0] != '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1062e5c89e4eSSatish Balay 
1063*2d747510SLisandro Dalcin   name++; /* skip starting dash */
1064e5c89e4eSSatish Balay 
10657cd08cecSJed Brown   /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */
1066*2d747510SLisandro Dalcin   if (pre && pre[0]) {
1067*2d747510SLisandro Dalcin     char *ptr = buf;
1068*2d747510SLisandro Dalcin     if (name[0] == '-') { *ptr++ = '-';  name++; }
1069*2d747510SLisandro Dalcin     ierr = PetscStrncpy(ptr,pre,buf+sizeof(buf)-ptr);CHKERRQ(ierr);
1070*2d747510SLisandro Dalcin     ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr);
1071*2d747510SLisandro Dalcin     name = buf;
10727cd08cecSJed Brown   }
1073*2d747510SLisandro Dalcin 
10742f828895SJed Brown #if defined(PETSC_USE_DEBUG)
10752f828895SJed Brown   {
10762f828895SJed Brown     PetscBool valid;
1077*2d747510SLisandro Dalcin     char      key[MAXOPTNAME+1] = "-";
1078*2d747510SLisandro Dalcin     ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr);
10792f828895SJed Brown     ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr);
10802f828895SJed Brown     if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid option '%s' obtained from pre='%s' and name='%s'",key,pre?pre:"",name);
10812f828895SJed Brown   }
10822f828895SJed Brown #endif
1083e5c89e4eSSatish Balay 
1084*2d747510SLisandro Dalcin   if (!options->ht && usehashtable) {
1085*2d747510SLisandro Dalcin     int i,ret;
1086*2d747510SLisandro Dalcin     khiter_t it;
1087*2d747510SLisandro Dalcin     khash_t(HO) *ht;
1088*2d747510SLisandro Dalcin     ht = kh_init(HO);
1089*2d747510SLisandro Dalcin     if (PetscUnlikely(!ht)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
1090*2d747510SLisandro Dalcin     ret = kh_resize(HO,ht,options->N*2); /* twice the required size to reduce risk of collisions */
1091*2d747510SLisandro Dalcin     if (PetscUnlikely(ret)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
1092*2d747510SLisandro Dalcin     for (i=0; i<options->N; i++) {
1093*2d747510SLisandro Dalcin       it = kh_put(HO,ht,options->names[i],&ret);
1094*2d747510SLisandro Dalcin       if (PetscUnlikely(ret != 1)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
1095*2d747510SLisandro Dalcin       kh_val(ht,it) = i;
1096*2d747510SLisandro Dalcin     }
1097*2d747510SLisandro Dalcin     options->ht = ht;
1098*2d747510SLisandro Dalcin   }
1099*2d747510SLisandro Dalcin 
1100*2d747510SLisandro Dalcin   if (usehashtable)
1101*2d747510SLisandro Dalcin   { /* fast search */
1102*2d747510SLisandro Dalcin     khash_t(HO) *ht = options->ht;
1103*2d747510SLisandro Dalcin     khiter_t it = kh_get(HO,ht,name);
1104*2d747510SLisandro Dalcin     if (it != kh_end(ht)) {
1105*2d747510SLisandro Dalcin       int i = kh_val(ht,it);
1106e5c89e4eSSatish Balay       options->used[i]  = PETSC_TRUE;
1107*2d747510SLisandro Dalcin       if (value) *value = options->values[i];
1108*2d747510SLisandro Dalcin       if (set)   *set   = PETSC_TRUE;
1109*2d747510SLisandro Dalcin       PetscFunctionReturn(0);
1110*2d747510SLisandro Dalcin     }
1111*2d747510SLisandro Dalcin   } else
1112*2d747510SLisandro Dalcin   { /* slow search */
1113*2d747510SLisandro Dalcin     int i, N = options->N;
1114*2d747510SLisandro Dalcin     for (i=0; i<N; i++) {
1115*2d747510SLisandro Dalcin       int result = PetscOptNameCmp(options->names[i],name);CHKERRQ(ierr);
1116*2d747510SLisandro Dalcin       if (!result) {
1117*2d747510SLisandro Dalcin         options->used[i]  = PETSC_TRUE;
1118*2d747510SLisandro Dalcin         if (value) *value = options->values[i];
1119*2d747510SLisandro Dalcin         if (set)   *set   = PETSC_TRUE;
1120*2d747510SLisandro Dalcin         PetscFunctionReturn(0);
1121*2d747510SLisandro Dalcin       } else if (result > 0) {
1122e5c89e4eSSatish Balay         break;
1123e5c89e4eSSatish Balay       }
1124e5c89e4eSSatish Balay     }
1125*2d747510SLisandro Dalcin   }
1126*2d747510SLisandro Dalcin 
1127*2d747510SLisandro Dalcin   /*
1128*2d747510SLisandro Dalcin    The following block slows down all lookups in the most frequent path (most lookups are unsuccessful).
1129*2d747510SLisandro Dalcin    Maybe this special lookup mode should be enabled on request with a push/pop API.
1130*2d747510SLisandro Dalcin    The feature of matching _%d_ used sparingly in the codebase.
1131*2d747510SLisandro Dalcin    */
1132*2d747510SLisandro Dalcin   if (matchnumbers) {
1133*2d747510SLisandro Dalcin     int i,j,cnt = 0,locs[16],loce[16];
1134e5c89e4eSSatish Balay     /* determine the location and number of all _%d_ in the key */
1135*2d747510SLisandro Dalcin     for (i=0; name[i]; i++) {
1136*2d747510SLisandro Dalcin       if (name[i] == '_') {
1137*2d747510SLisandro Dalcin         for (j=i+1; name[j]; j++) {
1138*2d747510SLisandro Dalcin           if (name[j] >= '0' && name[j] <= '9') continue;
1139*2d747510SLisandro Dalcin           if (name[j] == '_' && j > i+1) { /* found a number */
1140e5c89e4eSSatish Balay             locs[cnt]   = i+1;
1141e5c89e4eSSatish Balay             loce[cnt++] = j+1;
1142e5c89e4eSSatish Balay           }
1143*2d747510SLisandro Dalcin           i = j-1;
1144e5c89e4eSSatish Balay           break;
1145e5c89e4eSSatish Balay         }
1146e5c89e4eSSatish Balay       }
1147e5c89e4eSSatish Balay     }
1148e5c89e4eSSatish Balay     for (i=0; i<cnt; i++) {
1149*2d747510SLisandro Dalcin       PetscBool found;
1150*2d747510SLisandro Dalcin       char      opt[MAXOPTNAME+1] = "-", tmp[MAXOPTNAME];
1151*2d747510SLisandro Dalcin       ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[i]+1),sizeof(tmp)));CHKERRQ(ierr);
1152*2d747510SLisandro Dalcin       ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr);
1153*2d747510SLisandro Dalcin       ierr = PetscStrlcat(opt,name+loce[i],sizeof(opt));CHKERRQ(ierr);
1154*2d747510SLisandro Dalcin       ierr = PetscOptionsFindPair(options,NULL,opt,value,&found);CHKERRQ(ierr);
1155*2d747510SLisandro Dalcin       if (found) {if (set) *set = PETSC_TRUE; PetscFunctionReturn(0);}
1156e5c89e4eSSatish Balay     }
1157e5c89e4eSSatish Balay   }
1158*2d747510SLisandro Dalcin 
1159*2d747510SLisandro Dalcin   if (set) *set = PETSC_FALSE;
1160e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1161e5c89e4eSSatish Balay }
1162e5c89e4eSSatish Balay 
1163*2d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[], const char name[],const char *value[],PetscBool *set)
1164514bf10dSMatthew G Knepley {
1165*2d747510SLisandro Dalcin   char           buf[MAXOPTNAME];
1166514bf10dSMatthew G Knepley   PetscErrorCode ierr;
1167514bf10dSMatthew G Knepley 
1168514bf10dSMatthew G Knepley   PetscFunctionBegin;
1169c5929fdfSBarry Smith   options = options ? options : defaultoptions;
1170*2d747510SLisandro Dalcin   if (pre && pre[0] == '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre);
1171*2d747510SLisandro Dalcin   if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1172514bf10dSMatthew G Knepley 
1173*2d747510SLisandro Dalcin   name++; /* skip starting dash */
1174514bf10dSMatthew G Knepley 
1175514bf10dSMatthew G Knepley   /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */
1176*2d747510SLisandro Dalcin   if (pre && pre[0]) {
1177*2d747510SLisandro Dalcin     char *ptr = buf;
1178*2d747510SLisandro Dalcin     if (name[0] == '-') { *ptr++ = '-';  name++; }
1179*2d747510SLisandro Dalcin     ierr = PetscStrncpy(ptr,pre,sizeof(buf)+(size_t)(ptr-buf));CHKERRQ(ierr);
1180*2d747510SLisandro Dalcin     ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr);
1181*2d747510SLisandro Dalcin     name = buf;
1182514bf10dSMatthew G Knepley   }
1183*2d747510SLisandro Dalcin 
1184514bf10dSMatthew G Knepley #if defined(PETSC_USE_DEBUG)
1185514bf10dSMatthew G Knepley   {
1186514bf10dSMatthew G Knepley     PetscBool valid;
1187*2d747510SLisandro Dalcin     char      key[MAXOPTNAME+1] = "-";
1188*2d747510SLisandro Dalcin     ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr);
1189514bf10dSMatthew G Knepley     ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr);
1190514bf10dSMatthew G Knepley     if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid option '%s' obtained from pre='%s' and name='%s'",key,pre?pre:"",name);
1191514bf10dSMatthew G Knepley   }
1192514bf10dSMatthew G Knepley #endif
1193514bf10dSMatthew G Knepley 
1194*2d747510SLisandro Dalcin   { /* slow search */
1195*2d747510SLisandro Dalcin     int       i;
1196*2d747510SLisandro Dalcin     size_t    len;
1197*2d747510SLisandro Dalcin     PetscBool match;
1198*2d747510SLisandro Dalcin     ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
1199*2d747510SLisandro Dalcin     for (i=0; i<options->N; i++) {
1200*2d747510SLisandro Dalcin       ierr = PetscStrncmp(options->names[i],name,len,&match);CHKERRQ(ierr);
1201514bf10dSMatthew G Knepley       if (match) {
1202514bf10dSMatthew G Knepley         options->used[i]  = PETSC_TRUE;
1203*2d747510SLisandro Dalcin         if (value) *value = options->values[i];
1204*2d747510SLisandro Dalcin         if (set)   *set   = PETSC_TRUE;
1205*2d747510SLisandro Dalcin         PetscFunctionReturn(0);
1206514bf10dSMatthew G Knepley       }
1207514bf10dSMatthew G Knepley     }
1208*2d747510SLisandro Dalcin   }
1209*2d747510SLisandro Dalcin 
1210*2d747510SLisandro Dalcin   if (set) *set = PETSC_FALSE;
1211514bf10dSMatthew G Knepley   PetscFunctionReturn(0);
1212514bf10dSMatthew G Knepley }
1213514bf10dSMatthew G Knepley 
1214e5c89e4eSSatish Balay /*@C
1215e5c89e4eSSatish Balay    PetscOptionsReject - Generates an error if a certain option is given.
1216e5c89e4eSSatish Balay 
1217e5c89e4eSSatish Balay    Not Collective, but setting values on certain processors could cause problems
1218e5c89e4eSSatish Balay    for parallel objects looking for options.
1219e5c89e4eSSatish Balay 
1220e5c89e4eSSatish Balay    Input Parameters:
12215c9cc608SHong Zhang +  options - options database, use NULL for default global database
1222*2d747510SLisandro Dalcin .  pre - the option prefix (may be NULL)
1223*2d747510SLisandro Dalcin .  name - the option name one is seeking
12240298fd71SBarry Smith -  mess - error message (may be NULL)
1225e5c89e4eSSatish Balay 
1226e5c89e4eSSatish Balay    Level: advanced
1227e5c89e4eSSatish Balay 
1228e5c89e4eSSatish Balay    Concepts: options database^rejecting option
1229e5c89e4eSSatish Balay 
1230e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(),
1231acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1232e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1233e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1234acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1235a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
1236e5c89e4eSSatish Balay @*/
1237*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[])
1238e5c89e4eSSatish Balay {
1239e5c89e4eSSatish Balay   PetscErrorCode ierr;
1240ace3abfcSBarry Smith   PetscBool      flag = PETSC_FALSE;
1241e5c89e4eSSatish Balay 
1242e5c89e4eSSatish Balay   PetscFunctionBegin;
1243*2d747510SLisandro Dalcin   ierr = PetscOptionsHasName(options,pre,name,&flag);CHKERRQ(ierr);
1244e5c89e4eSSatish Balay   if (flag) {
1245*2d747510SLisandro Dalcin     if (mess && mess[0]) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s with %s",pre?pre:"",name+1,mess);
1246*2d747510SLisandro Dalcin     else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s",pre?pre:"",name+1);
1247e5c89e4eSSatish Balay   }
1248e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1249e5c89e4eSSatish Balay }
1250e5c89e4eSSatish Balay 
1251e5c89e4eSSatish Balay /*@C
1252*2d747510SLisandro Dalcin    PetscOptionsHasHelp - Determines whether the "-help" option is in the database.
1253*2d747510SLisandro Dalcin 
1254*2d747510SLisandro Dalcin    Not Collective
1255*2d747510SLisandro Dalcin 
1256*2d747510SLisandro Dalcin    Input Parameters:
1257*2d747510SLisandro Dalcin .  options - options database, use NULL for default global database
1258*2d747510SLisandro Dalcin 
1259*2d747510SLisandro Dalcin    Output Parameters:
1260*2d747510SLisandro Dalcin .  set - PETSC_TRUE if found else PETSC_FALSE.
1261*2d747510SLisandro Dalcin 
1262*2d747510SLisandro Dalcin    Level: advanced
1263*2d747510SLisandro Dalcin 
1264*2d747510SLisandro Dalcin    Concepts: options database^help
1265*2d747510SLisandro Dalcin 
1266*2d747510SLisandro Dalcin .seealso: PetscOptionsHasName()
1267*2d747510SLisandro Dalcin @*/
1268*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsHasHelp(PetscOptions options,PetscBool *set)
1269*2d747510SLisandro Dalcin {
1270*2d747510SLisandro Dalcin   PetscFunctionBegin;
1271*2d747510SLisandro Dalcin   PetscValidPointer(set,2);
1272*2d747510SLisandro Dalcin   options = options ? options : defaultoptions;
1273*2d747510SLisandro Dalcin   *set = options->help;
1274*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1275*2d747510SLisandro Dalcin }
1276*2d747510SLisandro Dalcin 
1277*2d747510SLisandro Dalcin /*@C
127890d69ab7SBarry Smith    PetscOptionsHasName - Determines whether a certain option is given in the database. This returns true whether the option is a number, string or boolean, even
127990d69ab7SBarry Smith                       its value is set to false.
1280e5c89e4eSSatish Balay 
1281e5c89e4eSSatish Balay    Not Collective
1282e5c89e4eSSatish Balay 
1283e5c89e4eSSatish Balay    Input Parameters:
12845c9cc608SHong Zhang +  options - options database, use NULL for default global database
12853de71b31SHong Zhang .  pre - string to prepend to the name or NULL
12863de71b31SHong Zhang -  name - the option one is seeking
1287e5c89e4eSSatish Balay 
1288e5c89e4eSSatish Balay    Output Parameters:
128996ef3cdfSSatish Balay .  set - PETSC_TRUE if found else PETSC_FALSE.
1290e5c89e4eSSatish Balay 
1291e5c89e4eSSatish Balay    Level: beginner
1292e5c89e4eSSatish Balay 
1293e5c89e4eSSatish Balay    Concepts: options database^has option name
1294e5c89e4eSSatish Balay 
129595452b02SPatrick Sanan    Notes:
1296*2d747510SLisandro Dalcin    Name cannot be simply "-h".
1297431c96f7SBarry Smith 
1298acfcf0e5SJed Brown    In many cases you probably want to use PetscOptionsGetBool() instead of calling this, to allowing toggling values.
129990d69ab7SBarry Smith 
1300e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1301f3e3d7dfSBarry Smith           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1302e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1303e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1304acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1305a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
1306e5c89e4eSSatish Balay @*/
1307c5929fdfSBarry Smith PetscErrorCode PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool *set)
1308e5c89e4eSSatish Balay {
1309*2d747510SLisandro Dalcin   const char     *value;
1310e5c89e4eSSatish Balay   PetscErrorCode ierr;
1311ace3abfcSBarry Smith   PetscBool      flag;
1312e5c89e4eSSatish Balay 
1313e5c89e4eSSatish Balay   PetscFunctionBegin;
1314*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
131596ef3cdfSSatish Balay   if (set) *set = flag;
1316e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1317e5c89e4eSSatish Balay }
1318e5c89e4eSSatish Balay 
1319e5c89e4eSSatish Balay /*@C
1320*2d747510SLisandro Dalcin    PetscOptionsGetAll - Lists all the options the program was run with in a single string.
1321*2d747510SLisandro Dalcin 
1322*2d747510SLisandro Dalcin    Not Collective
1323*2d747510SLisandro Dalcin 
1324*2d747510SLisandro Dalcin    Input Paramter:
1325*2d747510SLisandro Dalcin .  options - the options database, use NULL for the default global database
1326*2d747510SLisandro Dalcin 
1327*2d747510SLisandro Dalcin    Output Parameter:
1328*2d747510SLisandro Dalcin .  copts - pointer where string pointer is stored
1329*2d747510SLisandro Dalcin 
1330*2d747510SLisandro Dalcin    Notes:
1331*2d747510SLisandro Dalcin     the array and each entry in the array should be freed with PetscFree()
1332*2d747510SLisandro Dalcin 
1333*2d747510SLisandro Dalcin    Level: advanced
1334*2d747510SLisandro Dalcin 
1335*2d747510SLisandro Dalcin    Concepts: options database^listing
1336*2d747510SLisandro Dalcin 
1337*2d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsView()
1338*2d747510SLisandro Dalcin @*/
1339*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetAll(PetscOptions options,char *copts[])
1340*2d747510SLisandro Dalcin {
1341*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1342*2d747510SLisandro Dalcin   PetscInt       i;
1343*2d747510SLisandro Dalcin   size_t         len = 1,lent = 0;
1344*2d747510SLisandro Dalcin   char           *coptions = NULL;
1345*2d747510SLisandro Dalcin 
1346*2d747510SLisandro Dalcin   PetscFunctionBegin;
1347*2d747510SLisandro Dalcin   PetscValidPointer(copts,2);
1348*2d747510SLisandro Dalcin   options = options ? options : defaultoptions;
1349*2d747510SLisandro Dalcin   /* count the length of the required string */
1350*2d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
1351*2d747510SLisandro Dalcin     ierr = PetscStrlen(options->names[i],&lent);CHKERRQ(ierr);
1352*2d747510SLisandro Dalcin     len += 2 + lent;
1353*2d747510SLisandro Dalcin     if (options->values[i]) {
1354*2d747510SLisandro Dalcin       ierr = PetscStrlen(options->values[i],&lent);CHKERRQ(ierr);
1355*2d747510SLisandro Dalcin       len += 1 + lent;
1356*2d747510SLisandro Dalcin     }
1357*2d747510SLisandro Dalcin   }
1358*2d747510SLisandro Dalcin   ierr = PetscMalloc1(len,&coptions);CHKERRQ(ierr);
1359*2d747510SLisandro Dalcin   coptions[0] = 0;
1360*2d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
1361*2d747510SLisandro Dalcin     ierr = PetscStrcat(coptions,"-");CHKERRQ(ierr);
1362*2d747510SLisandro Dalcin     ierr = PetscStrcat(coptions,options->names[i]);CHKERRQ(ierr);
1363*2d747510SLisandro Dalcin     ierr = PetscStrcat(coptions," ");CHKERRQ(ierr);
1364*2d747510SLisandro Dalcin     if (options->values[i]) {
1365*2d747510SLisandro Dalcin       ierr = PetscStrcat(coptions,options->values[i]);CHKERRQ(ierr);
1366*2d747510SLisandro Dalcin       ierr = PetscStrcat(coptions," ");CHKERRQ(ierr);
1367*2d747510SLisandro Dalcin     }
1368*2d747510SLisandro Dalcin   }
1369*2d747510SLisandro Dalcin   *copts = coptions;
1370*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1371*2d747510SLisandro Dalcin }
1372*2d747510SLisandro Dalcin 
1373*2d747510SLisandro Dalcin /*@C
1374*2d747510SLisandro Dalcin    PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database
1375*2d747510SLisandro Dalcin 
1376*2d747510SLisandro Dalcin    Not Collective
1377*2d747510SLisandro Dalcin 
1378*2d747510SLisandro Dalcin    Input Parameter:
1379*2d747510SLisandro Dalcin +  options - options database, use NULL for default global database
1380*2d747510SLisandro Dalcin -  name - string name of option
1381*2d747510SLisandro Dalcin 
1382*2d747510SLisandro Dalcin    Output Parameter:
1383*2d747510SLisandro Dalcin .  used - PETSC_TRUE if the option was used, otherwise false, including if option was not found in options database
1384*2d747510SLisandro Dalcin 
1385*2d747510SLisandro Dalcin    Level: advanced
1386*2d747510SLisandro Dalcin 
1387*2d747510SLisandro Dalcin .seealso: PetscOptionsView(), PetscOptionsLeft(), PetscOptionsAllUsed()
1388*2d747510SLisandro Dalcin @*/
1389*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsUsed(PetscOptions options,const char *name,PetscBool *used)
1390*2d747510SLisandro Dalcin {
1391*2d747510SLisandro Dalcin   PetscInt       i;
1392*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1393*2d747510SLisandro Dalcin 
1394*2d747510SLisandro Dalcin   PetscFunctionBegin;
1395*2d747510SLisandro Dalcin   PetscValidCharPointer(name,2);
1396*2d747510SLisandro Dalcin   PetscValidPointer(used,3);
1397*2d747510SLisandro Dalcin   options = options ? options : defaultoptions;
1398*2d747510SLisandro Dalcin   *used = PETSC_FALSE;
1399*2d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
1400*2d747510SLisandro Dalcin     ierr = PetscStrcmp(options->names[i],name,used);CHKERRQ(ierr);
1401*2d747510SLisandro Dalcin     if (*used) {
1402*2d747510SLisandro Dalcin       *used = options->used[i];
1403*2d747510SLisandro Dalcin       break;
1404*2d747510SLisandro Dalcin     }
1405*2d747510SLisandro Dalcin   }
1406*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1407*2d747510SLisandro Dalcin }
1408*2d747510SLisandro Dalcin 
1409*2d747510SLisandro Dalcin /*@C
1410*2d747510SLisandro Dalcin    PetscOptionsAllUsed - Returns a count of the number of options in the
1411*2d747510SLisandro Dalcin    database that have never been selected.
1412*2d747510SLisandro Dalcin 
1413*2d747510SLisandro Dalcin    Not Collective
1414*2d747510SLisandro Dalcin 
1415*2d747510SLisandro Dalcin    Input Parameter:
1416*2d747510SLisandro Dalcin .  options - options database, use NULL for default global database
1417*2d747510SLisandro Dalcin 
1418*2d747510SLisandro Dalcin    Output Parameter:
1419*2d747510SLisandro Dalcin .  N - count of options not used
1420*2d747510SLisandro Dalcin 
1421*2d747510SLisandro Dalcin    Level: advanced
1422*2d747510SLisandro Dalcin 
1423*2d747510SLisandro Dalcin .seealso: PetscOptionsView()
1424*2d747510SLisandro Dalcin @*/
1425*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsAllUsed(PetscOptions options,PetscInt *N)
1426*2d747510SLisandro Dalcin {
1427*2d747510SLisandro Dalcin   PetscInt     i,n = 0;
1428*2d747510SLisandro Dalcin 
1429*2d747510SLisandro Dalcin   PetscFunctionBegin;
1430*2d747510SLisandro Dalcin   PetscValidIntPointer(N,2);
1431*2d747510SLisandro Dalcin   options = options ? options : defaultoptions;
1432*2d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
1433*2d747510SLisandro Dalcin     if (!options->used[i]) n++;
1434*2d747510SLisandro Dalcin   }
1435*2d747510SLisandro Dalcin   *N = n;
1436*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1437*2d747510SLisandro Dalcin }
1438*2d747510SLisandro Dalcin 
1439*2d747510SLisandro Dalcin /*@C
1440*2d747510SLisandro Dalcin    PetscOptionsLeft - Prints to screen any options that were set and never used.
1441*2d747510SLisandro Dalcin 
1442*2d747510SLisandro Dalcin    Not Collective
1443*2d747510SLisandro Dalcin 
1444*2d747510SLisandro Dalcin    Input Parameter:
1445*2d747510SLisandro Dalcin .  options - options database; use NULL for default global database
1446*2d747510SLisandro Dalcin 
1447*2d747510SLisandro Dalcin    Options Database Key:
1448*2d747510SLisandro Dalcin .  -options_left - Activates OptionsAllUsed() within PetscFinalize()
1449*2d747510SLisandro Dalcin 
1450*2d747510SLisandro Dalcin    Level: advanced
1451*2d747510SLisandro Dalcin 
1452*2d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed()
1453*2d747510SLisandro Dalcin @*/
1454*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeft(PetscOptions options)
1455*2d747510SLisandro Dalcin {
1456*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1457*2d747510SLisandro Dalcin   PetscInt       i;
1458*2d747510SLisandro Dalcin 
1459*2d747510SLisandro Dalcin   PetscFunctionBegin;
1460*2d747510SLisandro Dalcin   options = options ? options : defaultoptions;
1461*2d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
1462*2d747510SLisandro Dalcin     if (!options->used[i]) {
1463*2d747510SLisandro Dalcin       if (options->values[i]) {
1464*2d747510SLisandro Dalcin         ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",options->names[i],options->values[i]);CHKERRQ(ierr);
1465*2d747510SLisandro Dalcin       } else {
1466*2d747510SLisandro Dalcin         ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s (no value)\n",options->names[i]);CHKERRQ(ierr);
1467*2d747510SLisandro Dalcin       }
1468*2d747510SLisandro Dalcin     }
1469*2d747510SLisandro Dalcin   }
1470*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1471*2d747510SLisandro Dalcin }
1472*2d747510SLisandro Dalcin 
1473*2d747510SLisandro Dalcin /*@C
1474*2d747510SLisandro Dalcin    PetscOptionsLeftGet - Returns all options that were set and never used.
1475*2d747510SLisandro Dalcin 
1476*2d747510SLisandro Dalcin    Not Collective
1477*2d747510SLisandro Dalcin 
1478*2d747510SLisandro Dalcin    Input Parameter:
1479*2d747510SLisandro Dalcin .  options - options database, use NULL for default global database
1480*2d747510SLisandro Dalcin 
1481*2d747510SLisandro Dalcin    Output Parameter:
1482*2d747510SLisandro Dalcin .  N - count of options not used
1483*2d747510SLisandro Dalcin .  names - names of options not used
1484*2d747510SLisandro Dalcin .  values - values of options not used
1485*2d747510SLisandro Dalcin 
1486*2d747510SLisandro Dalcin    Level: advanced
1487*2d747510SLisandro Dalcin 
1488*2d747510SLisandro Dalcin    Notes:
1489*2d747510SLisandro Dalcin    Users should call PetscOptionsLeftRestore() to free the memory allocated in this routine
1490*2d747510SLisandro Dalcin 
1491*2d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft()
1492*2d747510SLisandro Dalcin @*/
1493*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftGet(PetscOptions options,PetscInt *N,char **names[],char **values[])
1494*2d747510SLisandro Dalcin {
1495*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1496*2d747510SLisandro Dalcin   PetscInt       i,n;
1497*2d747510SLisandro Dalcin 
1498*2d747510SLisandro Dalcin   PetscFunctionBegin;
1499*2d747510SLisandro Dalcin   if (N) PetscValidIntPointer(N,2);
1500*2d747510SLisandro Dalcin   if (names) PetscValidPointer(names,3);
1501*2d747510SLisandro Dalcin   if (values) PetscValidPointer(values,4);
1502*2d747510SLisandro Dalcin   options = options ? options : defaultoptions;
1503*2d747510SLisandro Dalcin 
1504*2d747510SLisandro Dalcin   /* The number of unused PETSc options */
1505*2d747510SLisandro Dalcin   n = 0;
1506*2d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
1507*2d747510SLisandro Dalcin     if (!options->used[i]) n++;
1508*2d747510SLisandro Dalcin   }
1509*2d747510SLisandro Dalcin   if (N) { *N = n; }
1510*2d747510SLisandro Dalcin   if (names)  { ierr = PetscMalloc1(n,names);CHKERRQ(ierr); }
1511*2d747510SLisandro Dalcin   if (values) { ierr = PetscMalloc1(n,values);CHKERRQ(ierr); }
1512*2d747510SLisandro Dalcin 
1513*2d747510SLisandro Dalcin   n = 0;
1514*2d747510SLisandro Dalcin   if (names || values) {
1515*2d747510SLisandro Dalcin     for (i=0; i<options->N; i++) {
1516*2d747510SLisandro Dalcin       if (!options->used[i]) {
1517*2d747510SLisandro Dalcin         if (names)  (*names)[n]  = options->names[i];
1518*2d747510SLisandro Dalcin         if (values) (*values)[n] = options->values[i];
1519*2d747510SLisandro Dalcin         n++;
1520*2d747510SLisandro Dalcin       }
1521*2d747510SLisandro Dalcin     }
1522*2d747510SLisandro Dalcin   }
1523*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1524*2d747510SLisandro Dalcin }
1525*2d747510SLisandro Dalcin 
1526*2d747510SLisandro Dalcin /*@C
1527*2d747510SLisandro Dalcin    PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using PetscOptionsLeftGet.
1528*2d747510SLisandro Dalcin 
1529*2d747510SLisandro Dalcin    Not Collective
1530*2d747510SLisandro Dalcin 
1531*2d747510SLisandro Dalcin    Input Parameter:
1532*2d747510SLisandro Dalcin .  options - options database, use NULL for default global database
1533*2d747510SLisandro Dalcin .  names - names of options not used
1534*2d747510SLisandro Dalcin .  values - values of options not used
1535*2d747510SLisandro Dalcin 
1536*2d747510SLisandro Dalcin    Level: advanced
1537*2d747510SLisandro Dalcin 
1538*2d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft(), PetscOptionsLeftGet()
1539*2d747510SLisandro Dalcin @*/
1540*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftRestore(PetscOptions options,PetscInt *N,char **names[],char **values[])
1541*2d747510SLisandro Dalcin {
1542*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1543*2d747510SLisandro Dalcin 
1544*2d747510SLisandro Dalcin   PetscFunctionBegin;
1545*2d747510SLisandro Dalcin   if (N) PetscValidIntPointer(N,2);
1546*2d747510SLisandro Dalcin   if (names) PetscValidPointer(names,3);
1547*2d747510SLisandro Dalcin   if (values) PetscValidPointer(values,4);
1548*2d747510SLisandro Dalcin   if (N) { *N = 0; }
1549*2d747510SLisandro Dalcin   if (names)  { ierr = PetscFree(*names);CHKERRQ(ierr); }
1550*2d747510SLisandro Dalcin   if (values) { ierr = PetscFree(*values);CHKERRQ(ierr); }
1551*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1552*2d747510SLisandro Dalcin }
1553*2d747510SLisandro Dalcin 
1554*2d747510SLisandro Dalcin /*@C
1555*2d747510SLisandro Dalcin    PetscOptionsSetFromOptions - Sets options related to the handling of options in PETSc
1556*2d747510SLisandro Dalcin 
1557*2d747510SLisandro Dalcin    Collective on PETSC_COMM_WORLD
1558*2d747510SLisandro Dalcin 
1559*2d747510SLisandro Dalcin    Input Parameter:
1560*2d747510SLisandro Dalcin .  options - options database, use NULL for default global database
1561*2d747510SLisandro Dalcin 
1562*2d747510SLisandro Dalcin    Options Database Keys:
1563*2d747510SLisandro Dalcin +  -options_monitor <optional filename> - prints the names and values of all runtime options as they are set. The monitor functionality is not
1564*2d747510SLisandro Dalcin                 available for options set through a file, environment variable, or on
1565*2d747510SLisandro Dalcin                 the command line. Only options set after PetscInitialize() completes will
1566*2d747510SLisandro Dalcin                 be monitored.
1567*2d747510SLisandro Dalcin .  -options_monitor_cancel - cancel all options database monitors
1568*2d747510SLisandro Dalcin 
1569*2d747510SLisandro Dalcin    Notes:
1570*2d747510SLisandro Dalcin    To see all options, run your program with the -help option or consult Users-Manual: sec_gettingstarted
1571*2d747510SLisandro Dalcin 
1572*2d747510SLisandro Dalcin    Level: intermediate
1573*2d747510SLisandro Dalcin 
1574*2d747510SLisandro Dalcin .keywords: set, options, database
1575*2d747510SLisandro Dalcin @*/
1576*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetFromOptions(PetscOptions options)
1577*2d747510SLisandro Dalcin {
1578*2d747510SLisandro Dalcin   PetscBool      flgc = PETSC_FALSE,flgm;
1579*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1580*2d747510SLisandro Dalcin   char           monfilename[PETSC_MAX_PATH_LEN];
1581*2d747510SLisandro Dalcin   PetscViewer    monviewer;
1582*2d747510SLisandro Dalcin 
1583*2d747510SLisandro Dalcin   PetscFunctionBegin;
1584*2d747510SLisandro Dalcin   /*
1585*2d747510SLisandro Dalcin      The options argument is currently ignored since we currently maintain only a single options database
1586*2d747510SLisandro Dalcin 
1587*2d747510SLisandro Dalcin      options = options ? options : defaultoptions;
1588*2d747510SLisandro Dalcin   */
1589*2d747510SLisandro Dalcin   ierr = PetscOptionsBegin(PETSC_COMM_WORLD,NULL,"Options for handling options","PetscOptions");CHKERRQ(ierr);
1590*2d747510SLisandro Dalcin   ierr = PetscOptionsString("-options_monitor","Monitor options database","PetscOptionsMonitorSet","stdout",monfilename,PETSC_MAX_PATH_LEN,&flgm);CHKERRQ(ierr);
1591*2d747510SLisandro Dalcin   ierr = PetscOptionsBool("-options_monitor_cancel","Cancel all options database monitors","PetscOptionsMonitorCancel",flgc,&flgc,NULL);CHKERRQ(ierr);
1592*2d747510SLisandro Dalcin   ierr = PetscOptionsEnd();CHKERRQ(ierr);
1593*2d747510SLisandro Dalcin   if (flgm) {
1594*2d747510SLisandro Dalcin     ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD,monfilename,&monviewer);CHKERRQ(ierr);
1595*2d747510SLisandro Dalcin     ierr = PetscOptionsMonitorSet(PetscOptionsMonitorDefault,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr);
1596*2d747510SLisandro Dalcin   }
1597*2d747510SLisandro Dalcin   if (flgc) { ierr = PetscOptionsMonitorCancel();CHKERRQ(ierr); }
1598*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1599*2d747510SLisandro Dalcin }
1600*2d747510SLisandro Dalcin 
1601*2d747510SLisandro Dalcin /*@C
1602*2d747510SLisandro Dalcin    PetscOptionsMonitorDefault - Print all options set value events.
1603*2d747510SLisandro Dalcin 
1604*2d747510SLisandro Dalcin    Logically Collective on PETSC_COMM_WORLD
1605*2d747510SLisandro Dalcin 
1606*2d747510SLisandro Dalcin    Input Parameters:
1607*2d747510SLisandro Dalcin +  name  - option name string
1608*2d747510SLisandro Dalcin .  value - option value string
1609*2d747510SLisandro Dalcin -  ctx - an ASCII viewer
1610*2d747510SLisandro Dalcin 
1611*2d747510SLisandro Dalcin    Level: intermediate
1612*2d747510SLisandro Dalcin 
1613*2d747510SLisandro Dalcin .keywords: PetscOptions, default, monitor
1614*2d747510SLisandro Dalcin 
1615*2d747510SLisandro Dalcin .seealso: PetscOptionsMonitorSet()
1616*2d747510SLisandro Dalcin @*/
1617*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorDefault(const char name[],const char value[],void *ctx)
1618*2d747510SLisandro Dalcin {
1619*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1620*2d747510SLisandro Dalcin   PetscViewer    viewer = (PetscViewer)ctx;
1621*2d747510SLisandro Dalcin 
1622*2d747510SLisandro Dalcin   PetscFunctionBegin;
1623*2d747510SLisandro Dalcin   if (!value) {
1624*2d747510SLisandro Dalcin     ierr = PetscViewerASCIIPrintf(viewer,"Removing option: %s\n",name,value);CHKERRQ(ierr);
1625*2d747510SLisandro Dalcin   } else if (!value[0]) {
1626*2d747510SLisandro Dalcin     ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s (no value)\n",name);CHKERRQ(ierr);
1627*2d747510SLisandro Dalcin   } else {
1628*2d747510SLisandro Dalcin     ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr);
1629*2d747510SLisandro Dalcin   }
1630*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1631*2d747510SLisandro Dalcin }
1632*2d747510SLisandro Dalcin 
1633*2d747510SLisandro Dalcin /*@C
1634*2d747510SLisandro Dalcin    PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that
1635*2d747510SLisandro Dalcin    modified the PETSc options database.
1636*2d747510SLisandro Dalcin 
1637*2d747510SLisandro Dalcin    Not Collective
1638*2d747510SLisandro Dalcin 
1639*2d747510SLisandro Dalcin    Input Parameters:
1640*2d747510SLisandro Dalcin +  monitor - pointer to function (if this is NULL, it turns off monitoring
1641*2d747510SLisandro Dalcin .  mctx    - [optional] context for private data for the
1642*2d747510SLisandro Dalcin              monitor routine (use NULL if no context is desired)
1643*2d747510SLisandro Dalcin -  monitordestroy - [optional] routine that frees monitor context
1644*2d747510SLisandro Dalcin           (may be NULL)
1645*2d747510SLisandro Dalcin 
1646*2d747510SLisandro Dalcin    Calling Sequence of monitor:
1647*2d747510SLisandro Dalcin $     monitor (const char name[], const char value[], void *mctx)
1648*2d747510SLisandro Dalcin 
1649*2d747510SLisandro Dalcin +  name - option name string
1650*2d747510SLisandro Dalcin .  value - option value string
1651*2d747510SLisandro Dalcin -  mctx  - optional monitoring context, as set by PetscOptionsMonitorSet()
1652*2d747510SLisandro Dalcin 
1653*2d747510SLisandro Dalcin    Options Database Keys:
1654*2d747510SLisandro Dalcin +    -options_monitor    - sets PetscOptionsMonitorDefault()
1655*2d747510SLisandro Dalcin -    -options_monitor_cancel - cancels all monitors that have
1656*2d747510SLisandro Dalcin                           been hardwired into a code by
1657*2d747510SLisandro Dalcin                           calls to PetscOptionsMonitorSet(), but
1658*2d747510SLisandro Dalcin                           does not cancel those set via
1659*2d747510SLisandro Dalcin                           the options database.
1660*2d747510SLisandro Dalcin 
1661*2d747510SLisandro Dalcin    Notes:
1662*2d747510SLisandro Dalcin    The default is to do nothing.  To print the name and value of options
1663*2d747510SLisandro Dalcin    being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine,
1664*2d747510SLisandro Dalcin    with a null monitoring context.
1665*2d747510SLisandro Dalcin 
1666*2d747510SLisandro Dalcin    Several different monitoring routines may be set by calling
1667*2d747510SLisandro Dalcin    PetscOptionsMonitorSet() multiple times; all will be called in the
1668*2d747510SLisandro Dalcin    order in which they were set.
1669*2d747510SLisandro Dalcin 
1670*2d747510SLisandro Dalcin    Level: beginner
1671*2d747510SLisandro Dalcin 
1672*2d747510SLisandro Dalcin .keywords: PetscOptions, set, monitor
1673*2d747510SLisandro Dalcin 
1674*2d747510SLisandro Dalcin .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorCancel()
1675*2d747510SLisandro Dalcin @*/
1676*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void**))
1677*2d747510SLisandro Dalcin {
1678*2d747510SLisandro Dalcin   PetscOptions options = defaultoptions;
1679*2d747510SLisandro Dalcin 
1680*2d747510SLisandro Dalcin   PetscFunctionBegin;
1681*2d747510SLisandro Dalcin   if (options->numbermonitors >= MAXOPTIONSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set");
1682*2d747510SLisandro Dalcin   options->monitor[options->numbermonitors]          = monitor;
1683*2d747510SLisandro Dalcin   options->monitordestroy[options->numbermonitors]   = monitordestroy;
1684*2d747510SLisandro Dalcin   options->monitorcontext[options->numbermonitors++] = (void*)mctx;
1685*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1686*2d747510SLisandro Dalcin }
1687*2d747510SLisandro Dalcin 
1688*2d747510SLisandro Dalcin /*@
1689*2d747510SLisandro Dalcin    PetscOptionsMonitorCancel - Clears all monitors for a PetscOptions object.
1690*2d747510SLisandro Dalcin 
1691*2d747510SLisandro Dalcin    Not Collective
1692*2d747510SLisandro Dalcin 
1693*2d747510SLisandro Dalcin    Options Database Key:
1694*2d747510SLisandro Dalcin .  -options_monitor_cancel - Cancels all monitors that have
1695*2d747510SLisandro Dalcin     been hardwired into a code by calls to PetscOptionsMonitorSet(),
1696*2d747510SLisandro Dalcin     but does not cancel those set via the options database.
1697*2d747510SLisandro Dalcin 
1698*2d747510SLisandro Dalcin    Level: intermediate
1699*2d747510SLisandro Dalcin 
1700*2d747510SLisandro Dalcin .keywords: PetscOptions, set, monitor
1701*2d747510SLisandro Dalcin 
1702*2d747510SLisandro Dalcin .seealso: PetscOptionsMonitorDefault(), PetscOptionsMonitorSet()
1703*2d747510SLisandro Dalcin @*/
1704*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorCancel(void)
1705*2d747510SLisandro Dalcin {
1706*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1707*2d747510SLisandro Dalcin   PetscInt       i;
1708*2d747510SLisandro Dalcin   PetscOptions   options = defaultoptions;
1709*2d747510SLisandro Dalcin 
1710*2d747510SLisandro Dalcin   PetscFunctionBegin;
1711*2d747510SLisandro Dalcin   for (i=0; i<options->numbermonitors; i++) {
1712*2d747510SLisandro Dalcin     if (options->monitordestroy[i]) {
1713*2d747510SLisandro Dalcin       ierr = (*options->monitordestroy[i])(&options->monitorcontext[i]);CHKERRQ(ierr);
1714*2d747510SLisandro Dalcin     }
1715*2d747510SLisandro Dalcin   }
1716*2d747510SLisandro Dalcin   options->numbermonitors = 0;
1717*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1718*2d747510SLisandro Dalcin }
1719*2d747510SLisandro Dalcin 
1720*2d747510SLisandro Dalcin /*
1721*2d747510SLisandro Dalcin    PetscOptionsStringToBool - Converts string to PetscBool , handles cases like "yes", "no", "true", "false", "0", "1", "off", "on".
1722*2d747510SLisandro Dalcin */
1723*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToBool(const char value[],PetscBool *a)
1724*2d747510SLisandro Dalcin {
1725*2d747510SLisandro Dalcin   PetscBool      istrue,isfalse;
1726*2d747510SLisandro Dalcin   size_t         len;
1727*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1728*2d747510SLisandro Dalcin 
1729*2d747510SLisandro Dalcin   PetscFunctionBegin;
1730*2d747510SLisandro Dalcin   ierr = PetscStrlen(value,&len);CHKERRQ(ierr);
1731*2d747510SLisandro Dalcin   if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Character string of length zero has no logical value");
1732*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"TRUE",&istrue);CHKERRQ(ierr);
1733*2d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
1734*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"YES",&istrue);CHKERRQ(ierr);
1735*2d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
1736*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"1",&istrue);CHKERRQ(ierr);
1737*2d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
1738*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"on",&istrue);CHKERRQ(ierr);
1739*2d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
1740*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr);
1741*2d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
1742*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr);
1743*2d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
1744*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr);
1745*2d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
1746*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"off",&isfalse);CHKERRQ(ierr);
1747*2d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
1748*2d747510SLisandro Dalcin   SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value);
1749*2d747510SLisandro Dalcin }
1750*2d747510SLisandro Dalcin 
1751*2d747510SLisandro Dalcin /*
1752*2d747510SLisandro Dalcin    PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide"
1753*2d747510SLisandro Dalcin */
1754*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToInt(const char name[],PetscInt *a)
1755*2d747510SLisandro Dalcin {
1756*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1757*2d747510SLisandro Dalcin   size_t         len;
1758*2d747510SLisandro Dalcin   PetscBool      decide,tdefault,mouse;
1759*2d747510SLisandro Dalcin 
1760*2d747510SLisandro Dalcin   PetscFunctionBegin;
1761*2d747510SLisandro Dalcin   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
1762*2d747510SLisandro Dalcin   if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value");
1763*2d747510SLisandro Dalcin 
1764*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr);
1765*2d747510SLisandro Dalcin   if (!tdefault) {
1766*2d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr);
1767*2d747510SLisandro Dalcin   }
1768*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr);
1769*2d747510SLisandro Dalcin   if (!decide) {
1770*2d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr);
1771*2d747510SLisandro Dalcin   }
1772*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"mouse",&mouse);CHKERRQ(ierr);
1773*2d747510SLisandro Dalcin 
1774*2d747510SLisandro Dalcin   if (tdefault)    *a = PETSC_DEFAULT;
1775*2d747510SLisandro Dalcin   else if (decide) *a = PETSC_DECIDE;
1776*2d747510SLisandro Dalcin   else if (mouse)  *a = -1;
1777*2d747510SLisandro Dalcin   else {
1778*2d747510SLisandro Dalcin     char *endptr;
1779*2d747510SLisandro Dalcin     long strtolval;
1780*2d747510SLisandro Dalcin 
1781*2d747510SLisandro Dalcin     strtolval = strtol(name,&endptr,10);
1782*2d747510SLisandro Dalcin     if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no integer value (do not include . in it)",name);
1783*2d747510SLisandro Dalcin 
1784*2d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL)
1785*2d747510SLisandro Dalcin     (void) strtolval;
1786*2d747510SLisandro Dalcin     *a = atoll(name);
1787*2d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64)
1788*2d747510SLisandro Dalcin     (void) strtolval;
1789*2d747510SLisandro Dalcin     *a = _atoi64(name);
1790*2d747510SLisandro Dalcin #else
1791*2d747510SLisandro Dalcin     *a = (PetscInt)strtolval;
1792*2d747510SLisandro Dalcin #endif
1793*2d747510SLisandro Dalcin   }
1794*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1795*2d747510SLisandro Dalcin }
1796*2d747510SLisandro Dalcin 
1797*2d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
1798*2d747510SLisandro Dalcin #include <quadmath.h>
1799*2d747510SLisandro Dalcin #endif
1800*2d747510SLisandro Dalcin 
1801*2d747510SLisandro Dalcin static PetscErrorCode PetscStrtod(const char name[],PetscReal *a,char **endptr)
1802*2d747510SLisandro Dalcin {
1803*2d747510SLisandro Dalcin   PetscFunctionBegin;
1804*2d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
1805*2d747510SLisandro Dalcin   *a = strtoflt128(name,endptr);
1806*2d747510SLisandro Dalcin #else
1807*2d747510SLisandro Dalcin   *a = (PetscReal)strtod(name,endptr);
1808*2d747510SLisandro Dalcin #endif
1809*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1810*2d747510SLisandro Dalcin }
1811*2d747510SLisandro Dalcin 
1812*2d747510SLisandro Dalcin static PetscErrorCode PetscStrtoz(const char name[],PetscScalar *a,char **endptr,PetscBool *isImaginary)
1813*2d747510SLisandro Dalcin {
1814*2d747510SLisandro Dalcin   PetscBool      hasi = PETSC_FALSE;
1815*2d747510SLisandro Dalcin   char           *ptr;
1816*2d747510SLisandro Dalcin   PetscReal      strtoval;
1817*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1818*2d747510SLisandro Dalcin 
1819*2d747510SLisandro Dalcin   PetscFunctionBegin;
1820*2d747510SLisandro Dalcin   ierr = PetscStrtod(name,&strtoval,&ptr);CHKERRQ(ierr);
1821*2d747510SLisandro Dalcin   if (ptr == name) {
1822*2d747510SLisandro Dalcin     strtoval = 1.;
1823*2d747510SLisandro Dalcin     hasi = PETSC_TRUE;
1824*2d747510SLisandro Dalcin     if (name[0] == 'i') {
1825*2d747510SLisandro Dalcin       ptr++;
1826*2d747510SLisandro Dalcin     } else if (name[0] == '+' && name[1] == 'i') {
1827*2d747510SLisandro Dalcin       ptr += 2;
1828*2d747510SLisandro Dalcin     } else if (name[0] == '-' && name[1] == 'i') {
1829*2d747510SLisandro Dalcin       strtoval = -1.;
1830*2d747510SLisandro Dalcin       ptr += 2;
1831*2d747510SLisandro Dalcin     }
1832*2d747510SLisandro Dalcin   } else if (*ptr == 'i') {
1833*2d747510SLisandro Dalcin     hasi = PETSC_TRUE;
1834*2d747510SLisandro Dalcin     ptr++;
1835*2d747510SLisandro Dalcin   }
1836*2d747510SLisandro Dalcin   *endptr = ptr;
1837*2d747510SLisandro Dalcin   *isImaginary = hasi;
1838*2d747510SLisandro Dalcin   if (hasi) {
1839*2d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX)
1840*2d747510SLisandro Dalcin     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s contains imaginary but complex not supported ",name);
1841*2d747510SLisandro Dalcin #else
1842*2d747510SLisandro Dalcin     *a = PetscCMPLX(0.,strtoval);
1843*2d747510SLisandro Dalcin #endif
1844*2d747510SLisandro Dalcin   } else {
1845*2d747510SLisandro Dalcin     *a = strtoval;
1846*2d747510SLisandro Dalcin   }
1847*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1848*2d747510SLisandro Dalcin }
1849*2d747510SLisandro Dalcin 
1850*2d747510SLisandro Dalcin /*
1851*2d747510SLisandro Dalcin    Converts a string to PetscReal value. Handles special cases like "default" and "decide"
1852*2d747510SLisandro Dalcin */
1853*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToReal(const char name[],PetscReal *a)
1854*2d747510SLisandro Dalcin {
1855*2d747510SLisandro Dalcin   size_t         len;
1856*2d747510SLisandro Dalcin   PetscBool      match;
1857*2d747510SLisandro Dalcin   char           *endptr;
1858*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1859*2d747510SLisandro Dalcin 
1860*2d747510SLisandro Dalcin   PetscFunctionBegin;
1861*2d747510SLisandro Dalcin   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
1862*2d747510SLisandro Dalcin   if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"String of length zero has no numerical value");
1863*2d747510SLisandro Dalcin 
1864*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&match);CHKERRQ(ierr);
1865*2d747510SLisandro Dalcin   if (!match) {
1866*2d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DEFAULT",&match);CHKERRQ(ierr);
1867*2d747510SLisandro Dalcin   }
1868*2d747510SLisandro Dalcin   if (match) {*a = PETSC_DEFAULT; PetscFunctionReturn(0);}
1869*2d747510SLisandro Dalcin 
1870*2d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&match);CHKERRQ(ierr);
1871*2d747510SLisandro Dalcin   if (!match) {
1872*2d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DECIDE",&match);CHKERRQ(ierr);
1873*2d747510SLisandro Dalcin   }
1874*2d747510SLisandro Dalcin   if (match) {*a = PETSC_DECIDE; PetscFunctionReturn(0);}
1875*2d747510SLisandro Dalcin 
1876*2d747510SLisandro Dalcin   ierr = PetscStrtod(name,a,&endptr);CHKERRQ(ierr);
1877*2d747510SLisandro Dalcin   if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value",name);
1878*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1879*2d747510SLisandro Dalcin }
1880*2d747510SLisandro Dalcin 
1881*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToScalar(const char name[],PetscScalar *a)
1882*2d747510SLisandro Dalcin {
1883*2d747510SLisandro Dalcin   PetscBool      imag1;
1884*2d747510SLisandro Dalcin   size_t         len;
1885*2d747510SLisandro Dalcin   PetscScalar    val = 0.;
1886*2d747510SLisandro Dalcin   char           *ptr = NULL;
1887*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1888*2d747510SLisandro Dalcin 
1889*2d747510SLisandro Dalcin   PetscFunctionBegin;
1890*2d747510SLisandro Dalcin   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
1891*2d747510SLisandro Dalcin   if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value");
1892*2d747510SLisandro Dalcin   ierr = PetscStrtoz(name,&val,&ptr,&imag1);CHKERRQ(ierr);
1893*2d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX)
1894*2d747510SLisandro Dalcin   if ((size_t) (ptr - name) < len) {
1895*2d747510SLisandro Dalcin     PetscBool   imag2;
1896*2d747510SLisandro Dalcin     PetscScalar val2;
1897*2d747510SLisandro Dalcin 
1898*2d747510SLisandro Dalcin     ierr = PetscStrtoz(ptr,&val2,&ptr,&imag2);CHKERRQ(ierr);
1899*2d747510SLisandro Dalcin     if (imag1 || !imag2) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s: must specify imaginary component second",name);
1900*2d747510SLisandro Dalcin     val = PetscCMPLX(PetscRealPart(val),PetscImaginaryPart(val2));
1901*2d747510SLisandro Dalcin   }
1902*2d747510SLisandro Dalcin #endif
1903*2d747510SLisandro Dalcin   if ((size_t) (ptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name);
1904*2d747510SLisandro Dalcin   *a = val;
1905*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
1906*2d747510SLisandro Dalcin }
1907*2d747510SLisandro Dalcin 
1908*2d747510SLisandro Dalcin /*@C
1909*2d747510SLisandro Dalcin    PetscOptionsGetBool - Gets the Logical (true or false) value for a particular
1910*2d747510SLisandro Dalcin             option in the database.
1911e5c89e4eSSatish Balay 
1912e5c89e4eSSatish Balay    Not Collective
1913e5c89e4eSSatish Balay 
1914e5c89e4eSSatish Balay    Input Parameters:
19155c9cc608SHong Zhang +  options - options database, use NULL for default global database
1916c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
1917e5c89e4eSSatish Balay -  name - the option one is seeking
1918e5c89e4eSSatish Balay 
1919e5c89e4eSSatish Balay    Output Parameter:
1920*2d747510SLisandro Dalcin +  ivalue - the logical value to return
192196ef3cdfSSatish Balay -  set - PETSC_TRUE  if found, else PETSC_FALSE
1922e5c89e4eSSatish Balay 
1923e5c89e4eSSatish Balay    Level: beginner
1924e5c89e4eSSatish Balay 
192595452b02SPatrick Sanan    Notes:
1926*2d747510SLisandro Dalcin        TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE
1927*2d747510SLisandro Dalcin        FALSE, false, NO, no, and 0 all translate to PETSC_FALSE
1928*2d747510SLisandro Dalcin 
1929*2d747510SLisandro Dalcin       If the option is given, but no value is provided, then ivalue and set are both given the value PETSC_TRUE. That is -requested_bool
1930*2d747510SLisandro Dalcin      is equivalent to -requested_bool true
1931*2d747510SLisandro Dalcin 
1932*2d747510SLisandro Dalcin        If the user does not supply the option at all ivalue is NOT changed. Thus
19332efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
19342efd9cb1SBarry Smith 
1935*2d747510SLisandro Dalcin    Concepts: options database^has logical
1936e5c89e4eSSatish Balay 
1937e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
1938*2d747510SLisandro Dalcin           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsBool(),
1939e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1940e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1941acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1942a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
1943e5c89e4eSSatish Balay @*/
1944*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool *ivalue,PetscBool *set)
1945e5c89e4eSSatish Balay {
1946*2d747510SLisandro Dalcin   const char     *value;
1947ace3abfcSBarry Smith   PetscBool      flag;
1948*2d747510SLisandro Dalcin   PetscErrorCode ierr;
1949e5c89e4eSSatish Balay 
1950e5c89e4eSSatish Balay   PetscFunctionBegin;
1951*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
1952*2d747510SLisandro Dalcin   if (ivalue) PetscValidIntPointer(ivalue,4);
1953*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
1954e5c89e4eSSatish Balay   if (flag) {
195596ef3cdfSSatish Balay     if (set) *set = PETSC_TRUE;
1956*2d747510SLisandro Dalcin     if (!value) {
1957*2d747510SLisandro Dalcin       if (ivalue) *ivalue = PETSC_TRUE;
1958*2d747510SLisandro Dalcin     } else {
1959*2d747510SLisandro Dalcin       ierr = PetscOptionsStringToBool(value, &flag);CHKERRQ(ierr);
1960*2d747510SLisandro Dalcin       if (ivalue) *ivalue = flag;
1961e5c89e4eSSatish Balay     }
1962e5c89e4eSSatish Balay   } else {
196396ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
1964e5c89e4eSSatish Balay   }
1965e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1966e5c89e4eSSatish Balay }
1967e5c89e4eSSatish Balay 
1968e5c89e4eSSatish Balay /*@C
1969e5c89e4eSSatish Balay    PetscOptionsGetEList - Puts a list of option values that a single one may be selected from
1970e5c89e4eSSatish Balay 
1971e5c89e4eSSatish Balay    Not Collective
1972e5c89e4eSSatish Balay 
1973e5c89e4eSSatish Balay    Input Parameters:
19745c9cc608SHong Zhang +  options - options database, use NULL for default global database
1975c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
1976e5c89e4eSSatish Balay .  opt - option name
1977a264d7a6SBarry Smith .  list - the possible choices (one of these must be selected, anything else is invalid)
1978e5c89e4eSSatish Balay .  ntext - number of choices
1979e5c89e4eSSatish Balay 
1980e5c89e4eSSatish Balay    Output Parameter:
19812efd9cb1SBarry Smith +  value - the index of the value to return (defaults to zero if the option name is given but no choice is listed)
1982e5c89e4eSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
1983e5c89e4eSSatish Balay 
1984e5c89e4eSSatish Balay    Level: intermediate
1985e5c89e4eSSatish Balay 
198695452b02SPatrick Sanan    Notes:
198795452b02SPatrick Sanan     If the user does not supply the option value is NOT changed. Thus
19882efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
19892efd9cb1SBarry Smith 
1990a264d7a6SBarry Smith    See PetscOptionsFList() for when the choices are given in a PetscFunctionList()
1991e5c89e4eSSatish Balay 
1992e5c89e4eSSatish Balay    Concepts: options database^list
1993e5c89e4eSSatish Balay 
1994e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1995acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1996e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1997e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1998acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1999a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2000e5c89e4eSSatish Balay @*/
2001c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscInt ntext,PetscInt *value,PetscBool *set)
2002e5c89e4eSSatish Balay {
2003e5c89e4eSSatish Balay   PetscErrorCode ierr;
2004e5c89e4eSSatish Balay   size_t         alen,len = 0;
2005e5c89e4eSSatish Balay   char           *svalue;
2006ace3abfcSBarry Smith   PetscBool      aset,flg = PETSC_FALSE;
2007e5c89e4eSSatish Balay   PetscInt       i;
2008e5c89e4eSSatish Balay 
2009e5c89e4eSSatish Balay   PetscFunctionBegin;
2010*2d747510SLisandro Dalcin   PetscValidCharPointer(opt,3);
2011e5c89e4eSSatish Balay   for (i=0; i<ntext; i++) {
2012e5c89e4eSSatish Balay     ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr);
2013e5c89e4eSSatish Balay     if (alen > len) len = alen;
2014e5c89e4eSSatish Balay   }
2015e5c89e4eSSatish Balay   len += 5; /* a little extra space for user mistypes */
2016785e854fSJed Brown   ierr = PetscMalloc1(len,&svalue);CHKERRQ(ierr);
2017c5929fdfSBarry Smith   ierr = PetscOptionsGetString(options,pre,opt,svalue,len,&aset);CHKERRQ(ierr);
2018e5c89e4eSSatish Balay   if (aset) {
2019fbedd5e0SJed Brown     ierr = PetscEListFind(ntext,list,svalue,value,&flg);CHKERRQ(ierr);
2020e32f2f54SBarry Smith     if (!flg) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown option %s for -%s%s",svalue,pre ? pre : "",opt+1);
2021fbedd5e0SJed Brown     if (set) *set = PETSC_TRUE;
2022a297a907SKarl Rupp   } else if (set) *set = PETSC_FALSE;
2023e5c89e4eSSatish Balay   ierr = PetscFree(svalue);CHKERRQ(ierr);
2024e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2025e5c89e4eSSatish Balay }
2026e5c89e4eSSatish Balay 
2027e5c89e4eSSatish Balay /*@C
2028e5c89e4eSSatish Balay    PetscOptionsGetEnum - Gets the enum value for a particular option in the database.
2029e5c89e4eSSatish Balay 
2030e5c89e4eSSatish Balay    Not Collective
2031e5c89e4eSSatish Balay 
2032e5c89e4eSSatish Balay    Input Parameters:
20335c9cc608SHong Zhang +  options - options database, use NULL for default global database
2034c5929fdfSBarry Smith .  pre - option prefix or NULL
2035e5c89e4eSSatish Balay .  opt - option name
2036e5c89e4eSSatish Balay .  list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
2037e5c89e4eSSatish Balay -  defaultv - the default (current) value
2038e5c89e4eSSatish Balay 
2039e5c89e4eSSatish Balay    Output Parameter:
2040e5c89e4eSSatish Balay +  value - the  value to return
204196ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2042e5c89e4eSSatish Balay 
2043e5c89e4eSSatish Balay    Level: beginner
2044e5c89e4eSSatish Balay 
2045e5c89e4eSSatish Balay    Concepts: options database
2046e5c89e4eSSatish Balay 
204795452b02SPatrick Sanan    Notes:
204895452b02SPatrick Sanan     If the user does not supply the option value is NOT changed. Thus
20492efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2050e5c89e4eSSatish Balay 
20512efd9cb1SBarry Smith           List is usually something like PCASMTypes or some other predefined list of enum names
2052e5c89e4eSSatish Balay 
2053e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
2054acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
2055acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
2056e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2057e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2058acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2059a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum()
2060e5c89e4eSSatish Balay @*/
2061c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscEnum *value,PetscBool *set)
2062e5c89e4eSSatish Balay {
2063e5c89e4eSSatish Balay   PetscErrorCode ierr;
206469a24498SJed Brown   PetscInt       ntext = 0,tval;
2065ace3abfcSBarry Smith   PetscBool      fset;
2066e5c89e4eSSatish Balay 
2067e5c89e4eSSatish Balay   PetscFunctionBegin;
2068*2d747510SLisandro Dalcin   PetscValidCharPointer(opt,3);
2069e5c89e4eSSatish Balay   while (list[ntext++]) {
2070e32f2f54SBarry Smith     if (ntext > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries");
2071e5c89e4eSSatish Balay   }
2072e32f2f54SBarry Smith   if (ntext < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix");
2073e5c89e4eSSatish Balay   ntext -= 3;
2074c5929fdfSBarry Smith   ierr = PetscOptionsGetEList(options,pre,opt,list,ntext,&tval,&fset);CHKERRQ(ierr);
207569a24498SJed Brown   /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */
2076809ceb46SBarry Smith   if (fset) *value = (PetscEnum)tval;
2077809ceb46SBarry Smith   if (set) *set = fset;
2078e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2079e5c89e4eSSatish Balay }
2080e5c89e4eSSatish Balay 
2081e5c89e4eSSatish Balay /*@C
2082*2d747510SLisandro Dalcin    PetscOptionsGetInt - Gets the integer value for a particular option in the database.
2083e5c89e4eSSatish Balay 
2084e5c89e4eSSatish Balay    Not Collective
2085e5c89e4eSSatish Balay 
2086e5c89e4eSSatish Balay    Input Parameters:
20875c9cc608SHong Zhang +  options - options database, use NULL for default global database
2088c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
2089e5c89e4eSSatish Balay -  name - the option one is seeking
2090e5c89e4eSSatish Balay 
2091e5c89e4eSSatish Balay    Output Parameter:
2092*2d747510SLisandro Dalcin +  ivalue - the integer value to return
209396ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2094e5c89e4eSSatish Balay 
2095e5c89e4eSSatish Balay    Level: beginner
2096e5c89e4eSSatish Balay 
2097e5c89e4eSSatish Balay    Notes:
2098*2d747510SLisandro Dalcin    If the user does not supply the option ivalue is NOT changed. Thus
20992efd9cb1SBarry Smith    you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
21005c07ccb8SBarry Smith 
2101*2d747510SLisandro Dalcin    Concepts: options database^has int
2102e5c89e4eSSatish Balay 
2103e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
2104*2d747510SLisandro Dalcin           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
2105*2d747510SLisandro Dalcin           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
2106e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2107e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2108acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2109a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2110e5c89e4eSSatish Balay @*/
2111*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetInt(PetscOptions options,const char pre[],const char name[],PetscInt *ivalue,PetscBool *set)
2112e5c89e4eSSatish Balay {
2113*2d747510SLisandro Dalcin   const char     *value;
2114e5c89e4eSSatish Balay   PetscErrorCode ierr;
2115*2d747510SLisandro Dalcin   PetscBool      flag;
2116e5c89e4eSSatish Balay 
2117e5c89e4eSSatish Balay   PetscFunctionBegin;
2118*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2119*2d747510SLisandro Dalcin   PetscValidIntPointer(ivalue,4);
2120*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2121e5c89e4eSSatish Balay   if (flag) {
212234a9cc2cSBarry Smith     if (!value) {
2123*2d747510SLisandro Dalcin       if (set) *set = PETSC_FALSE;
212434a9cc2cSBarry Smith     } else {
2125*2d747510SLisandro Dalcin       if (set) *set = PETSC_TRUE;
2126*2d747510SLisandro Dalcin       ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr);
2127e5c89e4eSSatish Balay     }
2128e5c89e4eSSatish Balay   } else {
212996ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2130e5c89e4eSSatish Balay   }
2131e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2132e5c89e4eSSatish Balay }
2133e5c89e4eSSatish Balay 
2134e2446a98SMatthew Knepley /*@C
2135e5c89e4eSSatish Balay    PetscOptionsGetReal - Gets the double precision value for a particular
2136e5c89e4eSSatish Balay    option in the database.
2137e5c89e4eSSatish Balay 
2138e5c89e4eSSatish Balay    Not Collective
2139e5c89e4eSSatish Balay 
2140e5c89e4eSSatish Balay    Input Parameters:
21415c9cc608SHong Zhang +  options - options database, use NULL for default global database
2142c5929fdfSBarry Smith .  pre - string to prepend to each name or NULL
2143e5c89e4eSSatish Balay -  name - the option one is seeking
2144e5c89e4eSSatish Balay 
2145e5c89e4eSSatish Balay    Output Parameter:
2146e5c89e4eSSatish Balay +  dvalue - the double value to return
214796ef3cdfSSatish Balay -  set - PETSC_TRUE if found, PETSC_FALSE if not found
2148e5c89e4eSSatish Balay 
214995452b02SPatrick Sanan    Notes:
215095452b02SPatrick Sanan     If the user does not supply the option dvalue is NOT changed. Thus
21512efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2152e4974155SBarry Smith 
2153e5c89e4eSSatish Balay    Level: beginner
2154e5c89e4eSSatish Balay 
2155e5c89e4eSSatish Balay    Concepts: options database^has double
2156e5c89e4eSSatish Balay 
2157e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2158acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(),
2159e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2160e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2161acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2162a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2163e5c89e4eSSatish Balay @*/
2164c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal *dvalue,PetscBool *set)
2165e5c89e4eSSatish Balay {
2166*2d747510SLisandro Dalcin   const char     *value;
2167ace3abfcSBarry Smith   PetscBool      flag;
2168*2d747510SLisandro Dalcin   PetscErrorCode ierr;
2169e5c89e4eSSatish Balay 
2170e5c89e4eSSatish Balay   PetscFunctionBegin;
2171*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2172*2d747510SLisandro Dalcin   PetscValidRealPointer(dvalue,4);
2173*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2174e5c89e4eSSatish Balay   if (flag) {
2175a297a907SKarl Rupp     if (!value) {
2176a297a907SKarl Rupp       if (set) *set = PETSC_FALSE;
2177a297a907SKarl Rupp     } else {
2178a297a907SKarl Rupp       if (set) *set = PETSC_TRUE;
2179a297a907SKarl Rupp       ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr);
2180a297a907SKarl Rupp     }
2181e5c89e4eSSatish Balay   } else {
218296ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2183e5c89e4eSSatish Balay   }
2184e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2185e5c89e4eSSatish Balay }
2186e5c89e4eSSatish Balay 
2187e5c89e4eSSatish Balay /*@C
2188e5c89e4eSSatish Balay    PetscOptionsGetScalar - Gets the scalar value for a particular
2189e5c89e4eSSatish Balay    option in the database.
2190e5c89e4eSSatish Balay 
2191e5c89e4eSSatish Balay    Not Collective
2192e5c89e4eSSatish Balay 
2193e5c89e4eSSatish Balay    Input Parameters:
21945c9cc608SHong Zhang +  options - options database, use NULL for default global database
2195c5929fdfSBarry Smith .  pre - string to prepend to each name or NULL
2196e5c89e4eSSatish Balay -  name - the option one is seeking
2197e5c89e4eSSatish Balay 
2198e5c89e4eSSatish Balay    Output Parameter:
2199e5c89e4eSSatish Balay +  dvalue - the double value to return
220096ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2201e5c89e4eSSatish Balay 
2202e5c89e4eSSatish Balay    Level: beginner
2203e5c89e4eSSatish Balay 
2204e5c89e4eSSatish Balay    Usage:
2205eb4ae41dSBarry Smith    A complex number 2+3i must be specified with NO spaces
2206e5c89e4eSSatish Balay 
220795452b02SPatrick Sanan    Notes:
220895452b02SPatrick Sanan     If the user does not supply the option dvalue is NOT changed. Thus
22092efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2210e4974155SBarry Smith 
2211e5c89e4eSSatish Balay    Concepts: options database^has scalar
2212e5c89e4eSSatish Balay 
2213e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2214acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2215e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2216e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2217acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2218a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2219e5c89e4eSSatish Balay @*/
2220c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar *dvalue,PetscBool *set)
2221e5c89e4eSSatish Balay {
2222*2d747510SLisandro Dalcin   const char     *value;
2223ace3abfcSBarry Smith   PetscBool      flag;
2224e5c89e4eSSatish Balay   PetscErrorCode ierr;
2225e5c89e4eSSatish Balay 
2226e5c89e4eSSatish Balay   PetscFunctionBegin;
2227*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2228*2d747510SLisandro Dalcin   PetscValidScalarPointer(dvalue,4);
2229*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2230e5c89e4eSSatish Balay   if (flag) {
2231e5c89e4eSSatish Balay     if (!value) {
223296ef3cdfSSatish Balay       if (set) *set = PETSC_FALSE;
2233e5c89e4eSSatish Balay     } else {
2234e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX)
2235cfbddea1SSatish Balay       ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr);
2236e5c89e4eSSatish Balay #else
2237eb4ae41dSBarry Smith       ierr = PetscOptionsStringToScalar(value,dvalue);CHKERRQ(ierr);
2238e5c89e4eSSatish Balay #endif
223996ef3cdfSSatish Balay       if (set) *set = PETSC_TRUE;
2240e5c89e4eSSatish Balay     }
2241e5c89e4eSSatish Balay   } else { /* flag */
224296ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2243e5c89e4eSSatish Balay   }
2244e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2245e5c89e4eSSatish Balay }
2246e5c89e4eSSatish Balay 
2247e5c89e4eSSatish Balay /*@C
2248e5c89e4eSSatish Balay    PetscOptionsGetString - Gets the string value for a particular option in
2249e5c89e4eSSatish Balay    the database.
2250e5c89e4eSSatish Balay 
2251e5c89e4eSSatish Balay    Not Collective
2252e5c89e4eSSatish Balay 
2253e5c89e4eSSatish Balay    Input Parameters:
22545c9cc608SHong Zhang +  options - options database, use NULL for default global database
2255c5929fdfSBarry Smith .  pre - string to prepend to name or NULL
2256e5c89e4eSSatish Balay .  name - the option one is seeking
2257bcbf2dc5SJed Brown -  len - maximum length of the string including null termination
2258e5c89e4eSSatish Balay 
2259e5c89e4eSSatish Balay    Output Parameters:
2260e5c89e4eSSatish Balay +  string - location to copy string
226196ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2262e5c89e4eSSatish Balay 
2263e5c89e4eSSatish Balay    Level: beginner
2264e5c89e4eSSatish Balay 
2265e5c89e4eSSatish Balay    Fortran Note:
2266e5c89e4eSSatish Balay    The Fortran interface is slightly different from the C/C++
2267e5c89e4eSSatish Balay    interface (len is not used).  Sample usage in Fortran follows
2268e5c89e4eSSatish Balay .vb
2269e5c89e4eSSatish Balay       character *20    string
227093e6ba5cSBarry Smith       PetscErrorCode   ierr
227193e6ba5cSBarry Smith       PetscBool        set
22721b266c99SBarry Smith       call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr)
2273e5c89e4eSSatish Balay .ve
2274e5c89e4eSSatish Balay 
227595452b02SPatrick Sanan    Notes:
227695452b02SPatrick Sanan     if the option is given but no string is provided then an empty string is returned and set is given the value of PETSC_TRUE
2277e4974155SBarry Smith 
22782efd9cb1SBarry Smith            If the user does not use the option then the string is not changed. Thus
22792efd9cb1SBarry Smith            you should ALWAYS initialize the string if you access it without first checking if the set flag is true.
22802efd9cb1SBarry Smith 
2281e5c89e4eSSatish Balay    Concepts: options database^string
2282e5c89e4eSSatish Balay 
2283f3dea69dSBarry Smith     Note:
2284f3dea69dSBarry Smith       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).
2285f3dea69dSBarry Smith 
2286e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
2287acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2288e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2289e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2290acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2291a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2292e5c89e4eSSatish Balay @*/
2293c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool *set)
2294e5c89e4eSSatish Balay {
2295*2d747510SLisandro Dalcin   const char     *value;
2296ace3abfcSBarry Smith   PetscBool      flag;
2297*2d747510SLisandro Dalcin   PetscErrorCode ierr;
2298e5c89e4eSSatish Balay 
2299e5c89e4eSSatish Balay   PetscFunctionBegin;
2300*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2301*2d747510SLisandro Dalcin   PetscValidCharPointer(string,4);
2302*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2303e5c89e4eSSatish Balay   if (!flag) {
230496ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2305e5c89e4eSSatish Balay   } else {
230696ef3cdfSSatish Balay     if (set) *set = PETSC_TRUE;
2307e5c89e4eSSatish Balay     if (value) {
2308e5c89e4eSSatish Balay       ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr);
2309e5c89e4eSSatish Balay     } else {
2310e5c89e4eSSatish Balay       ierr = PetscMemzero(string,len);CHKERRQ(ierr);
2311e5c89e4eSSatish Balay     }
2312e5c89e4eSSatish Balay   }
2313e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2314e5c89e4eSSatish Balay }
2315e5c89e4eSSatish Balay 
2316c5929fdfSBarry Smith char *PetscOptionsGetStringMatlab(PetscOptions options,const char pre[],const char name[])
231714ce751eSBarry Smith {
2318*2d747510SLisandro Dalcin   const char     *value;
231914ce751eSBarry Smith   PetscBool      flag;
2320*2d747510SLisandro Dalcin   PetscErrorCode ierr;
232114ce751eSBarry Smith 
232214ce751eSBarry Smith   PetscFunctionBegin;
2323*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);if (ierr) PetscFunctionReturn(0);
2324*2d747510SLisandro Dalcin   if (flag) PetscFunctionReturn((char*)value);
232514ce751eSBarry Smith   else PetscFunctionReturn(0);
232614ce751eSBarry Smith }
232714ce751eSBarry Smith 
2328*2d747510SLisandro Dalcin /*@C
2329*2d747510SLisandro Dalcin    PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular
2330*2d747510SLisandro Dalcin    option in the database.  The values must be separated with commas with
2331*2d747510SLisandro Dalcin    no intervening spaces.
2332*2d747510SLisandro Dalcin 
2333*2d747510SLisandro Dalcin    Not Collective
2334*2d747510SLisandro Dalcin 
2335*2d747510SLisandro Dalcin    Input Parameters:
2336*2d747510SLisandro Dalcin +  options - options database, use NULL for default global database
2337*2d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
2338*2d747510SLisandro Dalcin .  name - the option one is seeking
2339*2d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
2340*2d747510SLisandro Dalcin 
2341*2d747510SLisandro Dalcin    Output Parameter:
2342*2d747510SLisandro Dalcin +  dvalue - the integer values to return
2343*2d747510SLisandro Dalcin .  nmax - actual number of values retreived
2344*2d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
2345*2d747510SLisandro Dalcin 
2346*2d747510SLisandro Dalcin    Level: beginner
2347*2d747510SLisandro Dalcin 
2348*2d747510SLisandro Dalcin    Concepts: options database^array of ints
2349*2d747510SLisandro Dalcin 
2350*2d747510SLisandro Dalcin    Notes:
2351*2d747510SLisandro Dalcin        TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE
2352*2d747510SLisandro Dalcin        FALSE, false, NO, no, and 0 all translate to PETSC_FALSE
2353*2d747510SLisandro Dalcin 
2354*2d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2355*2d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2356*2d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2357*2d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2358*2d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2359*2d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
2360*2d747510SLisandro Dalcin @*/
2361*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt *nmax,PetscBool *set)
2362*2d747510SLisandro Dalcin {
2363*2d747510SLisandro Dalcin   const char     *svalue;
2364*2d747510SLisandro Dalcin   char           *value;
2365*2d747510SLisandro Dalcin   PetscErrorCode ierr;
2366*2d747510SLisandro Dalcin   PetscInt       n = 0;
2367*2d747510SLisandro Dalcin   PetscBool      flag;
2368*2d747510SLisandro Dalcin   PetscToken     token;
2369*2d747510SLisandro Dalcin 
2370*2d747510SLisandro Dalcin   PetscFunctionBegin;
2371*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2372*2d747510SLisandro Dalcin   PetscValidIntPointer(dvalue,4);
2373*2d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
2374*2d747510SLisandro Dalcin 
2375*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
2376*2d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
2377*2d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
2378*2d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
2379*2d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2380*2d747510SLisandro Dalcin   while (value && n < *nmax) {
2381*2d747510SLisandro Dalcin     ierr = PetscOptionsStringToBool(value,dvalue);CHKERRQ(ierr);
2382*2d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2383*2d747510SLisandro Dalcin     dvalue++;
2384*2d747510SLisandro Dalcin     n++;
2385*2d747510SLisandro Dalcin   }
2386*2d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
2387*2d747510SLisandro Dalcin   *nmax = n;
2388*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
2389*2d747510SLisandro Dalcin }
2390*2d747510SLisandro Dalcin 
2391*2d747510SLisandro Dalcin /*@C
2392*2d747510SLisandro Dalcin    PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database.
2393*2d747510SLisandro Dalcin 
2394*2d747510SLisandro Dalcin    Not Collective
2395*2d747510SLisandro Dalcin 
2396*2d747510SLisandro Dalcin    Input Parameters:
2397*2d747510SLisandro Dalcin +  options - options database, use NULL for default global database
2398*2d747510SLisandro Dalcin .  pre - option prefix or NULL
2399*2d747510SLisandro Dalcin .  name - option name
2400*2d747510SLisandro Dalcin .  list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
2401*2d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
2402*2d747510SLisandro Dalcin 
2403*2d747510SLisandro Dalcin    Output Parameters:
2404*2d747510SLisandro Dalcin +  ivalue - the  enum values to return
2405*2d747510SLisandro Dalcin .  nmax - actual number of values retreived
2406*2d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
2407*2d747510SLisandro Dalcin 
2408*2d747510SLisandro Dalcin    Level: beginner
2409*2d747510SLisandro Dalcin 
2410*2d747510SLisandro Dalcin    Concepts: options database
2411*2d747510SLisandro Dalcin 
2412*2d747510SLisandro Dalcin    Notes:
2413*2d747510SLisandro Dalcin    The array must be passed as a comma separated list.
2414*2d747510SLisandro Dalcin 
2415*2d747510SLisandro Dalcin    There must be no intervening spaces between the values.
2416*2d747510SLisandro Dalcin 
2417*2d747510SLisandro Dalcin    list is usually something like PCASMTypes or some other predefined list of enum names.
2418*2d747510SLisandro Dalcin 
2419*2d747510SLisandro Dalcin .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
2420*2d747510SLisandro Dalcin           PetscOptionsGetEnum(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
2421*2d747510SLisandro Dalcin           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), PetscOptionsName(),
2422*2d747510SLisandro Dalcin           PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), PetscOptionsStringArray(),PetscOptionsRealArray(),
2423*2d747510SLisandro Dalcin           PetscOptionsScalar(), PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2424*2d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum()
2425*2d747510SLisandro Dalcin @*/
2426*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char *const *list,PetscEnum ivalue[],PetscInt *nmax,PetscBool *set)
2427*2d747510SLisandro Dalcin {
2428*2d747510SLisandro Dalcin   const char     *svalue;
2429*2d747510SLisandro Dalcin   char           *value;
2430*2d747510SLisandro Dalcin   PetscInt       n = 0;
2431*2d747510SLisandro Dalcin   PetscEnum      evalue;
2432*2d747510SLisandro Dalcin   PetscBool      flag;
2433*2d747510SLisandro Dalcin   PetscToken     token;
2434*2d747510SLisandro Dalcin   PetscErrorCode ierr;
2435*2d747510SLisandro Dalcin 
2436*2d747510SLisandro Dalcin   PetscFunctionBegin;
2437*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2438*2d747510SLisandro Dalcin   PetscValidPointer(list,4);
2439*2d747510SLisandro Dalcin   PetscValidPointer(ivalue,5);
2440*2d747510SLisandro Dalcin   PetscValidIntPointer(nmax,6);
2441*2d747510SLisandro Dalcin 
2442*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
2443*2d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
2444*2d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
2445*2d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
2446*2d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2447*2d747510SLisandro Dalcin   while (value && n < *nmax) {
2448*2d747510SLisandro Dalcin     ierr = PetscEnumFind(list,value,&evalue,&flag);CHKERRQ(ierr);
2449*2d747510SLisandro Dalcin     if (!flag) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown enum value '%s' for -%s%s",svalue,pre ? pre : "",name+1);
2450*2d747510SLisandro Dalcin     ivalue[n++] = evalue;
2451*2d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2452*2d747510SLisandro Dalcin   }
2453*2d747510SLisandro Dalcin   ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
2454*2d747510SLisandro Dalcin   *nmax = n;
2455*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
2456*2d747510SLisandro Dalcin }
2457*2d747510SLisandro Dalcin 
2458*2d747510SLisandro Dalcin /*@C
2459*2d747510SLisandro Dalcin    PetscOptionsGetIntArray - Gets an array of integer values for a particular
2460*2d747510SLisandro Dalcin    option in the database.
2461*2d747510SLisandro Dalcin 
2462*2d747510SLisandro Dalcin    Not Collective
2463*2d747510SLisandro Dalcin 
2464*2d747510SLisandro Dalcin    Input Parameters:
2465*2d747510SLisandro Dalcin +  options - options database, use NULL for default global database
2466*2d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
2467*2d747510SLisandro Dalcin .  name - the option one is seeking
2468*2d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
2469*2d747510SLisandro Dalcin 
2470*2d747510SLisandro Dalcin    Output Parameter:
2471*2d747510SLisandro Dalcin +  ivalue - the integer values to return
2472*2d747510SLisandro Dalcin .  nmax - actual number of values retreived
2473*2d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
2474*2d747510SLisandro Dalcin 
2475*2d747510SLisandro Dalcin    Level: beginner
2476*2d747510SLisandro Dalcin 
2477*2d747510SLisandro Dalcin    Notes:
2478*2d747510SLisandro Dalcin    The array can be passed as
2479*2d747510SLisandro Dalcin    a comma separated list:                                 0,1,2,3,4,5,6,7
2480*2d747510SLisandro Dalcin    a range (start-end+1):                                  0-8
2481*2d747510SLisandro Dalcin    a range with given increment (start-end+1:inc):         0-7:2
2482*2d747510SLisandro Dalcin    a combination of values and ranges separated by commas: 0,1-8,8-15:2
2483*2d747510SLisandro Dalcin 
2484*2d747510SLisandro Dalcin    There must be no intervening spaces between the values.
2485*2d747510SLisandro Dalcin 
2486*2d747510SLisandro Dalcin    Concepts: options database^array of ints
2487*2d747510SLisandro Dalcin 
2488*2d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2489*2d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2490*2d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2491*2d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2492*2d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2493*2d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
2494*2d747510SLisandro Dalcin @*/
2495*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt *nmax,PetscBool *set)
2496*2d747510SLisandro Dalcin {
2497*2d747510SLisandro Dalcin   const char     *svalue;
2498*2d747510SLisandro Dalcin   char           *value;
2499*2d747510SLisandro Dalcin   PetscErrorCode ierr;
2500*2d747510SLisandro Dalcin   PetscInt       n = 0,i,j,start,end,inc,nvalues;
2501*2d747510SLisandro Dalcin   size_t         len;
2502*2d747510SLisandro Dalcin   PetscBool      flag,foundrange;
2503*2d747510SLisandro Dalcin   PetscToken     token;
2504*2d747510SLisandro Dalcin 
2505*2d747510SLisandro Dalcin   PetscFunctionBegin;
2506*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2507*2d747510SLisandro Dalcin   PetscValidIntPointer(ivalue,4);
2508*2d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
2509*2d747510SLisandro Dalcin 
2510*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
2511*2d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
2512*2d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
2513*2d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
2514*2d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2515*2d747510SLisandro Dalcin   while (value && n < *nmax) {
2516*2d747510SLisandro Dalcin     /* look for form  d-D where d and D are integers */
2517*2d747510SLisandro Dalcin     foundrange = PETSC_FALSE;
2518*2d747510SLisandro Dalcin     ierr       = PetscStrlen(value,&len);CHKERRQ(ierr);
2519*2d747510SLisandro Dalcin     if (value[0] == '-') i=2;
2520*2d747510SLisandro Dalcin     else i=1;
2521*2d747510SLisandro Dalcin     for (;i<(int)len; i++) {
2522*2d747510SLisandro Dalcin       if (value[i] == '-') {
2523*2d747510SLisandro Dalcin         if (i == (int)len-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value);
2524*2d747510SLisandro Dalcin         value[i] = 0;
2525*2d747510SLisandro Dalcin 
2526*2d747510SLisandro Dalcin         ierr = PetscOptionsStringToInt(value,&start);CHKERRQ(ierr);
2527*2d747510SLisandro Dalcin         inc  = 1;
2528*2d747510SLisandro Dalcin         j    = i+1;
2529*2d747510SLisandro Dalcin         for (;j<(int)len; j++) {
2530*2d747510SLisandro Dalcin           if (value[j] == ':') {
2531*2d747510SLisandro Dalcin             value[j] = 0;
2532*2d747510SLisandro Dalcin 
2533*2d747510SLisandro Dalcin             ierr = PetscOptionsStringToInt(value+j+1,&inc);CHKERRQ(ierr);
2534*2d747510SLisandro Dalcin             if (inc <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry,%s cannot have negative increment",n,value+j+1);
2535*2d747510SLisandro Dalcin             break;
2536*2d747510SLisandro Dalcin           }
2537*2d747510SLisandro Dalcin         }
2538*2d747510SLisandro Dalcin         ierr = PetscOptionsStringToInt(value+i+1,&end);CHKERRQ(ierr);
2539*2d747510SLisandro Dalcin         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);
2540*2d747510SLisandro Dalcin         nvalues = (end-start)/inc + (end-start)%inc;
2541*2d747510SLisandro Dalcin         if (n + nvalues  > *nmax) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry, not enough space left in array (%D) to contain entire range from %D to %D",n,*nmax-n,start,end);
2542*2d747510SLisandro Dalcin         for (;start<end; start+=inc) {
2543*2d747510SLisandro Dalcin           *ivalue = start; ivalue++;n++;
2544*2d747510SLisandro Dalcin         }
2545*2d747510SLisandro Dalcin         foundrange = PETSC_TRUE;
2546*2d747510SLisandro Dalcin         break;
2547*2d747510SLisandro Dalcin       }
2548*2d747510SLisandro Dalcin     }
2549*2d747510SLisandro Dalcin     if (!foundrange) {
2550*2d747510SLisandro Dalcin       ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr);
2551*2d747510SLisandro Dalcin       ivalue++;
2552*2d747510SLisandro Dalcin       n++;
2553*2d747510SLisandro Dalcin     }
2554*2d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2555*2d747510SLisandro Dalcin   }
2556*2d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
2557*2d747510SLisandro Dalcin   *nmax = n;
2558*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
2559*2d747510SLisandro Dalcin }
2560*2d747510SLisandro Dalcin 
2561*2d747510SLisandro Dalcin /*@C
2562*2d747510SLisandro Dalcin    PetscOptionsGetRealArray - Gets an array of double precision values for a
2563*2d747510SLisandro Dalcin    particular option in the database.  The values must be separated with
2564*2d747510SLisandro Dalcin    commas with no intervening spaces.
2565*2d747510SLisandro Dalcin 
2566*2d747510SLisandro Dalcin    Not Collective
2567*2d747510SLisandro Dalcin 
2568*2d747510SLisandro Dalcin    Input Parameters:
2569*2d747510SLisandro Dalcin +  options - options database, use NULL for default global database
2570*2d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
2571*2d747510SLisandro Dalcin .  name - the option one is seeking
2572*2d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
2573*2d747510SLisandro Dalcin 
2574*2d747510SLisandro Dalcin    Output Parameters:
2575*2d747510SLisandro Dalcin +  dvalue - the double values to return
2576*2d747510SLisandro Dalcin .  nmax - actual number of values retreived
2577*2d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
2578*2d747510SLisandro Dalcin 
2579*2d747510SLisandro Dalcin    Level: beginner
2580*2d747510SLisandro Dalcin 
2581*2d747510SLisandro Dalcin    Concepts: options database^array of doubles
2582*2d747510SLisandro Dalcin 
2583*2d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2584*2d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
2585*2d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2586*2d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2587*2d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2588*2d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
2589*2d747510SLisandro Dalcin @*/
2590*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscBool *set)
2591*2d747510SLisandro Dalcin {
2592*2d747510SLisandro Dalcin   const char     *svalue;
2593*2d747510SLisandro Dalcin   char           *value;
2594*2d747510SLisandro Dalcin   PetscErrorCode ierr;
2595*2d747510SLisandro Dalcin   PetscInt       n = 0;
2596*2d747510SLisandro Dalcin   PetscBool      flag;
2597*2d747510SLisandro Dalcin   PetscToken     token;
2598*2d747510SLisandro Dalcin 
2599*2d747510SLisandro Dalcin   PetscFunctionBegin;
2600*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2601*2d747510SLisandro Dalcin   PetscValidRealPointer(dvalue,4);
2602*2d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
2603*2d747510SLisandro Dalcin 
2604*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
2605*2d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
2606*2d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
2607*2d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
2608*2d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2609*2d747510SLisandro Dalcin   while (value && n < *nmax) {
2610*2d747510SLisandro Dalcin     ierr = PetscOptionsStringToReal(value,dvalue++);CHKERRQ(ierr);
2611*2d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2612*2d747510SLisandro Dalcin     n++;
2613*2d747510SLisandro Dalcin   }
2614*2d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
2615*2d747510SLisandro Dalcin   *nmax = n;
2616*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
2617*2d747510SLisandro Dalcin }
2618*2d747510SLisandro Dalcin 
2619*2d747510SLisandro Dalcin /*@C
2620*2d747510SLisandro Dalcin    PetscOptionsGetScalarArray - Gets an array of scalars for a
2621*2d747510SLisandro Dalcin    particular option in the database.  The values must be separated with
2622*2d747510SLisandro Dalcin    commas with no intervening spaces.
2623*2d747510SLisandro Dalcin 
2624*2d747510SLisandro Dalcin    Not Collective
2625*2d747510SLisandro Dalcin 
2626*2d747510SLisandro Dalcin    Input Parameters:
2627*2d747510SLisandro Dalcin +  options - options database, use NULL for default global database
2628*2d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
2629*2d747510SLisandro Dalcin .  name - the option one is seeking
2630*2d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
2631*2d747510SLisandro Dalcin 
2632*2d747510SLisandro Dalcin    Output Parameters:
2633*2d747510SLisandro Dalcin +  dvalue - the scalar values to return
2634*2d747510SLisandro Dalcin .  nmax - actual number of values retreived
2635*2d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
2636*2d747510SLisandro Dalcin 
2637*2d747510SLisandro Dalcin    Level: beginner
2638*2d747510SLisandro Dalcin 
2639*2d747510SLisandro Dalcin    Concepts: options database^array of doubles
2640*2d747510SLisandro Dalcin 
2641*2d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2642*2d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
2643*2d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2644*2d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2645*2d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2646*2d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
2647*2d747510SLisandro Dalcin @*/
2648*2d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt *nmax,PetscBool *set)
2649*2d747510SLisandro Dalcin {
2650*2d747510SLisandro Dalcin   const char     *svalue;
2651*2d747510SLisandro Dalcin   char           *value;
2652*2d747510SLisandro Dalcin   PetscErrorCode ierr;
2653*2d747510SLisandro Dalcin   PetscInt       n = 0;
2654*2d747510SLisandro Dalcin   PetscBool      flag;
2655*2d747510SLisandro Dalcin   PetscToken     token;
2656*2d747510SLisandro Dalcin 
2657*2d747510SLisandro Dalcin   PetscFunctionBegin;
2658*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2659*2d747510SLisandro Dalcin   PetscValidRealPointer(dvalue,4);
2660*2d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
2661*2d747510SLisandro Dalcin 
2662*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
2663*2d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
2664*2d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
2665*2d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
2666*2d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2667*2d747510SLisandro Dalcin   while (value && n < *nmax) {
2668*2d747510SLisandro Dalcin     ierr = PetscOptionsStringToScalar(value,dvalue++);CHKERRQ(ierr);
2669*2d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2670*2d747510SLisandro Dalcin     n++;
2671*2d747510SLisandro Dalcin   }
2672*2d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
2673*2d747510SLisandro Dalcin   *nmax = n;
2674*2d747510SLisandro Dalcin   PetscFunctionReturn(0);
2675*2d747510SLisandro Dalcin }
267614ce751eSBarry Smith 
2677e5c89e4eSSatish Balay /*@C
2678e5c89e4eSSatish Balay    PetscOptionsGetStringArray - Gets an array of string values for a particular
2679e5c89e4eSSatish Balay    option in the database. The values must be separated with commas with
2680e5c89e4eSSatish Balay    no intervening spaces.
2681e5c89e4eSSatish Balay 
2682e5c89e4eSSatish Balay    Not Collective
2683e5c89e4eSSatish Balay 
2684e5c89e4eSSatish Balay    Input Parameters:
26855c9cc608SHong Zhang +  options - options database, use NULL for default global database
2686c5929fdfSBarry Smith .  pre - string to prepend to name or NULL
2687e5c89e4eSSatish Balay .  name - the option one is seeking
2688e5c89e4eSSatish Balay -  nmax - maximum number of strings
2689e5c89e4eSSatish Balay 
2690e5c89e4eSSatish Balay    Output Parameter:
2691e5c89e4eSSatish Balay +  strings - location to copy strings
269296ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2693e5c89e4eSSatish Balay 
2694e5c89e4eSSatish Balay    Level: beginner
2695e5c89e4eSSatish Balay 
2696e5c89e4eSSatish Balay    Notes:
2697e5c89e4eSSatish Balay    The user should pass in an array of pointers to char, to hold all the
2698e5c89e4eSSatish Balay    strings returned by this function.
2699e5c89e4eSSatish Balay 
2700e5c89e4eSSatish Balay    The user is responsible for deallocating the strings that are
2701e5c89e4eSSatish Balay    returned. The Fortran interface for this routine is not supported.
2702e5c89e4eSSatish Balay 
2703e5c89e4eSSatish Balay    Contributed by Matthew Knepley.
2704e5c89e4eSSatish Balay 
2705e5c89e4eSSatish Balay    Concepts: options database^array of strings
2706e5c89e4eSSatish Balay 
2707e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
2708acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2709e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2710e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2711acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2712a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2713e5c89e4eSSatish Balay @*/
2714c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscBool *set)
2715e5c89e4eSSatish Balay {
2716*2d747510SLisandro Dalcin   const char     *svalue;
2717e5c89e4eSSatish Balay   char           *value;
2718e5c89e4eSSatish Balay   PetscErrorCode ierr;
2719*2d747510SLisandro Dalcin   PetscInt       n = 0;
2720ace3abfcSBarry Smith   PetscBool      flag;
27219c9d3cfdSBarry Smith   PetscToken     token;
2722e5c89e4eSSatish Balay 
2723e5c89e4eSSatish Balay   PetscFunctionBegin;
2724*2d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2725*2d747510SLisandro Dalcin   PetscValidPointer(strings,4);
2726*2d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
2727e5c89e4eSSatish Balay 
2728*2d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
2729*2d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
2730*2d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
2731*2d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
2732e5c89e4eSSatish Balay   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2733*2d747510SLisandro Dalcin   while (value && n < *nmax) {
2734e5c89e4eSSatish Balay     ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr);
2735e5c89e4eSSatish Balay     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
2736e5c89e4eSSatish Balay     n++;
2737e5c89e4eSSatish Balay   }
27388c74ee41SBarry Smith   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
2739e5c89e4eSSatish Balay   *nmax = n;
2740e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2741e5c89e4eSSatish Balay }
2742