xref: /petsc/src/sys/objects/options.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
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_STRINGS_H)
19ef279fd6SBarry Smith #  include <strings.h>          /* strcasecmp */
20ef279fd6SBarry Smith #endif
21e5c89e4eSSatish Balay 
222d747510SLisandro Dalcin #if defined(PETSC_HAVE_STRCASECMP)
232d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) strcasecmp(a,b)
242d747510SLisandro Dalcin #elif defined(PETSC_HAVE_STRICMP)
252d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) stricmp(a,b)
262d747510SLisandro Dalcin #else
272d747510SLisandro Dalcin #define PetscOptNameCmp(a,b) Error_strcasecmp_not_found
282d747510SLisandro Dalcin #endif
292d747510SLisandro Dalcin 
302d747510SLisandro Dalcin #include <petsc/private/hashtable.h>
312d747510SLisandro Dalcin 
322d747510SLisandro Dalcin /* This assumes ASCII encoding and ignores locale settings */
332d747510SLisandro Dalcin /* Using tolower() is about 2X slower in microbenchmarks   */
349fbee547SJacob Faibussowitsch static inline int PetscToLower(int c)
352d747510SLisandro Dalcin {
362d747510SLisandro Dalcin   return ((c >= 'A') & (c <= 'Z')) ? c + 'a' - 'A' : c;
372d747510SLisandro Dalcin }
382d747510SLisandro Dalcin 
392d747510SLisandro Dalcin /* Bob Jenkins's one at a time hash function (case-insensitive) */
409fbee547SJacob Faibussowitsch static inline unsigned int PetscOptHash(const char key[])
412d747510SLisandro Dalcin {
422d747510SLisandro Dalcin   unsigned int hash = 0;
432d747510SLisandro Dalcin   while (*key) {
442d747510SLisandro Dalcin     hash += PetscToLower(*key++);
452d747510SLisandro Dalcin     hash += hash << 10;
462d747510SLisandro Dalcin     hash ^= hash >>  6;
472d747510SLisandro Dalcin   }
482d747510SLisandro Dalcin   hash += hash <<  3;
492d747510SLisandro Dalcin   hash ^= hash >> 11;
502d747510SLisandro Dalcin   hash += hash << 15;
512d747510SLisandro Dalcin   return hash;
522d747510SLisandro Dalcin }
532d747510SLisandro Dalcin 
549fbee547SJacob Faibussowitsch static inline int PetscOptEqual(const char a[],const char b[])
552d747510SLisandro Dalcin {
562d747510SLisandro Dalcin   return !PetscOptNameCmp(a,b);
572d747510SLisandro Dalcin }
582d747510SLisandro Dalcin 
592d747510SLisandro Dalcin KHASH_INIT(HO, kh_cstr_t, int, 1, PetscOptHash, PetscOptEqual)
602d747510SLisandro Dalcin 
61e5c89e4eSSatish Balay /*
623fc1eb6aSBarry Smith     This table holds all the options set by the user. For simplicity, we use a static size database
63e5c89e4eSSatish Balay */
64c5c1f447SLisandro Dalcin #define MAXOPTNAME PETSC_MAX_OPTION_NAME
65e5c89e4eSSatish Balay #define MAXOPTIONS 512
66e5c89e4eSSatish Balay #define MAXALIASES  25
6774e0666dSJed Brown #define MAXPREFIXES 25
682d747510SLisandro Dalcin #define MAXOPTIONSMONITORS 5
69e5c89e4eSSatish Balay 
704416b707SBarry Smith struct  _n_PetscOptions {
713de2bfdfSBarry Smith   PetscOptions   previous;
722d747510SLisandro Dalcin   int            N;                    /* number of options */
732d747510SLisandro Dalcin   char           *names[MAXOPTIONS];   /* option names */
742d747510SLisandro Dalcin   char           *values[MAXOPTIONS];  /* option values */
752d747510SLisandro Dalcin   PetscBool      used[MAXOPTIONS];     /* flag option use */
76c5b5d8d5SVaclav Hapla   PetscBool      precedentProcessed;
77081c24baSBoyana Norris 
782d747510SLisandro Dalcin   /* Hash table */
792d747510SLisandro Dalcin   khash_t(HO)    *ht;
802d747510SLisandro Dalcin 
812d747510SLisandro Dalcin   /* Prefixes */
822d747510SLisandro Dalcin   int            prefixind;
832d747510SLisandro Dalcin   int            prefixstack[MAXPREFIXES];
842d747510SLisandro Dalcin   char           prefix[MAXOPTNAME];
852d747510SLisandro Dalcin 
862d747510SLisandro Dalcin   /* Aliases */
872d747510SLisandro Dalcin   int            Naliases;                   /* number or aliases */
882d747510SLisandro Dalcin   char           *aliases1[MAXALIASES];      /* aliased */
892d747510SLisandro Dalcin   char           *aliases2[MAXALIASES];      /* aliasee */
902d747510SLisandro Dalcin 
912d747510SLisandro Dalcin   /* Help */
922d747510SLisandro Dalcin   PetscBool      help;       /* flag whether "-help" is in the database */
93d314f959SVaclav Hapla   PetscBool      help_intro; /* flag whether "-help intro" is in the database */
942d747510SLisandro Dalcin 
952d747510SLisandro Dalcin   /* Monitors */
96c5b5d8d5SVaclav Hapla   PetscBool      monitorFromOptions, monitorCancel;
97081c24baSBoyana Norris   PetscErrorCode (*monitor[MAXOPTIONSMONITORS])(const char[],const char[],void*); /* returns control to user after */
98c2efdce3SBarry Smith   PetscErrorCode (*monitordestroy[MAXOPTIONSMONITORS])(void**);         /* */
99081c24baSBoyana Norris   void           *monitorcontext[MAXOPTIONSMONITORS];                  /* to pass arbitrary user data into monitor */
100081c24baSBoyana Norris   PetscInt       numbermonitors;                                       /* to, for instance, detect options being set */
1014416b707SBarry Smith };
102e5c89e4eSSatish Balay 
103b4205f0bSBarry Smith static PetscOptions defaultoptions = NULL;  /* the options database routines query this object for options */
1042d747510SLisandro Dalcin 
105c5b5d8d5SVaclav Hapla /* list of options which preceed others, i.e., are processed in PetscOptionsProcessPrecedentFlags() */
106d06005cbSLisandro Dalcin static const char *precedentOptions[] = {"-options_monitor","-options_monitor_cancel","-help","-skip_petscrc"};
107d06005cbSLisandro Dalcin enum PetscPrecedentOption {PO_OPTIONS_MONITOR,PO_OPTIONS_MONITOR_CANCEL,PO_HELP,PO_SKIP_PETSCRC,PO_NUM};
108c5b5d8d5SVaclav Hapla 
109c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsSetValue_Private(PetscOptions,const char[],const char[],int*);
110c5b5d8d5SVaclav Hapla 
111081c24baSBoyana Norris /*
112081c24baSBoyana Norris     Options events monitor
113081c24baSBoyana Norris */
1142d747510SLisandro Dalcin static PetscErrorCode PetscOptionsMonitor(PetscOptions options,const char name[],const char value[])
115e5c89e4eSSatish Balay {
1168ad20175SVaclav Hapla   if (!PetscErrorHandlingInitialized) return 0;
117e5c89e4eSSatish Balay   PetscFunctionBegin;
118c5b5d8d5SVaclav Hapla   if (!value) value = "";
1195f80ce2aSJacob Faibussowitsch   if (options->monitorFromOptions) CHKERRQ(PetscOptionsMonitorDefault(name,value,NULL));
1205f80ce2aSJacob Faibussowitsch   for (PetscInt i=0; i<options->numbermonitors; i++) CHKERRQ((*options->monitor[i])(name,value,options->monitorcontext[i]));
121e5c89e4eSSatish Balay   PetscFunctionReturn(0);
122e5c89e4eSSatish Balay }
123e5c89e4eSSatish Balay 
1242d747510SLisandro Dalcin /*@
1252d747510SLisandro Dalcin    PetscOptionsCreate - Creates an empty options database.
126e5c89e4eSSatish Balay 
1271c9f3c13SBarry Smith    Logically collective
1281c9f3c13SBarry Smith 
129e5c89e4eSSatish Balay    Output Parameter:
1302d747510SLisandro Dalcin .  options - Options database object
131e5c89e4eSSatish Balay 
132e5c89e4eSSatish Balay    Level: advanced
133e5c89e4eSSatish Balay 
1341c9f3c13SBarry Smith    Developer Note: We may want eventually to pass a MPI_Comm to determine the ownership of the object
1351c9f3c13SBarry Smith 
136b4205f0bSBarry Smith .seealso: PetscOptionsDestroy(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsInsert(), PetscOptionsSetValue()
137e5c89e4eSSatish Balay @*/
1382d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreate(PetscOptions *options)
1392d747510SLisandro Dalcin {
1402d747510SLisandro Dalcin   if (!options) return PETSC_ERR_ARG_NULL;
1412d747510SLisandro Dalcin   *options = (PetscOptions)calloc(1,sizeof(**options));
1422d747510SLisandro Dalcin   if (!*options) return PETSC_ERR_MEM;
1432d747510SLisandro Dalcin   return 0;
1442d747510SLisandro Dalcin }
1452d747510SLisandro Dalcin 
1462d747510SLisandro Dalcin /*@
1472d747510SLisandro Dalcin     PetscOptionsDestroy - Destroys an option database.
1482d747510SLisandro Dalcin 
1491c9f3c13SBarry Smith     Logically collective on whatever communicator was associated with the call to PetscOptionsCreate()
1501c9f3c13SBarry Smith 
1512d747510SLisandro Dalcin   Input Parameter:
1522d747510SLisandro Dalcin .  options - the PetscOptions object
1532d747510SLisandro Dalcin 
1543de2bfdfSBarry Smith    Level: advanced
1552d747510SLisandro Dalcin 
156b4205f0bSBarry Smith .seealso: PetscOptionsInsert(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsInsert(), PetscOptionsSetValue()
1572d747510SLisandro Dalcin @*/
1582d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroy(PetscOptions *options)
159e5c89e4eSSatish Balay {
160e5c89e4eSSatish Balay   PetscErrorCode ierr;
161e5c89e4eSSatish Balay 
162362febeeSStefano Zampini   PetscFunctionBegin;
1632d747510SLisandro Dalcin   if (!*options) return 0;
1645f80ce2aSJacob Faibussowitsch   PetscCheck(!(*options)->previous,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"You are destroying an option that has been used with PetscOptionsPush() but does not have a corresponding PetscOptionsPop()");
1652d747510SLisandro Dalcin   ierr = PetscOptionsClear(*options);if (ierr) return ierr;
1662d747510SLisandro Dalcin   /* XXX what about monitors ? */
1672800570dSLisandro Dalcin   free(*options);
1682d747510SLisandro Dalcin   *options = NULL;
169e5c89e4eSSatish Balay   PetscFunctionReturn(0);
170e5c89e4eSSatish Balay }
171e5c89e4eSSatish Balay 
1722d747510SLisandro Dalcin /*
1732d747510SLisandro Dalcin     PetscOptionsCreateDefault - Creates the default global options database
1742d747510SLisandro Dalcin */
1752d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreateDefault(void)
176e5c89e4eSSatish Balay {
1775f80ce2aSJacob Faibussowitsch   PetscErrorCode ierr = 0;
178e5c89e4eSSatish Balay 
1795f80ce2aSJacob Faibussowitsch   if (!defaultoptions) {ierr = PetscOptionsCreate(&defaultoptions);}
1805f80ce2aSJacob Faibussowitsch   return ierr;
1812d747510SLisandro Dalcin }
1822d747510SLisandro Dalcin 
183b4205f0bSBarry Smith /*@
184b4205f0bSBarry Smith       PetscOptionsPush - Push a new PetscOptions object as the default provider of options
1851c9f3c13SBarry Smith                          Allows using different parts of a code to use different options databases
186b4205f0bSBarry Smith 
187b4205f0bSBarry Smith   Logically Collective
188b4205f0bSBarry Smith 
189b4205f0bSBarry Smith   Input Parameter:
190b4205f0bSBarry Smith .   opt - the options obtained with PetscOptionsCreate()
191b4205f0bSBarry Smith 
192b4205f0bSBarry Smith   Notes:
193b4205f0bSBarry Smith   Use PetscOptionsPop() to return to the previous default options database
1941c9f3c13SBarry Smith 
1959666a313SBarry Smith   The collectivity of this routine is complex; only the MPI processes that call this routine will
1961c9f3c13SBarry Smith   have the affect of these options. If some processes that create objects call this routine and others do
1971c9f3c13SBarry Smith   not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
1981c9f3c13SBarry Smith   on different ranks.
199b4205f0bSBarry Smith 
2003de2bfdfSBarry Smith    Level: advanced
2013de2bfdfSBarry Smith 
2023c6db4c4SPierre Jolivet .seealso: PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsInsert(), PetscOptionsSetValue(), PetscOptionsLeft()
203b4205f0bSBarry Smith 
204b4205f0bSBarry Smith @*/
205b4205f0bSBarry Smith PetscErrorCode PetscOptionsPush(PetscOptions opt)
206b4205f0bSBarry Smith {
207b4205f0bSBarry Smith   PetscFunctionBegin;
2085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsCreateDefault());
209b4205f0bSBarry Smith   opt->previous  = defaultoptions;
210b4205f0bSBarry Smith   defaultoptions = opt;
211b4205f0bSBarry Smith   PetscFunctionReturn(0);
212b4205f0bSBarry Smith }
213b4205f0bSBarry Smith 
214b4205f0bSBarry Smith /*@
215b4205f0bSBarry Smith       PetscOptionsPop - Pop the most recent PetscOptionsPush() to return to the previous default options
216b4205f0bSBarry Smith 
2171c9f3c13SBarry Smith       Logically collective on whatever communicator was associated with the call to PetscOptionsCreate()
218b4205f0bSBarry Smith 
219b4205f0bSBarry Smith   Notes:
220b4205f0bSBarry Smith   Use PetscOptionsPop() to return to the previous default options database
221b4205f0bSBarry Smith   Allows using different parts of a code to use different options databases
222b4205f0bSBarry Smith 
2233de2bfdfSBarry Smith    Level: advanced
2243de2bfdfSBarry Smith 
2253c6db4c4SPierre Jolivet .seealso: PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsInsert(), PetscOptionsSetValue(), PetscOptionsLeft()
226b4205f0bSBarry Smith 
227b4205f0bSBarry Smith @*/
228b4205f0bSBarry Smith PetscErrorCode PetscOptionsPop(void)
229b4205f0bSBarry Smith {
2303de2bfdfSBarry Smith   PetscOptions current = defaultoptions;
2313de2bfdfSBarry Smith 
232b4205f0bSBarry Smith   PetscFunctionBegin;
233*28b400f6SJacob Faibussowitsch   PetscCheck(defaultoptions,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing default options");
234*28b400f6SJacob Faibussowitsch   PetscCheck(defaultoptions->previous,PETSC_COMM_SELF,PETSC_ERR_PLIB,"PetscOptionsPop() called too many times");
235b4205f0bSBarry Smith   defaultoptions    = defaultoptions->previous;
2363de2bfdfSBarry Smith   current->previous = NULL;
237b4205f0bSBarry Smith   PetscFunctionReturn(0);
238b4205f0bSBarry Smith }
239b4205f0bSBarry Smith 
2402d747510SLisandro Dalcin /*
2412d747510SLisandro Dalcin     PetscOptionsDestroyDefault - Destroys the default global options database
2422d747510SLisandro Dalcin */
2432d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroyDefault(void)
2442d747510SLisandro Dalcin {
2452d747510SLisandro Dalcin   PetscErrorCode ierr;
2463de2bfdfSBarry Smith   PetscOptions   tmp;
2472d747510SLisandro Dalcin 
24886dbd7c4SLisandro Dalcin   if (!defaultoptions) return 0;
2493de2bfdfSBarry Smith   /* Destroy any options that the user forgot to pop */
2503de2bfdfSBarry Smith   while (defaultoptions->previous) {
2513de2bfdfSBarry Smith     tmp = defaultoptions;
2525f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsPop());
2535f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsDestroy(&tmp));
2543de2bfdfSBarry Smith   }
2552d747510SLisandro Dalcin   ierr = PetscOptionsDestroy(&defaultoptions);if (ierr) return ierr;
2562d747510SLisandro Dalcin   return 0;
257e5c89e4eSSatish Balay }
258e5c89e4eSSatish Balay 
25994ef8ddeSSatish Balay /*@C
2607cd08cecSJed Brown    PetscOptionsValidKey - PETSc Options database keys must begin with one or two dashes (-) followed by a letter.
2613fc1eb6aSBarry Smith 
262447722d5SBarry Smith    Not collective
2631c9f3c13SBarry Smith 
2643fc1eb6aSBarry Smith    Input Parameter:
2652d747510SLisandro Dalcin .  key - string to check if valid
2663fc1eb6aSBarry Smith 
2673fc1eb6aSBarry Smith    Output Parameter:
2682d747510SLisandro Dalcin .  valid - PETSC_TRUE if a valid key
2693fc1eb6aSBarry Smith 
270f6680f47SSatish Balay    Level: intermediate
2713fc1eb6aSBarry Smith @*/
2722d747510SLisandro Dalcin PetscErrorCode PetscOptionsValidKey(const char key[],PetscBool *valid)
27396fc60bcSBarry Smith {
274f603b5e9SToby Isaac   char           *ptr;
2757c5db45bSBarry Smith 
27696fc60bcSBarry Smith   PetscFunctionBegin;
2772d747510SLisandro Dalcin   if (key) PetscValidCharPointer(key,1);
2782d747510SLisandro Dalcin   PetscValidPointer(valid,2);
2792d747510SLisandro Dalcin   *valid = PETSC_FALSE;
2802d747510SLisandro Dalcin   if (!key) PetscFunctionReturn(0);
2812d747510SLisandro Dalcin   if (key[0] != '-') PetscFunctionReturn(0);
2822d747510SLisandro Dalcin   if (key[1] == '-') key++;
283c850d057SPierre Jolivet   if (!isalpha((int)key[1])) PetscFunctionReturn(0);
2842d747510SLisandro Dalcin   (void) strtod(key,&ptr);
285c850d057SPierre Jolivet   if (ptr != key && !(*ptr == '_' || isalnum((int)*ptr))) PetscFunctionReturn(0);
2862d747510SLisandro Dalcin   *valid = PETSC_TRUE;
28796fc60bcSBarry Smith   PetscFunctionReturn(0);
28896fc60bcSBarry Smith }
28996fc60bcSBarry Smith 
290e5c89e4eSSatish Balay /*@C
291e5c89e4eSSatish Balay    PetscOptionsInsertString - Inserts options into the database from a string
292e5c89e4eSSatish Balay 
2931c9f3c13SBarry Smith    Logically Collective
294e5c89e4eSSatish Balay 
295d8d19677SJose E. Roman    Input Parameters:
296080f0011SToby Isaac +  options - options object
297080f0011SToby Isaac -  in_str - string that contains options separated by blanks
298e5c89e4eSSatish Balay 
299e5c89e4eSSatish Balay    Level: intermediate
300e5c89e4eSSatish Balay 
3019666a313SBarry Smith   The collectivity of this routine is complex; only the MPI processes that call this routine will
3021c9f3c13SBarry Smith   have the affect of these options. If some processes that create objects call this routine and others do
3031c9f3c13SBarry Smith   not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
3041c9f3c13SBarry Smith   on different ranks.
3051c9f3c13SBarry Smith 
306e5c89e4eSSatish Balay    Contributed by Boyana Norris
307e5c89e4eSSatish Balay 
30888c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(),
309acfcf0e5SJed Brown           PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
310e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
311e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
312acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
313a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsInsertFile()
314e5c89e4eSSatish Balay @*/
315c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertString(PetscOptions options,const char in_str[])
316e5c89e4eSSatish Balay {
317d06005cbSLisandro Dalcin   MPI_Comm       comm = PETSC_COMM_SELF;
318d06005cbSLisandro Dalcin   char           *first,*second;
3199c9d3cfdSBarry Smith   PetscToken     token;
320e5c89e4eSSatish Balay 
321e5c89e4eSSatish Balay   PetscFunctionBegin;
3225f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenCreate(in_str,' ',&token));
3235f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenFind(token,&first));
32496fc60bcSBarry Smith   while (first) {
325d06005cbSLisandro Dalcin     PetscBool isfile,isfileyaml,isstringyaml,ispush,ispop,key;
3265f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(first,"-options_file",&isfile));
3275f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(first,"-options_file_yaml",&isfileyaml));
3285f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(first,"-options_string_yaml",&isstringyaml));
3295f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(first,"-prefix_push",&ispush));
3305f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(first,"-prefix_pop",&ispop));
3315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsValidKey(first,&key));
332d06005cbSLisandro Dalcin     if (!key) {
3335f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&first));
334d06005cbSLisandro Dalcin     } else if (isfile) {
3355f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&second));
3365f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsInsertFile(comm,options,second,PETSC_TRUE));
3375f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&first));
338d06005cbSLisandro Dalcin     } else if (isfileyaml) {
3395f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&second));
3405f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsInsertFileYAML(comm,options,second,PETSC_TRUE));
3415f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&first));
342d06005cbSLisandro Dalcin     } else if (isstringyaml) {
3435f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&second));
3445f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsInsertStringYAML(options,second));
3455f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&first));
346d06005cbSLisandro Dalcin     } else if (ispush) {
3475f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&second));
3485f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsPrefixPush(options,second));
3495f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&first));
3509db968c8SJed Brown     } else if (ispop) {
3515f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsPrefixPop(options));
3525f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&first));
353d06005cbSLisandro Dalcin     } else {
3545f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&second));
3555f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsValidKey(second,&key));
35696fc60bcSBarry Smith       if (!key) {
3575f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscOptionsSetValue(options,first,second));
3585f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscTokenFind(token,&first));
35996fc60bcSBarry Smith       } else {
3605f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscOptionsSetValue(options,first,NULL));
36196fc60bcSBarry Smith         first = second;
36296fc60bcSBarry Smith       }
363e5c89e4eSSatish Balay     }
364e5c89e4eSSatish Balay   }
3655f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenDestroy(&token));
366e5c89e4eSSatish Balay   PetscFunctionReturn(0);
367e5c89e4eSSatish Balay }
368e5c89e4eSSatish Balay 
3693fc1eb6aSBarry Smith /*
3703fc1eb6aSBarry Smith     Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free()
3713fc1eb6aSBarry Smith */
3725fa91da5SBarry Smith static char *Petscgetline(FILE * f)
3735fa91da5SBarry Smith {
3745fa91da5SBarry Smith   size_t size  = 0;
3755fa91da5SBarry Smith   size_t len   = 0;
3765fa91da5SBarry Smith   size_t last  = 0;
3770298fd71SBarry Smith   char   *buf  = NULL;
3785fa91da5SBarry Smith 
37902c9f0b5SLisandro Dalcin   if (feof(f)) return NULL;
3805fa91da5SBarry Smith   do {
3815fa91da5SBarry Smith     size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */
3826e0c8459SSatish Balay     buf   = (char*)realloc((void*)buf,size); /* realloc(NULL,n) is the same as malloc(n) */
3835fa91da5SBarry Smith     /* Actually do the read. Note that fgets puts a terminal '\0' on the
3845fa91da5SBarry Smith     end of the string, so we make sure we overwrite this */
385e86f3e45SDave May     if (!fgets(buf+len,1024,f)) buf[len]=0;
3865fa91da5SBarry Smith     PetscStrlen(buf,&len);
3875fa91da5SBarry Smith     last = len - 1;
3885fa91da5SBarry Smith   } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r');
38908ac41f7SSatish Balay   if (len) return buf;
3905fa91da5SBarry Smith   free(buf);
39102c9f0b5SLisandro Dalcin   return NULL;
3925fa91da5SBarry Smith }
3935fa91da5SBarry Smith 
394be10d61cSLisandro Dalcin static PetscErrorCode PetscOptionsFilename(MPI_Comm comm,const char file[],char filename[PETSC_MAX_PATH_LEN],PetscBool *yaml)
395be10d61cSLisandro Dalcin {
396be10d61cSLisandro Dalcin   char           fname[PETSC_MAX_PATH_LEN+8],path[PETSC_MAX_PATH_LEN+8],*tail;
397e5c89e4eSSatish Balay 
398be10d61cSLisandro Dalcin   PetscFunctionBegin;
399362febeeSStefano Zampini   *yaml = PETSC_FALSE;
4005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrreplace(comm,file,fname,sizeof(fname)));
4015f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFixFilename(fname,path));
4025f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrendswith(path,":yaml",yaml));
403be10d61cSLisandro Dalcin   if (*yaml) {
4045f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrrchr(path,':',&tail));
405be10d61cSLisandro Dalcin     tail[-1] = 0; /* remove ":yaml" suffix from path */
406be10d61cSLisandro Dalcin   }
4075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrncpy(filename,path,PETSC_MAX_PATH_LEN));
408a1d2f846SLisandro Dalcin   /* check for standard YAML and JSON filename extensions */
4095f80ce2aSJacob Faibussowitsch   if (!*yaml) CHKERRQ(PetscStrendswith(filename,".yaml",yaml));
4105f80ce2aSJacob Faibussowitsch   if (!*yaml) CHKERRQ(PetscStrendswith(filename,".yml", yaml));
4115f80ce2aSJacob Faibussowitsch   if (!*yaml) CHKERRQ(PetscStrendswith(filename,".json",yaml));
412a1d2f846SLisandro Dalcin   if (!*yaml) { /* check file contents */
413a1d2f846SLisandro Dalcin     PetscMPIInt rank;
4145f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Comm_rank(comm,&rank));
415dd400576SPatrick Sanan     if (rank == 0) {
416a1d2f846SLisandro Dalcin       FILE *fh = fopen(filename,"r");
417a1d2f846SLisandro Dalcin       if (fh) {
418a1d2f846SLisandro Dalcin         char buf[6] = "";
419a1d2f846SLisandro Dalcin         if (fread(buf,1,6,fh) > 0) {
4205f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscStrncmp(buf,"%YAML ",6,yaml));  /* check for '%YAML' tag */
4215f80ce2aSJacob Faibussowitsch           if (!*yaml) CHKERRQ(PetscStrncmp(buf,"---",3,yaml));  /* check for document start */
422a1d2f846SLisandro Dalcin         }
423a1d2f846SLisandro Dalcin         (void)fclose(fh);
424a1d2f846SLisandro Dalcin       }
425a1d2f846SLisandro Dalcin     }
4265f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Bcast(yaml,1,MPIU_BOOL,0,comm));
427a1d2f846SLisandro Dalcin   }
428be10d61cSLisandro Dalcin   PetscFunctionReturn(0);
429be10d61cSLisandro Dalcin }
430e5c89e4eSSatish Balay 
431be10d61cSLisandro Dalcin static PetscErrorCode PetscOptionsInsertFilePetsc(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require)
432e5c89e4eSSatish Balay {
4338c0b561eSLisandro Dalcin   char           *string,*vstring = NULL,*astring = NULL,*packed = NULL;
4347fb43599SVaclav Hapla   char           *tokens[4];
43513e3f751SJed Brown   size_t         i,len,bytes;
436e5c89e4eSSatish Balay   FILE           *fd;
4377fb43599SVaclav Hapla   PetscToken     token=NULL;
438ed9cf6e9SBarry Smith   int            err;
439581bbe83SVaclav Hapla   char           *cmatch;
440581bbe83SVaclav Hapla   const char     cmt='#';
4419210b8eaSVaclav Hapla   PetscInt       line=1;
4423a018368SJed Brown   PetscMPIInt    rank,cnt=0,acnt=0,counts[2];
4439210b8eaSVaclav Hapla   PetscBool      isdir,alias=PETSC_FALSE,valid;
444e5c89e4eSSatish Balay 
445e5c89e4eSSatish Balay   PetscFunctionBegin;
4465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMemzero(tokens,sizeof(tokens)));
4475f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(comm,&rank));
448dd400576SPatrick Sanan   if (rank == 0) {
4498c0b561eSLisandro Dalcin     char fpath[PETSC_MAX_PATH_LEN];
4508c0b561eSLisandro Dalcin     char fname[PETSC_MAX_PATH_LEN];
45105c7dedfSBarry Smith 
4525f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrreplace(PETSC_COMM_SELF,file,fpath,sizeof(fpath)));
4535f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFixFilename(fpath,fname));
4548c0b561eSLisandro Dalcin 
455e5c89e4eSSatish Balay     fd   = fopen(fname,"r");
4565f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscTestDirectory(fname,'r',&isdir));
4572c71b3e2SJacob Faibussowitsch     PetscCheckFalse(isdir && require,PETSC_COMM_SELF,PETSC_ERR_USER,"Specified options file %s is a directory",fname);
458ad38b122SPatrick Sanan     if (fd && !isdir) {
4593a018368SJed Brown       PetscSegBuffer vseg,aseg;
4605f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSegBufferCreate(1,4000,&vseg));
4615f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSegBufferCreate(1,2000,&aseg));
4623a018368SJed Brown 
4639b754dc9SBarry Smith       /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */
4645f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscInfo(NULL,"Opened options file %s\n",file));
465e24ecc5dSJed Brown 
4665fa91da5SBarry Smith       while ((string = Petscgetline(fd))) {
4674704e885SBarry Smith         /* eliminate comments from each line */
4685f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrchr(string,cmt,&cmatch));
46990f79514SSatish Balay         if (cmatch) *cmatch = 0;
4705f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrlen(string,&len));
4715981331cSSatish Balay         /* replace tabs, ^M, \n with " " */
472e5c89e4eSSatish Balay         for (i=0; i<len; i++) {
4735981331cSSatish Balay           if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') {
474e5c89e4eSSatish Balay             string[i] = ' ';
475e5c89e4eSSatish Balay           }
476e5c89e4eSSatish Balay         }
4775f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscTokenCreate(string,' ',&token));
4785f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscTokenFind(token,&tokens[0]));
4797fb43599SVaclav Hapla         if (!tokens[0]) {
48002b0d46eSSatish Balay           goto destroy;
4817fb43599SVaclav Hapla         } else if (!tokens[0][0]) { /* if token 0 is empty (string begins with spaces), redo */
4825f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscTokenFind(token,&tokens[0]));
48390f79514SSatish Balay         }
4847fb43599SVaclav Hapla         for (i=1; i<4; i++) {
4855f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscTokenFind(token,&tokens[i]));
4867fb43599SVaclav Hapla         }
4877fb43599SVaclav Hapla         if (!tokens[0]) {
4882662f744SSatish Balay           goto destroy;
4897fb43599SVaclav Hapla         } else if (tokens[0][0] == '-') {
4905f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscOptionsValidKey(tokens[0],&valid));
491*28b400f6SJacob Faibussowitsch           PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %" PetscInt_FMT ": invalid option %s",fname,line,tokens[0]);
4925f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscStrlen(tokens[0],&len));
4935f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscSegBufferGet(vseg,len+1,&vstring));
4945f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscArraycpy(vstring,tokens[0],len));
495e24ecc5dSJed Brown           vstring[len] = ' ';
4967fb43599SVaclav Hapla           if (tokens[1]) {
4975f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscOptionsValidKey(tokens[1],&valid));
498*28b400f6SJacob Faibussowitsch             PetscCheck(!valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %" PetscInt_FMT ": cannot specify two options per line (%s %s)",fname,line,tokens[0],tokens[1]);
4995f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscStrlen(tokens[1],&len));
5005f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscSegBufferGet(vseg,len+3,&vstring));
501e24ecc5dSJed Brown             vstring[0] = '"';
5025f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscArraycpy(vstring+1,tokens[1],len));
503e24ecc5dSJed Brown             vstring[len+1] = '"';
504e24ecc5dSJed Brown             vstring[len+2] = ' ';
50509192fe3SBarry Smith           }
50690f79514SSatish Balay         } else {
5075f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscStrcasecmp(tokens[0],"alias",&alias));
5089210b8eaSVaclav Hapla           if (alias) {
5095f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscOptionsValidKey(tokens[1],&valid));
510*28b400f6SJacob Faibussowitsch             PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %" PetscInt_FMT ": invalid aliased option %s",fname,line,tokens[1]);
5112c71b3e2SJacob Faibussowitsch             PetscCheckFalse(!tokens[2],PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %" PetscInt_FMT ": alias missing for %s",fname,line,tokens[1]);
5125f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscOptionsValidKey(tokens[2],&valid));
513*28b400f6SJacob Faibussowitsch             PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %" PetscInt_FMT ": invalid aliasee option %s",fname,line,tokens[2]);
5145f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscStrlen(tokens[1],&len));
5155f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscSegBufferGet(aseg,len+1,&astring));
5165f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscArraycpy(astring,tokens[1],len));
517e24ecc5dSJed Brown             astring[len] = ' ';
518e24ecc5dSJed Brown 
5195f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscStrlen(tokens[2],&len));
5205f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscSegBufferGet(aseg,len+1,&astring));
5215f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscArraycpy(astring,tokens[2],len));
522e24ecc5dSJed Brown             astring[len] = ' ';
52398921bdaSJacob Faibussowitsch           } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown first token in options file %s line %" PetscInt_FMT ": %s",fname,line,tokens[0]);
5249210b8eaSVaclav Hapla         }
5259210b8eaSVaclav Hapla         {
5269210b8eaSVaclav Hapla           const char *extraToken = alias ? tokens[3] : tokens[2];
527*28b400f6SJacob Faibussowitsch           PetscCheck(!extraToken,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %" PetscInt_FMT ": extra token %s",fname,line,extraToken);
528e5c89e4eSSatish Balay         }
52902b0d46eSSatish Balay destroy:
5304b40f50bSBarry Smith         free(string);
5315f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscTokenDestroy(&token));
5329210b8eaSVaclav Hapla         alias = PETSC_FALSE;
5339210b8eaSVaclav Hapla         line++;
534e5c89e4eSSatish Balay       }
535ed9cf6e9SBarry Smith       err = fclose(fd);
536*28b400f6SJacob Faibussowitsch       PetscCheck(!err,PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file %s",fname);
5375f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSegBufferGetSize(aseg,&bytes)); /* size without null termination */
5385f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMPIIntCast(bytes,&acnt));
5395f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSegBufferGet(aseg,1,&astring));
540e24ecc5dSJed Brown       astring[0] = 0;
5415f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSegBufferGetSize(vseg,&bytes)); /* size without null termination */
5425f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMPIIntCast(bytes,&cnt));
5435f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSegBufferGet(vseg,1,&vstring));
544e24ecc5dSJed Brown       vstring[0] = 0;
5455f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(2+acnt+cnt,&packed));
5465f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSegBufferExtractTo(aseg,packed));
5475f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSegBufferExtractTo(vseg,packed+acnt+1));
5485f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSegBufferDestroy(&aseg));
5495f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSegBufferDestroy(&vseg));
550*28b400f6SJacob Faibussowitsch     } else PetscCheck(!require,PETSC_COMM_SELF,PETSC_ERR_USER,"Unable to open options file %s",fname);
5519b754dc9SBarry Smith   }
55205c7dedfSBarry Smith 
5533a018368SJed Brown   counts[0] = acnt;
5543a018368SJed Brown   counts[1] = cnt;
5554201f521SBarry Smith   err = MPI_Bcast(counts,2,MPI_INT,0,comm);
556*28b400f6SJacob Faibussowitsch   PetscCheck(!err,PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in first MPI collective call, could be caused by using an incorrect mpiexec or a network problem, it can be caused by having VPN running: see https://petsc.org/release/faq/");
5573a018368SJed Brown   acnt = counts[0];
5583a018368SJed Brown   cnt = counts[1];
5593a018368SJed Brown   if (rank) {
5605f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(2+acnt+cnt,&packed));
5613a018368SJed Brown   }
5623a018368SJed Brown   if (acnt || cnt) {
5635f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Bcast(packed,2+acnt+cnt,MPI_CHAR,0,comm));
5643a018368SJed Brown     astring = packed;
5653a018368SJed Brown     vstring = packed + acnt + 1;
5663a018368SJed Brown   }
5673a018368SJed Brown 
5689b754dc9SBarry Smith   if (acnt) {
5695f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscTokenCreate(astring,' ',&token));
5705f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscTokenFind(token,&tokens[0]));
5717fb43599SVaclav Hapla     while (tokens[0]) {
5725f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&tokens[1]));
5735f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsSetAlias(options,tokens[0],tokens[1]));
5745f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscTokenFind(token,&tokens[0]));
5759b754dc9SBarry Smith     }
5765f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscTokenDestroy(&token));
5779b754dc9SBarry Smith   }
5789b754dc9SBarry Smith 
5799b754dc9SBarry Smith   if (cnt) {
5805f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsInsertString(options,vstring));
581e5c89e4eSSatish Balay   }
5825f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(packed));
583e5c89e4eSSatish Balay   PetscFunctionReturn(0);
584e5c89e4eSSatish Balay }
585e5c89e4eSSatish Balay 
586d06005cbSLisandro Dalcin /*@C
587be10d61cSLisandro Dalcin      PetscOptionsInsertFile - Inserts options into the database from a file.
588be10d61cSLisandro Dalcin 
589be10d61cSLisandro Dalcin      Collective
590be10d61cSLisandro Dalcin 
591d8d19677SJose E. Roman   Input Parameters:
592be10d61cSLisandro Dalcin +   comm - the processes that will share the options (usually PETSC_COMM_WORLD)
593be10d61cSLisandro Dalcin .   options - options database, use NULL for default global database
594be10d61cSLisandro Dalcin .   file - name of file,
595be10d61cSLisandro Dalcin            ".yml" and ".yaml" filename extensions are inserted as YAML options,
596be10d61cSLisandro Dalcin            append ":yaml" to filename to force YAML options.
597be10d61cSLisandro Dalcin -   require - if PETSC_TRUE will generate an error if the file does not exist
598be10d61cSLisandro Dalcin 
599be10d61cSLisandro Dalcin   Notes:
600be10d61cSLisandro Dalcin    Use  # for lines that are comments and which should be ignored.
601be10d61cSLisandro Dalcin    Usually, instead of using this command, one should list the file name in the call to PetscInitialize(), this insures that certain options
602be10d61cSLisandro Dalcin    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
603be10d61cSLisandro Dalcin    calls to XXXSetFromOptions() it should not be used for options listed under PetscInitialize().
604be10d61cSLisandro Dalcin    The collectivity of this routine is complex; only the MPI processes in comm will
605be10d61cSLisandro Dalcin    have the affect of these options. If some processes that create objects call this routine and others do
606be10d61cSLisandro Dalcin    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
607be10d61cSLisandro Dalcin    on different ranks.
608be10d61cSLisandro Dalcin 
609be10d61cSLisandro Dalcin   Level: developer
610be10d61cSLisandro Dalcin 
611be10d61cSLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(),
612be10d61cSLisandro Dalcin           PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
613be10d61cSLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
614be10d61cSLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
615be10d61cSLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
616be10d61cSLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
617be10d61cSLisandro Dalcin 
618be10d61cSLisandro Dalcin @*/
619be10d61cSLisandro Dalcin PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require)
620be10d61cSLisandro Dalcin {
621be10d61cSLisandro Dalcin   char           filename[PETSC_MAX_PATH_LEN];
622be10d61cSLisandro Dalcin   PetscBool      yaml;
623be10d61cSLisandro Dalcin 
624be10d61cSLisandro Dalcin   PetscFunctionBegin;
6255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFilename(comm,file,filename,&yaml));
626be10d61cSLisandro Dalcin   if (yaml) {
6275f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsInsertFileYAML(comm,options,filename,require));
628be10d61cSLisandro Dalcin   } else {
6295f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsInsertFilePetsc(comm,options,filename,require));
630be10d61cSLisandro Dalcin   }
631be10d61cSLisandro Dalcin   PetscFunctionReturn(0);
632be10d61cSLisandro Dalcin }
633be10d61cSLisandro Dalcin 
634be10d61cSLisandro Dalcin /*@C
635d06005cbSLisandro Dalcin    PetscOptionsInsertArgs - Inserts options into the database from a array of strings
636d06005cbSLisandro Dalcin 
637d06005cbSLisandro Dalcin    Logically Collective
638d06005cbSLisandro Dalcin 
639d8d19677SJose E. Roman    Input Parameters:
640d06005cbSLisandro Dalcin +  options - options object
641d06005cbSLisandro Dalcin .  argc - the array lenght
642d06005cbSLisandro Dalcin -  args - the string array
643d06005cbSLisandro Dalcin 
644d06005cbSLisandro Dalcin    Level: intermediate
645d06005cbSLisandro Dalcin 
646d06005cbSLisandro Dalcin .seealso: PetscOptions, PetscOptionsInsertString(), PetscOptionsInsertFile()
647d06005cbSLisandro Dalcin @*/
648d06005cbSLisandro Dalcin PetscErrorCode PetscOptionsInsertArgs(PetscOptions options,int argc,char *args[])
64985079163SJed Brown {
650d06005cbSLisandro Dalcin   MPI_Comm       comm = PETSC_COMM_WORLD;
651d06005cbSLisandro Dalcin   int            left          = PetscMax(argc,0);
652d06005cbSLisandro Dalcin   char           *const *eargs = args;
65385079163SJed Brown 
65485079163SJed Brown   PetscFunctionBegin;
65585079163SJed Brown   while (left) {
656d06005cbSLisandro Dalcin     PetscBool isfile,isfileyaml,isstringyaml,ispush,ispop,key;
6575f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(eargs[0],"-options_file",&isfile));
6585f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(eargs[0],"-options_file_yaml",&isfileyaml));
6595f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(eargs[0],"-options_string_yaml",&isstringyaml));
6605f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(eargs[0],"-prefix_push",&ispush));
6615f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(eargs[0],"-prefix_pop",&ispop));
6625f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsValidKey(eargs[0],&key));
663093de6efSBarry Smith     if (!key) {
66485079163SJed Brown       eargs++; left--;
665d06005cbSLisandro Dalcin     } else if (isfile) {
6662c71b3e2SJacob Faibussowitsch       PetscCheckFalse(left <= 1 || eargs[1][0] == '-',PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option");
6675f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsInsertFile(comm,options,eargs[1],PETSC_TRUE));
66885079163SJed Brown       eargs += 2; left -= 2;
669d06005cbSLisandro Dalcin     } else if (isfileyaml) {
6702c71b3e2SJacob Faibussowitsch       PetscCheckFalse(left <= 1 || eargs[1][0] == '-',PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file_yaml filename option");
6715f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsInsertFileYAML(comm,options,eargs[1],PETSC_TRUE));
672d06005cbSLisandro Dalcin       eargs += 2; left -= 2;
673d06005cbSLisandro Dalcin     } else if (isstringyaml) {
6742c71b3e2SJacob Faibussowitsch       PetscCheckFalse(left <= 1 || eargs[1][0] == '-',PETSC_COMM_SELF,PETSC_ERR_USER,"Missing string for -options_string_yaml string option");
6755f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsInsertStringYAML(options,eargs[1]));
676d06005cbSLisandro Dalcin       eargs += 2; left -= 2;
677d06005cbSLisandro Dalcin     } else if (ispush) {
6782c71b3e2SJacob Faibussowitsch       PetscCheckFalse(left <= 1,PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option");
6792c71b3e2SJacob Faibussowitsch       PetscCheckFalse(eargs[1][0] == '-',PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option (prefixes cannot start with '-')");
6805f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsPrefixPush(options,eargs[1]));
6819db968c8SJed Brown       eargs += 2; left -= 2;
682d06005cbSLisandro Dalcin     } else if (ispop) {
6835f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsPrefixPop(options));
6849db968c8SJed Brown       eargs++; left--;
6857935c3d8SJed Brown     } else {
6867935c3d8SJed Brown       PetscBool nextiskey = PETSC_FALSE;
6875f80ce2aSJacob Faibussowitsch       if (left >= 2) CHKERRQ(PetscOptionsValidKey(eargs[1],&nextiskey));
68898b6bf53SJed Brown       if (left < 2 || nextiskey) {
6895f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscOptionsSetValue(options,eargs[0],NULL));
69085079163SJed Brown         eargs++; left--;
69185079163SJed Brown       } else {
6925f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscOptionsSetValue(options,eargs[0],eargs[1]));
69385079163SJed Brown         eargs += 2; left -= 2;
69485079163SJed Brown       }
69585079163SJed Brown     }
6967935c3d8SJed Brown   }
69785079163SJed Brown   PetscFunctionReturn(0);
69885079163SJed Brown }
69985079163SJed Brown 
7009fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscOptionsStringToBoolIfSet_Private(enum PetscPrecedentOption opt,const char *val[],PetscBool set[],PetscBool *flg)
701c5b5d8d5SVaclav Hapla {
702c5b5d8d5SVaclav Hapla   PetscFunctionBegin;
703c5b5d8d5SVaclav Hapla   if (set[opt]) {
7045f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsStringToBool(val[opt],flg));
705c5b5d8d5SVaclav Hapla   } else *flg = PETSC_FALSE;
706c5b5d8d5SVaclav Hapla   PetscFunctionReturn(0);
707c5b5d8d5SVaclav Hapla }
708c5b5d8d5SVaclav Hapla 
709c5b5d8d5SVaclav Hapla /* Process options with absolute precedence */
710c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsProcessPrecedentFlags(PetscOptions options,int argc,char *args[],PetscBool *skip_petscrc,PetscBool *skip_petscrc_set)
711c5b5d8d5SVaclav Hapla {
712c5b5d8d5SVaclav Hapla   const char* const *opt = precedentOptions;
713c5b5d8d5SVaclav Hapla   const size_t      n = PO_NUM;
714c5b5d8d5SVaclav Hapla   size_t            o;
715c5b5d8d5SVaclav Hapla   int               a;
716c5b5d8d5SVaclav Hapla   const char        **val;
717c5b5d8d5SVaclav Hapla   PetscBool         *set;
718c5b5d8d5SVaclav Hapla 
719c5b5d8d5SVaclav Hapla   PetscFunctionBegin;
7205f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCalloc2(n,&val,n,&set));
721c5b5d8d5SVaclav Hapla 
722c5b5d8d5SVaclav Hapla   /* Look for options possibly set using PetscOptionsSetValue beforehand */
723c5b5d8d5SVaclav Hapla   for (o=0; o<n; o++) {
7245f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsFindPair(options,NULL,opt[o],&val[o],&set[o]));
725c5b5d8d5SVaclav Hapla   }
726c5b5d8d5SVaclav Hapla 
727a5b23f4aSJose E. Roman   /* Loop through all args to collect last occurring value of each option */
728c5b5d8d5SVaclav Hapla   for (a=1; a<argc; a++) {
729c5b5d8d5SVaclav Hapla     PetscBool valid, eq;
730c5b5d8d5SVaclav Hapla 
7315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsValidKey(args[a],&valid));
732c5b5d8d5SVaclav Hapla     if (!valid) continue;
733c5b5d8d5SVaclav Hapla     for (o=0; o<n; o++) {
7345f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcasecmp(args[a],opt[o],&eq));
735c5b5d8d5SVaclav Hapla       if (eq) {
736c5b5d8d5SVaclav Hapla         set[o] = PETSC_TRUE;
737c5b5d8d5SVaclav Hapla         if (a == argc-1 || !args[a+1] || !args[a+1][0] || args[a+1][0] == '-') val[o] = NULL;
738c5b5d8d5SVaclav Hapla         else val[o] = args[a+1];
739c5b5d8d5SVaclav Hapla         break;
740c5b5d8d5SVaclav Hapla       }
741c5b5d8d5SVaclav Hapla     }
742c5b5d8d5SVaclav Hapla   }
743c5b5d8d5SVaclav Hapla 
744c5b5d8d5SVaclav Hapla   /* Process flags */
7455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(val[PO_HELP], "intro", &options->help_intro));
746d314f959SVaclav Hapla   if (options->help_intro) options->help = PETSC_TRUE;
7475f80ce2aSJacob Faibussowitsch   else CHKERRQ(PetscOptionsStringToBoolIfSet_Private(PO_HELP,            val,set,&options->help));
7485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR_CANCEL,val,set,&options->monitorCancel));
7495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR,       val,set,&options->monitorFromOptions));
7505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsStringToBoolIfSet_Private(PO_SKIP_PETSCRC,          val,set,skip_petscrc));
751c5b5d8d5SVaclav Hapla   *skip_petscrc_set = set[PO_SKIP_PETSCRC];
752c5b5d8d5SVaclav Hapla 
753c5b5d8d5SVaclav Hapla   /* Store precedent options in database and mark them as used */
754c5b5d8d5SVaclav Hapla   for (o=0; o<n; o++) {
755c5b5d8d5SVaclav Hapla     if (set[o]) {
7565f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsSetValue_Private(options,opt[o],val[o],&a));
757d06005cbSLisandro Dalcin       options->used[a] = PETSC_TRUE;
758c5b5d8d5SVaclav Hapla     }
759c5b5d8d5SVaclav Hapla   }
760c5b5d8d5SVaclav Hapla 
7615f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree2(val,set));
762c5b5d8d5SVaclav Hapla   options->precedentProcessed = PETSC_TRUE;
763c5b5d8d5SVaclav Hapla   PetscFunctionReturn(0);
764c5b5d8d5SVaclav Hapla }
765c5b5d8d5SVaclav Hapla 
7669fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscOptionsSkipPrecedent(PetscOptions options,const char name[],PetscBool *flg)
767c5b5d8d5SVaclav Hapla {
768c5b5d8d5SVaclav Hapla   int i;
769c5b5d8d5SVaclav Hapla   PetscErrorCode ierr;
770c5b5d8d5SVaclav Hapla 
771c5b5d8d5SVaclav Hapla   *flg = PETSC_FALSE;
772c5b5d8d5SVaclav Hapla   if (options->precedentProcessed) {
773c5b5d8d5SVaclav Hapla     for (i=0; i<PO_NUM; i++) {
774c5b5d8d5SVaclav Hapla       if (!PetscOptNameCmp(precedentOptions[i],name)) {
775c5b5d8d5SVaclav Hapla         /* check if precedent option has been set already */
776d06005cbSLisandro Dalcin         ierr = PetscOptionsFindPair(options,NULL,name,NULL,flg);if (ierr) return ierr;
777c5b5d8d5SVaclav Hapla         if (*flg) break;
778c5b5d8d5SVaclav Hapla       }
779c5b5d8d5SVaclav Hapla     }
780c5b5d8d5SVaclav Hapla   }
781d06005cbSLisandro Dalcin   return 0;
782c5b5d8d5SVaclav Hapla }
78385079163SJed Brown 
784e5c89e4eSSatish Balay /*@C
785e5c89e4eSSatish Balay    PetscOptionsInsert - Inserts into the options database from the command line,
786e5c89e4eSSatish Balay                         the environmental variable and a file.
787e5c89e4eSSatish Balay 
7881c9f3c13SBarry Smith    Collective on PETSC_COMM_WORLD
7891c9f3c13SBarry Smith 
790e5c89e4eSSatish Balay    Input Parameters:
791c5929fdfSBarry Smith +  options - options database or NULL for the default global database
792c5929fdfSBarry Smith .  argc - count of number of command line arguments
793e5c89e4eSSatish Balay .  args - the command line arguments
794be10d61cSLisandro Dalcin -  file - [optional] PETSc database file, append ":yaml" to filename to specify YAML options format.
795be10d61cSLisandro Dalcin           Use NULL or empty string to not check for code specific file.
796be10d61cSLisandro Dalcin           Also checks ~/.petscrc, .petscrc and petscrc.
797c5b5d8d5SVaclav Hapla           Use -skip_petscrc in the code specific file (or command line) to skip ~/.petscrc, .petscrc and petscrc files.
798e5c89e4eSSatish Balay 
799e5c89e4eSSatish Balay    Note:
800e5c89e4eSSatish Balay    Since PetscOptionsInsert() is automatically called by PetscInitialize(),
801e5c89e4eSSatish Balay    the user does not typically need to call this routine. PetscOptionsInsert()
802e5c89e4eSSatish Balay    can be called several times, adding additional entries into the database.
803e5c89e4eSSatish Balay 
804081c24baSBoyana Norris    Options Database Keys:
805d06005cbSLisandro Dalcin +   -options_file <filename> - read options from a file
806d06005cbSLisandro Dalcin -   -options_file_yaml <filename> - read options from a YAML file
807c5b5d8d5SVaclav Hapla 
808c5b5d8d5SVaclav Hapla    See PetscInitialize() for options related to option database monitoring.
809081c24baSBoyana Norris 
810e5c89e4eSSatish Balay    Level: advanced
811e5c89e4eSSatish Balay 
8122d747510SLisandro Dalcin .seealso: PetscOptionsDestroy(), PetscOptionsView(), PetscOptionsInsertString(), PetscOptionsInsertFile(),
81396fc60bcSBarry Smith           PetscInitialize()
814e5c89e4eSSatish Balay @*/
815c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options,int *argc,char ***args,const char file[])
816e5c89e4eSSatish Balay {
817d06005cbSLisandro Dalcin   MPI_Comm       comm = PETSC_COMM_WORLD;
818e5c89e4eSSatish Balay   PetscMPIInt    rank;
819c5b5d8d5SVaclav Hapla   PetscBool      hasArgs = (argc && *argc) ? PETSC_TRUE : PETSC_FALSE;
820c5b5d8d5SVaclav Hapla   PetscBool      skipPetscrc = PETSC_FALSE, skipPetscrcSet = PETSC_FALSE;
821e5c89e4eSSatish Balay 
822e5c89e4eSSatish Balay   PetscFunctionBegin;
8232c71b3e2SJacob Faibussowitsch   PetscCheckFalse(hasArgs && !(args && *args),comm,PETSC_ERR_ARG_NULL,"*argc > 1 but *args not given");
8245f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(comm,&rank));
825e5c89e4eSSatish Balay 
826c5b5d8d5SVaclav Hapla   if (!options) {
8275f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsCreateDefault());
828c5b5d8d5SVaclav Hapla     options = defaultoptions;
829c5b5d8d5SVaclav Hapla   }
830c5b5d8d5SVaclav Hapla   if (hasArgs) {
831c5b5d8d5SVaclav Hapla     /* process options with absolute precedence */
8325f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsProcessPrecedentFlags(options,*argc,*args,&skipPetscrc,&skipPetscrcSet));
833c5b5d8d5SVaclav Hapla   }
8344b09e917SBarry Smith   if (file && file[0]) {
8355f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsInsertFile(comm,options,file,PETSC_TRUE));
836c5b5d8d5SVaclav Hapla     /* if -skip_petscrc has not been set from command line, check whether it has been set in the file */
8375f80ce2aSJacob Faibussowitsch     if (!skipPetscrcSet) CHKERRQ(PetscOptionsGetBool(options,NULL,"-skip_petscrc",&skipPetscrc,NULL));
838321366bcSBarry Smith   }
839c5b5d8d5SVaclav Hapla   if (!skipPetscrc) {
840be10d61cSLisandro Dalcin     char filename[PETSC_MAX_PATH_LEN];
8415f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscGetHomeDirectory(filename,sizeof(filename)));
8425f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Bcast(filename,(int)sizeof(filename),MPI_CHAR,0,comm));
8435f80ce2aSJacob Faibussowitsch     if (filename[0]) CHKERRQ(PetscStrcat(filename,"/.petscrc"));
8445f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsInsertFile(comm,options,filename,PETSC_FALSE));
8455f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsInsertFile(comm,options,".petscrc",PETSC_FALSE));
8465f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsInsertFile(comm,options,"petscrc",PETSC_FALSE));
847e5c89e4eSSatish Balay   }
848e5c89e4eSSatish Balay 
8492d747510SLisandro Dalcin   /* insert environment options */
850e5c89e4eSSatish Balay   {
8512d747510SLisandro Dalcin     char   *eoptions = NULL;
852e5c89e4eSSatish Balay     size_t len       = 0;
853dd400576SPatrick Sanan     if (rank == 0) {
854e5c89e4eSSatish Balay       eoptions = (char*)getenv("PETSC_OPTIONS");
8555f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrlen(eoptions,&len));
856e5c89e4eSSatish Balay     }
8575f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Bcast(&len,1,MPIU_SIZE_T,0,comm));
858e5c89e4eSSatish Balay     if (len) {
8595f80ce2aSJacob Faibussowitsch       if (rank) CHKERRQ(PetscMalloc1(len+1,&eoptions));
8605f80ce2aSJacob Faibussowitsch       CHKERRMPI(MPI_Bcast(eoptions,len,MPI_CHAR,0,comm));
86196fc60bcSBarry Smith       if (rank) eoptions[len] = 0;
8625f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsInsertString(options,eoptions));
8635f80ce2aSJacob Faibussowitsch       if (rank) CHKERRQ(PetscFree(eoptions));
864e5c89e4eSSatish Balay     }
865e5c89e4eSSatish Balay   }
866e5c89e4eSSatish Balay 
867d06005cbSLisandro Dalcin   /* insert YAML environment options */
86856a31166SBarry Smith   {
8699fc438c3SToby Isaac     char   *eoptions = NULL;
8709fc438c3SToby Isaac     size_t len       = 0;
871dd400576SPatrick Sanan     if (rank == 0) {
8729fc438c3SToby Isaac       eoptions = (char*)getenv("PETSC_OPTIONS_YAML");
8735f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrlen(eoptions,&len));
8749fc438c3SToby Isaac     }
8755f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Bcast(&len,1,MPIU_SIZE_T,0,comm));
8769fc438c3SToby Isaac     if (len) {
8775f80ce2aSJacob Faibussowitsch       if (rank) CHKERRQ(PetscMalloc1(len+1,&eoptions));
8785f80ce2aSJacob Faibussowitsch       CHKERRMPI(MPI_Bcast(eoptions,len,MPI_CHAR,0,comm));
8799fc438c3SToby Isaac       if (rank) eoptions[len] = 0;
8805f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsInsertStringYAML(options,eoptions));
8815f80ce2aSJacob Faibussowitsch       if (rank) CHKERRQ(PetscFree(eoptions));
8829fc438c3SToby Isaac     }
8839fc438c3SToby Isaac   }
8843bcbd388SSean Farley 
885c5b5d8d5SVaclav Hapla   /* insert command line options here because they take precedence over arguments in petscrc/environment */
8865f80ce2aSJacob Faibussowitsch   if (hasArgs) CHKERRQ(PetscOptionsInsertArgs(options,*argc-1,*args+1));
887e5c89e4eSSatish Balay   PetscFunctionReturn(0);
888e5c89e4eSSatish Balay }
889e5c89e4eSSatish Balay 
890e5c89e4eSSatish Balay /*@C
89188c29154SBarry Smith    PetscOptionsView - Prints the options that have been loaded. This is
892e5c89e4eSSatish Balay    useful for debugging purposes.
893e5c89e4eSSatish Balay 
894c139c21fSBarry Smith    Logically Collective on PetscViewer
895e5c89e4eSSatish Balay 
896d8d19677SJose E. Roman    Input Parameters:
897a2b725a8SWilliam Gropp +  options - options database, use NULL for default global database
898a2b725a8SWilliam Gropp -  viewer - must be an PETSCVIEWERASCII viewer
899e5c89e4eSSatish Balay 
900e5c89e4eSSatish Balay    Options Database Key:
90126a7e8d4SBarry Smith .  -options_view - Activates PetscOptionsView() within PetscFinalize()
902e5c89e4eSSatish Balay 
9039666a313SBarry Smith    Notes:
9049666a313SBarry Smith    Only the rank zero process of MPI_Comm used to create view prints the option values. Other processes
9051c9f3c13SBarry Smith    may have different values but they are not printed.
9061c9f3c13SBarry Smith 
907e5c89e4eSSatish Balay    Level: advanced
908e5c89e4eSSatish Balay 
909e5c89e4eSSatish Balay .seealso: PetscOptionsAllUsed()
910e5c89e4eSSatish Balay @*/
911c5929fdfSBarry Smith PetscErrorCode PetscOptionsView(PetscOptions options,PetscViewer viewer)
912e5c89e4eSSatish Balay {
913431c96f7SBarry Smith   PetscInt       i;
91488c29154SBarry Smith   PetscBool      isascii;
915e5c89e4eSSatish Balay 
916e5c89e4eSSatish Balay   PetscFunctionBegin;
9172d747510SLisandro Dalcin   if (viewer) PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
918c5929fdfSBarry Smith   options = options ? options : defaultoptions;
91988c29154SBarry Smith   if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD;
9205f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
921*28b400f6SJacob Faibussowitsch   PetscCheck(isascii,PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer");
92288c29154SBarry Smith 
9232d747510SLisandro Dalcin   if (!options->N) {
9245f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"#No PETSc Option Table entries\n"));
9252d747510SLisandro Dalcin     PetscFunctionReturn(0);
92630694fe9SBarry Smith   }
9272d747510SLisandro Dalcin 
9285f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"#PETSc Option Table entries:\n"));
929e5c89e4eSSatish Balay   for (i=0; i<options->N; i++) {
930e5c89e4eSSatish Balay     if (options->values[i]) {
9315f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"-%s %s\n",options->names[i],options->values[i]));
932e5c89e4eSSatish Balay     } else {
9335f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"-%s\n",options->names[i]));
934e5c89e4eSSatish Balay     }
935e5c89e4eSSatish Balay   }
9365f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"#End of PETSc Option Table entries\n"));
937e5c89e4eSSatish Balay   PetscFunctionReturn(0);
938e5c89e4eSSatish Balay }
939e5c89e4eSSatish Balay 
940e11779c2SBarry Smith /*
941e11779c2SBarry Smith    Called by error handlers to print options used in run
942e11779c2SBarry Smith */
94395c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void)
944e11779c2SBarry Smith {
945e11779c2SBarry Smith   PetscInt     i;
9464416b707SBarry Smith   PetscOptions options = defaultoptions;
947e11779c2SBarry Smith 
948e11779c2SBarry Smith   PetscFunctionBegin;
949e11779c2SBarry Smith   if (options->N) {
950e11779c2SBarry Smith     (*PetscErrorPrintf)("PETSc Option Table entries:\n");
951e11779c2SBarry Smith   } else {
952e11779c2SBarry Smith     (*PetscErrorPrintf)("No PETSc Option Table entries\n");
953e11779c2SBarry Smith   }
954e11779c2SBarry Smith   for (i=0; i<options->N; i++) {
955e11779c2SBarry Smith     if (options->values[i]) {
956e11779c2SBarry Smith       (*PetscErrorPrintf)("-%s %s\n",options->names[i],options->values[i]);
957e11779c2SBarry Smith     } else {
958e11779c2SBarry Smith       (*PetscErrorPrintf)("-%s\n",options->names[i]);
959e11779c2SBarry Smith     }
960e11779c2SBarry Smith   }
961e11779c2SBarry Smith   PetscFunctionReturn(0);
962e11779c2SBarry Smith }
963e11779c2SBarry Smith 
964e5c89e4eSSatish Balay /*@C
96574e0666dSJed Brown    PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow.
96674e0666dSJed Brown 
9671c9f3c13SBarry Smith    Logically Collective
96874e0666dSJed Brown 
969d8d19677SJose E. Roman    Input Parameters:
970c5929fdfSBarry Smith +  options - options database, or NULL for the default global database
971c5929fdfSBarry Smith -  prefix - The string to append to the existing prefix
9729db968c8SJed Brown 
9739db968c8SJed Brown    Options Database Keys:
9749db968c8SJed Brown +   -prefix_push <some_prefix_> - push the given prefix
9759db968c8SJed Brown -   -prefix_pop - pop the last prefix
9769db968c8SJed Brown 
9779db968c8SJed Brown    Notes:
9789db968c8SJed Brown    It is common to use this in conjunction with -options_file as in
9799db968c8SJed Brown 
9809db968c8SJed Brown $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop
9819db968c8SJed Brown 
9829db968c8SJed Brown    where the files no longer require all options to be prefixed with -system2_.
98374e0666dSJed Brown 
9849666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
9851c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
9861c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
9871c9f3c13SBarry Smith    on different ranks.
9881c9f3c13SBarry Smith 
98974e0666dSJed Brown Level: advanced
99074e0666dSJed Brown 
9911c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPop(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue()
99274e0666dSJed Brown @*/
993c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPush(PetscOptions options,const char prefix[])
99474e0666dSJed Brown {
99574e0666dSJed Brown   size_t         n;
99674e0666dSJed Brown   PetscInt       start;
9972d747510SLisandro Dalcin   char           key[MAXOPTNAME+1];
9982d747510SLisandro Dalcin   PetscBool      valid;
99974e0666dSJed Brown 
100074e0666dSJed Brown   PetscFunctionBegin;
1001064a246eSJacob Faibussowitsch   PetscValidCharPointer(prefix,2);
1002c5929fdfSBarry Smith   options = options ? options : defaultoptions;
10032c71b3e2SJacob Faibussowitsch   PetscCheckFalse(options->prefixind >= MAXPREFIXES,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);
10042d747510SLisandro Dalcin   key[0] = '-'; /* keys must start with '-' */
10055f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrncpy(key+1,prefix,sizeof(key)-1));
10065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsValidKey(key,&valid));
10078bf569ecSLisandro Dalcin   if (!valid && options->prefixind > 0 && isdigit((int)prefix[0])) valid = PETSC_TRUE; /* If the prefix stack is not empty, make numbers a valid prefix */
1008*28b400f6SJacob Faibussowitsch   PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_USER,"Given prefix \"%s\" not valid (the first character must be a letter%s, do not include leading '-')",prefix,options->prefixind?" or digit":"");
100974e0666dSJed Brown   start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0;
10105f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(prefix,&n));
10112c71b3e2SJacob Faibussowitsch   PetscCheckFalse(n+1 > sizeof(options->prefix)-start,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %zu exceeded",sizeof(options->prefix));
10125f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscArraycpy(options->prefix+start,prefix,n+1));
101374e0666dSJed Brown   options->prefixstack[options->prefixind++] = start+n;
101474e0666dSJed Brown   PetscFunctionReturn(0);
101574e0666dSJed Brown }
101674e0666dSJed Brown 
1017c5929fdfSBarry Smith /*@C
101874e0666dSJed Brown    PetscOptionsPrefixPop - Remove the latest options prefix, see PetscOptionsPrefixPush() for details
101974e0666dSJed Brown 
10201c9f3c13SBarry Smith    Logically Collective on the MPI_Comm that called PetscOptionsPrefixPush()
102174e0666dSJed Brown 
1022c5929fdfSBarry Smith   Input Parameters:
1023c5929fdfSBarry Smith .  options - options database, or NULL for the default global database
1024c5929fdfSBarry Smith 
102574e0666dSJed Brown    Level: advanced
102674e0666dSJed Brown 
10271c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPush(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue()
102874e0666dSJed Brown @*/
1029c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPop(PetscOptions options)
103074e0666dSJed Brown {
103174e0666dSJed Brown   PetscInt offset;
103274e0666dSJed Brown 
103374e0666dSJed Brown   PetscFunctionBegin;
1034c5929fdfSBarry Smith   options = options ? options : defaultoptions;
10352c71b3e2SJacob Faibussowitsch   PetscCheckFalse(options->prefixind < 1,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More prefixes popped than pushed");
103674e0666dSJed Brown   options->prefixind--;
103774e0666dSJed Brown   offset = options->prefixind ? options->prefixstack[options->prefixind-1] : 0;
103874e0666dSJed Brown   options->prefix[offset] = 0;
103974e0666dSJed Brown   PetscFunctionReturn(0);
104074e0666dSJed Brown }
104174e0666dSJed Brown 
1042a542b6e8SBarry Smith /*@C
1043a542b6e8SBarry Smith     PetscOptionsClear - Removes all options form the database leaving it empty.
1044a542b6e8SBarry Smith 
10451c9f3c13SBarry Smith     Logically Collective
10461c9f3c13SBarry Smith 
1047c5929fdfSBarry Smith   Input Parameters:
1048c5929fdfSBarry Smith .  options - options database, use NULL for the default global database
1049c5929fdfSBarry Smith 
10509666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
10511c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
10521c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
10531c9f3c13SBarry Smith    on different ranks.
10541c9f3c13SBarry Smith 
1055a542b6e8SBarry Smith    Level: developer
1056a542b6e8SBarry Smith 
1057a542b6e8SBarry Smith .seealso: PetscOptionsInsert()
1058a542b6e8SBarry Smith @*/
1059c5929fdfSBarry Smith PetscErrorCode PetscOptionsClear(PetscOptions options)
1060a542b6e8SBarry Smith {
1061a542b6e8SBarry Smith   PetscInt i;
1062a542b6e8SBarry Smith 
1063c5929fdfSBarry Smith   options = options ? options : defaultoptions;
10642d747510SLisandro Dalcin   if (!options) return 0;
10652d747510SLisandro Dalcin 
1066a542b6e8SBarry Smith   for (i=0; i<options->N; i++) {
1067a542b6e8SBarry Smith     if (options->names[i])  free(options->names[i]);
1068a542b6e8SBarry Smith     if (options->values[i]) free(options->values[i]);
1069a542b6e8SBarry Smith   }
10702d747510SLisandro Dalcin   options->N = 0;
10712d747510SLisandro Dalcin 
1072a542b6e8SBarry Smith   for (i=0; i<options->Naliases; i++) {
1073a542b6e8SBarry Smith     free(options->aliases1[i]);
1074a542b6e8SBarry Smith     free(options->aliases2[i]);
1075a542b6e8SBarry Smith   }
1076a542b6e8SBarry Smith   options->Naliases = 0;
1077a542b6e8SBarry Smith 
10782d747510SLisandro Dalcin   /* destroy hash table */
10792d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
10802d747510SLisandro Dalcin   options->ht = NULL;
10810eb63584SBarry Smith 
10822d747510SLisandro Dalcin   options->prefixind = 0;
10832d747510SLisandro Dalcin   options->prefix[0] = 0;
10842d747510SLisandro Dalcin   options->help      = PETSC_FALSE;
10854416b707SBarry Smith   return 0;
10864416b707SBarry Smith }
10874416b707SBarry Smith 
10882d747510SLisandro Dalcin /*@C
10892d747510SLisandro Dalcin    PetscOptionsSetAlias - Makes a key and alias for another key
10902d747510SLisandro Dalcin 
10911c9f3c13SBarry Smith    Logically Collective
10922d747510SLisandro Dalcin 
10932d747510SLisandro Dalcin    Input Parameters:
10942d747510SLisandro Dalcin +  options - options database, or NULL for default global database
10952d747510SLisandro Dalcin .  newname - the alias
10962d747510SLisandro Dalcin -  oldname - the name that alias will refer to
10972d747510SLisandro Dalcin 
10982d747510SLisandro Dalcin    Level: advanced
10992d747510SLisandro Dalcin 
11009666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
11011c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
11021c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
11031c9f3c13SBarry Smith    on different ranks.
11041c9f3c13SBarry Smith 
11052d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(),
11062d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(),
11072d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
11082d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
11092d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
11102d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
11112d747510SLisandro Dalcin @*/
11122d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[])
11132d747510SLisandro Dalcin {
11142d747510SLisandro Dalcin   PetscInt       n;
11152d747510SLisandro Dalcin   size_t         len;
11169210b8eaSVaclav Hapla   PetscBool      valid;
11172d747510SLisandro Dalcin 
11182d747510SLisandro Dalcin   PetscFunctionBegin;
11192d747510SLisandro Dalcin   PetscValidCharPointer(newname,2);
11202d747510SLisandro Dalcin   PetscValidCharPointer(oldname,3);
11212d747510SLisandro Dalcin   options = options ? options : defaultoptions;
11225f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsValidKey(newname,&valid));
1123*28b400f6SJacob Faibussowitsch   PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliased option %s",newname);
11245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsValidKey(oldname,&valid));
1125*28b400f6SJacob Faibussowitsch   PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliasee option %s",oldname);
11262d747510SLisandro Dalcin 
11272d747510SLisandro Dalcin   n = options->Naliases;
11282c71b3e2SJacob Faibussowitsch   PetscCheckFalse(n >= MAXALIASES,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);
11292d747510SLisandro Dalcin 
11302d747510SLisandro Dalcin   newname++; oldname++;
11315f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(newname,&len));
11322d747510SLisandro Dalcin   options->aliases1[n] = (char*)malloc((len+1)*sizeof(char));
11335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcpy(options->aliases1[n],newname));
11345f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(oldname,&len));
11352d747510SLisandro Dalcin   options->aliases2[n] = (char*)malloc((len+1)*sizeof(char));
11365f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcpy(options->aliases2[n],oldname));
11372d747510SLisandro Dalcin   options->Naliases++;
11382d747510SLisandro Dalcin   PetscFunctionReturn(0);
11392d747510SLisandro Dalcin }
11404416b707SBarry Smith 
1141e5c89e4eSSatish Balay /*@C
1142e5c89e4eSSatish Balay    PetscOptionsSetValue - Sets an option name-value pair in the options
1143e5c89e4eSSatish Balay    database, overriding whatever is already present.
1144e5c89e4eSSatish Balay 
11451c9f3c13SBarry Smith    Logically Collective
1146e5c89e4eSSatish Balay 
1147e5c89e4eSSatish Balay    Input Parameters:
1148c5929fdfSBarry Smith +  options - options database, use NULL for the default global database
1149c5929fdfSBarry Smith .  name - name of option, this SHOULD have the - prepended
11502d747510SLisandro Dalcin -  value - the option value (not used for all options, so can be NULL)
1151e5c89e4eSSatish Balay 
1152e5c89e4eSSatish Balay    Level: intermediate
1153e5c89e4eSSatish Balay 
1154e5c89e4eSSatish Balay    Note:
1155d49172ceSBarry Smith    This function can be called BEFORE PetscInitialize()
1156d49172ceSBarry Smith 
11579666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
11581c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
11591c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
11601c9f3c13SBarry Smith    on different ranks.
11611c9f3c13SBarry Smith 
11622d747510SLisandro Dalcin    Developers Note: Uses malloc() directly because PETSc may not be initialized yet.
1163b0250c70SBarry Smith 
11642d747510SLisandro Dalcin .seealso: PetscOptionsInsert(), PetscOptionsClearValue()
1165e5c89e4eSSatish Balay @*/
11662d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetValue(PetscOptions options,const char name[],const char value[])
1167e5c89e4eSSatish Balay {
1168c5b5d8d5SVaclav Hapla   return PetscOptionsSetValue_Private(options,name,value,NULL);
1169c5b5d8d5SVaclav Hapla }
1170c5b5d8d5SVaclav Hapla 
1171c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsSetValue_Private(PetscOptions options,const char name[],const char value[],int *pos)
1172c5b5d8d5SVaclav Hapla {
1173e5c89e4eSSatish Balay   size_t         len;
11742d747510SLisandro Dalcin   int            N,n,i;
1175e5c89e4eSSatish Balay   char           **names;
11762d747510SLisandro Dalcin   char           fullname[MAXOPTNAME] = "";
1177c5b5d8d5SVaclav Hapla   PetscBool      flg;
11782d747510SLisandro Dalcin   PetscErrorCode ierr;
1179e5c89e4eSSatish Balay 
11807272c0d2SVaclav Hapla   if (!options) {
11812d747510SLisandro Dalcin     ierr = PetscOptionsCreateDefault();if (ierr) return ierr;
11827272c0d2SVaclav Hapla     options = defaultoptions;
1183c5929fdfSBarry Smith   }
11842d747510SLisandro Dalcin 
11852d747510SLisandro Dalcin   if (name[0] != '-') return PETSC_ERR_ARG_OUTOFRANGE;
1186e5c89e4eSSatish Balay 
1187d06005cbSLisandro Dalcin   ierr = PetscOptionsSkipPrecedent(options,name,&flg);if (ierr) return ierr;
1188c5b5d8d5SVaclav Hapla   if (flg) return 0;
1189e5c89e4eSSatish Balay 
11902d747510SLisandro Dalcin   name++; /* skip starting dash */
11912d747510SLisandro Dalcin 
119274e0666dSJed Brown   if (options->prefixind > 0) {
1193d49172ceSBarry Smith     strncpy(fullname,options->prefix,sizeof(fullname));
11942d747510SLisandro Dalcin     fullname[sizeof(fullname)-1] = 0;
119589ae1891SBarry Smith     strncat(fullname,name,sizeof(fullname)-strlen(fullname)-1);
11962d747510SLisandro Dalcin     fullname[sizeof(fullname)-1] = 0;
119774e0666dSJed Brown     name = fullname;
119874e0666dSJed Brown   }
119974e0666dSJed Brown 
120074e0666dSJed Brown   /* check against aliases */
1201e5c89e4eSSatish Balay   N = options->Naliases;
1202e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
12032d747510SLisandro Dalcin     int result = PetscOptNameCmp(options->aliases1[i],name);
12042d747510SLisandro Dalcin     if (!result) { name = options->aliases2[i]; break; }
1205e5c89e4eSSatish Balay   }
1206e5c89e4eSSatish Balay 
12072d747510SLisandro Dalcin   /* slow search */
12082d747510SLisandro Dalcin   N = n = options->N;
1209e5c89e4eSSatish Balay   names = options->names;
1210e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
12112d747510SLisandro Dalcin     int result = PetscOptNameCmp(names[i],name);
12122d747510SLisandro Dalcin     if (!result) {
12132d747510SLisandro Dalcin       n = i; goto setvalue;
12142d747510SLisandro Dalcin     } else if (result > 0) {
12152d747510SLisandro Dalcin       n = i; break;
1216e5c89e4eSSatish Balay     }
1217e5c89e4eSSatish Balay   }
12182d747510SLisandro Dalcin   if (N >= MAXOPTIONS) return PETSC_ERR_MEM;
12192d747510SLisandro Dalcin   /* shift remaining values up 1 */
1220e5c89e4eSSatish Balay   for (i=N; i>n; i--) {
12215e8c5e88SLisandro Dalcin     options->names[i]  = options->names[i-1];
1222e5c89e4eSSatish Balay     options->values[i] = options->values[i-1];
1223e5c89e4eSSatish Balay     options->used[i]   = options->used[i-1];
1224e5c89e4eSSatish Balay   }
12252d747510SLisandro Dalcin   options->names[n]  = NULL;
12262d747510SLisandro Dalcin   options->values[n] = NULL;
12272d747510SLisandro Dalcin   options->used[n]   = PETSC_FALSE;
12282d747510SLisandro Dalcin   options->N++;
12292d747510SLisandro Dalcin 
12302d747510SLisandro Dalcin   /* destroy hash table */
12312d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
12322d747510SLisandro Dalcin   options->ht = NULL;
12332d747510SLisandro Dalcin 
12342d747510SLisandro Dalcin   /* set new name */
123570d8d27cSBarry Smith   len = strlen(name);
12365e8c5e88SLisandro Dalcin   options->names[n] = (char*)malloc((len+1)*sizeof(char));
1237d49172ceSBarry Smith   if (!options->names[n]) return PETSC_ERR_MEM;
1238d49172ceSBarry Smith   strcpy(options->names[n],name);
12392d747510SLisandro Dalcin 
12402d747510SLisandro Dalcin setvalue:
12412d747510SLisandro Dalcin   /* set new value */
12422d747510SLisandro Dalcin   if (options->values[n]) free(options->values[n]);
1243d49172ceSBarry Smith   len = value ? strlen(value) : 0;
12445e8c5e88SLisandro Dalcin   if (len) {
1245e5c89e4eSSatish Balay     options->values[n] = (char*)malloc((len+1)*sizeof(char));
1246d49172ceSBarry Smith     if (!options->values[n]) return PETSC_ERR_MEM;
1247d49172ceSBarry Smith     strcpy(options->values[n],value);
12482d747510SLisandro Dalcin   } else {
12492d747510SLisandro Dalcin     options->values[n] = NULL;
12502d747510SLisandro Dalcin   }
12512d747510SLisandro Dalcin 
125291ad3481SVaclav Hapla   /* handle -help so that it can be set from anywhere */
125391ad3481SVaclav Hapla   if (!PetscOptNameCmp(name,"help")) {
125491ad3481SVaclav Hapla     options->help = PETSC_TRUE;
1255d06005cbSLisandro Dalcin     options->help_intro = (value && !PetscOptNameCmp(value,"intro")) ? PETSC_TRUE : PETSC_FALSE;
125691ad3481SVaclav Hapla     options->used[n] = PETSC_TRUE;
125791ad3481SVaclav Hapla   }
125891ad3481SVaclav Hapla 
1259c5b5d8d5SVaclav Hapla   if (PetscErrorHandlingInitialized) {
12605f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsMonitor(options,name,value));
1261c5b5d8d5SVaclav Hapla   }
1262c5b5d8d5SVaclav Hapla   if (pos) *pos = n;
1263d49172ceSBarry Smith   return 0;
1264e5c89e4eSSatish Balay }
1265e5c89e4eSSatish Balay 
1266e5c89e4eSSatish Balay /*@C
1267e5c89e4eSSatish Balay    PetscOptionsClearValue - Clears an option name-value pair in the options
1268e5c89e4eSSatish Balay    database, overriding whatever is already present.
1269e5c89e4eSSatish Balay 
12701c9f3c13SBarry Smith    Logically Collective
1271e5c89e4eSSatish Balay 
1272d8d19677SJose E. Roman    Input Parameters:
1273c5929fdfSBarry Smith +  options - options database, use NULL for the default global database
1274a2b725a8SWilliam Gropp -  name - name of option, this SHOULD have the - prepended
1275e5c89e4eSSatish Balay 
1276e5c89e4eSSatish Balay    Level: intermediate
1277e5c89e4eSSatish Balay 
12789666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
12791c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
12801c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
12811c9f3c13SBarry Smith    on different ranks.
12821c9f3c13SBarry Smith 
1283e5c89e4eSSatish Balay .seealso: PetscOptionsInsert()
1284e5c89e4eSSatish Balay @*/
12852d747510SLisandro Dalcin PetscErrorCode PetscOptionsClearValue(PetscOptions options,const char name[])
1286e5c89e4eSSatish Balay {
12872d747510SLisandro Dalcin   int            N,n,i;
12882d747510SLisandro Dalcin   char           **names;
1289e5c89e4eSSatish Balay 
1290e5c89e4eSSatish Balay   PetscFunctionBegin;
1291c5929fdfSBarry Smith   options = options ? options : defaultoptions;
12922c71b3e2SJacob Faibussowitsch   PetscCheckFalse(name[0] != '-',PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1293c9dcd962SLisandro Dalcin   if (!PetscOptNameCmp(name,"-help")) options->help = options->help_intro = PETSC_FALSE;
12942d747510SLisandro Dalcin 
12952d747510SLisandro Dalcin   name++; /* skip starting dash */
12962d747510SLisandro Dalcin 
12972d747510SLisandro Dalcin   /* slow search */
12982d747510SLisandro Dalcin   N = n = options->N;
1299e5c89e4eSSatish Balay   names = options->names;
1300e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
13012d747510SLisandro Dalcin     int result = PetscOptNameCmp(names[i],name);
13022d747510SLisandro Dalcin     if (!result) {
13032d747510SLisandro Dalcin       n = i; break;
13042d747510SLisandro Dalcin     } else if (result > 0) {
13052d747510SLisandro Dalcin       n = N; break;
1306e5c89e4eSSatish Balay     }
13072d747510SLisandro Dalcin   }
13082d747510SLisandro Dalcin   if (n == N) PetscFunctionReturn(0); /* it was not present */
1309e5c89e4eSSatish Balay 
13102d747510SLisandro Dalcin   /* remove name and value */
13112d747510SLisandro Dalcin   if (options->names[n])  free(options->names[n]);
13122d747510SLisandro Dalcin   if (options->values[n]) free(options->values[n]);
1313e5c89e4eSSatish Balay   /* shift remaining values down 1 */
1314e5c89e4eSSatish Balay   for (i=n; i<N-1; i++) {
13155e8c5e88SLisandro Dalcin     options->names[i]  = options->names[i+1];
1316e5c89e4eSSatish Balay     options->values[i] = options->values[i+1];
1317e5c89e4eSSatish Balay     options->used[i]   = options->used[i+1];
1318e5c89e4eSSatish Balay   }
1319e5c89e4eSSatish Balay   options->N--;
13202d747510SLisandro Dalcin 
13212d747510SLisandro Dalcin   /* destroy hash table */
13222d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
13232d747510SLisandro Dalcin   options->ht = NULL;
13242d747510SLisandro Dalcin 
13255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsMonitor(options,name,NULL));
1326e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1327e5c89e4eSSatish Balay }
1328e5c89e4eSSatish Balay 
1329e5c89e4eSSatish Balay /*@C
13302d747510SLisandro Dalcin    PetscOptionsFindPair - Gets an option name-value pair from the options database.
1331e5c89e4eSSatish Balay 
13322d747510SLisandro Dalcin    Not Collective
1333e5c89e4eSSatish Balay 
1334e5c89e4eSSatish Balay    Input Parameters:
13352d747510SLisandro Dalcin +  options - options database, use NULL for the default global database
13362d747510SLisandro Dalcin .  pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended
13372d747510SLisandro Dalcin -  name - name of option, this SHOULD have the "-" prepended
1338e5c89e4eSSatish Balay 
13392d747510SLisandro Dalcin    Output Parameters:
13402d747510SLisandro Dalcin +  value - the option value (optional, not used for all options)
13412d747510SLisandro Dalcin -  set - whether the option is set (optional)
1342e5c89e4eSSatish Balay 
13439666a313SBarry Smith    Notes:
13449666a313SBarry Smith    Each process may find different values or no value depending on how options were inserted into the database
13451c9f3c13SBarry Smith 
13462d747510SLisandro Dalcin    Level: developer
13472d747510SLisandro Dalcin 
13482d747510SLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsClearValue()
1349e5c89e4eSSatish Balay @*/
13502d747510SLisandro Dalcin PetscErrorCode PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char *value[],PetscBool *set)
1351e5c89e4eSSatish Balay {
13522d747510SLisandro Dalcin   char           buf[MAXOPTNAME];
1353daabea38SBarry Smith   PetscBool      usehashtable = PETSC_TRUE;
13542d747510SLisandro Dalcin   PetscBool      matchnumbers = PETSC_TRUE;
1355e5c89e4eSSatish Balay 
1356e5c89e4eSSatish Balay   PetscFunctionBegin;
1357c5929fdfSBarry Smith   options = options ? options : defaultoptions;
13582c71b3e2SJacob Faibussowitsch   PetscCheckFalse(pre && PetscUnlikely(pre[0] == '-'),PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre);
13592c71b3e2SJacob Faibussowitsch   PetscCheckFalse(name[0] != '-',PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1360e5c89e4eSSatish Balay 
13612d747510SLisandro Dalcin   name++; /* skip starting dash */
1362e5c89e4eSSatish Balay 
13637cd08cecSJed Brown   /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */
13642d747510SLisandro Dalcin   if (pre && pre[0]) {
13652d747510SLisandro Dalcin     char *ptr = buf;
13662d747510SLisandro Dalcin     if (name[0] == '-') { *ptr++ = '-';  name++; }
13675f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrncpy(ptr,pre,buf+sizeof(buf)-ptr));
13685f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrlcat(buf,name,sizeof(buf)));
13692d747510SLisandro Dalcin     name = buf;
13707cd08cecSJed Brown   }
13712d747510SLisandro Dalcin 
137276bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
13732f828895SJed Brown     PetscBool valid;
13742d747510SLisandro Dalcin     char      key[MAXOPTNAME+1] = "-";
13755f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrncpy(key+1,name,sizeof(key)-1));
13765f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsValidKey(key,&valid));
1377*28b400f6SJacob Faibussowitsch     PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid option '%s' obtained from pre='%s' and name='%s'",key,pre?pre:"",name);
13782f828895SJed Brown   }
1379e5c89e4eSSatish Balay 
13802d747510SLisandro Dalcin   if (!options->ht && usehashtable) {
13812d747510SLisandro Dalcin     int i,ret;
13822d747510SLisandro Dalcin     khiter_t it;
13832d747510SLisandro Dalcin     khash_t(HO) *ht;
13842d747510SLisandro Dalcin     ht = kh_init(HO);
1385*28b400f6SJacob Faibussowitsch     PetscCheck(ht,PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
13862d747510SLisandro Dalcin     ret = kh_resize(HO,ht,options->N*2); /* twice the required size to reduce risk of collisions */
1387*28b400f6SJacob Faibussowitsch     PetscCheck(!ret,PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
13882d747510SLisandro Dalcin     for (i=0; i<options->N; i++) {
13892d747510SLisandro Dalcin       it = kh_put(HO,ht,options->names[i],&ret);
13902c71b3e2SJacob Faibussowitsch       PetscCheckFalse(ret != 1,PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
13912d747510SLisandro Dalcin       kh_val(ht,it) = i;
13922d747510SLisandro Dalcin     }
13932d747510SLisandro Dalcin     options->ht = ht;
13942d747510SLisandro Dalcin   }
13952d747510SLisandro Dalcin 
13962d747510SLisandro Dalcin   if (usehashtable)
13972d747510SLisandro Dalcin   { /* fast search */
13982d747510SLisandro Dalcin     khash_t(HO) *ht = options->ht;
13992d747510SLisandro Dalcin     khiter_t it = kh_get(HO,ht,name);
14002d747510SLisandro Dalcin     if (it != kh_end(ht)) {
14012d747510SLisandro Dalcin       int i = kh_val(ht,it);
1402e5c89e4eSSatish Balay       options->used[i]  = PETSC_TRUE;
14032d747510SLisandro Dalcin       if (value) *value = options->values[i];
14042d747510SLisandro Dalcin       if (set)   *set   = PETSC_TRUE;
14052d747510SLisandro Dalcin       PetscFunctionReturn(0);
14062d747510SLisandro Dalcin     }
14072d747510SLisandro Dalcin   } else
14082d747510SLisandro Dalcin   { /* slow search */
14092d747510SLisandro Dalcin     int i, N = options->N;
14102d747510SLisandro Dalcin     for (i=0; i<N; i++) {
1411daabea38SBarry Smith       int result = PetscOptNameCmp(options->names[i],name);
14122d747510SLisandro Dalcin       if (!result) {
14132d747510SLisandro Dalcin         options->used[i]  = PETSC_TRUE;
14142d747510SLisandro Dalcin         if (value) *value = options->values[i];
14152d747510SLisandro Dalcin         if (set)   *set   = PETSC_TRUE;
14162d747510SLisandro Dalcin         PetscFunctionReturn(0);
14172d747510SLisandro Dalcin       } else if (result > 0) {
1418e5c89e4eSSatish Balay         break;
1419e5c89e4eSSatish Balay       }
1420e5c89e4eSSatish Balay     }
14212d747510SLisandro Dalcin   }
14222d747510SLisandro Dalcin 
14232d747510SLisandro Dalcin   /*
14242d747510SLisandro Dalcin    The following block slows down all lookups in the most frequent path (most lookups are unsuccessful).
14252d747510SLisandro Dalcin    Maybe this special lookup mode should be enabled on request with a push/pop API.
14262d747510SLisandro Dalcin    The feature of matching _%d_ used sparingly in the codebase.
14272d747510SLisandro Dalcin    */
14282d747510SLisandro Dalcin   if (matchnumbers) {
14292d747510SLisandro Dalcin     int i,j,cnt = 0,locs[16],loce[16];
1430e5c89e4eSSatish Balay     /* determine the location and number of all _%d_ in the key */
14312d747510SLisandro Dalcin     for (i=0; name[i]; i++) {
14322d747510SLisandro Dalcin       if (name[i] == '_') {
14332d747510SLisandro Dalcin         for (j=i+1; name[j]; j++) {
14342d747510SLisandro Dalcin           if (name[j] >= '0' && name[j] <= '9') continue;
14352d747510SLisandro Dalcin           if (name[j] == '_' && j > i+1) { /* found a number */
1436e5c89e4eSSatish Balay             locs[cnt]   = i+1;
1437e5c89e4eSSatish Balay             loce[cnt++] = j+1;
1438e5c89e4eSSatish Balay           }
14392d747510SLisandro Dalcin           i = j-1;
1440e5c89e4eSSatish Balay           break;
1441e5c89e4eSSatish Balay         }
1442e5c89e4eSSatish Balay       }
1443e5c89e4eSSatish Balay     }
1444e5c89e4eSSatish Balay     for (i=0; i<cnt; i++) {
14452d747510SLisandro Dalcin       PetscBool found;
14462d747510SLisandro Dalcin       char      opt[MAXOPTNAME+1] = "-", tmp[MAXOPTNAME];
14475f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrncpy(tmp,name,PetscMin((size_t)(locs[i]+1),sizeof(tmp))));
14485f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrlcat(opt,tmp,sizeof(opt)));
14495f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrlcat(opt,name+loce[i],sizeof(opt)));
14505f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsFindPair(options,NULL,opt,value,&found));
14512d747510SLisandro Dalcin       if (found) {if (set) *set = PETSC_TRUE; PetscFunctionReturn(0);}
1452e5c89e4eSSatish Balay     }
1453e5c89e4eSSatish Balay   }
14542d747510SLisandro Dalcin 
14552d747510SLisandro Dalcin   if (set) *set = PETSC_FALSE;
1456e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1457e5c89e4eSSatish Balay }
1458e5c89e4eSSatish Balay 
1459d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */
14602d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[], const char name[],const char *value[],PetscBool *set)
1461514bf10dSMatthew G Knepley {
14622d747510SLisandro Dalcin   char           buf[MAXOPTNAME];
1463d6ced9c0SMatthew G. Knepley   int            numCnt = 0, locs[16],loce[16];
1464514bf10dSMatthew G Knepley 
1465514bf10dSMatthew G Knepley   PetscFunctionBegin;
1466c5929fdfSBarry Smith   options = options ? options : defaultoptions;
14672c71b3e2SJacob Faibussowitsch   PetscCheckFalse(pre && pre[0] == '-',PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre);
14682c71b3e2SJacob Faibussowitsch   PetscCheckFalse(name[0] != '-',PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1469514bf10dSMatthew G Knepley 
14702d747510SLisandro Dalcin   name++; /* skip starting dash */
1471514bf10dSMatthew G Knepley 
1472514bf10dSMatthew G Knepley   /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */
14732d747510SLisandro Dalcin   if (pre && pre[0]) {
14742d747510SLisandro Dalcin     char *ptr = buf;
14752d747510SLisandro Dalcin     if (name[0] == '-') { *ptr++ = '-';  name++; }
14765f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrncpy(ptr,pre,sizeof(buf)+(size_t)(ptr-buf)));
14775f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrlcat(buf,name,sizeof(buf)));
14782d747510SLisandro Dalcin     name = buf;
1479514bf10dSMatthew G Knepley   }
14802d747510SLisandro Dalcin 
148176bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
1482514bf10dSMatthew G Knepley     PetscBool valid;
14832d747510SLisandro Dalcin     char      key[MAXOPTNAME+1] = "-";
14845f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrncpy(key+1,name,sizeof(key)-1));
14855f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsValidKey(key,&valid));
1486*28b400f6SJacob Faibussowitsch     PetscCheck(valid,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid option '%s' obtained from pre='%s' and name='%s'",key,pre?pre:"",name);
1487514bf10dSMatthew G Knepley   }
1488514bf10dSMatthew G Knepley 
1489d6ced9c0SMatthew G. Knepley   /* determine the location and number of all _%d_ in the key */
1490d6ced9c0SMatthew G. Knepley   {
1491d6ced9c0SMatthew G. Knepley     int i,j;
1492d6ced9c0SMatthew G. Knepley     for (i=0; name[i]; i++) {
1493d6ced9c0SMatthew G. Knepley       if (name[i] == '_') {
1494d6ced9c0SMatthew G. Knepley         for (j=i+1; name[j]; j++) {
1495d6ced9c0SMatthew G. Knepley           if (name[j] >= '0' && name[j] <= '9') continue;
1496d6ced9c0SMatthew G. Knepley           if (name[j] == '_' && j > i+1) { /* found a number */
1497d6ced9c0SMatthew G. Knepley             locs[numCnt]   = i+1;
1498d6ced9c0SMatthew G. Knepley             loce[numCnt++] = j+1;
1499d6ced9c0SMatthew G. Knepley           }
1500d6ced9c0SMatthew G. Knepley           i = j-1;
1501d6ced9c0SMatthew G. Knepley           break;
1502d6ced9c0SMatthew G. Knepley         }
1503d6ced9c0SMatthew G. Knepley       }
1504d6ced9c0SMatthew G. Knepley     }
1505d6ced9c0SMatthew G. Knepley   }
1506d6ced9c0SMatthew G. Knepley 
15072d747510SLisandro Dalcin   { /* slow search */
1508d6ced9c0SMatthew G. Knepley     int       c, i;
15092d747510SLisandro Dalcin     size_t    len;
15102d747510SLisandro Dalcin     PetscBool match;
1511d6ced9c0SMatthew G. Knepley 
1512d6ced9c0SMatthew G. Knepley     for (c = -1; c < numCnt; ++c) {
1513d6ced9c0SMatthew G. Knepley       char opt[MAXOPTNAME+1] = "", tmp[MAXOPTNAME];
1514d6ced9c0SMatthew G. Knepley 
1515d6ced9c0SMatthew G. Knepley       if (c < 0) {
15165f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrcpy(opt,name));
1517d6ced9c0SMatthew G. Knepley       } else {
15185f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrncpy(tmp,name,PetscMin((size_t)(locs[c]+1),sizeof(tmp))));
15195f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrlcat(opt,tmp,sizeof(opt)));
15205f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrlcat(opt,name+loce[c],sizeof(opt)));
1521d6ced9c0SMatthew G. Knepley       }
15225f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrlen(opt,&len));
15232d747510SLisandro Dalcin       for (i=0; i<options->N; i++) {
15245f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrncmp(options->names[i],opt,len,&match));
1525514bf10dSMatthew G Knepley         if (match) {
1526514bf10dSMatthew G Knepley           options->used[i]  = PETSC_TRUE;
15272d747510SLisandro Dalcin           if (value) *value = options->values[i];
15282d747510SLisandro Dalcin           if (set)   *set   = PETSC_TRUE;
15292d747510SLisandro Dalcin           PetscFunctionReturn(0);
1530514bf10dSMatthew G Knepley         }
1531514bf10dSMatthew G Knepley       }
15322d747510SLisandro Dalcin     }
1533d6ced9c0SMatthew G. Knepley   }
15342d747510SLisandro Dalcin 
15352d747510SLisandro Dalcin   if (set) *set = PETSC_FALSE;
1536514bf10dSMatthew G Knepley   PetscFunctionReturn(0);
1537514bf10dSMatthew G Knepley }
1538514bf10dSMatthew G Knepley 
1539e5c89e4eSSatish Balay /*@C
1540e5c89e4eSSatish Balay    PetscOptionsReject - Generates an error if a certain option is given.
1541e5c89e4eSSatish Balay 
15421c9f3c13SBarry Smith    Not Collective
1543e5c89e4eSSatish Balay 
1544e5c89e4eSSatish Balay    Input Parameters:
15455c9cc608SHong Zhang +  options - options database, use NULL for default global database
15462d747510SLisandro Dalcin .  pre - the option prefix (may be NULL)
15472d747510SLisandro Dalcin .  name - the option name one is seeking
15480298fd71SBarry Smith -  mess - error message (may be NULL)
1549e5c89e4eSSatish Balay 
1550e5c89e4eSSatish Balay    Level: advanced
1551e5c89e4eSSatish Balay 
1552e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(),
1553acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1554e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1555e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1556acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1557a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
1558e5c89e4eSSatish Balay @*/
15592d747510SLisandro Dalcin PetscErrorCode PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[])
1560e5c89e4eSSatish Balay {
1561ace3abfcSBarry Smith   PetscBool      flag = PETSC_FALSE;
1562e5c89e4eSSatish Balay 
1563e5c89e4eSSatish Balay   PetscFunctionBegin;
15645f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsHasName(options,pre,name,&flag));
1565e5c89e4eSSatish Balay   if (flag) {
15662c71b3e2SJacob Faibussowitsch     PetscCheckFalse(mess && mess[0],PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s with %s",pre?pre:"",name+1,mess);
156798921bdaSJacob Faibussowitsch     else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s",pre?pre:"",name+1);
1568e5c89e4eSSatish Balay   }
1569e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1570e5c89e4eSSatish Balay }
1571e5c89e4eSSatish Balay 
1572e5c89e4eSSatish Balay /*@C
15732d747510SLisandro Dalcin    PetscOptionsHasHelp - Determines whether the "-help" option is in the database.
15742d747510SLisandro Dalcin 
15752d747510SLisandro Dalcin    Not Collective
15762d747510SLisandro Dalcin 
15772d747510SLisandro Dalcin    Input Parameters:
15782d747510SLisandro Dalcin .  options - options database, use NULL for default global database
15792d747510SLisandro Dalcin 
15802d747510SLisandro Dalcin    Output Parameters:
15812d747510SLisandro Dalcin .  set - PETSC_TRUE if found else PETSC_FALSE.
15822d747510SLisandro Dalcin 
15832d747510SLisandro Dalcin    Level: advanced
15842d747510SLisandro Dalcin 
15852d747510SLisandro Dalcin .seealso: PetscOptionsHasName()
15862d747510SLisandro Dalcin @*/
15872d747510SLisandro Dalcin PetscErrorCode PetscOptionsHasHelp(PetscOptions options,PetscBool *set)
15882d747510SLisandro Dalcin {
15892d747510SLisandro Dalcin   PetscFunctionBegin;
15902d747510SLisandro Dalcin   PetscValidPointer(set,2);
15912d747510SLisandro Dalcin   options = options ? options : defaultoptions;
15922d747510SLisandro Dalcin   *set = options->help;
15932d747510SLisandro Dalcin   PetscFunctionReturn(0);
15942d747510SLisandro Dalcin }
15952d747510SLisandro Dalcin 
1596d314f959SVaclav Hapla PetscErrorCode PetscOptionsHasHelpIntro_Internal(PetscOptions options,PetscBool *set)
1597d314f959SVaclav Hapla {
1598d314f959SVaclav Hapla   PetscFunctionBegin;
1599d314f959SVaclav Hapla   PetscValidPointer(set,2);
1600d314f959SVaclav Hapla   options = options ? options : defaultoptions;
1601d314f959SVaclav Hapla   *set = options->help_intro;
1602d314f959SVaclav Hapla   PetscFunctionReturn(0);
1603d314f959SVaclav Hapla }
1604d314f959SVaclav Hapla 
16052d747510SLisandro Dalcin /*@C
1606e24fcbf7SPierre Jolivet    PetscOptionsHasName - Determines whether a certain option is given in the database. This returns true whether the option is a number, string or Boolean, even
1607e24fcbf7SPierre Jolivet                       if its value is set to false.
1608e5c89e4eSSatish Balay 
1609e5c89e4eSSatish Balay    Not Collective
1610e5c89e4eSSatish Balay 
1611e5c89e4eSSatish Balay    Input Parameters:
16125c9cc608SHong Zhang +  options - options database, use NULL for default global database
16133de71b31SHong Zhang .  pre - string to prepend to the name or NULL
16143de71b31SHong Zhang -  name - the option one is seeking
1615e5c89e4eSSatish Balay 
1616e5c89e4eSSatish Balay    Output Parameters:
161796ef3cdfSSatish Balay .  set - PETSC_TRUE if found else PETSC_FALSE.
1618e5c89e4eSSatish Balay 
1619e5c89e4eSSatish Balay    Level: beginner
1620e5c89e4eSSatish Balay 
162195452b02SPatrick Sanan    Notes:
1622acfcf0e5SJed Brown    In many cases you probably want to use PetscOptionsGetBool() instead of calling this, to allowing toggling values.
162390d69ab7SBarry Smith 
1624e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1625f3e3d7dfSBarry Smith           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1626e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1627e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1628acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1629a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
1630e5c89e4eSSatish Balay @*/
1631c5929fdfSBarry Smith PetscErrorCode PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool *set)
1632e5c89e4eSSatish Balay {
16332d747510SLisandro Dalcin   const char     *value;
1634ace3abfcSBarry Smith   PetscBool      flag;
1635e5c89e4eSSatish Balay 
1636e5c89e4eSSatish Balay   PetscFunctionBegin;
16375f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&value,&flag));
163896ef3cdfSSatish Balay   if (set) *set = flag;
1639e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1640e5c89e4eSSatish Balay }
1641e5c89e4eSSatish Balay 
1642e5c89e4eSSatish Balay /*@C
16432d747510SLisandro Dalcin    PetscOptionsGetAll - Lists all the options the program was run with in a single string.
16442d747510SLisandro Dalcin 
16452d747510SLisandro Dalcin    Not Collective
16462d747510SLisandro Dalcin 
1647fd292e60Sprj-    Input Parameter:
16482d747510SLisandro Dalcin .  options - the options database, use NULL for the default global database
16492d747510SLisandro Dalcin 
16502d747510SLisandro Dalcin    Output Parameter:
16512d747510SLisandro Dalcin .  copts - pointer where string pointer is stored
16522d747510SLisandro Dalcin 
16532d747510SLisandro Dalcin    Notes:
16541c9f3c13SBarry Smith     The array and each entry in the array should be freed with PetscFree()
16551c9f3c13SBarry Smith     Each process may have different values depending on how the options were inserted into the database
16562d747510SLisandro Dalcin 
16572d747510SLisandro Dalcin    Level: advanced
16582d747510SLisandro Dalcin 
16591c9f3c13SBarry Smith .seealso: PetscOptionsAllUsed(), PetscOptionsView(), PetscOptionsPush(), PetscOptionsPop()
16602d747510SLisandro Dalcin @*/
16612d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetAll(PetscOptions options,char *copts[])
16622d747510SLisandro Dalcin {
16632d747510SLisandro Dalcin   PetscInt       i;
16642d747510SLisandro Dalcin   size_t         len = 1,lent = 0;
16652d747510SLisandro Dalcin   char           *coptions = NULL;
16662d747510SLisandro Dalcin 
16672d747510SLisandro Dalcin   PetscFunctionBegin;
16682d747510SLisandro Dalcin   PetscValidPointer(copts,2);
16692d747510SLisandro Dalcin   options = options ? options : defaultoptions;
16702d747510SLisandro Dalcin   /* count the length of the required string */
16712d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
16725f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrlen(options->names[i],&lent));
16732d747510SLisandro Dalcin     len += 2 + lent;
16742d747510SLisandro Dalcin     if (options->values[i]) {
16755f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrlen(options->values[i],&lent));
16762d747510SLisandro Dalcin       len += 1 + lent;
16772d747510SLisandro Dalcin     }
16782d747510SLisandro Dalcin   }
16795f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(len,&coptions));
16802d747510SLisandro Dalcin   coptions[0] = 0;
16812d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
16825f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcat(coptions,"-"));
16835f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcat(coptions,options->names[i]));
16845f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcat(coptions," "));
16852d747510SLisandro Dalcin     if (options->values[i]) {
16865f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcat(coptions,options->values[i]));
16875f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcat(coptions," "));
16882d747510SLisandro Dalcin     }
16892d747510SLisandro Dalcin   }
16902d747510SLisandro Dalcin   *copts = coptions;
16912d747510SLisandro Dalcin   PetscFunctionReturn(0);
16922d747510SLisandro Dalcin }
16932d747510SLisandro Dalcin 
16942d747510SLisandro Dalcin /*@C
16952d747510SLisandro Dalcin    PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database
16962d747510SLisandro Dalcin 
16972d747510SLisandro Dalcin    Not Collective
16982d747510SLisandro Dalcin 
1699d8d19677SJose E. Roman    Input Parameters:
17002d747510SLisandro Dalcin +  options - options database, use NULL for default global database
17012d747510SLisandro Dalcin -  name - string name of option
17022d747510SLisandro Dalcin 
17032d747510SLisandro Dalcin    Output Parameter:
17042d747510SLisandro Dalcin .  used - PETSC_TRUE if the option was used, otherwise false, including if option was not found in options database
17052d747510SLisandro Dalcin 
17062d747510SLisandro Dalcin    Level: advanced
17072d747510SLisandro Dalcin 
17089666a313SBarry Smith    Notes:
17099666a313SBarry Smith    The value returned may be different on each process and depends on which options have been processed
17101c9f3c13SBarry Smith    on the given process
17111c9f3c13SBarry Smith 
17122d747510SLisandro Dalcin .seealso: PetscOptionsView(), PetscOptionsLeft(), PetscOptionsAllUsed()
17132d747510SLisandro Dalcin @*/
17142d747510SLisandro Dalcin PetscErrorCode PetscOptionsUsed(PetscOptions options,const char *name,PetscBool *used)
17152d747510SLisandro Dalcin {
17162d747510SLisandro Dalcin   PetscInt       i;
17172d747510SLisandro Dalcin 
17182d747510SLisandro Dalcin   PetscFunctionBegin;
17192d747510SLisandro Dalcin   PetscValidCharPointer(name,2);
17202d747510SLisandro Dalcin   PetscValidPointer(used,3);
17212d747510SLisandro Dalcin   options = options ? options : defaultoptions;
17222d747510SLisandro Dalcin   *used = PETSC_FALSE;
17232d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
17245f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(options->names[i],name,used));
17252d747510SLisandro Dalcin     if (*used) {
17262d747510SLisandro Dalcin       *used = options->used[i];
17272d747510SLisandro Dalcin       break;
17282d747510SLisandro Dalcin     }
17292d747510SLisandro Dalcin   }
17302d747510SLisandro Dalcin   PetscFunctionReturn(0);
17312d747510SLisandro Dalcin }
17322d747510SLisandro Dalcin 
1733487a658cSBarry Smith /*@
17342d747510SLisandro Dalcin    PetscOptionsAllUsed - Returns a count of the number of options in the
17352d747510SLisandro Dalcin    database that have never been selected.
17362d747510SLisandro Dalcin 
17372d747510SLisandro Dalcin    Not Collective
17382d747510SLisandro Dalcin 
17392d747510SLisandro Dalcin    Input Parameter:
17402d747510SLisandro Dalcin .  options - options database, use NULL for default global database
17412d747510SLisandro Dalcin 
17422d747510SLisandro Dalcin    Output Parameter:
17432d747510SLisandro Dalcin .  N - count of options not used
17442d747510SLisandro Dalcin 
17452d747510SLisandro Dalcin    Level: advanced
17462d747510SLisandro Dalcin 
17479666a313SBarry Smith    Notes:
17489666a313SBarry Smith    The value returned may be different on each process and depends on which options have been processed
17491c9f3c13SBarry Smith    on the given process
17501c9f3c13SBarry Smith 
17512d747510SLisandro Dalcin .seealso: PetscOptionsView()
17522d747510SLisandro Dalcin @*/
17532d747510SLisandro Dalcin PetscErrorCode PetscOptionsAllUsed(PetscOptions options,PetscInt *N)
17542d747510SLisandro Dalcin {
17552d747510SLisandro Dalcin   PetscInt     i,n = 0;
17562d747510SLisandro Dalcin 
17572d747510SLisandro Dalcin   PetscFunctionBegin;
17582d747510SLisandro Dalcin   PetscValidIntPointer(N,2);
17592d747510SLisandro Dalcin   options = options ? options : defaultoptions;
17602d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
17612d747510SLisandro Dalcin     if (!options->used[i]) n++;
17622d747510SLisandro Dalcin   }
17632d747510SLisandro Dalcin   *N = n;
17642d747510SLisandro Dalcin   PetscFunctionReturn(0);
17652d747510SLisandro Dalcin }
17662d747510SLisandro Dalcin 
1767487a658cSBarry Smith /*@
17682d747510SLisandro Dalcin    PetscOptionsLeft - Prints to screen any options that were set and never used.
17692d747510SLisandro Dalcin 
17702d747510SLisandro Dalcin    Not Collective
17712d747510SLisandro Dalcin 
17722d747510SLisandro Dalcin    Input Parameter:
17732d747510SLisandro Dalcin .  options - options database; use NULL for default global database
17742d747510SLisandro Dalcin 
17752d747510SLisandro Dalcin    Options Database Key:
17763c6db4c4SPierre Jolivet .  -options_left - activates PetscOptionsAllUsed() within PetscFinalize()
17772d747510SLisandro Dalcin 
17783de2bfdfSBarry Smith    Notes:
17793de2bfdfSBarry Smith       This is rarely used directly, it is called by PetscFinalize() in debug more or if -options_left
17801c9f3c13SBarry Smith       is passed otherwise to help users determine possible mistakes in their usage of options. This
17811c9f3c13SBarry Smith       only prints values on process zero of PETSC_COMM_WORLD. Other processes depending the objects
17821c9f3c13SBarry Smith       used may have different options that are left unused.
17833de2bfdfSBarry Smith 
17842d747510SLisandro Dalcin    Level: advanced
17852d747510SLisandro Dalcin 
17862d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed()
17872d747510SLisandro Dalcin @*/
17882d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeft(PetscOptions options)
17892d747510SLisandro Dalcin {
17902d747510SLisandro Dalcin   PetscInt       i;
17913de2bfdfSBarry Smith   PetscInt       cnt = 0;
17923de2bfdfSBarry Smith   PetscOptions   toptions;
17932d747510SLisandro Dalcin 
17942d747510SLisandro Dalcin   PetscFunctionBegin;
17953de2bfdfSBarry Smith   toptions = options ? options : defaultoptions;
17963de2bfdfSBarry Smith   for (i=0; i<toptions->N; i++) {
17973de2bfdfSBarry Smith     if (!toptions->used[i]) {
17983de2bfdfSBarry Smith       if (toptions->values[i]) {
17995f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",toptions->names[i],toptions->values[i]));
18002d747510SLisandro Dalcin       } else {
18015f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s (no value)\n",toptions->names[i]));
18022d747510SLisandro Dalcin       }
18032d747510SLisandro Dalcin     }
18042d747510SLisandro Dalcin   }
18053de2bfdfSBarry Smith   if (!options) {
18063de2bfdfSBarry Smith     toptions = defaultoptions;
18073de2bfdfSBarry Smith     while (toptions->previous) {
18083de2bfdfSBarry Smith       cnt++;
18093de2bfdfSBarry Smith       toptions = toptions->previous;
18103de2bfdfSBarry Smith     }
18113de2bfdfSBarry Smith     if (cnt) {
18125f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"Option left: You may have forgotten some calls to PetscOptionsPop(),\n             PetscOptionsPop() has been called %" PetscInt_FMT " less times than PetscOptionsPush()\n",cnt));
18133de2bfdfSBarry Smith     }
18143de2bfdfSBarry Smith   }
18152d747510SLisandro Dalcin   PetscFunctionReturn(0);
18162d747510SLisandro Dalcin }
18172d747510SLisandro Dalcin 
18182d747510SLisandro Dalcin /*@C
18192d747510SLisandro Dalcin    PetscOptionsLeftGet - Returns all options that were set and never used.
18202d747510SLisandro Dalcin 
18212d747510SLisandro Dalcin    Not Collective
18222d747510SLisandro Dalcin 
18232d747510SLisandro Dalcin    Input Parameter:
18242d747510SLisandro Dalcin .  options - options database, use NULL for default global database
18252d747510SLisandro Dalcin 
1826d8d19677SJose E. Roman    Output Parameters:
1827a2b725a8SWilliam Gropp +  N - count of options not used
18282d747510SLisandro Dalcin .  names - names of options not used
1829a2b725a8SWilliam Gropp -  values - values of options not used
18302d747510SLisandro Dalcin 
18312d747510SLisandro Dalcin    Level: advanced
18322d747510SLisandro Dalcin 
18332d747510SLisandro Dalcin    Notes:
18342d747510SLisandro Dalcin    Users should call PetscOptionsLeftRestore() to free the memory allocated in this routine
18351c9f3c13SBarry Smith    Notes: The value returned may be different on each process and depends on which options have been processed
18361c9f3c13SBarry Smith    on the given process
18372d747510SLisandro Dalcin 
18382d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft()
18392d747510SLisandro Dalcin @*/
18402d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftGet(PetscOptions options,PetscInt *N,char **names[],char **values[])
18412d747510SLisandro Dalcin {
18422d747510SLisandro Dalcin   PetscInt       i,n;
18432d747510SLisandro Dalcin 
18442d747510SLisandro Dalcin   PetscFunctionBegin;
18452d747510SLisandro Dalcin   if (N) PetscValidIntPointer(N,2);
18462d747510SLisandro Dalcin   if (names) PetscValidPointer(names,3);
18472d747510SLisandro Dalcin   if (values) PetscValidPointer(values,4);
18482d747510SLisandro Dalcin   options = options ? options : defaultoptions;
18492d747510SLisandro Dalcin 
18502d747510SLisandro Dalcin   /* The number of unused PETSc options */
18512d747510SLisandro Dalcin   n = 0;
18522d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
18532d747510SLisandro Dalcin     if (!options->used[i]) n++;
18542d747510SLisandro Dalcin   }
18552d747510SLisandro Dalcin   if (N) { *N = n; }
18565f80ce2aSJacob Faibussowitsch   if (names)  CHKERRQ(PetscMalloc1(n,names));
18575f80ce2aSJacob Faibussowitsch   if (values) CHKERRQ(PetscMalloc1(n,values));
18582d747510SLisandro Dalcin 
18592d747510SLisandro Dalcin   n = 0;
18602d747510SLisandro Dalcin   if (names || values) {
18612d747510SLisandro Dalcin     for (i=0; i<options->N; i++) {
18622d747510SLisandro Dalcin       if (!options->used[i]) {
18632d747510SLisandro Dalcin         if (names)  (*names)[n]  = options->names[i];
18642d747510SLisandro Dalcin         if (values) (*values)[n] = options->values[i];
18652d747510SLisandro Dalcin         n++;
18662d747510SLisandro Dalcin       }
18672d747510SLisandro Dalcin     }
18682d747510SLisandro Dalcin   }
18692d747510SLisandro Dalcin   PetscFunctionReturn(0);
18702d747510SLisandro Dalcin }
18712d747510SLisandro Dalcin 
18722d747510SLisandro Dalcin /*@C
18732d747510SLisandro Dalcin    PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using PetscOptionsLeftGet.
18742d747510SLisandro Dalcin 
18752d747510SLisandro Dalcin    Not Collective
18762d747510SLisandro Dalcin 
1877d8d19677SJose E. Roman    Input Parameters:
1878a2b725a8SWilliam Gropp +  options - options database, use NULL for default global database
18792d747510SLisandro Dalcin .  names - names of options not used
1880a2b725a8SWilliam Gropp -  values - values of options not used
18812d747510SLisandro Dalcin 
18822d747510SLisandro Dalcin    Level: advanced
18832d747510SLisandro Dalcin 
18842d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft(), PetscOptionsLeftGet()
18852d747510SLisandro Dalcin @*/
18862d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftRestore(PetscOptions options,PetscInt *N,char **names[],char **values[])
18872d747510SLisandro Dalcin {
18882d747510SLisandro Dalcin   PetscFunctionBegin;
18892d747510SLisandro Dalcin   if (N) PetscValidIntPointer(N,2);
18902d747510SLisandro Dalcin   if (names) PetscValidPointer(names,3);
18912d747510SLisandro Dalcin   if (values) PetscValidPointer(values,4);
18922d747510SLisandro Dalcin   if (N) { *N = 0; }
18935f80ce2aSJacob Faibussowitsch   if (names)  CHKERRQ(PetscFree(*names));
18945f80ce2aSJacob Faibussowitsch   if (values) CHKERRQ(PetscFree(*values));
18952d747510SLisandro Dalcin   PetscFunctionReturn(0);
18962d747510SLisandro Dalcin }
18972d747510SLisandro Dalcin 
18982d747510SLisandro Dalcin /*@C
18999060e2f9SVaclav Hapla    PetscOptionsMonitorDefault - Print all options set value events using the supplied PetscViewer.
19002d747510SLisandro Dalcin 
19011c9f3c13SBarry Smith    Logically Collective on ctx
19022d747510SLisandro Dalcin 
19032d747510SLisandro Dalcin    Input Parameters:
19042d747510SLisandro Dalcin +  name  - option name string
19052d747510SLisandro Dalcin .  value - option value string
19069060e2f9SVaclav Hapla -  ctx - an ASCII viewer or NULL
19072d747510SLisandro Dalcin 
19082d747510SLisandro Dalcin    Level: intermediate
19092d747510SLisandro Dalcin 
19109666a313SBarry Smith    Notes:
19119060e2f9SVaclav Hapla      If ctx=NULL, PetscPrintf() is used.
19129666a313SBarry Smith      The first MPI rank in the PetscViewer viewer actually prints the values, other
19131c9f3c13SBarry Smith      processes may have different values set
19141c9f3c13SBarry Smith 
19152d747510SLisandro Dalcin .seealso: PetscOptionsMonitorSet()
19162d747510SLisandro Dalcin @*/
19172d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorDefault(const char name[],const char value[],void *ctx)
19182d747510SLisandro Dalcin {
19192d747510SLisandro Dalcin   PetscFunctionBegin;
19209060e2f9SVaclav Hapla   if (ctx) {
19219060e2f9SVaclav Hapla     PetscViewer viewer = (PetscViewer)ctx;
19222d747510SLisandro Dalcin     if (!value) {
19235f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"Removing option: %s\n",name));
19242d747510SLisandro Dalcin     } else if (!value[0]) {
19255f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"Setting option: %s (no value)\n",name));
19262d747510SLisandro Dalcin     } else {
19275f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value));
19282d747510SLisandro Dalcin     }
19299060e2f9SVaclav Hapla   } else {
19309060e2f9SVaclav Hapla     MPI_Comm comm = PETSC_COMM_WORLD;
19319060e2f9SVaclav Hapla     if (!value) {
19325f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(comm,"Removing option: %s\n",name));
19339060e2f9SVaclav Hapla     } else if (!value[0]) {
19345f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(comm,"Setting option: %s (no value)\n",name));
19359060e2f9SVaclav Hapla     } else {
19365f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(comm,"Setting option: %s = %s\n",name,value));
19379060e2f9SVaclav Hapla     }
19389060e2f9SVaclav Hapla   }
19392d747510SLisandro Dalcin   PetscFunctionReturn(0);
19402d747510SLisandro Dalcin }
19412d747510SLisandro Dalcin 
19422d747510SLisandro Dalcin /*@C
19432d747510SLisandro Dalcin    PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that
19442d747510SLisandro Dalcin    modified the PETSc options database.
19452d747510SLisandro Dalcin 
19462d747510SLisandro Dalcin    Not Collective
19472d747510SLisandro Dalcin 
19482d747510SLisandro Dalcin    Input Parameters:
19492d747510SLisandro Dalcin +  monitor - pointer to function (if this is NULL, it turns off monitoring
19502d747510SLisandro Dalcin .  mctx    - [optional] context for private data for the
19512d747510SLisandro Dalcin              monitor routine (use NULL if no context is desired)
19522d747510SLisandro Dalcin -  monitordestroy - [optional] routine that frees monitor context
19532d747510SLisandro Dalcin           (may be NULL)
19542d747510SLisandro Dalcin 
19552d747510SLisandro Dalcin    Calling Sequence of monitor:
19562d747510SLisandro Dalcin $     monitor (const char name[], const char value[], void *mctx)
19572d747510SLisandro Dalcin 
19582d747510SLisandro Dalcin +  name - option name string
19592d747510SLisandro Dalcin .  value - option value string
19602d747510SLisandro Dalcin -  mctx  - optional monitoring context, as set by PetscOptionsMonitorSet()
19612d747510SLisandro Dalcin 
19622d747510SLisandro Dalcin    Options Database Keys:
1963c5b5d8d5SVaclav Hapla    See PetscInitialize() for options related to option database monitoring.
19642d747510SLisandro Dalcin 
19652d747510SLisandro Dalcin    Notes:
19662d747510SLisandro Dalcin    The default is to do nothing.  To print the name and value of options
19672d747510SLisandro Dalcin    being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine,
19682d747510SLisandro Dalcin    with a null monitoring context.
19692d747510SLisandro Dalcin 
19702d747510SLisandro Dalcin    Several different monitoring routines may be set by calling
19712d747510SLisandro Dalcin    PetscOptionsMonitorSet() multiple times; all will be called in the
19722d747510SLisandro Dalcin    order in which they were set.
19732d747510SLisandro Dalcin 
19749060e2f9SVaclav Hapla    Level: intermediate
19752d747510SLisandro Dalcin 
1976c5b5d8d5SVaclav Hapla .seealso: PetscOptionsMonitorDefault(), PetscInitialize()
19772d747510SLisandro Dalcin @*/
19782d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void**))
19792d747510SLisandro Dalcin {
19802d747510SLisandro Dalcin   PetscOptions options = defaultoptions;
19812d747510SLisandro Dalcin 
19822d747510SLisandro Dalcin   PetscFunctionBegin;
1983c5b5d8d5SVaclav Hapla   if (options->monitorCancel) PetscFunctionReturn(0);
19842c71b3e2SJacob Faibussowitsch   PetscCheckFalse(options->numbermonitors >= MAXOPTIONSMONITORS,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set");
19852d747510SLisandro Dalcin   options->monitor[options->numbermonitors]          = monitor;
19862d747510SLisandro Dalcin   options->monitordestroy[options->numbermonitors]   = monitordestroy;
19872d747510SLisandro Dalcin   options->monitorcontext[options->numbermonitors++] = (void*)mctx;
19882d747510SLisandro Dalcin   PetscFunctionReturn(0);
19892d747510SLisandro Dalcin }
19902d747510SLisandro Dalcin 
19912d747510SLisandro Dalcin /*
19922d747510SLisandro Dalcin    PetscOptionsStringToBool - Converts string to PetscBool, handles cases like "yes", "no", "true", "false", "0", "1", "off", "on".
199363fe8743SVaclav Hapla      Empty string is considered as true.
19942d747510SLisandro Dalcin */
19952d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToBool(const char value[],PetscBool *a)
19962d747510SLisandro Dalcin {
19972d747510SLisandro Dalcin   PetscBool      istrue,isfalse;
19982d747510SLisandro Dalcin   size_t         len;
19992d747510SLisandro Dalcin 
20002d747510SLisandro Dalcin   PetscFunctionBegin;
200163fe8743SVaclav Hapla   /* PetscStrlen() returns 0 for NULL or "" */
20025f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(value,&len));
200363fe8743SVaclav Hapla   if (!len)  {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20045f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(value,"TRUE",&istrue));
20052d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(value,"YES",&istrue));
20072d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(value,"1",&istrue));
20092d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20105f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(value,"on",&istrue));
20112d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20125f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(value,"FALSE",&isfalse));
20132d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20145f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(value,"NO",&isfalse));
20152d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(value,"0",&isfalse));
20172d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(value,"off",&isfalse));
20192d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
202098921bdaSJacob Faibussowitsch   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value);
20212d747510SLisandro Dalcin }
20222d747510SLisandro Dalcin 
20232d747510SLisandro Dalcin /*
20242d747510SLisandro Dalcin    PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide"
20252d747510SLisandro Dalcin */
20262d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToInt(const char name[],PetscInt *a)
20272d747510SLisandro Dalcin {
20282d747510SLisandro Dalcin   size_t    len;
20292d747510SLisandro Dalcin   PetscBool decide,tdefault,mouse;
20302d747510SLisandro Dalcin 
20312d747510SLisandro Dalcin   PetscFunctionBegin;
20325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(name,&len));
20335f80ce2aSJacob Faibussowitsch   PetscCheck(len,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value");
20342d747510SLisandro Dalcin 
20355f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault));
20362d747510SLisandro Dalcin   if (!tdefault) {
20375f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(name,"DEFAULT",&tdefault));
20382d747510SLisandro Dalcin   }
20395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(name,"PETSC_DECIDE",&decide));
20402d747510SLisandro Dalcin   if (!decide) {
20415f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(name,"DECIDE",&decide));
20422d747510SLisandro Dalcin   }
20435f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(name,"mouse",&mouse));
20442d747510SLisandro Dalcin 
20452d747510SLisandro Dalcin   if (tdefault)    *a = PETSC_DEFAULT;
20462d747510SLisandro Dalcin   else if (decide) *a = PETSC_DECIDE;
20472d747510SLisandro Dalcin   else if (mouse)  *a = -1;
20482d747510SLisandro Dalcin   else {
20492d747510SLisandro Dalcin     char *endptr;
20502d747510SLisandro Dalcin     long strtolval;
20512d747510SLisandro Dalcin 
20522d747510SLisandro Dalcin     strtolval = strtol(name,&endptr,10);
20532c71b3e2SJacob Faibussowitsch     PetscCheckFalse((size_t) (endptr - name) != len,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no integer value (do not include . in it)",name);
20542d747510SLisandro Dalcin 
20552d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL)
20562d747510SLisandro Dalcin     (void) strtolval;
20572d747510SLisandro Dalcin     *a = atoll(name);
20582d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64)
20592d747510SLisandro Dalcin     (void) strtolval;
20602d747510SLisandro Dalcin     *a = _atoi64(name);
20612d747510SLisandro Dalcin #else
20622d747510SLisandro Dalcin     *a = (PetscInt)strtolval;
20632d747510SLisandro Dalcin #endif
20642d747510SLisandro Dalcin   }
20652d747510SLisandro Dalcin   PetscFunctionReturn(0);
20662d747510SLisandro Dalcin }
20672d747510SLisandro Dalcin 
20682d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
20692d747510SLisandro Dalcin #include <quadmath.h>
20702d747510SLisandro Dalcin #endif
20712d747510SLisandro Dalcin 
20722d747510SLisandro Dalcin static PetscErrorCode PetscStrtod(const char name[],PetscReal *a,char **endptr)
20732d747510SLisandro Dalcin {
20742d747510SLisandro Dalcin   PetscFunctionBegin;
20752d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
20762d747510SLisandro Dalcin   *a = strtoflt128(name,endptr);
20772d747510SLisandro Dalcin #else
20782d747510SLisandro Dalcin   *a = (PetscReal)strtod(name,endptr);
20792d747510SLisandro Dalcin #endif
20802d747510SLisandro Dalcin   PetscFunctionReturn(0);
20812d747510SLisandro Dalcin }
20822d747510SLisandro Dalcin 
20832d747510SLisandro Dalcin static PetscErrorCode PetscStrtoz(const char name[],PetscScalar *a,char **endptr,PetscBool *isImaginary)
20842d747510SLisandro Dalcin {
20852d747510SLisandro Dalcin   PetscBool      hasi = PETSC_FALSE;
20862d747510SLisandro Dalcin   char           *ptr;
20872d747510SLisandro Dalcin   PetscReal      strtoval;
20882d747510SLisandro Dalcin 
20892d747510SLisandro Dalcin   PetscFunctionBegin;
20905f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrtod(name,&strtoval,&ptr));
20912d747510SLisandro Dalcin   if (ptr == name) {
20922d747510SLisandro Dalcin     strtoval = 1.;
20932d747510SLisandro Dalcin     hasi = PETSC_TRUE;
20942d747510SLisandro Dalcin     if (name[0] == 'i') {
20952d747510SLisandro Dalcin       ptr++;
20962d747510SLisandro Dalcin     } else if (name[0] == '+' && name[1] == 'i') {
20972d747510SLisandro Dalcin       ptr += 2;
20982d747510SLisandro Dalcin     } else if (name[0] == '-' && name[1] == 'i') {
20992d747510SLisandro Dalcin       strtoval = -1.;
21002d747510SLisandro Dalcin       ptr += 2;
21012d747510SLisandro Dalcin     }
21022d747510SLisandro Dalcin   } else if (*ptr == 'i') {
21032d747510SLisandro Dalcin     hasi = PETSC_TRUE;
21042d747510SLisandro Dalcin     ptr++;
21052d747510SLisandro Dalcin   }
21062d747510SLisandro Dalcin   *endptr = ptr;
21072d747510SLisandro Dalcin   *isImaginary = hasi;
21082d747510SLisandro Dalcin   if (hasi) {
21092d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX)
211098921bdaSJacob Faibussowitsch     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s contains imaginary but complex not supported ",name);
21112d747510SLisandro Dalcin #else
21122d747510SLisandro Dalcin     *a = PetscCMPLX(0.,strtoval);
21132d747510SLisandro Dalcin #endif
21142d747510SLisandro Dalcin   } else {
21152d747510SLisandro Dalcin     *a = strtoval;
21162d747510SLisandro Dalcin   }
21172d747510SLisandro Dalcin   PetscFunctionReturn(0);
21182d747510SLisandro Dalcin }
21192d747510SLisandro Dalcin 
21202d747510SLisandro Dalcin /*
21212d747510SLisandro Dalcin    Converts a string to PetscReal value. Handles special cases like "default" and "decide"
21222d747510SLisandro Dalcin */
21232d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToReal(const char name[],PetscReal *a)
21242d747510SLisandro Dalcin {
21252d747510SLisandro Dalcin   size_t         len;
21262d747510SLisandro Dalcin   PetscBool      match;
21272d747510SLisandro Dalcin   char           *endptr;
21282d747510SLisandro Dalcin 
21292d747510SLisandro Dalcin   PetscFunctionBegin;
21305f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(name,&len));
2131*28b400f6SJacob Faibussowitsch   PetscCheck(len,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"String of length zero has no numerical value");
21322d747510SLisandro Dalcin 
21335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(name,"PETSC_DEFAULT",&match));
21342d747510SLisandro Dalcin   if (!match) {
21355f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(name,"DEFAULT",&match));
21362d747510SLisandro Dalcin   }
21372d747510SLisandro Dalcin   if (match) {*a = PETSC_DEFAULT; PetscFunctionReturn(0);}
21382d747510SLisandro Dalcin 
21395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcasecmp(name,"PETSC_DECIDE",&match));
21402d747510SLisandro Dalcin   if (!match) {
21415f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcasecmp(name,"DECIDE",&match));
21422d747510SLisandro Dalcin   }
21432d747510SLisandro Dalcin   if (match) {*a = PETSC_DECIDE; PetscFunctionReturn(0);}
21442d747510SLisandro Dalcin 
21455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrtod(name,a,&endptr));
21462c71b3e2SJacob Faibussowitsch   PetscCheckFalse((size_t) (endptr - name) != len,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value",name);
21472d747510SLisandro Dalcin   PetscFunctionReturn(0);
21482d747510SLisandro Dalcin }
21492d747510SLisandro Dalcin 
21502d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToScalar(const char name[],PetscScalar *a)
21512d747510SLisandro Dalcin {
21522d747510SLisandro Dalcin   PetscBool      imag1;
21532d747510SLisandro Dalcin   size_t         len;
21542d747510SLisandro Dalcin   PetscScalar    val = 0.;
21552d747510SLisandro Dalcin   char           *ptr = NULL;
21562d747510SLisandro Dalcin 
21572d747510SLisandro Dalcin   PetscFunctionBegin;
21585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(name,&len));
2159*28b400f6SJacob Faibussowitsch   PetscCheck(len,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value");
21605f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrtoz(name,&val,&ptr,&imag1));
21612d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX)
21622d747510SLisandro Dalcin   if ((size_t) (ptr - name) < len) {
21632d747510SLisandro Dalcin     PetscBool   imag2;
21642d747510SLisandro Dalcin     PetscScalar val2;
21652d747510SLisandro Dalcin 
21665f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrtoz(ptr,&val2,&ptr,&imag2));
21672c71b3e2SJacob Faibussowitsch     PetscCheckFalse(imag1 || !imag2,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s: must specify imaginary component second",name);
21682d747510SLisandro Dalcin     val = PetscCMPLX(PetscRealPart(val),PetscImaginaryPart(val2));
21692d747510SLisandro Dalcin   }
21702d747510SLisandro Dalcin #endif
21712c71b3e2SJacob Faibussowitsch   PetscCheckFalse((size_t) (ptr - name) != len,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name);
21722d747510SLisandro Dalcin   *a = val;
21732d747510SLisandro Dalcin   PetscFunctionReturn(0);
21742d747510SLisandro Dalcin }
21752d747510SLisandro Dalcin 
21762d747510SLisandro Dalcin /*@C
21772d747510SLisandro Dalcin    PetscOptionsGetBool - Gets the Logical (true or false) value for a particular
21782d747510SLisandro Dalcin             option in the database.
2179e5c89e4eSSatish Balay 
2180e5c89e4eSSatish Balay    Not Collective
2181e5c89e4eSSatish Balay 
2182e5c89e4eSSatish Balay    Input Parameters:
21835c9cc608SHong Zhang +  options - options database, use NULL for default global database
2184c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
2185e5c89e4eSSatish Balay -  name - the option one is seeking
2186e5c89e4eSSatish Balay 
2187d8d19677SJose E. Roman    Output Parameters:
21882d747510SLisandro Dalcin +  ivalue - the logical value to return
218996ef3cdfSSatish Balay -  set - PETSC_TRUE  if found, else PETSC_FALSE
2190e5c89e4eSSatish Balay 
2191e5c89e4eSSatish Balay    Level: beginner
2192e5c89e4eSSatish Balay 
219395452b02SPatrick Sanan    Notes:
21942d747510SLisandro Dalcin        TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE
21952d747510SLisandro Dalcin        FALSE, false, NO, no, and 0 all translate to PETSC_FALSE
21962d747510SLisandro Dalcin 
21972d747510SLisandro 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
21982d747510SLisandro Dalcin      is equivalent to -requested_bool true
21992d747510SLisandro Dalcin 
22002d747510SLisandro Dalcin        If the user does not supply the option at all ivalue is NOT changed. Thus
22012efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
22022efd9cb1SBarry Smith 
2203e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
22042d747510SLisandro Dalcin           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsBool(),
2205e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2206e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2207acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2208a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2209e5c89e4eSSatish Balay @*/
22102d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool *ivalue,PetscBool *set)
2211e5c89e4eSSatish Balay {
22122d747510SLisandro Dalcin   const char     *value;
2213ace3abfcSBarry Smith   PetscBool      flag;
2214e5c89e4eSSatish Balay 
2215e5c89e4eSSatish Balay   PetscFunctionBegin;
22162d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2217064a246eSJacob Faibussowitsch   if (ivalue) PetscValidBoolPointer(ivalue,4);
22185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&value,&flag));
2219e5c89e4eSSatish Balay   if (flag) {
222096ef3cdfSSatish Balay     if (set) *set = PETSC_TRUE;
22215f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsStringToBool(value, &flag));
22222d747510SLisandro Dalcin     if (ivalue) *ivalue = flag;
2223e5c89e4eSSatish Balay   } else {
222496ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2225e5c89e4eSSatish Balay   }
2226e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2227e5c89e4eSSatish Balay }
2228e5c89e4eSSatish Balay 
2229e5c89e4eSSatish Balay /*@C
2230e5c89e4eSSatish Balay    PetscOptionsGetEList - Puts a list of option values that a single one may be selected from
2231e5c89e4eSSatish Balay 
2232e5c89e4eSSatish Balay    Not Collective
2233e5c89e4eSSatish Balay 
2234e5c89e4eSSatish Balay    Input Parameters:
22355c9cc608SHong Zhang +  options - options database, use NULL for default global database
2236c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
2237e5c89e4eSSatish Balay .  opt - option name
2238a264d7a6SBarry Smith .  list - the possible choices (one of these must be selected, anything else is invalid)
2239a2b725a8SWilliam Gropp -  ntext - number of choices
2240e5c89e4eSSatish Balay 
2241d8d19677SJose E. Roman    Output Parameters:
22422efd9cb1SBarry Smith +  value - the index of the value to return (defaults to zero if the option name is given but no choice is listed)
2243e5c89e4eSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2244e5c89e4eSSatish Balay 
2245e5c89e4eSSatish Balay    Level: intermediate
2246e5c89e4eSSatish Balay 
224795452b02SPatrick Sanan    Notes:
224895452b02SPatrick Sanan     If the user does not supply the option value is NOT changed. Thus
22492efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
22502efd9cb1SBarry Smith 
2251a264d7a6SBarry Smith    See PetscOptionsFList() for when the choices are given in a PetscFunctionList()
2252e5c89e4eSSatish Balay 
2253e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
2254acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2255e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2256e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2257acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2258a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2259e5c89e4eSSatish Balay @*/
2260c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscInt ntext,PetscInt *value,PetscBool *set)
2261e5c89e4eSSatish Balay {
226258b0ac4eSStefano Zampini   size_t         alen,len = 0, tlen = 0;
2263e5c89e4eSSatish Balay   char           *svalue;
2264ace3abfcSBarry Smith   PetscBool      aset,flg = PETSC_FALSE;
2265e5c89e4eSSatish Balay   PetscInt       i;
2266e5c89e4eSSatish Balay 
2267e5c89e4eSSatish Balay   PetscFunctionBegin;
22682d747510SLisandro Dalcin   PetscValidCharPointer(opt,3);
2269e5c89e4eSSatish Balay   for (i=0; i<ntext; i++) {
22705f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrlen(list[i],&alen));
2271e5c89e4eSSatish Balay     if (alen > len) len = alen;
227258b0ac4eSStefano Zampini     tlen += len + 1;
2273e5c89e4eSSatish Balay   }
2274e5c89e4eSSatish Balay   len += 5; /* a little extra space for user mistypes */
22755f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(len,&svalue));
22765f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetString(options,pre,opt,svalue,len,&aset));
2277e5c89e4eSSatish Balay   if (aset) {
22785f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscEListFind(ntext,list,svalue,value,&flg));
227958b0ac4eSStefano Zampini     if (!flg) {
228058b0ac4eSStefano Zampini       char *avail,*pavl;
228158b0ac4eSStefano Zampini 
22825f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(tlen,&avail));
228358b0ac4eSStefano Zampini       pavl = avail;
228458b0ac4eSStefano Zampini       for (i=0; i<ntext; i++) {
22855f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrlen(list[i],&alen));
22865f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrcpy(pavl,list[i]));
228758b0ac4eSStefano Zampini         pavl += alen;
22885f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrcpy(pavl," "));
228958b0ac4eSStefano Zampini         pavl += 1;
229058b0ac4eSStefano Zampini       }
22915f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrtolower(avail));
229298921bdaSJacob Faibussowitsch       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown option %s for -%s%s. Available options: %s",svalue,pre ? pre : "",opt+1,avail);
229358b0ac4eSStefano Zampini     }
2294fbedd5e0SJed Brown     if (set) *set = PETSC_TRUE;
2295a297a907SKarl Rupp   } else if (set) *set = PETSC_FALSE;
22965f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(svalue));
2297e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2298e5c89e4eSSatish Balay }
2299e5c89e4eSSatish Balay 
2300e5c89e4eSSatish Balay /*@C
2301e5c89e4eSSatish Balay    PetscOptionsGetEnum - Gets the enum value for a particular option in the database.
2302e5c89e4eSSatish Balay 
2303e5c89e4eSSatish Balay    Not Collective
2304e5c89e4eSSatish Balay 
2305e5c89e4eSSatish Balay    Input Parameters:
23065c9cc608SHong Zhang +  options - options database, use NULL for default global database
2307c5929fdfSBarry Smith .  pre - option prefix or NULL
2308e5c89e4eSSatish Balay .  opt - option name
23096b867d5aSJose E. Roman -  list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
2310e5c89e4eSSatish Balay 
2311d8d19677SJose E. Roman    Output Parameters:
2312e5c89e4eSSatish Balay +  value - the  value to return
231396ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2314e5c89e4eSSatish Balay 
2315e5c89e4eSSatish Balay    Level: beginner
2316e5c89e4eSSatish Balay 
231795452b02SPatrick Sanan    Notes:
231895452b02SPatrick Sanan     If the user does not supply the option value is NOT changed. Thus
23192efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2320e5c89e4eSSatish Balay 
23212efd9cb1SBarry Smith           List is usually something like PCASMTypes or some other predefined list of enum names
2322e5c89e4eSSatish Balay 
2323e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
2324acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
2325acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
2326e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2327e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2328acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2329a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum()
2330e5c89e4eSSatish Balay @*/
2331c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscEnum *value,PetscBool *set)
2332e5c89e4eSSatish Balay {
233369a24498SJed Brown   PetscInt       ntext = 0,tval;
2334ace3abfcSBarry Smith   PetscBool      fset;
2335e5c89e4eSSatish Balay 
2336e5c89e4eSSatish Balay   PetscFunctionBegin;
23372d747510SLisandro Dalcin   PetscValidCharPointer(opt,3);
2338e5c89e4eSSatish Balay   while (list[ntext++]) {
23392c71b3e2SJacob Faibussowitsch     PetscCheckFalse(ntext > 50,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries");
2340e5c89e4eSSatish Balay   }
23412c71b3e2SJacob Faibussowitsch   PetscCheckFalse(ntext < 3,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix");
2342e5c89e4eSSatish Balay   ntext -= 3;
23435f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetEList(options,pre,opt,list,ntext,&tval,&fset));
234469a24498SJed Brown   /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */
2345809ceb46SBarry Smith   if (fset) *value = (PetscEnum)tval;
2346809ceb46SBarry Smith   if (set) *set = fset;
2347e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2348e5c89e4eSSatish Balay }
2349e5c89e4eSSatish Balay 
2350e5c89e4eSSatish Balay /*@C
23512d747510SLisandro Dalcin    PetscOptionsGetInt - Gets the integer value for a particular option in the database.
2352e5c89e4eSSatish Balay 
2353e5c89e4eSSatish Balay    Not Collective
2354e5c89e4eSSatish Balay 
2355e5c89e4eSSatish Balay    Input Parameters:
23565c9cc608SHong Zhang +  options - options database, use NULL for default global database
2357c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
2358e5c89e4eSSatish Balay -  name - the option one is seeking
2359e5c89e4eSSatish Balay 
2360d8d19677SJose E. Roman    Output Parameters:
23612d747510SLisandro Dalcin +  ivalue - the integer value to return
236296ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2363e5c89e4eSSatish Balay 
2364e5c89e4eSSatish Balay    Level: beginner
2365e5c89e4eSSatish Balay 
2366e5c89e4eSSatish Balay    Notes:
23672d747510SLisandro Dalcin    If the user does not supply the option ivalue is NOT changed. Thus
23682efd9cb1SBarry Smith    you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
23695c07ccb8SBarry Smith 
2370e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
23712d747510SLisandro Dalcin           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
23722d747510SLisandro Dalcin           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
2373e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2374e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2375acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2376a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2377e5c89e4eSSatish Balay @*/
23782d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetInt(PetscOptions options,const char pre[],const char name[],PetscInt *ivalue,PetscBool *set)
2379e5c89e4eSSatish Balay {
23802d747510SLisandro Dalcin   const char     *value;
23812d747510SLisandro Dalcin   PetscBool      flag;
2382e5c89e4eSSatish Balay 
2383e5c89e4eSSatish Balay   PetscFunctionBegin;
23842d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
23852d747510SLisandro Dalcin   PetscValidIntPointer(ivalue,4);
23865f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&value,&flag));
2387e5c89e4eSSatish Balay   if (flag) {
238834a9cc2cSBarry Smith     if (!value) {
23892d747510SLisandro Dalcin       if (set) *set = PETSC_FALSE;
239034a9cc2cSBarry Smith     } else {
23912d747510SLisandro Dalcin       if (set) *set = PETSC_TRUE;
23925f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsStringToInt(value,ivalue));
2393e5c89e4eSSatish Balay     }
2394e5c89e4eSSatish Balay   } else {
239596ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2396e5c89e4eSSatish Balay   }
2397e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2398e5c89e4eSSatish Balay }
2399e5c89e4eSSatish Balay 
2400e2446a98SMatthew Knepley /*@C
2401e5c89e4eSSatish Balay    PetscOptionsGetReal - Gets the double precision value for a particular
2402e5c89e4eSSatish Balay    option in the database.
2403e5c89e4eSSatish Balay 
2404e5c89e4eSSatish Balay    Not Collective
2405e5c89e4eSSatish Balay 
2406e5c89e4eSSatish Balay    Input Parameters:
24075c9cc608SHong Zhang +  options - options database, use NULL for default global database
2408c5929fdfSBarry Smith .  pre - string to prepend to each name or NULL
2409e5c89e4eSSatish Balay -  name - the option one is seeking
2410e5c89e4eSSatish Balay 
2411d8d19677SJose E. Roman    Output Parameters:
2412e5c89e4eSSatish Balay +  dvalue - the double value to return
241396ef3cdfSSatish Balay -  set - PETSC_TRUE if found, PETSC_FALSE if not found
2414e5c89e4eSSatish Balay 
241595452b02SPatrick Sanan    Notes:
241695452b02SPatrick Sanan     If the user does not supply the option dvalue is NOT changed. Thus
24172efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2418e4974155SBarry Smith 
2419e5c89e4eSSatish Balay    Level: beginner
2420e5c89e4eSSatish Balay 
2421e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2422acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(),
2423e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2424e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2425acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2426a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2427e5c89e4eSSatish Balay @*/
2428c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal *dvalue,PetscBool *set)
2429e5c89e4eSSatish Balay {
24302d747510SLisandro Dalcin   const char     *value;
2431ace3abfcSBarry Smith   PetscBool      flag;
2432e5c89e4eSSatish Balay 
2433e5c89e4eSSatish Balay   PetscFunctionBegin;
24342d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
24352d747510SLisandro Dalcin   PetscValidRealPointer(dvalue,4);
24365f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&value,&flag));
2437e5c89e4eSSatish Balay   if (flag) {
2438a297a907SKarl Rupp     if (!value) {
2439a297a907SKarl Rupp       if (set) *set = PETSC_FALSE;
2440a297a907SKarl Rupp     } else {
2441a297a907SKarl Rupp       if (set) *set = PETSC_TRUE;
24425f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsStringToReal(value,dvalue));
2443a297a907SKarl Rupp     }
2444e5c89e4eSSatish Balay   } else {
244596ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2446e5c89e4eSSatish Balay   }
2447e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2448e5c89e4eSSatish Balay }
2449e5c89e4eSSatish Balay 
2450e5c89e4eSSatish Balay /*@C
2451e5c89e4eSSatish Balay    PetscOptionsGetScalar - Gets the scalar value for a particular
2452e5c89e4eSSatish Balay    option in the database.
2453e5c89e4eSSatish Balay 
2454e5c89e4eSSatish Balay    Not Collective
2455e5c89e4eSSatish Balay 
2456e5c89e4eSSatish Balay    Input Parameters:
24575c9cc608SHong Zhang +  options - options database, use NULL for default global database
2458c5929fdfSBarry Smith .  pre - string to prepend to each name or NULL
2459e5c89e4eSSatish Balay -  name - the option one is seeking
2460e5c89e4eSSatish Balay 
2461d8d19677SJose E. Roman    Output Parameters:
2462e5c89e4eSSatish Balay +  dvalue - the double value to return
246396ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2464e5c89e4eSSatish Balay 
2465e5c89e4eSSatish Balay    Level: beginner
2466e5c89e4eSSatish Balay 
2467e5c89e4eSSatish Balay    Usage:
2468eb4ae41dSBarry Smith    A complex number 2+3i must be specified with NO spaces
2469e5c89e4eSSatish Balay 
247095452b02SPatrick Sanan    Notes:
247195452b02SPatrick Sanan     If the user does not supply the option dvalue is NOT changed. Thus
24722efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2473e4974155SBarry Smith 
2474e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2475acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2476e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2477e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2478acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2479a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2480e5c89e4eSSatish Balay @*/
2481c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar *dvalue,PetscBool *set)
2482e5c89e4eSSatish Balay {
24832d747510SLisandro Dalcin   const char     *value;
2484ace3abfcSBarry Smith   PetscBool      flag;
2485e5c89e4eSSatish Balay 
2486e5c89e4eSSatish Balay   PetscFunctionBegin;
24872d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
24882d747510SLisandro Dalcin   PetscValidScalarPointer(dvalue,4);
24895f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&value,&flag));
2490e5c89e4eSSatish Balay   if (flag) {
2491e5c89e4eSSatish Balay     if (!value) {
249296ef3cdfSSatish Balay       if (set) *set = PETSC_FALSE;
2493e5c89e4eSSatish Balay     } else {
2494e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX)
24955f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsStringToReal(value,dvalue));
2496e5c89e4eSSatish Balay #else
24975f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsStringToScalar(value,dvalue));
2498e5c89e4eSSatish Balay #endif
249996ef3cdfSSatish Balay       if (set) *set = PETSC_TRUE;
2500e5c89e4eSSatish Balay     }
2501e5c89e4eSSatish Balay   } else { /* flag */
250296ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2503e5c89e4eSSatish Balay   }
2504e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2505e5c89e4eSSatish Balay }
2506e5c89e4eSSatish Balay 
2507e5c89e4eSSatish Balay /*@C
2508e5c89e4eSSatish Balay    PetscOptionsGetString - Gets the string value for a particular option in
2509e5c89e4eSSatish Balay    the database.
2510e5c89e4eSSatish Balay 
2511e5c89e4eSSatish Balay    Not Collective
2512e5c89e4eSSatish Balay 
2513e5c89e4eSSatish Balay    Input Parameters:
25145c9cc608SHong Zhang +  options - options database, use NULL for default global database
2515c5929fdfSBarry Smith .  pre - string to prepend to name or NULL
2516e5c89e4eSSatish Balay .  name - the option one is seeking
2517bcbf2dc5SJed Brown -  len - maximum length of the string including null termination
2518e5c89e4eSSatish Balay 
2519e5c89e4eSSatish Balay    Output Parameters:
2520e5c89e4eSSatish Balay +  string - location to copy string
252196ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2522e5c89e4eSSatish Balay 
2523e5c89e4eSSatish Balay    Level: beginner
2524e5c89e4eSSatish Balay 
2525e5c89e4eSSatish Balay    Fortran Note:
2526e5c89e4eSSatish Balay    The Fortran interface is slightly different from the C/C++
2527e5c89e4eSSatish Balay    interface (len is not used).  Sample usage in Fortran follows
2528e5c89e4eSSatish Balay .vb
2529e5c89e4eSSatish Balay       character *20    string
253093e6ba5cSBarry Smith       PetscErrorCode   ierr
253193e6ba5cSBarry Smith       PetscBool        set
25321b266c99SBarry Smith       call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr)
2533e5c89e4eSSatish Balay .ve
2534e5c89e4eSSatish Balay 
253595452b02SPatrick Sanan    Notes:
253695452b02SPatrick 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
2537e4974155SBarry Smith 
25382efd9cb1SBarry Smith            If the user does not use the option then the string is not changed. Thus
25392efd9cb1SBarry Smith            you should ALWAYS initialize the string if you access it without first checking if the set flag is true.
25402efd9cb1SBarry Smith 
2541f3dea69dSBarry Smith     Note:
2542f3dea69dSBarry 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).
2543f3dea69dSBarry Smith 
2544e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
2545acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2546e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2547e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2548acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2549a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2550e5c89e4eSSatish Balay @*/
2551c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool *set)
2552e5c89e4eSSatish Balay {
25532d747510SLisandro Dalcin   const char     *value;
2554ace3abfcSBarry Smith   PetscBool      flag;
2555e5c89e4eSSatish Balay 
2556e5c89e4eSSatish Balay   PetscFunctionBegin;
25572d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
25582d747510SLisandro Dalcin   PetscValidCharPointer(string,4);
25595f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&value,&flag));
2560e5c89e4eSSatish Balay   if (!flag) {
256196ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2562e5c89e4eSSatish Balay   } else {
256396ef3cdfSSatish Balay     if (set) *set = PETSC_TRUE;
2564e5c89e4eSSatish Balay     if (value) {
25655f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrncpy(string,value,len));
2566e5c89e4eSSatish Balay     } else {
25675f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscArrayzero(string,len));
2568e5c89e4eSSatish Balay     }
2569e5c89e4eSSatish Balay   }
2570e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2571e5c89e4eSSatish Balay }
2572e5c89e4eSSatish Balay 
2573c5929fdfSBarry Smith char *PetscOptionsGetStringMatlab(PetscOptions options,const char pre[],const char name[])
257414ce751eSBarry Smith {
25752d747510SLisandro Dalcin   const char     *value;
257614ce751eSBarry Smith   PetscBool      flag;
25772d747510SLisandro Dalcin   PetscErrorCode ierr;
257814ce751eSBarry Smith 
257914ce751eSBarry Smith   PetscFunctionBegin;
258002c9f0b5SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);if (ierr) PetscFunctionReturn(NULL);
25812d747510SLisandro Dalcin   if (flag) PetscFunctionReturn((char*)value);
258202c9f0b5SLisandro Dalcin   else PetscFunctionReturn(NULL);
258314ce751eSBarry Smith }
258414ce751eSBarry Smith 
25852d747510SLisandro Dalcin /*@C
25862d747510SLisandro Dalcin   PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular
2587f1a722f8SMatthew G. Knepley   option in the database.  The values must be separated with commas with no intervening spaces.
25882d747510SLisandro Dalcin 
25892d747510SLisandro Dalcin   Not Collective
25902d747510SLisandro Dalcin 
25912d747510SLisandro Dalcin   Input Parameters:
25922d747510SLisandro Dalcin + options - options database, use NULL for default global database
25932d747510SLisandro Dalcin . pre - string to prepend to each name or NULL
25946b867d5aSJose E. Roman - name - the option one is seeking
25956b867d5aSJose E. Roman 
2596d8d19677SJose E. Roman   Output Parameters:
25972d747510SLisandro Dalcin + dvalue - the integer values to return
2598f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved
25992d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE
26002d747510SLisandro Dalcin 
26012d747510SLisandro Dalcin   Level: beginner
26022d747510SLisandro Dalcin 
26032d747510SLisandro Dalcin   Notes:
2604f1a722f8SMatthew G. Knepley   TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE. FALSE, false, NO, no, and 0 all translate to PETSC_FALSE
26052d747510SLisandro Dalcin 
26062d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
26072d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(),
26082d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
26092d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
26102d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
26112d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
26122d747510SLisandro Dalcin @*/
26132d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt *nmax,PetscBool *set)
26142d747510SLisandro Dalcin {
26152d747510SLisandro Dalcin   const char     *svalue;
26162d747510SLisandro Dalcin   char           *value;
26172d747510SLisandro Dalcin   PetscInt       n = 0;
26182d747510SLisandro Dalcin   PetscBool      flag;
26192d747510SLisandro Dalcin   PetscToken     token;
26202d747510SLisandro Dalcin 
26212d747510SLisandro Dalcin   PetscFunctionBegin;
26222d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2623064a246eSJacob Faibussowitsch   PetscValidBoolPointer(dvalue,4);
26242d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
26252d747510SLisandro Dalcin 
26265f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&svalue,&flag));
26272d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
26282d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
26295f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenCreate(svalue,',',&token));
26305f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenFind(token,&value));
26312d747510SLisandro Dalcin   while (value && n < *nmax) {
26325f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsStringToBool(value,dvalue));
26335f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscTokenFind(token,&value));
26342d747510SLisandro Dalcin     dvalue++;
26352d747510SLisandro Dalcin     n++;
26362d747510SLisandro Dalcin   }
26375f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenDestroy(&token));
26382d747510SLisandro Dalcin   *nmax = n;
26392d747510SLisandro Dalcin   PetscFunctionReturn(0);
26402d747510SLisandro Dalcin }
26412d747510SLisandro Dalcin 
26422d747510SLisandro Dalcin /*@C
26432d747510SLisandro Dalcin   PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database.
26442d747510SLisandro Dalcin 
26452d747510SLisandro Dalcin   Not Collective
26462d747510SLisandro Dalcin 
26472d747510SLisandro Dalcin   Input Parameters:
26482d747510SLisandro Dalcin + options - options database, use NULL for default global database
26492d747510SLisandro Dalcin . pre - option prefix or NULL
26502d747510SLisandro Dalcin . name - option name
26516b867d5aSJose E. Roman - list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
26526b867d5aSJose E. Roman 
26532d747510SLisandro Dalcin   Output Parameters:
26542d747510SLisandro Dalcin + ivalue - the  enum values to return
2655f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved
26562d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE
26572d747510SLisandro Dalcin 
26582d747510SLisandro Dalcin   Level: beginner
26592d747510SLisandro Dalcin 
26602d747510SLisandro Dalcin   Notes:
26612d747510SLisandro Dalcin   The array must be passed as a comma separated list.
26622d747510SLisandro Dalcin 
26632d747510SLisandro Dalcin   There must be no intervening spaces between the values.
26642d747510SLisandro Dalcin 
26652d747510SLisandro Dalcin   list is usually something like PCASMTypes or some other predefined list of enum names.
26662d747510SLisandro Dalcin 
26672d747510SLisandro Dalcin .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
26682d747510SLisandro Dalcin           PetscOptionsGetEnum(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
26692d747510SLisandro Dalcin           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), PetscOptionsName(),
26702d747510SLisandro Dalcin           PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), PetscOptionsStringArray(),PetscOptionsRealArray(),
26712d747510SLisandro Dalcin           PetscOptionsScalar(), PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
26722d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum()
26732d747510SLisandro Dalcin @*/
26742d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char *const *list,PetscEnum ivalue[],PetscInt *nmax,PetscBool *set)
26752d747510SLisandro Dalcin {
26762d747510SLisandro Dalcin   const char     *svalue;
26772d747510SLisandro Dalcin   char           *value;
26782d747510SLisandro Dalcin   PetscInt       n = 0;
26792d747510SLisandro Dalcin   PetscEnum      evalue;
26802d747510SLisandro Dalcin   PetscBool      flag;
26812d747510SLisandro Dalcin   PetscToken     token;
26822d747510SLisandro Dalcin 
26832d747510SLisandro Dalcin   PetscFunctionBegin;
26842d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
26852d747510SLisandro Dalcin   PetscValidPointer(list,4);
26862d747510SLisandro Dalcin   PetscValidPointer(ivalue,5);
26872d747510SLisandro Dalcin   PetscValidIntPointer(nmax,6);
26882d747510SLisandro Dalcin 
26895f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&svalue,&flag));
26902d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
26912d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
26925f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenCreate(svalue,',',&token));
26935f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenFind(token,&value));
26942d747510SLisandro Dalcin   while (value && n < *nmax) {
26955f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscEnumFind(list,value,&evalue,&flag));
2696*28b400f6SJacob Faibussowitsch     PetscCheck(flag,PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown enum value '%s' for -%s%s",svalue,pre ? pre : "",name+1);
26972d747510SLisandro Dalcin     ivalue[n++] = evalue;
26985f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscTokenFind(token,&value));
26992d747510SLisandro Dalcin   }
27005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenDestroy(&token));
27012d747510SLisandro Dalcin   *nmax = n;
27022d747510SLisandro Dalcin   PetscFunctionReturn(0);
27032d747510SLisandro Dalcin }
27042d747510SLisandro Dalcin 
27052d747510SLisandro Dalcin /*@C
2706f1a722f8SMatthew G. Knepley   PetscOptionsGetIntArray - Gets an array of integer values for a particular option in the database.
27072d747510SLisandro Dalcin 
27082d747510SLisandro Dalcin   Not Collective
27092d747510SLisandro Dalcin 
27102d747510SLisandro Dalcin   Input Parameters:
27112d747510SLisandro Dalcin + options - options database, use NULL for default global database
27122d747510SLisandro Dalcin . pre - string to prepend to each name or NULL
27136b867d5aSJose E. Roman - name - the option one is seeking
27146b867d5aSJose E. Roman 
2715d8d19677SJose E. Roman   Output Parameters:
27162d747510SLisandro Dalcin + ivalue - the integer values to return
2717f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved
27182d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE
27192d747510SLisandro Dalcin 
27202d747510SLisandro Dalcin   Level: beginner
27212d747510SLisandro Dalcin 
27222d747510SLisandro Dalcin   Notes:
27232d747510SLisandro Dalcin   The array can be passed as
2724f1a722f8SMatthew G. Knepley .vb
27252d747510SLisandro Dalcin   a comma separated list:                                 0,1,2,3,4,5,6,7
27262d747510SLisandro Dalcin   a range (start-end+1):                                  0-8
27272d747510SLisandro Dalcin   a range with given increment (start-end+1:inc):         0-7:2
27282d747510SLisandro Dalcin   a combination of values and ranges separated by commas: 0,1-8,8-15:2
2729f1a722f8SMatthew G. Knepley .ve
27302d747510SLisandro Dalcin 
27312d747510SLisandro Dalcin   There must be no intervening spaces between the values.
27322d747510SLisandro Dalcin 
27332d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
27342d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(),
27352d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
27362d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
27372d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
27382d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
27392d747510SLisandro Dalcin @*/
27402d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt *nmax,PetscBool *set)
27412d747510SLisandro Dalcin {
27422d747510SLisandro Dalcin   const char     *svalue;
27432d747510SLisandro Dalcin   char           *value;
27442d747510SLisandro Dalcin   PetscInt       n = 0,i,j,start,end,inc,nvalues;
27452d747510SLisandro Dalcin   size_t         len;
27462d747510SLisandro Dalcin   PetscBool      flag,foundrange;
27472d747510SLisandro Dalcin   PetscToken     token;
27482d747510SLisandro Dalcin 
27492d747510SLisandro Dalcin   PetscFunctionBegin;
27502d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
27512d747510SLisandro Dalcin   PetscValidIntPointer(ivalue,4);
27522d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
27532d747510SLisandro Dalcin 
27545f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&svalue,&flag));
27552d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
27562d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
27575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenCreate(svalue,',',&token));
27585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenFind(token,&value));
27592d747510SLisandro Dalcin   while (value && n < *nmax) {
27602d747510SLisandro Dalcin     /* look for form  d-D where d and D are integers */
27612d747510SLisandro Dalcin     foundrange = PETSC_FALSE;
27625f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrlen(value,&len));
27632d747510SLisandro Dalcin     if (value[0] == '-') i=2;
27642d747510SLisandro Dalcin     else i=1;
27652d747510SLisandro Dalcin     for (;i<(int)len; i++) {
27662d747510SLisandro Dalcin       if (value[i] == '-') {
27672c71b3e2SJacob Faibussowitsch         PetscCheckFalse(i == (int)len-1,PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %" PetscInt_FMT "-th array entry %s",n,value);
27682d747510SLisandro Dalcin         value[i] = 0;
27692d747510SLisandro Dalcin 
27705f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscOptionsStringToInt(value,&start));
27712d747510SLisandro Dalcin         inc  = 1;
27722d747510SLisandro Dalcin         j    = i+1;
27732d747510SLisandro Dalcin         for (;j<(int)len; j++) {
27742d747510SLisandro Dalcin           if (value[j] == ':') {
27752d747510SLisandro Dalcin             value[j] = 0;
27762d747510SLisandro Dalcin 
27775f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscOptionsStringToInt(value+j+1,&inc));
27782c71b3e2SJacob Faibussowitsch             PetscCheckFalse(inc <= 0,PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %" PetscInt_FMT "-th array entry,%s cannot have negative increment",n,value+j+1);
27792d747510SLisandro Dalcin             break;
27802d747510SLisandro Dalcin           }
27812d747510SLisandro Dalcin         }
27825f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscOptionsStringToInt(value+i+1,&end));
27832c71b3e2SJacob Faibussowitsch         PetscCheckFalse(end <= start,PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %" PetscInt_FMT "-th array entry, %s-%s cannot have decreasing list",n,value,value+i+1);
27842d747510SLisandro Dalcin         nvalues = (end-start)/inc + (end-start)%inc;
27852c71b3e2SJacob Faibussowitsch         PetscCheckFalse(n + nvalues  > *nmax,PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %" PetscInt_FMT "-th array entry, not enough space left in array (%" PetscInt_FMT ") to contain entire range from %" PetscInt_FMT " to %" PetscInt_FMT,n,*nmax-n,start,end);
27862d747510SLisandro Dalcin         for (;start<end; start+=inc) {
27872d747510SLisandro Dalcin           *ivalue = start; ivalue++;n++;
27882d747510SLisandro Dalcin         }
27892d747510SLisandro Dalcin         foundrange = PETSC_TRUE;
27902d747510SLisandro Dalcin         break;
27912d747510SLisandro Dalcin       }
27922d747510SLisandro Dalcin     }
27932d747510SLisandro Dalcin     if (!foundrange) {
27945f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsStringToInt(value,ivalue));
27952d747510SLisandro Dalcin       ivalue++;
27962d747510SLisandro Dalcin       n++;
27972d747510SLisandro Dalcin     }
27985f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscTokenFind(token,&value));
27992d747510SLisandro Dalcin   }
28005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenDestroy(&token));
28012d747510SLisandro Dalcin   *nmax = n;
28022d747510SLisandro Dalcin   PetscFunctionReturn(0);
28032d747510SLisandro Dalcin }
28042d747510SLisandro Dalcin 
28052d747510SLisandro Dalcin /*@C
28062d747510SLisandro Dalcin   PetscOptionsGetRealArray - Gets an array of double precision values for a
2807f1a722f8SMatthew G. Knepley   particular option in the database.  The values must be separated with commas with no intervening spaces.
28082d747510SLisandro Dalcin 
28092d747510SLisandro Dalcin   Not Collective
28102d747510SLisandro Dalcin 
28112d747510SLisandro Dalcin   Input Parameters:
28122d747510SLisandro Dalcin + options - options database, use NULL for default global database
28132d747510SLisandro Dalcin . pre - string to prepend to each name or NULL
28146b867d5aSJose E. Roman - name - the option one is seeking
28156b867d5aSJose E. Roman 
28162d747510SLisandro Dalcin   Output Parameters:
28172d747510SLisandro Dalcin + dvalue - the double values to return
2818f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved
28192d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE
28202d747510SLisandro Dalcin 
28212d747510SLisandro Dalcin   Level: beginner
28222d747510SLisandro Dalcin 
28232d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
28242d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
28252d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
28262d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
28272d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
28282d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
28292d747510SLisandro Dalcin @*/
28302d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscBool *set)
28312d747510SLisandro Dalcin {
28322d747510SLisandro Dalcin   const char     *svalue;
28332d747510SLisandro Dalcin   char           *value;
28342d747510SLisandro Dalcin   PetscInt       n = 0;
28352d747510SLisandro Dalcin   PetscBool      flag;
28362d747510SLisandro Dalcin   PetscToken     token;
28372d747510SLisandro Dalcin 
28382d747510SLisandro Dalcin   PetscFunctionBegin;
28392d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
28402d747510SLisandro Dalcin   PetscValidRealPointer(dvalue,4);
28412d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
28422d747510SLisandro Dalcin 
28435f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&svalue,&flag));
28442d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
28452d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
28465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenCreate(svalue,',',&token));
28475f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenFind(token,&value));
28482d747510SLisandro Dalcin   while (value && n < *nmax) {
28495f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsStringToReal(value,dvalue++));
28505f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscTokenFind(token,&value));
28512d747510SLisandro Dalcin     n++;
28522d747510SLisandro Dalcin   }
28535f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenDestroy(&token));
28542d747510SLisandro Dalcin   *nmax = n;
28552d747510SLisandro Dalcin   PetscFunctionReturn(0);
28562d747510SLisandro Dalcin }
28572d747510SLisandro Dalcin 
28582d747510SLisandro Dalcin /*@C
28592d747510SLisandro Dalcin   PetscOptionsGetScalarArray - Gets an array of scalars for a
2860f1a722f8SMatthew G. Knepley   particular option in the database.  The values must be separated with commas with no intervening spaces.
28612d747510SLisandro Dalcin 
28622d747510SLisandro Dalcin   Not Collective
28632d747510SLisandro Dalcin 
28642d747510SLisandro Dalcin   Input Parameters:
28652d747510SLisandro Dalcin + options - options database, use NULL for default global database
28662d747510SLisandro Dalcin . pre - string to prepend to each name or NULL
28676b867d5aSJose E. Roman - name - the option one is seeking
28686b867d5aSJose E. Roman 
28692d747510SLisandro Dalcin   Output Parameters:
28702d747510SLisandro Dalcin + dvalue - the scalar values to return
2871f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved
28722d747510SLisandro Dalcin - set - PETSC_TRUE if found, else PETSC_FALSE
28732d747510SLisandro Dalcin 
28742d747510SLisandro Dalcin   Level: beginner
28752d747510SLisandro Dalcin 
28762d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
28772d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
28782d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
28792d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
28802d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
28812d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
28822d747510SLisandro Dalcin @*/
28832d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt *nmax,PetscBool *set)
28842d747510SLisandro Dalcin {
28852d747510SLisandro Dalcin   const char     *svalue;
28862d747510SLisandro Dalcin   char           *value;
28872d747510SLisandro Dalcin   PetscInt       n = 0;
28882d747510SLisandro Dalcin   PetscBool      flag;
28892d747510SLisandro Dalcin   PetscToken     token;
28902d747510SLisandro Dalcin 
28912d747510SLisandro Dalcin   PetscFunctionBegin;
28922d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2893064a246eSJacob Faibussowitsch   PetscValidScalarPointer(dvalue,4);
28942d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
28952d747510SLisandro Dalcin 
28965f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&svalue,&flag));
28972d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
28982d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
28995f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenCreate(svalue,',',&token));
29005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenFind(token,&value));
29012d747510SLisandro Dalcin   while (value && n < *nmax) {
29025f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsStringToScalar(value,dvalue++));
29035f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscTokenFind(token,&value));
29042d747510SLisandro Dalcin     n++;
29052d747510SLisandro Dalcin   }
29065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenDestroy(&token));
29072d747510SLisandro Dalcin   *nmax = n;
29082d747510SLisandro Dalcin   PetscFunctionReturn(0);
29092d747510SLisandro Dalcin }
291014ce751eSBarry Smith 
2911e5c89e4eSSatish Balay /*@C
2912e5c89e4eSSatish Balay   PetscOptionsGetStringArray - Gets an array of string values for a particular
2913f1a722f8SMatthew G. Knepley   option in the database. The values must be separated with commas with no intervening spaces.
2914e5c89e4eSSatish Balay 
2915e5c89e4eSSatish Balay   Not Collective
2916e5c89e4eSSatish Balay 
2917e5c89e4eSSatish Balay   Input Parameters:
29185c9cc608SHong Zhang + options - options database, use NULL for default global database
2919c5929fdfSBarry Smith . pre - string to prepend to name or NULL
29206b867d5aSJose E. Roman - name - the option one is seeking
29216b867d5aSJose E. Roman 
2922e7b76fa7SPatrick Sanan   Output Parameters:
2923e5c89e4eSSatish Balay + strings - location to copy strings
2924f1a722f8SMatthew G. Knepley . nmax - On input maximum number of strings, on output the actual number of strings found
292596ef3cdfSSatish Balay - set - PETSC_TRUE if found, else PETSC_FALSE
2926e5c89e4eSSatish Balay 
2927e5c89e4eSSatish Balay   Level: beginner
2928e5c89e4eSSatish Balay 
2929e5c89e4eSSatish Balay   Notes:
2930e7b76fa7SPatrick Sanan   The nmax parameter is used for both input and output.
2931e7b76fa7SPatrick Sanan 
2932e5c89e4eSSatish Balay   The user should pass in an array of pointers to char, to hold all the
2933e5c89e4eSSatish Balay   strings returned by this function.
2934e5c89e4eSSatish Balay 
2935e5c89e4eSSatish Balay   The user is responsible for deallocating the strings that are
2936e5c89e4eSSatish Balay   returned. The Fortran interface for this routine is not supported.
2937e5c89e4eSSatish Balay 
2938e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
2939acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2940e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2941e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2942acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2943a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2944e5c89e4eSSatish Balay @*/
2945c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscBool *set)
2946e5c89e4eSSatish Balay {
29472d747510SLisandro Dalcin   const char     *svalue;
2948e5c89e4eSSatish Balay   char           *value;
29492d747510SLisandro Dalcin   PetscInt       n = 0;
2950ace3abfcSBarry Smith   PetscBool      flag;
29519c9d3cfdSBarry Smith   PetscToken     token;
2952e5c89e4eSSatish Balay 
2953e5c89e4eSSatish Balay   PetscFunctionBegin;
29542d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
29552d747510SLisandro Dalcin   PetscValidPointer(strings,4);
29562d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
2957e5c89e4eSSatish Balay 
29585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,pre,name,&svalue,&flag));
29592d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
29602d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
29615f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenCreate(svalue,',',&token));
29625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenFind(token,&value));
29632d747510SLisandro Dalcin   while (value && n < *nmax) {
29645f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrallocpy(value,&strings[n]));
29655f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscTokenFind(token,&value));
2966e5c89e4eSSatish Balay     n++;
2967e5c89e4eSSatish Balay   }
29685f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscTokenDestroy(&token));
2969e5c89e4eSSatish Balay   *nmax = n;
2970e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2971e5c89e4eSSatish Balay }
297206824ed3SPatrick Sanan 
297306824ed3SPatrick Sanan /*@C
297406824ed3SPatrick Sanan    PetscOptionsDeprecated - mark an option as deprecated, optionally replacing it with a new one
297506824ed3SPatrick Sanan 
297606824ed3SPatrick Sanan    Prints a deprecation warning, unless an option is supplied to suppress.
297706824ed3SPatrick Sanan 
29781c9f3c13SBarry Smith    Logically Collective
297906824ed3SPatrick Sanan 
298006824ed3SPatrick Sanan    Input Parameters:
29819503aa97SPatrick Sanan +  pre - string to prepend to name or NULL
298206824ed3SPatrick Sanan .  oldname - the old, deprecated option
298306824ed3SPatrick Sanan .  newname - the new option, or NULL if option is purely removed
29849f3a6782SPatrick Sanan .  version - a string describing the version of first deprecation, e.g. "3.9"
29859f3a6782SPatrick Sanan -  info - additional information string, or NULL.
298606824ed3SPatrick Sanan 
298706824ed3SPatrick Sanan    Options Database Keys:
298806824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings
298906824ed3SPatrick Sanan 
299006824ed3SPatrick Sanan    Notes:
29911c9f3c13SBarry Smith    Must be called between PetscOptionsBegin() (or PetscObjectOptionsBegin()) and PetscOptionsEnd().
29921c9f3c13SBarry Smith    Only the proces of rank zero that owns the PetscOptionsItems are argument (managed by PetscOptionsBegin() or
29931c9f3c13SBarry Smith    PetscObjectOptionsBegin() prints the information
2994b40114eaSPatrick Sanan    If newname is provided, the old option is replaced. Otherwise, it remains
2995b40114eaSPatrick Sanan    in the options database.
29969f3a6782SPatrick Sanan    If an option is not replaced, the info argument should be used to advise the user
29979f3a6782SPatrick Sanan    on how to proceed.
29989f3a6782SPatrick Sanan    There is a limit on the length of the warning printed, so very long strings
29999f3a6782SPatrick Sanan    provided as info may be truncated.
300006824ed3SPatrick Sanan 
300106824ed3SPatrick Sanan    Level: developer
300206824ed3SPatrick Sanan 
300306824ed3SPatrick Sanan .seealso: PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsScalar(), PetscOptionsBool(), PetscOptionsString(), PetscOptionsSetValue()
300406824ed3SPatrick Sanan 
300506824ed3SPatrick Sanan @*/
30069f3a6782SPatrick Sanan PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems *PetscOptionsObject,const char oldname[],const char newname[],const char version[],const char info[])
300706824ed3SPatrick Sanan {
300806824ed3SPatrick Sanan   PetscBool          found,quiet;
300906824ed3SPatrick Sanan   const char         *value;
301006824ed3SPatrick Sanan   const char * const quietopt="-options_suppress_deprecated_warnings";
30119f3a6782SPatrick Sanan   char               msg[4096];
3012b0bdc838SStefano Zampini   char               *prefix = NULL;
3013b0bdc838SStefano Zampini   PetscOptions       options = NULL;
3014b0bdc838SStefano Zampini   MPI_Comm           comm = PETSC_COMM_SELF;
301506824ed3SPatrick Sanan 
301606824ed3SPatrick Sanan   PetscFunctionBegin;
301706824ed3SPatrick Sanan   PetscValidCharPointer(oldname,2);
301806824ed3SPatrick Sanan   PetscValidCharPointer(version,4);
3019b0bdc838SStefano Zampini   if (PetscOptionsObject) {
3020b0bdc838SStefano Zampini     prefix  = PetscOptionsObject->prefix;
3021b0bdc838SStefano Zampini     options = PetscOptionsObject->options;
3022b0bdc838SStefano Zampini     comm    = PetscOptionsObject->comm;
3023b0bdc838SStefano Zampini   }
30245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFindPair(options,prefix,oldname,&value,&found));
302506824ed3SPatrick Sanan   if (found) {
302606824ed3SPatrick Sanan     if (newname) {
3027b0bdc838SStefano Zampini       if (prefix) {
30285f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscOptionsPrefixPush(options,prefix));
3029d255429eSPatrick Sanan       }
30305f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsSetValue(options,newname,value));
3031b0bdc838SStefano Zampini       if (prefix) {
30325f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscOptionsPrefixPop(options));
3033d255429eSPatrick Sanan       }
30345f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsClearValue(options,oldname));
3035b40114eaSPatrick Sanan     }
303606824ed3SPatrick Sanan     quiet = PETSC_FALSE;
30375f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsGetBool(options,NULL,quietopt,&quiet,NULL));
303806824ed3SPatrick Sanan     if (!quiet) {
30395f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option "));
30405f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcat(msg,oldname));
30415f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcat(msg," is deprecated as of version "));
30425f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcat(msg,version));
30435f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcat(msg," and will be removed in a future release."));
304406824ed3SPatrick Sanan       if (newname) {
30455f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrcat(msg," Please use the option "));
30465f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrcat(msg,newname));
30475f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrcat(msg," instead."));
304806824ed3SPatrick Sanan       }
30499f3a6782SPatrick Sanan       if (info) {
30505f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrcat(msg," "));
30515f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscStrcat(msg,info));
30529f3a6782SPatrick Sanan       }
30535f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcat(msg," (Silence this warning with "));
30545f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcat(msg,quietopt));
30555f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcat(msg,")\n"));
30565f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(comm,"%s",msg));
305706824ed3SPatrick Sanan     }
305806824ed3SPatrick Sanan   }
305906824ed3SPatrick Sanan   PetscFunctionReturn(0);
306006824ed3SPatrick Sanan }
3061