xref: /petsc/src/sys/objects/options.c (revision a1d2f846b0dc3e3a7ebe09c9dc42a0fd58dedff1)
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   */
342d747510SLisandro Dalcin PETSC_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) */
402d747510SLisandro Dalcin PETSC_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 
542d747510SLisandro Dalcin PETSC_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 {
1162d747510SLisandro Dalcin   PetscInt       i;
117e5c89e4eSSatish Balay   PetscErrorCode ierr;
118e5c89e4eSSatish Balay 
1198ad20175SVaclav Hapla   if (!PetscErrorHandlingInitialized) return 0;
120e5c89e4eSSatish Balay   PetscFunctionBegin;
121c5b5d8d5SVaclav Hapla   if (!value) value = "";
122c5b5d8d5SVaclav Hapla   if (options->monitorFromOptions) {
123c5b5d8d5SVaclav Hapla     ierr = PetscOptionsMonitorDefault(name,value,NULL);CHKERRQ(ierr);
124c5b5d8d5SVaclav Hapla   }
1252d747510SLisandro Dalcin   for (i=0; i<options->numbermonitors; i++) {
1262d747510SLisandro Dalcin     ierr = (*options->monitor[i])(name,value,options->monitorcontext[i]);CHKERRQ(ierr);
127e5c89e4eSSatish Balay   }
128e5c89e4eSSatish Balay   PetscFunctionReturn(0);
129e5c89e4eSSatish Balay }
130e5c89e4eSSatish Balay 
1312d747510SLisandro Dalcin /*@
1322d747510SLisandro Dalcin    PetscOptionsCreate - Creates an empty options database.
133e5c89e4eSSatish Balay 
1341c9f3c13SBarry Smith    Logically collective
1351c9f3c13SBarry Smith 
136e5c89e4eSSatish Balay    Output Parameter:
1372d747510SLisandro Dalcin .  options - Options database object
138e5c89e4eSSatish Balay 
139e5c89e4eSSatish Balay    Level: advanced
140e5c89e4eSSatish Balay 
1411c9f3c13SBarry Smith    Developer Note: We may want eventually to pass a MPI_Comm to determine the ownership of the object
1421c9f3c13SBarry Smith 
143b4205f0bSBarry Smith .seealso: PetscOptionsDestroy(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsInsert(), PetscOptionsSetValue()
144e5c89e4eSSatish Balay @*/
1452d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreate(PetscOptions *options)
1462d747510SLisandro Dalcin {
1472d747510SLisandro Dalcin   if (!options) return PETSC_ERR_ARG_NULL;
1482d747510SLisandro Dalcin   *options = (PetscOptions)calloc(1,sizeof(**options));
1492d747510SLisandro Dalcin   if (!*options) return PETSC_ERR_MEM;
1502d747510SLisandro Dalcin   return 0;
1512d747510SLisandro Dalcin }
1522d747510SLisandro Dalcin 
1532d747510SLisandro Dalcin /*@
1542d747510SLisandro Dalcin     PetscOptionsDestroy - Destroys an option database.
1552d747510SLisandro Dalcin 
1561c9f3c13SBarry Smith     Logically collective on whatever communicator was associated with the call to PetscOptionsCreate()
1571c9f3c13SBarry Smith 
1582d747510SLisandro Dalcin   Input Parameter:
1592d747510SLisandro Dalcin .  options - the PetscOptions object
1602d747510SLisandro Dalcin 
1613de2bfdfSBarry Smith    Level: advanced
1622d747510SLisandro Dalcin 
163b4205f0bSBarry Smith .seealso: PetscOptionsInsert(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsInsert(), PetscOptionsSetValue()
1642d747510SLisandro Dalcin @*/
1652d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroy(PetscOptions *options)
166e5c89e4eSSatish Balay {
167e5c89e4eSSatish Balay   PetscErrorCode ierr;
168e5c89e4eSSatish Balay 
1692d747510SLisandro Dalcin   if (!*options) return 0;
1703de2bfdfSBarry Smith   if ((*options)->previous) SETERRQ(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()");
1712d747510SLisandro Dalcin   ierr = PetscOptionsClear(*options);if (ierr) return ierr;
1722d747510SLisandro Dalcin   /* XXX what about monitors ? */
1732800570dSLisandro Dalcin   free(*options);
1742d747510SLisandro Dalcin   *options = NULL;
175e5c89e4eSSatish Balay   PetscFunctionReturn(0);
176e5c89e4eSSatish Balay }
177e5c89e4eSSatish Balay 
1782d747510SLisandro Dalcin /*
1792d747510SLisandro Dalcin     PetscOptionsCreateDefault - Creates the default global options database
1802d747510SLisandro Dalcin */
1812d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreateDefault(void)
182e5c89e4eSSatish Balay {
183e5c89e4eSSatish Balay   PetscErrorCode ierr;
184e5c89e4eSSatish Balay 
1852d747510SLisandro Dalcin   if (!defaultoptions) {
1862d747510SLisandro Dalcin     ierr = PetscOptionsCreate(&defaultoptions);if (ierr) return ierr;
1872d747510SLisandro Dalcin   }
1882d747510SLisandro Dalcin   return 0;
1892d747510SLisandro Dalcin }
1902d747510SLisandro Dalcin 
191b4205f0bSBarry Smith /*@
192b4205f0bSBarry Smith       PetscOptionsPush - Push a new PetscOptions object as the default provider of options
1931c9f3c13SBarry Smith                          Allows using different parts of a code to use different options databases
194b4205f0bSBarry Smith 
195b4205f0bSBarry Smith   Logically Collective
196b4205f0bSBarry Smith 
197b4205f0bSBarry Smith   Input Parameter:
198b4205f0bSBarry Smith .   opt - the options obtained with PetscOptionsCreate()
199b4205f0bSBarry Smith 
200b4205f0bSBarry Smith   Notes:
201b4205f0bSBarry Smith   Use PetscOptionsPop() to return to the previous default options database
2021c9f3c13SBarry Smith 
2039666a313SBarry Smith   The collectivity of this routine is complex; only the MPI processes that call this routine will
2041c9f3c13SBarry Smith   have the affect of these options. If some processes that create objects call this routine and others do
2051c9f3c13SBarry Smith   not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
2061c9f3c13SBarry Smith   on different ranks.
207b4205f0bSBarry Smith 
2083de2bfdfSBarry Smith    Level: advanced
2093de2bfdfSBarry Smith 
2103c6db4c4SPierre Jolivet .seealso: PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsInsert(), PetscOptionsSetValue(), PetscOptionsLeft()
211b4205f0bSBarry Smith 
212b4205f0bSBarry Smith @*/
213b4205f0bSBarry Smith PetscErrorCode PetscOptionsPush(PetscOptions opt)
214b4205f0bSBarry Smith {
215b4205f0bSBarry Smith   PetscErrorCode ierr;
216b4205f0bSBarry Smith 
217b4205f0bSBarry Smith   PetscFunctionBegin;
218b4205f0bSBarry Smith   ierr = PetscOptionsCreateDefault();CHKERRQ(ierr);
219b4205f0bSBarry Smith   opt->previous  = defaultoptions;
220b4205f0bSBarry Smith   defaultoptions = opt;
221b4205f0bSBarry Smith   PetscFunctionReturn(0);
222b4205f0bSBarry Smith }
223b4205f0bSBarry Smith 
224b4205f0bSBarry Smith /*@
225b4205f0bSBarry Smith       PetscOptionsPop - Pop the most recent PetscOptionsPush() to return to the previous default options
226b4205f0bSBarry Smith 
2271c9f3c13SBarry Smith       Logically collective on whatever communicator was associated with the call to PetscOptionsCreate()
228b4205f0bSBarry Smith 
229b4205f0bSBarry Smith   Notes:
230b4205f0bSBarry Smith   Use PetscOptionsPop() to return to the previous default options database
231b4205f0bSBarry Smith   Allows using different parts of a code to use different options databases
232b4205f0bSBarry Smith 
2333de2bfdfSBarry Smith    Level: advanced
2343de2bfdfSBarry Smith 
2353c6db4c4SPierre Jolivet .seealso: PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsInsert(), PetscOptionsSetValue(), PetscOptionsLeft()
236b4205f0bSBarry Smith 
237b4205f0bSBarry Smith @*/
238b4205f0bSBarry Smith PetscErrorCode PetscOptionsPop(void)
239b4205f0bSBarry Smith {
2403de2bfdfSBarry Smith   PetscOptions current = defaultoptions;
2413de2bfdfSBarry Smith 
242b4205f0bSBarry Smith   PetscFunctionBegin;
243b4205f0bSBarry Smith   if (!defaultoptions) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing default options");
244b4205f0bSBarry Smith   if (!defaultoptions->previous) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PetscOptionsPop() called too many times");
245b4205f0bSBarry Smith   defaultoptions    = defaultoptions->previous;
2463de2bfdfSBarry Smith   current->previous = NULL;
247b4205f0bSBarry Smith   PetscFunctionReturn(0);
248b4205f0bSBarry Smith }
249b4205f0bSBarry Smith 
2502d747510SLisandro Dalcin /*
2512d747510SLisandro Dalcin     PetscOptionsDestroyDefault - Destroys the default global options database
2522d747510SLisandro Dalcin */
2532d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroyDefault(void)
2542d747510SLisandro Dalcin {
2552d747510SLisandro Dalcin   PetscErrorCode ierr;
2563de2bfdfSBarry Smith   PetscOptions   tmp;
2572d747510SLisandro Dalcin 
25886dbd7c4SLisandro Dalcin   if (!defaultoptions) return 0;
2593de2bfdfSBarry Smith   /* Destroy any options that the user forgot to pop */
2603de2bfdfSBarry Smith   while (defaultoptions->previous) {
2613de2bfdfSBarry Smith     tmp = defaultoptions;
2623de2bfdfSBarry Smith     ierr = PetscOptionsPop();CHKERRQ(ierr);
2633de2bfdfSBarry Smith     ierr = PetscOptionsDestroy(&tmp);CHKERRQ(ierr);
2643de2bfdfSBarry Smith   }
2652d747510SLisandro Dalcin   ierr = PetscOptionsDestroy(&defaultoptions);if (ierr) return ierr;
2662d747510SLisandro Dalcin   return 0;
267e5c89e4eSSatish Balay }
268e5c89e4eSSatish Balay 
26994ef8ddeSSatish Balay /*@C
2707cd08cecSJed Brown    PetscOptionsValidKey - PETSc Options database keys must begin with one or two dashes (-) followed by a letter.
2713fc1eb6aSBarry Smith 
272447722d5SBarry Smith    Not collective
2731c9f3c13SBarry Smith 
2743fc1eb6aSBarry Smith    Input Parameter:
2752d747510SLisandro Dalcin .  key - string to check if valid
2763fc1eb6aSBarry Smith 
2773fc1eb6aSBarry Smith    Output Parameter:
2782d747510SLisandro Dalcin .  valid - PETSC_TRUE if a valid key
2793fc1eb6aSBarry Smith 
280f6680f47SSatish Balay    Level: intermediate
2813fc1eb6aSBarry Smith @*/
2822d747510SLisandro Dalcin PetscErrorCode PetscOptionsValidKey(const char key[],PetscBool *valid)
28396fc60bcSBarry Smith {
284f603b5e9SToby Isaac   char           *ptr;
2857c5db45bSBarry Smith 
28696fc60bcSBarry Smith   PetscFunctionBegin;
2872d747510SLisandro Dalcin   if (key) PetscValidCharPointer(key,1);
2882d747510SLisandro Dalcin   PetscValidPointer(valid,2);
2892d747510SLisandro Dalcin   *valid = PETSC_FALSE;
2902d747510SLisandro Dalcin   if (!key) PetscFunctionReturn(0);
2912d747510SLisandro Dalcin   if (key[0] != '-') PetscFunctionReturn(0);
2922d747510SLisandro Dalcin   if (key[1] == '-') key++;
293c850d057SPierre Jolivet   if (!isalpha((int)key[1])) PetscFunctionReturn(0);
2942d747510SLisandro Dalcin   (void) strtod(key,&ptr);
295c850d057SPierre Jolivet   if (ptr != key && !(*ptr == '_' || isalnum((int)*ptr))) PetscFunctionReturn(0);
2962d747510SLisandro Dalcin   *valid = PETSC_TRUE;
29796fc60bcSBarry Smith   PetscFunctionReturn(0);
29896fc60bcSBarry Smith }
29996fc60bcSBarry Smith 
300e5c89e4eSSatish Balay /*@C
301e5c89e4eSSatish Balay    PetscOptionsInsertString - Inserts options into the database from a string
302e5c89e4eSSatish Balay 
3031c9f3c13SBarry Smith    Logically Collective
304e5c89e4eSSatish Balay 
305e5c89e4eSSatish Balay    Input Parameter:
306080f0011SToby Isaac +  options - options object
307080f0011SToby Isaac -  in_str - string that contains options separated by blanks
308e5c89e4eSSatish Balay 
309e5c89e4eSSatish Balay    Level: intermediate
310e5c89e4eSSatish Balay 
3119666a313SBarry Smith   The collectivity of this routine is complex; only the MPI processes that call this routine will
3121c9f3c13SBarry Smith   have the affect of these options. If some processes that create objects call this routine and others do
3131c9f3c13SBarry Smith   not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
3141c9f3c13SBarry Smith   on different ranks.
3151c9f3c13SBarry Smith 
316e5c89e4eSSatish Balay    Contributed by Boyana Norris
317e5c89e4eSSatish Balay 
31888c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(),
319acfcf0e5SJed Brown           PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
320e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
321e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
322acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
323a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsInsertFile()
324e5c89e4eSSatish Balay @*/
325c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertString(PetscOptions options,const char in_str[])
326e5c89e4eSSatish Balay {
327d06005cbSLisandro Dalcin   MPI_Comm       comm = PETSC_COMM_SELF;
328e5c89e4eSSatish Balay   PetscErrorCode ierr;
329d06005cbSLisandro Dalcin   char           *first,*second;
3309c9d3cfdSBarry Smith   PetscToken     token;
331e5c89e4eSSatish Balay 
332e5c89e4eSSatish Balay   PetscFunctionBegin;
33396fc60bcSBarry Smith   ierr = PetscTokenCreate(in_str,' ',&token);CHKERRQ(ierr);
334e5c89e4eSSatish Balay   ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
33596fc60bcSBarry Smith   while (first) {
336d06005cbSLisandro Dalcin     PetscBool isfile,isfileyaml,isstringyaml,ispush,ispop,key;
337d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(first,"-options_file",&isfile);CHKERRQ(ierr);
338d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(first,"-options_file_yaml",&isfileyaml);CHKERRQ(ierr);
339d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(first,"-options_string_yaml",&isstringyaml);CHKERRQ(ierr);
3409db968c8SJed Brown     ierr = PetscStrcasecmp(first,"-prefix_push",&ispush);CHKERRQ(ierr);
3419db968c8SJed Brown     ierr = PetscStrcasecmp(first,"-prefix_pop",&ispop);CHKERRQ(ierr);
34296fc60bcSBarry Smith     ierr = PetscOptionsValidKey(first,&key);CHKERRQ(ierr);
343d06005cbSLisandro Dalcin     if (!key) {
344d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
345d06005cbSLisandro Dalcin     } else if (isfile) {
346d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
347d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertFile(comm,options,second,PETSC_TRUE);CHKERRQ(ierr);
348d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
349d06005cbSLisandro Dalcin     } else if (isfileyaml) {
350d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
351d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertFileYAML(comm,options,second,PETSC_TRUE);CHKERRQ(ierr);
352d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
353d06005cbSLisandro Dalcin     } else if (isstringyaml) {
354d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
355d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertStringYAML(options,second);CHKERRQ(ierr);
356d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
357d06005cbSLisandro Dalcin     } else if (ispush) {
3589db968c8SJed Brown       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
359c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPush(options,second);CHKERRQ(ierr);
3609db968c8SJed Brown       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
3619db968c8SJed Brown     } else if (ispop) {
362c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr);
3639db968c8SJed Brown       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
364d06005cbSLisandro Dalcin     } else {
365e5c89e4eSSatish Balay       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
36696fc60bcSBarry Smith       ierr = PetscOptionsValidKey(second,&key);CHKERRQ(ierr);
36796fc60bcSBarry Smith       if (!key) {
368c5929fdfSBarry Smith         ierr = PetscOptionsSetValue(options,first,second);CHKERRQ(ierr);
36996fc60bcSBarry Smith         ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
37096fc60bcSBarry Smith       } else {
371c5929fdfSBarry Smith         ierr  = PetscOptionsSetValue(options,first,NULL);CHKERRQ(ierr);
37296fc60bcSBarry Smith         first = second;
37396fc60bcSBarry Smith       }
374e5c89e4eSSatish Balay     }
375e5c89e4eSSatish Balay   }
3768c74ee41SBarry Smith   ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
377e5c89e4eSSatish Balay   PetscFunctionReturn(0);
378e5c89e4eSSatish Balay }
379e5c89e4eSSatish Balay 
3803fc1eb6aSBarry Smith /*
3813fc1eb6aSBarry Smith     Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free()
3823fc1eb6aSBarry Smith */
3835fa91da5SBarry Smith static char *Petscgetline(FILE * f)
3845fa91da5SBarry Smith {
3855fa91da5SBarry Smith   size_t size  = 0;
3865fa91da5SBarry Smith   size_t len   = 0;
3875fa91da5SBarry Smith   size_t last  = 0;
3880298fd71SBarry Smith   char   *buf  = NULL;
3895fa91da5SBarry Smith 
39002c9f0b5SLisandro Dalcin   if (feof(f)) return NULL;
3915fa91da5SBarry Smith   do {
3925fa91da5SBarry Smith     size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */
3936e0c8459SSatish Balay     buf   = (char*)realloc((void*)buf,size); /* realloc(NULL,n) is the same as malloc(n) */
3945fa91da5SBarry Smith     /* Actually do the read. Note that fgets puts a terminal '\0' on the
3955fa91da5SBarry Smith     end of the string, so we make sure we overwrite this */
396e86f3e45SDave May     if (!fgets(buf+len,1024,f)) buf[len]=0;
3975fa91da5SBarry Smith     PetscStrlen(buf,&len);
3985fa91da5SBarry Smith     last = len - 1;
3995fa91da5SBarry Smith   } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r');
40008ac41f7SSatish Balay   if (len) return buf;
4015fa91da5SBarry Smith   free(buf);
40202c9f0b5SLisandro Dalcin   return NULL;
4035fa91da5SBarry Smith }
4045fa91da5SBarry Smith 
405be10d61cSLisandro Dalcin static PetscErrorCode PetscOptionsFilename(MPI_Comm comm,const char file[],char filename[PETSC_MAX_PATH_LEN],PetscBool *yaml)
406be10d61cSLisandro Dalcin {
407be10d61cSLisandro Dalcin   char           fname[PETSC_MAX_PATH_LEN+8],path[PETSC_MAX_PATH_LEN+8],*tail;
408be10d61cSLisandro Dalcin   PetscErrorCode ierr;
409e5c89e4eSSatish Balay 
410be10d61cSLisandro Dalcin   *yaml = PETSC_FALSE;
411be10d61cSLisandro Dalcin   PetscFunctionBegin;
412be10d61cSLisandro Dalcin   ierr = PetscStrreplace(comm,file,fname,sizeof(fname));CHKERRQ(ierr);
413be10d61cSLisandro Dalcin   ierr = PetscFixFilename(fname,path);CHKERRQ(ierr);
414be10d61cSLisandro Dalcin   ierr = PetscStrendswith(path,":yaml",yaml);CHKERRQ(ierr);
415be10d61cSLisandro Dalcin   if (*yaml) {
416be10d61cSLisandro Dalcin     ierr = PetscStrrchr(path,':',&tail);CHKERRQ(ierr);
417be10d61cSLisandro Dalcin     tail[-1] = 0; /* remove ":yaml" suffix from path */
418be10d61cSLisandro Dalcin   }
419be10d61cSLisandro Dalcin   ierr = PetscStrncpy(filename,path,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
420*a1d2f846SLisandro Dalcin   /* check for standard YAML and JSON filename extensions */
421*a1d2f846SLisandro Dalcin   if (!*yaml) {ierr = PetscStrendswith(filename,".yaml",yaml);CHKERRQ(ierr);}
422*a1d2f846SLisandro Dalcin   if (!*yaml) {ierr = PetscStrendswith(filename,".yml", yaml);CHKERRQ(ierr);}
423*a1d2f846SLisandro Dalcin   if (!*yaml) {ierr = PetscStrendswith(filename,".json",yaml);CHKERRQ(ierr);}
424*a1d2f846SLisandro Dalcin   if (!*yaml) { /* check file contents */
425*a1d2f846SLisandro Dalcin     PetscMPIInt rank;
426*a1d2f846SLisandro Dalcin     ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
427*a1d2f846SLisandro Dalcin     if (!rank) {
428*a1d2f846SLisandro Dalcin       FILE *fh = fopen(filename,"r");
429*a1d2f846SLisandro Dalcin       if (fh) {
430*a1d2f846SLisandro Dalcin         char buf[6] = "";
431*a1d2f846SLisandro Dalcin         if (fread(buf,1,6,fh) > 0) {
432*a1d2f846SLisandro Dalcin           ierr = PetscStrncmp(buf,"%YAML ",6,yaml);CHKERRQ(ierr);  /* check for '%YAML' tag */
433*a1d2f846SLisandro Dalcin           if (!*yaml) {ierr = PetscStrncmp(buf,"---",3,yaml);CHKERRQ(ierr);}  /* check for document start */
434*a1d2f846SLisandro Dalcin         }
435*a1d2f846SLisandro Dalcin         (void)fclose(fh);
436*a1d2f846SLisandro Dalcin       }
437*a1d2f846SLisandro Dalcin     }
438*a1d2f846SLisandro Dalcin     ierr = MPI_Bcast(yaml,1,MPIU_BOOL,0,comm);CHKERRMPI(ierr);
439*a1d2f846SLisandro Dalcin   }
440be10d61cSLisandro Dalcin   PetscFunctionReturn(0);
441be10d61cSLisandro Dalcin }
442e5c89e4eSSatish Balay 
443be10d61cSLisandro Dalcin static PetscErrorCode PetscOptionsInsertFilePetsc(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require)
444e5c89e4eSSatish Balay {
4458c0b561eSLisandro Dalcin   char           *string,*vstring = NULL,*astring = NULL,*packed = NULL;
4467fb43599SVaclav Hapla   char           *tokens[4];
447e5c89e4eSSatish Balay   PetscErrorCode ierr;
44813e3f751SJed Brown   size_t         i,len,bytes;
449e5c89e4eSSatish Balay   FILE           *fd;
4507fb43599SVaclav Hapla   PetscToken     token=NULL;
451ed9cf6e9SBarry Smith   int            err;
452581bbe83SVaclav Hapla   char           *cmatch;
453581bbe83SVaclav Hapla   const char     cmt='#';
4549210b8eaSVaclav Hapla   PetscInt       line=1;
4553a018368SJed Brown   PetscMPIInt    rank,cnt=0,acnt=0,counts[2];
4569210b8eaSVaclav Hapla   PetscBool      isdir,alias=PETSC_FALSE,valid;
457e5c89e4eSSatish Balay 
458e5c89e4eSSatish Balay   PetscFunctionBegin;
459be10d61cSLisandro Dalcin 
4607fb43599SVaclav Hapla   ierr = PetscMemzero(tokens,sizeof(tokens));CHKERRQ(ierr);
4618c0b561eSLisandro Dalcin   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
46205c7dedfSBarry Smith   if (!rank) {
4638c0b561eSLisandro Dalcin     char fpath[PETSC_MAX_PATH_LEN];
4648c0b561eSLisandro Dalcin     char fname[PETSC_MAX_PATH_LEN];
46505c7dedfSBarry Smith 
4668c0b561eSLisandro Dalcin     ierr = PetscStrreplace(PETSC_COMM_SELF,file,fpath,sizeof(fpath));CHKERRQ(ierr);
4678c0b561eSLisandro Dalcin     ierr = PetscFixFilename(fpath,fname);CHKERRQ(ierr);
4688c0b561eSLisandro Dalcin 
469e5c89e4eSSatish Balay     fd   = fopen(fname,"r");
470ad38b122SPatrick Sanan     ierr = PetscTestDirectory(fname,'r',&isdir);CHKERRQ(ierr);
471ad38b122SPatrick Sanan     if (isdir && require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Specified options file %s is a directory",fname);
472ad38b122SPatrick Sanan     if (fd && !isdir) {
4733a018368SJed Brown       PetscSegBuffer vseg,aseg;
4743a018368SJed Brown       ierr = PetscSegBufferCreate(1,4000,&vseg);CHKERRQ(ierr);
4753a018368SJed Brown       ierr = PetscSegBufferCreate(1,2000,&aseg);CHKERRQ(ierr);
4763a018368SJed Brown 
4779b754dc9SBarry Smith       /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */
47802c9f0b5SLisandro Dalcin       ierr = PetscInfo1(NULL,"Opened options file %s\n",file);CHKERRQ(ierr);
479e24ecc5dSJed Brown 
4805fa91da5SBarry Smith       while ((string = Petscgetline(fd))) {
4814704e885SBarry Smith         /* eliminate comments from each line */
482581bbe83SVaclav Hapla         ierr = PetscStrchr(string,cmt,&cmatch);CHKERRQ(ierr);
48390f79514SSatish Balay         if (cmatch) *cmatch = 0;
484e5c89e4eSSatish Balay         ierr = PetscStrlen(string,&len);CHKERRQ(ierr);
4855981331cSSatish Balay         /* replace tabs, ^M, \n with " " */
486e5c89e4eSSatish Balay         for (i=0; i<len; i++) {
4875981331cSSatish Balay           if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') {
488e5c89e4eSSatish Balay             string[i] = ' ';
489e5c89e4eSSatish Balay           }
490e5c89e4eSSatish Balay         }
49190f79514SSatish Balay         ierr = PetscTokenCreate(string,' ',&token);CHKERRQ(ierr);
4927fb43599SVaclav Hapla         ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr);
4937fb43599SVaclav Hapla         if (!tokens[0]) {
49402b0d46eSSatish Balay           goto destroy;
4957fb43599SVaclav Hapla         } else if (!tokens[0][0]) { /* if token 0 is empty (string begins with spaces), redo */
4967fb43599SVaclav Hapla           ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr);
49790f79514SSatish Balay         }
4987fb43599SVaclav Hapla         for (i=1; i<4; i++) {
4997fb43599SVaclav Hapla           ierr = PetscTokenFind(token,&tokens[i]);CHKERRQ(ierr);
5007fb43599SVaclav Hapla         }
5017fb43599SVaclav Hapla         if (!tokens[0]) {
5022662f744SSatish Balay           goto destroy;
5037fb43599SVaclav Hapla         } else if (tokens[0][0] == '-') {
5049210b8eaSVaclav Hapla           ierr = PetscOptionsValidKey(tokens[0],&valid);CHKERRQ(ierr);
5059210b8eaSVaclav Hapla           if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: invalid option %s",fname,line,tokens[0]);
5067fb43599SVaclav Hapla           ierr = PetscStrlen(tokens[0],&len);CHKERRQ(ierr);
50713e3f751SJed Brown           ierr = PetscSegBufferGet(vseg,len+1,&vstring);CHKERRQ(ierr);
5087fb43599SVaclav Hapla           ierr = PetscArraycpy(vstring,tokens[0],len);CHKERRQ(ierr);
509e24ecc5dSJed Brown           vstring[len] = ' ';
5107fb43599SVaclav Hapla           if (tokens[1]) {
5119210b8eaSVaclav Hapla             ierr = PetscOptionsValidKey(tokens[1],&valid);CHKERRQ(ierr);
5129210b8eaSVaclav Hapla             if (valid) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: cannot specify two options per line (%s %s)",fname,line,tokens[0],tokens[1]);
5137fb43599SVaclav Hapla             ierr = PetscStrlen(tokens[1],&len);CHKERRQ(ierr);
51413e3f751SJed Brown             ierr = PetscSegBufferGet(vseg,len+3,&vstring);CHKERRQ(ierr);
515e24ecc5dSJed Brown             vstring[0] = '"';
5167fb43599SVaclav Hapla             ierr = PetscArraycpy(vstring+1,tokens[1],len);CHKERRQ(ierr);
517e24ecc5dSJed Brown             vstring[len+1] = '"';
518e24ecc5dSJed Brown             vstring[len+2] = ' ';
51909192fe3SBarry Smith           }
52090f79514SSatish Balay         } else {
5219210b8eaSVaclav Hapla           ierr = PetscStrcasecmp(tokens[0],"alias",&alias);CHKERRQ(ierr);
5229210b8eaSVaclav Hapla           if (alias) {
5239210b8eaSVaclav Hapla             ierr = PetscOptionsValidKey(tokens[1],&valid);CHKERRQ(ierr);
5249210b8eaSVaclav Hapla             if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: invalid aliased option %s",fname,line,tokens[1]);
5259210b8eaSVaclav Hapla             if (!tokens[2]) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: alias missing for %s",fname,line,tokens[1]);
5269210b8eaSVaclav Hapla             ierr = PetscOptionsValidKey(tokens[2],&valid);CHKERRQ(ierr);
5279210b8eaSVaclav Hapla             if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: invalid aliasee option %s",fname,line,tokens[2]);
5287fb43599SVaclav Hapla             ierr = PetscStrlen(tokens[1],&len);CHKERRQ(ierr);
52913e3f751SJed Brown             ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr);
5307fb43599SVaclav Hapla             ierr = PetscArraycpy(astring,tokens[1],len);CHKERRQ(ierr);
531e24ecc5dSJed Brown             astring[len] = ' ';
532e24ecc5dSJed Brown 
5337fb43599SVaclav Hapla             ierr = PetscStrlen(tokens[2],&len);CHKERRQ(ierr);
53413e3f751SJed Brown             ierr = PetscSegBufferGet(aseg,len+1,&astring);CHKERRQ(ierr);
5357fb43599SVaclav Hapla             ierr = PetscArraycpy(astring,tokens[2],len);CHKERRQ(ierr);
536e24ecc5dSJed Brown             astring[len] = ' ';
5379210b8eaSVaclav Hapla           } else SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown first token in options file %s line %D: %s",fname,line,tokens[0]);
5389210b8eaSVaclav Hapla         }
5399210b8eaSVaclav Hapla         {
5409210b8eaSVaclav Hapla           const char *extraToken = alias ? tokens[3] : tokens[2];
5419210b8eaSVaclav Hapla           if (extraToken) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Error in options file %s line %D: extra token %s",fname,line,extraToken);
542e5c89e4eSSatish Balay         }
54302b0d46eSSatish Balay destroy:
5444b40f50bSBarry Smith         free(string);
5458c74ee41SBarry Smith         ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
5469210b8eaSVaclav Hapla         alias = PETSC_FALSE;
5479210b8eaSVaclav Hapla         line++;
548e5c89e4eSSatish Balay       }
549ed9cf6e9SBarry Smith       err = fclose(fd);
5509210b8eaSVaclav Hapla       if (err) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file %s",fname);
551e24ecc5dSJed Brown       ierr = PetscSegBufferGetSize(aseg,&bytes);CHKERRQ(ierr); /* size without null termination */
552e24ecc5dSJed Brown       ierr = PetscMPIIntCast(bytes,&acnt);CHKERRQ(ierr);
553e24ecc5dSJed Brown       ierr = PetscSegBufferGet(aseg,1,&astring);CHKERRQ(ierr);
554e24ecc5dSJed Brown       astring[0] = 0;
555e24ecc5dSJed Brown       ierr = PetscSegBufferGetSize(vseg,&bytes);CHKERRQ(ierr); /* size without null termination */
556e24ecc5dSJed Brown       ierr = PetscMPIIntCast(bytes,&cnt);CHKERRQ(ierr);
557e24ecc5dSJed Brown       ierr = PetscSegBufferGet(vseg,1,&vstring);CHKERRQ(ierr);
558e24ecc5dSJed Brown       vstring[0] = 0;
559854ce69bSBarry Smith       ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr);
5603a018368SJed Brown       ierr = PetscSegBufferExtractTo(aseg,packed);CHKERRQ(ierr);
5613a018368SJed Brown       ierr = PetscSegBufferExtractTo(vseg,packed+acnt+1);CHKERRQ(ierr);
5623a018368SJed Brown       ierr = PetscSegBufferDestroy(&aseg);CHKERRQ(ierr);
5633a018368SJed Brown       ierr = PetscSegBufferDestroy(&vseg);CHKERRQ(ierr);
5649210b8eaSVaclav Hapla     } else if (require) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Unable to open options file %s",fname);
5659b754dc9SBarry Smith   }
56605c7dedfSBarry Smith 
5673a018368SJed Brown   counts[0] = acnt;
5683a018368SJed Brown   counts[1] = cnt;
5694201f521SBarry Smith   err = MPI_Bcast(counts,2,MPI_INT,0,comm);
5704201f521SBarry Smith   if (err) SETERRQ(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://www.mcs.anl.gov/petsc/documentation/faq.html");
5713a018368SJed Brown   acnt = counts[0];
5723a018368SJed Brown   cnt = counts[1];
5733a018368SJed Brown   if (rank) {
574854ce69bSBarry Smith     ierr = PetscMalloc1(2+acnt+cnt,&packed);CHKERRQ(ierr);
5753a018368SJed Brown   }
5763a018368SJed Brown   if (acnt || cnt) {
577ffc4695bSBarry Smith     ierr = MPI_Bcast(packed,2+acnt+cnt,MPI_CHAR,0,comm);CHKERRMPI(ierr);
5783a018368SJed Brown     astring = packed;
5793a018368SJed Brown     vstring = packed + acnt + 1;
5803a018368SJed Brown   }
5813a018368SJed Brown 
5829b754dc9SBarry Smith   if (acnt) {
5839b754dc9SBarry Smith     ierr = PetscTokenCreate(astring,' ',&token);CHKERRQ(ierr);
5847fb43599SVaclav Hapla     ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr);
5857fb43599SVaclav Hapla     while (tokens[0]) {
5867fb43599SVaclav Hapla       ierr = PetscTokenFind(token,&tokens[1]);CHKERRQ(ierr);
5877fb43599SVaclav Hapla       ierr = PetscOptionsSetAlias(options,tokens[0],tokens[1]);CHKERRQ(ierr);
5887fb43599SVaclav Hapla       ierr = PetscTokenFind(token,&tokens[0]);CHKERRQ(ierr);
5899b754dc9SBarry Smith     }
5908c74ee41SBarry Smith     ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
5919b754dc9SBarry Smith   }
5929b754dc9SBarry Smith 
5939b754dc9SBarry Smith   if (cnt) {
594c5929fdfSBarry Smith     ierr = PetscOptionsInsertString(options,vstring);CHKERRQ(ierr);
595e5c89e4eSSatish Balay   }
5963a018368SJed Brown   ierr = PetscFree(packed);CHKERRQ(ierr);
597e5c89e4eSSatish Balay   PetscFunctionReturn(0);
598e5c89e4eSSatish Balay }
599e5c89e4eSSatish Balay 
600d06005cbSLisandro Dalcin /*@C
601be10d61cSLisandro Dalcin      PetscOptionsInsertFile - Inserts options into the database from a file.
602be10d61cSLisandro Dalcin 
603be10d61cSLisandro Dalcin      Collective
604be10d61cSLisandro Dalcin 
605be10d61cSLisandro Dalcin   Input Parameter:
606be10d61cSLisandro Dalcin +   comm - the processes that will share the options (usually PETSC_COMM_WORLD)
607be10d61cSLisandro Dalcin .   options - options database, use NULL for default global database
608be10d61cSLisandro Dalcin .   file - name of file,
609be10d61cSLisandro Dalcin            ".yml" and ".yaml" filename extensions are inserted as YAML options,
610be10d61cSLisandro Dalcin            append ":yaml" to filename to force YAML options.
611be10d61cSLisandro Dalcin -   require - if PETSC_TRUE will generate an error if the file does not exist
612be10d61cSLisandro Dalcin 
613be10d61cSLisandro Dalcin 
614be10d61cSLisandro Dalcin   Notes:
615be10d61cSLisandro Dalcin    Use  # for lines that are comments and which should be ignored.
616be10d61cSLisandro Dalcin    Usually, instead of using this command, one should list the file name in the call to PetscInitialize(), this insures that certain options
617be10d61cSLisandro 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
618be10d61cSLisandro Dalcin    calls to XXXSetFromOptions() it should not be used for options listed under PetscInitialize().
619be10d61cSLisandro Dalcin    The collectivity of this routine is complex; only the MPI processes in comm will
620be10d61cSLisandro Dalcin    have the affect of these options. If some processes that create objects call this routine and others do
621be10d61cSLisandro Dalcin    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
622be10d61cSLisandro Dalcin    on different ranks.
623be10d61cSLisandro Dalcin 
624be10d61cSLisandro Dalcin   Level: developer
625be10d61cSLisandro Dalcin 
626be10d61cSLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(),
627be10d61cSLisandro Dalcin           PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
628be10d61cSLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
629be10d61cSLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
630be10d61cSLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
631be10d61cSLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
632be10d61cSLisandro Dalcin 
633be10d61cSLisandro Dalcin @*/
634be10d61cSLisandro Dalcin PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require)
635be10d61cSLisandro Dalcin {
636be10d61cSLisandro Dalcin   char           filename[PETSC_MAX_PATH_LEN];
637be10d61cSLisandro Dalcin   PetscBool      yaml;
638be10d61cSLisandro Dalcin   PetscErrorCode ierr;
639be10d61cSLisandro Dalcin 
640be10d61cSLisandro Dalcin   PetscFunctionBegin;
641be10d61cSLisandro Dalcin   ierr = PetscOptionsFilename(comm,file,filename,&yaml);CHKERRQ(ierr);
642be10d61cSLisandro Dalcin   if (yaml) {
643be10d61cSLisandro Dalcin     ierr = PetscOptionsInsertFileYAML(comm,options,filename,require);CHKERRQ(ierr);
644be10d61cSLisandro Dalcin   } else {
645be10d61cSLisandro Dalcin     ierr = PetscOptionsInsertFilePetsc(comm,options,filename,require);CHKERRQ(ierr);
646be10d61cSLisandro Dalcin   }
647be10d61cSLisandro Dalcin   PetscFunctionReturn(0);
648be10d61cSLisandro Dalcin }
649be10d61cSLisandro Dalcin 
650be10d61cSLisandro Dalcin /*@C
651d06005cbSLisandro Dalcin    PetscOptionsInsertArgs - Inserts options into the database from a array of strings
652d06005cbSLisandro Dalcin 
653d06005cbSLisandro Dalcin    Logically Collective
654d06005cbSLisandro Dalcin 
655d06005cbSLisandro Dalcin    Input Parameter:
656d06005cbSLisandro Dalcin +  options - options object
657d06005cbSLisandro Dalcin .  argc - the array lenght
658d06005cbSLisandro Dalcin -  args - the string array
659d06005cbSLisandro Dalcin 
660d06005cbSLisandro Dalcin    Level: intermediate
661d06005cbSLisandro Dalcin 
662d06005cbSLisandro Dalcin .seealso: PetscOptions, PetscOptionsInsertString(), PetscOptionsInsertFile()
663d06005cbSLisandro Dalcin @*/
664d06005cbSLisandro Dalcin PetscErrorCode PetscOptionsInsertArgs(PetscOptions options,int argc,char *args[])
66585079163SJed Brown {
666d06005cbSLisandro Dalcin   MPI_Comm       comm = PETSC_COMM_WORLD;
66785079163SJed Brown   PetscErrorCode ierr;
668d06005cbSLisandro Dalcin   int            left          = PetscMax(argc,0);
669d06005cbSLisandro Dalcin   char           *const *eargs = args;
67085079163SJed Brown 
67185079163SJed Brown   PetscFunctionBegin;
67285079163SJed Brown   while (left) {
673d06005cbSLisandro Dalcin     PetscBool isfile,isfileyaml,isstringyaml,ispush,ispop,key;
674d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(eargs[0],"-options_file",&isfile);CHKERRQ(ierr);
675d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(eargs[0],"-options_file_yaml",&isfileyaml);CHKERRQ(ierr);
676d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(eargs[0],"-options_string_yaml",&isstringyaml);CHKERRQ(ierr);
677d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(eargs[0],"-prefix_push",&ispush);CHKERRQ(ierr);
678d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(eargs[0],"-prefix_pop",&ispop);CHKERRQ(ierr);
679093de6efSBarry Smith     ierr = PetscOptionsValidKey(eargs[0],&key);CHKERRQ(ierr);
680093de6efSBarry Smith     if (!key) {
68185079163SJed Brown       eargs++; left--;
682d06005cbSLisandro Dalcin     } else if (isfile) {
683d06005cbSLisandro Dalcin       if (left <= 1 || eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option");
684d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertFile(comm,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr);
68585079163SJed Brown       eargs += 2; left -= 2;
686d06005cbSLisandro Dalcin     } else if (isfileyaml) {
687d06005cbSLisandro Dalcin       if (left <= 1 || eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file_yaml filename option");
688d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertFileYAML(comm,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr);
689d06005cbSLisandro Dalcin       eargs += 2; left -= 2;
690d06005cbSLisandro Dalcin     } else if (isstringyaml) {
691d06005cbSLisandro Dalcin       if (left <= 1 || eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing string for -options_string_yaml string option");
692d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertStringYAML(options,eargs[1]);CHKERRQ(ierr);
693d06005cbSLisandro Dalcin       eargs += 2; left -= 2;
694d06005cbSLisandro Dalcin     } else if (ispush) {
6959db968c8SJed Brown       if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option");
6969db968c8SJed Brown       if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option (prefixes cannot start with '-')");
697c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPush(options,eargs[1]);CHKERRQ(ierr);
6989db968c8SJed Brown       eargs += 2; left -= 2;
699d06005cbSLisandro Dalcin     } else if (ispop) {
700c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr);
7019db968c8SJed Brown       eargs++; left--;
7027935c3d8SJed Brown     } else {
7037935c3d8SJed Brown       PetscBool nextiskey = PETSC_FALSE;
7047935c3d8SJed Brown       if (left >= 2) {ierr = PetscOptionsValidKey(eargs[1],&nextiskey);CHKERRQ(ierr);}
70598b6bf53SJed Brown       if (left < 2 || nextiskey) {
706c5929fdfSBarry Smith         ierr = PetscOptionsSetValue(options,eargs[0],NULL);CHKERRQ(ierr);
70785079163SJed Brown         eargs++; left--;
70885079163SJed Brown       } else {
709c5929fdfSBarry Smith         ierr = PetscOptionsSetValue(options,eargs[0],eargs[1]);CHKERRQ(ierr);
71085079163SJed Brown         eargs += 2; left -= 2;
71185079163SJed Brown       }
71285079163SJed Brown     }
7137935c3d8SJed Brown   }
71485079163SJed Brown   PetscFunctionReturn(0);
71585079163SJed Brown }
71685079163SJed Brown 
717c5b5d8d5SVaclav Hapla PETSC_STATIC_INLINE PetscErrorCode PetscOptionsStringToBoolIfSet_Private(enum PetscPrecedentOption opt,const char *val[],PetscBool set[],PetscBool *flg)
718c5b5d8d5SVaclav Hapla {
719c5b5d8d5SVaclav Hapla   PetscErrorCode ierr;
720c5b5d8d5SVaclav Hapla 
721c5b5d8d5SVaclav Hapla   PetscFunctionBegin;
722c5b5d8d5SVaclav Hapla   if (set[opt]) {
723c5b5d8d5SVaclav Hapla     ierr = PetscOptionsStringToBool(val[opt],flg);CHKERRQ(ierr);
724c5b5d8d5SVaclav Hapla   } else *flg = PETSC_FALSE;
725c5b5d8d5SVaclav Hapla   PetscFunctionReturn(0);
726c5b5d8d5SVaclav Hapla }
727c5b5d8d5SVaclav Hapla 
728c5b5d8d5SVaclav Hapla /* Process options with absolute precedence */
729c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsProcessPrecedentFlags(PetscOptions options,int argc,char *args[],PetscBool *skip_petscrc,PetscBool *skip_petscrc_set)
730c5b5d8d5SVaclav Hapla {
731c5b5d8d5SVaclav Hapla   const char* const *opt = precedentOptions;
732c5b5d8d5SVaclav Hapla   const size_t      n = PO_NUM;
733c5b5d8d5SVaclav Hapla   size_t            o;
734c5b5d8d5SVaclav Hapla   int               a;
735c5b5d8d5SVaclav Hapla   const char        **val;
736c5b5d8d5SVaclav Hapla   PetscBool         *set;
737c5b5d8d5SVaclav Hapla   PetscErrorCode    ierr;
738c5b5d8d5SVaclav Hapla 
739c5b5d8d5SVaclav Hapla   PetscFunctionBegin;
740c5b5d8d5SVaclav Hapla   ierr = PetscCalloc2(n,&val,n,&set);CHKERRQ(ierr);
741c5b5d8d5SVaclav Hapla 
742c5b5d8d5SVaclav Hapla   /* Look for options possibly set using PetscOptionsSetValue beforehand */
743c5b5d8d5SVaclav Hapla   for (o=0; o<n; o++) {
744c5b5d8d5SVaclav Hapla     ierr = PetscOptionsFindPair(options,NULL,opt[o],&val[o],&set[o]);CHKERRQ(ierr);
745c5b5d8d5SVaclav Hapla   }
746c5b5d8d5SVaclav Hapla 
747c5b5d8d5SVaclav Hapla   /* Loop through all args to collect last occuring value of each option */
748c5b5d8d5SVaclav Hapla   for (a=1; a<argc; a++) {
749c5b5d8d5SVaclav Hapla     PetscBool valid, eq;
750c5b5d8d5SVaclav Hapla 
751c5b5d8d5SVaclav Hapla     ierr = PetscOptionsValidKey(args[a],&valid);CHKERRQ(ierr);
752c5b5d8d5SVaclav Hapla     if (!valid) continue;
753c5b5d8d5SVaclav Hapla     for (o=0; o<n; o++) {
754c5b5d8d5SVaclav Hapla       ierr = PetscStrcasecmp(args[a],opt[o],&eq);CHKERRQ(ierr);
755c5b5d8d5SVaclav Hapla       if (eq) {
756c5b5d8d5SVaclav Hapla         set[o] = PETSC_TRUE;
757c5b5d8d5SVaclav Hapla         if (a == argc-1 || !args[a+1] || !args[a+1][0] || args[a+1][0] == '-') val[o] = NULL;
758c5b5d8d5SVaclav Hapla         else val[o] = args[a+1];
759c5b5d8d5SVaclav Hapla         break;
760c5b5d8d5SVaclav Hapla       }
761c5b5d8d5SVaclav Hapla     }
762c5b5d8d5SVaclav Hapla   }
763c5b5d8d5SVaclav Hapla 
764c5b5d8d5SVaclav Hapla   /* Process flags */
765d314f959SVaclav Hapla   ierr = PetscStrcasecmp(val[PO_HELP], "intro", &options->help_intro);CHKERRQ(ierr);
766d314f959SVaclav Hapla   if (options->help_intro) options->help = PETSC_TRUE;
767d314f959SVaclav Hapla   else {ierr = PetscOptionsStringToBoolIfSet_Private(PO_HELP,            val,set,&options->help);CHKERRQ(ierr);}
768c5b5d8d5SVaclav Hapla   ierr = PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR_CANCEL,val,set,&options->monitorCancel);CHKERRQ(ierr);
769c5b5d8d5SVaclav Hapla   ierr = PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR,       val,set,&options->monitorFromOptions);CHKERRQ(ierr);
770c5b5d8d5SVaclav Hapla   ierr = PetscOptionsStringToBoolIfSet_Private(PO_SKIP_PETSCRC,          val,set,skip_petscrc);CHKERRQ(ierr);
771c5b5d8d5SVaclav Hapla   *skip_petscrc_set = set[PO_SKIP_PETSCRC];
772c5b5d8d5SVaclav Hapla 
773c5b5d8d5SVaclav Hapla   /* Store precedent options in database and mark them as used */
774c5b5d8d5SVaclav Hapla   for (o=0; o<n; o++) {
775c5b5d8d5SVaclav Hapla     if (set[o]) {
776d06005cbSLisandro Dalcin       ierr = PetscOptionsSetValue_Private(options,opt[o],val[o],&a);CHKERRQ(ierr);
777d06005cbSLisandro Dalcin       options->used[a] = PETSC_TRUE;
778c5b5d8d5SVaclav Hapla     }
779c5b5d8d5SVaclav Hapla   }
780c5b5d8d5SVaclav Hapla 
781c5b5d8d5SVaclav Hapla   ierr = PetscFree2(val,set);CHKERRQ(ierr);
782c5b5d8d5SVaclav Hapla   options->precedentProcessed = PETSC_TRUE;
783c5b5d8d5SVaclav Hapla   PetscFunctionReturn(0);
784c5b5d8d5SVaclav Hapla }
785c5b5d8d5SVaclav Hapla 
786c5b5d8d5SVaclav Hapla PETSC_STATIC_INLINE PetscErrorCode PetscOptionsSkipPrecedent(PetscOptions options,const char name[],PetscBool *flg)
787c5b5d8d5SVaclav Hapla {
788c5b5d8d5SVaclav Hapla   int i;
789c5b5d8d5SVaclav Hapla   PetscErrorCode ierr;
790c5b5d8d5SVaclav Hapla 
791c5b5d8d5SVaclav Hapla   *flg = PETSC_FALSE;
792c5b5d8d5SVaclav Hapla   if (options->precedentProcessed) {
793c5b5d8d5SVaclav Hapla     for (i=0; i<PO_NUM; i++) {
794c5b5d8d5SVaclav Hapla       if (!PetscOptNameCmp(precedentOptions[i],name)) {
795c5b5d8d5SVaclav Hapla         /* check if precedent option has been set already */
796d06005cbSLisandro Dalcin         ierr = PetscOptionsFindPair(options,NULL,name,NULL,flg);if (ierr) return ierr;
797c5b5d8d5SVaclav Hapla         if (*flg) break;
798c5b5d8d5SVaclav Hapla       }
799c5b5d8d5SVaclav Hapla     }
800c5b5d8d5SVaclav Hapla   }
801d06005cbSLisandro Dalcin   return 0;
802c5b5d8d5SVaclav Hapla }
80385079163SJed Brown 
804e5c89e4eSSatish Balay /*@C
805e5c89e4eSSatish Balay    PetscOptionsInsert - Inserts into the options database from the command line,
806e5c89e4eSSatish Balay                         the environmental variable and a file.
807e5c89e4eSSatish Balay 
8081c9f3c13SBarry Smith    Collective on PETSC_COMM_WORLD
8091c9f3c13SBarry Smith 
810e5c89e4eSSatish Balay    Input Parameters:
811c5929fdfSBarry Smith +  options - options database or NULL for the default global database
812c5929fdfSBarry Smith .  argc - count of number of command line arguments
813e5c89e4eSSatish Balay .  args - the command line arguments
814be10d61cSLisandro Dalcin -  file - [optional] PETSc database file, append ":yaml" to filename to specify YAML options format.
815be10d61cSLisandro Dalcin           Use NULL or empty string to not check for code specific file.
816be10d61cSLisandro Dalcin           Also checks ~/.petscrc, .petscrc and petscrc.
817c5b5d8d5SVaclav Hapla           Use -skip_petscrc in the code specific file (or command line) to skip ~/.petscrc, .petscrc and petscrc files.
818e5c89e4eSSatish Balay 
819e5c89e4eSSatish Balay    Note:
820e5c89e4eSSatish Balay    Since PetscOptionsInsert() is automatically called by PetscInitialize(),
821e5c89e4eSSatish Balay    the user does not typically need to call this routine. PetscOptionsInsert()
822e5c89e4eSSatish Balay    can be called several times, adding additional entries into the database.
823e5c89e4eSSatish Balay 
824081c24baSBoyana Norris    Options Database Keys:
825d06005cbSLisandro Dalcin +   -options_file <filename> - read options from a file
826d06005cbSLisandro Dalcin -   -options_file_yaml <filename> - read options from a YAML file
827c5b5d8d5SVaclav Hapla 
828c5b5d8d5SVaclav Hapla    See PetscInitialize() for options related to option database monitoring.
829081c24baSBoyana Norris 
830e5c89e4eSSatish Balay    Level: advanced
831e5c89e4eSSatish Balay 
8322d747510SLisandro Dalcin .seealso: PetscOptionsDestroy(), PetscOptionsView(), PetscOptionsInsertString(), PetscOptionsInsertFile(),
83396fc60bcSBarry Smith           PetscInitialize()
834e5c89e4eSSatish Balay @*/
835c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options,int *argc,char ***args,const char file[])
836e5c89e4eSSatish Balay {
837d06005cbSLisandro Dalcin   MPI_Comm       comm = PETSC_COMM_WORLD;
838e5c89e4eSSatish Balay   PetscErrorCode ierr;
839e5c89e4eSSatish Balay   PetscMPIInt    rank;
840c5b5d8d5SVaclav Hapla   PetscBool      hasArgs = (argc && *argc) ? PETSC_TRUE : PETSC_FALSE;
841c5b5d8d5SVaclav Hapla   PetscBool      skipPetscrc = PETSC_FALSE, skipPetscrcSet = PETSC_FALSE;
842e5c89e4eSSatish Balay 
843e5c89e4eSSatish Balay   PetscFunctionBegin;
844d06005cbSLisandro Dalcin   if (hasArgs && !(args && *args)) SETERRQ(comm,PETSC_ERR_ARG_NULL,"*argc > 1 but *args not given");
845d06005cbSLisandro Dalcin   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
846e5c89e4eSSatish Balay 
847c5b5d8d5SVaclav Hapla   if (!options) {
848c5b5d8d5SVaclav Hapla     ierr = PetscOptionsCreateDefault();CHKERRQ(ierr);
849c5b5d8d5SVaclav Hapla     options = defaultoptions;
850c5b5d8d5SVaclav Hapla   }
851c5b5d8d5SVaclav Hapla   if (hasArgs) {
852c5b5d8d5SVaclav Hapla     /* process options with absolute precedence */
853c5b5d8d5SVaclav Hapla     ierr = PetscOptionsProcessPrecedentFlags(options,*argc,*args,&skipPetscrc,&skipPetscrcSet);CHKERRQ(ierr);
854c5b5d8d5SVaclav Hapla   }
8554b09e917SBarry Smith   if (file && file[0]) {
856be10d61cSLisandro Dalcin     ierr = PetscOptionsInsertFile(comm,options,file,PETSC_TRUE);CHKERRQ(ierr);
857c5b5d8d5SVaclav Hapla     /* if -skip_petscrc has not been set from command line, check whether it has been set in the file */
858c5b5d8d5SVaclav Hapla     if (!skipPetscrcSet) {ierr = PetscOptionsGetBool(options,NULL,"-skip_petscrc",&skipPetscrc,NULL);CHKERRQ(ierr);}
859321366bcSBarry Smith   }
860c5b5d8d5SVaclav Hapla   if (!skipPetscrc) {
861be10d61cSLisandro Dalcin     char filename[PETSC_MAX_PATH_LEN];
862be10d61cSLisandro Dalcin     ierr = PetscGetHomeDirectory(filename,sizeof(filename));CHKERRQ(ierr);
863be10d61cSLisandro Dalcin     ierr = MPI_Bcast(filename,(int)sizeof(filename),MPI_CHAR,0,comm);CHKERRMPI(ierr);
8642d747510SLisandro Dalcin     if (filename[0]) {ierr = PetscStrcat(filename,"/.petscrc");CHKERRQ(ierr);}
865d06005cbSLisandro Dalcin     ierr = PetscOptionsInsertFile(comm,options,filename,PETSC_FALSE);CHKERRQ(ierr);
866d06005cbSLisandro Dalcin     ierr = PetscOptionsInsertFile(comm,options,".petscrc",PETSC_FALSE);CHKERRQ(ierr);
867d06005cbSLisandro Dalcin     ierr = PetscOptionsInsertFile(comm,options,"petscrc",PETSC_FALSE);CHKERRQ(ierr);
868e5c89e4eSSatish Balay   }
869e5c89e4eSSatish Balay 
8702d747510SLisandro Dalcin   /* insert environment options */
871e5c89e4eSSatish Balay   {
8722d747510SLisandro Dalcin     char   *eoptions = NULL;
873e5c89e4eSSatish Balay     size_t len       = 0;
874e5c89e4eSSatish Balay     if (!rank) {
875e5c89e4eSSatish Balay       eoptions = (char*)getenv("PETSC_OPTIONS");
876e5c89e4eSSatish Balay       ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr);
877e5c89e4eSSatish Balay     }
878be10d61cSLisandro Dalcin     ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,comm);CHKERRMPI(ierr);
879e5c89e4eSSatish Balay     if (len) {
880d06005cbSLisandro Dalcin       if (rank) {ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr);}
881d06005cbSLisandro Dalcin       ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,comm);CHKERRMPI(ierr);
88296fc60bcSBarry Smith       if (rank) eoptions[len] = 0;
883c5929fdfSBarry Smith       ierr = PetscOptionsInsertString(options,eoptions);CHKERRQ(ierr);
884e5c89e4eSSatish Balay       if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);}
885e5c89e4eSSatish Balay     }
886e5c89e4eSSatish Balay   }
887e5c89e4eSSatish Balay 
888d06005cbSLisandro Dalcin   /* insert YAML environment options */
88956a31166SBarry Smith   {
8909fc438c3SToby Isaac     char   *eoptions = NULL;
8919fc438c3SToby Isaac     size_t len       = 0;
8929fc438c3SToby Isaac     if (!rank) {
8939fc438c3SToby Isaac       eoptions = (char*)getenv("PETSC_OPTIONS_YAML");
8949fc438c3SToby Isaac       ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr);
8959fc438c3SToby Isaac     }
896be10d61cSLisandro Dalcin     ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,comm);CHKERRMPI(ierr);
8979fc438c3SToby Isaac     if (len) {
898d06005cbSLisandro Dalcin       if (rank) {ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr);}
899d06005cbSLisandro Dalcin       ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,comm);CHKERRMPI(ierr);
9009fc438c3SToby Isaac       if (rank) eoptions[len] = 0;
9019fc438c3SToby Isaac       ierr = PetscOptionsInsertStringYAML(options,eoptions);CHKERRQ(ierr);
9029fc438c3SToby Isaac       if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);}
9039fc438c3SToby Isaac     }
9049fc438c3SToby Isaac   }
9053bcbd388SSean Farley 
906c5b5d8d5SVaclav Hapla   /* insert command line options here because they take precedence over arguments in petscrc/environment */
907d06005cbSLisandro Dalcin   if (hasArgs) {ierr = PetscOptionsInsertArgs(options,*argc-1,*args+1);CHKERRQ(ierr);}
908e5c89e4eSSatish Balay   PetscFunctionReturn(0);
909e5c89e4eSSatish Balay }
910e5c89e4eSSatish Balay 
911e5c89e4eSSatish Balay /*@C
91288c29154SBarry Smith    PetscOptionsView - Prints the options that have been loaded. This is
913e5c89e4eSSatish Balay    useful for debugging purposes.
914e5c89e4eSSatish Balay 
915c139c21fSBarry Smith    Logically Collective on PetscViewer
916e5c89e4eSSatish Balay 
917e5c89e4eSSatish Balay    Input Parameter:
918a2b725a8SWilliam Gropp +  options - options database, use NULL for default global database
919a2b725a8SWilliam Gropp -  viewer - must be an PETSCVIEWERASCII viewer
920e5c89e4eSSatish Balay 
921e5c89e4eSSatish Balay    Options Database Key:
92226a7e8d4SBarry Smith .  -options_view - Activates PetscOptionsView() within PetscFinalize()
923e5c89e4eSSatish Balay 
9249666a313SBarry Smith    Notes:
9259666a313SBarry Smith    Only the rank zero process of MPI_Comm used to create view prints the option values. Other processes
9261c9f3c13SBarry Smith    may have different values but they are not printed.
9271c9f3c13SBarry Smith 
928e5c89e4eSSatish Balay    Level: advanced
929e5c89e4eSSatish Balay 
930e5c89e4eSSatish Balay .seealso: PetscOptionsAllUsed()
931e5c89e4eSSatish Balay @*/
932c5929fdfSBarry Smith PetscErrorCode PetscOptionsView(PetscOptions options,PetscViewer viewer)
933e5c89e4eSSatish Balay {
934e5c89e4eSSatish Balay   PetscErrorCode ierr;
935431c96f7SBarry Smith   PetscInt       i;
93688c29154SBarry Smith   PetscBool      isascii;
937e5c89e4eSSatish Balay 
938e5c89e4eSSatish Balay   PetscFunctionBegin;
9392d747510SLisandro Dalcin   if (viewer) PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
940c5929fdfSBarry Smith   options = options ? options : defaultoptions;
94188c29154SBarry Smith   if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD;
942251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
943ce94432eSBarry Smith   if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer");
94488c29154SBarry Smith 
9452d747510SLisandro Dalcin   if (!options->N) {
94688c29154SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"#No PETSc Option Table entries\n");CHKERRQ(ierr);
9472d747510SLisandro Dalcin     PetscFunctionReturn(0);
94830694fe9SBarry Smith   }
9492d747510SLisandro Dalcin 
9502d747510SLisandro Dalcin   ierr = PetscViewerASCIIPrintf(viewer,"#PETSc Option Table entries:\n");CHKERRQ(ierr);
951e5c89e4eSSatish Balay   for (i=0; i<options->N; i++) {
952e5c89e4eSSatish Balay     if (options->values[i]) {
95388c29154SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"-%s %s\n",options->names[i],options->values[i]);CHKERRQ(ierr);
954e5c89e4eSSatish Balay     } else {
95588c29154SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"-%s\n",options->names[i]);CHKERRQ(ierr);
956e5c89e4eSSatish Balay     }
957e5c89e4eSSatish Balay   }
95888c29154SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"#End of PETSc Option Table entries\n");CHKERRQ(ierr);
959e5c89e4eSSatish Balay   PetscFunctionReturn(0);
960e5c89e4eSSatish Balay }
961e5c89e4eSSatish Balay 
962e11779c2SBarry Smith /*
963e11779c2SBarry Smith    Called by error handlers to print options used in run
964e11779c2SBarry Smith */
96595c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void)
966e11779c2SBarry Smith {
967e11779c2SBarry Smith   PetscInt     i;
9684416b707SBarry Smith   PetscOptions options = defaultoptions;
969e11779c2SBarry Smith 
970e11779c2SBarry Smith   PetscFunctionBegin;
971e11779c2SBarry Smith   if (options->N) {
972e11779c2SBarry Smith     (*PetscErrorPrintf)("PETSc Option Table entries:\n");
973e11779c2SBarry Smith   } else {
974e11779c2SBarry Smith     (*PetscErrorPrintf)("No PETSc Option Table entries\n");
975e11779c2SBarry Smith   }
976e11779c2SBarry Smith   for (i=0; i<options->N; i++) {
977e11779c2SBarry Smith     if (options->values[i]) {
978e11779c2SBarry Smith       (*PetscErrorPrintf)("-%s %s\n",options->names[i],options->values[i]);
979e11779c2SBarry Smith     } else {
980e11779c2SBarry Smith       (*PetscErrorPrintf)("-%s\n",options->names[i]);
981e11779c2SBarry Smith     }
982e11779c2SBarry Smith   }
983e11779c2SBarry Smith   PetscFunctionReturn(0);
984e11779c2SBarry Smith }
985e11779c2SBarry Smith 
986e5c89e4eSSatish Balay /*@C
98774e0666dSJed Brown    PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow.
98874e0666dSJed Brown 
9891c9f3c13SBarry Smith    Logically Collective
99074e0666dSJed Brown 
9919db968c8SJed Brown    Input Parameter:
992c5929fdfSBarry Smith +  options - options database, or NULL for the default global database
993c5929fdfSBarry Smith -  prefix - The string to append to the existing prefix
9949db968c8SJed Brown 
9959db968c8SJed Brown    Options Database Keys:
9969db968c8SJed Brown +   -prefix_push <some_prefix_> - push the given prefix
9979db968c8SJed Brown -   -prefix_pop - pop the last prefix
9989db968c8SJed Brown 
9999db968c8SJed Brown    Notes:
10009db968c8SJed Brown    It is common to use this in conjunction with -options_file as in
10019db968c8SJed Brown 
10029db968c8SJed Brown $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop
10039db968c8SJed Brown 
10049db968c8SJed Brown    where the files no longer require all options to be prefixed with -system2_.
100574e0666dSJed Brown 
10069666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
10071c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
10081c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
10091c9f3c13SBarry Smith    on different ranks.
10101c9f3c13SBarry Smith 
101174e0666dSJed Brown Level: advanced
101274e0666dSJed Brown 
10131c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPop(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue()
101474e0666dSJed Brown @*/
1015c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPush(PetscOptions options,const char prefix[])
101674e0666dSJed Brown {
101774e0666dSJed Brown   PetscErrorCode ierr;
101874e0666dSJed Brown   size_t         n;
101974e0666dSJed Brown   PetscInt       start;
10202d747510SLisandro Dalcin   char           key[MAXOPTNAME+1];
10212d747510SLisandro Dalcin   PetscBool      valid;
102274e0666dSJed Brown 
102374e0666dSJed Brown   PetscFunctionBegin;
10249db968c8SJed Brown   PetscValidCharPointer(prefix,1);
1025c5929fdfSBarry Smith   options = options ? options : defaultoptions;
102674e0666dSJed Brown   if (options->prefixind >= MAXPREFIXES) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum depth of prefix stack %d exceeded, recompile \n src/sys/objects/options.c with larger value for MAXPREFIXES",MAXPREFIXES);
10272d747510SLisandro Dalcin   key[0] = '-'; /* keys must start with '-' */
10282d747510SLisandro Dalcin   ierr = PetscStrncpy(key+1,prefix,sizeof(key)-1);CHKERRQ(ierr);
10292d747510SLisandro Dalcin   ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr);
10308bf569ecSLisandro 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 */
10318bf569ecSLisandro Dalcin   if (!valid) SETERRQ2(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":"");
103274e0666dSJed Brown   start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0;
103374e0666dSJed Brown   ierr = PetscStrlen(prefix,&n);CHKERRQ(ierr);
103474e0666dSJed Brown   if (n+1 > sizeof(options->prefix)-start) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %d exceeded",sizeof(options->prefix));
1035580bdb30SBarry Smith   ierr = PetscArraycpy(options->prefix+start,prefix,n+1);CHKERRQ(ierr);
103674e0666dSJed Brown   options->prefixstack[options->prefixind++] = start+n;
103774e0666dSJed Brown   PetscFunctionReturn(0);
103874e0666dSJed Brown }
103974e0666dSJed Brown 
1040c5929fdfSBarry Smith /*@C
104174e0666dSJed Brown    PetscOptionsPrefixPop - Remove the latest options prefix, see PetscOptionsPrefixPush() for details
104274e0666dSJed Brown 
10431c9f3c13SBarry Smith    Logically Collective on the MPI_Comm that called PetscOptionsPrefixPush()
104474e0666dSJed Brown 
1045c5929fdfSBarry Smith   Input Parameters:
1046c5929fdfSBarry Smith .  options - options database, or NULL for the default global database
1047c5929fdfSBarry Smith 
104874e0666dSJed Brown    Level: advanced
104974e0666dSJed Brown 
10501c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPush(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue()
105174e0666dSJed Brown @*/
1052c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPop(PetscOptions options)
105374e0666dSJed Brown {
105474e0666dSJed Brown   PetscInt offset;
105574e0666dSJed Brown 
105674e0666dSJed Brown   PetscFunctionBegin;
1057c5929fdfSBarry Smith   options = options ? options : defaultoptions;
105874e0666dSJed Brown   if (options->prefixind < 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More prefixes popped than pushed");
105974e0666dSJed Brown   options->prefixind--;
106074e0666dSJed Brown   offset = options->prefixind ? options->prefixstack[options->prefixind-1] : 0;
106174e0666dSJed Brown   options->prefix[offset] = 0;
106274e0666dSJed Brown   PetscFunctionReturn(0);
106374e0666dSJed Brown }
106474e0666dSJed Brown 
1065a542b6e8SBarry Smith /*@C
1066a542b6e8SBarry Smith     PetscOptionsClear - Removes all options form the database leaving it empty.
1067a542b6e8SBarry Smith 
10681c9f3c13SBarry Smith     Logically Collective
10691c9f3c13SBarry Smith 
1070c5929fdfSBarry Smith   Input Parameters:
1071c5929fdfSBarry Smith .  options - options database, use NULL for the default global database
1072c5929fdfSBarry Smith 
10739666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
10741c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
10751c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
10761c9f3c13SBarry Smith    on different ranks.
10771c9f3c13SBarry Smith 
1078a542b6e8SBarry Smith    Level: developer
1079a542b6e8SBarry Smith 
1080a542b6e8SBarry Smith .seealso: PetscOptionsInsert()
1081a542b6e8SBarry Smith @*/
1082c5929fdfSBarry Smith PetscErrorCode PetscOptionsClear(PetscOptions options)
1083a542b6e8SBarry Smith {
1084a542b6e8SBarry Smith   PetscInt i;
1085a542b6e8SBarry Smith 
1086c5929fdfSBarry Smith   options = options ? options : defaultoptions;
10872d747510SLisandro Dalcin   if (!options) return 0;
10882d747510SLisandro Dalcin 
1089a542b6e8SBarry Smith   for (i=0; i<options->N; i++) {
1090a542b6e8SBarry Smith     if (options->names[i])  free(options->names[i]);
1091a542b6e8SBarry Smith     if (options->values[i]) free(options->values[i]);
1092a542b6e8SBarry Smith   }
10932d747510SLisandro Dalcin   options->N = 0;
10942d747510SLisandro Dalcin 
1095a542b6e8SBarry Smith   for (i=0; i<options->Naliases; i++) {
1096a542b6e8SBarry Smith     free(options->aliases1[i]);
1097a542b6e8SBarry Smith     free(options->aliases2[i]);
1098a542b6e8SBarry Smith   }
1099a542b6e8SBarry Smith   options->Naliases = 0;
1100a542b6e8SBarry Smith 
11012d747510SLisandro Dalcin   /* destroy hash table */
11022d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
11032d747510SLisandro Dalcin   options->ht = NULL;
11040eb63584SBarry Smith 
11052d747510SLisandro Dalcin   options->prefixind = 0;
11062d747510SLisandro Dalcin   options->prefix[0] = 0;
11072d747510SLisandro Dalcin   options->help      = PETSC_FALSE;
11084416b707SBarry Smith   return 0;
11094416b707SBarry Smith }
11104416b707SBarry Smith 
11112d747510SLisandro Dalcin /*@C
11122d747510SLisandro Dalcin    PetscOptionsSetAlias - Makes a key and alias for another key
11132d747510SLisandro Dalcin 
11141c9f3c13SBarry Smith    Logically Collective
11152d747510SLisandro Dalcin 
11162d747510SLisandro Dalcin    Input Parameters:
11172d747510SLisandro Dalcin +  options - options database, or NULL for default global database
11182d747510SLisandro Dalcin .  newname - the alias
11192d747510SLisandro Dalcin -  oldname - the name that alias will refer to
11202d747510SLisandro Dalcin 
11212d747510SLisandro Dalcin    Level: advanced
11222d747510SLisandro Dalcin 
11239666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
11241c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
11251c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
11261c9f3c13SBarry Smith    on different ranks.
11271c9f3c13SBarry Smith 
11282d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(),
11292d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(),
11302d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
11312d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
11322d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
11332d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
11342d747510SLisandro Dalcin @*/
11352d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[])
11362d747510SLisandro Dalcin {
11372d747510SLisandro Dalcin   PetscInt       n;
11382d747510SLisandro Dalcin   size_t         len;
11399210b8eaSVaclav Hapla   PetscBool      valid;
11402d747510SLisandro Dalcin   PetscErrorCode ierr;
11412d747510SLisandro Dalcin 
11422d747510SLisandro Dalcin   PetscFunctionBegin;
11432d747510SLisandro Dalcin   PetscValidCharPointer(newname,2);
11442d747510SLisandro Dalcin   PetscValidCharPointer(oldname,3);
11452d747510SLisandro Dalcin   options = options ? options : defaultoptions;
11469210b8eaSVaclav Hapla   ierr = PetscOptionsValidKey(newname,&valid);CHKERRQ(ierr);
11479210b8eaSVaclav Hapla   if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliased option %s",newname);
11489210b8eaSVaclav Hapla   ierr = PetscOptionsValidKey(oldname,&valid);CHKERRQ(ierr);
11499210b8eaSVaclav Hapla   if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliasee option %s",oldname);
11502d747510SLisandro Dalcin 
11512d747510SLisandro Dalcin   n = options->Naliases;
11522d747510SLisandro Dalcin   if (n >= MAXALIASES) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MEM,"You have defined to many PETSc options aliases, limit %d recompile \n  src/sys/objects/options.c with larger value for MAXALIASES",MAXALIASES);
11532d747510SLisandro Dalcin 
11542d747510SLisandro Dalcin   newname++; oldname++;
11552d747510SLisandro Dalcin   ierr = PetscStrlen(newname,&len);CHKERRQ(ierr);
11562d747510SLisandro Dalcin   options->aliases1[n] = (char*)malloc((len+1)*sizeof(char));
11572d747510SLisandro Dalcin   ierr = PetscStrcpy(options->aliases1[n],newname);CHKERRQ(ierr);
11582d747510SLisandro Dalcin   ierr = PetscStrlen(oldname,&len);CHKERRQ(ierr);
11592d747510SLisandro Dalcin   options->aliases2[n] = (char*)malloc((len+1)*sizeof(char));
11602d747510SLisandro Dalcin   ierr = PetscStrcpy(options->aliases2[n],oldname);CHKERRQ(ierr);
11612d747510SLisandro Dalcin   options->Naliases++;
11622d747510SLisandro Dalcin   PetscFunctionReturn(0);
11632d747510SLisandro Dalcin }
11644416b707SBarry Smith 
1165e5c89e4eSSatish Balay /*@C
1166e5c89e4eSSatish Balay    PetscOptionsSetValue - Sets an option name-value pair in the options
1167e5c89e4eSSatish Balay    database, overriding whatever is already present.
1168e5c89e4eSSatish Balay 
11691c9f3c13SBarry Smith    Logically Collective
1170e5c89e4eSSatish Balay 
1171e5c89e4eSSatish Balay    Input Parameters:
1172c5929fdfSBarry Smith +  options - options database, use NULL for the default global database
1173c5929fdfSBarry Smith .  name - name of option, this SHOULD have the - prepended
11742d747510SLisandro Dalcin -  value - the option value (not used for all options, so can be NULL)
1175e5c89e4eSSatish Balay 
1176e5c89e4eSSatish Balay    Level: intermediate
1177e5c89e4eSSatish Balay 
1178e5c89e4eSSatish Balay    Note:
1179d49172ceSBarry Smith    This function can be called BEFORE PetscInitialize()
1180d49172ceSBarry Smith 
11819666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
11821c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
11831c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
11841c9f3c13SBarry Smith    on different ranks.
11851c9f3c13SBarry Smith 
11862d747510SLisandro Dalcin    Developers Note: Uses malloc() directly because PETSc may not be initialized yet.
1187b0250c70SBarry Smith 
11882d747510SLisandro Dalcin .seealso: PetscOptionsInsert(), PetscOptionsClearValue()
1189e5c89e4eSSatish Balay @*/
11902d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetValue(PetscOptions options,const char name[],const char value[])
1191e5c89e4eSSatish Balay {
1192c5b5d8d5SVaclav Hapla   return PetscOptionsSetValue_Private(options,name,value,NULL);
1193c5b5d8d5SVaclav Hapla }
1194c5b5d8d5SVaclav Hapla 
1195c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsSetValue_Private(PetscOptions options,const char name[],const char value[],int *pos)
1196c5b5d8d5SVaclav Hapla {
1197e5c89e4eSSatish Balay   size_t         len;
11982d747510SLisandro Dalcin   int            N,n,i;
1199e5c89e4eSSatish Balay   char           **names;
12002d747510SLisandro Dalcin   char           fullname[MAXOPTNAME] = "";
1201c5b5d8d5SVaclav Hapla   PetscBool      flg;
12022d747510SLisandro Dalcin   PetscErrorCode ierr;
1203e5c89e4eSSatish Balay 
12047272c0d2SVaclav Hapla   if (!options) {
12052d747510SLisandro Dalcin     ierr = PetscOptionsCreateDefault();if (ierr) return ierr;
12067272c0d2SVaclav Hapla     options = defaultoptions;
1207c5929fdfSBarry Smith   }
12082d747510SLisandro Dalcin 
12092d747510SLisandro Dalcin   if (name[0] != '-') return PETSC_ERR_ARG_OUTOFRANGE;
1210e5c89e4eSSatish Balay 
1211d06005cbSLisandro Dalcin   ierr = PetscOptionsSkipPrecedent(options,name,&flg);if (ierr) return ierr;
1212c5b5d8d5SVaclav Hapla   if (flg) return 0;
1213e5c89e4eSSatish Balay 
12142d747510SLisandro Dalcin   name++; /* skip starting dash */
12152d747510SLisandro Dalcin 
121674e0666dSJed Brown   if (options->prefixind > 0) {
1217d49172ceSBarry Smith     strncpy(fullname,options->prefix,sizeof(fullname));
12182d747510SLisandro Dalcin     fullname[sizeof(fullname)-1] = 0;
121989ae1891SBarry Smith     strncat(fullname,name,sizeof(fullname)-strlen(fullname)-1);
12202d747510SLisandro Dalcin     fullname[sizeof(fullname)-1] = 0;
122174e0666dSJed Brown     name = fullname;
122274e0666dSJed Brown   }
122374e0666dSJed Brown 
122474e0666dSJed Brown   /* check against aliases */
1225e5c89e4eSSatish Balay   N = options->Naliases;
1226e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
12272d747510SLisandro Dalcin     int result = PetscOptNameCmp(options->aliases1[i],name);
12282d747510SLisandro Dalcin     if (!result) { name = options->aliases2[i]; break; }
1229e5c89e4eSSatish Balay   }
1230e5c89e4eSSatish Balay 
12312d747510SLisandro Dalcin   /* slow search */
12322d747510SLisandro Dalcin   N = n = options->N;
1233e5c89e4eSSatish Balay   names = options->names;
1234e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
12352d747510SLisandro Dalcin     int result = PetscOptNameCmp(names[i],name);
12362d747510SLisandro Dalcin     if (!result) {
12372d747510SLisandro Dalcin       n = i; goto setvalue;
12382d747510SLisandro Dalcin     } else if (result > 0) {
12392d747510SLisandro Dalcin       n = i; break;
1240e5c89e4eSSatish Balay     }
1241e5c89e4eSSatish Balay   }
12422d747510SLisandro Dalcin   if (N >= MAXOPTIONS) return PETSC_ERR_MEM;
12432d747510SLisandro Dalcin   /* shift remaining values up 1 */
1244e5c89e4eSSatish Balay   for (i=N; i>n; i--) {
12455e8c5e88SLisandro Dalcin     options->names[i]  = options->names[i-1];
1246e5c89e4eSSatish Balay     options->values[i] = options->values[i-1];
1247e5c89e4eSSatish Balay     options->used[i]   = options->used[i-1];
1248e5c89e4eSSatish Balay   }
12492d747510SLisandro Dalcin   options->names[n]  = NULL;
12502d747510SLisandro Dalcin   options->values[n] = NULL;
12512d747510SLisandro Dalcin   options->used[n]   = PETSC_FALSE;
12522d747510SLisandro Dalcin   options->N++;
12532d747510SLisandro Dalcin 
12542d747510SLisandro Dalcin   /* destroy hash table */
12552d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
12562d747510SLisandro Dalcin   options->ht = NULL;
12572d747510SLisandro Dalcin 
12582d747510SLisandro Dalcin   /* set new name */
125970d8d27cSBarry Smith   len = strlen(name);
12605e8c5e88SLisandro Dalcin   options->names[n] = (char*)malloc((len+1)*sizeof(char));
1261d49172ceSBarry Smith   if (!options->names[n]) return PETSC_ERR_MEM;
1262d49172ceSBarry Smith   strcpy(options->names[n],name);
12632d747510SLisandro Dalcin 
12642d747510SLisandro Dalcin setvalue:
12652d747510SLisandro Dalcin   /* set new value */
12662d747510SLisandro Dalcin   if (options->values[n]) free(options->values[n]);
1267d49172ceSBarry Smith   len = value ? strlen(value) : 0;
12685e8c5e88SLisandro Dalcin   if (len) {
1269e5c89e4eSSatish Balay     options->values[n] = (char*)malloc((len+1)*sizeof(char));
1270d49172ceSBarry Smith     if (!options->values[n]) return PETSC_ERR_MEM;
1271d49172ceSBarry Smith     strcpy(options->values[n],value);
12722d747510SLisandro Dalcin   } else {
12732d747510SLisandro Dalcin     options->values[n] = NULL;
12742d747510SLisandro Dalcin   }
12752d747510SLisandro Dalcin 
127691ad3481SVaclav Hapla   /* handle -help so that it can be set from anywhere */
127791ad3481SVaclav Hapla   if (!PetscOptNameCmp(name,"help")) {
127891ad3481SVaclav Hapla     options->help = PETSC_TRUE;
1279d06005cbSLisandro Dalcin     options->help_intro = (value && !PetscOptNameCmp(value,"intro")) ? PETSC_TRUE : PETSC_FALSE;
128091ad3481SVaclav Hapla     options->used[n] = PETSC_TRUE;
128191ad3481SVaclav Hapla   }
128291ad3481SVaclav Hapla 
1283c5b5d8d5SVaclav Hapla   if (PetscErrorHandlingInitialized) {
1284c5b5d8d5SVaclav Hapla     ierr = PetscOptionsMonitor(options,name,value);CHKERRQ(ierr);
1285c5b5d8d5SVaclav Hapla   }
1286c5b5d8d5SVaclav Hapla   if (pos) *pos = n;
1287d49172ceSBarry Smith   return 0;
1288e5c89e4eSSatish Balay }
1289e5c89e4eSSatish Balay 
1290e5c89e4eSSatish Balay /*@C
1291e5c89e4eSSatish Balay    PetscOptionsClearValue - Clears an option name-value pair in the options
1292e5c89e4eSSatish Balay    database, overriding whatever is already present.
1293e5c89e4eSSatish Balay 
12941c9f3c13SBarry Smith    Logically Collective
1295e5c89e4eSSatish Balay 
1296e5c89e4eSSatish Balay    Input Parameter:
1297c5929fdfSBarry Smith +  options - options database, use NULL for the default global database
1298a2b725a8SWilliam Gropp -  name - name of option, this SHOULD have the - prepended
1299e5c89e4eSSatish Balay 
1300e5c89e4eSSatish Balay    Level: intermediate
1301e5c89e4eSSatish Balay 
13029666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
13031c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
13041c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
13051c9f3c13SBarry Smith    on different ranks.
13061c9f3c13SBarry Smith 
1307e5c89e4eSSatish Balay .seealso: PetscOptionsInsert()
1308e5c89e4eSSatish Balay @*/
13092d747510SLisandro Dalcin PetscErrorCode PetscOptionsClearValue(PetscOptions options,const char name[])
1310e5c89e4eSSatish Balay {
13112d747510SLisandro Dalcin   int            N,n,i;
13122d747510SLisandro Dalcin   char           **names;
1313e5c89e4eSSatish Balay   PetscErrorCode ierr;
1314e5c89e4eSSatish Balay 
1315e5c89e4eSSatish Balay   PetscFunctionBegin;
1316c5929fdfSBarry Smith   options = options ? options : defaultoptions;
13172d747510SLisandro Dalcin   if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1318c9dcd962SLisandro Dalcin   if (!PetscOptNameCmp(name,"-help")) options->help = options->help_intro = PETSC_FALSE;
13192d747510SLisandro Dalcin 
13202d747510SLisandro Dalcin   name++; /* skip starting dash */
13212d747510SLisandro Dalcin 
13222d747510SLisandro Dalcin   /* slow search */
13232d747510SLisandro Dalcin   N = n = options->N;
1324e5c89e4eSSatish Balay   names = options->names;
1325e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
13262d747510SLisandro Dalcin     int result = PetscOptNameCmp(names[i],name);
13272d747510SLisandro Dalcin     if (!result) {
13282d747510SLisandro Dalcin       n = i; break;
13292d747510SLisandro Dalcin     } else if (result > 0) {
13302d747510SLisandro Dalcin       n = N; break;
1331e5c89e4eSSatish Balay     }
13322d747510SLisandro Dalcin   }
13332d747510SLisandro Dalcin   if (n == N) PetscFunctionReturn(0); /* it was not present */
1334e5c89e4eSSatish Balay 
13352d747510SLisandro Dalcin   /* remove name and value */
13362d747510SLisandro Dalcin   if (options->names[n])  free(options->names[n]);
13372d747510SLisandro Dalcin   if (options->values[n]) free(options->values[n]);
1338e5c89e4eSSatish Balay   /* shift remaining values down 1 */
1339e5c89e4eSSatish Balay   for (i=n; i<N-1; i++) {
13405e8c5e88SLisandro Dalcin     options->names[i]  = options->names[i+1];
1341e5c89e4eSSatish Balay     options->values[i] = options->values[i+1];
1342e5c89e4eSSatish Balay     options->used[i]   = options->used[i+1];
1343e5c89e4eSSatish Balay   }
1344e5c89e4eSSatish Balay   options->N--;
13452d747510SLisandro Dalcin 
13462d747510SLisandro Dalcin   /* destroy hash table */
13472d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
13482d747510SLisandro Dalcin   options->ht = NULL;
13492d747510SLisandro Dalcin 
13502d747510SLisandro Dalcin   ierr = PetscOptionsMonitor(options,name,NULL);CHKERRQ(ierr);
1351e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1352e5c89e4eSSatish Balay }
1353e5c89e4eSSatish Balay 
1354e5c89e4eSSatish Balay /*@C
13552d747510SLisandro Dalcin    PetscOptionsFindPair - Gets an option name-value pair from the options database.
1356e5c89e4eSSatish Balay 
13572d747510SLisandro Dalcin    Not Collective
1358e5c89e4eSSatish Balay 
1359e5c89e4eSSatish Balay    Input Parameters:
13602d747510SLisandro Dalcin +  options - options database, use NULL for the default global database
13612d747510SLisandro Dalcin .  pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended
13622d747510SLisandro Dalcin -  name - name of option, this SHOULD have the "-" prepended
1363e5c89e4eSSatish Balay 
13642d747510SLisandro Dalcin    Output Parameters:
13652d747510SLisandro Dalcin +  value - the option value (optional, not used for all options)
13662d747510SLisandro Dalcin -  set - whether the option is set (optional)
1367e5c89e4eSSatish Balay 
13689666a313SBarry Smith    Notes:
13699666a313SBarry Smith    Each process may find different values or no value depending on how options were inserted into the database
13701c9f3c13SBarry Smith 
13712d747510SLisandro Dalcin    Level: developer
13722d747510SLisandro Dalcin 
13732d747510SLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsClearValue()
1374e5c89e4eSSatish Balay @*/
13752d747510SLisandro Dalcin PetscErrorCode PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char *value[],PetscBool *set)
1376e5c89e4eSSatish Balay {
13772d747510SLisandro Dalcin   char           buf[MAXOPTNAME];
1378daabea38SBarry Smith   PetscBool      usehashtable = PETSC_TRUE;
13792d747510SLisandro Dalcin   PetscBool      matchnumbers = PETSC_TRUE;
1380e5c89e4eSSatish Balay   PetscErrorCode ierr;
1381e5c89e4eSSatish Balay 
1382e5c89e4eSSatish Balay   PetscFunctionBegin;
1383c5929fdfSBarry Smith   options = options ? options : defaultoptions;
13842d747510SLisandro Dalcin   if (pre && PetscUnlikely(pre[0] == '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre);
13852d747510SLisandro Dalcin   if (PetscUnlikely(name[0] != '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1386e5c89e4eSSatish Balay 
13872d747510SLisandro Dalcin   name++; /* skip starting dash */
1388e5c89e4eSSatish Balay 
13897cd08cecSJed Brown   /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */
13902d747510SLisandro Dalcin   if (pre && pre[0]) {
13912d747510SLisandro Dalcin     char *ptr = buf;
13922d747510SLisandro Dalcin     if (name[0] == '-') { *ptr++ = '-';  name++; }
13932d747510SLisandro Dalcin     ierr = PetscStrncpy(ptr,pre,buf+sizeof(buf)-ptr);CHKERRQ(ierr);
13942d747510SLisandro Dalcin     ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr);
13952d747510SLisandro Dalcin     name = buf;
13967cd08cecSJed Brown   }
13972d747510SLisandro Dalcin 
139876bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
13992f828895SJed Brown     PetscBool valid;
14002d747510SLisandro Dalcin     char      key[MAXOPTNAME+1] = "-";
14012d747510SLisandro Dalcin     ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr);
14022f828895SJed Brown     ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr);
14032f828895SJed Brown     if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid option '%s' obtained from pre='%s' and name='%s'",key,pre?pre:"",name);
14042f828895SJed Brown   }
1405e5c89e4eSSatish Balay 
14062d747510SLisandro Dalcin   if (!options->ht && usehashtable) {
14072d747510SLisandro Dalcin     int i,ret;
14082d747510SLisandro Dalcin     khiter_t it;
14092d747510SLisandro Dalcin     khash_t(HO) *ht;
14102d747510SLisandro Dalcin     ht = kh_init(HO);
14112d747510SLisandro Dalcin     if (PetscUnlikely(!ht)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
14122d747510SLisandro Dalcin     ret = kh_resize(HO,ht,options->N*2); /* twice the required size to reduce risk of collisions */
14132d747510SLisandro Dalcin     if (PetscUnlikely(ret)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
14142d747510SLisandro Dalcin     for (i=0; i<options->N; i++) {
14152d747510SLisandro Dalcin       it = kh_put(HO,ht,options->names[i],&ret);
14162d747510SLisandro Dalcin       if (PetscUnlikely(ret != 1)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
14172d747510SLisandro Dalcin       kh_val(ht,it) = i;
14182d747510SLisandro Dalcin     }
14192d747510SLisandro Dalcin     options->ht = ht;
14202d747510SLisandro Dalcin   }
14212d747510SLisandro Dalcin 
14222d747510SLisandro Dalcin   if (usehashtable)
14232d747510SLisandro Dalcin   { /* fast search */
14242d747510SLisandro Dalcin     khash_t(HO) *ht = options->ht;
14252d747510SLisandro Dalcin     khiter_t it = kh_get(HO,ht,name);
14262d747510SLisandro Dalcin     if (it != kh_end(ht)) {
14272d747510SLisandro Dalcin       int i = kh_val(ht,it);
1428e5c89e4eSSatish Balay       options->used[i]  = PETSC_TRUE;
14292d747510SLisandro Dalcin       if (value) *value = options->values[i];
14302d747510SLisandro Dalcin       if (set)   *set   = PETSC_TRUE;
14312d747510SLisandro Dalcin       PetscFunctionReturn(0);
14322d747510SLisandro Dalcin     }
14332d747510SLisandro Dalcin   } else
14342d747510SLisandro Dalcin   { /* slow search */
14352d747510SLisandro Dalcin     int i, N = options->N;
14362d747510SLisandro Dalcin     for (i=0; i<N; i++) {
1437daabea38SBarry Smith       int result = PetscOptNameCmp(options->names[i],name);
14382d747510SLisandro Dalcin       if (!result) {
14392d747510SLisandro Dalcin         options->used[i]  = PETSC_TRUE;
14402d747510SLisandro Dalcin         if (value) *value = options->values[i];
14412d747510SLisandro Dalcin         if (set)   *set   = PETSC_TRUE;
14422d747510SLisandro Dalcin         PetscFunctionReturn(0);
14432d747510SLisandro Dalcin       } else if (result > 0) {
1444e5c89e4eSSatish Balay         break;
1445e5c89e4eSSatish Balay       }
1446e5c89e4eSSatish Balay     }
14472d747510SLisandro Dalcin   }
14482d747510SLisandro Dalcin 
14492d747510SLisandro Dalcin   /*
14502d747510SLisandro Dalcin    The following block slows down all lookups in the most frequent path (most lookups are unsuccessful).
14512d747510SLisandro Dalcin    Maybe this special lookup mode should be enabled on request with a push/pop API.
14522d747510SLisandro Dalcin    The feature of matching _%d_ used sparingly in the codebase.
14532d747510SLisandro Dalcin    */
14542d747510SLisandro Dalcin   if (matchnumbers) {
14552d747510SLisandro Dalcin     int i,j,cnt = 0,locs[16],loce[16];
1456e5c89e4eSSatish Balay     /* determine the location and number of all _%d_ in the key */
14572d747510SLisandro Dalcin     for (i=0; name[i]; i++) {
14582d747510SLisandro Dalcin       if (name[i] == '_') {
14592d747510SLisandro Dalcin         for (j=i+1; name[j]; j++) {
14602d747510SLisandro Dalcin           if (name[j] >= '0' && name[j] <= '9') continue;
14612d747510SLisandro Dalcin           if (name[j] == '_' && j > i+1) { /* found a number */
1462e5c89e4eSSatish Balay             locs[cnt]   = i+1;
1463e5c89e4eSSatish Balay             loce[cnt++] = j+1;
1464e5c89e4eSSatish Balay           }
14652d747510SLisandro Dalcin           i = j-1;
1466e5c89e4eSSatish Balay           break;
1467e5c89e4eSSatish Balay         }
1468e5c89e4eSSatish Balay       }
1469e5c89e4eSSatish Balay     }
1470e5c89e4eSSatish Balay     for (i=0; i<cnt; i++) {
14712d747510SLisandro Dalcin       PetscBool found;
14722d747510SLisandro Dalcin       char      opt[MAXOPTNAME+1] = "-", tmp[MAXOPTNAME];
14732d747510SLisandro Dalcin       ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[i]+1),sizeof(tmp)));CHKERRQ(ierr);
14742d747510SLisandro Dalcin       ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr);
14752d747510SLisandro Dalcin       ierr = PetscStrlcat(opt,name+loce[i],sizeof(opt));CHKERRQ(ierr);
14762d747510SLisandro Dalcin       ierr = PetscOptionsFindPair(options,NULL,opt,value,&found);CHKERRQ(ierr);
14772d747510SLisandro Dalcin       if (found) {if (set) *set = PETSC_TRUE; PetscFunctionReturn(0);}
1478e5c89e4eSSatish Balay     }
1479e5c89e4eSSatish Balay   }
14802d747510SLisandro Dalcin 
14812d747510SLisandro Dalcin   if (set) *set = PETSC_FALSE;
1482e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1483e5c89e4eSSatish Balay }
1484e5c89e4eSSatish Balay 
1485d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */
14862d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[], const char name[],const char *value[],PetscBool *set)
1487514bf10dSMatthew G Knepley {
14882d747510SLisandro Dalcin   char           buf[MAXOPTNAME];
1489d6ced9c0SMatthew G. Knepley   int            numCnt = 0, locs[16],loce[16];
1490514bf10dSMatthew G Knepley   PetscErrorCode ierr;
1491514bf10dSMatthew G Knepley 
1492514bf10dSMatthew G Knepley   PetscFunctionBegin;
1493c5929fdfSBarry Smith   options = options ? options : defaultoptions;
14942d747510SLisandro Dalcin   if (pre && pre[0] == '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre);
14952d747510SLisandro Dalcin   if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1496514bf10dSMatthew G Knepley 
14972d747510SLisandro Dalcin   name++; /* skip starting dash */
1498514bf10dSMatthew G Knepley 
1499514bf10dSMatthew G Knepley   /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */
15002d747510SLisandro Dalcin   if (pre && pre[0]) {
15012d747510SLisandro Dalcin     char *ptr = buf;
15022d747510SLisandro Dalcin     if (name[0] == '-') { *ptr++ = '-';  name++; }
15032d747510SLisandro Dalcin     ierr = PetscStrncpy(ptr,pre,sizeof(buf)+(size_t)(ptr-buf));CHKERRQ(ierr);
15042d747510SLisandro Dalcin     ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr);
15052d747510SLisandro Dalcin     name = buf;
1506514bf10dSMatthew G Knepley   }
15072d747510SLisandro Dalcin 
150876bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
1509514bf10dSMatthew G Knepley     PetscBool valid;
15102d747510SLisandro Dalcin     char      key[MAXOPTNAME+1] = "-";
15112d747510SLisandro Dalcin     ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr);
1512514bf10dSMatthew G Knepley     ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr);
1513514bf10dSMatthew G Knepley     if (!valid) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid option '%s' obtained from pre='%s' and name='%s'",key,pre?pre:"",name);
1514514bf10dSMatthew G Knepley   }
1515514bf10dSMatthew G Knepley 
1516d6ced9c0SMatthew G. Knepley   /* determine the location and number of all _%d_ in the key */
1517d6ced9c0SMatthew G. Knepley   {
1518d6ced9c0SMatthew G. Knepley     int i,j;
1519d6ced9c0SMatthew G. Knepley     for (i=0; name[i]; i++) {
1520d6ced9c0SMatthew G. Knepley       if (name[i] == '_') {
1521d6ced9c0SMatthew G. Knepley         for (j=i+1; name[j]; j++) {
1522d6ced9c0SMatthew G. Knepley           if (name[j] >= '0' && name[j] <= '9') continue;
1523d6ced9c0SMatthew G. Knepley           if (name[j] == '_' && j > i+1) { /* found a number */
1524d6ced9c0SMatthew G. Knepley             locs[numCnt]   = i+1;
1525d6ced9c0SMatthew G. Knepley             loce[numCnt++] = j+1;
1526d6ced9c0SMatthew G. Knepley           }
1527d6ced9c0SMatthew G. Knepley           i = j-1;
1528d6ced9c0SMatthew G. Knepley           break;
1529d6ced9c0SMatthew G. Knepley         }
1530d6ced9c0SMatthew G. Knepley       }
1531d6ced9c0SMatthew G. Knepley     }
1532d6ced9c0SMatthew G. Knepley   }
1533d6ced9c0SMatthew G. Knepley 
15342d747510SLisandro Dalcin   { /* slow search */
1535d6ced9c0SMatthew G. Knepley     int       c, i;
15362d747510SLisandro Dalcin     size_t    len;
15372d747510SLisandro Dalcin     PetscBool match;
1538d6ced9c0SMatthew G. Knepley 
1539d6ced9c0SMatthew G. Knepley     for (c = -1; c < numCnt; ++c) {
1540d6ced9c0SMatthew G. Knepley       char opt[MAXOPTNAME+1] = "", tmp[MAXOPTNAME];
1541d6ced9c0SMatthew G. Knepley 
1542d6ced9c0SMatthew G. Knepley       if (c < 0) {
1543d6ced9c0SMatthew G. Knepley         ierr = PetscStrcpy(opt,name);CHKERRQ(ierr);
1544d6ced9c0SMatthew G. Knepley       } else {
1545d6ced9c0SMatthew G. Knepley         ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[c]+1),sizeof(tmp)));CHKERRQ(ierr);
1546d6ced9c0SMatthew G. Knepley         ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr);
1547d6ced9c0SMatthew G. Knepley         ierr = PetscStrlcat(opt,name+loce[c],sizeof(opt));CHKERRQ(ierr);
1548d6ced9c0SMatthew G. Knepley       }
1549d6ced9c0SMatthew G. Knepley       ierr = PetscStrlen(opt,&len);CHKERRQ(ierr);
15502d747510SLisandro Dalcin       for (i=0; i<options->N; i++) {
1551d6ced9c0SMatthew G. Knepley         ierr = PetscStrncmp(options->names[i],opt,len,&match);CHKERRQ(ierr);
1552514bf10dSMatthew G Knepley         if (match) {
1553514bf10dSMatthew G Knepley           options->used[i]  = PETSC_TRUE;
15542d747510SLisandro Dalcin           if (value) *value = options->values[i];
15552d747510SLisandro Dalcin           if (set)   *set   = PETSC_TRUE;
15562d747510SLisandro Dalcin           PetscFunctionReturn(0);
1557514bf10dSMatthew G Knepley         }
1558514bf10dSMatthew G Knepley       }
15592d747510SLisandro Dalcin     }
1560d6ced9c0SMatthew G. Knepley   }
15612d747510SLisandro Dalcin 
15622d747510SLisandro Dalcin   if (set) *set = PETSC_FALSE;
1563514bf10dSMatthew G Knepley   PetscFunctionReturn(0);
1564514bf10dSMatthew G Knepley }
1565514bf10dSMatthew G Knepley 
1566e5c89e4eSSatish Balay /*@C
1567e5c89e4eSSatish Balay    PetscOptionsReject - Generates an error if a certain option is given.
1568e5c89e4eSSatish Balay 
15691c9f3c13SBarry Smith    Not Collective
1570e5c89e4eSSatish Balay 
1571e5c89e4eSSatish Balay    Input Parameters:
15725c9cc608SHong Zhang +  options - options database, use NULL for default global database
15732d747510SLisandro Dalcin .  pre - the option prefix (may be NULL)
15742d747510SLisandro Dalcin .  name - the option name one is seeking
15750298fd71SBarry Smith -  mess - error message (may be NULL)
1576e5c89e4eSSatish Balay 
1577e5c89e4eSSatish Balay    Level: advanced
1578e5c89e4eSSatish Balay 
1579e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(),
1580acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1581e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1582e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1583acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1584a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
1585e5c89e4eSSatish Balay @*/
15862d747510SLisandro Dalcin PetscErrorCode PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[])
1587e5c89e4eSSatish Balay {
1588e5c89e4eSSatish Balay   PetscErrorCode ierr;
1589ace3abfcSBarry Smith   PetscBool      flag = PETSC_FALSE;
1590e5c89e4eSSatish Balay 
1591e5c89e4eSSatish Balay   PetscFunctionBegin;
15922d747510SLisandro Dalcin   ierr = PetscOptionsHasName(options,pre,name,&flag);CHKERRQ(ierr);
1593e5c89e4eSSatish Balay   if (flag) {
15942d747510SLisandro Dalcin     if (mess && mess[0]) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s with %s",pre?pre:"",name+1,mess);
15952d747510SLisandro Dalcin     else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s",pre?pre:"",name+1);
1596e5c89e4eSSatish Balay   }
1597e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1598e5c89e4eSSatish Balay }
1599e5c89e4eSSatish Balay 
1600e5c89e4eSSatish Balay /*@C
16012d747510SLisandro Dalcin    PetscOptionsHasHelp - Determines whether the "-help" option is in the database.
16022d747510SLisandro Dalcin 
16032d747510SLisandro Dalcin    Not Collective
16042d747510SLisandro Dalcin 
16052d747510SLisandro Dalcin    Input Parameters:
16062d747510SLisandro Dalcin .  options - options database, use NULL for default global database
16072d747510SLisandro Dalcin 
16082d747510SLisandro Dalcin    Output Parameters:
16092d747510SLisandro Dalcin .  set - PETSC_TRUE if found else PETSC_FALSE.
16102d747510SLisandro Dalcin 
16112d747510SLisandro Dalcin    Level: advanced
16122d747510SLisandro Dalcin 
16132d747510SLisandro Dalcin .seealso: PetscOptionsHasName()
16142d747510SLisandro Dalcin @*/
16152d747510SLisandro Dalcin PetscErrorCode PetscOptionsHasHelp(PetscOptions options,PetscBool *set)
16162d747510SLisandro Dalcin {
16172d747510SLisandro Dalcin   PetscFunctionBegin;
16182d747510SLisandro Dalcin   PetscValidPointer(set,2);
16192d747510SLisandro Dalcin   options = options ? options : defaultoptions;
16202d747510SLisandro Dalcin   *set = options->help;
16212d747510SLisandro Dalcin   PetscFunctionReturn(0);
16222d747510SLisandro Dalcin }
16232d747510SLisandro Dalcin 
1624d314f959SVaclav Hapla PetscErrorCode PetscOptionsHasHelpIntro_Internal(PetscOptions options,PetscBool *set)
1625d314f959SVaclav Hapla {
1626d314f959SVaclav Hapla   PetscFunctionBegin;
1627d314f959SVaclav Hapla   PetscValidPointer(set,2);
1628d314f959SVaclav Hapla   options = options ? options : defaultoptions;
1629d314f959SVaclav Hapla   *set = options->help_intro;
1630d314f959SVaclav Hapla   PetscFunctionReturn(0);
1631d314f959SVaclav Hapla }
1632d314f959SVaclav Hapla 
16332d747510SLisandro Dalcin /*@C
163490d69ab7SBarry Smith    PetscOptionsHasName - Determines whether a certain option is given in the database. This returns true whether the option is a number, string or boolean, even
163590d69ab7SBarry Smith                       its value is set to false.
1636e5c89e4eSSatish Balay 
1637e5c89e4eSSatish Balay    Not Collective
1638e5c89e4eSSatish Balay 
1639e5c89e4eSSatish Balay    Input Parameters:
16405c9cc608SHong Zhang +  options - options database, use NULL for default global database
16413de71b31SHong Zhang .  pre - string to prepend to the name or NULL
16423de71b31SHong Zhang -  name - the option one is seeking
1643e5c89e4eSSatish Balay 
1644e5c89e4eSSatish Balay    Output Parameters:
164596ef3cdfSSatish Balay .  set - PETSC_TRUE if found else PETSC_FALSE.
1646e5c89e4eSSatish Balay 
1647e5c89e4eSSatish Balay    Level: beginner
1648e5c89e4eSSatish Balay 
164995452b02SPatrick Sanan    Notes:
1650acfcf0e5SJed Brown    In many cases you probably want to use PetscOptionsGetBool() instead of calling this, to allowing toggling values.
165190d69ab7SBarry Smith 
1652e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1653f3e3d7dfSBarry Smith           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1654e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1655e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1656acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1657a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
1658e5c89e4eSSatish Balay @*/
1659c5929fdfSBarry Smith PetscErrorCode PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool *set)
1660e5c89e4eSSatish Balay {
16612d747510SLisandro Dalcin   const char     *value;
1662e5c89e4eSSatish Balay   PetscErrorCode ierr;
1663ace3abfcSBarry Smith   PetscBool      flag;
1664e5c89e4eSSatish Balay 
1665e5c89e4eSSatish Balay   PetscFunctionBegin;
16662d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
166796ef3cdfSSatish Balay   if (set) *set = flag;
1668e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1669e5c89e4eSSatish Balay }
1670e5c89e4eSSatish Balay 
1671e5c89e4eSSatish Balay /*@C
16722d747510SLisandro Dalcin    PetscOptionsGetAll - Lists all the options the program was run with in a single string.
16732d747510SLisandro Dalcin 
16742d747510SLisandro Dalcin    Not Collective
16752d747510SLisandro Dalcin 
1676fd292e60Sprj-    Input Parameter:
16772d747510SLisandro Dalcin .  options - the options database, use NULL for the default global database
16782d747510SLisandro Dalcin 
16792d747510SLisandro Dalcin    Output Parameter:
16802d747510SLisandro Dalcin .  copts - pointer where string pointer is stored
16812d747510SLisandro Dalcin 
16822d747510SLisandro Dalcin    Notes:
16831c9f3c13SBarry Smith     The array and each entry in the array should be freed with PetscFree()
16841c9f3c13SBarry Smith     Each process may have different values depending on how the options were inserted into the database
16852d747510SLisandro Dalcin 
16862d747510SLisandro Dalcin    Level: advanced
16872d747510SLisandro Dalcin 
16881c9f3c13SBarry Smith .seealso: PetscOptionsAllUsed(), PetscOptionsView(), PetscOptionsPush(), PetscOptionsPop()
16892d747510SLisandro Dalcin @*/
16902d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetAll(PetscOptions options,char *copts[])
16912d747510SLisandro Dalcin {
16922d747510SLisandro Dalcin   PetscErrorCode ierr;
16932d747510SLisandro Dalcin   PetscInt       i;
16942d747510SLisandro Dalcin   size_t         len = 1,lent = 0;
16952d747510SLisandro Dalcin   char           *coptions = NULL;
16962d747510SLisandro Dalcin 
16972d747510SLisandro Dalcin   PetscFunctionBegin;
16982d747510SLisandro Dalcin   PetscValidPointer(copts,2);
16992d747510SLisandro Dalcin   options = options ? options : defaultoptions;
17002d747510SLisandro Dalcin   /* count the length of the required string */
17012d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
17022d747510SLisandro Dalcin     ierr = PetscStrlen(options->names[i],&lent);CHKERRQ(ierr);
17032d747510SLisandro Dalcin     len += 2 + lent;
17042d747510SLisandro Dalcin     if (options->values[i]) {
17052d747510SLisandro Dalcin       ierr = PetscStrlen(options->values[i],&lent);CHKERRQ(ierr);
17062d747510SLisandro Dalcin       len += 1 + lent;
17072d747510SLisandro Dalcin     }
17082d747510SLisandro Dalcin   }
17092d747510SLisandro Dalcin   ierr = PetscMalloc1(len,&coptions);CHKERRQ(ierr);
17102d747510SLisandro Dalcin   coptions[0] = 0;
17112d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
17122d747510SLisandro Dalcin     ierr = PetscStrcat(coptions,"-");CHKERRQ(ierr);
17132d747510SLisandro Dalcin     ierr = PetscStrcat(coptions,options->names[i]);CHKERRQ(ierr);
17142d747510SLisandro Dalcin     ierr = PetscStrcat(coptions," ");CHKERRQ(ierr);
17152d747510SLisandro Dalcin     if (options->values[i]) {
17162d747510SLisandro Dalcin       ierr = PetscStrcat(coptions,options->values[i]);CHKERRQ(ierr);
17172d747510SLisandro Dalcin       ierr = PetscStrcat(coptions," ");CHKERRQ(ierr);
17182d747510SLisandro Dalcin     }
17192d747510SLisandro Dalcin   }
17202d747510SLisandro Dalcin   *copts = coptions;
17212d747510SLisandro Dalcin   PetscFunctionReturn(0);
17222d747510SLisandro Dalcin }
17232d747510SLisandro Dalcin 
17242d747510SLisandro Dalcin /*@C
17252d747510SLisandro Dalcin    PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database
17262d747510SLisandro Dalcin 
17272d747510SLisandro Dalcin    Not Collective
17282d747510SLisandro Dalcin 
17292d747510SLisandro Dalcin    Input Parameter:
17302d747510SLisandro Dalcin +  options - options database, use NULL for default global database
17312d747510SLisandro Dalcin -  name - string name of option
17322d747510SLisandro Dalcin 
17332d747510SLisandro Dalcin    Output Parameter:
17342d747510SLisandro Dalcin .  used - PETSC_TRUE if the option was used, otherwise false, including if option was not found in options database
17352d747510SLisandro Dalcin 
17362d747510SLisandro Dalcin    Level: advanced
17372d747510SLisandro Dalcin 
17389666a313SBarry Smith    Notes:
17399666a313SBarry Smith    The value returned may be different on each process and depends on which options have been processed
17401c9f3c13SBarry Smith    on the given process
17411c9f3c13SBarry Smith 
17422d747510SLisandro Dalcin .seealso: PetscOptionsView(), PetscOptionsLeft(), PetscOptionsAllUsed()
17432d747510SLisandro Dalcin @*/
17442d747510SLisandro Dalcin PetscErrorCode PetscOptionsUsed(PetscOptions options,const char *name,PetscBool *used)
17452d747510SLisandro Dalcin {
17462d747510SLisandro Dalcin   PetscInt       i;
17472d747510SLisandro Dalcin   PetscErrorCode ierr;
17482d747510SLisandro Dalcin 
17492d747510SLisandro Dalcin   PetscFunctionBegin;
17502d747510SLisandro Dalcin   PetscValidCharPointer(name,2);
17512d747510SLisandro Dalcin   PetscValidPointer(used,3);
17522d747510SLisandro Dalcin   options = options ? options : defaultoptions;
17532d747510SLisandro Dalcin   *used = PETSC_FALSE;
17542d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
1755ee42b8b3SLisandro Dalcin     ierr = PetscStrcasecmp(options->names[i],name,used);CHKERRQ(ierr);
17562d747510SLisandro Dalcin     if (*used) {
17572d747510SLisandro Dalcin       *used = options->used[i];
17582d747510SLisandro Dalcin       break;
17592d747510SLisandro Dalcin     }
17602d747510SLisandro Dalcin   }
17612d747510SLisandro Dalcin   PetscFunctionReturn(0);
17622d747510SLisandro Dalcin }
17632d747510SLisandro Dalcin 
1764487a658cSBarry Smith /*@
17652d747510SLisandro Dalcin    PetscOptionsAllUsed - Returns a count of the number of options in the
17662d747510SLisandro Dalcin    database that have never been selected.
17672d747510SLisandro Dalcin 
17682d747510SLisandro Dalcin    Not Collective
17692d747510SLisandro Dalcin 
17702d747510SLisandro Dalcin    Input Parameter:
17712d747510SLisandro Dalcin .  options - options database, use NULL for default global database
17722d747510SLisandro Dalcin 
17732d747510SLisandro Dalcin    Output Parameter:
17742d747510SLisandro Dalcin .  N - count of options not used
17752d747510SLisandro Dalcin 
17762d747510SLisandro Dalcin    Level: advanced
17772d747510SLisandro Dalcin 
17789666a313SBarry Smith    Notes:
17799666a313SBarry Smith    The value returned may be different on each process and depends on which options have been processed
17801c9f3c13SBarry Smith    on the given process
17811c9f3c13SBarry Smith 
17822d747510SLisandro Dalcin .seealso: PetscOptionsView()
17832d747510SLisandro Dalcin @*/
17842d747510SLisandro Dalcin PetscErrorCode PetscOptionsAllUsed(PetscOptions options,PetscInt *N)
17852d747510SLisandro Dalcin {
17862d747510SLisandro Dalcin   PetscInt     i,n = 0;
17872d747510SLisandro Dalcin 
17882d747510SLisandro Dalcin   PetscFunctionBegin;
17892d747510SLisandro Dalcin   PetscValidIntPointer(N,2);
17902d747510SLisandro Dalcin   options = options ? options : defaultoptions;
17912d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
17922d747510SLisandro Dalcin     if (!options->used[i]) n++;
17932d747510SLisandro Dalcin   }
17942d747510SLisandro Dalcin   *N = n;
17952d747510SLisandro Dalcin   PetscFunctionReturn(0);
17962d747510SLisandro Dalcin }
17972d747510SLisandro Dalcin 
1798487a658cSBarry Smith /*@
17992d747510SLisandro Dalcin    PetscOptionsLeft - Prints to screen any options that were set and never used.
18002d747510SLisandro Dalcin 
18012d747510SLisandro Dalcin    Not Collective
18022d747510SLisandro Dalcin 
18032d747510SLisandro Dalcin    Input Parameter:
18042d747510SLisandro Dalcin .  options - options database; use NULL for default global database
18052d747510SLisandro Dalcin 
18062d747510SLisandro Dalcin    Options Database Key:
18073c6db4c4SPierre Jolivet .  -options_left - activates PetscOptionsAllUsed() within PetscFinalize()
18082d747510SLisandro Dalcin 
18093de2bfdfSBarry Smith    Notes:
18103de2bfdfSBarry Smith       This is rarely used directly, it is called by PetscFinalize() in debug more or if -options_left
18111c9f3c13SBarry Smith       is passed otherwise to help users determine possible mistakes in their usage of options. This
18121c9f3c13SBarry Smith       only prints values on process zero of PETSC_COMM_WORLD. Other processes depending the objects
18131c9f3c13SBarry Smith       used may have different options that are left unused.
18143de2bfdfSBarry Smith 
18152d747510SLisandro Dalcin    Level: advanced
18162d747510SLisandro Dalcin 
18172d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed()
18182d747510SLisandro Dalcin @*/
18192d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeft(PetscOptions options)
18202d747510SLisandro Dalcin {
18212d747510SLisandro Dalcin   PetscErrorCode ierr;
18222d747510SLisandro Dalcin   PetscInt       i;
18233de2bfdfSBarry Smith   PetscInt       cnt = 0;
18243de2bfdfSBarry Smith   PetscOptions   toptions;
18252d747510SLisandro Dalcin 
18262d747510SLisandro Dalcin   PetscFunctionBegin;
18273de2bfdfSBarry Smith   toptions = options ? options : defaultoptions;
18283de2bfdfSBarry Smith   for (i=0; i<toptions->N; i++) {
18293de2bfdfSBarry Smith     if (!toptions->used[i]) {
18303de2bfdfSBarry Smith       if (toptions->values[i]) {
18313de2bfdfSBarry Smith         ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",toptions->names[i],toptions->values[i]);CHKERRQ(ierr);
18322d747510SLisandro Dalcin       } else {
18333de2bfdfSBarry Smith         ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s (no value)\n",toptions->names[i]);CHKERRQ(ierr);
18342d747510SLisandro Dalcin       }
18352d747510SLisandro Dalcin     }
18362d747510SLisandro Dalcin   }
18373de2bfdfSBarry Smith   if (!options) {
18383de2bfdfSBarry Smith     toptions = defaultoptions;
18393de2bfdfSBarry Smith     while (toptions->previous) {
18403de2bfdfSBarry Smith       cnt++;
18413de2bfdfSBarry Smith       toptions = toptions->previous;
18423de2bfdfSBarry Smith     }
18433de2bfdfSBarry Smith     if (cnt) {
18443de2bfdfSBarry Smith       ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: You may have forgotten some calls to PetscOptionsPop(),\n             PetscOptionsPop() has been called %D less times than PetscOptionsPush()\n",cnt);CHKERRQ(ierr);
18453de2bfdfSBarry Smith     }
18463de2bfdfSBarry Smith   }
18472d747510SLisandro Dalcin   PetscFunctionReturn(0);
18482d747510SLisandro Dalcin }
18492d747510SLisandro Dalcin 
18502d747510SLisandro Dalcin /*@C
18512d747510SLisandro Dalcin    PetscOptionsLeftGet - Returns all options that were set and never used.
18522d747510SLisandro Dalcin 
18532d747510SLisandro Dalcin    Not Collective
18542d747510SLisandro Dalcin 
18552d747510SLisandro Dalcin    Input Parameter:
18562d747510SLisandro Dalcin .  options - options database, use NULL for default global database
18572d747510SLisandro Dalcin 
18582d747510SLisandro Dalcin    Output Parameter:
1859a2b725a8SWilliam Gropp +  N - count of options not used
18602d747510SLisandro Dalcin .  names - names of options not used
1861a2b725a8SWilliam Gropp -  values - values of options not used
18622d747510SLisandro Dalcin 
18632d747510SLisandro Dalcin    Level: advanced
18642d747510SLisandro Dalcin 
18652d747510SLisandro Dalcin    Notes:
18662d747510SLisandro Dalcin    Users should call PetscOptionsLeftRestore() to free the memory allocated in this routine
18671c9f3c13SBarry Smith    Notes: The value returned may be different on each process and depends on which options have been processed
18681c9f3c13SBarry Smith    on the given process
18692d747510SLisandro Dalcin 
18702d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft()
18712d747510SLisandro Dalcin @*/
18722d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftGet(PetscOptions options,PetscInt *N,char **names[],char **values[])
18732d747510SLisandro Dalcin {
18742d747510SLisandro Dalcin   PetscErrorCode ierr;
18752d747510SLisandro Dalcin   PetscInt       i,n;
18762d747510SLisandro Dalcin 
18772d747510SLisandro Dalcin   PetscFunctionBegin;
18782d747510SLisandro Dalcin   if (N) PetscValidIntPointer(N,2);
18792d747510SLisandro Dalcin   if (names) PetscValidPointer(names,3);
18802d747510SLisandro Dalcin   if (values) PetscValidPointer(values,4);
18812d747510SLisandro Dalcin   options = options ? options : defaultoptions;
18822d747510SLisandro Dalcin 
18832d747510SLisandro Dalcin   /* The number of unused PETSc options */
18842d747510SLisandro Dalcin   n = 0;
18852d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
18862d747510SLisandro Dalcin     if (!options->used[i]) n++;
18872d747510SLisandro Dalcin   }
18882d747510SLisandro Dalcin   if (N) { *N = n; }
18892d747510SLisandro Dalcin   if (names)  { ierr = PetscMalloc1(n,names);CHKERRQ(ierr); }
18902d747510SLisandro Dalcin   if (values) { ierr = PetscMalloc1(n,values);CHKERRQ(ierr); }
18912d747510SLisandro Dalcin 
18922d747510SLisandro Dalcin   n = 0;
18932d747510SLisandro Dalcin   if (names || values) {
18942d747510SLisandro Dalcin     for (i=0; i<options->N; i++) {
18952d747510SLisandro Dalcin       if (!options->used[i]) {
18962d747510SLisandro Dalcin         if (names)  (*names)[n]  = options->names[i];
18972d747510SLisandro Dalcin         if (values) (*values)[n] = options->values[i];
18982d747510SLisandro Dalcin         n++;
18992d747510SLisandro Dalcin       }
19002d747510SLisandro Dalcin     }
19012d747510SLisandro Dalcin   }
19022d747510SLisandro Dalcin   PetscFunctionReturn(0);
19032d747510SLisandro Dalcin }
19042d747510SLisandro Dalcin 
19052d747510SLisandro Dalcin /*@C
19062d747510SLisandro Dalcin    PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using PetscOptionsLeftGet.
19072d747510SLisandro Dalcin 
19082d747510SLisandro Dalcin    Not Collective
19092d747510SLisandro Dalcin 
19102d747510SLisandro Dalcin    Input Parameter:
1911a2b725a8SWilliam Gropp +  options - options database, use NULL for default global database
19122d747510SLisandro Dalcin .  names - names of options not used
1913a2b725a8SWilliam Gropp -  values - values of options not used
19142d747510SLisandro Dalcin 
19152d747510SLisandro Dalcin    Level: advanced
19162d747510SLisandro Dalcin 
19172d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft(), PetscOptionsLeftGet()
19182d747510SLisandro Dalcin @*/
19192d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftRestore(PetscOptions options,PetscInt *N,char **names[],char **values[])
19202d747510SLisandro Dalcin {
19212d747510SLisandro Dalcin   PetscErrorCode ierr;
19222d747510SLisandro Dalcin 
19232d747510SLisandro Dalcin   PetscFunctionBegin;
19242d747510SLisandro Dalcin   if (N) PetscValidIntPointer(N,2);
19252d747510SLisandro Dalcin   if (names) PetscValidPointer(names,3);
19262d747510SLisandro Dalcin   if (values) PetscValidPointer(values,4);
19272d747510SLisandro Dalcin   if (N) { *N = 0; }
19282d747510SLisandro Dalcin   if (names)  { ierr = PetscFree(*names);CHKERRQ(ierr); }
19292d747510SLisandro Dalcin   if (values) { ierr = PetscFree(*values);CHKERRQ(ierr); }
19302d747510SLisandro Dalcin   PetscFunctionReturn(0);
19312d747510SLisandro Dalcin }
19322d747510SLisandro Dalcin 
19332d747510SLisandro Dalcin /*@C
19349060e2f9SVaclav Hapla    PetscOptionsMonitorDefault - Print all options set value events using the supplied PetscViewer.
19352d747510SLisandro Dalcin 
19361c9f3c13SBarry Smith    Logically Collective on ctx
19372d747510SLisandro Dalcin 
19382d747510SLisandro Dalcin    Input Parameters:
19392d747510SLisandro Dalcin +  name  - option name string
19402d747510SLisandro Dalcin .  value - option value string
19419060e2f9SVaclav Hapla -  ctx - an ASCII viewer or NULL
19422d747510SLisandro Dalcin 
19432d747510SLisandro Dalcin    Level: intermediate
19442d747510SLisandro Dalcin 
19459666a313SBarry Smith    Notes:
19469060e2f9SVaclav Hapla      If ctx=NULL, PetscPrintf() is used.
19479666a313SBarry Smith      The first MPI rank in the PetscViewer viewer actually prints the values, other
19481c9f3c13SBarry Smith      processes may have different values set
19491c9f3c13SBarry Smith 
19502d747510SLisandro Dalcin .seealso: PetscOptionsMonitorSet()
19512d747510SLisandro Dalcin @*/
19522d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorDefault(const char name[],const char value[],void *ctx)
19532d747510SLisandro Dalcin {
19542d747510SLisandro Dalcin   PetscErrorCode ierr;
19552d747510SLisandro Dalcin 
19562d747510SLisandro Dalcin   PetscFunctionBegin;
19579060e2f9SVaclav Hapla   if (ctx) {
19589060e2f9SVaclav Hapla     PetscViewer viewer = (PetscViewer)ctx;
19592d747510SLisandro Dalcin     if (!value) {
19602d747510SLisandro Dalcin       ierr = PetscViewerASCIIPrintf(viewer,"Removing option: %s\n",name,value);CHKERRQ(ierr);
19612d747510SLisandro Dalcin     } else if (!value[0]) {
19622d747510SLisandro Dalcin       ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s (no value)\n",name);CHKERRQ(ierr);
19632d747510SLisandro Dalcin     } else {
19642d747510SLisandro Dalcin       ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr);
19652d747510SLisandro Dalcin     }
19669060e2f9SVaclav Hapla   } else {
19679060e2f9SVaclav Hapla     MPI_Comm comm = PETSC_COMM_WORLD;
19689060e2f9SVaclav Hapla     if (!value) {
19699060e2f9SVaclav Hapla       ierr = PetscPrintf(comm,"Removing option: %s\n",name,value);CHKERRQ(ierr);
19709060e2f9SVaclav Hapla     } else if (!value[0]) {
19719060e2f9SVaclav Hapla       ierr = PetscPrintf(comm,"Setting option: %s (no value)\n",name);CHKERRQ(ierr);
19729060e2f9SVaclav Hapla     } else {
19739060e2f9SVaclav Hapla       ierr = PetscPrintf(comm,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr);
19749060e2f9SVaclav Hapla     }
19759060e2f9SVaclav Hapla   }
19762d747510SLisandro Dalcin   PetscFunctionReturn(0);
19772d747510SLisandro Dalcin }
19782d747510SLisandro Dalcin 
19792d747510SLisandro Dalcin /*@C
19802d747510SLisandro Dalcin    PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that
19812d747510SLisandro Dalcin    modified the PETSc options database.
19822d747510SLisandro Dalcin 
19832d747510SLisandro Dalcin    Not Collective
19842d747510SLisandro Dalcin 
19852d747510SLisandro Dalcin    Input Parameters:
19862d747510SLisandro Dalcin +  monitor - pointer to function (if this is NULL, it turns off monitoring
19872d747510SLisandro Dalcin .  mctx    - [optional] context for private data for the
19882d747510SLisandro Dalcin              monitor routine (use NULL if no context is desired)
19892d747510SLisandro Dalcin -  monitordestroy - [optional] routine that frees monitor context
19902d747510SLisandro Dalcin           (may be NULL)
19912d747510SLisandro Dalcin 
19922d747510SLisandro Dalcin    Calling Sequence of monitor:
19932d747510SLisandro Dalcin $     monitor (const char name[], const char value[], void *mctx)
19942d747510SLisandro Dalcin 
19952d747510SLisandro Dalcin +  name - option name string
19962d747510SLisandro Dalcin .  value - option value string
19972d747510SLisandro Dalcin -  mctx  - optional monitoring context, as set by PetscOptionsMonitorSet()
19982d747510SLisandro Dalcin 
19992d747510SLisandro Dalcin    Options Database Keys:
2000c5b5d8d5SVaclav Hapla    See PetscInitialize() for options related to option database monitoring.
20012d747510SLisandro Dalcin 
20022d747510SLisandro Dalcin    Notes:
20032d747510SLisandro Dalcin    The default is to do nothing.  To print the name and value of options
20042d747510SLisandro Dalcin    being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine,
20052d747510SLisandro Dalcin    with a null monitoring context.
20062d747510SLisandro Dalcin 
20072d747510SLisandro Dalcin    Several different monitoring routines may be set by calling
20082d747510SLisandro Dalcin    PetscOptionsMonitorSet() multiple times; all will be called in the
20092d747510SLisandro Dalcin    order in which they were set.
20102d747510SLisandro Dalcin 
20119060e2f9SVaclav Hapla    Level: intermediate
20122d747510SLisandro Dalcin 
2013c5b5d8d5SVaclav Hapla .seealso: PetscOptionsMonitorDefault(), PetscInitialize()
20142d747510SLisandro Dalcin @*/
20152d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void**))
20162d747510SLisandro Dalcin {
20172d747510SLisandro Dalcin   PetscOptions options = defaultoptions;
20182d747510SLisandro Dalcin 
20192d747510SLisandro Dalcin   PetscFunctionBegin;
2020c5b5d8d5SVaclav Hapla   if (options->monitorCancel) PetscFunctionReturn(0);
20212d747510SLisandro Dalcin   if (options->numbermonitors >= MAXOPTIONSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set");
20222d747510SLisandro Dalcin   options->monitor[options->numbermonitors]          = monitor;
20232d747510SLisandro Dalcin   options->monitordestroy[options->numbermonitors]   = monitordestroy;
20242d747510SLisandro Dalcin   options->monitorcontext[options->numbermonitors++] = (void*)mctx;
20252d747510SLisandro Dalcin   PetscFunctionReturn(0);
20262d747510SLisandro Dalcin }
20272d747510SLisandro Dalcin 
20282d747510SLisandro Dalcin /*
20292d747510SLisandro Dalcin    PetscOptionsStringToBool - Converts string to PetscBool, handles cases like "yes", "no", "true", "false", "0", "1", "off", "on".
203063fe8743SVaclav Hapla      Empty string is considered as true.
20312d747510SLisandro Dalcin */
20322d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToBool(const char value[],PetscBool *a)
20332d747510SLisandro Dalcin {
20342d747510SLisandro Dalcin   PetscBool      istrue,isfalse;
20352d747510SLisandro Dalcin   size_t         len;
20362d747510SLisandro Dalcin   PetscErrorCode ierr;
20372d747510SLisandro Dalcin 
20382d747510SLisandro Dalcin   PetscFunctionBegin;
203963fe8743SVaclav Hapla   /* PetscStrlen() returns 0 for NULL or "" */
20402d747510SLisandro Dalcin   ierr = PetscStrlen(value,&len);CHKERRQ(ierr);
204163fe8743SVaclav Hapla   if (!len)  {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20422d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"TRUE",&istrue);CHKERRQ(ierr);
20432d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20442d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"YES",&istrue);CHKERRQ(ierr);
20452d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20462d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"1",&istrue);CHKERRQ(ierr);
20472d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20482d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"on",&istrue);CHKERRQ(ierr);
20492d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20502d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr);
20512d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20522d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr);
20532d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20542d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr);
20552d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20562d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"off",&isfalse);CHKERRQ(ierr);
20572d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20582d747510SLisandro Dalcin   SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value);
20592d747510SLisandro Dalcin }
20602d747510SLisandro Dalcin 
20612d747510SLisandro Dalcin /*
20622d747510SLisandro Dalcin    PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide"
20632d747510SLisandro Dalcin */
20642d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToInt(const char name[],PetscInt *a)
20652d747510SLisandro Dalcin {
20662d747510SLisandro Dalcin   PetscErrorCode ierr;
20672d747510SLisandro Dalcin   size_t         len;
20682d747510SLisandro Dalcin   PetscBool      decide,tdefault,mouse;
20692d747510SLisandro Dalcin 
20702d747510SLisandro Dalcin   PetscFunctionBegin;
20712d747510SLisandro Dalcin   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
20722d747510SLisandro Dalcin   if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value");
20732d747510SLisandro Dalcin 
20742d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr);
20752d747510SLisandro Dalcin   if (!tdefault) {
20762d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr);
20772d747510SLisandro Dalcin   }
20782d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr);
20792d747510SLisandro Dalcin   if (!decide) {
20802d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr);
20812d747510SLisandro Dalcin   }
20822d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"mouse",&mouse);CHKERRQ(ierr);
20832d747510SLisandro Dalcin 
20842d747510SLisandro Dalcin   if (tdefault)    *a = PETSC_DEFAULT;
20852d747510SLisandro Dalcin   else if (decide) *a = PETSC_DECIDE;
20862d747510SLisandro Dalcin   else if (mouse)  *a = -1;
20872d747510SLisandro Dalcin   else {
20882d747510SLisandro Dalcin     char *endptr;
20892d747510SLisandro Dalcin     long strtolval;
20902d747510SLisandro Dalcin 
20912d747510SLisandro Dalcin     strtolval = strtol(name,&endptr,10);
20922d747510SLisandro Dalcin     if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no integer value (do not include . in it)",name);
20932d747510SLisandro Dalcin 
20942d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL)
20952d747510SLisandro Dalcin     (void) strtolval;
20962d747510SLisandro Dalcin     *a = atoll(name);
20972d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64)
20982d747510SLisandro Dalcin     (void) strtolval;
20992d747510SLisandro Dalcin     *a = _atoi64(name);
21002d747510SLisandro Dalcin #else
21012d747510SLisandro Dalcin     *a = (PetscInt)strtolval;
21022d747510SLisandro Dalcin #endif
21032d747510SLisandro Dalcin   }
21042d747510SLisandro Dalcin   PetscFunctionReturn(0);
21052d747510SLisandro Dalcin }
21062d747510SLisandro Dalcin 
21072d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
21082d747510SLisandro Dalcin #include <quadmath.h>
21092d747510SLisandro Dalcin #endif
21102d747510SLisandro Dalcin 
21112d747510SLisandro Dalcin static PetscErrorCode PetscStrtod(const char name[],PetscReal *a,char **endptr)
21122d747510SLisandro Dalcin {
21132d747510SLisandro Dalcin   PetscFunctionBegin;
21142d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
21152d747510SLisandro Dalcin   *a = strtoflt128(name,endptr);
21162d747510SLisandro Dalcin #else
21172d747510SLisandro Dalcin   *a = (PetscReal)strtod(name,endptr);
21182d747510SLisandro Dalcin #endif
21192d747510SLisandro Dalcin   PetscFunctionReturn(0);
21202d747510SLisandro Dalcin }
21212d747510SLisandro Dalcin 
21222d747510SLisandro Dalcin static PetscErrorCode PetscStrtoz(const char name[],PetscScalar *a,char **endptr,PetscBool *isImaginary)
21232d747510SLisandro Dalcin {
21242d747510SLisandro Dalcin   PetscBool      hasi = PETSC_FALSE;
21252d747510SLisandro Dalcin   char           *ptr;
21262d747510SLisandro Dalcin   PetscReal      strtoval;
21272d747510SLisandro Dalcin   PetscErrorCode ierr;
21282d747510SLisandro Dalcin 
21292d747510SLisandro Dalcin   PetscFunctionBegin;
21302d747510SLisandro Dalcin   ierr = PetscStrtod(name,&strtoval,&ptr);CHKERRQ(ierr);
21312d747510SLisandro Dalcin   if (ptr == name) {
21322d747510SLisandro Dalcin     strtoval = 1.;
21332d747510SLisandro Dalcin     hasi = PETSC_TRUE;
21342d747510SLisandro Dalcin     if (name[0] == 'i') {
21352d747510SLisandro Dalcin       ptr++;
21362d747510SLisandro Dalcin     } else if (name[0] == '+' && name[1] == 'i') {
21372d747510SLisandro Dalcin       ptr += 2;
21382d747510SLisandro Dalcin     } else if (name[0] == '-' && name[1] == 'i') {
21392d747510SLisandro Dalcin       strtoval = -1.;
21402d747510SLisandro Dalcin       ptr += 2;
21412d747510SLisandro Dalcin     }
21422d747510SLisandro Dalcin   } else if (*ptr == 'i') {
21432d747510SLisandro Dalcin     hasi = PETSC_TRUE;
21442d747510SLisandro Dalcin     ptr++;
21452d747510SLisandro Dalcin   }
21462d747510SLisandro Dalcin   *endptr = ptr;
21472d747510SLisandro Dalcin   *isImaginary = hasi;
21482d747510SLisandro Dalcin   if (hasi) {
21492d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX)
21502d747510SLisandro Dalcin     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s contains imaginary but complex not supported ",name);
21512d747510SLisandro Dalcin #else
21522d747510SLisandro Dalcin     *a = PetscCMPLX(0.,strtoval);
21532d747510SLisandro Dalcin #endif
21542d747510SLisandro Dalcin   } else {
21552d747510SLisandro Dalcin     *a = strtoval;
21562d747510SLisandro Dalcin   }
21572d747510SLisandro Dalcin   PetscFunctionReturn(0);
21582d747510SLisandro Dalcin }
21592d747510SLisandro Dalcin 
21602d747510SLisandro Dalcin /*
21612d747510SLisandro Dalcin    Converts a string to PetscReal value. Handles special cases like "default" and "decide"
21622d747510SLisandro Dalcin */
21632d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToReal(const char name[],PetscReal *a)
21642d747510SLisandro Dalcin {
21652d747510SLisandro Dalcin   size_t         len;
21662d747510SLisandro Dalcin   PetscBool      match;
21672d747510SLisandro Dalcin   char           *endptr;
21682d747510SLisandro Dalcin   PetscErrorCode ierr;
21692d747510SLisandro Dalcin 
21702d747510SLisandro Dalcin   PetscFunctionBegin;
21712d747510SLisandro Dalcin   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
21722d747510SLisandro Dalcin   if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"String of length zero has no numerical value");
21732d747510SLisandro Dalcin 
21742d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&match);CHKERRQ(ierr);
21752d747510SLisandro Dalcin   if (!match) {
21762d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DEFAULT",&match);CHKERRQ(ierr);
21772d747510SLisandro Dalcin   }
21782d747510SLisandro Dalcin   if (match) {*a = PETSC_DEFAULT; PetscFunctionReturn(0);}
21792d747510SLisandro Dalcin 
21802d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&match);CHKERRQ(ierr);
21812d747510SLisandro Dalcin   if (!match) {
21822d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DECIDE",&match);CHKERRQ(ierr);
21832d747510SLisandro Dalcin   }
21842d747510SLisandro Dalcin   if (match) {*a = PETSC_DECIDE; PetscFunctionReturn(0);}
21852d747510SLisandro Dalcin 
21862d747510SLisandro Dalcin   ierr = PetscStrtod(name,a,&endptr);CHKERRQ(ierr);
21872d747510SLisandro Dalcin   if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value",name);
21882d747510SLisandro Dalcin   PetscFunctionReturn(0);
21892d747510SLisandro Dalcin }
21902d747510SLisandro Dalcin 
21912d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToScalar(const char name[],PetscScalar *a)
21922d747510SLisandro Dalcin {
21932d747510SLisandro Dalcin   PetscBool      imag1;
21942d747510SLisandro Dalcin   size_t         len;
21952d747510SLisandro Dalcin   PetscScalar    val = 0.;
21962d747510SLisandro Dalcin   char           *ptr = NULL;
21972d747510SLisandro Dalcin   PetscErrorCode ierr;
21982d747510SLisandro Dalcin 
21992d747510SLisandro Dalcin   PetscFunctionBegin;
22002d747510SLisandro Dalcin   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
22012d747510SLisandro Dalcin   if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value");
22022d747510SLisandro Dalcin   ierr = PetscStrtoz(name,&val,&ptr,&imag1);CHKERRQ(ierr);
22032d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX)
22042d747510SLisandro Dalcin   if ((size_t) (ptr - name) < len) {
22052d747510SLisandro Dalcin     PetscBool   imag2;
22062d747510SLisandro Dalcin     PetscScalar val2;
22072d747510SLisandro Dalcin 
22082d747510SLisandro Dalcin     ierr = PetscStrtoz(ptr,&val2,&ptr,&imag2);CHKERRQ(ierr);
22092d747510SLisandro Dalcin     if (imag1 || !imag2) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s: must specify imaginary component second",name);
22102d747510SLisandro Dalcin     val = PetscCMPLX(PetscRealPart(val),PetscImaginaryPart(val2));
22112d747510SLisandro Dalcin   }
22122d747510SLisandro Dalcin #endif
22132d747510SLisandro Dalcin   if ((size_t) (ptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name);
22142d747510SLisandro Dalcin   *a = val;
22152d747510SLisandro Dalcin   PetscFunctionReturn(0);
22162d747510SLisandro Dalcin }
22172d747510SLisandro Dalcin 
22182d747510SLisandro Dalcin /*@C
22192d747510SLisandro Dalcin    PetscOptionsGetBool - Gets the Logical (true or false) value for a particular
22202d747510SLisandro Dalcin             option in the database.
2221e5c89e4eSSatish Balay 
2222e5c89e4eSSatish Balay    Not Collective
2223e5c89e4eSSatish Balay 
2224e5c89e4eSSatish Balay    Input Parameters:
22255c9cc608SHong Zhang +  options - options database, use NULL for default global database
2226c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
2227e5c89e4eSSatish Balay -  name - the option one is seeking
2228e5c89e4eSSatish Balay 
2229e5c89e4eSSatish Balay    Output Parameter:
22302d747510SLisandro Dalcin +  ivalue - the logical value to return
223196ef3cdfSSatish Balay -  set - PETSC_TRUE  if found, else PETSC_FALSE
2232e5c89e4eSSatish Balay 
2233e5c89e4eSSatish Balay    Level: beginner
2234e5c89e4eSSatish Balay 
223595452b02SPatrick Sanan    Notes:
22362d747510SLisandro Dalcin        TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE
22372d747510SLisandro Dalcin        FALSE, false, NO, no, and 0 all translate to PETSC_FALSE
22382d747510SLisandro Dalcin 
22392d747510SLisandro 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
22402d747510SLisandro Dalcin      is equivalent to -requested_bool true
22412d747510SLisandro Dalcin 
22422d747510SLisandro Dalcin        If the user does not supply the option at all ivalue is NOT changed. Thus
22432efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
22442efd9cb1SBarry Smith 
2245e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
22462d747510SLisandro Dalcin           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsBool(),
2247e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2248e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2249acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2250a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2251e5c89e4eSSatish Balay @*/
22522d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool *ivalue,PetscBool *set)
2253e5c89e4eSSatish Balay {
22542d747510SLisandro Dalcin   const char     *value;
2255ace3abfcSBarry Smith   PetscBool      flag;
22562d747510SLisandro Dalcin   PetscErrorCode ierr;
2257e5c89e4eSSatish Balay 
2258e5c89e4eSSatish Balay   PetscFunctionBegin;
22592d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
22602d747510SLisandro Dalcin   if (ivalue) PetscValidIntPointer(ivalue,4);
22612d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2262e5c89e4eSSatish Balay   if (flag) {
226396ef3cdfSSatish Balay     if (set) *set = PETSC_TRUE;
22642d747510SLisandro Dalcin     ierr = PetscOptionsStringToBool(value, &flag);CHKERRQ(ierr);
22652d747510SLisandro Dalcin     if (ivalue) *ivalue = flag;
2266e5c89e4eSSatish Balay   } else {
226796ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2268e5c89e4eSSatish Balay   }
2269e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2270e5c89e4eSSatish Balay }
2271e5c89e4eSSatish Balay 
2272e5c89e4eSSatish Balay /*@C
2273e5c89e4eSSatish Balay    PetscOptionsGetEList - Puts a list of option values that a single one may be selected from
2274e5c89e4eSSatish Balay 
2275e5c89e4eSSatish Balay    Not Collective
2276e5c89e4eSSatish Balay 
2277e5c89e4eSSatish Balay    Input Parameters:
22785c9cc608SHong Zhang +  options - options database, use NULL for default global database
2279c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
2280e5c89e4eSSatish Balay .  opt - option name
2281a264d7a6SBarry Smith .  list - the possible choices (one of these must be selected, anything else is invalid)
2282a2b725a8SWilliam Gropp -  ntext - number of choices
2283e5c89e4eSSatish Balay 
2284e5c89e4eSSatish Balay    Output Parameter:
22852efd9cb1SBarry Smith +  value - the index of the value to return (defaults to zero if the option name is given but no choice is listed)
2286e5c89e4eSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2287e5c89e4eSSatish Balay 
2288e5c89e4eSSatish Balay    Level: intermediate
2289e5c89e4eSSatish Balay 
229095452b02SPatrick Sanan    Notes:
229195452b02SPatrick Sanan     If the user does not supply the option value is NOT changed. Thus
22922efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
22932efd9cb1SBarry Smith 
2294a264d7a6SBarry Smith    See PetscOptionsFList() for when the choices are given in a PetscFunctionList()
2295e5c89e4eSSatish Balay 
2296e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
2297acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2298e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2299e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2300acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2301a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2302e5c89e4eSSatish Balay @*/
2303c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscInt ntext,PetscInt *value,PetscBool *set)
2304e5c89e4eSSatish Balay {
2305e5c89e4eSSatish Balay   PetscErrorCode ierr;
230658b0ac4eSStefano Zampini   size_t         alen,len = 0, tlen = 0;
2307e5c89e4eSSatish Balay   char           *svalue;
2308ace3abfcSBarry Smith   PetscBool      aset,flg = PETSC_FALSE;
2309e5c89e4eSSatish Balay   PetscInt       i;
2310e5c89e4eSSatish Balay 
2311e5c89e4eSSatish Balay   PetscFunctionBegin;
23122d747510SLisandro Dalcin   PetscValidCharPointer(opt,3);
2313e5c89e4eSSatish Balay   for (i=0; i<ntext; i++) {
2314e5c89e4eSSatish Balay     ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr);
2315e5c89e4eSSatish Balay     if (alen > len) len = alen;
231658b0ac4eSStefano Zampini     tlen += len + 1;
2317e5c89e4eSSatish Balay   }
2318e5c89e4eSSatish Balay   len += 5; /* a little extra space for user mistypes */
2319785e854fSJed Brown   ierr = PetscMalloc1(len,&svalue);CHKERRQ(ierr);
2320c5929fdfSBarry Smith   ierr = PetscOptionsGetString(options,pre,opt,svalue,len,&aset);CHKERRQ(ierr);
2321e5c89e4eSSatish Balay   if (aset) {
2322fbedd5e0SJed Brown     ierr = PetscEListFind(ntext,list,svalue,value,&flg);CHKERRQ(ierr);
232358b0ac4eSStefano Zampini     if (!flg) {
232458b0ac4eSStefano Zampini       char *avail,*pavl;
232558b0ac4eSStefano Zampini 
232658b0ac4eSStefano Zampini       ierr = PetscMalloc1(tlen,&avail);CHKERRQ(ierr);
232758b0ac4eSStefano Zampini       pavl = avail;
232858b0ac4eSStefano Zampini       for (i=0; i<ntext; i++) {
232958b0ac4eSStefano Zampini         ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr);
233058b0ac4eSStefano Zampini         ierr = PetscStrcpy(pavl,list[i]);CHKERRQ(ierr);
233158b0ac4eSStefano Zampini         pavl += alen;
233258b0ac4eSStefano Zampini         ierr = PetscStrcpy(pavl," ");CHKERRQ(ierr);
233358b0ac4eSStefano Zampini         pavl += 1;
233458b0ac4eSStefano Zampini       }
233558b0ac4eSStefano Zampini       ierr = PetscStrtolower(avail);CHKERRQ(ierr);
233658b0ac4eSStefano Zampini       SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown option %s for -%s%s. Available options: %s",svalue,pre ? pre : "",opt+1,avail);
233758b0ac4eSStefano Zampini     }
2338fbedd5e0SJed Brown     if (set) *set = PETSC_TRUE;
2339a297a907SKarl Rupp   } else if (set) *set = PETSC_FALSE;
2340e5c89e4eSSatish Balay   ierr = PetscFree(svalue);CHKERRQ(ierr);
2341e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2342e5c89e4eSSatish Balay }
2343e5c89e4eSSatish Balay 
2344e5c89e4eSSatish Balay /*@C
2345e5c89e4eSSatish Balay    PetscOptionsGetEnum - Gets the enum value for a particular option in the database.
2346e5c89e4eSSatish Balay 
2347e5c89e4eSSatish Balay    Not Collective
2348e5c89e4eSSatish Balay 
2349e5c89e4eSSatish Balay    Input Parameters:
23505c9cc608SHong Zhang +  options - options database, use NULL for default global database
2351c5929fdfSBarry Smith .  pre - option prefix or NULL
2352e5c89e4eSSatish Balay .  opt - option name
2353e5c89e4eSSatish Balay .  list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
2354e5c89e4eSSatish Balay -  defaultv - the default (current) value
2355e5c89e4eSSatish Balay 
2356e5c89e4eSSatish Balay    Output Parameter:
2357e5c89e4eSSatish Balay +  value - the  value to return
235896ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2359e5c89e4eSSatish Balay 
2360e5c89e4eSSatish Balay    Level: beginner
2361e5c89e4eSSatish Balay 
236295452b02SPatrick Sanan    Notes:
236395452b02SPatrick Sanan     If the user does not supply the option value is NOT changed. Thus
23642efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2365e5c89e4eSSatish Balay 
23662efd9cb1SBarry Smith           List is usually something like PCASMTypes or some other predefined list of enum names
2367e5c89e4eSSatish Balay 
2368e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
2369acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
2370acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
2371e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2372e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2373acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2374a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum()
2375e5c89e4eSSatish Balay @*/
2376c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscEnum *value,PetscBool *set)
2377e5c89e4eSSatish Balay {
2378e5c89e4eSSatish Balay   PetscErrorCode ierr;
237969a24498SJed Brown   PetscInt       ntext = 0,tval;
2380ace3abfcSBarry Smith   PetscBool      fset;
2381e5c89e4eSSatish Balay 
2382e5c89e4eSSatish Balay   PetscFunctionBegin;
23832d747510SLisandro Dalcin   PetscValidCharPointer(opt,3);
2384e5c89e4eSSatish Balay   while (list[ntext++]) {
2385e32f2f54SBarry Smith     if (ntext > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries");
2386e5c89e4eSSatish Balay   }
2387e32f2f54SBarry Smith   if (ntext < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix");
2388e5c89e4eSSatish Balay   ntext -= 3;
2389c5929fdfSBarry Smith   ierr = PetscOptionsGetEList(options,pre,opt,list,ntext,&tval,&fset);CHKERRQ(ierr);
239069a24498SJed Brown   /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */
2391809ceb46SBarry Smith   if (fset) *value = (PetscEnum)tval;
2392809ceb46SBarry Smith   if (set) *set = fset;
2393e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2394e5c89e4eSSatish Balay }
2395e5c89e4eSSatish Balay 
2396e5c89e4eSSatish Balay /*@C
23972d747510SLisandro Dalcin    PetscOptionsGetInt - Gets the integer value for a particular option in the database.
2398e5c89e4eSSatish Balay 
2399e5c89e4eSSatish Balay    Not Collective
2400e5c89e4eSSatish Balay 
2401e5c89e4eSSatish Balay    Input Parameters:
24025c9cc608SHong Zhang +  options - options database, use NULL for default global database
2403c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
2404e5c89e4eSSatish Balay -  name - the option one is seeking
2405e5c89e4eSSatish Balay 
2406e5c89e4eSSatish Balay    Output Parameter:
24072d747510SLisandro Dalcin +  ivalue - the integer value to return
240896ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2409e5c89e4eSSatish Balay 
2410e5c89e4eSSatish Balay    Level: beginner
2411e5c89e4eSSatish Balay 
2412e5c89e4eSSatish Balay    Notes:
24132d747510SLisandro Dalcin    If the user does not supply the option ivalue is NOT changed. Thus
24142efd9cb1SBarry Smith    you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
24155c07ccb8SBarry Smith 
2416e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
24172d747510SLisandro Dalcin           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
24182d747510SLisandro Dalcin           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
2419e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2420e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2421acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2422a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2423e5c89e4eSSatish Balay @*/
24242d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetInt(PetscOptions options,const char pre[],const char name[],PetscInt *ivalue,PetscBool *set)
2425e5c89e4eSSatish Balay {
24262d747510SLisandro Dalcin   const char     *value;
2427e5c89e4eSSatish Balay   PetscErrorCode ierr;
24282d747510SLisandro Dalcin   PetscBool      flag;
2429e5c89e4eSSatish Balay 
2430e5c89e4eSSatish Balay   PetscFunctionBegin;
24312d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
24322d747510SLisandro Dalcin   PetscValidIntPointer(ivalue,4);
24332d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2434e5c89e4eSSatish Balay   if (flag) {
243534a9cc2cSBarry Smith     if (!value) {
24362d747510SLisandro Dalcin       if (set) *set = PETSC_FALSE;
243734a9cc2cSBarry Smith     } else {
24382d747510SLisandro Dalcin       if (set) *set = PETSC_TRUE;
24392d747510SLisandro Dalcin       ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr);
2440e5c89e4eSSatish Balay     }
2441e5c89e4eSSatish Balay   } else {
244296ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2443e5c89e4eSSatish Balay   }
2444e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2445e5c89e4eSSatish Balay }
2446e5c89e4eSSatish Balay 
2447e2446a98SMatthew Knepley /*@C
2448e5c89e4eSSatish Balay    PetscOptionsGetReal - Gets the double precision value for a particular
2449e5c89e4eSSatish Balay    option in the database.
2450e5c89e4eSSatish Balay 
2451e5c89e4eSSatish Balay    Not Collective
2452e5c89e4eSSatish Balay 
2453e5c89e4eSSatish Balay    Input Parameters:
24545c9cc608SHong Zhang +  options - options database, use NULL for default global database
2455c5929fdfSBarry Smith .  pre - string to prepend to each name or NULL
2456e5c89e4eSSatish Balay -  name - the option one is seeking
2457e5c89e4eSSatish Balay 
2458e5c89e4eSSatish Balay    Output Parameter:
2459e5c89e4eSSatish Balay +  dvalue - the double value to return
246096ef3cdfSSatish Balay -  set - PETSC_TRUE if found, PETSC_FALSE if not found
2461e5c89e4eSSatish Balay 
246295452b02SPatrick Sanan    Notes:
246395452b02SPatrick Sanan     If the user does not supply the option dvalue is NOT changed. Thus
24642efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2465e4974155SBarry Smith 
2466e5c89e4eSSatish Balay    Level: beginner
2467e5c89e4eSSatish Balay 
2468e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2469acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(),
2470e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2471e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2472acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2473a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2474e5c89e4eSSatish Balay @*/
2475c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal *dvalue,PetscBool *set)
2476e5c89e4eSSatish Balay {
24772d747510SLisandro Dalcin   const char     *value;
2478ace3abfcSBarry Smith   PetscBool      flag;
24792d747510SLisandro Dalcin   PetscErrorCode ierr;
2480e5c89e4eSSatish Balay 
2481e5c89e4eSSatish Balay   PetscFunctionBegin;
24822d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
24832d747510SLisandro Dalcin   PetscValidRealPointer(dvalue,4);
24842d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2485e5c89e4eSSatish Balay   if (flag) {
2486a297a907SKarl Rupp     if (!value) {
2487a297a907SKarl Rupp       if (set) *set = PETSC_FALSE;
2488a297a907SKarl Rupp     } else {
2489a297a907SKarl Rupp       if (set) *set = PETSC_TRUE;
2490a297a907SKarl Rupp       ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr);
2491a297a907SKarl Rupp     }
2492e5c89e4eSSatish Balay   } else {
249396ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2494e5c89e4eSSatish Balay   }
2495e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2496e5c89e4eSSatish Balay }
2497e5c89e4eSSatish Balay 
2498e5c89e4eSSatish Balay /*@C
2499e5c89e4eSSatish Balay    PetscOptionsGetScalar - Gets the scalar value for a particular
2500e5c89e4eSSatish Balay    option in the database.
2501e5c89e4eSSatish Balay 
2502e5c89e4eSSatish Balay    Not Collective
2503e5c89e4eSSatish Balay 
2504e5c89e4eSSatish Balay    Input Parameters:
25055c9cc608SHong Zhang +  options - options database, use NULL for default global database
2506c5929fdfSBarry Smith .  pre - string to prepend to each name or NULL
2507e5c89e4eSSatish Balay -  name - the option one is seeking
2508e5c89e4eSSatish Balay 
2509e5c89e4eSSatish Balay    Output Parameter:
2510e5c89e4eSSatish Balay +  dvalue - the double value to return
251196ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2512e5c89e4eSSatish Balay 
2513e5c89e4eSSatish Balay    Level: beginner
2514e5c89e4eSSatish Balay 
2515e5c89e4eSSatish Balay    Usage:
2516eb4ae41dSBarry Smith    A complex number 2+3i must be specified with NO spaces
2517e5c89e4eSSatish Balay 
251895452b02SPatrick Sanan    Notes:
251995452b02SPatrick Sanan     If the user does not supply the option dvalue is NOT changed. Thus
25202efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2521e4974155SBarry Smith 
2522e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2523acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2524e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2525e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2526acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2527a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2528e5c89e4eSSatish Balay @*/
2529c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar *dvalue,PetscBool *set)
2530e5c89e4eSSatish Balay {
25312d747510SLisandro Dalcin   const char     *value;
2532ace3abfcSBarry Smith   PetscBool      flag;
2533e5c89e4eSSatish Balay   PetscErrorCode ierr;
2534e5c89e4eSSatish Balay 
2535e5c89e4eSSatish Balay   PetscFunctionBegin;
25362d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
25372d747510SLisandro Dalcin   PetscValidScalarPointer(dvalue,4);
25382d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2539e5c89e4eSSatish Balay   if (flag) {
2540e5c89e4eSSatish Balay     if (!value) {
254196ef3cdfSSatish Balay       if (set) *set = PETSC_FALSE;
2542e5c89e4eSSatish Balay     } else {
2543e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX)
2544cfbddea1SSatish Balay       ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr);
2545e5c89e4eSSatish Balay #else
2546eb4ae41dSBarry Smith       ierr = PetscOptionsStringToScalar(value,dvalue);CHKERRQ(ierr);
2547e5c89e4eSSatish Balay #endif
254896ef3cdfSSatish Balay       if (set) *set = PETSC_TRUE;
2549e5c89e4eSSatish Balay     }
2550e5c89e4eSSatish Balay   } else { /* flag */
255196ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2552e5c89e4eSSatish Balay   }
2553e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2554e5c89e4eSSatish Balay }
2555e5c89e4eSSatish Balay 
2556e5c89e4eSSatish Balay /*@C
2557e5c89e4eSSatish Balay    PetscOptionsGetString - Gets the string value for a particular option in
2558e5c89e4eSSatish Balay    the database.
2559e5c89e4eSSatish Balay 
2560e5c89e4eSSatish Balay    Not Collective
2561e5c89e4eSSatish Balay 
2562e5c89e4eSSatish Balay    Input Parameters:
25635c9cc608SHong Zhang +  options - options database, use NULL for default global database
2564c5929fdfSBarry Smith .  pre - string to prepend to name or NULL
2565e5c89e4eSSatish Balay .  name - the option one is seeking
2566bcbf2dc5SJed Brown -  len - maximum length of the string including null termination
2567e5c89e4eSSatish Balay 
2568e5c89e4eSSatish Balay    Output Parameters:
2569e5c89e4eSSatish Balay +  string - location to copy string
257096ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2571e5c89e4eSSatish Balay 
2572e5c89e4eSSatish Balay    Level: beginner
2573e5c89e4eSSatish Balay 
2574e5c89e4eSSatish Balay    Fortran Note:
2575e5c89e4eSSatish Balay    The Fortran interface is slightly different from the C/C++
2576e5c89e4eSSatish Balay    interface (len is not used).  Sample usage in Fortran follows
2577e5c89e4eSSatish Balay .vb
2578e5c89e4eSSatish Balay       character *20    string
257993e6ba5cSBarry Smith       PetscErrorCode   ierr
258093e6ba5cSBarry Smith       PetscBool        set
25811b266c99SBarry Smith       call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr)
2582e5c89e4eSSatish Balay .ve
2583e5c89e4eSSatish Balay 
258495452b02SPatrick Sanan    Notes:
258595452b02SPatrick 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
2586e4974155SBarry Smith 
25872efd9cb1SBarry Smith            If the user does not use the option then the string is not changed. Thus
25882efd9cb1SBarry Smith            you should ALWAYS initialize the string if you access it without first checking if the set flag is true.
25892efd9cb1SBarry Smith 
2590f3dea69dSBarry Smith     Note:
2591f3dea69dSBarry 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).
2592f3dea69dSBarry Smith 
2593e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
2594acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2595e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2596e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2597acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2598a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2599e5c89e4eSSatish Balay @*/
2600c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool *set)
2601e5c89e4eSSatish Balay {
26022d747510SLisandro Dalcin   const char     *value;
2603ace3abfcSBarry Smith   PetscBool      flag;
26042d747510SLisandro Dalcin   PetscErrorCode ierr;
2605e5c89e4eSSatish Balay 
2606e5c89e4eSSatish Balay   PetscFunctionBegin;
26072d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
26082d747510SLisandro Dalcin   PetscValidCharPointer(string,4);
26092d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2610e5c89e4eSSatish Balay   if (!flag) {
261196ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2612e5c89e4eSSatish Balay   } else {
261396ef3cdfSSatish Balay     if (set) *set = PETSC_TRUE;
2614e5c89e4eSSatish Balay     if (value) {
2615e5c89e4eSSatish Balay       ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr);
2616e5c89e4eSSatish Balay     } else {
2617580bdb30SBarry Smith       ierr = PetscArrayzero(string,len);CHKERRQ(ierr);
2618e5c89e4eSSatish Balay     }
2619e5c89e4eSSatish Balay   }
2620e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2621e5c89e4eSSatish Balay }
2622e5c89e4eSSatish Balay 
2623c5929fdfSBarry Smith char *PetscOptionsGetStringMatlab(PetscOptions options,const char pre[],const char name[])
262414ce751eSBarry Smith {
26252d747510SLisandro Dalcin   const char     *value;
262614ce751eSBarry Smith   PetscBool      flag;
26272d747510SLisandro Dalcin   PetscErrorCode ierr;
262814ce751eSBarry Smith 
262914ce751eSBarry Smith   PetscFunctionBegin;
263002c9f0b5SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);if (ierr) PetscFunctionReturn(NULL);
26312d747510SLisandro Dalcin   if (flag) PetscFunctionReturn((char*)value);
263202c9f0b5SLisandro Dalcin   else PetscFunctionReturn(NULL);
263314ce751eSBarry Smith }
263414ce751eSBarry Smith 
26352d747510SLisandro Dalcin /*@C
26362d747510SLisandro Dalcin    PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular
26372d747510SLisandro Dalcin    option in the database.  The values must be separated with commas with
26382d747510SLisandro Dalcin    no intervening spaces.
26392d747510SLisandro Dalcin 
26402d747510SLisandro Dalcin    Not Collective
26412d747510SLisandro Dalcin 
26422d747510SLisandro Dalcin    Input Parameters:
26432d747510SLisandro Dalcin +  options - options database, use NULL for default global database
26442d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
26452d747510SLisandro Dalcin .  name - the option one is seeking
26462d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
26472d747510SLisandro Dalcin 
26482d747510SLisandro Dalcin    Output Parameter:
26492d747510SLisandro Dalcin +  dvalue - the integer values to return
26502d747510SLisandro Dalcin .  nmax - actual number of values retreived
26512d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
26522d747510SLisandro Dalcin 
26532d747510SLisandro Dalcin    Level: beginner
26542d747510SLisandro Dalcin 
26552d747510SLisandro Dalcin    Notes:
26562d747510SLisandro Dalcin        TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE
26572d747510SLisandro Dalcin        FALSE, false, NO, no, and 0 all translate to PETSC_FALSE
26582d747510SLisandro Dalcin 
26592d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
26602d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(),
26612d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
26622d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
26632d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
26642d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
26652d747510SLisandro Dalcin @*/
26662d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt *nmax,PetscBool *set)
26672d747510SLisandro Dalcin {
26682d747510SLisandro Dalcin   const char     *svalue;
26692d747510SLisandro Dalcin   char           *value;
26702d747510SLisandro Dalcin   PetscErrorCode ierr;
26712d747510SLisandro Dalcin   PetscInt       n = 0;
26722d747510SLisandro Dalcin   PetscBool      flag;
26732d747510SLisandro Dalcin   PetscToken     token;
26742d747510SLisandro Dalcin 
26752d747510SLisandro Dalcin   PetscFunctionBegin;
26762d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
26772d747510SLisandro Dalcin   PetscValidIntPointer(dvalue,4);
26782d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
26792d747510SLisandro Dalcin 
26802d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
26812d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
26822d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
26832d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
26842d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
26852d747510SLisandro Dalcin   while (value && n < *nmax) {
26862d747510SLisandro Dalcin     ierr = PetscOptionsStringToBool(value,dvalue);CHKERRQ(ierr);
26872d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
26882d747510SLisandro Dalcin     dvalue++;
26892d747510SLisandro Dalcin     n++;
26902d747510SLisandro Dalcin   }
26912d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
26922d747510SLisandro Dalcin   *nmax = n;
26932d747510SLisandro Dalcin   PetscFunctionReturn(0);
26942d747510SLisandro Dalcin }
26952d747510SLisandro Dalcin 
26962d747510SLisandro Dalcin /*@C
26972d747510SLisandro Dalcin    PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database.
26982d747510SLisandro Dalcin 
26992d747510SLisandro Dalcin    Not Collective
27002d747510SLisandro Dalcin 
27012d747510SLisandro Dalcin    Input Parameters:
27022d747510SLisandro Dalcin +  options - options database, use NULL for default global database
27032d747510SLisandro Dalcin .  pre - option prefix or NULL
27042d747510SLisandro Dalcin .  name - option name
27052d747510SLisandro Dalcin .  list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
27062d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
27072d747510SLisandro Dalcin 
27082d747510SLisandro Dalcin    Output Parameters:
27092d747510SLisandro Dalcin +  ivalue - the  enum values to return
27102d747510SLisandro Dalcin .  nmax - actual number of values retreived
27112d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
27122d747510SLisandro Dalcin 
27132d747510SLisandro Dalcin    Level: beginner
27142d747510SLisandro Dalcin 
27152d747510SLisandro Dalcin    Notes:
27162d747510SLisandro Dalcin    The array must be passed as a comma separated list.
27172d747510SLisandro Dalcin 
27182d747510SLisandro Dalcin    There must be no intervening spaces between the values.
27192d747510SLisandro Dalcin 
27202d747510SLisandro Dalcin    list is usually something like PCASMTypes or some other predefined list of enum names.
27212d747510SLisandro Dalcin 
27222d747510SLisandro Dalcin .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
27232d747510SLisandro Dalcin           PetscOptionsGetEnum(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
27242d747510SLisandro Dalcin           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), PetscOptionsName(),
27252d747510SLisandro Dalcin           PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), PetscOptionsStringArray(),PetscOptionsRealArray(),
27262d747510SLisandro Dalcin           PetscOptionsScalar(), PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
27272d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum()
27282d747510SLisandro Dalcin @*/
27292d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char *const *list,PetscEnum ivalue[],PetscInt *nmax,PetscBool *set)
27302d747510SLisandro Dalcin {
27312d747510SLisandro Dalcin   const char     *svalue;
27322d747510SLisandro Dalcin   char           *value;
27332d747510SLisandro Dalcin   PetscInt       n = 0;
27342d747510SLisandro Dalcin   PetscEnum      evalue;
27352d747510SLisandro Dalcin   PetscBool      flag;
27362d747510SLisandro Dalcin   PetscToken     token;
27372d747510SLisandro Dalcin   PetscErrorCode ierr;
27382d747510SLisandro Dalcin 
27392d747510SLisandro Dalcin   PetscFunctionBegin;
27402d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
27412d747510SLisandro Dalcin   PetscValidPointer(list,4);
27422d747510SLisandro Dalcin   PetscValidPointer(ivalue,5);
27432d747510SLisandro Dalcin   PetscValidIntPointer(nmax,6);
27442d747510SLisandro Dalcin 
27452d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
27462d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
27472d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
27482d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
27492d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
27502d747510SLisandro Dalcin   while (value && n < *nmax) {
27512d747510SLisandro Dalcin     ierr = PetscEnumFind(list,value,&evalue,&flag);CHKERRQ(ierr);
27522d747510SLisandro Dalcin     if (!flag) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown enum value '%s' for -%s%s",svalue,pre ? pre : "",name+1);
27532d747510SLisandro Dalcin     ivalue[n++] = evalue;
27542d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
27552d747510SLisandro Dalcin   }
27562d747510SLisandro Dalcin   ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
27572d747510SLisandro Dalcin   *nmax = n;
27582d747510SLisandro Dalcin   PetscFunctionReturn(0);
27592d747510SLisandro Dalcin }
27602d747510SLisandro Dalcin 
27612d747510SLisandro Dalcin /*@C
27622d747510SLisandro Dalcin    PetscOptionsGetIntArray - Gets an array of integer values for a particular
27632d747510SLisandro Dalcin    option in the database.
27642d747510SLisandro Dalcin 
27652d747510SLisandro Dalcin    Not Collective
27662d747510SLisandro Dalcin 
27672d747510SLisandro Dalcin    Input Parameters:
27682d747510SLisandro Dalcin +  options - options database, use NULL for default global database
27692d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
27702d747510SLisandro Dalcin .  name - the option one is seeking
27712d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
27722d747510SLisandro Dalcin 
27732d747510SLisandro Dalcin    Output Parameter:
27742d747510SLisandro Dalcin +  ivalue - the integer values to return
27752d747510SLisandro Dalcin .  nmax - actual number of values retreived
27762d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
27772d747510SLisandro Dalcin 
27782d747510SLisandro Dalcin    Level: beginner
27792d747510SLisandro Dalcin 
27802d747510SLisandro Dalcin    Notes:
27812d747510SLisandro Dalcin    The array can be passed as
27822d747510SLisandro Dalcin    a comma separated list:                                 0,1,2,3,4,5,6,7
27832d747510SLisandro Dalcin    a range (start-end+1):                                  0-8
27842d747510SLisandro Dalcin    a range with given increment (start-end+1:inc):         0-7:2
27852d747510SLisandro Dalcin    a combination of values and ranges separated by commas: 0,1-8,8-15:2
27862d747510SLisandro Dalcin 
27872d747510SLisandro Dalcin    There must be no intervening spaces between the values.
27882d747510SLisandro Dalcin 
27892d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
27902d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(),
27912d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
27922d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
27932d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
27942d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
27952d747510SLisandro Dalcin @*/
27962d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt *nmax,PetscBool *set)
27972d747510SLisandro Dalcin {
27982d747510SLisandro Dalcin   const char     *svalue;
27992d747510SLisandro Dalcin   char           *value;
28002d747510SLisandro Dalcin   PetscErrorCode ierr;
28012d747510SLisandro Dalcin   PetscInt       n = 0,i,j,start,end,inc,nvalues;
28022d747510SLisandro Dalcin   size_t         len;
28032d747510SLisandro Dalcin   PetscBool      flag,foundrange;
28042d747510SLisandro Dalcin   PetscToken     token;
28052d747510SLisandro Dalcin 
28062d747510SLisandro Dalcin   PetscFunctionBegin;
28072d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
28082d747510SLisandro Dalcin   PetscValidIntPointer(ivalue,4);
28092d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
28102d747510SLisandro Dalcin 
28112d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
28122d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
28132d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
28142d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
28152d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
28162d747510SLisandro Dalcin   while (value && n < *nmax) {
28172d747510SLisandro Dalcin     /* look for form  d-D where d and D are integers */
28182d747510SLisandro Dalcin     foundrange = PETSC_FALSE;
28192d747510SLisandro Dalcin     ierr       = PetscStrlen(value,&len);CHKERRQ(ierr);
28202d747510SLisandro Dalcin     if (value[0] == '-') i=2;
28212d747510SLisandro Dalcin     else i=1;
28222d747510SLisandro Dalcin     for (;i<(int)len; i++) {
28232d747510SLisandro Dalcin       if (value[i] == '-') {
28242d747510SLisandro Dalcin         if (i == (int)len-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value);
28252d747510SLisandro Dalcin         value[i] = 0;
28262d747510SLisandro Dalcin 
28272d747510SLisandro Dalcin         ierr = PetscOptionsStringToInt(value,&start);CHKERRQ(ierr);
28282d747510SLisandro Dalcin         inc  = 1;
28292d747510SLisandro Dalcin         j    = i+1;
28302d747510SLisandro Dalcin         for (;j<(int)len; j++) {
28312d747510SLisandro Dalcin           if (value[j] == ':') {
28322d747510SLisandro Dalcin             value[j] = 0;
28332d747510SLisandro Dalcin 
28342d747510SLisandro Dalcin             ierr = PetscOptionsStringToInt(value+j+1,&inc);CHKERRQ(ierr);
28352d747510SLisandro Dalcin             if (inc <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry,%s cannot have negative increment",n,value+j+1);
28362d747510SLisandro Dalcin             break;
28372d747510SLisandro Dalcin           }
28382d747510SLisandro Dalcin         }
28392d747510SLisandro Dalcin         ierr = PetscOptionsStringToInt(value+i+1,&end);CHKERRQ(ierr);
28402d747510SLisandro Dalcin         if (end <= start) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry, %s-%s cannot have decreasing list",n,value,value+i+1);
28412d747510SLisandro Dalcin         nvalues = (end-start)/inc + (end-start)%inc;
28422d747510SLisandro Dalcin         if (n + nvalues  > *nmax) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry, not enough space left in array (%D) to contain entire range from %D to %D",n,*nmax-n,start,end);
28432d747510SLisandro Dalcin         for (;start<end; start+=inc) {
28442d747510SLisandro Dalcin           *ivalue = start; ivalue++;n++;
28452d747510SLisandro Dalcin         }
28462d747510SLisandro Dalcin         foundrange = PETSC_TRUE;
28472d747510SLisandro Dalcin         break;
28482d747510SLisandro Dalcin       }
28492d747510SLisandro Dalcin     }
28502d747510SLisandro Dalcin     if (!foundrange) {
28512d747510SLisandro Dalcin       ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr);
28522d747510SLisandro Dalcin       ivalue++;
28532d747510SLisandro Dalcin       n++;
28542d747510SLisandro Dalcin     }
28552d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
28562d747510SLisandro Dalcin   }
28572d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
28582d747510SLisandro Dalcin   *nmax = n;
28592d747510SLisandro Dalcin   PetscFunctionReturn(0);
28602d747510SLisandro Dalcin }
28612d747510SLisandro Dalcin 
28622d747510SLisandro Dalcin /*@C
28632d747510SLisandro Dalcin    PetscOptionsGetRealArray - Gets an array of double precision values for a
28642d747510SLisandro Dalcin    particular option in the database.  The values must be separated with
28652d747510SLisandro Dalcin    commas with no intervening spaces.
28662d747510SLisandro Dalcin 
28672d747510SLisandro Dalcin    Not Collective
28682d747510SLisandro Dalcin 
28692d747510SLisandro Dalcin    Input Parameters:
28702d747510SLisandro Dalcin +  options - options database, use NULL for default global database
28712d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
28722d747510SLisandro Dalcin .  name - the option one is seeking
28732d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
28742d747510SLisandro Dalcin 
28752d747510SLisandro Dalcin    Output Parameters:
28762d747510SLisandro Dalcin +  dvalue - the double values to return
28772d747510SLisandro Dalcin .  nmax - actual number of values retreived
28782d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
28792d747510SLisandro Dalcin 
28802d747510SLisandro Dalcin    Level: beginner
28812d747510SLisandro Dalcin 
28822d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
28832d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
28842d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
28852d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
28862d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
28872d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
28882d747510SLisandro Dalcin @*/
28892d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscBool *set)
28902d747510SLisandro Dalcin {
28912d747510SLisandro Dalcin   const char     *svalue;
28922d747510SLisandro Dalcin   char           *value;
28932d747510SLisandro Dalcin   PetscErrorCode ierr;
28942d747510SLisandro Dalcin   PetscInt       n = 0;
28952d747510SLisandro Dalcin   PetscBool      flag;
28962d747510SLisandro Dalcin   PetscToken     token;
28972d747510SLisandro Dalcin 
28982d747510SLisandro Dalcin   PetscFunctionBegin;
28992d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
29002d747510SLisandro Dalcin   PetscValidRealPointer(dvalue,4);
29012d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
29022d747510SLisandro Dalcin 
29032d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
29042d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
29052d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
29062d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
29072d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
29082d747510SLisandro Dalcin   while (value && n < *nmax) {
29092d747510SLisandro Dalcin     ierr = PetscOptionsStringToReal(value,dvalue++);CHKERRQ(ierr);
29102d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
29112d747510SLisandro Dalcin     n++;
29122d747510SLisandro Dalcin   }
29132d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
29142d747510SLisandro Dalcin   *nmax = n;
29152d747510SLisandro Dalcin   PetscFunctionReturn(0);
29162d747510SLisandro Dalcin }
29172d747510SLisandro Dalcin 
29182d747510SLisandro Dalcin /*@C
29192d747510SLisandro Dalcin    PetscOptionsGetScalarArray - Gets an array of scalars for a
29202d747510SLisandro Dalcin    particular option in the database.  The values must be separated with
29212d747510SLisandro Dalcin    commas with no intervening spaces.
29222d747510SLisandro Dalcin 
29232d747510SLisandro Dalcin    Not Collective
29242d747510SLisandro Dalcin 
29252d747510SLisandro Dalcin    Input Parameters:
29262d747510SLisandro Dalcin +  options - options database, use NULL for default global database
29272d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
29282d747510SLisandro Dalcin .  name - the option one is seeking
29292d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
29302d747510SLisandro Dalcin 
29312d747510SLisandro Dalcin    Output Parameters:
29322d747510SLisandro Dalcin +  dvalue - the scalar values to return
29332d747510SLisandro Dalcin .  nmax - actual number of values retreived
29342d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
29352d747510SLisandro Dalcin 
29362d747510SLisandro Dalcin    Level: beginner
29372d747510SLisandro Dalcin 
29382d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
29392d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
29402d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
29412d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
29422d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
29432d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
29442d747510SLisandro Dalcin @*/
29452d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt *nmax,PetscBool *set)
29462d747510SLisandro Dalcin {
29472d747510SLisandro Dalcin   const char     *svalue;
29482d747510SLisandro Dalcin   char           *value;
29492d747510SLisandro Dalcin   PetscErrorCode ierr;
29502d747510SLisandro Dalcin   PetscInt       n = 0;
29512d747510SLisandro Dalcin   PetscBool      flag;
29522d747510SLisandro Dalcin   PetscToken     token;
29532d747510SLisandro Dalcin 
29542d747510SLisandro Dalcin   PetscFunctionBegin;
29552d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
29562d747510SLisandro Dalcin   PetscValidRealPointer(dvalue,4);
29572d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
29582d747510SLisandro Dalcin 
29592d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
29602d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
29612d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
29622d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
29632d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
29642d747510SLisandro Dalcin   while (value && n < *nmax) {
29652d747510SLisandro Dalcin     ierr = PetscOptionsStringToScalar(value,dvalue++);CHKERRQ(ierr);
29662d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
29672d747510SLisandro Dalcin     n++;
29682d747510SLisandro Dalcin   }
29692d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
29702d747510SLisandro Dalcin   *nmax = n;
29712d747510SLisandro Dalcin   PetscFunctionReturn(0);
29722d747510SLisandro Dalcin }
297314ce751eSBarry Smith 
2974e5c89e4eSSatish Balay /*@C
2975e5c89e4eSSatish Balay    PetscOptionsGetStringArray - Gets an array of string values for a particular
2976e5c89e4eSSatish Balay    option in the database. The values must be separated with commas with
2977e5c89e4eSSatish Balay    no intervening spaces.
2978e5c89e4eSSatish Balay 
2979e5c89e4eSSatish Balay    Not Collective
2980e5c89e4eSSatish Balay 
2981e5c89e4eSSatish Balay    Input Parameters:
29825c9cc608SHong Zhang +  options - options database, use NULL for default global database
2983c5929fdfSBarry Smith .  pre - string to prepend to name or NULL
2984e5c89e4eSSatish Balay .  name - the option one is seeking
2985e5c89e4eSSatish Balay -  nmax - maximum number of strings
2986e5c89e4eSSatish Balay 
2987e7b76fa7SPatrick Sanan    Output Parameters:
2988e5c89e4eSSatish Balay +  strings - location to copy strings
2989e7b76fa7SPatrick Sanan .  nmax - the number of strings found
299096ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2991e5c89e4eSSatish Balay 
2992e5c89e4eSSatish Balay    Level: beginner
2993e5c89e4eSSatish Balay 
2994e5c89e4eSSatish Balay    Notes:
2995e7b76fa7SPatrick Sanan    The nmax parameter is used for both input and output.
2996e7b76fa7SPatrick Sanan 
2997e5c89e4eSSatish Balay    The user should pass in an array of pointers to char, to hold all the
2998e5c89e4eSSatish Balay    strings returned by this function.
2999e5c89e4eSSatish Balay 
3000e5c89e4eSSatish Balay    The user is responsible for deallocating the strings that are
3001e5c89e4eSSatish Balay    returned. The Fortran interface for this routine is not supported.
3002e5c89e4eSSatish Balay 
3003e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
3004acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
3005e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
3006e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
3007acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
3008a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
3009e5c89e4eSSatish Balay @*/
3010c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscBool *set)
3011e5c89e4eSSatish Balay {
30122d747510SLisandro Dalcin   const char     *svalue;
3013e5c89e4eSSatish Balay   char           *value;
3014e5c89e4eSSatish Balay   PetscErrorCode ierr;
30152d747510SLisandro Dalcin   PetscInt       n = 0;
3016ace3abfcSBarry Smith   PetscBool      flag;
30179c9d3cfdSBarry Smith   PetscToken     token;
3018e5c89e4eSSatish Balay 
3019e5c89e4eSSatish Balay   PetscFunctionBegin;
30202d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
30212d747510SLisandro Dalcin   PetscValidPointer(strings,4);
30222d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
3023e5c89e4eSSatish Balay 
30242d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
30252d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
30262d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
30272d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
3028e5c89e4eSSatish Balay   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
30292d747510SLisandro Dalcin   while (value && n < *nmax) {
3030e5c89e4eSSatish Balay     ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr);
3031e5c89e4eSSatish Balay     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
3032e5c89e4eSSatish Balay     n++;
3033e5c89e4eSSatish Balay   }
30348c74ee41SBarry Smith   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
3035e5c89e4eSSatish Balay   *nmax = n;
3036e5c89e4eSSatish Balay   PetscFunctionReturn(0);
3037e5c89e4eSSatish Balay }
303806824ed3SPatrick Sanan 
303906824ed3SPatrick Sanan /*@C
304006824ed3SPatrick Sanan    PetscOptionsDeprecated - mark an option as deprecated, optionally replacing it with a new one
304106824ed3SPatrick Sanan 
304206824ed3SPatrick Sanan    Prints a deprecation warning, unless an option is supplied to suppress.
304306824ed3SPatrick Sanan 
30441c9f3c13SBarry Smith    Logically Collective
304506824ed3SPatrick Sanan 
304606824ed3SPatrick Sanan    Input Parameters:
30479503aa97SPatrick Sanan +  pre - string to prepend to name or NULL
304806824ed3SPatrick Sanan .  oldname - the old, deprecated option
304906824ed3SPatrick Sanan .  newname - the new option, or NULL if option is purely removed
30509f3a6782SPatrick Sanan .  version - a string describing the version of first deprecation, e.g. "3.9"
30519f3a6782SPatrick Sanan -  info - additional information string, or NULL.
305206824ed3SPatrick Sanan 
305306824ed3SPatrick Sanan    Options Database Keys:
305406824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings
305506824ed3SPatrick Sanan 
305606824ed3SPatrick Sanan    Notes:
30571c9f3c13SBarry Smith    Must be called between PetscOptionsBegin() (or PetscObjectOptionsBegin()) and PetscOptionsEnd().
30581c9f3c13SBarry Smith    Only the proces of rank zero that owns the PetscOptionsItems are argument (managed by PetscOptionsBegin() or
30591c9f3c13SBarry Smith    PetscObjectOptionsBegin() prints the information
3060b40114eaSPatrick Sanan    If newname is provided, the old option is replaced. Otherwise, it remains
3061b40114eaSPatrick Sanan    in the options database.
30629f3a6782SPatrick Sanan    If an option is not replaced, the info argument should be used to advise the user
30639f3a6782SPatrick Sanan    on how to proceed.
30649f3a6782SPatrick Sanan    There is a limit on the length of the warning printed, so very long strings
30659f3a6782SPatrick Sanan    provided as info may be truncated.
306606824ed3SPatrick Sanan 
306706824ed3SPatrick Sanan    Level: developer
306806824ed3SPatrick Sanan 
306906824ed3SPatrick Sanan .seealso: PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsScalar(), PetscOptionsBool(), PetscOptionsString(), PetscOptionsSetValue()
307006824ed3SPatrick Sanan 
307106824ed3SPatrick Sanan @*/
30729f3a6782SPatrick Sanan PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems *PetscOptionsObject,const char oldname[],const char newname[],const char version[],const char info[])
307306824ed3SPatrick Sanan {
307406824ed3SPatrick Sanan   PetscErrorCode     ierr;
307506824ed3SPatrick Sanan   PetscBool          found,quiet;
307606824ed3SPatrick Sanan   const char         *value;
307706824ed3SPatrick Sanan   const char * const quietopt="-options_suppress_deprecated_warnings";
30789f3a6782SPatrick Sanan   char               msg[4096];
3079b0bdc838SStefano Zampini   char               *prefix = NULL;
3080b0bdc838SStefano Zampini   PetscOptions       options = NULL;
3081b0bdc838SStefano Zampini   MPI_Comm           comm = PETSC_COMM_SELF;
308206824ed3SPatrick Sanan 
308306824ed3SPatrick Sanan   PetscFunctionBegin;
308406824ed3SPatrick Sanan   PetscValidCharPointer(oldname,2);
308506824ed3SPatrick Sanan   PetscValidCharPointer(version,4);
3086b0bdc838SStefano Zampini   if (PetscOptionsObject) {
3087b0bdc838SStefano Zampini     prefix  = PetscOptionsObject->prefix;
3088b0bdc838SStefano Zampini     options = PetscOptionsObject->options;
3089b0bdc838SStefano Zampini     comm    = PetscOptionsObject->comm;
3090b0bdc838SStefano Zampini   }
3091b0bdc838SStefano Zampini   ierr = PetscOptionsFindPair(options,prefix,oldname,&value,&found);CHKERRQ(ierr);
309206824ed3SPatrick Sanan   if (found) {
309306824ed3SPatrick Sanan     if (newname) {
3094b0bdc838SStefano Zampini       if (prefix) {
3095b0bdc838SStefano Zampini         ierr = PetscOptionsPrefixPush(options,prefix);CHKERRQ(ierr);
3096d255429eSPatrick Sanan       }
3097b0bdc838SStefano Zampini       ierr = PetscOptionsSetValue(options,newname,value);CHKERRQ(ierr);
3098b0bdc838SStefano Zampini       if (prefix) {
3099b0bdc838SStefano Zampini         ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr);
3100d255429eSPatrick Sanan       }
3101b0bdc838SStefano Zampini       ierr = PetscOptionsClearValue(options,oldname);CHKERRQ(ierr);
3102b40114eaSPatrick Sanan     }
310306824ed3SPatrick Sanan     quiet = PETSC_FALSE;
3104b0bdc838SStefano Zampini     ierr = PetscOptionsGetBool(options,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr);
310506824ed3SPatrick Sanan     if (!quiet) {
31069f3a6782SPatrick Sanan       ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr);
31071fa95f81SSatish Balay       ierr = PetscStrcat(msg,oldname);CHKERRQ(ierr);
3108928bb9adSStefano Zampini       ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr);
31099f3a6782SPatrick Sanan       ierr = PetscStrcat(msg,version);CHKERRQ(ierr);
31109f3a6782SPatrick Sanan       ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr);
311106824ed3SPatrick Sanan       if (newname) {
31129f3a6782SPatrick Sanan         ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr);
31139f3a6782SPatrick Sanan         ierr = PetscStrcat(msg,newname);CHKERRQ(ierr);
31149f3a6782SPatrick Sanan         ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr);
311506824ed3SPatrick Sanan       }
31169f3a6782SPatrick Sanan       if (info) {
31179f3a6782SPatrick Sanan         ierr = PetscStrcat(msg," ");CHKERRQ(ierr);
31189f3a6782SPatrick Sanan         ierr = PetscStrcat(msg,info);CHKERRQ(ierr);
31199f3a6782SPatrick Sanan       }
31209f3a6782SPatrick Sanan       ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr);
31219f3a6782SPatrick Sanan       ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr);
31229f3a6782SPatrick Sanan       ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr);
3123b0bdc838SStefano Zampini       ierr = PetscPrintf(comm,msg);CHKERRQ(ierr);
312406824ed3SPatrick Sanan     }
312506824ed3SPatrick Sanan   }
312606824ed3SPatrick Sanan   PetscFunctionReturn(0);
312706824ed3SPatrick Sanan }
3128