xref: /petsc/src/sys/objects/options.c (revision d8d19677bbccf95218448bee62e6b87f4513e133)
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 
169362febeeSStefano Zampini   PetscFunctionBegin;
1702d747510SLisandro Dalcin   if (!*options) return 0;
1713de2bfdfSBarry 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()");
1722d747510SLisandro Dalcin   ierr = PetscOptionsClear(*options);if (ierr) return ierr;
1732d747510SLisandro Dalcin   /* XXX what about monitors ? */
1742800570dSLisandro Dalcin   free(*options);
1752d747510SLisandro Dalcin   *options = NULL;
176e5c89e4eSSatish Balay   PetscFunctionReturn(0);
177e5c89e4eSSatish Balay }
178e5c89e4eSSatish Balay 
1792d747510SLisandro Dalcin /*
1802d747510SLisandro Dalcin     PetscOptionsCreateDefault - Creates the default global options database
1812d747510SLisandro Dalcin */
1822d747510SLisandro Dalcin PetscErrorCode PetscOptionsCreateDefault(void)
183e5c89e4eSSatish Balay {
184e5c89e4eSSatish Balay   PetscErrorCode ierr;
185e5c89e4eSSatish Balay 
1862d747510SLisandro Dalcin   if (!defaultoptions) {
1872d747510SLisandro Dalcin     ierr = PetscOptionsCreate(&defaultoptions);if (ierr) return ierr;
1882d747510SLisandro Dalcin   }
1892d747510SLisandro Dalcin   return 0;
1902d747510SLisandro Dalcin }
1912d747510SLisandro Dalcin 
192b4205f0bSBarry Smith /*@
193b4205f0bSBarry Smith       PetscOptionsPush - Push a new PetscOptions object as the default provider of options
1941c9f3c13SBarry Smith                          Allows using different parts of a code to use different options databases
195b4205f0bSBarry Smith 
196b4205f0bSBarry Smith   Logically Collective
197b4205f0bSBarry Smith 
198b4205f0bSBarry Smith   Input Parameter:
199b4205f0bSBarry Smith .   opt - the options obtained with PetscOptionsCreate()
200b4205f0bSBarry Smith 
201b4205f0bSBarry Smith   Notes:
202b4205f0bSBarry Smith   Use PetscOptionsPop() to return to the previous default options database
2031c9f3c13SBarry Smith 
2049666a313SBarry Smith   The collectivity of this routine is complex; only the MPI processes that call this routine will
2051c9f3c13SBarry Smith   have the affect of these options. If some processes that create objects call this routine and others do
2061c9f3c13SBarry Smith   not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
2071c9f3c13SBarry Smith   on different ranks.
208b4205f0bSBarry Smith 
2093de2bfdfSBarry Smith    Level: advanced
2103de2bfdfSBarry Smith 
2113c6db4c4SPierre Jolivet .seealso: PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsInsert(), PetscOptionsSetValue(), PetscOptionsLeft()
212b4205f0bSBarry Smith 
213b4205f0bSBarry Smith @*/
214b4205f0bSBarry Smith PetscErrorCode PetscOptionsPush(PetscOptions opt)
215b4205f0bSBarry Smith {
216b4205f0bSBarry Smith   PetscErrorCode ierr;
217b4205f0bSBarry Smith 
218b4205f0bSBarry Smith   PetscFunctionBegin;
219b4205f0bSBarry Smith   ierr = PetscOptionsCreateDefault();CHKERRQ(ierr);
220b4205f0bSBarry Smith   opt->previous  = defaultoptions;
221b4205f0bSBarry Smith   defaultoptions = opt;
222b4205f0bSBarry Smith   PetscFunctionReturn(0);
223b4205f0bSBarry Smith }
224b4205f0bSBarry Smith 
225b4205f0bSBarry Smith /*@
226b4205f0bSBarry Smith       PetscOptionsPop - Pop the most recent PetscOptionsPush() to return to the previous default options
227b4205f0bSBarry Smith 
2281c9f3c13SBarry Smith       Logically collective on whatever communicator was associated with the call to PetscOptionsCreate()
229b4205f0bSBarry Smith 
230b4205f0bSBarry Smith   Notes:
231b4205f0bSBarry Smith   Use PetscOptionsPop() to return to the previous default options database
232b4205f0bSBarry Smith   Allows using different parts of a code to use different options databases
233b4205f0bSBarry Smith 
2343de2bfdfSBarry Smith    Level: advanced
2353de2bfdfSBarry Smith 
2363c6db4c4SPierre Jolivet .seealso: PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsInsert(), PetscOptionsSetValue(), PetscOptionsLeft()
237b4205f0bSBarry Smith 
238b4205f0bSBarry Smith @*/
239b4205f0bSBarry Smith PetscErrorCode PetscOptionsPop(void)
240b4205f0bSBarry Smith {
2413de2bfdfSBarry Smith   PetscOptions current = defaultoptions;
2423de2bfdfSBarry Smith 
243b4205f0bSBarry Smith   PetscFunctionBegin;
244b4205f0bSBarry Smith   if (!defaultoptions) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Missing default options");
245b4205f0bSBarry Smith   if (!defaultoptions->previous) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PetscOptionsPop() called too many times");
246b4205f0bSBarry Smith   defaultoptions    = defaultoptions->previous;
2473de2bfdfSBarry Smith   current->previous = NULL;
248b4205f0bSBarry Smith   PetscFunctionReturn(0);
249b4205f0bSBarry Smith }
250b4205f0bSBarry Smith 
2512d747510SLisandro Dalcin /*
2522d747510SLisandro Dalcin     PetscOptionsDestroyDefault - Destroys the default global options database
2532d747510SLisandro Dalcin */
2542d747510SLisandro Dalcin PetscErrorCode PetscOptionsDestroyDefault(void)
2552d747510SLisandro Dalcin {
2562d747510SLisandro Dalcin   PetscErrorCode ierr;
2573de2bfdfSBarry Smith   PetscOptions   tmp;
2582d747510SLisandro Dalcin 
25986dbd7c4SLisandro Dalcin   if (!defaultoptions) return 0;
2603de2bfdfSBarry Smith   /* Destroy any options that the user forgot to pop */
2613de2bfdfSBarry Smith   while (defaultoptions->previous) {
2623de2bfdfSBarry Smith     tmp = defaultoptions;
2633de2bfdfSBarry Smith     ierr = PetscOptionsPop();CHKERRQ(ierr);
2643de2bfdfSBarry Smith     ierr = PetscOptionsDestroy(&tmp);CHKERRQ(ierr);
2653de2bfdfSBarry Smith   }
2662d747510SLisandro Dalcin   ierr = PetscOptionsDestroy(&defaultoptions);if (ierr) return ierr;
2672d747510SLisandro Dalcin   return 0;
268e5c89e4eSSatish Balay }
269e5c89e4eSSatish Balay 
27094ef8ddeSSatish Balay /*@C
2717cd08cecSJed Brown    PetscOptionsValidKey - PETSc Options database keys must begin with one or two dashes (-) followed by a letter.
2723fc1eb6aSBarry Smith 
273447722d5SBarry Smith    Not collective
2741c9f3c13SBarry Smith 
2753fc1eb6aSBarry Smith    Input Parameter:
2762d747510SLisandro Dalcin .  key - string to check if valid
2773fc1eb6aSBarry Smith 
2783fc1eb6aSBarry Smith    Output Parameter:
2792d747510SLisandro Dalcin .  valid - PETSC_TRUE if a valid key
2803fc1eb6aSBarry Smith 
281f6680f47SSatish Balay    Level: intermediate
2823fc1eb6aSBarry Smith @*/
2832d747510SLisandro Dalcin PetscErrorCode PetscOptionsValidKey(const char key[],PetscBool *valid)
28496fc60bcSBarry Smith {
285f603b5e9SToby Isaac   char           *ptr;
2867c5db45bSBarry Smith 
28796fc60bcSBarry Smith   PetscFunctionBegin;
2882d747510SLisandro Dalcin   if (key) PetscValidCharPointer(key,1);
2892d747510SLisandro Dalcin   PetscValidPointer(valid,2);
2902d747510SLisandro Dalcin   *valid = PETSC_FALSE;
2912d747510SLisandro Dalcin   if (!key) PetscFunctionReturn(0);
2922d747510SLisandro Dalcin   if (key[0] != '-') PetscFunctionReturn(0);
2932d747510SLisandro Dalcin   if (key[1] == '-') key++;
294c850d057SPierre Jolivet   if (!isalpha((int)key[1])) PetscFunctionReturn(0);
2952d747510SLisandro Dalcin   (void) strtod(key,&ptr);
296c850d057SPierre Jolivet   if (ptr != key && !(*ptr == '_' || isalnum((int)*ptr))) PetscFunctionReturn(0);
2972d747510SLisandro Dalcin   *valid = PETSC_TRUE;
29896fc60bcSBarry Smith   PetscFunctionReturn(0);
29996fc60bcSBarry Smith }
30096fc60bcSBarry Smith 
301e5c89e4eSSatish Balay /*@C
302e5c89e4eSSatish Balay    PetscOptionsInsertString - Inserts options into the database from a string
303e5c89e4eSSatish Balay 
3041c9f3c13SBarry Smith    Logically Collective
305e5c89e4eSSatish Balay 
306*d8d19677SJose E. Roman    Input Parameters:
307080f0011SToby Isaac +  options - options object
308080f0011SToby Isaac -  in_str - string that contains options separated by blanks
309e5c89e4eSSatish Balay 
310e5c89e4eSSatish Balay    Level: intermediate
311e5c89e4eSSatish Balay 
3129666a313SBarry Smith   The collectivity of this routine is complex; only the MPI processes that call this routine will
3131c9f3c13SBarry Smith   have the affect of these options. If some processes that create objects call this routine and others do
3141c9f3c13SBarry Smith   not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
3151c9f3c13SBarry Smith   on different ranks.
3161c9f3c13SBarry Smith 
317e5c89e4eSSatish Balay    Contributed by Boyana Norris
318e5c89e4eSSatish Balay 
31988c29154SBarry Smith .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(),
320acfcf0e5SJed Brown           PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
321e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
322e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
323acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
324a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsInsertFile()
325e5c89e4eSSatish Balay @*/
326c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsertString(PetscOptions options,const char in_str[])
327e5c89e4eSSatish Balay {
328d06005cbSLisandro Dalcin   MPI_Comm       comm = PETSC_COMM_SELF;
329e5c89e4eSSatish Balay   PetscErrorCode ierr;
330d06005cbSLisandro Dalcin   char           *first,*second;
3319c9d3cfdSBarry Smith   PetscToken     token;
332e5c89e4eSSatish Balay 
333e5c89e4eSSatish Balay   PetscFunctionBegin;
33496fc60bcSBarry Smith   ierr = PetscTokenCreate(in_str,' ',&token);CHKERRQ(ierr);
335e5c89e4eSSatish Balay   ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
33696fc60bcSBarry Smith   while (first) {
337d06005cbSLisandro Dalcin     PetscBool isfile,isfileyaml,isstringyaml,ispush,ispop,key;
338d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(first,"-options_file",&isfile);CHKERRQ(ierr);
339d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(first,"-options_file_yaml",&isfileyaml);CHKERRQ(ierr);
340d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(first,"-options_string_yaml",&isstringyaml);CHKERRQ(ierr);
3419db968c8SJed Brown     ierr = PetscStrcasecmp(first,"-prefix_push",&ispush);CHKERRQ(ierr);
3429db968c8SJed Brown     ierr = PetscStrcasecmp(first,"-prefix_pop",&ispop);CHKERRQ(ierr);
34396fc60bcSBarry Smith     ierr = PetscOptionsValidKey(first,&key);CHKERRQ(ierr);
344d06005cbSLisandro Dalcin     if (!key) {
345d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
346d06005cbSLisandro Dalcin     } else if (isfile) {
347d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
348d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertFile(comm,options,second,PETSC_TRUE);CHKERRQ(ierr);
349d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
350d06005cbSLisandro Dalcin     } else if (isfileyaml) {
351d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
352d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertFileYAML(comm,options,second,PETSC_TRUE);CHKERRQ(ierr);
353d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
354d06005cbSLisandro Dalcin     } else if (isstringyaml) {
355d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
356d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertStringYAML(options,second);CHKERRQ(ierr);
357d06005cbSLisandro Dalcin       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
358d06005cbSLisandro Dalcin     } else if (ispush) {
3599db968c8SJed Brown       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
360c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPush(options,second);CHKERRQ(ierr);
3619db968c8SJed Brown       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
3629db968c8SJed Brown     } else if (ispop) {
363c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr);
3649db968c8SJed Brown       ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
365d06005cbSLisandro Dalcin     } else {
366e5c89e4eSSatish Balay       ierr = PetscTokenFind(token,&second);CHKERRQ(ierr);
36796fc60bcSBarry Smith       ierr = PetscOptionsValidKey(second,&key);CHKERRQ(ierr);
36896fc60bcSBarry Smith       if (!key) {
369c5929fdfSBarry Smith         ierr = PetscOptionsSetValue(options,first,second);CHKERRQ(ierr);
37096fc60bcSBarry Smith         ierr = PetscTokenFind(token,&first);CHKERRQ(ierr);
37196fc60bcSBarry Smith       } else {
372c5929fdfSBarry Smith         ierr  = PetscOptionsSetValue(options,first,NULL);CHKERRQ(ierr);
37396fc60bcSBarry Smith         first = second;
37496fc60bcSBarry Smith       }
375e5c89e4eSSatish Balay     }
376e5c89e4eSSatish Balay   }
3778c74ee41SBarry Smith   ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
378e5c89e4eSSatish Balay   PetscFunctionReturn(0);
379e5c89e4eSSatish Balay }
380e5c89e4eSSatish Balay 
3813fc1eb6aSBarry Smith /*
3823fc1eb6aSBarry Smith     Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free()
3833fc1eb6aSBarry Smith */
3845fa91da5SBarry Smith static char *Petscgetline(FILE * f)
3855fa91da5SBarry Smith {
3865fa91da5SBarry Smith   size_t size  = 0;
3875fa91da5SBarry Smith   size_t len   = 0;
3885fa91da5SBarry Smith   size_t last  = 0;
3890298fd71SBarry Smith   char   *buf  = NULL;
3905fa91da5SBarry Smith 
39102c9f0b5SLisandro Dalcin   if (feof(f)) return NULL;
3925fa91da5SBarry Smith   do {
3935fa91da5SBarry Smith     size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */
3946e0c8459SSatish Balay     buf   = (char*)realloc((void*)buf,size); /* realloc(NULL,n) is the same as malloc(n) */
3955fa91da5SBarry Smith     /* Actually do the read. Note that fgets puts a terminal '\0' on the
3965fa91da5SBarry Smith     end of the string, so we make sure we overwrite this */
397e86f3e45SDave May     if (!fgets(buf+len,1024,f)) buf[len]=0;
3985fa91da5SBarry Smith     PetscStrlen(buf,&len);
3995fa91da5SBarry Smith     last = len - 1;
4005fa91da5SBarry Smith   } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r');
40108ac41f7SSatish Balay   if (len) return buf;
4025fa91da5SBarry Smith   free(buf);
40302c9f0b5SLisandro Dalcin   return NULL;
4045fa91da5SBarry Smith }
4055fa91da5SBarry Smith 
406be10d61cSLisandro Dalcin static PetscErrorCode PetscOptionsFilename(MPI_Comm comm,const char file[],char filename[PETSC_MAX_PATH_LEN],PetscBool *yaml)
407be10d61cSLisandro Dalcin {
408be10d61cSLisandro Dalcin   char           fname[PETSC_MAX_PATH_LEN+8],path[PETSC_MAX_PATH_LEN+8],*tail;
409be10d61cSLisandro Dalcin   PetscErrorCode ierr;
410e5c89e4eSSatish Balay 
411be10d61cSLisandro Dalcin   PetscFunctionBegin;
412362febeeSStefano Zampini   *yaml = PETSC_FALSE;
413be10d61cSLisandro Dalcin   ierr = PetscStrreplace(comm,file,fname,sizeof(fname));CHKERRQ(ierr);
414be10d61cSLisandro Dalcin   ierr = PetscFixFilename(fname,path);CHKERRQ(ierr);
415be10d61cSLisandro Dalcin   ierr = PetscStrendswith(path,":yaml",yaml);CHKERRQ(ierr);
416be10d61cSLisandro Dalcin   if (*yaml) {
417be10d61cSLisandro Dalcin     ierr = PetscStrrchr(path,':',&tail);CHKERRQ(ierr);
418be10d61cSLisandro Dalcin     tail[-1] = 0; /* remove ":yaml" suffix from path */
419be10d61cSLisandro Dalcin   }
420be10d61cSLisandro Dalcin   ierr = PetscStrncpy(filename,path,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
421a1d2f846SLisandro Dalcin   /* check for standard YAML and JSON filename extensions */
422a1d2f846SLisandro Dalcin   if (!*yaml) {ierr = PetscStrendswith(filename,".yaml",yaml);CHKERRQ(ierr);}
423a1d2f846SLisandro Dalcin   if (!*yaml) {ierr = PetscStrendswith(filename,".yml", yaml);CHKERRQ(ierr);}
424a1d2f846SLisandro Dalcin   if (!*yaml) {ierr = PetscStrendswith(filename,".json",yaml);CHKERRQ(ierr);}
425a1d2f846SLisandro Dalcin   if (!*yaml) { /* check file contents */
426a1d2f846SLisandro Dalcin     PetscMPIInt rank;
427a1d2f846SLisandro Dalcin     ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
428a1d2f846SLisandro Dalcin     if (!rank) {
429a1d2f846SLisandro Dalcin       FILE *fh = fopen(filename,"r");
430a1d2f846SLisandro Dalcin       if (fh) {
431a1d2f846SLisandro Dalcin         char buf[6] = "";
432a1d2f846SLisandro Dalcin         if (fread(buf,1,6,fh) > 0) {
433a1d2f846SLisandro Dalcin           ierr = PetscStrncmp(buf,"%YAML ",6,yaml);CHKERRQ(ierr);  /* check for '%YAML' tag */
434a1d2f846SLisandro Dalcin           if (!*yaml) {ierr = PetscStrncmp(buf,"---",3,yaml);CHKERRQ(ierr);}  /* check for document start */
435a1d2f846SLisandro Dalcin         }
436a1d2f846SLisandro Dalcin         (void)fclose(fh);
437a1d2f846SLisandro Dalcin       }
438a1d2f846SLisandro Dalcin     }
439a1d2f846SLisandro Dalcin     ierr = MPI_Bcast(yaml,1,MPIU_BOOL,0,comm);CHKERRMPI(ierr);
440a1d2f846SLisandro Dalcin   }
441be10d61cSLisandro Dalcin   PetscFunctionReturn(0);
442be10d61cSLisandro Dalcin }
443e5c89e4eSSatish Balay 
444be10d61cSLisandro Dalcin static PetscErrorCode PetscOptionsInsertFilePetsc(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require)
445e5c89e4eSSatish Balay {
4468c0b561eSLisandro Dalcin   char           *string,*vstring = NULL,*astring = NULL,*packed = NULL;
4477fb43599SVaclav Hapla   char           *tokens[4];
448e5c89e4eSSatish Balay   PetscErrorCode ierr;
44913e3f751SJed Brown   size_t         i,len,bytes;
450e5c89e4eSSatish Balay   FILE           *fd;
4517fb43599SVaclav Hapla   PetscToken     token=NULL;
452ed9cf6e9SBarry Smith   int            err;
453581bbe83SVaclav Hapla   char           *cmatch;
454581bbe83SVaclav Hapla   const char     cmt='#';
4559210b8eaSVaclav Hapla   PetscInt       line=1;
4563a018368SJed Brown   PetscMPIInt    rank,cnt=0,acnt=0,counts[2];
4579210b8eaSVaclav Hapla   PetscBool      isdir,alias=PETSC_FALSE,valid;
458e5c89e4eSSatish Balay 
459e5c89e4eSSatish Balay   PetscFunctionBegin;
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);
570a17b96a8SKyle Gerard Felker   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://petsc.org/release/faq/");
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 
605*d8d19677SJose E. Roman   Input Parameters:
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   Notes:
614be10d61cSLisandro Dalcin    Use  # for lines that are comments and which should be ignored.
615be10d61cSLisandro Dalcin    Usually, instead of using this command, one should list the file name in the call to PetscInitialize(), this insures that certain options
616be10d61cSLisandro 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
617be10d61cSLisandro Dalcin    calls to XXXSetFromOptions() it should not be used for options listed under PetscInitialize().
618be10d61cSLisandro Dalcin    The collectivity of this routine is complex; only the MPI processes in comm will
619be10d61cSLisandro Dalcin    have the affect of these options. If some processes that create objects call this routine and others do
620be10d61cSLisandro Dalcin    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
621be10d61cSLisandro Dalcin    on different ranks.
622be10d61cSLisandro Dalcin 
623be10d61cSLisandro Dalcin   Level: developer
624be10d61cSLisandro Dalcin 
625be10d61cSLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsView(), PetscOptionsHasName(), PetscOptionsGetInt(),
626be10d61cSLisandro Dalcin           PetscOptionsGetReal(), PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
627be10d61cSLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
628be10d61cSLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
629be10d61cSLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
630be10d61cSLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
631be10d61cSLisandro Dalcin 
632be10d61cSLisandro Dalcin @*/
633be10d61cSLisandro Dalcin PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require)
634be10d61cSLisandro Dalcin {
635be10d61cSLisandro Dalcin   char           filename[PETSC_MAX_PATH_LEN];
636be10d61cSLisandro Dalcin   PetscBool      yaml;
637be10d61cSLisandro Dalcin   PetscErrorCode ierr;
638be10d61cSLisandro Dalcin 
639be10d61cSLisandro Dalcin   PetscFunctionBegin;
640be10d61cSLisandro Dalcin   ierr = PetscOptionsFilename(comm,file,filename,&yaml);CHKERRQ(ierr);
641be10d61cSLisandro Dalcin   if (yaml) {
642be10d61cSLisandro Dalcin     ierr = PetscOptionsInsertFileYAML(comm,options,filename,require);CHKERRQ(ierr);
643be10d61cSLisandro Dalcin   } else {
644be10d61cSLisandro Dalcin     ierr = PetscOptionsInsertFilePetsc(comm,options,filename,require);CHKERRQ(ierr);
645be10d61cSLisandro Dalcin   }
646be10d61cSLisandro Dalcin   PetscFunctionReturn(0);
647be10d61cSLisandro Dalcin }
648be10d61cSLisandro Dalcin 
649be10d61cSLisandro Dalcin /*@C
650d06005cbSLisandro Dalcin    PetscOptionsInsertArgs - Inserts options into the database from a array of strings
651d06005cbSLisandro Dalcin 
652d06005cbSLisandro Dalcin    Logically Collective
653d06005cbSLisandro Dalcin 
654*d8d19677SJose E. Roman    Input Parameters:
655d06005cbSLisandro Dalcin +  options - options object
656d06005cbSLisandro Dalcin .  argc - the array lenght
657d06005cbSLisandro Dalcin -  args - the string array
658d06005cbSLisandro Dalcin 
659d06005cbSLisandro Dalcin    Level: intermediate
660d06005cbSLisandro Dalcin 
661d06005cbSLisandro Dalcin .seealso: PetscOptions, PetscOptionsInsertString(), PetscOptionsInsertFile()
662d06005cbSLisandro Dalcin @*/
663d06005cbSLisandro Dalcin PetscErrorCode PetscOptionsInsertArgs(PetscOptions options,int argc,char *args[])
66485079163SJed Brown {
665d06005cbSLisandro Dalcin   MPI_Comm       comm = PETSC_COMM_WORLD;
66685079163SJed Brown   PetscErrorCode ierr;
667d06005cbSLisandro Dalcin   int            left          = PetscMax(argc,0);
668d06005cbSLisandro Dalcin   char           *const *eargs = args;
66985079163SJed Brown 
67085079163SJed Brown   PetscFunctionBegin;
67185079163SJed Brown   while (left) {
672d06005cbSLisandro Dalcin     PetscBool isfile,isfileyaml,isstringyaml,ispush,ispop,key;
673d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(eargs[0],"-options_file",&isfile);CHKERRQ(ierr);
674d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(eargs[0],"-options_file_yaml",&isfileyaml);CHKERRQ(ierr);
675d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(eargs[0],"-options_string_yaml",&isstringyaml);CHKERRQ(ierr);
676d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(eargs[0],"-prefix_push",&ispush);CHKERRQ(ierr);
677d06005cbSLisandro Dalcin     ierr = PetscStrcasecmp(eargs[0],"-prefix_pop",&ispop);CHKERRQ(ierr);
678093de6efSBarry Smith     ierr = PetscOptionsValidKey(eargs[0],&key);CHKERRQ(ierr);
679093de6efSBarry Smith     if (!key) {
68085079163SJed Brown       eargs++; left--;
681d06005cbSLisandro Dalcin     } else if (isfile) {
682d06005cbSLisandro Dalcin       if (left <= 1 || eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file filename option");
683d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertFile(comm,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr);
68485079163SJed Brown       eargs += 2; left -= 2;
685d06005cbSLisandro Dalcin     } else if (isfileyaml) {
686d06005cbSLisandro Dalcin       if (left <= 1 || eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing filename for -options_file_yaml filename option");
687d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertFileYAML(comm,options,eargs[1],PETSC_TRUE);CHKERRQ(ierr);
688d06005cbSLisandro Dalcin       eargs += 2; left -= 2;
689d06005cbSLisandro Dalcin     } else if (isstringyaml) {
690d06005cbSLisandro Dalcin       if (left <= 1 || eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing string for -options_string_yaml string option");
691d06005cbSLisandro Dalcin       ierr = PetscOptionsInsertStringYAML(options,eargs[1]);CHKERRQ(ierr);
692d06005cbSLisandro Dalcin       eargs += 2; left -= 2;
693d06005cbSLisandro Dalcin     } else if (ispush) {
6949db968c8SJed Brown       if (left <= 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option");
6959db968c8SJed Brown       if (eargs[1][0] == '-') SETERRQ(PETSC_COMM_SELF,PETSC_ERR_USER,"Missing prefix for -prefix_push option (prefixes cannot start with '-')");
696c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPush(options,eargs[1]);CHKERRQ(ierr);
6979db968c8SJed Brown       eargs += 2; left -= 2;
698d06005cbSLisandro Dalcin     } else if (ispop) {
699c5929fdfSBarry Smith       ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr);
7009db968c8SJed Brown       eargs++; left--;
7017935c3d8SJed Brown     } else {
7027935c3d8SJed Brown       PetscBool nextiskey = PETSC_FALSE;
7037935c3d8SJed Brown       if (left >= 2) {ierr = PetscOptionsValidKey(eargs[1],&nextiskey);CHKERRQ(ierr);}
70498b6bf53SJed Brown       if (left < 2 || nextiskey) {
705c5929fdfSBarry Smith         ierr = PetscOptionsSetValue(options,eargs[0],NULL);CHKERRQ(ierr);
70685079163SJed Brown         eargs++; left--;
70785079163SJed Brown       } else {
708c5929fdfSBarry Smith         ierr = PetscOptionsSetValue(options,eargs[0],eargs[1]);CHKERRQ(ierr);
70985079163SJed Brown         eargs += 2; left -= 2;
71085079163SJed Brown       }
71185079163SJed Brown     }
7127935c3d8SJed Brown   }
71385079163SJed Brown   PetscFunctionReturn(0);
71485079163SJed Brown }
71585079163SJed Brown 
716c5b5d8d5SVaclav Hapla PETSC_STATIC_INLINE PetscErrorCode PetscOptionsStringToBoolIfSet_Private(enum PetscPrecedentOption opt,const char *val[],PetscBool set[],PetscBool *flg)
717c5b5d8d5SVaclav Hapla {
718c5b5d8d5SVaclav Hapla   PetscErrorCode ierr;
719c5b5d8d5SVaclav Hapla 
720c5b5d8d5SVaclav Hapla   PetscFunctionBegin;
721c5b5d8d5SVaclav Hapla   if (set[opt]) {
722c5b5d8d5SVaclav Hapla     ierr = PetscOptionsStringToBool(val[opt],flg);CHKERRQ(ierr);
723c5b5d8d5SVaclav Hapla   } else *flg = PETSC_FALSE;
724c5b5d8d5SVaclav Hapla   PetscFunctionReturn(0);
725c5b5d8d5SVaclav Hapla }
726c5b5d8d5SVaclav Hapla 
727c5b5d8d5SVaclav Hapla /* Process options with absolute precedence */
728c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsProcessPrecedentFlags(PetscOptions options,int argc,char *args[],PetscBool *skip_petscrc,PetscBool *skip_petscrc_set)
729c5b5d8d5SVaclav Hapla {
730c5b5d8d5SVaclav Hapla   const char* const *opt = precedentOptions;
731c5b5d8d5SVaclav Hapla   const size_t      n = PO_NUM;
732c5b5d8d5SVaclav Hapla   size_t            o;
733c5b5d8d5SVaclav Hapla   int               a;
734c5b5d8d5SVaclav Hapla   const char        **val;
735c5b5d8d5SVaclav Hapla   PetscBool         *set;
736c5b5d8d5SVaclav Hapla   PetscErrorCode    ierr;
737c5b5d8d5SVaclav Hapla 
738c5b5d8d5SVaclav Hapla   PetscFunctionBegin;
739c5b5d8d5SVaclav Hapla   ierr = PetscCalloc2(n,&val,n,&set);CHKERRQ(ierr);
740c5b5d8d5SVaclav Hapla 
741c5b5d8d5SVaclav Hapla   /* Look for options possibly set using PetscOptionsSetValue beforehand */
742c5b5d8d5SVaclav Hapla   for (o=0; o<n; o++) {
743c5b5d8d5SVaclav Hapla     ierr = PetscOptionsFindPair(options,NULL,opt[o],&val[o],&set[o]);CHKERRQ(ierr);
744c5b5d8d5SVaclav Hapla   }
745c5b5d8d5SVaclav Hapla 
746a5b23f4aSJose E. Roman   /* Loop through all args to collect last occurring value of each option */
747c5b5d8d5SVaclav Hapla   for (a=1; a<argc; a++) {
748c5b5d8d5SVaclav Hapla     PetscBool valid, eq;
749c5b5d8d5SVaclav Hapla 
750c5b5d8d5SVaclav Hapla     ierr = PetscOptionsValidKey(args[a],&valid);CHKERRQ(ierr);
751c5b5d8d5SVaclav Hapla     if (!valid) continue;
752c5b5d8d5SVaclav Hapla     for (o=0; o<n; o++) {
753c5b5d8d5SVaclav Hapla       ierr = PetscStrcasecmp(args[a],opt[o],&eq);CHKERRQ(ierr);
754c5b5d8d5SVaclav Hapla       if (eq) {
755c5b5d8d5SVaclav Hapla         set[o] = PETSC_TRUE;
756c5b5d8d5SVaclav Hapla         if (a == argc-1 || !args[a+1] || !args[a+1][0] || args[a+1][0] == '-') val[o] = NULL;
757c5b5d8d5SVaclav Hapla         else val[o] = args[a+1];
758c5b5d8d5SVaclav Hapla         break;
759c5b5d8d5SVaclav Hapla       }
760c5b5d8d5SVaclav Hapla     }
761c5b5d8d5SVaclav Hapla   }
762c5b5d8d5SVaclav Hapla 
763c5b5d8d5SVaclav Hapla   /* Process flags */
764d314f959SVaclav Hapla   ierr = PetscStrcasecmp(val[PO_HELP], "intro", &options->help_intro);CHKERRQ(ierr);
765d314f959SVaclav Hapla   if (options->help_intro) options->help = PETSC_TRUE;
766d314f959SVaclav Hapla   else {ierr = PetscOptionsStringToBoolIfSet_Private(PO_HELP,            val,set,&options->help);CHKERRQ(ierr);}
767c5b5d8d5SVaclav Hapla   ierr = PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR_CANCEL,val,set,&options->monitorCancel);CHKERRQ(ierr);
768c5b5d8d5SVaclav Hapla   ierr = PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR,       val,set,&options->monitorFromOptions);CHKERRQ(ierr);
769c5b5d8d5SVaclav Hapla   ierr = PetscOptionsStringToBoolIfSet_Private(PO_SKIP_PETSCRC,          val,set,skip_petscrc);CHKERRQ(ierr);
770c5b5d8d5SVaclav Hapla   *skip_petscrc_set = set[PO_SKIP_PETSCRC];
771c5b5d8d5SVaclav Hapla 
772c5b5d8d5SVaclav Hapla   /* Store precedent options in database and mark them as used */
773c5b5d8d5SVaclav Hapla   for (o=0; o<n; o++) {
774c5b5d8d5SVaclav Hapla     if (set[o]) {
775d06005cbSLisandro Dalcin       ierr = PetscOptionsSetValue_Private(options,opt[o],val[o],&a);CHKERRQ(ierr);
776d06005cbSLisandro Dalcin       options->used[a] = PETSC_TRUE;
777c5b5d8d5SVaclav Hapla     }
778c5b5d8d5SVaclav Hapla   }
779c5b5d8d5SVaclav Hapla 
780c5b5d8d5SVaclav Hapla   ierr = PetscFree2(val,set);CHKERRQ(ierr);
781c5b5d8d5SVaclav Hapla   options->precedentProcessed = PETSC_TRUE;
782c5b5d8d5SVaclav Hapla   PetscFunctionReturn(0);
783c5b5d8d5SVaclav Hapla }
784c5b5d8d5SVaclav Hapla 
785c5b5d8d5SVaclav Hapla PETSC_STATIC_INLINE PetscErrorCode PetscOptionsSkipPrecedent(PetscOptions options,const char name[],PetscBool *flg)
786c5b5d8d5SVaclav Hapla {
787c5b5d8d5SVaclav Hapla   int i;
788c5b5d8d5SVaclav Hapla   PetscErrorCode ierr;
789c5b5d8d5SVaclav Hapla 
790c5b5d8d5SVaclav Hapla   *flg = PETSC_FALSE;
791c5b5d8d5SVaclav Hapla   if (options->precedentProcessed) {
792c5b5d8d5SVaclav Hapla     for (i=0; i<PO_NUM; i++) {
793c5b5d8d5SVaclav Hapla       if (!PetscOptNameCmp(precedentOptions[i],name)) {
794c5b5d8d5SVaclav Hapla         /* check if precedent option has been set already */
795d06005cbSLisandro Dalcin         ierr = PetscOptionsFindPair(options,NULL,name,NULL,flg);if (ierr) return ierr;
796c5b5d8d5SVaclav Hapla         if (*flg) break;
797c5b5d8d5SVaclav Hapla       }
798c5b5d8d5SVaclav Hapla     }
799c5b5d8d5SVaclav Hapla   }
800d06005cbSLisandro Dalcin   return 0;
801c5b5d8d5SVaclav Hapla }
80285079163SJed Brown 
803e5c89e4eSSatish Balay /*@C
804e5c89e4eSSatish Balay    PetscOptionsInsert - Inserts into the options database from the command line,
805e5c89e4eSSatish Balay                         the environmental variable and a file.
806e5c89e4eSSatish Balay 
8071c9f3c13SBarry Smith    Collective on PETSC_COMM_WORLD
8081c9f3c13SBarry Smith 
809e5c89e4eSSatish Balay    Input Parameters:
810c5929fdfSBarry Smith +  options - options database or NULL for the default global database
811c5929fdfSBarry Smith .  argc - count of number of command line arguments
812e5c89e4eSSatish Balay .  args - the command line arguments
813be10d61cSLisandro Dalcin -  file - [optional] PETSc database file, append ":yaml" to filename to specify YAML options format.
814be10d61cSLisandro Dalcin           Use NULL or empty string to not check for code specific file.
815be10d61cSLisandro Dalcin           Also checks ~/.petscrc, .petscrc and petscrc.
816c5b5d8d5SVaclav Hapla           Use -skip_petscrc in the code specific file (or command line) to skip ~/.petscrc, .petscrc and petscrc files.
817e5c89e4eSSatish Balay 
818e5c89e4eSSatish Balay    Note:
819e5c89e4eSSatish Balay    Since PetscOptionsInsert() is automatically called by PetscInitialize(),
820e5c89e4eSSatish Balay    the user does not typically need to call this routine. PetscOptionsInsert()
821e5c89e4eSSatish Balay    can be called several times, adding additional entries into the database.
822e5c89e4eSSatish Balay 
823081c24baSBoyana Norris    Options Database Keys:
824d06005cbSLisandro Dalcin +   -options_file <filename> - read options from a file
825d06005cbSLisandro Dalcin -   -options_file_yaml <filename> - read options from a YAML file
826c5b5d8d5SVaclav Hapla 
827c5b5d8d5SVaclav Hapla    See PetscInitialize() for options related to option database monitoring.
828081c24baSBoyana Norris 
829e5c89e4eSSatish Balay    Level: advanced
830e5c89e4eSSatish Balay 
8312d747510SLisandro Dalcin .seealso: PetscOptionsDestroy(), PetscOptionsView(), PetscOptionsInsertString(), PetscOptionsInsertFile(),
83296fc60bcSBarry Smith           PetscInitialize()
833e5c89e4eSSatish Balay @*/
834c5929fdfSBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options,int *argc,char ***args,const char file[])
835e5c89e4eSSatish Balay {
836d06005cbSLisandro Dalcin   MPI_Comm       comm = PETSC_COMM_WORLD;
837e5c89e4eSSatish Balay   PetscErrorCode ierr;
838e5c89e4eSSatish Balay   PetscMPIInt    rank;
839c5b5d8d5SVaclav Hapla   PetscBool      hasArgs = (argc && *argc) ? PETSC_TRUE : PETSC_FALSE;
840c5b5d8d5SVaclav Hapla   PetscBool      skipPetscrc = PETSC_FALSE, skipPetscrcSet = PETSC_FALSE;
841e5c89e4eSSatish Balay 
842e5c89e4eSSatish Balay   PetscFunctionBegin;
843d06005cbSLisandro Dalcin   if (hasArgs && !(args && *args)) SETERRQ(comm,PETSC_ERR_ARG_NULL,"*argc > 1 but *args not given");
844d06005cbSLisandro Dalcin   ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr);
845e5c89e4eSSatish Balay 
846c5b5d8d5SVaclav Hapla   if (!options) {
847c5b5d8d5SVaclav Hapla     ierr = PetscOptionsCreateDefault();CHKERRQ(ierr);
848c5b5d8d5SVaclav Hapla     options = defaultoptions;
849c5b5d8d5SVaclav Hapla   }
850c5b5d8d5SVaclav Hapla   if (hasArgs) {
851c5b5d8d5SVaclav Hapla     /* process options with absolute precedence */
852c5b5d8d5SVaclav Hapla     ierr = PetscOptionsProcessPrecedentFlags(options,*argc,*args,&skipPetscrc,&skipPetscrcSet);CHKERRQ(ierr);
853c5b5d8d5SVaclav Hapla   }
8544b09e917SBarry Smith   if (file && file[0]) {
855be10d61cSLisandro Dalcin     ierr = PetscOptionsInsertFile(comm,options,file,PETSC_TRUE);CHKERRQ(ierr);
856c5b5d8d5SVaclav Hapla     /* if -skip_petscrc has not been set from command line, check whether it has been set in the file */
857c5b5d8d5SVaclav Hapla     if (!skipPetscrcSet) {ierr = PetscOptionsGetBool(options,NULL,"-skip_petscrc",&skipPetscrc,NULL);CHKERRQ(ierr);}
858321366bcSBarry Smith   }
859c5b5d8d5SVaclav Hapla   if (!skipPetscrc) {
860be10d61cSLisandro Dalcin     char filename[PETSC_MAX_PATH_LEN];
861be10d61cSLisandro Dalcin     ierr = PetscGetHomeDirectory(filename,sizeof(filename));CHKERRQ(ierr);
862be10d61cSLisandro Dalcin     ierr = MPI_Bcast(filename,(int)sizeof(filename),MPI_CHAR,0,comm);CHKERRMPI(ierr);
8632d747510SLisandro Dalcin     if (filename[0]) {ierr = PetscStrcat(filename,"/.petscrc");CHKERRQ(ierr);}
864d06005cbSLisandro Dalcin     ierr = PetscOptionsInsertFile(comm,options,filename,PETSC_FALSE);CHKERRQ(ierr);
865d06005cbSLisandro Dalcin     ierr = PetscOptionsInsertFile(comm,options,".petscrc",PETSC_FALSE);CHKERRQ(ierr);
866d06005cbSLisandro Dalcin     ierr = PetscOptionsInsertFile(comm,options,"petscrc",PETSC_FALSE);CHKERRQ(ierr);
867e5c89e4eSSatish Balay   }
868e5c89e4eSSatish Balay 
8692d747510SLisandro Dalcin   /* insert environment options */
870e5c89e4eSSatish Balay   {
8712d747510SLisandro Dalcin     char   *eoptions = NULL;
872e5c89e4eSSatish Balay     size_t len       = 0;
873e5c89e4eSSatish Balay     if (!rank) {
874e5c89e4eSSatish Balay       eoptions = (char*)getenv("PETSC_OPTIONS");
875e5c89e4eSSatish Balay       ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr);
876e5c89e4eSSatish Balay     }
877be10d61cSLisandro Dalcin     ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,comm);CHKERRMPI(ierr);
878e5c89e4eSSatish Balay     if (len) {
879d06005cbSLisandro Dalcin       if (rank) {ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr);}
880d06005cbSLisandro Dalcin       ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,comm);CHKERRMPI(ierr);
88196fc60bcSBarry Smith       if (rank) eoptions[len] = 0;
882c5929fdfSBarry Smith       ierr = PetscOptionsInsertString(options,eoptions);CHKERRQ(ierr);
883e5c89e4eSSatish Balay       if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);}
884e5c89e4eSSatish Balay     }
885e5c89e4eSSatish Balay   }
886e5c89e4eSSatish Balay 
887d06005cbSLisandro Dalcin   /* insert YAML environment options */
88856a31166SBarry Smith   {
8899fc438c3SToby Isaac     char   *eoptions = NULL;
8909fc438c3SToby Isaac     size_t len       = 0;
8919fc438c3SToby Isaac     if (!rank) {
8929fc438c3SToby Isaac       eoptions = (char*)getenv("PETSC_OPTIONS_YAML");
8939fc438c3SToby Isaac       ierr = PetscStrlen(eoptions,&len);CHKERRQ(ierr);
8949fc438c3SToby Isaac     }
895be10d61cSLisandro Dalcin     ierr = MPI_Bcast(&len,1,MPIU_SIZE_T,0,comm);CHKERRMPI(ierr);
8969fc438c3SToby Isaac     if (len) {
897d06005cbSLisandro Dalcin       if (rank) {ierr = PetscMalloc1(len+1,&eoptions);CHKERRQ(ierr);}
898d06005cbSLisandro Dalcin       ierr = MPI_Bcast(eoptions,len,MPI_CHAR,0,comm);CHKERRMPI(ierr);
8999fc438c3SToby Isaac       if (rank) eoptions[len] = 0;
9009fc438c3SToby Isaac       ierr = PetscOptionsInsertStringYAML(options,eoptions);CHKERRQ(ierr);
9019fc438c3SToby Isaac       if (rank) {ierr = PetscFree(eoptions);CHKERRQ(ierr);}
9029fc438c3SToby Isaac     }
9039fc438c3SToby Isaac   }
9043bcbd388SSean Farley 
905c5b5d8d5SVaclav Hapla   /* insert command line options here because they take precedence over arguments in petscrc/environment */
906d06005cbSLisandro Dalcin   if (hasArgs) {ierr = PetscOptionsInsertArgs(options,*argc-1,*args+1);CHKERRQ(ierr);}
907e5c89e4eSSatish Balay   PetscFunctionReturn(0);
908e5c89e4eSSatish Balay }
909e5c89e4eSSatish Balay 
910e5c89e4eSSatish Balay /*@C
91188c29154SBarry Smith    PetscOptionsView - Prints the options that have been loaded. This is
912e5c89e4eSSatish Balay    useful for debugging purposes.
913e5c89e4eSSatish Balay 
914c139c21fSBarry Smith    Logically Collective on PetscViewer
915e5c89e4eSSatish Balay 
916*d8d19677SJose E. Roman    Input Parameters:
917a2b725a8SWilliam Gropp +  options - options database, use NULL for default global database
918a2b725a8SWilliam Gropp -  viewer - must be an PETSCVIEWERASCII viewer
919e5c89e4eSSatish Balay 
920e5c89e4eSSatish Balay    Options Database Key:
92126a7e8d4SBarry Smith .  -options_view - Activates PetscOptionsView() within PetscFinalize()
922e5c89e4eSSatish Balay 
9239666a313SBarry Smith    Notes:
9249666a313SBarry Smith    Only the rank zero process of MPI_Comm used to create view prints the option values. Other processes
9251c9f3c13SBarry Smith    may have different values but they are not printed.
9261c9f3c13SBarry Smith 
927e5c89e4eSSatish Balay    Level: advanced
928e5c89e4eSSatish Balay 
929e5c89e4eSSatish Balay .seealso: PetscOptionsAllUsed()
930e5c89e4eSSatish Balay @*/
931c5929fdfSBarry Smith PetscErrorCode PetscOptionsView(PetscOptions options,PetscViewer viewer)
932e5c89e4eSSatish Balay {
933e5c89e4eSSatish Balay   PetscErrorCode ierr;
934431c96f7SBarry Smith   PetscInt       i;
93588c29154SBarry Smith   PetscBool      isascii;
936e5c89e4eSSatish Balay 
937e5c89e4eSSatish Balay   PetscFunctionBegin;
9382d747510SLisandro Dalcin   if (viewer) PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
939c5929fdfSBarry Smith   options = options ? options : defaultoptions;
94088c29154SBarry Smith   if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD;
941251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
942ce94432eSBarry Smith   if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer");
94388c29154SBarry Smith 
9442d747510SLisandro Dalcin   if (!options->N) {
94588c29154SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"#No PETSc Option Table entries\n");CHKERRQ(ierr);
9462d747510SLisandro Dalcin     PetscFunctionReturn(0);
94730694fe9SBarry Smith   }
9482d747510SLisandro Dalcin 
9492d747510SLisandro Dalcin   ierr = PetscViewerASCIIPrintf(viewer,"#PETSc Option Table entries:\n");CHKERRQ(ierr);
950e5c89e4eSSatish Balay   for (i=0; i<options->N; i++) {
951e5c89e4eSSatish Balay     if (options->values[i]) {
95288c29154SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"-%s %s\n",options->names[i],options->values[i]);CHKERRQ(ierr);
953e5c89e4eSSatish Balay     } else {
95488c29154SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"-%s\n",options->names[i]);CHKERRQ(ierr);
955e5c89e4eSSatish Balay     }
956e5c89e4eSSatish Balay   }
95788c29154SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"#End of PETSc Option Table entries\n");CHKERRQ(ierr);
958e5c89e4eSSatish Balay   PetscFunctionReturn(0);
959e5c89e4eSSatish Balay }
960e5c89e4eSSatish Balay 
961e11779c2SBarry Smith /*
962e11779c2SBarry Smith    Called by error handlers to print options used in run
963e11779c2SBarry Smith */
96495c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void)
965e11779c2SBarry Smith {
966e11779c2SBarry Smith   PetscInt     i;
9674416b707SBarry Smith   PetscOptions options = defaultoptions;
968e11779c2SBarry Smith 
969e11779c2SBarry Smith   PetscFunctionBegin;
970e11779c2SBarry Smith   if (options->N) {
971e11779c2SBarry Smith     (*PetscErrorPrintf)("PETSc Option Table entries:\n");
972e11779c2SBarry Smith   } else {
973e11779c2SBarry Smith     (*PetscErrorPrintf)("No PETSc Option Table entries\n");
974e11779c2SBarry Smith   }
975e11779c2SBarry Smith   for (i=0; i<options->N; i++) {
976e11779c2SBarry Smith     if (options->values[i]) {
977e11779c2SBarry Smith       (*PetscErrorPrintf)("-%s %s\n",options->names[i],options->values[i]);
978e11779c2SBarry Smith     } else {
979e11779c2SBarry Smith       (*PetscErrorPrintf)("-%s\n",options->names[i]);
980e11779c2SBarry Smith     }
981e11779c2SBarry Smith   }
982e11779c2SBarry Smith   PetscFunctionReturn(0);
983e11779c2SBarry Smith }
984e11779c2SBarry Smith 
985e5c89e4eSSatish Balay /*@C
98674e0666dSJed Brown    PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow.
98774e0666dSJed Brown 
9881c9f3c13SBarry Smith    Logically Collective
98974e0666dSJed Brown 
990*d8d19677SJose E. Roman    Input Parameters:
991c5929fdfSBarry Smith +  options - options database, or NULL for the default global database
992c5929fdfSBarry Smith -  prefix - The string to append to the existing prefix
9939db968c8SJed Brown 
9949db968c8SJed Brown    Options Database Keys:
9959db968c8SJed Brown +   -prefix_push <some_prefix_> - push the given prefix
9969db968c8SJed Brown -   -prefix_pop - pop the last prefix
9979db968c8SJed Brown 
9989db968c8SJed Brown    Notes:
9999db968c8SJed Brown    It is common to use this in conjunction with -options_file as in
10009db968c8SJed Brown 
10019db968c8SJed Brown $ -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop
10029db968c8SJed Brown 
10039db968c8SJed Brown    where the files no longer require all options to be prefixed with -system2_.
100474e0666dSJed Brown 
10059666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
10061c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
10071c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
10081c9f3c13SBarry Smith    on different ranks.
10091c9f3c13SBarry Smith 
101074e0666dSJed Brown Level: advanced
101174e0666dSJed Brown 
10121c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPop(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue()
101374e0666dSJed Brown @*/
1014c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPush(PetscOptions options,const char prefix[])
101574e0666dSJed Brown {
101674e0666dSJed Brown   PetscErrorCode ierr;
101774e0666dSJed Brown   size_t         n;
101874e0666dSJed Brown   PetscInt       start;
10192d747510SLisandro Dalcin   char           key[MAXOPTNAME+1];
10202d747510SLisandro Dalcin   PetscBool      valid;
102174e0666dSJed Brown 
102274e0666dSJed Brown   PetscFunctionBegin;
1023064a246eSJacob Faibussowitsch   PetscValidCharPointer(prefix,2);
1024c5929fdfSBarry Smith   options = options ? options : defaultoptions;
102574e0666dSJed 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);
10262d747510SLisandro Dalcin   key[0] = '-'; /* keys must start with '-' */
10272d747510SLisandro Dalcin   ierr = PetscStrncpy(key+1,prefix,sizeof(key)-1);CHKERRQ(ierr);
10282d747510SLisandro Dalcin   ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr);
10298bf569ecSLisandro 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 */
10308bf569ecSLisandro 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":"");
103174e0666dSJed Brown   start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0;
103274e0666dSJed Brown   ierr = PetscStrlen(prefix,&n);CHKERRQ(ierr);
103374e0666dSJed Brown   if (n+1 > sizeof(options->prefix)-start) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %d exceeded",sizeof(options->prefix));
1034580bdb30SBarry Smith   ierr = PetscArraycpy(options->prefix+start,prefix,n+1);CHKERRQ(ierr);
103574e0666dSJed Brown   options->prefixstack[options->prefixind++] = start+n;
103674e0666dSJed Brown   PetscFunctionReturn(0);
103774e0666dSJed Brown }
103874e0666dSJed Brown 
1039c5929fdfSBarry Smith /*@C
104074e0666dSJed Brown    PetscOptionsPrefixPop - Remove the latest options prefix, see PetscOptionsPrefixPush() for details
104174e0666dSJed Brown 
10421c9f3c13SBarry Smith    Logically Collective on the MPI_Comm that called PetscOptionsPrefixPush()
104374e0666dSJed Brown 
1044c5929fdfSBarry Smith   Input Parameters:
1045c5929fdfSBarry Smith .  options - options database, or NULL for the default global database
1046c5929fdfSBarry Smith 
104774e0666dSJed Brown    Level: advanced
104874e0666dSJed Brown 
10491c9f3c13SBarry Smith .seealso: PetscOptionsPrefixPush(), PetscOptionsPush(), PetscOptionsPop(), PetscOptionsCreate(), PetscOptionsSetValue()
105074e0666dSJed Brown @*/
1051c5929fdfSBarry Smith PetscErrorCode PetscOptionsPrefixPop(PetscOptions options)
105274e0666dSJed Brown {
105374e0666dSJed Brown   PetscInt offset;
105474e0666dSJed Brown 
105574e0666dSJed Brown   PetscFunctionBegin;
1056c5929fdfSBarry Smith   options = options ? options : defaultoptions;
105774e0666dSJed Brown   if (options->prefixind < 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More prefixes popped than pushed");
105874e0666dSJed Brown   options->prefixind--;
105974e0666dSJed Brown   offset = options->prefixind ? options->prefixstack[options->prefixind-1] : 0;
106074e0666dSJed Brown   options->prefix[offset] = 0;
106174e0666dSJed Brown   PetscFunctionReturn(0);
106274e0666dSJed Brown }
106374e0666dSJed Brown 
1064a542b6e8SBarry Smith /*@C
1065a542b6e8SBarry Smith     PetscOptionsClear - Removes all options form the database leaving it empty.
1066a542b6e8SBarry Smith 
10671c9f3c13SBarry Smith     Logically Collective
10681c9f3c13SBarry Smith 
1069c5929fdfSBarry Smith   Input Parameters:
1070c5929fdfSBarry Smith .  options - options database, use NULL for the default global database
1071c5929fdfSBarry Smith 
10729666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
10731c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
10741c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
10751c9f3c13SBarry Smith    on different ranks.
10761c9f3c13SBarry Smith 
1077a542b6e8SBarry Smith    Level: developer
1078a542b6e8SBarry Smith 
1079a542b6e8SBarry Smith .seealso: PetscOptionsInsert()
1080a542b6e8SBarry Smith @*/
1081c5929fdfSBarry Smith PetscErrorCode PetscOptionsClear(PetscOptions options)
1082a542b6e8SBarry Smith {
1083a542b6e8SBarry Smith   PetscInt i;
1084a542b6e8SBarry Smith 
1085c5929fdfSBarry Smith   options = options ? options : defaultoptions;
10862d747510SLisandro Dalcin   if (!options) return 0;
10872d747510SLisandro Dalcin 
1088a542b6e8SBarry Smith   for (i=0; i<options->N; i++) {
1089a542b6e8SBarry Smith     if (options->names[i])  free(options->names[i]);
1090a542b6e8SBarry Smith     if (options->values[i]) free(options->values[i]);
1091a542b6e8SBarry Smith   }
10922d747510SLisandro Dalcin   options->N = 0;
10932d747510SLisandro Dalcin 
1094a542b6e8SBarry Smith   for (i=0; i<options->Naliases; i++) {
1095a542b6e8SBarry Smith     free(options->aliases1[i]);
1096a542b6e8SBarry Smith     free(options->aliases2[i]);
1097a542b6e8SBarry Smith   }
1098a542b6e8SBarry Smith   options->Naliases = 0;
1099a542b6e8SBarry Smith 
11002d747510SLisandro Dalcin   /* destroy hash table */
11012d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
11022d747510SLisandro Dalcin   options->ht = NULL;
11030eb63584SBarry Smith 
11042d747510SLisandro Dalcin   options->prefixind = 0;
11052d747510SLisandro Dalcin   options->prefix[0] = 0;
11062d747510SLisandro Dalcin   options->help      = PETSC_FALSE;
11074416b707SBarry Smith   return 0;
11084416b707SBarry Smith }
11094416b707SBarry Smith 
11102d747510SLisandro Dalcin /*@C
11112d747510SLisandro Dalcin    PetscOptionsSetAlias - Makes a key and alias for another key
11122d747510SLisandro Dalcin 
11131c9f3c13SBarry Smith    Logically Collective
11142d747510SLisandro Dalcin 
11152d747510SLisandro Dalcin    Input Parameters:
11162d747510SLisandro Dalcin +  options - options database, or NULL for default global database
11172d747510SLisandro Dalcin .  newname - the alias
11182d747510SLisandro Dalcin -  oldname - the name that alias will refer to
11192d747510SLisandro Dalcin 
11202d747510SLisandro Dalcin    Level: advanced
11212d747510SLisandro Dalcin 
11229666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
11231c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
11241c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
11251c9f3c13SBarry Smith    on different ranks.
11261c9f3c13SBarry Smith 
11272d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(),
11282d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(),
11292d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
11302d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
11312d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
11322d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
11332d747510SLisandro Dalcin @*/
11342d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[])
11352d747510SLisandro Dalcin {
11362d747510SLisandro Dalcin   PetscInt       n;
11372d747510SLisandro Dalcin   size_t         len;
11389210b8eaSVaclav Hapla   PetscBool      valid;
11392d747510SLisandro Dalcin   PetscErrorCode ierr;
11402d747510SLisandro Dalcin 
11412d747510SLisandro Dalcin   PetscFunctionBegin;
11422d747510SLisandro Dalcin   PetscValidCharPointer(newname,2);
11432d747510SLisandro Dalcin   PetscValidCharPointer(oldname,3);
11442d747510SLisandro Dalcin   options = options ? options : defaultoptions;
11459210b8eaSVaclav Hapla   ierr = PetscOptionsValidKey(newname,&valid);CHKERRQ(ierr);
11469210b8eaSVaclav Hapla   if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliased option %s",newname);
11479210b8eaSVaclav Hapla   ierr = PetscOptionsValidKey(oldname,&valid);CHKERRQ(ierr);
11489210b8eaSVaclav Hapla   if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Invalid aliasee option %s",oldname);
11492d747510SLisandro Dalcin 
11502d747510SLisandro Dalcin   n = options->Naliases;
11512d747510SLisandro 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);
11522d747510SLisandro Dalcin 
11532d747510SLisandro Dalcin   newname++; oldname++;
11542d747510SLisandro Dalcin   ierr = PetscStrlen(newname,&len);CHKERRQ(ierr);
11552d747510SLisandro Dalcin   options->aliases1[n] = (char*)malloc((len+1)*sizeof(char));
11562d747510SLisandro Dalcin   ierr = PetscStrcpy(options->aliases1[n],newname);CHKERRQ(ierr);
11572d747510SLisandro Dalcin   ierr = PetscStrlen(oldname,&len);CHKERRQ(ierr);
11582d747510SLisandro Dalcin   options->aliases2[n] = (char*)malloc((len+1)*sizeof(char));
11592d747510SLisandro Dalcin   ierr = PetscStrcpy(options->aliases2[n],oldname);CHKERRQ(ierr);
11602d747510SLisandro Dalcin   options->Naliases++;
11612d747510SLisandro Dalcin   PetscFunctionReturn(0);
11622d747510SLisandro Dalcin }
11634416b707SBarry Smith 
1164e5c89e4eSSatish Balay /*@C
1165e5c89e4eSSatish Balay    PetscOptionsSetValue - Sets an option name-value pair in the options
1166e5c89e4eSSatish Balay    database, overriding whatever is already present.
1167e5c89e4eSSatish Balay 
11681c9f3c13SBarry Smith    Logically Collective
1169e5c89e4eSSatish Balay 
1170e5c89e4eSSatish Balay    Input Parameters:
1171c5929fdfSBarry Smith +  options - options database, use NULL for the default global database
1172c5929fdfSBarry Smith .  name - name of option, this SHOULD have the - prepended
11732d747510SLisandro Dalcin -  value - the option value (not used for all options, so can be NULL)
1174e5c89e4eSSatish Balay 
1175e5c89e4eSSatish Balay    Level: intermediate
1176e5c89e4eSSatish Balay 
1177e5c89e4eSSatish Balay    Note:
1178d49172ceSBarry Smith    This function can be called BEFORE PetscInitialize()
1179d49172ceSBarry Smith 
11809666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
11811c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
11821c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
11831c9f3c13SBarry Smith    on different ranks.
11841c9f3c13SBarry Smith 
11852d747510SLisandro Dalcin    Developers Note: Uses malloc() directly because PETSc may not be initialized yet.
1186b0250c70SBarry Smith 
11872d747510SLisandro Dalcin .seealso: PetscOptionsInsert(), PetscOptionsClearValue()
1188e5c89e4eSSatish Balay @*/
11892d747510SLisandro Dalcin PetscErrorCode PetscOptionsSetValue(PetscOptions options,const char name[],const char value[])
1190e5c89e4eSSatish Balay {
1191c5b5d8d5SVaclav Hapla   return PetscOptionsSetValue_Private(options,name,value,NULL);
1192c5b5d8d5SVaclav Hapla }
1193c5b5d8d5SVaclav Hapla 
1194c5b5d8d5SVaclav Hapla static PetscErrorCode PetscOptionsSetValue_Private(PetscOptions options,const char name[],const char value[],int *pos)
1195c5b5d8d5SVaclav Hapla {
1196e5c89e4eSSatish Balay   size_t         len;
11972d747510SLisandro Dalcin   int            N,n,i;
1198e5c89e4eSSatish Balay   char           **names;
11992d747510SLisandro Dalcin   char           fullname[MAXOPTNAME] = "";
1200c5b5d8d5SVaclav Hapla   PetscBool      flg;
12012d747510SLisandro Dalcin   PetscErrorCode ierr;
1202e5c89e4eSSatish Balay 
12037272c0d2SVaclav Hapla   if (!options) {
12042d747510SLisandro Dalcin     ierr = PetscOptionsCreateDefault();if (ierr) return ierr;
12057272c0d2SVaclav Hapla     options = defaultoptions;
1206c5929fdfSBarry Smith   }
12072d747510SLisandro Dalcin 
12082d747510SLisandro Dalcin   if (name[0] != '-') return PETSC_ERR_ARG_OUTOFRANGE;
1209e5c89e4eSSatish Balay 
1210d06005cbSLisandro Dalcin   ierr = PetscOptionsSkipPrecedent(options,name,&flg);if (ierr) return ierr;
1211c5b5d8d5SVaclav Hapla   if (flg) return 0;
1212e5c89e4eSSatish Balay 
12132d747510SLisandro Dalcin   name++; /* skip starting dash */
12142d747510SLisandro Dalcin 
121574e0666dSJed Brown   if (options->prefixind > 0) {
1216d49172ceSBarry Smith     strncpy(fullname,options->prefix,sizeof(fullname));
12172d747510SLisandro Dalcin     fullname[sizeof(fullname)-1] = 0;
121889ae1891SBarry Smith     strncat(fullname,name,sizeof(fullname)-strlen(fullname)-1);
12192d747510SLisandro Dalcin     fullname[sizeof(fullname)-1] = 0;
122074e0666dSJed Brown     name = fullname;
122174e0666dSJed Brown   }
122274e0666dSJed Brown 
122374e0666dSJed Brown   /* check against aliases */
1224e5c89e4eSSatish Balay   N = options->Naliases;
1225e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
12262d747510SLisandro Dalcin     int result = PetscOptNameCmp(options->aliases1[i],name);
12272d747510SLisandro Dalcin     if (!result) { name = options->aliases2[i]; break; }
1228e5c89e4eSSatish Balay   }
1229e5c89e4eSSatish Balay 
12302d747510SLisandro Dalcin   /* slow search */
12312d747510SLisandro Dalcin   N = n = options->N;
1232e5c89e4eSSatish Balay   names = options->names;
1233e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
12342d747510SLisandro Dalcin     int result = PetscOptNameCmp(names[i],name);
12352d747510SLisandro Dalcin     if (!result) {
12362d747510SLisandro Dalcin       n = i; goto setvalue;
12372d747510SLisandro Dalcin     } else if (result > 0) {
12382d747510SLisandro Dalcin       n = i; break;
1239e5c89e4eSSatish Balay     }
1240e5c89e4eSSatish Balay   }
12412d747510SLisandro Dalcin   if (N >= MAXOPTIONS) return PETSC_ERR_MEM;
12422d747510SLisandro Dalcin   /* shift remaining values up 1 */
1243e5c89e4eSSatish Balay   for (i=N; i>n; i--) {
12445e8c5e88SLisandro Dalcin     options->names[i]  = options->names[i-1];
1245e5c89e4eSSatish Balay     options->values[i] = options->values[i-1];
1246e5c89e4eSSatish Balay     options->used[i]   = options->used[i-1];
1247e5c89e4eSSatish Balay   }
12482d747510SLisandro Dalcin   options->names[n]  = NULL;
12492d747510SLisandro Dalcin   options->values[n] = NULL;
12502d747510SLisandro Dalcin   options->used[n]   = PETSC_FALSE;
12512d747510SLisandro Dalcin   options->N++;
12522d747510SLisandro Dalcin 
12532d747510SLisandro Dalcin   /* destroy hash table */
12542d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
12552d747510SLisandro Dalcin   options->ht = NULL;
12562d747510SLisandro Dalcin 
12572d747510SLisandro Dalcin   /* set new name */
125870d8d27cSBarry Smith   len = strlen(name);
12595e8c5e88SLisandro Dalcin   options->names[n] = (char*)malloc((len+1)*sizeof(char));
1260d49172ceSBarry Smith   if (!options->names[n]) return PETSC_ERR_MEM;
1261d49172ceSBarry Smith   strcpy(options->names[n],name);
12622d747510SLisandro Dalcin 
12632d747510SLisandro Dalcin setvalue:
12642d747510SLisandro Dalcin   /* set new value */
12652d747510SLisandro Dalcin   if (options->values[n]) free(options->values[n]);
1266d49172ceSBarry Smith   len = value ? strlen(value) : 0;
12675e8c5e88SLisandro Dalcin   if (len) {
1268e5c89e4eSSatish Balay     options->values[n] = (char*)malloc((len+1)*sizeof(char));
1269d49172ceSBarry Smith     if (!options->values[n]) return PETSC_ERR_MEM;
1270d49172ceSBarry Smith     strcpy(options->values[n],value);
12712d747510SLisandro Dalcin   } else {
12722d747510SLisandro Dalcin     options->values[n] = NULL;
12732d747510SLisandro Dalcin   }
12742d747510SLisandro Dalcin 
127591ad3481SVaclav Hapla   /* handle -help so that it can be set from anywhere */
127691ad3481SVaclav Hapla   if (!PetscOptNameCmp(name,"help")) {
127791ad3481SVaclav Hapla     options->help = PETSC_TRUE;
1278d06005cbSLisandro Dalcin     options->help_intro = (value && !PetscOptNameCmp(value,"intro")) ? PETSC_TRUE : PETSC_FALSE;
127991ad3481SVaclav Hapla     options->used[n] = PETSC_TRUE;
128091ad3481SVaclav Hapla   }
128191ad3481SVaclav Hapla 
1282c5b5d8d5SVaclav Hapla   if (PetscErrorHandlingInitialized) {
1283c5b5d8d5SVaclav Hapla     ierr = PetscOptionsMonitor(options,name,value);CHKERRQ(ierr);
1284c5b5d8d5SVaclav Hapla   }
1285c5b5d8d5SVaclav Hapla   if (pos) *pos = n;
1286d49172ceSBarry Smith   return 0;
1287e5c89e4eSSatish Balay }
1288e5c89e4eSSatish Balay 
1289e5c89e4eSSatish Balay /*@C
1290e5c89e4eSSatish Balay    PetscOptionsClearValue - Clears an option name-value pair in the options
1291e5c89e4eSSatish Balay    database, overriding whatever is already present.
1292e5c89e4eSSatish Balay 
12931c9f3c13SBarry Smith    Logically Collective
1294e5c89e4eSSatish Balay 
1295*d8d19677SJose E. Roman    Input Parameters:
1296c5929fdfSBarry Smith +  options - options database, use NULL for the default global database
1297a2b725a8SWilliam Gropp -  name - name of option, this SHOULD have the - prepended
1298e5c89e4eSSatish Balay 
1299e5c89e4eSSatish Balay    Level: intermediate
1300e5c89e4eSSatish Balay 
13019666a313SBarry Smith    The collectivity of this routine is complex; only the MPI processes that call this routine will
13021c9f3c13SBarry Smith    have the affect of these options. If some processes that create objects call this routine and others do
13031c9f3c13SBarry Smith    not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
13041c9f3c13SBarry Smith    on different ranks.
13051c9f3c13SBarry Smith 
1306e5c89e4eSSatish Balay .seealso: PetscOptionsInsert()
1307e5c89e4eSSatish Balay @*/
13082d747510SLisandro Dalcin PetscErrorCode PetscOptionsClearValue(PetscOptions options,const char name[])
1309e5c89e4eSSatish Balay {
13102d747510SLisandro Dalcin   int            N,n,i;
13112d747510SLisandro Dalcin   char           **names;
1312e5c89e4eSSatish Balay   PetscErrorCode ierr;
1313e5c89e4eSSatish Balay 
1314e5c89e4eSSatish Balay   PetscFunctionBegin;
1315c5929fdfSBarry Smith   options = options ? options : defaultoptions;
13162d747510SLisandro Dalcin   if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1317c9dcd962SLisandro Dalcin   if (!PetscOptNameCmp(name,"-help")) options->help = options->help_intro = PETSC_FALSE;
13182d747510SLisandro Dalcin 
13192d747510SLisandro Dalcin   name++; /* skip starting dash */
13202d747510SLisandro Dalcin 
13212d747510SLisandro Dalcin   /* slow search */
13222d747510SLisandro Dalcin   N = n = options->N;
1323e5c89e4eSSatish Balay   names = options->names;
1324e5c89e4eSSatish Balay   for (i=0; i<N; i++) {
13252d747510SLisandro Dalcin     int result = PetscOptNameCmp(names[i],name);
13262d747510SLisandro Dalcin     if (!result) {
13272d747510SLisandro Dalcin       n = i; break;
13282d747510SLisandro Dalcin     } else if (result > 0) {
13292d747510SLisandro Dalcin       n = N; break;
1330e5c89e4eSSatish Balay     }
13312d747510SLisandro Dalcin   }
13322d747510SLisandro Dalcin   if (n == N) PetscFunctionReturn(0); /* it was not present */
1333e5c89e4eSSatish Balay 
13342d747510SLisandro Dalcin   /* remove name and value */
13352d747510SLisandro Dalcin   if (options->names[n])  free(options->names[n]);
13362d747510SLisandro Dalcin   if (options->values[n]) free(options->values[n]);
1337e5c89e4eSSatish Balay   /* shift remaining values down 1 */
1338e5c89e4eSSatish Balay   for (i=n; i<N-1; i++) {
13395e8c5e88SLisandro Dalcin     options->names[i]  = options->names[i+1];
1340e5c89e4eSSatish Balay     options->values[i] = options->values[i+1];
1341e5c89e4eSSatish Balay     options->used[i]   = options->used[i+1];
1342e5c89e4eSSatish Balay   }
1343e5c89e4eSSatish Balay   options->N--;
13442d747510SLisandro Dalcin 
13452d747510SLisandro Dalcin   /* destroy hash table */
13462d747510SLisandro Dalcin   kh_destroy(HO,options->ht);
13472d747510SLisandro Dalcin   options->ht = NULL;
13482d747510SLisandro Dalcin 
13492d747510SLisandro Dalcin   ierr = PetscOptionsMonitor(options,name,NULL);CHKERRQ(ierr);
1350e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1351e5c89e4eSSatish Balay }
1352e5c89e4eSSatish Balay 
1353e5c89e4eSSatish Balay /*@C
13542d747510SLisandro Dalcin    PetscOptionsFindPair - Gets an option name-value pair from the options database.
1355e5c89e4eSSatish Balay 
13562d747510SLisandro Dalcin    Not Collective
1357e5c89e4eSSatish Balay 
1358e5c89e4eSSatish Balay    Input Parameters:
13592d747510SLisandro Dalcin +  options - options database, use NULL for the default global database
13602d747510SLisandro Dalcin .  pre - the string to prepend to the name or NULL, this SHOULD NOT have the "-" prepended
13612d747510SLisandro Dalcin -  name - name of option, this SHOULD have the "-" prepended
1362e5c89e4eSSatish Balay 
13632d747510SLisandro Dalcin    Output Parameters:
13642d747510SLisandro Dalcin +  value - the option value (optional, not used for all options)
13652d747510SLisandro Dalcin -  set - whether the option is set (optional)
1366e5c89e4eSSatish Balay 
13679666a313SBarry Smith    Notes:
13689666a313SBarry Smith    Each process may find different values or no value depending on how options were inserted into the database
13691c9f3c13SBarry Smith 
13702d747510SLisandro Dalcin    Level: developer
13712d747510SLisandro Dalcin 
13722d747510SLisandro Dalcin .seealso: PetscOptionsSetValue(), PetscOptionsClearValue()
1373e5c89e4eSSatish Balay @*/
13742d747510SLisandro Dalcin PetscErrorCode PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char *value[],PetscBool *set)
1375e5c89e4eSSatish Balay {
13762d747510SLisandro Dalcin   char           buf[MAXOPTNAME];
1377daabea38SBarry Smith   PetscBool      usehashtable = PETSC_TRUE;
13782d747510SLisandro Dalcin   PetscBool      matchnumbers = PETSC_TRUE;
1379e5c89e4eSSatish Balay   PetscErrorCode ierr;
1380e5c89e4eSSatish Balay 
1381e5c89e4eSSatish Balay   PetscFunctionBegin;
1382c5929fdfSBarry Smith   options = options ? options : defaultoptions;
13832d747510SLisandro Dalcin   if (pre && PetscUnlikely(pre[0] == '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre);
13842d747510SLisandro Dalcin   if (PetscUnlikely(name[0] != '-')) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1385e5c89e4eSSatish Balay 
13862d747510SLisandro Dalcin   name++; /* skip starting dash */
1387e5c89e4eSSatish Balay 
13887cd08cecSJed Brown   /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */
13892d747510SLisandro Dalcin   if (pre && pre[0]) {
13902d747510SLisandro Dalcin     char *ptr = buf;
13912d747510SLisandro Dalcin     if (name[0] == '-') { *ptr++ = '-';  name++; }
13922d747510SLisandro Dalcin     ierr = PetscStrncpy(ptr,pre,buf+sizeof(buf)-ptr);CHKERRQ(ierr);
13932d747510SLisandro Dalcin     ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr);
13942d747510SLisandro Dalcin     name = buf;
13957cd08cecSJed Brown   }
13962d747510SLisandro Dalcin 
139776bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
13982f828895SJed Brown     PetscBool valid;
13992d747510SLisandro Dalcin     char      key[MAXOPTNAME+1] = "-";
14002d747510SLisandro Dalcin     ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr);
14012f828895SJed Brown     ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr);
14022f828895SJed 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);
14032f828895SJed Brown   }
1404e5c89e4eSSatish Balay 
14052d747510SLisandro Dalcin   if (!options->ht && usehashtable) {
14062d747510SLisandro Dalcin     int i,ret;
14072d747510SLisandro Dalcin     khiter_t it;
14082d747510SLisandro Dalcin     khash_t(HO) *ht;
14092d747510SLisandro Dalcin     ht = kh_init(HO);
14102d747510SLisandro Dalcin     if (PetscUnlikely(!ht)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
14112d747510SLisandro Dalcin     ret = kh_resize(HO,ht,options->N*2); /* twice the required size to reduce risk of collisions */
14122d747510SLisandro Dalcin     if (PetscUnlikely(ret)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
14132d747510SLisandro Dalcin     for (i=0; i<options->N; i++) {
14142d747510SLisandro Dalcin       it = kh_put(HO,ht,options->names[i],&ret);
14152d747510SLisandro Dalcin       if (PetscUnlikely(ret != 1)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"Hash table allocation failed");
14162d747510SLisandro Dalcin       kh_val(ht,it) = i;
14172d747510SLisandro Dalcin     }
14182d747510SLisandro Dalcin     options->ht = ht;
14192d747510SLisandro Dalcin   }
14202d747510SLisandro Dalcin 
14212d747510SLisandro Dalcin   if (usehashtable)
14222d747510SLisandro Dalcin   { /* fast search */
14232d747510SLisandro Dalcin     khash_t(HO) *ht = options->ht;
14242d747510SLisandro Dalcin     khiter_t it = kh_get(HO,ht,name);
14252d747510SLisandro Dalcin     if (it != kh_end(ht)) {
14262d747510SLisandro Dalcin       int i = kh_val(ht,it);
1427e5c89e4eSSatish Balay       options->used[i]  = PETSC_TRUE;
14282d747510SLisandro Dalcin       if (value) *value = options->values[i];
14292d747510SLisandro Dalcin       if (set)   *set   = PETSC_TRUE;
14302d747510SLisandro Dalcin       PetscFunctionReturn(0);
14312d747510SLisandro Dalcin     }
14322d747510SLisandro Dalcin   } else
14332d747510SLisandro Dalcin   { /* slow search */
14342d747510SLisandro Dalcin     int i, N = options->N;
14352d747510SLisandro Dalcin     for (i=0; i<N; i++) {
1436daabea38SBarry Smith       int result = PetscOptNameCmp(options->names[i],name);
14372d747510SLisandro Dalcin       if (!result) {
14382d747510SLisandro Dalcin         options->used[i]  = PETSC_TRUE;
14392d747510SLisandro Dalcin         if (value) *value = options->values[i];
14402d747510SLisandro Dalcin         if (set)   *set   = PETSC_TRUE;
14412d747510SLisandro Dalcin         PetscFunctionReturn(0);
14422d747510SLisandro Dalcin       } else if (result > 0) {
1443e5c89e4eSSatish Balay         break;
1444e5c89e4eSSatish Balay       }
1445e5c89e4eSSatish Balay     }
14462d747510SLisandro Dalcin   }
14472d747510SLisandro Dalcin 
14482d747510SLisandro Dalcin   /*
14492d747510SLisandro Dalcin    The following block slows down all lookups in the most frequent path (most lookups are unsuccessful).
14502d747510SLisandro Dalcin    Maybe this special lookup mode should be enabled on request with a push/pop API.
14512d747510SLisandro Dalcin    The feature of matching _%d_ used sparingly in the codebase.
14522d747510SLisandro Dalcin    */
14532d747510SLisandro Dalcin   if (matchnumbers) {
14542d747510SLisandro Dalcin     int i,j,cnt = 0,locs[16],loce[16];
1455e5c89e4eSSatish Balay     /* determine the location and number of all _%d_ in the key */
14562d747510SLisandro Dalcin     for (i=0; name[i]; i++) {
14572d747510SLisandro Dalcin       if (name[i] == '_') {
14582d747510SLisandro Dalcin         for (j=i+1; name[j]; j++) {
14592d747510SLisandro Dalcin           if (name[j] >= '0' && name[j] <= '9') continue;
14602d747510SLisandro Dalcin           if (name[j] == '_' && j > i+1) { /* found a number */
1461e5c89e4eSSatish Balay             locs[cnt]   = i+1;
1462e5c89e4eSSatish Balay             loce[cnt++] = j+1;
1463e5c89e4eSSatish Balay           }
14642d747510SLisandro Dalcin           i = j-1;
1465e5c89e4eSSatish Balay           break;
1466e5c89e4eSSatish Balay         }
1467e5c89e4eSSatish Balay       }
1468e5c89e4eSSatish Balay     }
1469e5c89e4eSSatish Balay     for (i=0; i<cnt; i++) {
14702d747510SLisandro Dalcin       PetscBool found;
14712d747510SLisandro Dalcin       char      opt[MAXOPTNAME+1] = "-", tmp[MAXOPTNAME];
14722d747510SLisandro Dalcin       ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[i]+1),sizeof(tmp)));CHKERRQ(ierr);
14732d747510SLisandro Dalcin       ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr);
14742d747510SLisandro Dalcin       ierr = PetscStrlcat(opt,name+loce[i],sizeof(opt));CHKERRQ(ierr);
14752d747510SLisandro Dalcin       ierr = PetscOptionsFindPair(options,NULL,opt,value,&found);CHKERRQ(ierr);
14762d747510SLisandro Dalcin       if (found) {if (set) *set = PETSC_TRUE; PetscFunctionReturn(0);}
1477e5c89e4eSSatish Balay     }
1478e5c89e4eSSatish Balay   }
14792d747510SLisandro Dalcin 
14802d747510SLisandro Dalcin   if (set) *set = PETSC_FALSE;
1481e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1482e5c89e4eSSatish Balay }
1483e5c89e4eSSatish Balay 
1484d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */
14852d747510SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[], const char name[],const char *value[],PetscBool *set)
1486514bf10dSMatthew G Knepley {
14872d747510SLisandro Dalcin   char           buf[MAXOPTNAME];
1488d6ced9c0SMatthew G. Knepley   int            numCnt = 0, locs[16],loce[16];
1489514bf10dSMatthew G Knepley   PetscErrorCode ierr;
1490514bf10dSMatthew G Knepley 
1491514bf10dSMatthew G Knepley   PetscFunctionBegin;
1492c5929fdfSBarry Smith   options = options ? options : defaultoptions;
14932d747510SLisandro Dalcin   if (pre && pre[0] == '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Prefix cannot begin with '-': Instead %s",pre);
14942d747510SLisandro Dalcin   if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
1495514bf10dSMatthew G Knepley 
14962d747510SLisandro Dalcin   name++; /* skip starting dash */
1497514bf10dSMatthew G Knepley 
1498514bf10dSMatthew G Knepley   /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */
14992d747510SLisandro Dalcin   if (pre && pre[0]) {
15002d747510SLisandro Dalcin     char *ptr = buf;
15012d747510SLisandro Dalcin     if (name[0] == '-') { *ptr++ = '-';  name++; }
15022d747510SLisandro Dalcin     ierr = PetscStrncpy(ptr,pre,sizeof(buf)+(size_t)(ptr-buf));CHKERRQ(ierr);
15032d747510SLisandro Dalcin     ierr = PetscStrlcat(buf,name,sizeof(buf));CHKERRQ(ierr);
15042d747510SLisandro Dalcin     name = buf;
1505514bf10dSMatthew G Knepley   }
15062d747510SLisandro Dalcin 
150776bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {
1508514bf10dSMatthew G Knepley     PetscBool valid;
15092d747510SLisandro Dalcin     char      key[MAXOPTNAME+1] = "-";
15102d747510SLisandro Dalcin     ierr = PetscStrncpy(key+1,name,sizeof(key)-1);CHKERRQ(ierr);
1511514bf10dSMatthew G Knepley     ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr);
1512514bf10dSMatthew 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);
1513514bf10dSMatthew G Knepley   }
1514514bf10dSMatthew G Knepley 
1515d6ced9c0SMatthew G. Knepley   /* determine the location and number of all _%d_ in the key */
1516d6ced9c0SMatthew G. Knepley   {
1517d6ced9c0SMatthew G. Knepley     int i,j;
1518d6ced9c0SMatthew G. Knepley     for (i=0; name[i]; i++) {
1519d6ced9c0SMatthew G. Knepley       if (name[i] == '_') {
1520d6ced9c0SMatthew G. Knepley         for (j=i+1; name[j]; j++) {
1521d6ced9c0SMatthew G. Knepley           if (name[j] >= '0' && name[j] <= '9') continue;
1522d6ced9c0SMatthew G. Knepley           if (name[j] == '_' && j > i+1) { /* found a number */
1523d6ced9c0SMatthew G. Knepley             locs[numCnt]   = i+1;
1524d6ced9c0SMatthew G. Knepley             loce[numCnt++] = j+1;
1525d6ced9c0SMatthew G. Knepley           }
1526d6ced9c0SMatthew G. Knepley           i = j-1;
1527d6ced9c0SMatthew G. Knepley           break;
1528d6ced9c0SMatthew G. Knepley         }
1529d6ced9c0SMatthew G. Knepley       }
1530d6ced9c0SMatthew G. Knepley     }
1531d6ced9c0SMatthew G. Knepley   }
1532d6ced9c0SMatthew G. Knepley 
15332d747510SLisandro Dalcin   { /* slow search */
1534d6ced9c0SMatthew G. Knepley     int       c, i;
15352d747510SLisandro Dalcin     size_t    len;
15362d747510SLisandro Dalcin     PetscBool match;
1537d6ced9c0SMatthew G. Knepley 
1538d6ced9c0SMatthew G. Knepley     for (c = -1; c < numCnt; ++c) {
1539d6ced9c0SMatthew G. Knepley       char opt[MAXOPTNAME+1] = "", tmp[MAXOPTNAME];
1540d6ced9c0SMatthew G. Knepley 
1541d6ced9c0SMatthew G. Knepley       if (c < 0) {
1542d6ced9c0SMatthew G. Knepley         ierr = PetscStrcpy(opt,name);CHKERRQ(ierr);
1543d6ced9c0SMatthew G. Knepley       } else {
1544d6ced9c0SMatthew G. Knepley         ierr = PetscStrncpy(tmp,name,PetscMin((size_t)(locs[c]+1),sizeof(tmp)));CHKERRQ(ierr);
1545d6ced9c0SMatthew G. Knepley         ierr = PetscStrlcat(opt,tmp,sizeof(opt));CHKERRQ(ierr);
1546d6ced9c0SMatthew G. Knepley         ierr = PetscStrlcat(opt,name+loce[c],sizeof(opt));CHKERRQ(ierr);
1547d6ced9c0SMatthew G. Knepley       }
1548d6ced9c0SMatthew G. Knepley       ierr = PetscStrlen(opt,&len);CHKERRQ(ierr);
15492d747510SLisandro Dalcin       for (i=0; i<options->N; i++) {
1550d6ced9c0SMatthew G. Knepley         ierr = PetscStrncmp(options->names[i],opt,len,&match);CHKERRQ(ierr);
1551514bf10dSMatthew G Knepley         if (match) {
1552514bf10dSMatthew G Knepley           options->used[i]  = PETSC_TRUE;
15532d747510SLisandro Dalcin           if (value) *value = options->values[i];
15542d747510SLisandro Dalcin           if (set)   *set   = PETSC_TRUE;
15552d747510SLisandro Dalcin           PetscFunctionReturn(0);
1556514bf10dSMatthew G Knepley         }
1557514bf10dSMatthew G Knepley       }
15582d747510SLisandro Dalcin     }
1559d6ced9c0SMatthew G. Knepley   }
15602d747510SLisandro Dalcin 
15612d747510SLisandro Dalcin   if (set) *set = PETSC_FALSE;
1562514bf10dSMatthew G Knepley   PetscFunctionReturn(0);
1563514bf10dSMatthew G Knepley }
1564514bf10dSMatthew G Knepley 
1565e5c89e4eSSatish Balay /*@C
1566e5c89e4eSSatish Balay    PetscOptionsReject - Generates an error if a certain option is given.
1567e5c89e4eSSatish Balay 
15681c9f3c13SBarry Smith    Not Collective
1569e5c89e4eSSatish Balay 
1570e5c89e4eSSatish Balay    Input Parameters:
15715c9cc608SHong Zhang +  options - options database, use NULL for default global database
15722d747510SLisandro Dalcin .  pre - the option prefix (may be NULL)
15732d747510SLisandro Dalcin .  name - the option name one is seeking
15740298fd71SBarry Smith -  mess - error message (may be NULL)
1575e5c89e4eSSatish Balay 
1576e5c89e4eSSatish Balay    Level: advanced
1577e5c89e4eSSatish Balay 
1578e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),OptionsHasName(),
1579acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1580e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1581e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1582acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1583a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
1584e5c89e4eSSatish Balay @*/
15852d747510SLisandro Dalcin PetscErrorCode PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[])
1586e5c89e4eSSatish Balay {
1587e5c89e4eSSatish Balay   PetscErrorCode ierr;
1588ace3abfcSBarry Smith   PetscBool      flag = PETSC_FALSE;
1589e5c89e4eSSatish Balay 
1590e5c89e4eSSatish Balay   PetscFunctionBegin;
15912d747510SLisandro Dalcin   ierr = PetscOptionsHasName(options,pre,name,&flag);CHKERRQ(ierr);
1592e5c89e4eSSatish Balay   if (flag) {
15932d747510SLisandro 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);
15942d747510SLisandro Dalcin     else SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Program has disabled option: -%s%s",pre?pre:"",name+1);
1595e5c89e4eSSatish Balay   }
1596e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1597e5c89e4eSSatish Balay }
1598e5c89e4eSSatish Balay 
1599e5c89e4eSSatish Balay /*@C
16002d747510SLisandro Dalcin    PetscOptionsHasHelp - Determines whether the "-help" option is in the database.
16012d747510SLisandro Dalcin 
16022d747510SLisandro Dalcin    Not Collective
16032d747510SLisandro Dalcin 
16042d747510SLisandro Dalcin    Input Parameters:
16052d747510SLisandro Dalcin .  options - options database, use NULL for default global database
16062d747510SLisandro Dalcin 
16072d747510SLisandro Dalcin    Output Parameters:
16082d747510SLisandro Dalcin .  set - PETSC_TRUE if found else PETSC_FALSE.
16092d747510SLisandro Dalcin 
16102d747510SLisandro Dalcin    Level: advanced
16112d747510SLisandro Dalcin 
16122d747510SLisandro Dalcin .seealso: PetscOptionsHasName()
16132d747510SLisandro Dalcin @*/
16142d747510SLisandro Dalcin PetscErrorCode PetscOptionsHasHelp(PetscOptions options,PetscBool *set)
16152d747510SLisandro Dalcin {
16162d747510SLisandro Dalcin   PetscFunctionBegin;
16172d747510SLisandro Dalcin   PetscValidPointer(set,2);
16182d747510SLisandro Dalcin   options = options ? options : defaultoptions;
16192d747510SLisandro Dalcin   *set = options->help;
16202d747510SLisandro Dalcin   PetscFunctionReturn(0);
16212d747510SLisandro Dalcin }
16222d747510SLisandro Dalcin 
1623d314f959SVaclav Hapla PetscErrorCode PetscOptionsHasHelpIntro_Internal(PetscOptions options,PetscBool *set)
1624d314f959SVaclav Hapla {
1625d314f959SVaclav Hapla   PetscFunctionBegin;
1626d314f959SVaclav Hapla   PetscValidPointer(set,2);
1627d314f959SVaclav Hapla   options = options ? options : defaultoptions;
1628d314f959SVaclav Hapla   *set = options->help_intro;
1629d314f959SVaclav Hapla   PetscFunctionReturn(0);
1630d314f959SVaclav Hapla }
1631d314f959SVaclav Hapla 
16322d747510SLisandro Dalcin /*@C
1633e24fcbf7SPierre Jolivet    PetscOptionsHasName - Determines whether a certain option is given in the database. This returns true whether the option is a number, string or Boolean, even
1634e24fcbf7SPierre Jolivet                       if its value is set to false.
1635e5c89e4eSSatish Balay 
1636e5c89e4eSSatish Balay    Not Collective
1637e5c89e4eSSatish Balay 
1638e5c89e4eSSatish Balay    Input Parameters:
16395c9cc608SHong Zhang +  options - options database, use NULL for default global database
16403de71b31SHong Zhang .  pre - string to prepend to the name or NULL
16413de71b31SHong Zhang -  name - the option one is seeking
1642e5c89e4eSSatish Balay 
1643e5c89e4eSSatish Balay    Output Parameters:
164496ef3cdfSSatish Balay .  set - PETSC_TRUE if found else PETSC_FALSE.
1645e5c89e4eSSatish Balay 
1646e5c89e4eSSatish Balay    Level: beginner
1647e5c89e4eSSatish Balay 
164895452b02SPatrick Sanan    Notes:
1649acfcf0e5SJed Brown    In many cases you probably want to use PetscOptionsGetBool() instead of calling this, to allowing toggling values.
165090d69ab7SBarry Smith 
1651e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
1652f3e3d7dfSBarry Smith           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
1653e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
1654e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
1655acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
1656a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
1657e5c89e4eSSatish Balay @*/
1658c5929fdfSBarry Smith PetscErrorCode PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool *set)
1659e5c89e4eSSatish Balay {
16602d747510SLisandro Dalcin   const char     *value;
1661e5c89e4eSSatish Balay   PetscErrorCode ierr;
1662ace3abfcSBarry Smith   PetscBool      flag;
1663e5c89e4eSSatish Balay 
1664e5c89e4eSSatish Balay   PetscFunctionBegin;
16652d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
166696ef3cdfSSatish Balay   if (set) *set = flag;
1667e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1668e5c89e4eSSatish Balay }
1669e5c89e4eSSatish Balay 
1670e5c89e4eSSatish Balay /*@C
16712d747510SLisandro Dalcin    PetscOptionsGetAll - Lists all the options the program was run with in a single string.
16722d747510SLisandro Dalcin 
16732d747510SLisandro Dalcin    Not Collective
16742d747510SLisandro Dalcin 
1675fd292e60Sprj-    Input Parameter:
16762d747510SLisandro Dalcin .  options - the options database, use NULL for the default global database
16772d747510SLisandro Dalcin 
16782d747510SLisandro Dalcin    Output Parameter:
16792d747510SLisandro Dalcin .  copts - pointer where string pointer is stored
16802d747510SLisandro Dalcin 
16812d747510SLisandro Dalcin    Notes:
16821c9f3c13SBarry Smith     The array and each entry in the array should be freed with PetscFree()
16831c9f3c13SBarry Smith     Each process may have different values depending on how the options were inserted into the database
16842d747510SLisandro Dalcin 
16852d747510SLisandro Dalcin    Level: advanced
16862d747510SLisandro Dalcin 
16871c9f3c13SBarry Smith .seealso: PetscOptionsAllUsed(), PetscOptionsView(), PetscOptionsPush(), PetscOptionsPop()
16882d747510SLisandro Dalcin @*/
16892d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetAll(PetscOptions options,char *copts[])
16902d747510SLisandro Dalcin {
16912d747510SLisandro Dalcin   PetscErrorCode ierr;
16922d747510SLisandro Dalcin   PetscInt       i;
16932d747510SLisandro Dalcin   size_t         len = 1,lent = 0;
16942d747510SLisandro Dalcin   char           *coptions = NULL;
16952d747510SLisandro Dalcin 
16962d747510SLisandro Dalcin   PetscFunctionBegin;
16972d747510SLisandro Dalcin   PetscValidPointer(copts,2);
16982d747510SLisandro Dalcin   options = options ? options : defaultoptions;
16992d747510SLisandro Dalcin   /* count the length of the required string */
17002d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
17012d747510SLisandro Dalcin     ierr = PetscStrlen(options->names[i],&lent);CHKERRQ(ierr);
17022d747510SLisandro Dalcin     len += 2 + lent;
17032d747510SLisandro Dalcin     if (options->values[i]) {
17042d747510SLisandro Dalcin       ierr = PetscStrlen(options->values[i],&lent);CHKERRQ(ierr);
17052d747510SLisandro Dalcin       len += 1 + lent;
17062d747510SLisandro Dalcin     }
17072d747510SLisandro Dalcin   }
17082d747510SLisandro Dalcin   ierr = PetscMalloc1(len,&coptions);CHKERRQ(ierr);
17092d747510SLisandro Dalcin   coptions[0] = 0;
17102d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
17112d747510SLisandro Dalcin     ierr = PetscStrcat(coptions,"-");CHKERRQ(ierr);
17122d747510SLisandro Dalcin     ierr = PetscStrcat(coptions,options->names[i]);CHKERRQ(ierr);
17132d747510SLisandro Dalcin     ierr = PetscStrcat(coptions," ");CHKERRQ(ierr);
17142d747510SLisandro Dalcin     if (options->values[i]) {
17152d747510SLisandro Dalcin       ierr = PetscStrcat(coptions,options->values[i]);CHKERRQ(ierr);
17162d747510SLisandro Dalcin       ierr = PetscStrcat(coptions," ");CHKERRQ(ierr);
17172d747510SLisandro Dalcin     }
17182d747510SLisandro Dalcin   }
17192d747510SLisandro Dalcin   *copts = coptions;
17202d747510SLisandro Dalcin   PetscFunctionReturn(0);
17212d747510SLisandro Dalcin }
17222d747510SLisandro Dalcin 
17232d747510SLisandro Dalcin /*@C
17242d747510SLisandro Dalcin    PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database
17252d747510SLisandro Dalcin 
17262d747510SLisandro Dalcin    Not Collective
17272d747510SLisandro Dalcin 
1728*d8d19677SJose E. Roman    Input Parameters:
17292d747510SLisandro Dalcin +  options - options database, use NULL for default global database
17302d747510SLisandro Dalcin -  name - string name of option
17312d747510SLisandro Dalcin 
17322d747510SLisandro Dalcin    Output Parameter:
17332d747510SLisandro Dalcin .  used - PETSC_TRUE if the option was used, otherwise false, including if option was not found in options database
17342d747510SLisandro Dalcin 
17352d747510SLisandro Dalcin    Level: advanced
17362d747510SLisandro Dalcin 
17379666a313SBarry Smith    Notes:
17389666a313SBarry Smith    The value returned may be different on each process and depends on which options have been processed
17391c9f3c13SBarry Smith    on the given process
17401c9f3c13SBarry Smith 
17412d747510SLisandro Dalcin .seealso: PetscOptionsView(), PetscOptionsLeft(), PetscOptionsAllUsed()
17422d747510SLisandro Dalcin @*/
17432d747510SLisandro Dalcin PetscErrorCode PetscOptionsUsed(PetscOptions options,const char *name,PetscBool *used)
17442d747510SLisandro Dalcin {
17452d747510SLisandro Dalcin   PetscInt       i;
17462d747510SLisandro Dalcin   PetscErrorCode ierr;
17472d747510SLisandro Dalcin 
17482d747510SLisandro Dalcin   PetscFunctionBegin;
17492d747510SLisandro Dalcin   PetscValidCharPointer(name,2);
17502d747510SLisandro Dalcin   PetscValidPointer(used,3);
17512d747510SLisandro Dalcin   options = options ? options : defaultoptions;
17522d747510SLisandro Dalcin   *used = PETSC_FALSE;
17532d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
1754ee42b8b3SLisandro Dalcin     ierr = PetscStrcasecmp(options->names[i],name,used);CHKERRQ(ierr);
17552d747510SLisandro Dalcin     if (*used) {
17562d747510SLisandro Dalcin       *used = options->used[i];
17572d747510SLisandro Dalcin       break;
17582d747510SLisandro Dalcin     }
17592d747510SLisandro Dalcin   }
17602d747510SLisandro Dalcin   PetscFunctionReturn(0);
17612d747510SLisandro Dalcin }
17622d747510SLisandro Dalcin 
1763487a658cSBarry Smith /*@
17642d747510SLisandro Dalcin    PetscOptionsAllUsed - Returns a count of the number of options in the
17652d747510SLisandro Dalcin    database that have never been selected.
17662d747510SLisandro Dalcin 
17672d747510SLisandro Dalcin    Not Collective
17682d747510SLisandro Dalcin 
17692d747510SLisandro Dalcin    Input Parameter:
17702d747510SLisandro Dalcin .  options - options database, use NULL for default global database
17712d747510SLisandro Dalcin 
17722d747510SLisandro Dalcin    Output Parameter:
17732d747510SLisandro Dalcin .  N - count of options not used
17742d747510SLisandro Dalcin 
17752d747510SLisandro Dalcin    Level: advanced
17762d747510SLisandro Dalcin 
17779666a313SBarry Smith    Notes:
17789666a313SBarry Smith    The value returned may be different on each process and depends on which options have been processed
17791c9f3c13SBarry Smith    on the given process
17801c9f3c13SBarry Smith 
17812d747510SLisandro Dalcin .seealso: PetscOptionsView()
17822d747510SLisandro Dalcin @*/
17832d747510SLisandro Dalcin PetscErrorCode PetscOptionsAllUsed(PetscOptions options,PetscInt *N)
17842d747510SLisandro Dalcin {
17852d747510SLisandro Dalcin   PetscInt     i,n = 0;
17862d747510SLisandro Dalcin 
17872d747510SLisandro Dalcin   PetscFunctionBegin;
17882d747510SLisandro Dalcin   PetscValidIntPointer(N,2);
17892d747510SLisandro Dalcin   options = options ? options : defaultoptions;
17902d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
17912d747510SLisandro Dalcin     if (!options->used[i]) n++;
17922d747510SLisandro Dalcin   }
17932d747510SLisandro Dalcin   *N = n;
17942d747510SLisandro Dalcin   PetscFunctionReturn(0);
17952d747510SLisandro Dalcin }
17962d747510SLisandro Dalcin 
1797487a658cSBarry Smith /*@
17982d747510SLisandro Dalcin    PetscOptionsLeft - Prints to screen any options that were set and never used.
17992d747510SLisandro Dalcin 
18002d747510SLisandro Dalcin    Not Collective
18012d747510SLisandro Dalcin 
18022d747510SLisandro Dalcin    Input Parameter:
18032d747510SLisandro Dalcin .  options - options database; use NULL for default global database
18042d747510SLisandro Dalcin 
18052d747510SLisandro Dalcin    Options Database Key:
18063c6db4c4SPierre Jolivet .  -options_left - activates PetscOptionsAllUsed() within PetscFinalize()
18072d747510SLisandro Dalcin 
18083de2bfdfSBarry Smith    Notes:
18093de2bfdfSBarry Smith       This is rarely used directly, it is called by PetscFinalize() in debug more or if -options_left
18101c9f3c13SBarry Smith       is passed otherwise to help users determine possible mistakes in their usage of options. This
18111c9f3c13SBarry Smith       only prints values on process zero of PETSC_COMM_WORLD. Other processes depending the objects
18121c9f3c13SBarry Smith       used may have different options that are left unused.
18133de2bfdfSBarry Smith 
18142d747510SLisandro Dalcin    Level: advanced
18152d747510SLisandro Dalcin 
18162d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed()
18172d747510SLisandro Dalcin @*/
18182d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeft(PetscOptions options)
18192d747510SLisandro Dalcin {
18202d747510SLisandro Dalcin   PetscErrorCode ierr;
18212d747510SLisandro Dalcin   PetscInt       i;
18223de2bfdfSBarry Smith   PetscInt       cnt = 0;
18233de2bfdfSBarry Smith   PetscOptions   toptions;
18242d747510SLisandro Dalcin 
18252d747510SLisandro Dalcin   PetscFunctionBegin;
18263de2bfdfSBarry Smith   toptions = options ? options : defaultoptions;
18273de2bfdfSBarry Smith   for (i=0; i<toptions->N; i++) {
18283de2bfdfSBarry Smith     if (!toptions->used[i]) {
18293de2bfdfSBarry Smith       if (toptions->values[i]) {
18303de2bfdfSBarry Smith         ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s value: %s\n",toptions->names[i],toptions->values[i]);CHKERRQ(ierr);
18312d747510SLisandro Dalcin       } else {
18323de2bfdfSBarry Smith         ierr = PetscPrintf(PETSC_COMM_WORLD,"Option left: name:-%s (no value)\n",toptions->names[i]);CHKERRQ(ierr);
18332d747510SLisandro Dalcin       }
18342d747510SLisandro Dalcin     }
18352d747510SLisandro Dalcin   }
18363de2bfdfSBarry Smith   if (!options) {
18373de2bfdfSBarry Smith     toptions = defaultoptions;
18383de2bfdfSBarry Smith     while (toptions->previous) {
18393de2bfdfSBarry Smith       cnt++;
18403de2bfdfSBarry Smith       toptions = toptions->previous;
18413de2bfdfSBarry Smith     }
18423de2bfdfSBarry Smith     if (cnt) {
18433de2bfdfSBarry 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);
18443de2bfdfSBarry Smith     }
18453de2bfdfSBarry Smith   }
18462d747510SLisandro Dalcin   PetscFunctionReturn(0);
18472d747510SLisandro Dalcin }
18482d747510SLisandro Dalcin 
18492d747510SLisandro Dalcin /*@C
18502d747510SLisandro Dalcin    PetscOptionsLeftGet - Returns all options that were set and never used.
18512d747510SLisandro Dalcin 
18522d747510SLisandro Dalcin    Not Collective
18532d747510SLisandro Dalcin 
18542d747510SLisandro Dalcin    Input Parameter:
18552d747510SLisandro Dalcin .  options - options database, use NULL for default global database
18562d747510SLisandro Dalcin 
1857*d8d19677SJose E. Roman    Output Parameters:
1858a2b725a8SWilliam Gropp +  N - count of options not used
18592d747510SLisandro Dalcin .  names - names of options not used
1860a2b725a8SWilliam Gropp -  values - values of options not used
18612d747510SLisandro Dalcin 
18622d747510SLisandro Dalcin    Level: advanced
18632d747510SLisandro Dalcin 
18642d747510SLisandro Dalcin    Notes:
18652d747510SLisandro Dalcin    Users should call PetscOptionsLeftRestore() to free the memory allocated in this routine
18661c9f3c13SBarry Smith    Notes: The value returned may be different on each process and depends on which options have been processed
18671c9f3c13SBarry Smith    on the given process
18682d747510SLisandro Dalcin 
18692d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft()
18702d747510SLisandro Dalcin @*/
18712d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftGet(PetscOptions options,PetscInt *N,char **names[],char **values[])
18722d747510SLisandro Dalcin {
18732d747510SLisandro Dalcin   PetscErrorCode ierr;
18742d747510SLisandro Dalcin   PetscInt       i,n;
18752d747510SLisandro Dalcin 
18762d747510SLisandro Dalcin   PetscFunctionBegin;
18772d747510SLisandro Dalcin   if (N) PetscValidIntPointer(N,2);
18782d747510SLisandro Dalcin   if (names) PetscValidPointer(names,3);
18792d747510SLisandro Dalcin   if (values) PetscValidPointer(values,4);
18802d747510SLisandro Dalcin   options = options ? options : defaultoptions;
18812d747510SLisandro Dalcin 
18822d747510SLisandro Dalcin   /* The number of unused PETSc options */
18832d747510SLisandro Dalcin   n = 0;
18842d747510SLisandro Dalcin   for (i=0; i<options->N; i++) {
18852d747510SLisandro Dalcin     if (!options->used[i]) n++;
18862d747510SLisandro Dalcin   }
18872d747510SLisandro Dalcin   if (N) { *N = n; }
18882d747510SLisandro Dalcin   if (names)  { ierr = PetscMalloc1(n,names);CHKERRQ(ierr); }
18892d747510SLisandro Dalcin   if (values) { ierr = PetscMalloc1(n,values);CHKERRQ(ierr); }
18902d747510SLisandro Dalcin 
18912d747510SLisandro Dalcin   n = 0;
18922d747510SLisandro Dalcin   if (names || values) {
18932d747510SLisandro Dalcin     for (i=0; i<options->N; i++) {
18942d747510SLisandro Dalcin       if (!options->used[i]) {
18952d747510SLisandro Dalcin         if (names)  (*names)[n]  = options->names[i];
18962d747510SLisandro Dalcin         if (values) (*values)[n] = options->values[i];
18972d747510SLisandro Dalcin         n++;
18982d747510SLisandro Dalcin       }
18992d747510SLisandro Dalcin     }
19002d747510SLisandro Dalcin   }
19012d747510SLisandro Dalcin   PetscFunctionReturn(0);
19022d747510SLisandro Dalcin }
19032d747510SLisandro Dalcin 
19042d747510SLisandro Dalcin /*@C
19052d747510SLisandro Dalcin    PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using PetscOptionsLeftGet.
19062d747510SLisandro Dalcin 
19072d747510SLisandro Dalcin    Not Collective
19082d747510SLisandro Dalcin 
1909*d8d19677SJose E. Roman    Input Parameters:
1910a2b725a8SWilliam Gropp +  options - options database, use NULL for default global database
19112d747510SLisandro Dalcin .  names - names of options not used
1912a2b725a8SWilliam Gropp -  values - values of options not used
19132d747510SLisandro Dalcin 
19142d747510SLisandro Dalcin    Level: advanced
19152d747510SLisandro Dalcin 
19162d747510SLisandro Dalcin .seealso: PetscOptionsAllUsed(), PetscOptionsLeft(), PetscOptionsLeftGet()
19172d747510SLisandro Dalcin @*/
19182d747510SLisandro Dalcin PetscErrorCode PetscOptionsLeftRestore(PetscOptions options,PetscInt *N,char **names[],char **values[])
19192d747510SLisandro Dalcin {
19202d747510SLisandro Dalcin   PetscErrorCode ierr;
19212d747510SLisandro Dalcin 
19222d747510SLisandro Dalcin   PetscFunctionBegin;
19232d747510SLisandro Dalcin   if (N) PetscValidIntPointer(N,2);
19242d747510SLisandro Dalcin   if (names) PetscValidPointer(names,3);
19252d747510SLisandro Dalcin   if (values) PetscValidPointer(values,4);
19262d747510SLisandro Dalcin   if (N) { *N = 0; }
19272d747510SLisandro Dalcin   if (names)  { ierr = PetscFree(*names);CHKERRQ(ierr); }
19282d747510SLisandro Dalcin   if (values) { ierr = PetscFree(*values);CHKERRQ(ierr); }
19292d747510SLisandro Dalcin   PetscFunctionReturn(0);
19302d747510SLisandro Dalcin }
19312d747510SLisandro Dalcin 
19322d747510SLisandro Dalcin /*@C
19339060e2f9SVaclav Hapla    PetscOptionsMonitorDefault - Print all options set value events using the supplied PetscViewer.
19342d747510SLisandro Dalcin 
19351c9f3c13SBarry Smith    Logically Collective on ctx
19362d747510SLisandro Dalcin 
19372d747510SLisandro Dalcin    Input Parameters:
19382d747510SLisandro Dalcin +  name  - option name string
19392d747510SLisandro Dalcin .  value - option value string
19409060e2f9SVaclav Hapla -  ctx - an ASCII viewer or NULL
19412d747510SLisandro Dalcin 
19422d747510SLisandro Dalcin    Level: intermediate
19432d747510SLisandro Dalcin 
19449666a313SBarry Smith    Notes:
19459060e2f9SVaclav Hapla      If ctx=NULL, PetscPrintf() is used.
19469666a313SBarry Smith      The first MPI rank in the PetscViewer viewer actually prints the values, other
19471c9f3c13SBarry Smith      processes may have different values set
19481c9f3c13SBarry Smith 
19492d747510SLisandro Dalcin .seealso: PetscOptionsMonitorSet()
19502d747510SLisandro Dalcin @*/
19512d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorDefault(const char name[],const char value[],void *ctx)
19522d747510SLisandro Dalcin {
19532d747510SLisandro Dalcin   PetscErrorCode ierr;
19542d747510SLisandro Dalcin 
19552d747510SLisandro Dalcin   PetscFunctionBegin;
19569060e2f9SVaclav Hapla   if (ctx) {
19579060e2f9SVaclav Hapla     PetscViewer viewer = (PetscViewer)ctx;
19582d747510SLisandro Dalcin     if (!value) {
19592d747510SLisandro Dalcin       ierr = PetscViewerASCIIPrintf(viewer,"Removing option: %s\n",name,value);CHKERRQ(ierr);
19602d747510SLisandro Dalcin     } else if (!value[0]) {
19612d747510SLisandro Dalcin       ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s (no value)\n",name);CHKERRQ(ierr);
19622d747510SLisandro Dalcin     } else {
19632d747510SLisandro Dalcin       ierr = PetscViewerASCIIPrintf(viewer,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr);
19642d747510SLisandro Dalcin     }
19659060e2f9SVaclav Hapla   } else {
19669060e2f9SVaclav Hapla     MPI_Comm comm = PETSC_COMM_WORLD;
19679060e2f9SVaclav Hapla     if (!value) {
19689060e2f9SVaclav Hapla       ierr = PetscPrintf(comm,"Removing option: %s\n",name,value);CHKERRQ(ierr);
19699060e2f9SVaclav Hapla     } else if (!value[0]) {
19709060e2f9SVaclav Hapla       ierr = PetscPrintf(comm,"Setting option: %s (no value)\n",name);CHKERRQ(ierr);
19719060e2f9SVaclav Hapla     } else {
19729060e2f9SVaclav Hapla       ierr = PetscPrintf(comm,"Setting option: %s = %s\n",name,value);CHKERRQ(ierr);
19739060e2f9SVaclav Hapla     }
19749060e2f9SVaclav Hapla   }
19752d747510SLisandro Dalcin   PetscFunctionReturn(0);
19762d747510SLisandro Dalcin }
19772d747510SLisandro Dalcin 
19782d747510SLisandro Dalcin /*@C
19792d747510SLisandro Dalcin    PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that
19802d747510SLisandro Dalcin    modified the PETSc options database.
19812d747510SLisandro Dalcin 
19822d747510SLisandro Dalcin    Not Collective
19832d747510SLisandro Dalcin 
19842d747510SLisandro Dalcin    Input Parameters:
19852d747510SLisandro Dalcin +  monitor - pointer to function (if this is NULL, it turns off monitoring
19862d747510SLisandro Dalcin .  mctx    - [optional] context for private data for the
19872d747510SLisandro Dalcin              monitor routine (use NULL if no context is desired)
19882d747510SLisandro Dalcin -  monitordestroy - [optional] routine that frees monitor context
19892d747510SLisandro Dalcin           (may be NULL)
19902d747510SLisandro Dalcin 
19912d747510SLisandro Dalcin    Calling Sequence of monitor:
19922d747510SLisandro Dalcin $     monitor (const char name[], const char value[], void *mctx)
19932d747510SLisandro Dalcin 
19942d747510SLisandro Dalcin +  name - option name string
19952d747510SLisandro Dalcin .  value - option value string
19962d747510SLisandro Dalcin -  mctx  - optional monitoring context, as set by PetscOptionsMonitorSet()
19972d747510SLisandro Dalcin 
19982d747510SLisandro Dalcin    Options Database Keys:
1999c5b5d8d5SVaclav Hapla    See PetscInitialize() for options related to option database monitoring.
20002d747510SLisandro Dalcin 
20012d747510SLisandro Dalcin    Notes:
20022d747510SLisandro Dalcin    The default is to do nothing.  To print the name and value of options
20032d747510SLisandro Dalcin    being inserted into the database, use PetscOptionsMonitorDefault() as the monitoring routine,
20042d747510SLisandro Dalcin    with a null monitoring context.
20052d747510SLisandro Dalcin 
20062d747510SLisandro Dalcin    Several different monitoring routines may be set by calling
20072d747510SLisandro Dalcin    PetscOptionsMonitorSet() multiple times; all will be called in the
20082d747510SLisandro Dalcin    order in which they were set.
20092d747510SLisandro Dalcin 
20109060e2f9SVaclav Hapla    Level: intermediate
20112d747510SLisandro Dalcin 
2012c5b5d8d5SVaclav Hapla .seealso: PetscOptionsMonitorDefault(), PetscInitialize()
20132d747510SLisandro Dalcin @*/
20142d747510SLisandro Dalcin PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], void*),void *mctx,PetscErrorCode (*monitordestroy)(void**))
20152d747510SLisandro Dalcin {
20162d747510SLisandro Dalcin   PetscOptions options = defaultoptions;
20172d747510SLisandro Dalcin 
20182d747510SLisandro Dalcin   PetscFunctionBegin;
2019c5b5d8d5SVaclav Hapla   if (options->monitorCancel) PetscFunctionReturn(0);
20202d747510SLisandro Dalcin   if (options->numbermonitors >= MAXOPTIONSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many PetscOptions monitors set");
20212d747510SLisandro Dalcin   options->monitor[options->numbermonitors]          = monitor;
20222d747510SLisandro Dalcin   options->monitordestroy[options->numbermonitors]   = monitordestroy;
20232d747510SLisandro Dalcin   options->monitorcontext[options->numbermonitors++] = (void*)mctx;
20242d747510SLisandro Dalcin   PetscFunctionReturn(0);
20252d747510SLisandro Dalcin }
20262d747510SLisandro Dalcin 
20272d747510SLisandro Dalcin /*
20282d747510SLisandro Dalcin    PetscOptionsStringToBool - Converts string to PetscBool, handles cases like "yes", "no", "true", "false", "0", "1", "off", "on".
202963fe8743SVaclav Hapla      Empty string is considered as true.
20302d747510SLisandro Dalcin */
20312d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToBool(const char value[],PetscBool *a)
20322d747510SLisandro Dalcin {
20332d747510SLisandro Dalcin   PetscBool      istrue,isfalse;
20342d747510SLisandro Dalcin   size_t         len;
20352d747510SLisandro Dalcin   PetscErrorCode ierr;
20362d747510SLisandro Dalcin 
20372d747510SLisandro Dalcin   PetscFunctionBegin;
203863fe8743SVaclav Hapla   /* PetscStrlen() returns 0 for NULL or "" */
20392d747510SLisandro Dalcin   ierr = PetscStrlen(value,&len);CHKERRQ(ierr);
204063fe8743SVaclav Hapla   if (!len)  {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20412d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"TRUE",&istrue);CHKERRQ(ierr);
20422d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20432d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"YES",&istrue);CHKERRQ(ierr);
20442d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20452d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"1",&istrue);CHKERRQ(ierr);
20462d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20472d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"on",&istrue);CHKERRQ(ierr);
20482d747510SLisandro Dalcin   if (istrue) {*a = PETSC_TRUE; PetscFunctionReturn(0);}
20492d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"FALSE",&isfalse);CHKERRQ(ierr);
20502d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20512d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"NO",&isfalse);CHKERRQ(ierr);
20522d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20532d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"0",&isfalse);CHKERRQ(ierr);
20542d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20552d747510SLisandro Dalcin   ierr = PetscStrcasecmp(value,"off",&isfalse);CHKERRQ(ierr);
20562d747510SLisandro Dalcin   if (isfalse) {*a = PETSC_FALSE; PetscFunctionReturn(0);}
20572d747510SLisandro Dalcin   SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Unknown logical value: %s",value);
20582d747510SLisandro Dalcin }
20592d747510SLisandro Dalcin 
20602d747510SLisandro Dalcin /*
20612d747510SLisandro Dalcin    PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide"
20622d747510SLisandro Dalcin */
20632d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToInt(const char name[],PetscInt *a)
20642d747510SLisandro Dalcin {
20652d747510SLisandro Dalcin   PetscErrorCode ierr;
20662d747510SLisandro Dalcin   size_t         len;
20672d747510SLisandro Dalcin   PetscBool      decide,tdefault,mouse;
20682d747510SLisandro Dalcin 
20692d747510SLisandro Dalcin   PetscFunctionBegin;
20702d747510SLisandro Dalcin   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
20712d747510SLisandro Dalcin   if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value");
20722d747510SLisandro Dalcin 
20732d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&tdefault);CHKERRQ(ierr);
20742d747510SLisandro Dalcin   if (!tdefault) {
20752d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DEFAULT",&tdefault);CHKERRQ(ierr);
20762d747510SLisandro Dalcin   }
20772d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&decide);CHKERRQ(ierr);
20782d747510SLisandro Dalcin   if (!decide) {
20792d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DECIDE",&decide);CHKERRQ(ierr);
20802d747510SLisandro Dalcin   }
20812d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"mouse",&mouse);CHKERRQ(ierr);
20822d747510SLisandro Dalcin 
20832d747510SLisandro Dalcin   if (tdefault)    *a = PETSC_DEFAULT;
20842d747510SLisandro Dalcin   else if (decide) *a = PETSC_DECIDE;
20852d747510SLisandro Dalcin   else if (mouse)  *a = -1;
20862d747510SLisandro Dalcin   else {
20872d747510SLisandro Dalcin     char *endptr;
20882d747510SLisandro Dalcin     long strtolval;
20892d747510SLisandro Dalcin 
20902d747510SLisandro Dalcin     strtolval = strtol(name,&endptr,10);
20912d747510SLisandro 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);
20922d747510SLisandro Dalcin 
20932d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL)
20942d747510SLisandro Dalcin     (void) strtolval;
20952d747510SLisandro Dalcin     *a = atoll(name);
20962d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64)
20972d747510SLisandro Dalcin     (void) strtolval;
20982d747510SLisandro Dalcin     *a = _atoi64(name);
20992d747510SLisandro Dalcin #else
21002d747510SLisandro Dalcin     *a = (PetscInt)strtolval;
21012d747510SLisandro Dalcin #endif
21022d747510SLisandro Dalcin   }
21032d747510SLisandro Dalcin   PetscFunctionReturn(0);
21042d747510SLisandro Dalcin }
21052d747510SLisandro Dalcin 
21062d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
21072d747510SLisandro Dalcin #include <quadmath.h>
21082d747510SLisandro Dalcin #endif
21092d747510SLisandro Dalcin 
21102d747510SLisandro Dalcin static PetscErrorCode PetscStrtod(const char name[],PetscReal *a,char **endptr)
21112d747510SLisandro Dalcin {
21122d747510SLisandro Dalcin   PetscFunctionBegin;
21132d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
21142d747510SLisandro Dalcin   *a = strtoflt128(name,endptr);
21152d747510SLisandro Dalcin #else
21162d747510SLisandro Dalcin   *a = (PetscReal)strtod(name,endptr);
21172d747510SLisandro Dalcin #endif
21182d747510SLisandro Dalcin   PetscFunctionReturn(0);
21192d747510SLisandro Dalcin }
21202d747510SLisandro Dalcin 
21212d747510SLisandro Dalcin static PetscErrorCode PetscStrtoz(const char name[],PetscScalar *a,char **endptr,PetscBool *isImaginary)
21222d747510SLisandro Dalcin {
21232d747510SLisandro Dalcin   PetscBool      hasi = PETSC_FALSE;
21242d747510SLisandro Dalcin   char           *ptr;
21252d747510SLisandro Dalcin   PetscReal      strtoval;
21262d747510SLisandro Dalcin   PetscErrorCode ierr;
21272d747510SLisandro Dalcin 
21282d747510SLisandro Dalcin   PetscFunctionBegin;
21292d747510SLisandro Dalcin   ierr = PetscStrtod(name,&strtoval,&ptr);CHKERRQ(ierr);
21302d747510SLisandro Dalcin   if (ptr == name) {
21312d747510SLisandro Dalcin     strtoval = 1.;
21322d747510SLisandro Dalcin     hasi = PETSC_TRUE;
21332d747510SLisandro Dalcin     if (name[0] == 'i') {
21342d747510SLisandro Dalcin       ptr++;
21352d747510SLisandro Dalcin     } else if (name[0] == '+' && name[1] == 'i') {
21362d747510SLisandro Dalcin       ptr += 2;
21372d747510SLisandro Dalcin     } else if (name[0] == '-' && name[1] == 'i') {
21382d747510SLisandro Dalcin       strtoval = -1.;
21392d747510SLisandro Dalcin       ptr += 2;
21402d747510SLisandro Dalcin     }
21412d747510SLisandro Dalcin   } else if (*ptr == 'i') {
21422d747510SLisandro Dalcin     hasi = PETSC_TRUE;
21432d747510SLisandro Dalcin     ptr++;
21442d747510SLisandro Dalcin   }
21452d747510SLisandro Dalcin   *endptr = ptr;
21462d747510SLisandro Dalcin   *isImaginary = hasi;
21472d747510SLisandro Dalcin   if (hasi) {
21482d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX)
21492d747510SLisandro Dalcin     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s contains imaginary but complex not supported ",name);
21502d747510SLisandro Dalcin #else
21512d747510SLisandro Dalcin     *a = PetscCMPLX(0.,strtoval);
21522d747510SLisandro Dalcin #endif
21532d747510SLisandro Dalcin   } else {
21542d747510SLisandro Dalcin     *a = strtoval;
21552d747510SLisandro Dalcin   }
21562d747510SLisandro Dalcin   PetscFunctionReturn(0);
21572d747510SLisandro Dalcin }
21582d747510SLisandro Dalcin 
21592d747510SLisandro Dalcin /*
21602d747510SLisandro Dalcin    Converts a string to PetscReal value. Handles special cases like "default" and "decide"
21612d747510SLisandro Dalcin */
21622d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToReal(const char name[],PetscReal *a)
21632d747510SLisandro Dalcin {
21642d747510SLisandro Dalcin   size_t         len;
21652d747510SLisandro Dalcin   PetscBool      match;
21662d747510SLisandro Dalcin   char           *endptr;
21672d747510SLisandro Dalcin   PetscErrorCode ierr;
21682d747510SLisandro Dalcin 
21692d747510SLisandro Dalcin   PetscFunctionBegin;
21702d747510SLisandro Dalcin   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
21712d747510SLisandro Dalcin   if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"String of length zero has no numerical value");
21722d747510SLisandro Dalcin 
21732d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DEFAULT",&match);CHKERRQ(ierr);
21742d747510SLisandro Dalcin   if (!match) {
21752d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DEFAULT",&match);CHKERRQ(ierr);
21762d747510SLisandro Dalcin   }
21772d747510SLisandro Dalcin   if (match) {*a = PETSC_DEFAULT; PetscFunctionReturn(0);}
21782d747510SLisandro Dalcin 
21792d747510SLisandro Dalcin   ierr = PetscStrcasecmp(name,"PETSC_DECIDE",&match);CHKERRQ(ierr);
21802d747510SLisandro Dalcin   if (!match) {
21812d747510SLisandro Dalcin     ierr = PetscStrcasecmp(name,"DECIDE",&match);CHKERRQ(ierr);
21822d747510SLisandro Dalcin   }
21832d747510SLisandro Dalcin   if (match) {*a = PETSC_DECIDE; PetscFunctionReturn(0);}
21842d747510SLisandro Dalcin 
21852d747510SLisandro Dalcin   ierr = PetscStrtod(name,a,&endptr);CHKERRQ(ierr);
21862d747510SLisandro Dalcin   if ((size_t) (endptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value",name);
21872d747510SLisandro Dalcin   PetscFunctionReturn(0);
21882d747510SLisandro Dalcin }
21892d747510SLisandro Dalcin 
21902d747510SLisandro Dalcin PetscErrorCode PetscOptionsStringToScalar(const char name[],PetscScalar *a)
21912d747510SLisandro Dalcin {
21922d747510SLisandro Dalcin   PetscBool      imag1;
21932d747510SLisandro Dalcin   size_t         len;
21942d747510SLisandro Dalcin   PetscScalar    val = 0.;
21952d747510SLisandro Dalcin   char           *ptr = NULL;
21962d747510SLisandro Dalcin   PetscErrorCode ierr;
21972d747510SLisandro Dalcin 
21982d747510SLisandro Dalcin   PetscFunctionBegin;
21992d747510SLisandro Dalcin   ierr = PetscStrlen(name,&len);CHKERRQ(ierr);
22002d747510SLisandro Dalcin   if (!len) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"character string of length zero has no numerical value");
22012d747510SLisandro Dalcin   ierr = PetscStrtoz(name,&val,&ptr,&imag1);CHKERRQ(ierr);
22022d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX)
22032d747510SLisandro Dalcin   if ((size_t) (ptr - name) < len) {
22042d747510SLisandro Dalcin     PetscBool   imag2;
22052d747510SLisandro Dalcin     PetscScalar val2;
22062d747510SLisandro Dalcin 
22072d747510SLisandro Dalcin     ierr = PetscStrtoz(ptr,&val2,&ptr,&imag2);CHKERRQ(ierr);
22082d747510SLisandro Dalcin     if (imag1 || !imag2) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s: must specify imaginary component second",name);
22092d747510SLisandro Dalcin     val = PetscCMPLX(PetscRealPart(val),PetscImaginaryPart(val2));
22102d747510SLisandro Dalcin   }
22112d747510SLisandro Dalcin #endif
22122d747510SLisandro Dalcin   if ((size_t) (ptr - name) != len) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Input string %s has no numeric value ",name);
22132d747510SLisandro Dalcin   *a = val;
22142d747510SLisandro Dalcin   PetscFunctionReturn(0);
22152d747510SLisandro Dalcin }
22162d747510SLisandro Dalcin 
22172d747510SLisandro Dalcin /*@C
22182d747510SLisandro Dalcin    PetscOptionsGetBool - Gets the Logical (true or false) value for a particular
22192d747510SLisandro Dalcin             option in the database.
2220e5c89e4eSSatish Balay 
2221e5c89e4eSSatish Balay    Not Collective
2222e5c89e4eSSatish Balay 
2223e5c89e4eSSatish Balay    Input Parameters:
22245c9cc608SHong Zhang +  options - options database, use NULL for default global database
2225c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
2226e5c89e4eSSatish Balay -  name - the option one is seeking
2227e5c89e4eSSatish Balay 
2228*d8d19677SJose E. Roman    Output Parameters:
22292d747510SLisandro Dalcin +  ivalue - the logical value to return
223096ef3cdfSSatish Balay -  set - PETSC_TRUE  if found, else PETSC_FALSE
2231e5c89e4eSSatish Balay 
2232e5c89e4eSSatish Balay    Level: beginner
2233e5c89e4eSSatish Balay 
223495452b02SPatrick Sanan    Notes:
22352d747510SLisandro Dalcin        TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE
22362d747510SLisandro Dalcin        FALSE, false, NO, no, and 0 all translate to PETSC_FALSE
22372d747510SLisandro Dalcin 
22382d747510SLisandro 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
22392d747510SLisandro Dalcin      is equivalent to -requested_bool true
22402d747510SLisandro Dalcin 
22412d747510SLisandro Dalcin        If the user does not supply the option at all ivalue is NOT changed. Thus
22422efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
22432efd9cb1SBarry Smith 
2244e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
22452d747510SLisandro Dalcin           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsGetInt(), PetscOptionsBool(),
2246e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2247e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2248acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2249a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2250e5c89e4eSSatish Balay @*/
22512d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool *ivalue,PetscBool *set)
2252e5c89e4eSSatish Balay {
22532d747510SLisandro Dalcin   const char     *value;
2254ace3abfcSBarry Smith   PetscBool      flag;
22552d747510SLisandro Dalcin   PetscErrorCode ierr;
2256e5c89e4eSSatish Balay 
2257e5c89e4eSSatish Balay   PetscFunctionBegin;
22582d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2259064a246eSJacob Faibussowitsch   if (ivalue) PetscValidBoolPointer(ivalue,4);
22602d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2261e5c89e4eSSatish Balay   if (flag) {
226296ef3cdfSSatish Balay     if (set) *set = PETSC_TRUE;
22632d747510SLisandro Dalcin     ierr = PetscOptionsStringToBool(value, &flag);CHKERRQ(ierr);
22642d747510SLisandro Dalcin     if (ivalue) *ivalue = flag;
2265e5c89e4eSSatish Balay   } else {
226696ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2267e5c89e4eSSatish Balay   }
2268e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2269e5c89e4eSSatish Balay }
2270e5c89e4eSSatish Balay 
2271e5c89e4eSSatish Balay /*@C
2272e5c89e4eSSatish Balay    PetscOptionsGetEList - Puts a list of option values that a single one may be selected from
2273e5c89e4eSSatish Balay 
2274e5c89e4eSSatish Balay    Not Collective
2275e5c89e4eSSatish Balay 
2276e5c89e4eSSatish Balay    Input Parameters:
22775c9cc608SHong Zhang +  options - options database, use NULL for default global database
2278c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
2279e5c89e4eSSatish Balay .  opt - option name
2280a264d7a6SBarry Smith .  list - the possible choices (one of these must be selected, anything else is invalid)
2281a2b725a8SWilliam Gropp -  ntext - number of choices
2282e5c89e4eSSatish Balay 
2283*d8d19677SJose E. Roman    Output Parameters:
22842efd9cb1SBarry Smith +  value - the index of the value to return (defaults to zero if the option name is given but no choice is listed)
2285e5c89e4eSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2286e5c89e4eSSatish Balay 
2287e5c89e4eSSatish Balay    Level: intermediate
2288e5c89e4eSSatish Balay 
228995452b02SPatrick Sanan    Notes:
229095452b02SPatrick Sanan     If the user does not supply the option value is NOT changed. Thus
22912efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
22922efd9cb1SBarry Smith 
2293a264d7a6SBarry Smith    See PetscOptionsFList() for when the choices are given in a PetscFunctionList()
2294e5c89e4eSSatish Balay 
2295e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
2296acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2297e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2298e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2299acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2300a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2301e5c89e4eSSatish Balay @*/
2302c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscInt ntext,PetscInt *value,PetscBool *set)
2303e5c89e4eSSatish Balay {
2304e5c89e4eSSatish Balay   PetscErrorCode ierr;
230558b0ac4eSStefano Zampini   size_t         alen,len = 0, tlen = 0;
2306e5c89e4eSSatish Balay   char           *svalue;
2307ace3abfcSBarry Smith   PetscBool      aset,flg = PETSC_FALSE;
2308e5c89e4eSSatish Balay   PetscInt       i;
2309e5c89e4eSSatish Balay 
2310e5c89e4eSSatish Balay   PetscFunctionBegin;
23112d747510SLisandro Dalcin   PetscValidCharPointer(opt,3);
2312e5c89e4eSSatish Balay   for (i=0; i<ntext; i++) {
2313e5c89e4eSSatish Balay     ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr);
2314e5c89e4eSSatish Balay     if (alen > len) len = alen;
231558b0ac4eSStefano Zampini     tlen += len + 1;
2316e5c89e4eSSatish Balay   }
2317e5c89e4eSSatish Balay   len += 5; /* a little extra space for user mistypes */
2318785e854fSJed Brown   ierr = PetscMalloc1(len,&svalue);CHKERRQ(ierr);
2319c5929fdfSBarry Smith   ierr = PetscOptionsGetString(options,pre,opt,svalue,len,&aset);CHKERRQ(ierr);
2320e5c89e4eSSatish Balay   if (aset) {
2321fbedd5e0SJed Brown     ierr = PetscEListFind(ntext,list,svalue,value,&flg);CHKERRQ(ierr);
232258b0ac4eSStefano Zampini     if (!flg) {
232358b0ac4eSStefano Zampini       char *avail,*pavl;
232458b0ac4eSStefano Zampini 
232558b0ac4eSStefano Zampini       ierr = PetscMalloc1(tlen,&avail);CHKERRQ(ierr);
232658b0ac4eSStefano Zampini       pavl = avail;
232758b0ac4eSStefano Zampini       for (i=0; i<ntext; i++) {
232858b0ac4eSStefano Zampini         ierr = PetscStrlen(list[i],&alen);CHKERRQ(ierr);
232958b0ac4eSStefano Zampini         ierr = PetscStrcpy(pavl,list[i]);CHKERRQ(ierr);
233058b0ac4eSStefano Zampini         pavl += alen;
233158b0ac4eSStefano Zampini         ierr = PetscStrcpy(pavl," ");CHKERRQ(ierr);
233258b0ac4eSStefano Zampini         pavl += 1;
233358b0ac4eSStefano Zampini       }
233458b0ac4eSStefano Zampini       ierr = PetscStrtolower(avail);CHKERRQ(ierr);
233558b0ac4eSStefano Zampini       SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown option %s for -%s%s. Available options: %s",svalue,pre ? pre : "",opt+1,avail);
233658b0ac4eSStefano Zampini     }
2337fbedd5e0SJed Brown     if (set) *set = PETSC_TRUE;
2338a297a907SKarl Rupp   } else if (set) *set = PETSC_FALSE;
2339e5c89e4eSSatish Balay   ierr = PetscFree(svalue);CHKERRQ(ierr);
2340e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2341e5c89e4eSSatish Balay }
2342e5c89e4eSSatish Balay 
2343e5c89e4eSSatish Balay /*@C
2344e5c89e4eSSatish Balay    PetscOptionsGetEnum - Gets the enum value for a particular option in the database.
2345e5c89e4eSSatish Balay 
2346e5c89e4eSSatish Balay    Not Collective
2347e5c89e4eSSatish Balay 
2348e5c89e4eSSatish Balay    Input Parameters:
23495c9cc608SHong Zhang +  options - options database, use NULL for default global database
2350c5929fdfSBarry Smith .  pre - option prefix or NULL
2351e5c89e4eSSatish Balay .  opt - option name
2352e5c89e4eSSatish Balay .  list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
2353e5c89e4eSSatish Balay -  defaultv - the default (current) value
2354e5c89e4eSSatish Balay 
2355*d8d19677SJose E. Roman    Output Parameters:
2356e5c89e4eSSatish Balay +  value - the  value to return
235796ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2358e5c89e4eSSatish Balay 
2359e5c89e4eSSatish Balay    Level: beginner
2360e5c89e4eSSatish Balay 
236195452b02SPatrick Sanan    Notes:
236295452b02SPatrick Sanan     If the user does not supply the option value is NOT changed. Thus
23632efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2364e5c89e4eSSatish Balay 
23652efd9cb1SBarry Smith           List is usually something like PCASMTypes or some other predefined list of enum names
2366e5c89e4eSSatish Balay 
2367e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
2368acfcf0e5SJed Brown           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
2369acfcf0e5SJed Brown           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
2370e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2371e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2372acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2373a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum()
2374e5c89e4eSSatish Balay @*/
2375c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const *list,PetscEnum *value,PetscBool *set)
2376e5c89e4eSSatish Balay {
2377e5c89e4eSSatish Balay   PetscErrorCode ierr;
237869a24498SJed Brown   PetscInt       ntext = 0,tval;
2379ace3abfcSBarry Smith   PetscBool      fset;
2380e5c89e4eSSatish Balay 
2381e5c89e4eSSatish Balay   PetscFunctionBegin;
23822d747510SLisandro Dalcin   PetscValidCharPointer(opt,3);
2383e5c89e4eSSatish Balay   while (list[ntext++]) {
2384e32f2f54SBarry Smith     if (ntext > 50) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument appears to be wrong or have more than 50 entries");
2385e5c89e4eSSatish Balay   }
2386e32f2f54SBarry Smith   if (ntext < 3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"List argument must have at least two entries: typename and type prefix");
2387e5c89e4eSSatish Balay   ntext -= 3;
2388c5929fdfSBarry Smith   ierr = PetscOptionsGetEList(options,pre,opt,list,ntext,&tval,&fset);CHKERRQ(ierr);
238969a24498SJed Brown   /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */
2390809ceb46SBarry Smith   if (fset) *value = (PetscEnum)tval;
2391809ceb46SBarry Smith   if (set) *set = fset;
2392e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2393e5c89e4eSSatish Balay }
2394e5c89e4eSSatish Balay 
2395e5c89e4eSSatish Balay /*@C
23962d747510SLisandro Dalcin    PetscOptionsGetInt - Gets the integer value for a particular option in the database.
2397e5c89e4eSSatish Balay 
2398e5c89e4eSSatish Balay    Not Collective
2399e5c89e4eSSatish Balay 
2400e5c89e4eSSatish Balay    Input Parameters:
24015c9cc608SHong Zhang +  options - options database, use NULL for default global database
2402c5929fdfSBarry Smith .  pre - the string to prepend to the name or NULL
2403e5c89e4eSSatish Balay -  name - the option one is seeking
2404e5c89e4eSSatish Balay 
2405*d8d19677SJose E. Roman    Output Parameters:
24062d747510SLisandro Dalcin +  ivalue - the integer value to return
240796ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2408e5c89e4eSSatish Balay 
2409e5c89e4eSSatish Balay    Level: beginner
2410e5c89e4eSSatish Balay 
2411e5c89e4eSSatish Balay    Notes:
24122d747510SLisandro Dalcin    If the user does not supply the option ivalue is NOT changed. Thus
24132efd9cb1SBarry Smith    you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
24145c07ccb8SBarry Smith 
2415e5c89e4eSSatish Balay .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
24162d747510SLisandro Dalcin           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
24172d747510SLisandro Dalcin           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
2418e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2419e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2420acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2421a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2422e5c89e4eSSatish Balay @*/
24232d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetInt(PetscOptions options,const char pre[],const char name[],PetscInt *ivalue,PetscBool *set)
2424e5c89e4eSSatish Balay {
24252d747510SLisandro Dalcin   const char     *value;
2426e5c89e4eSSatish Balay   PetscErrorCode ierr;
24272d747510SLisandro Dalcin   PetscBool      flag;
2428e5c89e4eSSatish Balay 
2429e5c89e4eSSatish Balay   PetscFunctionBegin;
24302d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
24312d747510SLisandro Dalcin   PetscValidIntPointer(ivalue,4);
24322d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2433e5c89e4eSSatish Balay   if (flag) {
243434a9cc2cSBarry Smith     if (!value) {
24352d747510SLisandro Dalcin       if (set) *set = PETSC_FALSE;
243634a9cc2cSBarry Smith     } else {
24372d747510SLisandro Dalcin       if (set) *set = PETSC_TRUE;
24382d747510SLisandro Dalcin       ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr);
2439e5c89e4eSSatish Balay     }
2440e5c89e4eSSatish Balay   } else {
244196ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2442e5c89e4eSSatish Balay   }
2443e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2444e5c89e4eSSatish Balay }
2445e5c89e4eSSatish Balay 
2446e2446a98SMatthew Knepley /*@C
2447e5c89e4eSSatish Balay    PetscOptionsGetReal - Gets the double precision value for a particular
2448e5c89e4eSSatish Balay    option in the database.
2449e5c89e4eSSatish Balay 
2450e5c89e4eSSatish Balay    Not Collective
2451e5c89e4eSSatish Balay 
2452e5c89e4eSSatish Balay    Input Parameters:
24535c9cc608SHong Zhang +  options - options database, use NULL for default global database
2454c5929fdfSBarry Smith .  pre - string to prepend to each name or NULL
2455e5c89e4eSSatish Balay -  name - the option one is seeking
2456e5c89e4eSSatish Balay 
2457*d8d19677SJose E. Roman    Output Parameters:
2458e5c89e4eSSatish Balay +  dvalue - the double value to return
245996ef3cdfSSatish Balay -  set - PETSC_TRUE if found, PETSC_FALSE if not found
2460e5c89e4eSSatish Balay 
246195452b02SPatrick Sanan    Notes:
246295452b02SPatrick Sanan     If the user does not supply the option dvalue is NOT changed. Thus
24632efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2464e4974155SBarry Smith 
2465e5c89e4eSSatish Balay    Level: beginner
2466e5c89e4eSSatish Balay 
2467e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2468acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(),PetscOptionsBool(),
2469e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2470e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2471acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2472a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2473e5c89e4eSSatish Balay @*/
2474c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal *dvalue,PetscBool *set)
2475e5c89e4eSSatish Balay {
24762d747510SLisandro Dalcin   const char     *value;
2477ace3abfcSBarry Smith   PetscBool      flag;
24782d747510SLisandro Dalcin   PetscErrorCode ierr;
2479e5c89e4eSSatish Balay 
2480e5c89e4eSSatish Balay   PetscFunctionBegin;
24812d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
24822d747510SLisandro Dalcin   PetscValidRealPointer(dvalue,4);
24832d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2484e5c89e4eSSatish Balay   if (flag) {
2485a297a907SKarl Rupp     if (!value) {
2486a297a907SKarl Rupp       if (set) *set = PETSC_FALSE;
2487a297a907SKarl Rupp     } else {
2488a297a907SKarl Rupp       if (set) *set = PETSC_TRUE;
2489a297a907SKarl Rupp       ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr);
2490a297a907SKarl Rupp     }
2491e5c89e4eSSatish Balay   } else {
249296ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2493e5c89e4eSSatish Balay   }
2494e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2495e5c89e4eSSatish Balay }
2496e5c89e4eSSatish Balay 
2497e5c89e4eSSatish Balay /*@C
2498e5c89e4eSSatish Balay    PetscOptionsGetScalar - Gets the scalar value for a particular
2499e5c89e4eSSatish Balay    option in the database.
2500e5c89e4eSSatish Balay 
2501e5c89e4eSSatish Balay    Not Collective
2502e5c89e4eSSatish Balay 
2503e5c89e4eSSatish Balay    Input Parameters:
25045c9cc608SHong Zhang +  options - options database, use NULL for default global database
2505c5929fdfSBarry Smith .  pre - string to prepend to each name or NULL
2506e5c89e4eSSatish Balay -  name - the option one is seeking
2507e5c89e4eSSatish Balay 
2508*d8d19677SJose E. Roman    Output Parameters:
2509e5c89e4eSSatish Balay +  dvalue - the double value to return
251096ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2511e5c89e4eSSatish Balay 
2512e5c89e4eSSatish Balay    Level: beginner
2513e5c89e4eSSatish Balay 
2514e5c89e4eSSatish Balay    Usage:
2515eb4ae41dSBarry Smith    A complex number 2+3i must be specified with NO spaces
2516e5c89e4eSSatish Balay 
251795452b02SPatrick Sanan    Notes:
251895452b02SPatrick Sanan     If the user does not supply the option dvalue is NOT changed. Thus
25192efd9cb1SBarry Smith      you should ALWAYS initialize the ivalue if you access it without first checking if the set flag is true.
2520e4974155SBarry Smith 
2521e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
2522acfcf0e5SJed Brown           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2523e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2524e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2525acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2526a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2527e5c89e4eSSatish Balay @*/
2528c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar *dvalue,PetscBool *set)
2529e5c89e4eSSatish Balay {
25302d747510SLisandro Dalcin   const char     *value;
2531ace3abfcSBarry Smith   PetscBool      flag;
2532e5c89e4eSSatish Balay   PetscErrorCode ierr;
2533e5c89e4eSSatish Balay 
2534e5c89e4eSSatish Balay   PetscFunctionBegin;
25352d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
25362d747510SLisandro Dalcin   PetscValidScalarPointer(dvalue,4);
25372d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2538e5c89e4eSSatish Balay   if (flag) {
2539e5c89e4eSSatish Balay     if (!value) {
254096ef3cdfSSatish Balay       if (set) *set = PETSC_FALSE;
2541e5c89e4eSSatish Balay     } else {
2542e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX)
2543cfbddea1SSatish Balay       ierr = PetscOptionsStringToReal(value,dvalue);CHKERRQ(ierr);
2544e5c89e4eSSatish Balay #else
2545eb4ae41dSBarry Smith       ierr = PetscOptionsStringToScalar(value,dvalue);CHKERRQ(ierr);
2546e5c89e4eSSatish Balay #endif
254796ef3cdfSSatish Balay       if (set) *set = PETSC_TRUE;
2548e5c89e4eSSatish Balay     }
2549e5c89e4eSSatish Balay   } else { /* flag */
255096ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2551e5c89e4eSSatish Balay   }
2552e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2553e5c89e4eSSatish Balay }
2554e5c89e4eSSatish Balay 
2555e5c89e4eSSatish Balay /*@C
2556e5c89e4eSSatish Balay    PetscOptionsGetString - Gets the string value for a particular option in
2557e5c89e4eSSatish Balay    the database.
2558e5c89e4eSSatish Balay 
2559e5c89e4eSSatish Balay    Not Collective
2560e5c89e4eSSatish Balay 
2561e5c89e4eSSatish Balay    Input Parameters:
25625c9cc608SHong Zhang +  options - options database, use NULL for default global database
2563c5929fdfSBarry Smith .  pre - string to prepend to name or NULL
2564e5c89e4eSSatish Balay .  name - the option one is seeking
2565bcbf2dc5SJed Brown -  len - maximum length of the string including null termination
2566e5c89e4eSSatish Balay 
2567e5c89e4eSSatish Balay    Output Parameters:
2568e5c89e4eSSatish Balay +  string - location to copy string
256996ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2570e5c89e4eSSatish Balay 
2571e5c89e4eSSatish Balay    Level: beginner
2572e5c89e4eSSatish Balay 
2573e5c89e4eSSatish Balay    Fortran Note:
2574e5c89e4eSSatish Balay    The Fortran interface is slightly different from the C/C++
2575e5c89e4eSSatish Balay    interface (len is not used).  Sample usage in Fortran follows
2576e5c89e4eSSatish Balay .vb
2577e5c89e4eSSatish Balay       character *20    string
257893e6ba5cSBarry Smith       PetscErrorCode   ierr
257993e6ba5cSBarry Smith       PetscBool        set
25801b266c99SBarry Smith       call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr)
2581e5c89e4eSSatish Balay .ve
2582e5c89e4eSSatish Balay 
258395452b02SPatrick Sanan    Notes:
258495452b02SPatrick 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
2585e4974155SBarry Smith 
25862efd9cb1SBarry Smith            If the user does not use the option then the string is not changed. Thus
25872efd9cb1SBarry Smith            you should ALWAYS initialize the string if you access it without first checking if the set flag is true.
25882efd9cb1SBarry Smith 
2589f3dea69dSBarry Smith     Note:
2590f3dea69dSBarry 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).
2591f3dea69dSBarry Smith 
2592e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
2593acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
2594e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
2595e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
2596acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
2597a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
2598e5c89e4eSSatish Balay @*/
2599c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool *set)
2600e5c89e4eSSatish Balay {
26012d747510SLisandro Dalcin   const char     *value;
2602ace3abfcSBarry Smith   PetscBool      flag;
26032d747510SLisandro Dalcin   PetscErrorCode ierr;
2604e5c89e4eSSatish Balay 
2605e5c89e4eSSatish Balay   PetscFunctionBegin;
26062d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
26072d747510SLisandro Dalcin   PetscValidCharPointer(string,4);
26082d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);CHKERRQ(ierr);
2609e5c89e4eSSatish Balay   if (!flag) {
261096ef3cdfSSatish Balay     if (set) *set = PETSC_FALSE;
2611e5c89e4eSSatish Balay   } else {
261296ef3cdfSSatish Balay     if (set) *set = PETSC_TRUE;
2613e5c89e4eSSatish Balay     if (value) {
2614e5c89e4eSSatish Balay       ierr = PetscStrncpy(string,value,len);CHKERRQ(ierr);
2615e5c89e4eSSatish Balay     } else {
2616580bdb30SBarry Smith       ierr = PetscArrayzero(string,len);CHKERRQ(ierr);
2617e5c89e4eSSatish Balay     }
2618e5c89e4eSSatish Balay   }
2619e5c89e4eSSatish Balay   PetscFunctionReturn(0);
2620e5c89e4eSSatish Balay }
2621e5c89e4eSSatish Balay 
2622c5929fdfSBarry Smith char *PetscOptionsGetStringMatlab(PetscOptions options,const char pre[],const char name[])
262314ce751eSBarry Smith {
26242d747510SLisandro Dalcin   const char     *value;
262514ce751eSBarry Smith   PetscBool      flag;
26262d747510SLisandro Dalcin   PetscErrorCode ierr;
262714ce751eSBarry Smith 
262814ce751eSBarry Smith   PetscFunctionBegin;
262902c9f0b5SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&value,&flag);if (ierr) PetscFunctionReturn(NULL);
26302d747510SLisandro Dalcin   if (flag) PetscFunctionReturn((char*)value);
263102c9f0b5SLisandro Dalcin   else PetscFunctionReturn(NULL);
263214ce751eSBarry Smith }
263314ce751eSBarry Smith 
26342d747510SLisandro Dalcin /*@C
26352d747510SLisandro Dalcin    PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular
26362d747510SLisandro Dalcin    option in the database.  The values must be separated with commas with
26372d747510SLisandro Dalcin    no intervening spaces.
26382d747510SLisandro Dalcin 
26392d747510SLisandro Dalcin    Not Collective
26402d747510SLisandro Dalcin 
26412d747510SLisandro Dalcin    Input Parameters:
26422d747510SLisandro Dalcin +  options - options database, use NULL for default global database
26432d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
26442d747510SLisandro Dalcin .  name - the option one is seeking
26452d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
26462d747510SLisandro Dalcin 
2647*d8d19677SJose E. Roman    Output Parameters:
26482d747510SLisandro Dalcin +  dvalue - the integer values to return
2649a5b23f4aSJose E. Roman .  nmax - actual number of values retrieved
26502d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
26512d747510SLisandro Dalcin 
26522d747510SLisandro Dalcin    Level: beginner
26532d747510SLisandro Dalcin 
26542d747510SLisandro Dalcin    Notes:
26552d747510SLisandro Dalcin        TRUE, true, YES, yes, nostring, and 1 all translate to PETSC_TRUE
26562d747510SLisandro Dalcin        FALSE, false, NO, no, and 0 all translate to PETSC_FALSE
26572d747510SLisandro Dalcin 
26582d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
26592d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(),
26602d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
26612d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
26622d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
26632d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
26642d747510SLisandro Dalcin @*/
26652d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt *nmax,PetscBool *set)
26662d747510SLisandro Dalcin {
26672d747510SLisandro Dalcin   const char     *svalue;
26682d747510SLisandro Dalcin   char           *value;
26692d747510SLisandro Dalcin   PetscErrorCode ierr;
26702d747510SLisandro Dalcin   PetscInt       n = 0;
26712d747510SLisandro Dalcin   PetscBool      flag;
26722d747510SLisandro Dalcin   PetscToken     token;
26732d747510SLisandro Dalcin 
26742d747510SLisandro Dalcin   PetscFunctionBegin;
26752d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2676064a246eSJacob Faibussowitsch   PetscValidBoolPointer(dvalue,4);
26772d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
26782d747510SLisandro Dalcin 
26792d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
26802d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
26812d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
26822d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
26832d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
26842d747510SLisandro Dalcin   while (value && n < *nmax) {
26852d747510SLisandro Dalcin     ierr = PetscOptionsStringToBool(value,dvalue);CHKERRQ(ierr);
26862d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
26872d747510SLisandro Dalcin     dvalue++;
26882d747510SLisandro Dalcin     n++;
26892d747510SLisandro Dalcin   }
26902d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
26912d747510SLisandro Dalcin   *nmax = n;
26922d747510SLisandro Dalcin   PetscFunctionReturn(0);
26932d747510SLisandro Dalcin }
26942d747510SLisandro Dalcin 
26952d747510SLisandro Dalcin /*@C
26962d747510SLisandro Dalcin    PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database.
26972d747510SLisandro Dalcin 
26982d747510SLisandro Dalcin    Not Collective
26992d747510SLisandro Dalcin 
27002d747510SLisandro Dalcin    Input Parameters:
27012d747510SLisandro Dalcin +  options - options database, use NULL for default global database
27022d747510SLisandro Dalcin .  pre - option prefix or NULL
27032d747510SLisandro Dalcin .  name - option name
27042d747510SLisandro Dalcin .  list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
27052d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
27062d747510SLisandro Dalcin 
27072d747510SLisandro Dalcin    Output Parameters:
27082d747510SLisandro Dalcin +  ivalue - the  enum values to return
2709a5b23f4aSJose E. Roman .  nmax - actual number of values retrieved
27102d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
27112d747510SLisandro Dalcin 
27122d747510SLisandro Dalcin    Level: beginner
27132d747510SLisandro Dalcin 
27142d747510SLisandro Dalcin    Notes:
27152d747510SLisandro Dalcin    The array must be passed as a comma separated list.
27162d747510SLisandro Dalcin 
27172d747510SLisandro Dalcin    There must be no intervening spaces between the values.
27182d747510SLisandro Dalcin 
27192d747510SLisandro Dalcin    list is usually something like PCASMTypes or some other predefined list of enum names.
27202d747510SLisandro Dalcin 
27212d747510SLisandro Dalcin .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), PetscOptionsGetInt(),
27222d747510SLisandro Dalcin           PetscOptionsGetEnum(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
27232d747510SLisandro Dalcin           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), PetscOptionsName(),
27242d747510SLisandro Dalcin           PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), PetscOptionsStringArray(),PetscOptionsRealArray(),
27252d747510SLisandro Dalcin           PetscOptionsScalar(), PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
27262d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList(), PetscOptionsGetEList(), PetscOptionsEnum()
27272d747510SLisandro Dalcin @*/
27282d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char *const *list,PetscEnum ivalue[],PetscInt *nmax,PetscBool *set)
27292d747510SLisandro Dalcin {
27302d747510SLisandro Dalcin   const char     *svalue;
27312d747510SLisandro Dalcin   char           *value;
27322d747510SLisandro Dalcin   PetscInt       n = 0;
27332d747510SLisandro Dalcin   PetscEnum      evalue;
27342d747510SLisandro Dalcin   PetscBool      flag;
27352d747510SLisandro Dalcin   PetscToken     token;
27362d747510SLisandro Dalcin   PetscErrorCode ierr;
27372d747510SLisandro Dalcin 
27382d747510SLisandro Dalcin   PetscFunctionBegin;
27392d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
27402d747510SLisandro Dalcin   PetscValidPointer(list,4);
27412d747510SLisandro Dalcin   PetscValidPointer(ivalue,5);
27422d747510SLisandro Dalcin   PetscValidIntPointer(nmax,6);
27432d747510SLisandro Dalcin 
27442d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
27452d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
27462d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
27472d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
27482d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
27492d747510SLisandro Dalcin   while (value && n < *nmax) {
27502d747510SLisandro Dalcin     ierr = PetscEnumFind(list,value,&evalue,&flag);CHKERRQ(ierr);
27512d747510SLisandro Dalcin     if (!flag) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_USER,"Unknown enum value '%s' for -%s%s",svalue,pre ? pre : "",name+1);
27522d747510SLisandro Dalcin     ivalue[n++] = evalue;
27532d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
27542d747510SLisandro Dalcin   }
27552d747510SLisandro Dalcin   ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
27562d747510SLisandro Dalcin   *nmax = n;
27572d747510SLisandro Dalcin   PetscFunctionReturn(0);
27582d747510SLisandro Dalcin }
27592d747510SLisandro Dalcin 
27602d747510SLisandro Dalcin /*@C
27612d747510SLisandro Dalcin    PetscOptionsGetIntArray - Gets an array of integer values for a particular
27622d747510SLisandro Dalcin    option in the database.
27632d747510SLisandro Dalcin 
27642d747510SLisandro Dalcin    Not Collective
27652d747510SLisandro Dalcin 
27662d747510SLisandro Dalcin    Input Parameters:
27672d747510SLisandro Dalcin +  options - options database, use NULL for default global database
27682d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
27692d747510SLisandro Dalcin .  name - the option one is seeking
27702d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
27712d747510SLisandro Dalcin 
2772*d8d19677SJose E. Roman    Output Parameters:
27732d747510SLisandro Dalcin +  ivalue - the integer values to return
2774a5b23f4aSJose E. Roman .  nmax - actual number of values retrieved
27752d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
27762d747510SLisandro Dalcin 
27772d747510SLisandro Dalcin    Level: beginner
27782d747510SLisandro Dalcin 
27792d747510SLisandro Dalcin    Notes:
27802d747510SLisandro Dalcin    The array can be passed as
27812d747510SLisandro Dalcin    a comma separated list:                                 0,1,2,3,4,5,6,7
27822d747510SLisandro Dalcin    a range (start-end+1):                                  0-8
27832d747510SLisandro Dalcin    a range with given increment (start-end+1:inc):         0-7:2
27842d747510SLisandro Dalcin    a combination of values and ranges separated by commas: 0,1-8,8-15:2
27852d747510SLisandro Dalcin 
27862d747510SLisandro Dalcin    There must be no intervening spaces between the values.
27872d747510SLisandro Dalcin 
27882d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
27892d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetRealArray(), PetscOptionsBool(),
27902d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
27912d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
27922d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
27932d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
27942d747510SLisandro Dalcin @*/
27952d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt *nmax,PetscBool *set)
27962d747510SLisandro Dalcin {
27972d747510SLisandro Dalcin   const char     *svalue;
27982d747510SLisandro Dalcin   char           *value;
27992d747510SLisandro Dalcin   PetscErrorCode ierr;
28002d747510SLisandro Dalcin   PetscInt       n = 0,i,j,start,end,inc,nvalues;
28012d747510SLisandro Dalcin   size_t         len;
28022d747510SLisandro Dalcin   PetscBool      flag,foundrange;
28032d747510SLisandro Dalcin   PetscToken     token;
28042d747510SLisandro Dalcin 
28052d747510SLisandro Dalcin   PetscFunctionBegin;
28062d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
28072d747510SLisandro Dalcin   PetscValidIntPointer(ivalue,4);
28082d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
28092d747510SLisandro Dalcin 
28102d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
28112d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
28122d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
28132d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
28142d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
28152d747510SLisandro Dalcin   while (value && n < *nmax) {
28162d747510SLisandro Dalcin     /* look for form  d-D where d and D are integers */
28172d747510SLisandro Dalcin     foundrange = PETSC_FALSE;
28182d747510SLisandro Dalcin     ierr       = PetscStrlen(value,&len);CHKERRQ(ierr);
28192d747510SLisandro Dalcin     if (value[0] == '-') i=2;
28202d747510SLisandro Dalcin     else i=1;
28212d747510SLisandro Dalcin     for (;i<(int)len; i++) {
28222d747510SLisandro Dalcin       if (value[i] == '-') {
28232d747510SLisandro Dalcin         if (i == (int)len-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Error in %D-th array entry %s\n",n,value);
28242d747510SLisandro Dalcin         value[i] = 0;
28252d747510SLisandro Dalcin 
28262d747510SLisandro Dalcin         ierr = PetscOptionsStringToInt(value,&start);CHKERRQ(ierr);
28272d747510SLisandro Dalcin         inc  = 1;
28282d747510SLisandro Dalcin         j    = i+1;
28292d747510SLisandro Dalcin         for (;j<(int)len; j++) {
28302d747510SLisandro Dalcin           if (value[j] == ':') {
28312d747510SLisandro Dalcin             value[j] = 0;
28322d747510SLisandro Dalcin 
28332d747510SLisandro Dalcin             ierr = PetscOptionsStringToInt(value+j+1,&inc);CHKERRQ(ierr);
28342d747510SLisandro 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);
28352d747510SLisandro Dalcin             break;
28362d747510SLisandro Dalcin           }
28372d747510SLisandro Dalcin         }
28382d747510SLisandro Dalcin         ierr = PetscOptionsStringToInt(value+i+1,&end);CHKERRQ(ierr);
28392d747510SLisandro 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);
28402d747510SLisandro Dalcin         nvalues = (end-start)/inc + (end-start)%inc;
28412d747510SLisandro 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);
28422d747510SLisandro Dalcin         for (;start<end; start+=inc) {
28432d747510SLisandro Dalcin           *ivalue = start; ivalue++;n++;
28442d747510SLisandro Dalcin         }
28452d747510SLisandro Dalcin         foundrange = PETSC_TRUE;
28462d747510SLisandro Dalcin         break;
28472d747510SLisandro Dalcin       }
28482d747510SLisandro Dalcin     }
28492d747510SLisandro Dalcin     if (!foundrange) {
28502d747510SLisandro Dalcin       ierr = PetscOptionsStringToInt(value,ivalue);CHKERRQ(ierr);
28512d747510SLisandro Dalcin       ivalue++;
28522d747510SLisandro Dalcin       n++;
28532d747510SLisandro Dalcin     }
28542d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
28552d747510SLisandro Dalcin   }
28562d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
28572d747510SLisandro Dalcin   *nmax = n;
28582d747510SLisandro Dalcin   PetscFunctionReturn(0);
28592d747510SLisandro Dalcin }
28602d747510SLisandro Dalcin 
28612d747510SLisandro Dalcin /*@C
28622d747510SLisandro Dalcin    PetscOptionsGetRealArray - Gets an array of double precision values for a
28632d747510SLisandro Dalcin    particular option in the database.  The values must be separated with
28642d747510SLisandro Dalcin    commas with no intervening spaces.
28652d747510SLisandro Dalcin 
28662d747510SLisandro Dalcin    Not Collective
28672d747510SLisandro Dalcin 
28682d747510SLisandro Dalcin    Input Parameters:
28692d747510SLisandro Dalcin +  options - options database, use NULL for default global database
28702d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
28712d747510SLisandro Dalcin .  name - the option one is seeking
28722d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
28732d747510SLisandro Dalcin 
28742d747510SLisandro Dalcin    Output Parameters:
28752d747510SLisandro Dalcin +  dvalue - the double values to return
2876a5b23f4aSJose E. Roman .  nmax - actual number of values retrieved
28772d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
28782d747510SLisandro Dalcin 
28792d747510SLisandro Dalcin    Level: beginner
28802d747510SLisandro Dalcin 
28812d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
28822d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
28832d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
28842d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
28852d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
28862d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
28872d747510SLisandro Dalcin @*/
28882d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt *nmax,PetscBool *set)
28892d747510SLisandro Dalcin {
28902d747510SLisandro Dalcin   const char     *svalue;
28912d747510SLisandro Dalcin   char           *value;
28922d747510SLisandro Dalcin   PetscErrorCode ierr;
28932d747510SLisandro Dalcin   PetscInt       n = 0;
28942d747510SLisandro Dalcin   PetscBool      flag;
28952d747510SLisandro Dalcin   PetscToken     token;
28962d747510SLisandro Dalcin 
28972d747510SLisandro Dalcin   PetscFunctionBegin;
28982d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
28992d747510SLisandro Dalcin   PetscValidRealPointer(dvalue,4);
29002d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
29012d747510SLisandro Dalcin 
29022d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
29032d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
29042d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
29052d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
29062d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
29072d747510SLisandro Dalcin   while (value && n < *nmax) {
29082d747510SLisandro Dalcin     ierr = PetscOptionsStringToReal(value,dvalue++);CHKERRQ(ierr);
29092d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
29102d747510SLisandro Dalcin     n++;
29112d747510SLisandro Dalcin   }
29122d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
29132d747510SLisandro Dalcin   *nmax = n;
29142d747510SLisandro Dalcin   PetscFunctionReturn(0);
29152d747510SLisandro Dalcin }
29162d747510SLisandro Dalcin 
29172d747510SLisandro Dalcin /*@C
29182d747510SLisandro Dalcin    PetscOptionsGetScalarArray - Gets an array of scalars for a
29192d747510SLisandro Dalcin    particular option in the database.  The values must be separated with
29202d747510SLisandro Dalcin    commas with no intervening spaces.
29212d747510SLisandro Dalcin 
29222d747510SLisandro Dalcin    Not Collective
29232d747510SLisandro Dalcin 
29242d747510SLisandro Dalcin    Input Parameters:
29252d747510SLisandro Dalcin +  options - options database, use NULL for default global database
29262d747510SLisandro Dalcin .  pre - string to prepend to each name or NULL
29272d747510SLisandro Dalcin .  name - the option one is seeking
29282d747510SLisandro Dalcin -  nmax - maximum number of values to retrieve
29292d747510SLisandro Dalcin 
29302d747510SLisandro Dalcin    Output Parameters:
29312d747510SLisandro Dalcin +  dvalue - the scalar values to return
2932a5b23f4aSJose E. Roman .  nmax - actual number of values retrieved
29332d747510SLisandro Dalcin -  set - PETSC_TRUE if found, else PETSC_FALSE
29342d747510SLisandro Dalcin 
29352d747510SLisandro Dalcin    Level: beginner
29362d747510SLisandro Dalcin 
29372d747510SLisandro Dalcin .seealso: PetscOptionsGetInt(), PetscOptionsHasName(),
29382d747510SLisandro Dalcin           PetscOptionsGetString(), PetscOptionsGetIntArray(), PetscOptionsBool(),
29392d747510SLisandro Dalcin           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
29402d747510SLisandro Dalcin           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
29412d747510SLisandro Dalcin           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
29422d747510SLisandro Dalcin           PetscOptionsFList(), PetscOptionsEList()
29432d747510SLisandro Dalcin @*/
29442d747510SLisandro Dalcin PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt *nmax,PetscBool *set)
29452d747510SLisandro Dalcin {
29462d747510SLisandro Dalcin   const char     *svalue;
29472d747510SLisandro Dalcin   char           *value;
29482d747510SLisandro Dalcin   PetscErrorCode ierr;
29492d747510SLisandro Dalcin   PetscInt       n = 0;
29502d747510SLisandro Dalcin   PetscBool      flag;
29512d747510SLisandro Dalcin   PetscToken     token;
29522d747510SLisandro Dalcin 
29532d747510SLisandro Dalcin   PetscFunctionBegin;
29542d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
2955064a246eSJacob Faibussowitsch   PetscValidScalarPointer(dvalue,4);
29562d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
29572d747510SLisandro Dalcin 
29582d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
29592d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
29602d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
29612d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
29622d747510SLisandro Dalcin   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
29632d747510SLisandro Dalcin   while (value && n < *nmax) {
29642d747510SLisandro Dalcin     ierr = PetscOptionsStringToScalar(value,dvalue++);CHKERRQ(ierr);
29652d747510SLisandro Dalcin     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
29662d747510SLisandro Dalcin     n++;
29672d747510SLisandro Dalcin   }
29682d747510SLisandro Dalcin   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
29692d747510SLisandro Dalcin   *nmax = n;
29702d747510SLisandro Dalcin   PetscFunctionReturn(0);
29712d747510SLisandro Dalcin }
297214ce751eSBarry Smith 
2973e5c89e4eSSatish Balay /*@C
2974e5c89e4eSSatish Balay    PetscOptionsGetStringArray - Gets an array of string values for a particular
2975e5c89e4eSSatish Balay    option in the database. The values must be separated with commas with
2976e5c89e4eSSatish Balay    no intervening spaces.
2977e5c89e4eSSatish Balay 
2978e5c89e4eSSatish Balay    Not Collective
2979e5c89e4eSSatish Balay 
2980e5c89e4eSSatish Balay    Input Parameters:
29815c9cc608SHong Zhang +  options - options database, use NULL for default global database
2982c5929fdfSBarry Smith .  pre - string to prepend to name or NULL
2983e5c89e4eSSatish Balay .  name - the option one is seeking
2984e5c89e4eSSatish Balay -  nmax - maximum number of strings
2985e5c89e4eSSatish Balay 
2986e7b76fa7SPatrick Sanan    Output Parameters:
2987e5c89e4eSSatish Balay +  strings - location to copy strings
2988e7b76fa7SPatrick Sanan .  nmax - the number of strings found
298996ef3cdfSSatish Balay -  set - PETSC_TRUE if found, else PETSC_FALSE
2990e5c89e4eSSatish Balay 
2991e5c89e4eSSatish Balay    Level: beginner
2992e5c89e4eSSatish Balay 
2993e5c89e4eSSatish Balay    Notes:
2994e7b76fa7SPatrick Sanan    The nmax parameter is used for both input and output.
2995e7b76fa7SPatrick Sanan 
2996e5c89e4eSSatish Balay    The user should pass in an array of pointers to char, to hold all the
2997e5c89e4eSSatish Balay    strings returned by this function.
2998e5c89e4eSSatish Balay 
2999e5c89e4eSSatish Balay    The user is responsible for deallocating the strings that are
3000e5c89e4eSSatish Balay    returned. The Fortran interface for this routine is not supported.
3001e5c89e4eSSatish Balay 
3002e5c89e4eSSatish Balay .seealso: PetscOptionsGetInt(), PetscOptionsGetReal(),
3003acfcf0e5SJed Brown           PetscOptionsHasName(), PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool(),
3004e5c89e4eSSatish Balay           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
3005e5c89e4eSSatish Balay           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
3006acfcf0e5SJed Brown           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
3007a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
3008e5c89e4eSSatish Balay @*/
3009c5929fdfSBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char *strings[],PetscInt *nmax,PetscBool *set)
3010e5c89e4eSSatish Balay {
30112d747510SLisandro Dalcin   const char     *svalue;
3012e5c89e4eSSatish Balay   char           *value;
3013e5c89e4eSSatish Balay   PetscErrorCode ierr;
30142d747510SLisandro Dalcin   PetscInt       n = 0;
3015ace3abfcSBarry Smith   PetscBool      flag;
30169c9d3cfdSBarry Smith   PetscToken     token;
3017e5c89e4eSSatish Balay 
3018e5c89e4eSSatish Balay   PetscFunctionBegin;
30192d747510SLisandro Dalcin   PetscValidCharPointer(name,3);
30202d747510SLisandro Dalcin   PetscValidPointer(strings,4);
30212d747510SLisandro Dalcin   PetscValidIntPointer(nmax,5);
3022e5c89e4eSSatish Balay 
30232d747510SLisandro Dalcin   ierr = PetscOptionsFindPair(options,pre,name,&svalue,&flag);CHKERRQ(ierr);
30242d747510SLisandro Dalcin   if (!flag || !svalue)  { if (set) *set = PETSC_FALSE; *nmax = 0; PetscFunctionReturn(0);}
30252d747510SLisandro Dalcin   if (set) *set = PETSC_TRUE;
30262d747510SLisandro Dalcin   ierr = PetscTokenCreate(svalue,',',&token);CHKERRQ(ierr);
3027e5c89e4eSSatish Balay   ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
30282d747510SLisandro Dalcin   while (value && n < *nmax) {
3029e5c89e4eSSatish Balay     ierr = PetscStrallocpy(value,&strings[n]);CHKERRQ(ierr);
3030e5c89e4eSSatish Balay     ierr = PetscTokenFind(token,&value);CHKERRQ(ierr);
3031e5c89e4eSSatish Balay     n++;
3032e5c89e4eSSatish Balay   }
30338c74ee41SBarry Smith   ierr  = PetscTokenDestroy(&token);CHKERRQ(ierr);
3034e5c89e4eSSatish Balay   *nmax = n;
3035e5c89e4eSSatish Balay   PetscFunctionReturn(0);
3036e5c89e4eSSatish Balay }
303706824ed3SPatrick Sanan 
303806824ed3SPatrick Sanan /*@C
303906824ed3SPatrick Sanan    PetscOptionsDeprecated - mark an option as deprecated, optionally replacing it with a new one
304006824ed3SPatrick Sanan 
304106824ed3SPatrick Sanan    Prints a deprecation warning, unless an option is supplied to suppress.
304206824ed3SPatrick Sanan 
30431c9f3c13SBarry Smith    Logically Collective
304406824ed3SPatrick Sanan 
304506824ed3SPatrick Sanan    Input Parameters:
30469503aa97SPatrick Sanan +  pre - string to prepend to name or NULL
304706824ed3SPatrick Sanan .  oldname - the old, deprecated option
304806824ed3SPatrick Sanan .  newname - the new option, or NULL if option is purely removed
30499f3a6782SPatrick Sanan .  version - a string describing the version of first deprecation, e.g. "3.9"
30509f3a6782SPatrick Sanan -  info - additional information string, or NULL.
305106824ed3SPatrick Sanan 
305206824ed3SPatrick Sanan    Options Database Keys:
305306824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings
305406824ed3SPatrick Sanan 
305506824ed3SPatrick Sanan    Notes:
30561c9f3c13SBarry Smith    Must be called between PetscOptionsBegin() (or PetscObjectOptionsBegin()) and PetscOptionsEnd().
30571c9f3c13SBarry Smith    Only the proces of rank zero that owns the PetscOptionsItems are argument (managed by PetscOptionsBegin() or
30581c9f3c13SBarry Smith    PetscObjectOptionsBegin() prints the information
3059b40114eaSPatrick Sanan    If newname is provided, the old option is replaced. Otherwise, it remains
3060b40114eaSPatrick Sanan    in the options database.
30619f3a6782SPatrick Sanan    If an option is not replaced, the info argument should be used to advise the user
30629f3a6782SPatrick Sanan    on how to proceed.
30639f3a6782SPatrick Sanan    There is a limit on the length of the warning printed, so very long strings
30649f3a6782SPatrick Sanan    provided as info may be truncated.
306506824ed3SPatrick Sanan 
306606824ed3SPatrick Sanan    Level: developer
306706824ed3SPatrick Sanan 
306806824ed3SPatrick Sanan .seealso: PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsScalar(), PetscOptionsBool(), PetscOptionsString(), PetscOptionsSetValue()
306906824ed3SPatrick Sanan 
307006824ed3SPatrick Sanan @*/
30719f3a6782SPatrick Sanan PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems *PetscOptionsObject,const char oldname[],const char newname[],const char version[],const char info[])
307206824ed3SPatrick Sanan {
307306824ed3SPatrick Sanan   PetscErrorCode     ierr;
307406824ed3SPatrick Sanan   PetscBool          found,quiet;
307506824ed3SPatrick Sanan   const char         *value;
307606824ed3SPatrick Sanan   const char * const quietopt="-options_suppress_deprecated_warnings";
30779f3a6782SPatrick Sanan   char               msg[4096];
3078b0bdc838SStefano Zampini   char               *prefix = NULL;
3079b0bdc838SStefano Zampini   PetscOptions       options = NULL;
3080b0bdc838SStefano Zampini   MPI_Comm           comm = PETSC_COMM_SELF;
308106824ed3SPatrick Sanan 
308206824ed3SPatrick Sanan   PetscFunctionBegin;
308306824ed3SPatrick Sanan   PetscValidCharPointer(oldname,2);
308406824ed3SPatrick Sanan   PetscValidCharPointer(version,4);
3085b0bdc838SStefano Zampini   if (PetscOptionsObject) {
3086b0bdc838SStefano Zampini     prefix  = PetscOptionsObject->prefix;
3087b0bdc838SStefano Zampini     options = PetscOptionsObject->options;
3088b0bdc838SStefano Zampini     comm    = PetscOptionsObject->comm;
3089b0bdc838SStefano Zampini   }
3090b0bdc838SStefano Zampini   ierr = PetscOptionsFindPair(options,prefix,oldname,&value,&found);CHKERRQ(ierr);
309106824ed3SPatrick Sanan   if (found) {
309206824ed3SPatrick Sanan     if (newname) {
3093b0bdc838SStefano Zampini       if (prefix) {
3094b0bdc838SStefano Zampini         ierr = PetscOptionsPrefixPush(options,prefix);CHKERRQ(ierr);
3095d255429eSPatrick Sanan       }
3096b0bdc838SStefano Zampini       ierr = PetscOptionsSetValue(options,newname,value);CHKERRQ(ierr);
3097b0bdc838SStefano Zampini       if (prefix) {
3098b0bdc838SStefano Zampini         ierr = PetscOptionsPrefixPop(options);CHKERRQ(ierr);
3099d255429eSPatrick Sanan       }
3100b0bdc838SStefano Zampini       ierr = PetscOptionsClearValue(options,oldname);CHKERRQ(ierr);
3101b40114eaSPatrick Sanan     }
310206824ed3SPatrick Sanan     quiet = PETSC_FALSE;
3103b0bdc838SStefano Zampini     ierr = PetscOptionsGetBool(options,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr);
310406824ed3SPatrick Sanan     if (!quiet) {
31059f3a6782SPatrick Sanan       ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr);
31061fa95f81SSatish Balay       ierr = PetscStrcat(msg,oldname);CHKERRQ(ierr);
3107928bb9adSStefano Zampini       ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr);
31089f3a6782SPatrick Sanan       ierr = PetscStrcat(msg,version);CHKERRQ(ierr);
31099f3a6782SPatrick Sanan       ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr);
311006824ed3SPatrick Sanan       if (newname) {
31119f3a6782SPatrick Sanan         ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr);
31129f3a6782SPatrick Sanan         ierr = PetscStrcat(msg,newname);CHKERRQ(ierr);
31139f3a6782SPatrick Sanan         ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr);
311406824ed3SPatrick Sanan       }
31159f3a6782SPatrick Sanan       if (info) {
31169f3a6782SPatrick Sanan         ierr = PetscStrcat(msg," ");CHKERRQ(ierr);
31179f3a6782SPatrick Sanan         ierr = PetscStrcat(msg,info);CHKERRQ(ierr);
31189f3a6782SPatrick Sanan       }
31199f3a6782SPatrick Sanan       ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr);
31209f3a6782SPatrick Sanan       ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr);
31219f3a6782SPatrick Sanan       ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr);
3122b0bdc838SStefano Zampini       ierr = PetscPrintf(comm,msg);CHKERRQ(ierr);
312306824ed3SPatrick Sanan     }
312406824ed3SPatrick Sanan   }
312506824ed3SPatrick Sanan   PetscFunctionReturn(0);
312606824ed3SPatrick Sanan }
3127