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 */
PetscToLower(int c)34d71ae5a4SJacob Faibussowitsch static inline int PetscToLower(int c)
35d71ae5a4SJacob Faibussowitsch {
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) */
PetscOptHash(const char key[])40d71ae5a4SJacob Faibussowitsch static inline unsigned int PetscOptHash(const char key[])
41d71ae5a4SJacob Faibussowitsch {
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
PetscOptEqual(const char a[],const char b[])54d71ae5a4SJacob Faibussowitsch static inline int PetscOptEqual(const char a[], const char b[])
55d71ae5a4SJacob Faibussowitsch {
562d747510SLisandro Dalcin return !PetscOptNameCmp(a, b);
572d747510SLisandro Dalcin }
582d747510SLisandro Dalcin
592d747510SLisandro Dalcin KHASH_INIT(HO, kh_cstr_t, int, 1, PetscOptHash, PetscOptEqual)
602d747510SLisandro Dalcin
6174e0666dSJed Brown #define MAXPREFIXES 25
622d747510SLisandro Dalcin #define MAXOPTIONSMONITORS 5
63e5c89e4eSSatish Balay
649355ec05SMatthew G. Knepley const char *PetscOptionSources[] = {"code", "command line", "file", "environment"};
659355ec05SMatthew G. Knepley
669355ec05SMatthew G. Knepley // This table holds all the options set by the user
674416b707SBarry Smith struct _n_PetscOptions {
683de2bfdfSBarry Smith PetscOptions previous;
699355ec05SMatthew G. Knepley
702d747510SLisandro Dalcin int N; /* number of options */
719355ec05SMatthew G. Knepley int Nalloc; /* number of allocated options */
729355ec05SMatthew G. Knepley char **names; /* option names */
739355ec05SMatthew G. Knepley char **values; /* option values */
749355ec05SMatthew G. Knepley PetscBool *used; /* flag option use */
759355ec05SMatthew G. Knepley PetscOptionSource *source; /* source for option value */
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];
849355ec05SMatthew G. Knepley char prefix[PETSC_MAX_OPTION_NAME];
852d747510SLisandro Dalcin
862d747510SLisandro Dalcin /* Aliases */
879355ec05SMatthew G. Knepley int Na; /* number or aliases */
889355ec05SMatthew G. Knepley int Naalloc; /* number of allocated aliases */
899355ec05SMatthew G. Knepley char **aliases1; /* aliased */
909355ec05SMatthew G. Knepley char **aliases2; /* aliasee */
912d747510SLisandro Dalcin
922d747510SLisandro Dalcin /* Help */
932d747510SLisandro Dalcin PetscBool help; /* flag whether "-help" is in the database */
94d314f959SVaclav Hapla PetscBool help_intro; /* flag whether "-help intro" is in the database */
952d747510SLisandro Dalcin
962d747510SLisandro Dalcin /* Monitors */
97c5b5d8d5SVaclav Hapla PetscBool monitorFromOptions, monitorCancel;
989355ec05SMatthew G. Knepley PetscErrorCode (*monitor[MAXOPTIONSMONITORS])(const char[], const char[], PetscOptionSource, void *); /* returns control to user after */
9949abdd8aSBarry Smith PetscCtxDestroyFn *monitordestroy[MAXOPTIONSMONITORS]; /* callback for monitor destruction */
100081c24baSBoyana Norris void *monitorcontext[MAXOPTIONSMONITORS]; /* to pass arbitrary user data into monitor */
101081c24baSBoyana Norris PetscInt numbermonitors; /* to, for instance, detect options being set */
1024416b707SBarry Smith };
103e5c89e4eSSatish Balay
104b4205f0bSBarry Smith static PetscOptions defaultoptions = NULL; /* the options database routines query this object for options */
1052d747510SLisandro Dalcin
106aaa8cc7dSPierre Jolivet /* list of options which precede others, i.e., are processed in PetscOptionsProcessPrecedentFlags() */
107660278c0SBarry Smith /* these options can only take boolean values, the code will crash if given a non-boolean value */
108660278c0SBarry Smith static const char *precedentOptions[] = {"-petsc_ci", "-options_monitor", "-options_monitor_cancel", "-help", "-skip_petscrc"};
1099371c9d4SSatish Balay enum PetscPrecedentOption {
1109371c9d4SSatish Balay PO_CI_ENABLE,
1119371c9d4SSatish Balay PO_OPTIONS_MONITOR,
1129371c9d4SSatish Balay PO_OPTIONS_MONITOR_CANCEL,
1139371c9d4SSatish Balay PO_HELP,
1149371c9d4SSatish Balay PO_SKIP_PETSCRC,
1159371c9d4SSatish Balay PO_NUM
1169371c9d4SSatish Balay };
117c5b5d8d5SVaclav Hapla
1189355ec05SMatthew G. Knepley PETSC_INTERN PetscErrorCode PetscOptionsSetValue_Private(PetscOptions, const char[], const char[], int *, PetscOptionSource);
1199355ec05SMatthew G. Knepley PETSC_INTERN PetscErrorCode PetscOptionsInsertStringYAML_Private(PetscOptions, const char[], PetscOptionSource);
120c5b5d8d5SVaclav Hapla
121081c24baSBoyana Norris /*
122081c24baSBoyana Norris Options events monitor
123081c24baSBoyana Norris */
PetscOptionsMonitor(PetscOptions options,const char name[],const char value[],PetscOptionSource source)1249355ec05SMatthew G. Knepley static PetscErrorCode PetscOptionsMonitor(PetscOptions options, const char name[], const char value[], PetscOptionSource source)
125d71ae5a4SJacob Faibussowitsch {
126e5c89e4eSSatish Balay PetscFunctionBegin;
1279355ec05SMatthew G. Knepley if (options->monitorFromOptions) PetscCall(PetscOptionsMonitorDefault(name, value, source, NULL));
1289355ec05SMatthew G. Knepley for (PetscInt i = 0; i < options->numbermonitors; i++) PetscCall((*options->monitor[i])(name, value, source, options->monitorcontext[i]));
1293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
130e5c89e4eSSatish Balay }
131e5c89e4eSSatish Balay
1322d747510SLisandro Dalcin /*@
1332d747510SLisandro Dalcin PetscOptionsCreate - Creates an empty options database.
134e5c89e4eSSatish Balay
13520f4b53cSBarry Smith Logically Collective
1361c9f3c13SBarry Smith
137e5c89e4eSSatish Balay Output Parameter:
1382d747510SLisandro Dalcin . options - Options database object
139e5c89e4eSSatish Balay
140e5c89e4eSSatish Balay Level: advanced
141e5c89e4eSSatish Balay
142811af0c4SBarry Smith Note:
143811af0c4SBarry Smith Though PETSc has a concept of multiple options database the current code uses a single default `PetscOptions` object
144811af0c4SBarry Smith
145811af0c4SBarry Smith Developer Notes:
146811af0c4SBarry Smith We may want eventually to pass a `MPI_Comm` to determine the ownership of the object
147811af0c4SBarry Smith
148811af0c4SBarry Smith This object never got developed after being introduced, it is not clear that supporting multiple `PetscOptions` objects is useful
1491c9f3c13SBarry Smith
150db781477SPatrick Sanan .seealso: `PetscOptionsDestroy()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsInsert()`, `PetscOptionsSetValue()`
151e5c89e4eSSatish Balay @*/
PetscOptionsCreate(PetscOptions * options)152d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsCreate(PetscOptions *options)
153d71ae5a4SJacob Faibussowitsch {
15439a651e2SJacob Faibussowitsch PetscFunctionBegin;
1554f572ea9SToby Isaac PetscAssertPointer(options, 1);
1562d747510SLisandro Dalcin *options = (PetscOptions)calloc(1, sizeof(**options));
15739a651e2SJacob Faibussowitsch PetscCheck(*options, PETSC_COMM_SELF, PETSC_ERR_MEM, "Failed to allocate the options database");
1583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1592d747510SLisandro Dalcin }
1602d747510SLisandro Dalcin
1612d747510SLisandro Dalcin /*@
1622d747510SLisandro Dalcin PetscOptionsDestroy - Destroys an option database.
1632d747510SLisandro Dalcin
16420f4b53cSBarry Smith Logically Collective on whatever communicator was associated with the call to `PetscOptionsCreate()`
1651c9f3c13SBarry Smith
1662d747510SLisandro Dalcin Input Parameter:
167811af0c4SBarry Smith . options - the `PetscOptions` object
1682d747510SLisandro Dalcin
1693de2bfdfSBarry Smith Level: advanced
1702d747510SLisandro Dalcin
171aec76313SJacob Faibussowitsch .seealso: `PetscOptionsInsert()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsSetValue()`
1722d747510SLisandro Dalcin @*/
PetscOptionsDestroy(PetscOptions * options)173d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsDestroy(PetscOptions *options)
174d71ae5a4SJacob Faibussowitsch {
175362febeeSStefano Zampini PetscFunctionBegin;
1764f572ea9SToby Isaac PetscAssertPointer(options, 1);
1773ba16761SJacob Faibussowitsch if (!*options) PetscFunctionReturn(PETSC_SUCCESS);
1785f80ce2aSJacob Faibussowitsch PetscCheck(!(*options)->previous, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "You are destroying an option that has been used with PetscOptionsPush() but does not have a corresponding PetscOptionsPop()");
1799566063dSJacob Faibussowitsch PetscCall(PetscOptionsClear(*options));
1802d747510SLisandro Dalcin /* XXX what about monitors ? */
1812800570dSLisandro Dalcin free(*options);
1822d747510SLisandro Dalcin *options = NULL;
1833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
184e5c89e4eSSatish Balay }
185e5c89e4eSSatish Balay
1862d747510SLisandro Dalcin /*
1872d747510SLisandro Dalcin PetscOptionsCreateDefault - Creates the default global options database
1882d747510SLisandro Dalcin */
PetscOptionsCreateDefault(void)189d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsCreateDefault(void)
190d71ae5a4SJacob Faibussowitsch {
19139a651e2SJacob Faibussowitsch PetscFunctionBegin;
1929566063dSJacob Faibussowitsch if (PetscUnlikely(!defaultoptions)) PetscCall(PetscOptionsCreate(&defaultoptions));
1933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1942d747510SLisandro Dalcin }
1952d747510SLisandro Dalcin
196b4205f0bSBarry Smith /*@
197811af0c4SBarry Smith PetscOptionsPush - Push a new `PetscOptions` object as the default provider of options
1981c9f3c13SBarry Smith Allows using different parts of a code to use different options databases
199b4205f0bSBarry Smith
200b4205f0bSBarry Smith Logically Collective
201b4205f0bSBarry Smith
202b4205f0bSBarry Smith Input Parameter:
203811af0c4SBarry Smith . opt - the options obtained with `PetscOptionsCreate()`
204b4205f0bSBarry Smith
20520f4b53cSBarry Smith Level: advanced
20620f4b53cSBarry Smith
207b4205f0bSBarry Smith Notes:
208811af0c4SBarry Smith Use `PetscOptionsPop()` to return to the previous default options database
2091c9f3c13SBarry Smith
210811af0c4SBarry Smith The collectivity of this routine is complex; only the MPI ranks that call this routine will
2111c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do
2121c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
2131c9f3c13SBarry Smith on different ranks.
214b4205f0bSBarry Smith
215aec76313SJacob Faibussowitsch Developer Notes:
216811af0c4SBarry Smith Though this functionality has been provided it has never been used in PETSc and might be removed.
217811af0c4SBarry Smith
218db781477SPatrick Sanan .seealso: `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsInsert()`, `PetscOptionsSetValue()`, `PetscOptionsLeft()`
219b4205f0bSBarry Smith @*/
PetscOptionsPush(PetscOptions opt)220d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsPush(PetscOptions opt)
221d71ae5a4SJacob Faibussowitsch {
222b4205f0bSBarry Smith PetscFunctionBegin;
2239566063dSJacob Faibussowitsch PetscCall(PetscOptionsCreateDefault());
224b4205f0bSBarry Smith opt->previous = defaultoptions;
225b4205f0bSBarry Smith defaultoptions = opt;
2263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
227b4205f0bSBarry Smith }
228b4205f0bSBarry Smith
229b4205f0bSBarry Smith /*@
230811af0c4SBarry Smith PetscOptionsPop - Pop the most recent `PetscOptionsPush()` to return to the previous default options
231b4205f0bSBarry Smith
23220f4b53cSBarry Smith Logically Collective on whatever communicator was associated with the call to `PetscOptionsCreate()`
233b4205f0bSBarry Smith
2343de2bfdfSBarry Smith Level: advanced
2353de2bfdfSBarry Smith
23642747ad1SJacob Faibussowitsch .seealso: `PetscOptionsCreate()`, `PetscOptionsInsert()`, `PetscOptionsSetValue()`, `PetscOptionsLeft()`
237b4205f0bSBarry Smith @*/
PetscOptionsPop(void)238d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsPop(void)
239d71ae5a4SJacob Faibussowitsch {
2403de2bfdfSBarry Smith PetscOptions current = defaultoptions;
2413de2bfdfSBarry Smith
242b4205f0bSBarry Smith PetscFunctionBegin;
24328b400f6SJacob Faibussowitsch PetscCheck(defaultoptions, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Missing default options");
24428b400f6SJacob Faibussowitsch PetscCheck(defaultoptions->previous, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscOptionsPop() called too many times");
245b4205f0bSBarry Smith defaultoptions = defaultoptions->previous;
2463de2bfdfSBarry Smith current->previous = NULL;
2473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
248b4205f0bSBarry Smith }
249b4205f0bSBarry Smith
2502d747510SLisandro Dalcin /*
2512d747510SLisandro Dalcin PetscOptionsDestroyDefault - Destroys the default global options database
2522d747510SLisandro Dalcin */
PetscOptionsDestroyDefault(void)253d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsDestroyDefault(void)
254d71ae5a4SJacob Faibussowitsch {
25539a651e2SJacob Faibussowitsch PetscFunctionBegin;
2563ba16761SJacob Faibussowitsch if (!defaultoptions) PetscFunctionReturn(PETSC_SUCCESS);
2573de2bfdfSBarry Smith /* Destroy any options that the user forgot to pop */
2583de2bfdfSBarry Smith while (defaultoptions->previous) {
25939a651e2SJacob Faibussowitsch PetscOptions tmp = defaultoptions;
26039a651e2SJacob Faibussowitsch
2619566063dSJacob Faibussowitsch PetscCall(PetscOptionsPop());
2629566063dSJacob Faibussowitsch PetscCall(PetscOptionsDestroy(&tmp));
2633de2bfdfSBarry Smith }
2649566063dSJacob Faibussowitsch PetscCall(PetscOptionsDestroy(&defaultoptions));
2653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
266e5c89e4eSSatish Balay }
267e5c89e4eSSatish Balay
268cc4c1da9SBarry Smith /*@
2697cd08cecSJed Brown PetscOptionsValidKey - PETSc Options database keys must begin with one or two dashes (-) followed by a letter.
2703fc1eb6aSBarry Smith
27120f4b53cSBarry Smith Not Collective
2721c9f3c13SBarry Smith
2733fc1eb6aSBarry Smith Input Parameter:
2742d747510SLisandro Dalcin . key - string to check if valid
2753fc1eb6aSBarry Smith
2763fc1eb6aSBarry Smith Output Parameter:
277811af0c4SBarry Smith . valid - `PETSC_TRUE` if a valid key
2783fc1eb6aSBarry Smith
279f6680f47SSatish Balay Level: intermediate
28010450e9eSJacob Faibussowitsch
28110450e9eSJacob Faibussowitsch .seealso: `PetscOptionsCreate()`, `PetscOptionsInsert()`
2823fc1eb6aSBarry Smith @*/
PetscOptionsValidKey(const char key[],PetscBool * valid)283d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsValidKey(const char key[], PetscBool *valid)
284d71ae5a4SJacob Faibussowitsch {
285f603b5e9SToby Isaac char *ptr;
28627304958SStefano Zampini PETSC_UNUSED double d;
2877c5db45bSBarry Smith
28896fc60bcSBarry Smith PetscFunctionBegin;
2894f572ea9SToby Isaac if (key) PetscAssertPointer(key, 1);
2904f572ea9SToby Isaac PetscAssertPointer(valid, 2);
2912d747510SLisandro Dalcin *valid = PETSC_FALSE;
2923ba16761SJacob Faibussowitsch if (!key) PetscFunctionReturn(PETSC_SUCCESS);
2933ba16761SJacob Faibussowitsch if (key[0] != '-') PetscFunctionReturn(PETSC_SUCCESS);
2942d747510SLisandro Dalcin if (key[1] == '-') key++;
2953ba16761SJacob Faibussowitsch if (!isalpha((int)key[1])) PetscFunctionReturn(PETSC_SUCCESS);
29627304958SStefano Zampini d = strtod(key, &ptr);
2973ba16761SJacob Faibussowitsch if (ptr != key && !(*ptr == '_' || isalnum((int)*ptr))) PetscFunctionReturn(PETSC_SUCCESS);
2982d747510SLisandro Dalcin *valid = PETSC_TRUE;
2993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
30096fc60bcSBarry Smith }
30196fc60bcSBarry Smith
PetscOptionsInsertString_Private(PetscOptions options,const char in_str[],PetscOptionSource source)30210c654e6SJacob Faibussowitsch static PetscErrorCode PetscOptionsInsertString_Private(PetscOptions options, const char in_str[], PetscOptionSource source)
303d71ae5a4SJacob Faibussowitsch {
304ce78bad3SBarry Smith const char *first, *second;
3059c9d3cfdSBarry Smith PetscToken token;
306e5c89e4eSSatish Balay
307e5c89e4eSSatish Balay PetscFunctionBegin;
3089566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(in_str, ' ', &token));
3099566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first));
31096fc60bcSBarry Smith while (first) {
311d06005cbSLisandro Dalcin PetscBool isfile, isfileyaml, isstringyaml, ispush, ispop, key;
31210c654e6SJacob Faibussowitsch
3139566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first, "-options_file", &isfile));
3149566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first, "-options_file_yaml", &isfileyaml));
3159566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first, "-options_string_yaml", &isstringyaml));
3169566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first, "-prefix_push", &ispush));
3179566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(first, "-prefix_pop", &ispop));
3189566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(first, &key));
319d06005cbSLisandro Dalcin if (!key) {
3209566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first));
321d06005cbSLisandro Dalcin } else if (isfile) {
3229566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &second));
32310c654e6SJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(PETSC_COMM_SELF, options, second, PETSC_TRUE));
3249566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first));
325d06005cbSLisandro Dalcin } else if (isfileyaml) {
3269566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &second));
32710c654e6SJacob Faibussowitsch PetscCall(PetscOptionsInsertFileYAML(PETSC_COMM_SELF, options, second, PETSC_TRUE));
3289566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first));
329d06005cbSLisandro Dalcin } else if (isstringyaml) {
3309566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &second));
3319355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertStringYAML_Private(options, second, source));
3329566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first));
333d06005cbSLisandro Dalcin } else if (ispush) {
3349566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &second));
3359566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPush(options, second));
3369566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first));
3379db968c8SJed Brown } else if (ispop) {
3389566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPop(options));
3399566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first));
340d06005cbSLisandro Dalcin } else {
3419566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &second));
3429566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(second, &key));
34396fc60bcSBarry Smith if (!key) {
3449355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, first, second, NULL, source));
3459566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &first));
34696fc60bcSBarry Smith } else {
3479355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, first, NULL, NULL, source));
34896fc60bcSBarry Smith first = second;
34996fc60bcSBarry Smith }
350e5c89e4eSSatish Balay }
351e5c89e4eSSatish Balay }
3529566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token));
3533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
354e5c89e4eSSatish Balay }
355e5c89e4eSSatish Balay
3565d83a8b1SBarry Smith /*@
3579355ec05SMatthew G. Knepley PetscOptionsInsertString - Inserts options into the database from a string
3589355ec05SMatthew G. Knepley
3599355ec05SMatthew G. Knepley Logically Collective
3609355ec05SMatthew G. Knepley
3619355ec05SMatthew G. Knepley Input Parameters:
3629355ec05SMatthew G. Knepley + options - options object
3639355ec05SMatthew G. Knepley - in_str - string that contains options separated by blanks
3649355ec05SMatthew G. Knepley
3659355ec05SMatthew G. Knepley Level: intermediate
3669355ec05SMatthew G. Knepley
36720f4b53cSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will
3689355ec05SMatthew G. Knepley have the affect of these options. If some processes that create objects call this routine and others do
3699355ec05SMatthew G. Knepley not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
3709355ec05SMatthew G. Knepley on different ranks.
3719355ec05SMatthew G. Knepley
3729355ec05SMatthew G. Knepley Contributed by Boyana Norris
3739355ec05SMatthew G. Knepley
3749355ec05SMatthew G. Knepley .seealso: `PetscOptionsSetValue()`, `PetscOptionsView()`, `PetscOptionsHasName()`, `PetscOptionsGetInt()`,
3759355ec05SMatthew G. Knepley `PetscOptionsGetReal()`, `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`,
3769355ec05SMatthew G. Knepley `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
3779355ec05SMatthew G. Knepley `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
3789355ec05SMatthew G. Knepley `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
3799355ec05SMatthew G. Knepley `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsInsertFile()`
3809355ec05SMatthew G. Knepley @*/
PetscOptionsInsertString(PetscOptions options,const char in_str[])3819355ec05SMatthew G. Knepley PetscErrorCode PetscOptionsInsertString(PetscOptions options, const char in_str[])
3829355ec05SMatthew G. Knepley {
3839355ec05SMatthew G. Knepley PetscFunctionBegin;
3849355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertString_Private(options, in_str, PETSC_OPT_CODE));
3853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3869355ec05SMatthew G. Knepley }
3879355ec05SMatthew G. Knepley
3883fc1eb6aSBarry Smith /*
3893fc1eb6aSBarry Smith Returns a line (ended by a \n, \r or null character of any length. Result should be freed with free()
3903fc1eb6aSBarry Smith */
Petscgetline(FILE * f)391d71ae5a4SJacob Faibussowitsch static char *Petscgetline(FILE *f)
392d71ae5a4SJacob Faibussowitsch {
3935fa91da5SBarry Smith size_t size = 0;
3945fa91da5SBarry Smith size_t len = 0;
3955fa91da5SBarry Smith size_t last = 0;
3960298fd71SBarry Smith char *buf = NULL;
3975fa91da5SBarry Smith
39802c9f0b5SLisandro Dalcin if (feof(f)) return NULL;
3995fa91da5SBarry Smith do {
4005fa91da5SBarry Smith size += 1024; /* BUFSIZ is defined as "the optimal read size for this platform" */
4016e0c8459SSatish Balay buf = (char *)realloc((void *)buf, size); /* realloc(NULL,n) is the same as malloc(n) */
4025fa91da5SBarry Smith /* Actually do the read. Note that fgets puts a terminal '\0' on the
4035fa91da5SBarry Smith end of the string, so we make sure we overwrite this */
404e86f3e45SDave May if (!fgets(buf + len, 1024, f)) buf[len] = 0;
4053ba16761SJacob Faibussowitsch PetscCallAbort(PETSC_COMM_SELF, PetscStrlen(buf, &len));
4065fa91da5SBarry Smith last = len - 1;
4075fa91da5SBarry Smith } while (!feof(f) && buf[last] != '\n' && buf[last] != '\r');
40808ac41f7SSatish Balay if (len) return buf;
4095fa91da5SBarry Smith free(buf);
41002c9f0b5SLisandro Dalcin return NULL;
4115fa91da5SBarry Smith }
4125fa91da5SBarry Smith
PetscOptionsFilename(MPI_Comm comm,const char file[],char filename[PETSC_MAX_PATH_LEN],PetscBool * yaml)413d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscOptionsFilename(MPI_Comm comm, const char file[], char filename[PETSC_MAX_PATH_LEN], PetscBool *yaml)
414d71ae5a4SJacob Faibussowitsch {
415be10d61cSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN + 8], path[PETSC_MAX_PATH_LEN + 8], *tail;
416e5c89e4eSSatish Balay
417be10d61cSLisandro Dalcin PetscFunctionBegin;
418362febeeSStefano Zampini *yaml = PETSC_FALSE;
4199566063dSJacob Faibussowitsch PetscCall(PetscStrreplace(comm, file, fname, sizeof(fname)));
4209566063dSJacob Faibussowitsch PetscCall(PetscFixFilename(fname, path));
4219566063dSJacob Faibussowitsch PetscCall(PetscStrendswith(path, ":yaml", yaml));
422be10d61cSLisandro Dalcin if (*yaml) {
4239566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(path, ':', &tail));
424be10d61cSLisandro Dalcin tail[-1] = 0; /* remove ":yaml" suffix from path */
425be10d61cSLisandro Dalcin }
4269566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(filename, path, PETSC_MAX_PATH_LEN));
427a1d2f846SLisandro Dalcin /* check for standard YAML and JSON filename extensions */
4289566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrendswith(filename, ".yaml", yaml));
4299566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrendswith(filename, ".yml", yaml));
4309566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrendswith(filename, ".json", yaml));
431a1d2f846SLisandro Dalcin if (!*yaml) { /* check file contents */
432a1d2f846SLisandro Dalcin PetscMPIInt rank;
4339566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank));
434dd400576SPatrick Sanan if (rank == 0) {
435a1d2f846SLisandro Dalcin FILE *fh = fopen(filename, "r");
436a1d2f846SLisandro Dalcin if (fh) {
437a1d2f846SLisandro Dalcin char buf[6] = "";
438a1d2f846SLisandro Dalcin if (fread(buf, 1, 6, fh) > 0) {
4399566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(buf, "%YAML ", 6, yaml)); /* check for '%YAML' tag */
4409566063dSJacob Faibussowitsch if (!*yaml) PetscCall(PetscStrncmp(buf, "---", 3, yaml)); /* check for document start */
441a1d2f846SLisandro Dalcin }
442a1d2f846SLisandro Dalcin (void)fclose(fh);
443a1d2f846SLisandro Dalcin }
444a1d2f846SLisandro Dalcin }
4455440e5dcSBarry Smith PetscCallMPI(MPI_Bcast(yaml, 1, MPI_C_BOOL, 0, comm));
446a1d2f846SLisandro Dalcin }
4473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
448be10d61cSLisandro Dalcin }
449e5c89e4eSSatish Balay
PetscOptionsInsertFilePetsc(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require)450d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscOptionsInsertFilePetsc(MPI_Comm comm, PetscOptions options, const char file[], PetscBool require)
451d71ae5a4SJacob Faibussowitsch {
4528c0b561eSLisandro Dalcin char *string, *vstring = NULL, *astring = NULL, *packed = NULL;
453ce78bad3SBarry Smith const char *tokens[4];
4546497c311SBarry Smith size_t len;
455ce78bad3SBarry Smith PetscCount bytes;
456e5c89e4eSSatish Balay FILE *fd;
4577fb43599SVaclav Hapla PetscToken token = NULL;
458ed9cf6e9SBarry Smith int err;
459bbcf679cSJacob Faibussowitsch char *cmatch = NULL;
460581bbe83SVaclav Hapla const char cmt = '#';
4619210b8eaSVaclav Hapla PetscInt line = 1;
4623a018368SJed Brown PetscMPIInt rank, cnt = 0, acnt = 0, counts[2];
4639210b8eaSVaclav Hapla PetscBool isdir, alias = PETSC_FALSE, valid;
464e5c89e4eSSatish Balay
465e5c89e4eSSatish Balay PetscFunctionBegin;
4669566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tokens, sizeof(tokens)));
4679566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank));
468dd400576SPatrick Sanan if (rank == 0) {
4698c0b561eSLisandro Dalcin char fpath[PETSC_MAX_PATH_LEN];
4708c0b561eSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN];
47105c7dedfSBarry Smith
4727255af2bSBarry Smith PetscCall(PetscStrreplace(PETSC_COMM_SELF, file, fname, sizeof(fname)));
4737255af2bSBarry Smith PetscCall(PetscFixFilename(fname, fpath));
4747255af2bSBarry Smith PetscCall(PetscGetFullPath(fpath, fname, sizeof(fname)));
4758c0b561eSLisandro Dalcin
476e5c89e4eSSatish Balay fd = fopen(fname, "r");
4779566063dSJacob Faibussowitsch PetscCall(PetscTestDirectory(fname, 'r', &isdir));
47808401ef6SPierre Jolivet PetscCheck(!isdir || !require, PETSC_COMM_SELF, PETSC_ERR_USER, "Specified options file %s is a directory", fname);
479ad38b122SPatrick Sanan if (fd && !isdir) {
4803a018368SJed Brown PetscSegBuffer vseg, aseg;
481ce78bad3SBarry Smith
4829566063dSJacob Faibussowitsch PetscCall(PetscSegBufferCreate(1, 4000, &vseg));
4839566063dSJacob Faibussowitsch PetscCall(PetscSegBufferCreate(1, 2000, &aseg));
4843a018368SJed Brown
4859b754dc9SBarry Smith /* the following line will not work when opening initial files (like .petscrc) since info is not yet set */
4869566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Opened options file %s\n", file));
487e24ecc5dSJed Brown
4885fa91da5SBarry Smith while ((string = Petscgetline(fd))) {
4894704e885SBarry Smith /* eliminate comments from each line */
4909566063dSJacob Faibussowitsch PetscCall(PetscStrchr(string, cmt, &cmatch));
49190f79514SSatish Balay if (cmatch) *cmatch = 0;
4929566063dSJacob Faibussowitsch PetscCall(PetscStrlen(string, &len));
4935981331cSSatish Balay /* replace tabs, ^M, \n with " " */
494dd460d27SBarry Smith for (size_t i = 0; i < len; i++) {
495ad540459SPierre Jolivet if (string[i] == '\t' || string[i] == '\r' || string[i] == '\n') string[i] = ' ';
496e5c89e4eSSatish Balay }
4979566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(string, ' ', &token));
4989566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &tokens[0]));
4997fb43599SVaclav Hapla if (!tokens[0]) {
50002b0d46eSSatish Balay goto destroy;
5017fb43599SVaclav Hapla } else if (!tokens[0][0]) { /* if token 0 is empty (string begins with spaces), redo */
5029566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &tokens[0]));
50390f79514SSatish Balay }
504dd460d27SBarry Smith for (PetscInt i = 1; i < 4; i++) PetscCall(PetscTokenFind(token, &tokens[i]));
5057fb43599SVaclav Hapla if (!tokens[0]) {
5062662f744SSatish Balay goto destroy;
5077fb43599SVaclav Hapla } else if (tokens[0][0] == '-') {
5089566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[0], &valid));
50928b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Error in options file %s line %" PetscInt_FMT ": invalid option %s", fname, line, tokens[0]);
5109566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[0], &len));
5119566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(vseg, len + 1, &vstring));
5129566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vstring, tokens[0], len));
513e24ecc5dSJed Brown vstring[len] = ' ';
5147fb43599SVaclav Hapla if (tokens[1]) {
5159566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[1], &valid));
51628b400f6SJacob Faibussowitsch PetscCheck(!valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Error in options file %s line %" PetscInt_FMT ": cannot specify two options per line (%s %s)", fname, line, tokens[0], tokens[1]);
5179566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[1], &len));
5189566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(vseg, len + 3, &vstring));
519e24ecc5dSJed Brown vstring[0] = '"';
5209566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vstring + 1, tokens[1], len));
521e24ecc5dSJed Brown vstring[len + 1] = '"';
522e24ecc5dSJed Brown vstring[len + 2] = ' ';
52309192fe3SBarry Smith }
52490f79514SSatish Balay } else {
5259566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(tokens[0], "alias", &alias));
526966bd95aSPierre Jolivet PetscCheck(alias, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown first token in options file %s line %" PetscInt_FMT ": %s", fname, line, tokens[0]);
5279566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[1], &valid));
52828b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Error in options file %s line %" PetscInt_FMT ": invalid aliased option %s", fname, line, tokens[1]);
52908401ef6SPierre Jolivet PetscCheck(tokens[2], PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Error in options file %s line %" PetscInt_FMT ": alias missing for %s", fname, line, tokens[1]);
5309566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(tokens[2], &valid));
53128b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Error in options file %s line %" PetscInt_FMT ": invalid aliasee option %s", fname, line, tokens[2]);
5329566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[1], &len));
5339566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(aseg, len + 1, &astring));
5349566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(astring, tokens[1], len));
535e24ecc5dSJed Brown astring[len] = ' ';
536e24ecc5dSJed Brown
5379566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tokens[2], &len));
5389566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(aseg, len + 1, &astring));
5399566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(astring, tokens[2], len));
540e24ecc5dSJed Brown astring[len] = ' ';
5419210b8eaSVaclav Hapla }
5429210b8eaSVaclav Hapla {
5439210b8eaSVaclav Hapla const char *extraToken = alias ? tokens[3] : tokens[2];
54428b400f6SJacob Faibussowitsch PetscCheck(!extraToken, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Error in options file %s line %" PetscInt_FMT ": extra token %s", fname, line, extraToken);
545e5c89e4eSSatish Balay }
54602b0d46eSSatish Balay destroy:
5474b40f50bSBarry Smith free(string);
5489566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token));
5499210b8eaSVaclav Hapla alias = PETSC_FALSE;
5509210b8eaSVaclav Hapla line++;
551e5c89e4eSSatish Balay }
552ed9cf6e9SBarry Smith err = fclose(fd);
55328b400f6SJacob Faibussowitsch PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fclose() failed on file %s", fname);
5549566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGetSize(aseg, &bytes)); /* size without null termination */
5559566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(bytes, &acnt));
5569566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(aseg, 1, &astring));
557e24ecc5dSJed Brown astring[0] = 0;
5589566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGetSize(vseg, &bytes)); /* size without null termination */
5599566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(bytes, &cnt));
5609566063dSJacob Faibussowitsch PetscCall(PetscSegBufferGet(vseg, 1, &vstring));
561e24ecc5dSJed Brown vstring[0] = 0;
5629566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2 + acnt + cnt, &packed));
5639566063dSJacob Faibussowitsch PetscCall(PetscSegBufferExtractTo(aseg, packed));
5649566063dSJacob Faibussowitsch PetscCall(PetscSegBufferExtractTo(vseg, packed + acnt + 1));
5659566063dSJacob Faibussowitsch PetscCall(PetscSegBufferDestroy(&aseg));
5669566063dSJacob Faibussowitsch PetscCall(PetscSegBufferDestroy(&vseg));
56728b400f6SJacob Faibussowitsch } else PetscCheck(!require, PETSC_COMM_SELF, PETSC_ERR_USER, "Unable to open options file %s", fname);
5689b754dc9SBarry Smith }
56905c7dedfSBarry Smith
5703a018368SJed Brown counts[0] = acnt;
5713a018368SJed Brown counts[1] = cnt;
5724201f521SBarry Smith err = MPI_Bcast(counts, 2, MPI_INT, 0, comm);
57328b400f6SJacob Faibussowitsch PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_LIB, "Error in first MPI collective call, could be caused by using an incorrect mpiexec or a network problem, it can be caused by having VPN running: see https://petsc.org/release/faq/");
5743a018368SJed Brown acnt = counts[0];
5753a018368SJed Brown cnt = counts[1];
57648a46eb9SPierre Jolivet if (rank) PetscCall(PetscMalloc1(2 + acnt + cnt, &packed));
5773a018368SJed Brown if (acnt || cnt) {
5789566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(packed, 2 + acnt + cnt, MPI_CHAR, 0, comm));
5793a018368SJed Brown astring = packed;
5803a018368SJed Brown vstring = packed + acnt + 1;
5813a018368SJed Brown }
5823a018368SJed Brown
5839b754dc9SBarry Smith if (acnt) {
5849566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(astring, ' ', &token));
5859566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &tokens[0]));
5867fb43599SVaclav Hapla while (tokens[0]) {
5879566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &tokens[1]));
5889566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetAlias(options, tokens[0], tokens[1]));
5899566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &tokens[0]));
5909b754dc9SBarry Smith }
5919566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token));
5929b754dc9SBarry Smith }
5939b754dc9SBarry Smith
5949355ec05SMatthew G. Knepley if (cnt) PetscCall(PetscOptionsInsertString_Private(options, vstring, PETSC_OPT_FILE));
5959566063dSJacob Faibussowitsch PetscCall(PetscFree(packed));
5963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
597e5c89e4eSSatish Balay }
598e5c89e4eSSatish Balay
5995d83a8b1SBarry Smith /*@
600be10d61cSLisandro Dalcin PetscOptionsInsertFile - Inserts options into the database from a file.
601be10d61cSLisandro Dalcin
602be10d61cSLisandro Dalcin Collective
603be10d61cSLisandro Dalcin
604d8d19677SJose E. Roman Input Parameters:
605811af0c4SBarry Smith + comm - the processes that will share the options (usually `PETSC_COMM_WORLD`)
60620f4b53cSBarry Smith . options - options database, use `NULL` for default global database
607be10d61cSLisandro Dalcin . file - name of file,
608be10d61cSLisandro Dalcin ".yml" and ".yaml" filename extensions are inserted as YAML options,
609be10d61cSLisandro Dalcin append ":yaml" to filename to force YAML options.
610811af0c4SBarry Smith - require - if `PETSC_TRUE` will generate an error if the file does not exist
611be10d61cSLisandro Dalcin
61220f4b53cSBarry Smith Level: developer
61320f4b53cSBarry Smith
614be10d61cSLisandro Dalcin Notes:
615be10d61cSLisandro Dalcin Use # for lines that are comments and which should be ignored.
616811af0c4SBarry Smith Usually, instead of using this command, one should list the file name in the call to `PetscInitialize()`, this insures that certain options
61721532e8aSBarry Smith such as `-log_view` or `-malloc_debug` are processed properly. This routine only sets options into the options database that will be processed by later
61821532e8aSBarry Smith calls to `XXXSetFromOptions()`, it should not be used for options listed under PetscInitialize().
61921532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes in comm will
62021532e8aSBarry Smith have the effect of these options. If some processes that create objects call this routine and others do
621be10d61cSLisandro Dalcin not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
622be10d61cSLisandro Dalcin on different ranks.
623be10d61cSLisandro Dalcin
624db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsView()`, `PetscOptionsHasName()`, `PetscOptionsGetInt()`,
625db781477SPatrick Sanan `PetscOptionsGetReal()`, `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`,
626db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
627c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
628db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
629db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
630be10d61cSLisandro Dalcin @*/
PetscOptionsInsertFile(MPI_Comm comm,PetscOptions options,const char file[],PetscBool require)631d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsInsertFile(MPI_Comm comm, PetscOptions options, const char file[], PetscBool require)
632d71ae5a4SJacob Faibussowitsch {
633be10d61cSLisandro Dalcin char filename[PETSC_MAX_PATH_LEN];
634be10d61cSLisandro Dalcin PetscBool yaml;
635be10d61cSLisandro Dalcin
636be10d61cSLisandro Dalcin PetscFunctionBegin;
6379566063dSJacob Faibussowitsch PetscCall(PetscOptionsFilename(comm, file, filename, &yaml));
638be10d61cSLisandro Dalcin if (yaml) {
6399566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFileYAML(comm, options, filename, require));
640be10d61cSLisandro Dalcin } else {
6419566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFilePetsc(comm, options, filename, require));
642be10d61cSLisandro Dalcin }
6433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
644be10d61cSLisandro Dalcin }
645be10d61cSLisandro Dalcin
646be10d61cSLisandro Dalcin /*@C
647d06005cbSLisandro Dalcin PetscOptionsInsertArgs - Inserts options into the database from a array of strings
648d06005cbSLisandro Dalcin
649d06005cbSLisandro Dalcin Logically Collective
650d06005cbSLisandro Dalcin
651d8d19677SJose E. Roman Input Parameters:
652d06005cbSLisandro Dalcin + options - options object
6536aad120cSJose E. Roman . argc - the array length
654d06005cbSLisandro Dalcin - args - the string array
655d06005cbSLisandro Dalcin
656d06005cbSLisandro Dalcin Level: intermediate
657d06005cbSLisandro Dalcin
658db781477SPatrick Sanan .seealso: `PetscOptions`, `PetscOptionsInsertString()`, `PetscOptionsInsertFile()`
659d06005cbSLisandro Dalcin @*/
PetscOptionsInsertArgs(PetscOptions options,int argc,const char * const args[])660ce78bad3SBarry Smith PetscErrorCode PetscOptionsInsertArgs(PetscOptions options, int argc, const char *const args[])
661d71ae5a4SJacob Faibussowitsch {
662d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_WORLD;
663d06005cbSLisandro Dalcin int left = PetscMax(argc, 0);
664ce78bad3SBarry Smith const char *const *eargs = args;
66585079163SJed Brown
66685079163SJed Brown PetscFunctionBegin;
66785079163SJed Brown while (left) {
668d06005cbSLisandro Dalcin PetscBool isfile, isfileyaml, isstringyaml, ispush, ispop, key;
6699566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0], "-options_file", &isfile));
6709566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0], "-options_file_yaml", &isfileyaml));
6719566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0], "-options_string_yaml", &isstringyaml));
6729566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0], "-prefix_push", &ispush));
6739566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(eargs[0], "-prefix_pop", &ispop));
6749566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(eargs[0], &key));
675093de6efSBarry Smith if (!key) {
6769371c9d4SSatish Balay eargs++;
6779371c9d4SSatish Balay left--;
678d06005cbSLisandro Dalcin } else if (isfile) {
679cc73adaaSBarry Smith PetscCheck(left > 1 && eargs[1][0] != '-', PETSC_COMM_SELF, PETSC_ERR_USER, "Missing filename for -options_file filename option");
6809566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, eargs[1], PETSC_TRUE));
6819371c9d4SSatish Balay eargs += 2;
6829371c9d4SSatish Balay left -= 2;
683d06005cbSLisandro Dalcin } else if (isfileyaml) {
684cc73adaaSBarry Smith PetscCheck(left > 1 && eargs[1][0] != '-', PETSC_COMM_SELF, PETSC_ERR_USER, "Missing filename for -options_file_yaml filename option");
6859566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFileYAML(comm, options, eargs[1], PETSC_TRUE));
6869371c9d4SSatish Balay eargs += 2;
6879371c9d4SSatish Balay left -= 2;
688d06005cbSLisandro Dalcin } else if (isstringyaml) {
689cc73adaaSBarry Smith PetscCheck(left > 1 && eargs[1][0] != '-', PETSC_COMM_SELF, PETSC_ERR_USER, "Missing string for -options_string_yaml string option");
6909355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertStringYAML_Private(options, eargs[1], PETSC_OPT_CODE));
6919371c9d4SSatish Balay eargs += 2;
6929371c9d4SSatish Balay left -= 2;
693d06005cbSLisandro Dalcin } else if (ispush) {
69408401ef6SPierre Jolivet PetscCheck(left > 1, PETSC_COMM_SELF, PETSC_ERR_USER, "Missing prefix for -prefix_push option");
695cc73adaaSBarry Smith PetscCheck(eargs[1][0] != '-', PETSC_COMM_SELF, PETSC_ERR_USER, "Missing prefix for -prefix_push option (prefixes cannot start with '-')");
6969566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPush(options, eargs[1]));
6979371c9d4SSatish Balay eargs += 2;
6989371c9d4SSatish Balay left -= 2;
699d06005cbSLisandro Dalcin } else if (ispop) {
7009566063dSJacob Faibussowitsch PetscCall(PetscOptionsPrefixPop(options));
7019371c9d4SSatish Balay eargs++;
7029371c9d4SSatish Balay left--;
7037935c3d8SJed Brown } else {
7047935c3d8SJed Brown PetscBool nextiskey = PETSC_FALSE;
7059566063dSJacob Faibussowitsch if (left >= 2) PetscCall(PetscOptionsValidKey(eargs[1], &nextiskey));
70698b6bf53SJed Brown if (left < 2 || nextiskey) {
7079355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, eargs[0], NULL, NULL, PETSC_OPT_COMMAND_LINE));
7089371c9d4SSatish Balay eargs++;
7099371c9d4SSatish Balay left--;
71085079163SJed Brown } else {
7119355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, eargs[0], eargs[1], NULL, PETSC_OPT_COMMAND_LINE));
7129371c9d4SSatish Balay eargs += 2;
7139371c9d4SSatish Balay left -= 2;
71485079163SJed Brown }
71585079163SJed Brown }
7167935c3d8SJed Brown }
7173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
71885079163SJed Brown }
71985079163SJed Brown
PetscOptionsStringToBoolIfSet_Private(enum PetscPrecedentOption opt,const char * val[],const PetscBool set[],PetscBool * flg)72010c654e6SJacob Faibussowitsch static inline PetscErrorCode PetscOptionsStringToBoolIfSet_Private(enum PetscPrecedentOption opt, const char *val[], const PetscBool set[], PetscBool *flg)
721d71ae5a4SJacob Faibussowitsch {
722c5b5d8d5SVaclav Hapla PetscFunctionBegin;
723ac530a7eSPierre Jolivet if (set[opt]) PetscCall(PetscOptionsStringToBool(val[opt], flg));
724ac530a7eSPierre Jolivet else *flg = PETSC_FALSE;
7253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
726c5b5d8d5SVaclav Hapla }
727c5b5d8d5SVaclav Hapla
728660278c0SBarry Smith /* Process options with absolute precedence, these are only processed from the command line, not the environment or files */
PetscOptionsProcessPrecedentFlags(PetscOptions options,int argc,char * args[],PetscBool * skip_petscrc,PetscBool * skip_petscrc_set)729d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscOptionsProcessPrecedentFlags(PetscOptions options, int argc, char *args[], PetscBool *skip_petscrc, PetscBool *skip_petscrc_set)
730d71ae5a4SJacob Faibussowitsch {
731c5b5d8d5SVaclav Hapla const char *const *opt = precedentOptions;
732c5b5d8d5SVaclav Hapla const size_t n = PO_NUM;
733c5b5d8d5SVaclav Hapla size_t o;
734c5b5d8d5SVaclav Hapla int a;
735c5b5d8d5SVaclav Hapla const char **val;
7360c99d500SBarry Smith char **cval;
737660278c0SBarry Smith PetscBool *set, unneeded;
738c5b5d8d5SVaclav Hapla
739c5b5d8d5SVaclav Hapla PetscFunctionBegin;
7400c99d500SBarry Smith PetscCall(PetscCalloc2(n, &cval, n, &set));
7410c99d500SBarry Smith val = (const char **)cval;
742c5b5d8d5SVaclav Hapla
743c5b5d8d5SVaclav Hapla /* Look for options possibly set using PetscOptionsSetValue beforehand */
74448a46eb9SPierre Jolivet for (o = 0; o < n; o++) PetscCall(PetscOptionsFindPair(options, NULL, opt[o], &val[o], &set[o]));
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
7509566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(args[a], &valid));
751c5b5d8d5SVaclav Hapla if (!valid) continue;
752c5b5d8d5SVaclav Hapla for (o = 0; o < n; o++) {
7539566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(args[a], opt[o], &eq));
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 */
7649566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(val[PO_HELP], "intro", &options->help_intro));
765d314f959SVaclav Hapla if (options->help_intro) options->help = PETSC_TRUE;
7669566063dSJacob Faibussowitsch else PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_HELP, val, set, &options->help));
767660278c0SBarry Smith PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_CI_ENABLE, val, set, &unneeded));
768660278c0SBarry Smith /* need to manage PO_CI_ENABLE option before the PetscOptionsMonitor is turned on, so its setting is not monitored */
7699355ec05SMatthew G. Knepley if (set[PO_CI_ENABLE]) PetscCall(PetscOptionsSetValue_Private(options, opt[PO_CI_ENABLE], val[PO_CI_ENABLE], &a, PETSC_OPT_COMMAND_LINE));
7709566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR_CANCEL, val, set, &options->monitorCancel));
7719566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR, val, set, &options->monitorFromOptions));
7729566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_SKIP_PETSCRC, val, set, skip_petscrc));
773c5b5d8d5SVaclav Hapla *skip_petscrc_set = set[PO_SKIP_PETSCRC];
774c5b5d8d5SVaclav Hapla
775c5b5d8d5SVaclav Hapla /* Store precedent options in database and mark them as used */
776660278c0SBarry Smith for (o = 1; o < n; o++) {
777c5b5d8d5SVaclav Hapla if (set[o]) {
7789355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, opt[o], val[o], &a, PETSC_OPT_COMMAND_LINE));
779d06005cbSLisandro Dalcin options->used[a] = PETSC_TRUE;
780c5b5d8d5SVaclav Hapla }
781c5b5d8d5SVaclav Hapla }
7820c99d500SBarry Smith PetscCall(PetscFree2(cval, set));
783c5b5d8d5SVaclav Hapla options->precedentProcessed = PETSC_TRUE;
7843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
785c5b5d8d5SVaclav Hapla }
786c5b5d8d5SVaclav Hapla
PetscOptionsSkipPrecedent(PetscOptions options,const char name[],PetscBool * flg)787d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscOptionsSkipPrecedent(PetscOptions options, const char name[], PetscBool *flg)
788d71ae5a4SJacob Faibussowitsch {
78939a651e2SJacob Faibussowitsch PetscFunctionBegin;
7904f572ea9SToby Isaac PetscAssertPointer(flg, 3);
791c5b5d8d5SVaclav Hapla *flg = PETSC_FALSE;
792c5b5d8d5SVaclav Hapla if (options->precedentProcessed) {
79339a651e2SJacob Faibussowitsch for (int i = 0; i < PO_NUM; ++i) {
794c5b5d8d5SVaclav Hapla if (!PetscOptNameCmp(precedentOptions[i], name)) {
795c5b5d8d5SVaclav Hapla /* check if precedent option has been set already */
7969566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, NULL, name, NULL, flg));
797c5b5d8d5SVaclav Hapla if (*flg) break;
798c5b5d8d5SVaclav Hapla }
799c5b5d8d5SVaclav Hapla }
800c5b5d8d5SVaclav Hapla }
8013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
802c5b5d8d5SVaclav Hapla }
80385079163SJed Brown
804e5c89e4eSSatish Balay /*@C
805e5c89e4eSSatish Balay PetscOptionsInsert - Inserts into the options database from the command line,
806e5c89e4eSSatish Balay the environmental variable and a file.
807e5c89e4eSSatish Balay
808811af0c4SBarry Smith Collective on `PETSC_COMM_WORLD`
8091c9f3c13SBarry Smith
810e5c89e4eSSatish Balay Input Parameters:
81120f4b53cSBarry Smith + options - options database or `NULL` for the default global database
812c5929fdfSBarry Smith . argc - count of number of command line arguments
813e5c89e4eSSatish Balay . args - the command line arguments
814be10d61cSLisandro Dalcin - file - [optional] PETSc database file, append ":yaml" to filename to specify YAML options format.
81520f4b53cSBarry Smith Use `NULL` or empty string to not check for code specific file.
816be10d61cSLisandro Dalcin Also checks ~/.petscrc, .petscrc and petscrc.
817c5b5d8d5SVaclav Hapla Use -skip_petscrc in the code specific file (or command line) to skip ~/.petscrc, .petscrc and petscrc files.
818e5c89e4eSSatish Balay
819081c24baSBoyana Norris Options Database Keys:
820d06005cbSLisandro Dalcin + -options_file <filename> - read options from a file
821d06005cbSLisandro Dalcin - -options_file_yaml <filename> - read options from a YAML file
822c5b5d8d5SVaclav Hapla
82320f4b53cSBarry Smith Level: advanced
82420f4b53cSBarry Smith
825811af0c4SBarry Smith Notes:
82620f4b53cSBarry Smith Since `PetscOptionsInsert()` is automatically called by `PetscInitialize()`,
827811af0c4SBarry Smith the user does not typically need to call this routine. `PetscOptionsInsert()`
828811af0c4SBarry Smith can be called several times, adding additional entries into the database.
829811af0c4SBarry Smith
830811af0c4SBarry Smith See `PetscInitialize()` for options related to option database monitoring.
831081c24baSBoyana Norris
832db781477SPatrick Sanan .seealso: `PetscOptionsDestroy()`, `PetscOptionsView()`, `PetscOptionsInsertString()`, `PetscOptionsInsertFile()`,
833db781477SPatrick Sanan `PetscInitialize()`
834e5c89e4eSSatish Balay @*/
PetscOptionsInsert(PetscOptions options,int * argc,char *** args,const char file[])835ce78bad3SBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options, int *argc, char ***args, const char file[]) PeNS
836d71ae5a4SJacob Faibussowitsch {
837d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_WORLD;
838e5c89e4eSSatish Balay PetscMPIInt rank;
839c5b5d8d5SVaclav Hapla PetscBool hasArgs = (argc && *argc) ? PETSC_TRUE : PETSC_FALSE;
840c5b5d8d5SVaclav Hapla PetscBool skipPetscrc = PETSC_FALSE, skipPetscrcSet = PETSC_FALSE;
8416497c311SBarry Smith char *eoptions = NULL;
8426497c311SBarry Smith size_t len = 0;
843e5c89e4eSSatish Balay
844e5c89e4eSSatish Balay PetscFunctionBegin;
84508401ef6SPierre Jolivet PetscCheck(!hasArgs || (args && *args), comm, PETSC_ERR_ARG_NULL, "*argc > 1 but *args not given");
8469566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank));
847e5c89e4eSSatish Balay
848c5b5d8d5SVaclav Hapla if (!options) {
8499566063dSJacob Faibussowitsch PetscCall(PetscOptionsCreateDefault());
850c5b5d8d5SVaclav Hapla options = defaultoptions;
851c5b5d8d5SVaclav Hapla }
852c5b5d8d5SVaclav Hapla if (hasArgs) {
853c5b5d8d5SVaclav Hapla /* process options with absolute precedence */
8549566063dSJacob Faibussowitsch PetscCall(PetscOptionsProcessPrecedentFlags(options, *argc, *args, &skipPetscrc, &skipPetscrcSet));
855660278c0SBarry Smith PetscCall(PetscOptionsGetBool(NULL, NULL, "-petsc_ci", &PetscCIEnabled, NULL));
856c5b5d8d5SVaclav Hapla }
8574b09e917SBarry Smith if (file && file[0]) {
8589566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, file, PETSC_TRUE));
859c5b5d8d5SVaclav Hapla /* if -skip_petscrc has not been set from command line, check whether it has been set in the file */
8609566063dSJacob Faibussowitsch if (!skipPetscrcSet) PetscCall(PetscOptionsGetBool(options, NULL, "-skip_petscrc", &skipPetscrc, NULL));
861321366bcSBarry Smith }
862c5b5d8d5SVaclav Hapla if (!skipPetscrc) {
863be10d61cSLisandro Dalcin char filename[PETSC_MAX_PATH_LEN];
8646497c311SBarry Smith
8659566063dSJacob Faibussowitsch PetscCall(PetscGetHomeDirectory(filename, sizeof(filename)));
8669566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(filename, (int)sizeof(filename), MPI_CHAR, 0, comm));
867c6a7a370SJeremy L Thompson if (filename[0]) PetscCall(PetscStrlcat(filename, "/.petscrc", sizeof(filename)));
8689566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, filename, PETSC_FALSE));
8699566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, ".petscrc", PETSC_FALSE));
8709566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, "petscrc", PETSC_FALSE));
871e5c89e4eSSatish Balay }
872e5c89e4eSSatish Balay
8732d747510SLisandro Dalcin /* insert environment options */
874dd400576SPatrick Sanan if (rank == 0) {
875835f2295SStefano Zampini eoptions = getenv("PETSC_OPTIONS");
8769566063dSJacob Faibussowitsch PetscCall(PetscStrlen(eoptions, &len));
877e5c89e4eSSatish Balay }
8789566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&len, 1, MPIU_SIZE_T, 0, comm));
879e5c89e4eSSatish Balay if (len) {
8809566063dSJacob Faibussowitsch if (rank) PetscCall(PetscMalloc1(len + 1, &eoptions));
8816497c311SBarry Smith PetscCallMPI(MPI_Bcast(eoptions, (PetscMPIInt)len, MPI_CHAR, 0, comm));
88296fc60bcSBarry Smith if (rank) eoptions[len] = 0;
8839355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertString_Private(options, eoptions, PETSC_OPT_ENVIRONMENT));
8849566063dSJacob Faibussowitsch if (rank) PetscCall(PetscFree(eoptions));
885e5c89e4eSSatish Balay }
886e5c89e4eSSatish Balay
887d06005cbSLisandro Dalcin /* insert YAML environment options */
888dd400576SPatrick Sanan if (rank == 0) {
889835f2295SStefano Zampini eoptions = getenv("PETSC_OPTIONS_YAML");
8909566063dSJacob Faibussowitsch PetscCall(PetscStrlen(eoptions, &len));
8919fc438c3SToby Isaac }
8929566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&len, 1, MPIU_SIZE_T, 0, comm));
8939fc438c3SToby Isaac if (len) {
8949566063dSJacob Faibussowitsch if (rank) PetscCall(PetscMalloc1(len + 1, &eoptions));
8956497c311SBarry Smith PetscCallMPI(MPI_Bcast(eoptions, (PetscMPIInt)len, MPI_CHAR, 0, comm));
8969fc438c3SToby Isaac if (rank) eoptions[len] = 0;
8979355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertStringYAML_Private(options, eoptions, PETSC_OPT_ENVIRONMENT));
8989566063dSJacob Faibussowitsch if (rank) PetscCall(PetscFree(eoptions));
8999fc438c3SToby Isaac }
9003bcbd388SSean Farley
901c5b5d8d5SVaclav Hapla /* insert command line options here because they take precedence over arguments in petscrc/environment */
902ce78bad3SBarry Smith if (hasArgs) PetscCall(PetscOptionsInsertArgs(options, *argc - 1, (const char *const *)*args + 1));
903660278c0SBarry Smith PetscCall(PetscOptionsGetBool(NULL, NULL, "-petsc_ci_portable_error_output", &PetscCIEnabledPortableErrorOutput, NULL));
9043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
905e5c89e4eSSatish Balay }
906e5c89e4eSSatish Balay
907660278c0SBarry Smith /* These options are not printed with PetscOptionsView() or PetscOptionsMonitor() when PetscCIEnabled is on */
908660278c0SBarry Smith /* TODO: get the list from the test harness, do not have it hardwired here. Maybe from gmakegentest.py */
909e9a33e21SBarry Smith static const char *PetscCIOptions[] = {"malloc_debug", "malloc_dump", "malloc_test", "malloc", "nox", "nox_warning", "display", "saws_port_auto_select", "saws_port_auto_select_silent", "vecscatter_mpi1", "check_pointer_intensity", "cuda_initialize", "error_output_stdout", "use_gpu_aware_mpi", "checkfunctionlist", "fp_trap", "petsc_ci", "petsc_ci_portable_error_output", "options_left"};
910660278c0SBarry Smith
PetscCIOption(const char * name)911d71ae5a4SJacob Faibussowitsch static PetscBool PetscCIOption(const char *name)
912d71ae5a4SJacob Faibussowitsch {
913660278c0SBarry Smith PetscInt idx;
914660278c0SBarry Smith PetscBool found;
915660278c0SBarry Smith
916660278c0SBarry Smith if (!PetscCIEnabled) return PETSC_FALSE;
9173ba16761SJacob Faibussowitsch PetscCallAbort(PETSC_COMM_SELF, PetscEListFind(PETSC_STATIC_ARRAY_LENGTH(PetscCIOptions), PetscCIOptions, name, &idx, &found));
918660278c0SBarry Smith return found;
919660278c0SBarry Smith }
920660278c0SBarry Smith
9215d83a8b1SBarry Smith /*@
92288c29154SBarry Smith PetscOptionsView - Prints the options that have been loaded. This is
923e5c89e4eSSatish Balay useful for debugging purposes.
924e5c89e4eSSatish Balay
925ffeef943SBarry Smith Logically Collective, No Fortran Support
926e5c89e4eSSatish Balay
927d8d19677SJose E. Roman Input Parameters:
92820f4b53cSBarry Smith + options - options database, use `NULL` for default global database
929811af0c4SBarry Smith - viewer - must be an `PETSCVIEWERASCII` viewer
930e5c89e4eSSatish Balay
931e5c89e4eSSatish Balay Options Database Key:
932811af0c4SBarry Smith . -options_view - Activates `PetscOptionsView()` within `PetscFinalize()`
933e5c89e4eSSatish Balay
93420f4b53cSBarry Smith Level: advanced
93520f4b53cSBarry Smith
936811af0c4SBarry Smith Note:
93721532e8aSBarry Smith Only the MPI rank 0 of the `MPI_Comm` used to create view prints the option values. Other processes
9381c9f3c13SBarry Smith may have different values but they are not printed.
9391c9f3c13SBarry Smith
940db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`
941e5c89e4eSSatish Balay @*/
PetscOptionsView(PetscOptions options,PetscViewer viewer)942d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsView(PetscOptions options, PetscViewer viewer)
943d71ae5a4SJacob Faibussowitsch {
944660278c0SBarry Smith PetscInt i, N = 0;
94588c29154SBarry Smith PetscBool isascii;
946e5c89e4eSSatish Balay
947e5c89e4eSSatish Balay PetscFunctionBegin;
9482d747510SLisandro Dalcin if (viewer) PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
949c5929fdfSBarry Smith options = options ? options : defaultoptions;
95088c29154SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD;
9519566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
95228b400f6SJacob Faibussowitsch PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Only supports ASCII viewer");
95388c29154SBarry Smith
954660278c0SBarry Smith for (i = 0; i < options->N; i++) {
955660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue;
956660278c0SBarry Smith N++;
957660278c0SBarry Smith }
958660278c0SBarry Smith
959660278c0SBarry Smith if (!N) {
9609566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "#No PETSc Option Table entries\n"));
9613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
96230694fe9SBarry Smith }
9632d747510SLisandro Dalcin
9649566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "#PETSc Option Table entries:\n"));
965e5c89e4eSSatish Balay for (i = 0; i < options->N; i++) {
966660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue;
967e5c89e4eSSatish Balay if (options->values[i]) {
9689355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "-%s %s", options->names[i], options->values[i]));
969e5c89e4eSSatish Balay } else {
9709355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "-%s", options->names[i]));
971e5c89e4eSSatish Balay }
9729355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, " # (source: %s)\n", PetscOptionSources[options->source[i]]));
973e5c89e4eSSatish Balay }
9749566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "#End of PETSc Option Table entries\n"));
9753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
976e5c89e4eSSatish Balay }
977e5c89e4eSSatish Balay
978e11779c2SBarry Smith /*
979e11779c2SBarry Smith Called by error handlers to print options used in run
980e11779c2SBarry Smith */
PetscOptionsLeftError(void)981d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeftError(void)
982d71ae5a4SJacob Faibussowitsch {
983f4bc716fSBarry Smith PetscInt i, nopt = 0;
984f4bc716fSBarry Smith
985f4bc716fSBarry Smith for (i = 0; i < defaultoptions->N; i++) {
986f4bc716fSBarry Smith if (!defaultoptions->used[i]) {
987f4bc716fSBarry Smith if (PetscCIOption(defaultoptions->names[i])) continue;
988f4bc716fSBarry Smith nopt++;
989f4bc716fSBarry Smith }
990f4bc716fSBarry Smith }
991f4bc716fSBarry Smith if (nopt) {
9927d44c3adSBarry Smith PetscCall((*PetscErrorPrintf)("WARNING! There are unused option(s) set! Could be the program crashed before usage or a spelling mistake, etc!\n"));
993f4bc716fSBarry Smith for (i = 0; i < defaultoptions->N; i++) {
994f4bc716fSBarry Smith if (!defaultoptions->used[i]) {
995f4bc716fSBarry Smith if (PetscCIOption(defaultoptions->names[i])) continue;
9963ba16761SJacob Faibussowitsch if (defaultoptions->values[i]) PetscCall((*PetscErrorPrintf)(" Option left: name:-%s value: %s source: %s\n", defaultoptions->names[i], defaultoptions->values[i], PetscOptionSources[defaultoptions->source[i]]));
9973ba16761SJacob Faibussowitsch else PetscCall((*PetscErrorPrintf)(" Option left: name:-%s (no value) source: %s\n", defaultoptions->names[i], PetscOptionSources[defaultoptions->source[i]]));
998f4bc716fSBarry Smith }
999f4bc716fSBarry Smith }
1000f4bc716fSBarry Smith }
10013ba16761SJacob Faibussowitsch return PETSC_SUCCESS;
1002f4bc716fSBarry Smith }
1003f4bc716fSBarry Smith
PetscOptionsViewError(void)1004d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void)
1005d71ae5a4SJacob Faibussowitsch {
1006660278c0SBarry Smith PetscInt i, N = 0;
10074416b707SBarry Smith PetscOptions options = defaultoptions;
1008e11779c2SBarry Smith
1009660278c0SBarry Smith for (i = 0; i < options->N; i++) {
1010660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue;
1011660278c0SBarry Smith N++;
1012660278c0SBarry Smith }
1013660278c0SBarry Smith
1014660278c0SBarry Smith if (N) {
10153ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("PETSc Option Table entries:\n"));
1016e11779c2SBarry Smith } else {
10173ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("No PETSc Option Table entries\n"));
1018e11779c2SBarry Smith }
1019e11779c2SBarry Smith for (i = 0; i < options->N; i++) {
1020660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue;
1021e11779c2SBarry Smith if (options->values[i]) {
10223ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("-%s %s (source: %s)\n", options->names[i], options->values[i], PetscOptionSources[options->source[i]]));
1023e11779c2SBarry Smith } else {
10243ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("-%s (source: %s)\n", options->names[i], PetscOptionSources[options->source[i]]));
1025e11779c2SBarry Smith }
1026e11779c2SBarry Smith }
10273ba16761SJacob Faibussowitsch return PETSC_SUCCESS;
1028e11779c2SBarry Smith }
1029e11779c2SBarry Smith
10305d83a8b1SBarry Smith /*@
103174e0666dSJed Brown PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow.
103274e0666dSJed Brown
10331c9f3c13SBarry Smith Logically Collective
103474e0666dSJed Brown
1035d8d19677SJose E. Roman Input Parameters:
103620f4b53cSBarry Smith + options - options database, or `NULL` for the default global database
1037c5929fdfSBarry Smith - prefix - The string to append to the existing prefix
10389db968c8SJed Brown
10399db968c8SJed Brown Options Database Keys:
10409db968c8SJed Brown + -prefix_push <some_prefix_> - push the given prefix
10419db968c8SJed Brown - -prefix_pop - pop the last prefix
10429db968c8SJed Brown
104320f4b53cSBarry Smith Level: advanced
104420f4b53cSBarry Smith
10459db968c8SJed Brown Notes:
104621532e8aSBarry Smith It is common to use this in conjunction with `-options_file` as in
10479314d9b7SBarry Smith .vb
10489314d9b7SBarry Smith -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop
10499314d9b7SBarry Smith .ve
105021532e8aSBarry Smith where the files no longer require all options to be prefixed with `-system2_`.
105174e0666dSJed Brown
105221532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will
10531c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do
10541c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
10551c9f3c13SBarry Smith on different ranks.
10561c9f3c13SBarry Smith
1057db781477SPatrick Sanan .seealso: `PetscOptionsPrefixPop()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsSetValue()`
105874e0666dSJed Brown @*/
PetscOptionsPrefixPush(PetscOptions options,const char prefix[])1059d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsPrefixPush(PetscOptions options, const char prefix[])
1060d71ae5a4SJacob Faibussowitsch {
106174e0666dSJed Brown size_t n;
106274e0666dSJed Brown PetscInt start;
10639355ec05SMatthew G. Knepley char key[PETSC_MAX_OPTION_NAME + 1];
10642d747510SLisandro Dalcin PetscBool valid;
106574e0666dSJed Brown
106674e0666dSJed Brown PetscFunctionBegin;
10674f572ea9SToby Isaac PetscAssertPointer(prefix, 2);
1068c5929fdfSBarry Smith options = options ? options : defaultoptions;
106900045ab3SPierre Jolivet PetscCheck(options->prefixind < MAXPREFIXES, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Maximum depth of prefix stack %d exceeded, recompile src/sys/objects/options.c with larger value for MAXPREFIXES", MAXPREFIXES);
10702d747510SLisandro Dalcin key[0] = '-'; /* keys must start with '-' */
10719566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key + 1, prefix, sizeof(key) - 1));
10729566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key, &valid));
10738bf569ecSLisandro 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 */
107428b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_USER, "Given prefix \"%s\" not valid (the first character must be a letter%s, do not include leading '-')", prefix, options->prefixind ? " or digit" : "");
107574e0666dSJed Brown start = options->prefixind ? options->prefixstack[options->prefixind - 1] : 0;
10769566063dSJacob Faibussowitsch PetscCall(PetscStrlen(prefix, &n));
107708401ef6SPierre Jolivet PetscCheck(n + 1 <= sizeof(options->prefix) - start, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Maximum prefix length %zu exceeded", sizeof(options->prefix));
10789566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(options->prefix + start, prefix, n + 1));
10796497c311SBarry Smith options->prefixstack[options->prefixind++] = (int)(start + n);
10803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
108174e0666dSJed Brown }
108274e0666dSJed Brown
10835d83a8b1SBarry Smith /*@
1084811af0c4SBarry Smith PetscOptionsPrefixPop - Remove the latest options prefix, see `PetscOptionsPrefixPush()` for details
108574e0666dSJed Brown
1086811af0c4SBarry Smith Logically Collective on the `MPI_Comm` used when called `PetscOptionsPrefixPush()`
108774e0666dSJed Brown
1088811af0c4SBarry Smith Input Parameter:
108920f4b53cSBarry Smith . options - options database, or `NULL` for the default global database
1090c5929fdfSBarry Smith
109174e0666dSJed Brown Level: advanced
109274e0666dSJed Brown
1093db781477SPatrick Sanan .seealso: `PetscOptionsPrefixPush()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsSetValue()`
109474e0666dSJed Brown @*/
PetscOptionsPrefixPop(PetscOptions options)1095d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsPrefixPop(PetscOptions options)
1096d71ae5a4SJacob Faibussowitsch {
109774e0666dSJed Brown PetscInt offset;
109874e0666dSJed Brown
109974e0666dSJed Brown PetscFunctionBegin;
1100c5929fdfSBarry Smith options = options ? options : defaultoptions;
110108401ef6SPierre Jolivet PetscCheck(options->prefixind >= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "More prefixes popped than pushed");
110274e0666dSJed Brown options->prefixind--;
110374e0666dSJed Brown offset = options->prefixind ? options->prefixstack[options->prefixind - 1] : 0;
110474e0666dSJed Brown options->prefix[offset] = 0;
11053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
110674e0666dSJed Brown }
110774e0666dSJed Brown
11085d83a8b1SBarry Smith /*@
1109a542b6e8SBarry Smith PetscOptionsClear - Removes all options form the database leaving it empty.
1110a542b6e8SBarry Smith
11111c9f3c13SBarry Smith Logically Collective
11121c9f3c13SBarry Smith
1113811af0c4SBarry Smith Input Parameter:
111420f4b53cSBarry Smith . options - options database, use `NULL` for the default global database
1115c5929fdfSBarry Smith
111620f4b53cSBarry Smith Level: developer
111720f4b53cSBarry Smith
111820f4b53cSBarry Smith Note:
111921532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will
11201c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do
11211c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
11221c9f3c13SBarry Smith on different ranks.
11231c9f3c13SBarry Smith
11247e6f8dd6SBarry Smith Developer Note:
11257e6f8dd6SBarry Smith Uses `free()` directly because the current option values were set with `malloc()`
11267e6f8dd6SBarry Smith
1127db781477SPatrick Sanan .seealso: `PetscOptionsInsert()`
1128a542b6e8SBarry Smith @*/
PetscOptionsClear(PetscOptions options)1129d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsClear(PetscOptions options)
1130d71ae5a4SJacob Faibussowitsch {
1131a542b6e8SBarry Smith PetscInt i;
1132a542b6e8SBarry Smith
113339a651e2SJacob Faibussowitsch PetscFunctionBegin;
1134c5929fdfSBarry Smith options = options ? options : defaultoptions;
11353ba16761SJacob Faibussowitsch if (!options) PetscFunctionReturn(PETSC_SUCCESS);
11362d747510SLisandro Dalcin
1137a542b6e8SBarry Smith for (i = 0; i < options->N; i++) {
1138a542b6e8SBarry Smith if (options->names[i]) free(options->names[i]);
1139a542b6e8SBarry Smith if (options->values[i]) free(options->values[i]);
1140a542b6e8SBarry Smith }
11412d747510SLisandro Dalcin options->N = 0;
11429355ec05SMatthew G. Knepley free(options->names);
11439355ec05SMatthew G. Knepley free(options->values);
11449355ec05SMatthew G. Knepley free(options->used);
11459355ec05SMatthew G. Knepley free(options->source);
11469355ec05SMatthew G. Knepley options->names = NULL;
11479355ec05SMatthew G. Knepley options->values = NULL;
11489355ec05SMatthew G. Knepley options->used = NULL;
11499355ec05SMatthew G. Knepley options->source = NULL;
11509355ec05SMatthew G. Knepley options->Nalloc = 0;
11512d747510SLisandro Dalcin
11529355ec05SMatthew G. Knepley for (i = 0; i < options->Na; i++) {
1153a542b6e8SBarry Smith free(options->aliases1[i]);
1154a542b6e8SBarry Smith free(options->aliases2[i]);
1155a542b6e8SBarry Smith }
11569355ec05SMatthew G. Knepley options->Na = 0;
11579355ec05SMatthew G. Knepley free(options->aliases1);
11589355ec05SMatthew G. Knepley free(options->aliases2);
11599355ec05SMatthew G. Knepley options->aliases1 = options->aliases2 = NULL;
11609355ec05SMatthew G. Knepley options->Naalloc = 0;
1161a542b6e8SBarry Smith
11622d747510SLisandro Dalcin /* destroy hash table */
11632d747510SLisandro Dalcin kh_destroy(HO, options->ht);
11642d747510SLisandro Dalcin options->ht = NULL;
11650eb63584SBarry Smith
11662d747510SLisandro Dalcin options->prefixind = 0;
11672d747510SLisandro Dalcin options->prefix[0] = 0;
11682d747510SLisandro Dalcin options->help = PETSC_FALSE;
11699355ec05SMatthew G. Knepley options->help_intro = PETSC_FALSE;
11703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
11714416b707SBarry Smith }
11724416b707SBarry Smith
11735d83a8b1SBarry Smith /*@
11742d747510SLisandro Dalcin PetscOptionsSetAlias - Makes a key and alias for another key
11752d747510SLisandro Dalcin
11761c9f3c13SBarry Smith Logically Collective
11772d747510SLisandro Dalcin
11782d747510SLisandro Dalcin Input Parameters:
117920f4b53cSBarry Smith + options - options database, or `NULL` for default global database
11802d747510SLisandro Dalcin . newname - the alias
11812d747510SLisandro Dalcin - oldname - the name that alias will refer to
11822d747510SLisandro Dalcin
11832d747510SLisandro Dalcin Level: advanced
11842d747510SLisandro Dalcin
118520f4b53cSBarry Smith Note:
118621532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will
11871c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do
11881c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
11891c9f3c13SBarry Smith on different ranks.
11901c9f3c13SBarry Smith
11917e6f8dd6SBarry Smith Developer Note:
11927e6f8dd6SBarry Smith Uses `malloc()` directly because PETSc may not be initialized yet.
11937e6f8dd6SBarry Smith
11940241b274SPierre Jolivet .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`,
1195c2e3fba1SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
1196db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
1197c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
1198db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
1199db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
12002d747510SLisandro Dalcin @*/
PetscOptionsSetAlias(PetscOptions options,const char newname[],const char oldname[])1201d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsSetAlias(PetscOptions options, const char newname[], const char oldname[])
1202d71ae5a4SJacob Faibussowitsch {
12032d747510SLisandro Dalcin size_t len;
12049210b8eaSVaclav Hapla PetscBool valid;
12052d747510SLisandro Dalcin
12062d747510SLisandro Dalcin PetscFunctionBegin;
12074f572ea9SToby Isaac PetscAssertPointer(newname, 2);
12084f572ea9SToby Isaac PetscAssertPointer(oldname, 3);
12092d747510SLisandro Dalcin options = options ? options : defaultoptions;
12109566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(newname, &valid));
121128b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid aliased option %s", newname);
12129566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(oldname, &valid));
121328b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid aliasee option %s", oldname);
12142d747510SLisandro Dalcin
12159355ec05SMatthew G. Knepley if (options->Na == options->Naalloc) {
12169355ec05SMatthew G. Knepley char **tmpA1, **tmpA2;
12172d747510SLisandro Dalcin
12189355ec05SMatthew G. Knepley options->Naalloc = PetscMax(4, options->Naalloc * 2);
12199355ec05SMatthew G. Knepley tmpA1 = (char **)malloc(options->Naalloc * sizeof(char *));
12209355ec05SMatthew G. Knepley tmpA2 = (char **)malloc(options->Naalloc * sizeof(char *));
12219355ec05SMatthew G. Knepley for (int i = 0; i < options->Na; ++i) {
12229355ec05SMatthew G. Knepley tmpA1[i] = options->aliases1[i];
12239355ec05SMatthew G. Knepley tmpA2[i] = options->aliases2[i];
12249355ec05SMatthew G. Knepley }
12259355ec05SMatthew G. Knepley free(options->aliases1);
12269355ec05SMatthew G. Knepley free(options->aliases2);
12279355ec05SMatthew G. Knepley options->aliases1 = tmpA1;
12289355ec05SMatthew G. Knepley options->aliases2 = tmpA2;
12299355ec05SMatthew G. Knepley }
12309371c9d4SSatish Balay newname++;
12319371c9d4SSatish Balay oldname++;
12329566063dSJacob Faibussowitsch PetscCall(PetscStrlen(newname, &len));
12339355ec05SMatthew G. Knepley options->aliases1[options->Na] = (char *)malloc((len + 1) * sizeof(char));
1234c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(options->aliases1[options->Na], newname, len + 1));
12359566063dSJacob Faibussowitsch PetscCall(PetscStrlen(oldname, &len));
12369355ec05SMatthew G. Knepley options->aliases2[options->Na] = (char *)malloc((len + 1) * sizeof(char));
1237c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(options->aliases2[options->Na], oldname, len + 1));
12389355ec05SMatthew G. Knepley ++options->Na;
12393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
12402d747510SLisandro Dalcin }
12414416b707SBarry Smith
12425d83a8b1SBarry Smith /*@
1243e5c89e4eSSatish Balay PetscOptionsSetValue - Sets an option name-value pair in the options
1244e5c89e4eSSatish Balay database, overriding whatever is already present.
1245e5c89e4eSSatish Balay
12461c9f3c13SBarry Smith Logically Collective
1247e5c89e4eSSatish Balay
1248e5c89e4eSSatish Balay Input Parameters:
124920f4b53cSBarry Smith + options - options database, use `NULL` for the default global database
1250c5929fdfSBarry Smith . name - name of option, this SHOULD have the - prepended
125120f4b53cSBarry Smith - value - the option value (not used for all options, so can be `NULL`)
1252e5c89e4eSSatish Balay
1253e5c89e4eSSatish Balay Level: intermediate
1254e5c89e4eSSatish Balay
1255e5c89e4eSSatish Balay Note:
1256811af0c4SBarry Smith This function can be called BEFORE `PetscInitialize()`
1257d49172ceSBarry Smith
125821532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will
12591c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do
12601c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
12611c9f3c13SBarry Smith on different ranks.
12621c9f3c13SBarry Smith
12637e6f8dd6SBarry Smith Developer Note:
12647e6f8dd6SBarry Smith Uses `malloc()` directly because PETSc may not be initialized yet.
1265b0250c70SBarry Smith
1266db781477SPatrick Sanan .seealso: `PetscOptionsInsert()`, `PetscOptionsClearValue()`
1267e5c89e4eSSatish Balay @*/
PetscOptionsSetValue(PetscOptions options,const char name[],const char value[])1268d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsSetValue(PetscOptions options, const char name[], const char value[])
1269d71ae5a4SJacob Faibussowitsch {
127039a651e2SJacob Faibussowitsch PetscFunctionBegin;
12719355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, name, value, NULL, PETSC_OPT_CODE));
12723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1273c5b5d8d5SVaclav Hapla }
1274c5b5d8d5SVaclav Hapla
PetscOptionsSetValue_Private(PetscOptions options,const char name[],const char value[],int * pos,PetscOptionSource source)12759355ec05SMatthew G. Knepley PetscErrorCode PetscOptionsSetValue_Private(PetscOptions options, const char name[], const char value[], int *pos, PetscOptionSource source)
1276d71ae5a4SJacob Faibussowitsch {
1277e5c89e4eSSatish Balay size_t len;
12789355ec05SMatthew G. Knepley int n, i;
1279e5c89e4eSSatish Balay char **names;
12809355ec05SMatthew G. Knepley char fullname[PETSC_MAX_OPTION_NAME] = "";
1281c5b5d8d5SVaclav Hapla PetscBool flg;
1282e5c89e4eSSatish Balay
128339a651e2SJacob Faibussowitsch PetscFunctionBegin;
12847272c0d2SVaclav Hapla if (!options) {
12859566063dSJacob Faibussowitsch PetscCall(PetscOptionsCreateDefault());
12867272c0d2SVaclav Hapla options = defaultoptions;
1287c5929fdfSBarry Smith }
128839a651e2SJacob Faibussowitsch PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "name %s must start with '-'", name);
12892d747510SLisandro Dalcin
12909566063dSJacob Faibussowitsch PetscCall(PetscOptionsSkipPrecedent(options, name, &flg));
12913ba16761SJacob Faibussowitsch if (flg) PetscFunctionReturn(PETSC_SUCCESS);
1292e5c89e4eSSatish Balay
12932d747510SLisandro Dalcin name++; /* skip starting dash */
12942d747510SLisandro Dalcin
129574e0666dSJed Brown if (options->prefixind > 0) {
1296d49172ceSBarry Smith strncpy(fullname, options->prefix, sizeof(fullname));
12972d747510SLisandro Dalcin fullname[sizeof(fullname) - 1] = 0;
129889ae1891SBarry Smith strncat(fullname, name, sizeof(fullname) - strlen(fullname) - 1);
12992d747510SLisandro Dalcin fullname[sizeof(fullname) - 1] = 0;
130074e0666dSJed Brown name = fullname;
130174e0666dSJed Brown }
130274e0666dSJed Brown
130374e0666dSJed Brown /* check against aliases */
13049355ec05SMatthew G. Knepley for (i = 0; i < options->Na; i++) {
13052d747510SLisandro Dalcin int result = PetscOptNameCmp(options->aliases1[i], name);
13069371c9d4SSatish Balay if (!result) {
13079371c9d4SSatish Balay name = options->aliases2[i];
13089371c9d4SSatish Balay break;
13099371c9d4SSatish Balay }
1310e5c89e4eSSatish Balay }
1311e5c89e4eSSatish Balay
13122d747510SLisandro Dalcin /* slow search */
13139355ec05SMatthew G. Knepley n = options->N;
1314e5c89e4eSSatish Balay names = options->names;
13159355ec05SMatthew G. Knepley for (i = 0; i < options->N; i++) {
13162d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i], name);
13172d747510SLisandro Dalcin if (!result) {
13189371c9d4SSatish Balay n = i;
13199371c9d4SSatish Balay goto setvalue;
13202d747510SLisandro Dalcin } else if (result > 0) {
13219371c9d4SSatish Balay n = i;
13229371c9d4SSatish Balay break;
1323e5c89e4eSSatish Balay }
1324e5c89e4eSSatish Balay }
13259355ec05SMatthew G. Knepley if (options->N == options->Nalloc) {
13269355ec05SMatthew G. Knepley char **names, **values;
13279355ec05SMatthew G. Knepley PetscBool *used;
13289355ec05SMatthew G. Knepley PetscOptionSource *source;
13299355ec05SMatthew G. Knepley
13309355ec05SMatthew G. Knepley options->Nalloc = PetscMax(10, options->Nalloc * 2);
13319355ec05SMatthew G. Knepley names = (char **)malloc(options->Nalloc * sizeof(char *));
13329355ec05SMatthew G. Knepley values = (char **)malloc(options->Nalloc * sizeof(char *));
13339355ec05SMatthew G. Knepley used = (PetscBool *)malloc(options->Nalloc * sizeof(PetscBool));
13349355ec05SMatthew G. Knepley source = (PetscOptionSource *)malloc(options->Nalloc * sizeof(PetscOptionSource));
13359355ec05SMatthew G. Knepley for (int i = 0; i < options->N; ++i) {
13369355ec05SMatthew G. Knepley names[i] = options->names[i];
13379355ec05SMatthew G. Knepley values[i] = options->values[i];
13389355ec05SMatthew G. Knepley used[i] = options->used[i];
13399355ec05SMatthew G. Knepley source[i] = options->source[i];
13409355ec05SMatthew G. Knepley }
13419355ec05SMatthew G. Knepley free(options->names);
13429355ec05SMatthew G. Knepley free(options->values);
13439355ec05SMatthew G. Knepley free(options->used);
13449355ec05SMatthew G. Knepley free(options->source);
13459355ec05SMatthew G. Knepley options->names = names;
13469355ec05SMatthew G. Knepley options->values = values;
13479355ec05SMatthew G. Knepley options->used = used;
13489355ec05SMatthew G. Knepley options->source = source;
13499355ec05SMatthew G. Knepley }
135039a651e2SJacob Faibussowitsch
13512d747510SLisandro Dalcin /* shift remaining values up 1 */
13529355ec05SMatthew G. Knepley for (i = options->N; i > n; i--) {
13535e8c5e88SLisandro Dalcin options->names[i] = options->names[i - 1];
1354e5c89e4eSSatish Balay options->values[i] = options->values[i - 1];
1355e5c89e4eSSatish Balay options->used[i] = options->used[i - 1];
13569355ec05SMatthew G. Knepley options->source[i] = options->source[i - 1];
1357e5c89e4eSSatish Balay }
13582d747510SLisandro Dalcin options->names[n] = NULL;
13592d747510SLisandro Dalcin options->values[n] = NULL;
13602d747510SLisandro Dalcin options->used[n] = PETSC_FALSE;
13619355ec05SMatthew G. Knepley options->source[n] = PETSC_OPT_CODE;
13622d747510SLisandro Dalcin options->N++;
13632d747510SLisandro Dalcin
13642d747510SLisandro Dalcin /* destroy hash table */
13652d747510SLisandro Dalcin kh_destroy(HO, options->ht);
13662d747510SLisandro Dalcin options->ht = NULL;
13672d747510SLisandro Dalcin
13682d747510SLisandro Dalcin /* set new name */
136970d8d27cSBarry Smith len = strlen(name);
13705e8c5e88SLisandro Dalcin options->names[n] = (char *)malloc((len + 1) * sizeof(char));
137139a651e2SJacob Faibussowitsch PetscCheck(options->names[n], PETSC_COMM_SELF, PETSC_ERR_MEM, "Failed to allocate option name");
1372d49172ceSBarry Smith strcpy(options->names[n], name);
13732d747510SLisandro Dalcin
13742d747510SLisandro Dalcin setvalue:
13752d747510SLisandro Dalcin /* set new value */
13762d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]);
1377d49172ceSBarry Smith len = value ? strlen(value) : 0;
13785e8c5e88SLisandro Dalcin if (len) {
1379e5c89e4eSSatish Balay options->values[n] = (char *)malloc((len + 1) * sizeof(char));
1380d49172ceSBarry Smith if (!options->values[n]) return PETSC_ERR_MEM;
1381d49172ceSBarry Smith strcpy(options->values[n], value);
1382432b765aSRené Chenard options->values[n][len] = '\0';
13832d747510SLisandro Dalcin } else {
13842d747510SLisandro Dalcin options->values[n] = NULL;
13852d747510SLisandro Dalcin }
13869355ec05SMatthew G. Knepley options->source[n] = source;
13872d747510SLisandro Dalcin
138891ad3481SVaclav Hapla /* handle -help so that it can be set from anywhere */
138991ad3481SVaclav Hapla if (!PetscOptNameCmp(name, "help")) {
139091ad3481SVaclav Hapla options->help = PETSC_TRUE;
1391d06005cbSLisandro Dalcin options->help_intro = (value && !PetscOptNameCmp(value, "intro")) ? PETSC_TRUE : PETSC_FALSE;
139291ad3481SVaclav Hapla options->used[n] = PETSC_TRUE;
139391ad3481SVaclav Hapla }
139491ad3481SVaclav Hapla
1395432b765aSRené Chenard PetscCall(PetscOptionsMonitor(options, name, value ? value : "", source));
1396c5b5d8d5SVaclav Hapla if (pos) *pos = n;
13973ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1398e5c89e4eSSatish Balay }
1399e5c89e4eSSatish Balay
14005d83a8b1SBarry Smith /*@
1401e5c89e4eSSatish Balay PetscOptionsClearValue - Clears an option name-value pair in the options
1402e5c89e4eSSatish Balay database, overriding whatever is already present.
1403e5c89e4eSSatish Balay
14041c9f3c13SBarry Smith Logically Collective
1405e5c89e4eSSatish Balay
1406d8d19677SJose E. Roman Input Parameters:
140720f4b53cSBarry Smith + options - options database, use `NULL` for the default global database
1408a2b725a8SWilliam Gropp - name - name of option, this SHOULD have the - prepended
1409e5c89e4eSSatish Balay
1410e5c89e4eSSatish Balay Level: intermediate
1411e5c89e4eSSatish Balay
1412811af0c4SBarry Smith Note:
141321532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will
14141c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do
14151c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options
14161c9f3c13SBarry Smith on different ranks.
14171c9f3c13SBarry Smith
14187e6f8dd6SBarry Smith Developer Note:
14197e6f8dd6SBarry Smith Uses `free()` directly because the options have been set with `malloc()`
14207e6f8dd6SBarry Smith
1421db781477SPatrick Sanan .seealso: `PetscOptionsInsert()`
1422e5c89e4eSSatish Balay @*/
PetscOptionsClearValue(PetscOptions options,const char name[])1423d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsClearValue(PetscOptions options, const char name[])
1424d71ae5a4SJacob Faibussowitsch {
14252d747510SLisandro Dalcin int N, n, i;
14262d747510SLisandro Dalcin char **names;
1427e5c89e4eSSatish Balay
1428e5c89e4eSSatish Balay PetscFunctionBegin;
1429c5929fdfSBarry Smith options = options ? options : defaultoptions;
1430cc73adaaSBarry Smith PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Name must begin with '-': Instead %s", name);
1431c9dcd962SLisandro Dalcin if (!PetscOptNameCmp(name, "-help")) options->help = options->help_intro = PETSC_FALSE;
14322d747510SLisandro Dalcin
14332d747510SLisandro Dalcin name++; /* skip starting dash */
14342d747510SLisandro Dalcin
14352d747510SLisandro Dalcin /* slow search */
14362d747510SLisandro Dalcin N = n = options->N;
1437e5c89e4eSSatish Balay names = options->names;
1438e5c89e4eSSatish Balay for (i = 0; i < N; i++) {
14392d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i], name);
14402d747510SLisandro Dalcin if (!result) {
14419371c9d4SSatish Balay n = i;
14429371c9d4SSatish Balay break;
14432d747510SLisandro Dalcin } else if (result > 0) {
14449371c9d4SSatish Balay n = N;
14459371c9d4SSatish Balay break;
1446e5c89e4eSSatish Balay }
14472d747510SLisandro Dalcin }
14483ba16761SJacob Faibussowitsch if (n == N) PetscFunctionReturn(PETSC_SUCCESS); /* it was not present */
1449e5c89e4eSSatish Balay
14502d747510SLisandro Dalcin /* remove name and value */
14512d747510SLisandro Dalcin if (options->names[n]) free(options->names[n]);
14522d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]);
1453e5c89e4eSSatish Balay /* shift remaining values down 1 */
1454e5c89e4eSSatish Balay for (i = n; i < N - 1; i++) {
14555e8c5e88SLisandro Dalcin options->names[i] = options->names[i + 1];
1456e5c89e4eSSatish Balay options->values[i] = options->values[i + 1];
1457e5c89e4eSSatish Balay options->used[i] = options->used[i + 1];
14589355ec05SMatthew G. Knepley options->source[i] = options->source[i + 1];
1459e5c89e4eSSatish Balay }
1460e5c89e4eSSatish Balay options->N--;
14612d747510SLisandro Dalcin
14622d747510SLisandro Dalcin /* destroy hash table */
14632d747510SLisandro Dalcin kh_destroy(HO, options->ht);
14642d747510SLisandro Dalcin options->ht = NULL;
14652d747510SLisandro Dalcin
14669355ec05SMatthew G. Knepley PetscCall(PetscOptionsMonitor(options, name, NULL, PETSC_OPT_CODE));
14673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1468e5c89e4eSSatish Balay }
1469e5c89e4eSSatish Balay
1470e5c89e4eSSatish Balay /*@C
14712d747510SLisandro Dalcin PetscOptionsFindPair - Gets an option name-value pair from the options database.
1472e5c89e4eSSatish Balay
14732d747510SLisandro Dalcin Not Collective
1474e5c89e4eSSatish Balay
1475e5c89e4eSSatish Balay Input Parameters:
147620f4b53cSBarry Smith + options - options database, use `NULL` for the default global database
147720f4b53cSBarry Smith . pre - the string to prepend to the name or `NULL`, this SHOULD NOT have the "-" prepended
14782d747510SLisandro Dalcin - name - name of option, this SHOULD have the "-" prepended
1479e5c89e4eSSatish Balay
14802d747510SLisandro Dalcin Output Parameters:
14812d747510SLisandro Dalcin + value - the option value (optional, not used for all options)
14822d747510SLisandro Dalcin - set - whether the option is set (optional)
1483e5c89e4eSSatish Balay
148420f4b53cSBarry Smith Level: developer
148520f4b53cSBarry Smith
1486811af0c4SBarry Smith Note:
14879666a313SBarry Smith Each process may find different values or no value depending on how options were inserted into the database
14881c9f3c13SBarry Smith
1489db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsClearValue()`
1490e5c89e4eSSatish Balay @*/
PetscOptionsFindPair(PetscOptions options,const char pre[],const char name[],const char * value[],PetscBool * set)1491d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsFindPair(PetscOptions options, const char pre[], const char name[], const char *value[], PetscBool *set)
1492d71ae5a4SJacob Faibussowitsch {
14939355ec05SMatthew G. Knepley char buf[PETSC_MAX_OPTION_NAME];
14942d747510SLisandro Dalcin PetscBool matchnumbers = PETSC_TRUE;
1495e5c89e4eSSatish Balay
1496e5c89e4eSSatish Balay PetscFunctionBegin;
1497b33a4df8SMatthew G. Knepley if (!options) {
1498b33a4df8SMatthew G. Knepley PetscCall(PetscOptionsCreateDefault());
1499b33a4df8SMatthew G. Knepley options = defaultoptions;
1500b33a4df8SMatthew G. Knepley }
150108401ef6SPierre Jolivet PetscCheck(!pre || !PetscUnlikely(pre[0] == '-'), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Prefix cannot begin with '-': Instead %s", pre);
1502cc73adaaSBarry Smith PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Name must begin with '-': Instead %s", name);
1503e5c89e4eSSatish Balay
15042d747510SLisandro Dalcin name++; /* skip starting dash */
1505e5c89e4eSSatish Balay
15067cd08cecSJed Brown /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */
15072d747510SLisandro Dalcin if (pre && pre[0]) {
15082d747510SLisandro Dalcin char *ptr = buf;
15099371c9d4SSatish Balay if (name[0] == '-') {
15109371c9d4SSatish Balay *ptr++ = '-';
15119371c9d4SSatish Balay name++;
15129371c9d4SSatish Balay }
15139566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(ptr, pre, buf + sizeof(buf) - ptr));
15149566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(buf, name, sizeof(buf)));
15152d747510SLisandro Dalcin name = buf;
15167cd08cecSJed Brown }
15172d747510SLisandro Dalcin
151876bd3646SJed Brown if (PetscDefined(USE_DEBUG)) {
15192f828895SJed Brown PetscBool valid;
15209355ec05SMatthew G. Knepley char key[PETSC_MAX_OPTION_NAME + 1] = "-";
15219566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key + 1, name, sizeof(key) - 1));
15229566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key, &valid));
152328b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid option '%s' obtained from pre='%s' and name='%s'", key, pre ? pre : "", name);
15242f828895SJed Brown }
1525e5c89e4eSSatish Balay
152608d7fc57SRené Chenard if (!options->ht) {
15272d747510SLisandro Dalcin int i, ret;
15282d747510SLisandro Dalcin khiter_t it;
15292d747510SLisandro Dalcin khash_t(HO) *ht;
15302d747510SLisandro Dalcin ht = kh_init(HO);
153128b400f6SJacob Faibussowitsch PetscCheck(ht, PETSC_COMM_SELF, PETSC_ERR_MEM, "Hash table allocation failed");
15322d747510SLisandro Dalcin ret = kh_resize(HO, ht, options->N * 2); /* twice the required size to reduce risk of collisions */
153328b400f6SJacob Faibussowitsch PetscCheck(!ret, PETSC_COMM_SELF, PETSC_ERR_MEM, "Hash table allocation failed");
15342d747510SLisandro Dalcin for (i = 0; i < options->N; i++) {
15352d747510SLisandro Dalcin it = kh_put(HO, ht, options->names[i], &ret);
153608401ef6SPierre Jolivet PetscCheck(ret == 1, PETSC_COMM_SELF, PETSC_ERR_MEM, "Hash table allocation failed");
15372d747510SLisandro Dalcin kh_val(ht, it) = i;
15382d747510SLisandro Dalcin }
15392d747510SLisandro Dalcin options->ht = ht;
15402d747510SLisandro Dalcin }
15412d747510SLisandro Dalcin
15422d747510SLisandro Dalcin khash_t(HO) *ht = options->ht;
15432d747510SLisandro Dalcin khiter_t it = kh_get(HO, ht, name);
15442d747510SLisandro Dalcin if (it != kh_end(ht)) {
15452d747510SLisandro Dalcin int i = kh_val(ht, it);
1546e5c89e4eSSatish Balay options->used[i] = PETSC_TRUE;
15472d747510SLisandro Dalcin if (value) *value = options->values[i];
15482d747510SLisandro Dalcin if (set) *set = PETSC_TRUE;
15493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
15502d747510SLisandro Dalcin }
15512d747510SLisandro Dalcin
15522d747510SLisandro Dalcin /*
15532d747510SLisandro Dalcin The following block slows down all lookups in the most frequent path (most lookups are unsuccessful).
15542d747510SLisandro Dalcin Maybe this special lookup mode should be enabled on request with a push/pop API.
15552d747510SLisandro Dalcin The feature of matching _%d_ used sparingly in the codebase.
15562d747510SLisandro Dalcin */
15572d747510SLisandro Dalcin if (matchnumbers) {
15582d747510SLisandro Dalcin int i, j, cnt = 0, locs[16], loce[16];
1559e5c89e4eSSatish Balay /* determine the location and number of all _%d_ in the key */
15602d747510SLisandro Dalcin for (i = 0; name[i]; i++) {
15612d747510SLisandro Dalcin if (name[i] == '_') {
15622d747510SLisandro Dalcin for (j = i + 1; name[j]; j++) {
15632d747510SLisandro Dalcin if (name[j] >= '0' && name[j] <= '9') continue;
15642d747510SLisandro Dalcin if (name[j] == '_' && j > i + 1) { /* found a number */
1565e5c89e4eSSatish Balay locs[cnt] = i + 1;
1566e5c89e4eSSatish Balay loce[cnt++] = j + 1;
1567e5c89e4eSSatish Balay }
15682d747510SLisandro Dalcin i = j - 1;
1569e5c89e4eSSatish Balay break;
1570e5c89e4eSSatish Balay }
1571e5c89e4eSSatish Balay }
1572e5c89e4eSSatish Balay }
1573e5c89e4eSSatish Balay for (i = 0; i < cnt; i++) {
15742d747510SLisandro Dalcin PetscBool found;
15759355ec05SMatthew G. Knepley char opt[PETSC_MAX_OPTION_NAME + 1] = "-", tmp[PETSC_MAX_OPTION_NAME];
15769566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(tmp, name, PetscMin((size_t)(locs[i] + 1), sizeof(tmp))));
15779566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(opt, tmp, sizeof(opt)));
15789566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(opt, name + loce[i], sizeof(opt)));
15799566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, NULL, opt, value, &found));
15809371c9d4SSatish Balay if (found) {
15819371c9d4SSatish Balay if (set) *set = PETSC_TRUE;
15823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
15839371c9d4SSatish Balay }
1584e5c89e4eSSatish Balay }
1585e5c89e4eSSatish Balay }
15862d747510SLisandro Dalcin
15872d747510SLisandro Dalcin if (set) *set = PETSC_FALSE;
15883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1589e5c89e4eSSatish Balay }
1590e5c89e4eSSatish Balay
1591d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */
PetscOptionsFindPairPrefix_Private(PetscOptions options,const char pre[],const char name[],const char * option[],const char * value[],PetscBool * set)159254a546c1SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options, const char pre[], const char name[], const char *option[], const char *value[], PetscBool *set)
1593d71ae5a4SJacob Faibussowitsch {
15949355ec05SMatthew G. Knepley char buf[PETSC_MAX_OPTION_NAME];
1595d6ced9c0SMatthew G. Knepley int numCnt = 0, locs[16], loce[16];
1596514bf10dSMatthew G Knepley
1597514bf10dSMatthew G Knepley PetscFunctionBegin;
1598c5929fdfSBarry Smith options = options ? options : defaultoptions;
1599cc73adaaSBarry Smith PetscCheck(!pre || pre[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Prefix cannot begin with '-': Instead %s", pre);
1600cc73adaaSBarry Smith PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Name must begin with '-': Instead %s", name);
1601514bf10dSMatthew G Knepley
16022d747510SLisandro Dalcin name++; /* skip starting dash */
1603514bf10dSMatthew G Knepley
1604514bf10dSMatthew G Knepley /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */
16052d747510SLisandro Dalcin if (pre && pre[0]) {
16062d747510SLisandro Dalcin char *ptr = buf;
16079371c9d4SSatish Balay if (name[0] == '-') {
16089371c9d4SSatish Balay *ptr++ = '-';
16099371c9d4SSatish Balay name++;
16109371c9d4SSatish Balay }
16119b15cf9aSJacob Faibussowitsch PetscCall(PetscStrncpy(ptr, pre, sizeof(buf) - ((ptr == buf) ? 0 : 1)));
16129566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(buf, name, sizeof(buf)));
16132d747510SLisandro Dalcin name = buf;
1614514bf10dSMatthew G Knepley }
16152d747510SLisandro Dalcin
161676bd3646SJed Brown if (PetscDefined(USE_DEBUG)) {
1617514bf10dSMatthew G Knepley PetscBool valid;
16189355ec05SMatthew G. Knepley char key[PETSC_MAX_OPTION_NAME + 1] = "-";
16199566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key + 1, name, sizeof(key) - 1));
16209566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key, &valid));
162128b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid option '%s' obtained from pre='%s' and name='%s'", key, pre ? pre : "", name);
1622514bf10dSMatthew G Knepley }
1623514bf10dSMatthew G Knepley
1624d6ced9c0SMatthew G. Knepley /* determine the location and number of all _%d_ in the key */
1625d6ced9c0SMatthew G. Knepley {
1626d6ced9c0SMatthew G. Knepley int i, j;
1627d6ced9c0SMatthew G. Knepley for (i = 0; name[i]; i++) {
1628d6ced9c0SMatthew G. Knepley if (name[i] == '_') {
1629d6ced9c0SMatthew G. Knepley for (j = i + 1; name[j]; j++) {
1630d6ced9c0SMatthew G. Knepley if (name[j] >= '0' && name[j] <= '9') continue;
1631d6ced9c0SMatthew G. Knepley if (name[j] == '_' && j > i + 1) { /* found a number */
1632d6ced9c0SMatthew G. Knepley locs[numCnt] = i + 1;
1633d6ced9c0SMatthew G. Knepley loce[numCnt++] = j + 1;
1634d6ced9c0SMatthew G. Knepley }
1635d6ced9c0SMatthew G. Knepley i = j - 1;
1636d6ced9c0SMatthew G. Knepley break;
1637d6ced9c0SMatthew G. Knepley }
1638d6ced9c0SMatthew G. Knepley }
1639d6ced9c0SMatthew G. Knepley }
1640d6ced9c0SMatthew G. Knepley }
1641d6ced9c0SMatthew G. Knepley
1642363da2dcSJacob Faibussowitsch /* slow search */
1643363da2dcSJacob Faibussowitsch for (int c = -1; c < numCnt; ++c) {
1644363da2dcSJacob Faibussowitsch char opt[PETSC_MAX_OPTION_NAME + 2] = "";
16452d747510SLisandro Dalcin size_t len;
1646d6ced9c0SMatthew G. Knepley
1647d6ced9c0SMatthew G. Knepley if (c < 0) {
1648c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(opt, name, sizeof(opt)));
1649d6ced9c0SMatthew G. Knepley } else {
1650363da2dcSJacob Faibussowitsch PetscCall(PetscStrncpy(opt, name, PetscMin((size_t)(locs[c] + 1), sizeof(opt))));
1651363da2dcSJacob Faibussowitsch PetscCall(PetscStrlcat(opt, name + loce[c], sizeof(opt) - 1));
1652d6ced9c0SMatthew G. Knepley }
16539566063dSJacob Faibussowitsch PetscCall(PetscStrlen(opt, &len));
1654363da2dcSJacob Faibussowitsch for (int i = 0; i < options->N; i++) {
1655363da2dcSJacob Faibussowitsch PetscBool match;
1656363da2dcSJacob Faibussowitsch
16579566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(options->names[i], opt, len, &match));
1658514bf10dSMatthew G Knepley if (match) {
1659514bf10dSMatthew G Knepley options->used[i] = PETSC_TRUE;
166054a546c1SMatthew G. Knepley if (option) *option = options->names[i];
16612d747510SLisandro Dalcin if (value) *value = options->values[i];
16622d747510SLisandro Dalcin if (set) *set = PETSC_TRUE;
16633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1664514bf10dSMatthew G Knepley }
1665514bf10dSMatthew G Knepley }
16662d747510SLisandro Dalcin }
16672d747510SLisandro Dalcin
16682d747510SLisandro Dalcin if (set) *set = PETSC_FALSE;
16693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1670514bf10dSMatthew G Knepley }
1671514bf10dSMatthew G Knepley
16725d83a8b1SBarry Smith /*@
1673e5c89e4eSSatish Balay PetscOptionsReject - Generates an error if a certain option is given.
1674e5c89e4eSSatish Balay
16751c9f3c13SBarry Smith Not Collective
1676e5c89e4eSSatish Balay
1677e5c89e4eSSatish Balay Input Parameters:
167820f4b53cSBarry Smith + options - options database, use `NULL` for default global database
167920f4b53cSBarry Smith . pre - the option prefix (may be `NULL`)
16802d747510SLisandro Dalcin . name - the option name one is seeking
168120f4b53cSBarry Smith - mess - error message (may be `NULL`)
1682e5c89e4eSSatish Balay
1683e5c89e4eSSatish Balay Level: advanced
1684e5c89e4eSSatish Balay
16850241b274SPierre Jolivet .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`,
1686db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
1687db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
1688c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
1689db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
1690db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
1691e5c89e4eSSatish Balay @*/
PetscOptionsReject(PetscOptions options,const char pre[],const char name[],const char mess[])1692d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsReject(PetscOptions options, const char pre[], const char name[], const char mess[])
1693d71ae5a4SJacob Faibussowitsch {
1694ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE;
1695e5c89e4eSSatish Balay
1696e5c89e4eSSatish Balay PetscFunctionBegin;
16979566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(options, pre, name, &flag));
1698e5c89e4eSSatish Balay if (flag) {
169908401ef6SPierre Jolivet PetscCheck(!mess || !mess[0], PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Program has disabled option: -%s%s with %s", pre ? pre : "", name + 1, mess);
1700f7d195e4SLawrence Mitchell SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Program has disabled option: -%s%s", pre ? pre : "", name + 1);
1701e5c89e4eSSatish Balay }
17023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1703e5c89e4eSSatish Balay }
1704e5c89e4eSSatish Balay
17055d83a8b1SBarry Smith /*@
17062d747510SLisandro Dalcin PetscOptionsHasHelp - Determines whether the "-help" option is in the database.
17072d747510SLisandro Dalcin
17082d747510SLisandro Dalcin Not Collective
17092d747510SLisandro Dalcin
1710811af0c4SBarry Smith Input Parameter:
171120f4b53cSBarry Smith . options - options database, use `NULL` for default global database
17122d747510SLisandro Dalcin
1713811af0c4SBarry Smith Output Parameter:
1714811af0c4SBarry Smith . set - `PETSC_TRUE` if found else `PETSC_FALSE`.
17152d747510SLisandro Dalcin
17162d747510SLisandro Dalcin Level: advanced
17172d747510SLisandro Dalcin
1718db781477SPatrick Sanan .seealso: `PetscOptionsHasName()`
17192d747510SLisandro Dalcin @*/
PetscOptionsHasHelp(PetscOptions options,PetscBool * set)1720d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHasHelp(PetscOptions options, PetscBool *set)
1721d71ae5a4SJacob Faibussowitsch {
17222d747510SLisandro Dalcin PetscFunctionBegin;
17234f572ea9SToby Isaac PetscAssertPointer(set, 2);
17242d747510SLisandro Dalcin options = options ? options : defaultoptions;
17252d747510SLisandro Dalcin *set = options->help;
17263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
17272d747510SLisandro Dalcin }
17282d747510SLisandro Dalcin
PetscOptionsHasHelpIntro_Internal(PetscOptions options,PetscBool * set)1729d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHasHelpIntro_Internal(PetscOptions options, PetscBool *set)
1730d71ae5a4SJacob Faibussowitsch {
1731d314f959SVaclav Hapla PetscFunctionBegin;
17324f572ea9SToby Isaac PetscAssertPointer(set, 2);
1733d314f959SVaclav Hapla options = options ? options : defaultoptions;
1734d314f959SVaclav Hapla *set = options->help_intro;
17353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1736d314f959SVaclav Hapla }
1737d314f959SVaclav Hapla
17385d83a8b1SBarry Smith /*@
1739e24fcbf7SPierre 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
1740e24fcbf7SPierre Jolivet if its value is set to false.
1741e5c89e4eSSatish Balay
1742e5c89e4eSSatish Balay Not Collective
1743e5c89e4eSSatish Balay
1744e5c89e4eSSatish Balay Input Parameters:
174520f4b53cSBarry Smith + options - options database, use `NULL` for default global database
174620f4b53cSBarry Smith . pre - string to prepend to the name or `NULL`
17473de71b31SHong Zhang - name - the option one is seeking
1748e5c89e4eSSatish Balay
1749811af0c4SBarry Smith Output Parameter:
1750811af0c4SBarry Smith . set - `PETSC_TRUE` if found else `PETSC_FALSE`.
1751e5c89e4eSSatish Balay
1752e5c89e4eSSatish Balay Level: beginner
1753e5c89e4eSSatish Balay
1754811af0c4SBarry Smith Note:
1755811af0c4SBarry Smith In many cases you probably want to use `PetscOptionsGetBool()` instead of calling this, to allowing toggling values.
175690d69ab7SBarry Smith
1757db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`,
1758db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
1759db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
1760c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
1761db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
1762db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
1763e5c89e4eSSatish Balay @*/
PetscOptionsHasName(PetscOptions options,const char pre[],const char name[],PetscBool * set)1764d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHasName(PetscOptions options, const char pre[], const char name[], PetscBool *set)
1765d71ae5a4SJacob Faibussowitsch {
17662d747510SLisandro Dalcin const char *value;
1767ace3abfcSBarry Smith PetscBool flag;
1768e5c89e4eSSatish Balay
1769e5c89e4eSSatish Balay PetscFunctionBegin;
17709566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag));
177196ef3cdfSSatish Balay if (set) *set = flag;
17723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1773e5c89e4eSSatish Balay }
1774e5c89e4eSSatish Balay
1775e5c89e4eSSatish Balay /*@C
17762d747510SLisandro Dalcin PetscOptionsGetAll - Lists all the options the program was run with in a single string.
17772d747510SLisandro Dalcin
17782d747510SLisandro Dalcin Not Collective
17792d747510SLisandro Dalcin
1780fd292e60Sprj- Input Parameter:
178120f4b53cSBarry Smith . options - the options database, use `NULL` for the default global database
17822d747510SLisandro Dalcin
17832d747510SLisandro Dalcin Output Parameter:
17842d747510SLisandro Dalcin . copts - pointer where string pointer is stored
17852d747510SLisandro Dalcin
178620f4b53cSBarry Smith Level: advanced
178720f4b53cSBarry Smith
17882d747510SLisandro Dalcin Notes:
1789811af0c4SBarry Smith The array and each entry in the array should be freed with `PetscFree()`
1790811af0c4SBarry Smith
17911c9f3c13SBarry Smith Each process may have different values depending on how the options were inserted into the database
17922d747510SLisandro Dalcin
1793db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsView()`, `PetscOptionsPush()`, `PetscOptionsPop()`
17942d747510SLisandro Dalcin @*/
PetscOptionsGetAll(PetscOptions options,char * copts[])1795ce78bad3SBarry Smith PetscErrorCode PetscOptionsGetAll(PetscOptions options, char *copts[]) PeNS
1796d71ae5a4SJacob Faibussowitsch {
17972d747510SLisandro Dalcin PetscInt i;
17982d747510SLisandro Dalcin size_t len = 1, lent = 0;
17992d747510SLisandro Dalcin char *coptions = NULL;
18002d747510SLisandro Dalcin
18012d747510SLisandro Dalcin PetscFunctionBegin;
18024f572ea9SToby Isaac PetscAssertPointer(copts, 2);
18032d747510SLisandro Dalcin options = options ? options : defaultoptions;
18042d747510SLisandro Dalcin /* count the length of the required string */
18052d747510SLisandro Dalcin for (i = 0; i < options->N; i++) {
18069566063dSJacob Faibussowitsch PetscCall(PetscStrlen(options->names[i], &lent));
18072d747510SLisandro Dalcin len += 2 + lent;
18082d747510SLisandro Dalcin if (options->values[i]) {
18099566063dSJacob Faibussowitsch PetscCall(PetscStrlen(options->values[i], &lent));
18102d747510SLisandro Dalcin len += 1 + lent;
18112d747510SLisandro Dalcin }
18122d747510SLisandro Dalcin }
18139566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len, &coptions));
18142d747510SLisandro Dalcin coptions[0] = 0;
18152d747510SLisandro Dalcin for (i = 0; i < options->N; i++) {
1816c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, "-", len));
1817c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, options->names[i], len));
1818c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, " ", len));
18192d747510SLisandro Dalcin if (options->values[i]) {
1820c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, options->values[i], len));
1821c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, " ", len));
18222d747510SLisandro Dalcin }
18232d747510SLisandro Dalcin }
18242d747510SLisandro Dalcin *copts = coptions;
18253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
18262d747510SLisandro Dalcin }
18272d747510SLisandro Dalcin
18285d83a8b1SBarry Smith /*@
18292d747510SLisandro Dalcin PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database
18302d747510SLisandro Dalcin
18312d747510SLisandro Dalcin Not Collective
18322d747510SLisandro Dalcin
1833d8d19677SJose E. Roman Input Parameters:
183420f4b53cSBarry Smith + options - options database, use `NULL` for default global database
18352d747510SLisandro Dalcin - name - string name of option
18362d747510SLisandro Dalcin
18372d747510SLisandro Dalcin Output Parameter:
1838811af0c4SBarry Smith . used - `PETSC_TRUE` if the option was used, otherwise false, including if option was not found in options database
18392d747510SLisandro Dalcin
18402d747510SLisandro Dalcin Level: advanced
18412d747510SLisandro Dalcin
1842811af0c4SBarry Smith Note:
18439666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed
18441c9f3c13SBarry Smith on the given process
18451c9f3c13SBarry Smith
1846db781477SPatrick Sanan .seealso: `PetscOptionsView()`, `PetscOptionsLeft()`, `PetscOptionsAllUsed()`
18472d747510SLisandro Dalcin @*/
PetscOptionsUsed(PetscOptions options,const char * name,PetscBool * used)1848d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsUsed(PetscOptions options, const char *name, PetscBool *used)
1849d71ae5a4SJacob Faibussowitsch {
18502d747510SLisandro Dalcin PetscInt i;
18512d747510SLisandro Dalcin
18522d747510SLisandro Dalcin PetscFunctionBegin;
18534f572ea9SToby Isaac PetscAssertPointer(name, 2);
18544f572ea9SToby Isaac PetscAssertPointer(used, 3);
18552d747510SLisandro Dalcin options = options ? options : defaultoptions;
18562d747510SLisandro Dalcin *used = PETSC_FALSE;
18572d747510SLisandro Dalcin for (i = 0; i < options->N; i++) {
18589566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(options->names[i], name, used));
18592d747510SLisandro Dalcin if (*used) {
18602d747510SLisandro Dalcin *used = options->used[i];
18612d747510SLisandro Dalcin break;
18622d747510SLisandro Dalcin }
18632d747510SLisandro Dalcin }
18643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
18652d747510SLisandro Dalcin }
18662d747510SLisandro Dalcin
1867487a658cSBarry Smith /*@
18682d747510SLisandro Dalcin PetscOptionsAllUsed - Returns a count of the number of options in the
18692d747510SLisandro Dalcin database that have never been selected.
18702d747510SLisandro Dalcin
18712d747510SLisandro Dalcin Not Collective
18722d747510SLisandro Dalcin
18732d747510SLisandro Dalcin Input Parameter:
187420f4b53cSBarry Smith . options - options database, use `NULL` for default global database
18752d747510SLisandro Dalcin
18762d747510SLisandro Dalcin Output Parameter:
18772d747510SLisandro Dalcin . N - count of options not used
18782d747510SLisandro Dalcin
18792d747510SLisandro Dalcin Level: advanced
18802d747510SLisandro Dalcin
1881811af0c4SBarry Smith Note:
18829666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed
18831c9f3c13SBarry Smith on the given process
18841c9f3c13SBarry Smith
1885db781477SPatrick Sanan .seealso: `PetscOptionsView()`
18862d747510SLisandro Dalcin @*/
PetscOptionsAllUsed(PetscOptions options,PetscInt * N)1887d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsAllUsed(PetscOptions options, PetscInt *N)
1888d71ae5a4SJacob Faibussowitsch {
18892d747510SLisandro Dalcin PetscInt i, n = 0;
18902d747510SLisandro Dalcin
18912d747510SLisandro Dalcin PetscFunctionBegin;
18924f572ea9SToby Isaac PetscAssertPointer(N, 2);
18932d747510SLisandro Dalcin options = options ? options : defaultoptions;
18942d747510SLisandro Dalcin for (i = 0; i < options->N; i++) {
18952d747510SLisandro Dalcin if (!options->used[i]) n++;
18962d747510SLisandro Dalcin }
18972d747510SLisandro Dalcin *N = n;
18983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
18992d747510SLisandro Dalcin }
19002d747510SLisandro Dalcin
1901487a658cSBarry Smith /*@
19022d747510SLisandro Dalcin PetscOptionsLeft - Prints to screen any options that were set and never used.
19032d747510SLisandro Dalcin
19042d747510SLisandro Dalcin Not Collective
19052d747510SLisandro Dalcin
19062d747510SLisandro Dalcin Input Parameter:
190720f4b53cSBarry Smith . options - options database; use `NULL` for default global database
19082d747510SLisandro Dalcin
19092d747510SLisandro Dalcin Options Database Key:
1910811af0c4SBarry Smith . -options_left - activates `PetscOptionsAllUsed()` within `PetscFinalize()`
19112d747510SLisandro Dalcin
191220f4b53cSBarry Smith Level: advanced
191320f4b53cSBarry Smith
19143de2bfdfSBarry Smith Notes:
1915a51b1039SEric Chamberland This is rarely used directly, it is called by `PetscFinalize()` by default (unless
1916a51b1039SEric Chamberland `-options_left false` is specified) to help users determine possible mistakes in their usage of
1917a51b1039SEric Chamberland options. This only prints values on process zero of `PETSC_COMM_WORLD`.
1918811af0c4SBarry Smith
1919811af0c4SBarry Smith Other processes depending the objects
19201c9f3c13SBarry Smith used may have different options that are left unused.
19213de2bfdfSBarry Smith
1922db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`
19232d747510SLisandro Dalcin @*/
PetscOptionsLeft(PetscOptions options)1924d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeft(PetscOptions options)
1925d71ae5a4SJacob Faibussowitsch {
19262d747510SLisandro Dalcin PetscInt i;
19273de2bfdfSBarry Smith PetscInt cnt = 0;
19283de2bfdfSBarry Smith PetscOptions toptions;
19292d747510SLisandro Dalcin
19302d747510SLisandro Dalcin PetscFunctionBegin;
19313de2bfdfSBarry Smith toptions = options ? options : defaultoptions;
19323de2bfdfSBarry Smith for (i = 0; i < toptions->N; i++) {
19333de2bfdfSBarry Smith if (!toptions->used[i]) {
1934660278c0SBarry Smith if (PetscCIOption(toptions->names[i])) continue;
19353de2bfdfSBarry Smith if (toptions->values[i]) {
19369355ec05SMatthew G. Knepley PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Option left: name:-%s value: %s source: %s\n", toptions->names[i], toptions->values[i], PetscOptionSources[toptions->source[i]]));
19372d747510SLisandro Dalcin } else {
19389355ec05SMatthew G. Knepley PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Option left: name:-%s (no value) source: %s\n", toptions->names[i], PetscOptionSources[toptions->source[i]]));
19392d747510SLisandro Dalcin }
19402d747510SLisandro Dalcin }
19412d747510SLisandro Dalcin }
19423de2bfdfSBarry Smith if (!options) {
19433de2bfdfSBarry Smith toptions = defaultoptions;
19443de2bfdfSBarry Smith while (toptions->previous) {
19453de2bfdfSBarry Smith cnt++;
19463de2bfdfSBarry Smith toptions = toptions->previous;
19473de2bfdfSBarry Smith }
194848a46eb9SPierre Jolivet if (cnt) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Option left: You may have forgotten some calls to PetscOptionsPop(),\n PetscOptionsPop() has been called %" PetscInt_FMT " less times than PetscOptionsPush()\n", cnt));
19493de2bfdfSBarry Smith }
19503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
19512d747510SLisandro Dalcin }
19522d747510SLisandro Dalcin
19532d747510SLisandro Dalcin /*@C
19542d747510SLisandro Dalcin PetscOptionsLeftGet - Returns all options that were set and never used.
19552d747510SLisandro Dalcin
19562d747510SLisandro Dalcin Not Collective
19572d747510SLisandro Dalcin
19582d747510SLisandro Dalcin Input Parameter:
195920f4b53cSBarry Smith . options - options database, use `NULL` for default global database
19602d747510SLisandro Dalcin
1961d8d19677SJose E. Roman Output Parameters:
1962a2b725a8SWilliam Gropp + N - count of options not used
19632d747510SLisandro Dalcin . names - names of options not used
1964a2b725a8SWilliam Gropp - values - values of options not used
19652d747510SLisandro Dalcin
19662d747510SLisandro Dalcin Level: advanced
19672d747510SLisandro Dalcin
19682d747510SLisandro Dalcin Notes:
1969811af0c4SBarry Smith Users should call `PetscOptionsLeftRestore()` to free the memory allocated in this routine
1970811af0c4SBarry Smith
1971811af0c4SBarry Smith The value returned may be different on each process and depends on which options have been processed
19721c9f3c13SBarry Smith on the given process
19732d747510SLisandro Dalcin
1974db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsLeft()`
19752d747510SLisandro Dalcin @*/
PetscOptionsLeftGet(PetscOptions options,PetscInt * N,char ** names[],char ** values[])1976d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeftGet(PetscOptions options, PetscInt *N, char **names[], char **values[])
1977d71ae5a4SJacob Faibussowitsch {
19782d747510SLisandro Dalcin PetscInt i, n;
19792d747510SLisandro Dalcin
19802d747510SLisandro Dalcin PetscFunctionBegin;
19814f572ea9SToby Isaac if (N) PetscAssertPointer(N, 2);
19824f572ea9SToby Isaac if (names) PetscAssertPointer(names, 3);
19834f572ea9SToby Isaac if (values) PetscAssertPointer(values, 4);
19842d747510SLisandro Dalcin options = options ? options : defaultoptions;
19852d747510SLisandro Dalcin
19862d747510SLisandro Dalcin /* The number of unused PETSc options */
19872d747510SLisandro Dalcin n = 0;
19882d747510SLisandro Dalcin for (i = 0; i < options->N; i++) {
1989660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue;
19902d747510SLisandro Dalcin if (!options->used[i]) n++;
19912d747510SLisandro Dalcin }
1992ad540459SPierre Jolivet if (N) *N = n;
19939566063dSJacob Faibussowitsch if (names) PetscCall(PetscMalloc1(n, names));
19949566063dSJacob Faibussowitsch if (values) PetscCall(PetscMalloc1(n, values));
19952d747510SLisandro Dalcin
19962d747510SLisandro Dalcin n = 0;
19972d747510SLisandro Dalcin if (names || values) {
19982d747510SLisandro Dalcin for (i = 0; i < options->N; i++) {
19992d747510SLisandro Dalcin if (!options->used[i]) {
2000660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue;
20012d747510SLisandro Dalcin if (names) (*names)[n] = options->names[i];
20022d747510SLisandro Dalcin if (values) (*values)[n] = options->values[i];
20032d747510SLisandro Dalcin n++;
20042d747510SLisandro Dalcin }
20052d747510SLisandro Dalcin }
20062d747510SLisandro Dalcin }
20073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
20082d747510SLisandro Dalcin }
20092d747510SLisandro Dalcin
20102d747510SLisandro Dalcin /*@C
2011811af0c4SBarry Smith PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using `PetscOptionsLeftGet()`.
20122d747510SLisandro Dalcin
20132d747510SLisandro Dalcin Not Collective
20142d747510SLisandro Dalcin
2015d8d19677SJose E. Roman Input Parameters:
201620f4b53cSBarry Smith + options - options database, use `NULL` for default global database
201710450e9eSJacob Faibussowitsch . N - count of options not used
20182d747510SLisandro Dalcin . names - names of options not used
2019a2b725a8SWilliam Gropp - values - values of options not used
20202d747510SLisandro Dalcin
20212d747510SLisandro Dalcin Level: advanced
20222d747510SLisandro Dalcin
202310450e9eSJacob Faibussowitsch Notes:
202410450e9eSJacob Faibussowitsch The user should pass the same pointer to `N` as they did when calling `PetscOptionsLeftGet()`
202510450e9eSJacob Faibussowitsch
2026db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsLeft()`, `PetscOptionsLeftGet()`
20272d747510SLisandro Dalcin @*/
PetscOptionsLeftRestore(PetscOptions options,PetscInt * N,char ** names[],char ** values[])2028d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeftRestore(PetscOptions options, PetscInt *N, char **names[], char **values[])
2029d71ae5a4SJacob Faibussowitsch {
20302d747510SLisandro Dalcin PetscFunctionBegin;
203110450e9eSJacob Faibussowitsch (void)options;
20324f572ea9SToby Isaac if (N) PetscAssertPointer(N, 2);
20334f572ea9SToby Isaac if (names) PetscAssertPointer(names, 3);
20344f572ea9SToby Isaac if (values) PetscAssertPointer(values, 4);
2035ad540459SPierre Jolivet if (N) *N = 0;
20369566063dSJacob Faibussowitsch if (names) PetscCall(PetscFree(*names));
20379566063dSJacob Faibussowitsch if (values) PetscCall(PetscFree(*values));
20383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
20392d747510SLisandro Dalcin }
20402d747510SLisandro Dalcin
20412d747510SLisandro Dalcin /*@C
2042811af0c4SBarry Smith PetscOptionsMonitorDefault - Print all options set value events using the supplied `PetscViewer`.
20432d747510SLisandro Dalcin
2044c3339decSBarry Smith Logically Collective
20452d747510SLisandro Dalcin
20462d747510SLisandro Dalcin Input Parameters:
20472d747510SLisandro Dalcin + name - option name string
20482d747510SLisandro Dalcin . value - option value string
20499355ec05SMatthew G. Knepley . source - The source for the option
205020f4b53cSBarry Smith - ctx - a `PETSCVIEWERASCII` or `NULL`
20512d747510SLisandro Dalcin
20522d747510SLisandro Dalcin Level: intermediate
20532d747510SLisandro Dalcin
20549666a313SBarry Smith Notes:
205520f4b53cSBarry Smith If ctx is `NULL`, `PetscPrintf()` is used.
20569314d9b7SBarry Smith The first MPI process in the `PetscViewer` viewer actually prints the values, other
20571c9f3c13SBarry Smith processes may have different values set
20581c9f3c13SBarry Smith
2059811af0c4SBarry Smith If `PetscCIEnabled` then do not print the test harness options
2060660278c0SBarry Smith
2061db781477SPatrick Sanan .seealso: `PetscOptionsMonitorSet()`
20622d747510SLisandro Dalcin @*/
PetscOptionsMonitorDefault(const char name[],const char value[],PetscOptionSource source,PetscCtx ctx)2063*2a8381b2SBarry Smith PetscErrorCode PetscOptionsMonitorDefault(const char name[], const char value[], PetscOptionSource source, PetscCtx ctx)
2064d71ae5a4SJacob Faibussowitsch {
20652d747510SLisandro Dalcin PetscFunctionBegin;
20663ba16761SJacob Faibussowitsch if (PetscCIOption(name)) PetscFunctionReturn(PETSC_SUCCESS);
2067660278c0SBarry Smith
20689060e2f9SVaclav Hapla if (ctx) {
20699060e2f9SVaclav Hapla PetscViewer viewer = (PetscViewer)ctx;
20702d747510SLisandro Dalcin if (!value) {
20719566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Removing option: %s\n", name));
20722d747510SLisandro Dalcin } else if (!value[0]) {
20739355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "Setting option: %s (no value) (source: %s)\n", name, PetscOptionSources[source]));
20742d747510SLisandro Dalcin } else {
20759355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "Setting option: %s = %s (source: %s)\n", name, value, PetscOptionSources[source]));
20762d747510SLisandro Dalcin }
20779060e2f9SVaclav Hapla } else {
20789060e2f9SVaclav Hapla MPI_Comm comm = PETSC_COMM_WORLD;
20799060e2f9SVaclav Hapla if (!value) {
20809566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm, "Removing option: %s\n", name));
20819060e2f9SVaclav Hapla } else if (!value[0]) {
20829355ec05SMatthew G. Knepley PetscCall(PetscPrintf(comm, "Setting option: %s (no value) (source: %s)\n", name, PetscOptionSources[source]));
20839060e2f9SVaclav Hapla } else {
2084aaa8cc7dSPierre Jolivet PetscCall(PetscPrintf(comm, "Setting option: %s = %s (source: %s)\n", name, value, PetscOptionSources[source]));
20859060e2f9SVaclav Hapla }
20869060e2f9SVaclav Hapla }
20873ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
20882d747510SLisandro Dalcin }
20892d747510SLisandro Dalcin
20902d747510SLisandro Dalcin /*@C
20912d747510SLisandro Dalcin PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that
20922d747510SLisandro Dalcin modified the PETSc options database.
20932d747510SLisandro Dalcin
20942d747510SLisandro Dalcin Not Collective
20952d747510SLisandro Dalcin
20962d747510SLisandro Dalcin Input Parameters:
209720f4b53cSBarry Smith + monitor - pointer to function (if this is `NULL`, it turns off monitoring
209810450e9eSJacob Faibussowitsch . mctx - [optional] context for private data for the monitor routine (use `NULL` if
209910450e9eSJacob Faibussowitsch no context is desired)
210049abdd8aSBarry Smith - monitordestroy - [optional] routine that frees monitor context (may be `NULL`), see `PetscCtxDestroyFn` for its calling sequence
21012d747510SLisandro Dalcin
210210450e9eSJacob Faibussowitsch Calling sequence of `monitor`:
21032d747510SLisandro Dalcin + name - option name string
2104432b765aSRené Chenard . value - option value string, a value of `NULL` indicates the option is being removed from the database. A value
2105432b765aSRené Chenard of "" indicates the option is in the database but has no value.
21069355ec05SMatthew G. Knepley . source - option source
2107811af0c4SBarry Smith - mctx - optional monitoring context, as set by `PetscOptionsMonitorSet()`
21082d747510SLisandro Dalcin
2109432b765aSRené Chenard Options Database Keys:
21108d6650c0SBarry Smith + -options_monitor <viewer> - turn on default monitoring of changes to the options database
2111432b765aSRené Chenard - -options_monitor_cancel - turn off any option monitors except the default monitor obtained with `-options_monitor`
2112432b765aSRené Chenard
211320f4b53cSBarry Smith Level: intermediate
211420f4b53cSBarry Smith
21152d747510SLisandro Dalcin Notes:
211610450e9eSJacob Faibussowitsch See `PetscInitialize()` for options related to option database monitoring.
211710450e9eSJacob Faibussowitsch
2118432b765aSRené Chenard The default is to do no monitoring. To print the name and value of options
2119811af0c4SBarry Smith being inserted into the database, use `PetscOptionsMonitorDefault()` as the monitoring routine,
2120432b765aSRené Chenard with a `NULL` monitoring context. Or use the option `-options_monitor` <viewer>.
21212d747510SLisandro Dalcin
21222d747510SLisandro Dalcin Several different monitoring routines may be set by calling
2123811af0c4SBarry Smith `PetscOptionsMonitorSet()` multiple times; all will be called in the
21242d747510SLisandro Dalcin order in which they were set.
21252d747510SLisandro Dalcin
212649abdd8aSBarry Smith .seealso: `PetscOptionsMonitorDefault()`, `PetscInitialize()`, `PetscCtxDestroyFn`
21272d747510SLisandro Dalcin @*/
PetscOptionsMonitorSet(PetscErrorCode (* monitor)(const char name[],const char value[],PetscOptionSource source,PetscCtx mctx),PetscCtx mctx,PetscCtxDestroyFn * monitordestroy)2128*2a8381b2SBarry Smith PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], PetscOptionSource source, PetscCtx mctx), PetscCtx mctx, PetscCtxDestroyFn *monitordestroy)
2129d71ae5a4SJacob Faibussowitsch {
21302d747510SLisandro Dalcin PetscOptions options = defaultoptions;
21312d747510SLisandro Dalcin
21322d747510SLisandro Dalcin PetscFunctionBegin;
21333ba16761SJacob Faibussowitsch if (options->monitorCancel) PetscFunctionReturn(PETSC_SUCCESS);
213408401ef6SPierre Jolivet PetscCheck(options->numbermonitors < MAXOPTIONSMONITORS, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Too many PetscOptions monitors set");
21352d747510SLisandro Dalcin options->monitor[options->numbermonitors] = monitor;
21362d747510SLisandro Dalcin options->monitordestroy[options->numbermonitors] = monitordestroy;
2137835f2295SStefano Zampini options->monitorcontext[options->numbermonitors++] = mctx;
21383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21392d747510SLisandro Dalcin }
21402d747510SLisandro Dalcin
21412d747510SLisandro Dalcin /*
21422d747510SLisandro Dalcin PetscOptionsStringToBool - Converts string to PetscBool, handles cases like "yes", "no", "true", "false", "0", "1", "off", "on".
214363fe8743SVaclav Hapla Empty string is considered as true.
21442d747510SLisandro Dalcin */
PetscOptionsStringToBool(const char value[],PetscBool * a)2145d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToBool(const char value[], PetscBool *a)
2146d71ae5a4SJacob Faibussowitsch {
21472d747510SLisandro Dalcin PetscBool istrue, isfalse;
21482d747510SLisandro Dalcin size_t len;
21492d747510SLisandro Dalcin
21502d747510SLisandro Dalcin PetscFunctionBegin;
215163fe8743SVaclav Hapla /* PetscStrlen() returns 0 for NULL or "" */
21529566063dSJacob Faibussowitsch PetscCall(PetscStrlen(value, &len));
21539371c9d4SSatish Balay if (!len) {
21549371c9d4SSatish Balay *a = PETSC_TRUE;
21553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21569371c9d4SSatish Balay }
21579566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "TRUE", &istrue));
21589371c9d4SSatish Balay if (istrue) {
21599371c9d4SSatish Balay *a = PETSC_TRUE;
21603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21619371c9d4SSatish Balay }
21629566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "YES", &istrue));
21639371c9d4SSatish Balay if (istrue) {
21649371c9d4SSatish Balay *a = PETSC_TRUE;
21653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21669371c9d4SSatish Balay }
21679566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "1", &istrue));
21689371c9d4SSatish Balay if (istrue) {
21699371c9d4SSatish Balay *a = PETSC_TRUE;
21703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21719371c9d4SSatish Balay }
21729566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "on", &istrue));
21739371c9d4SSatish Balay if (istrue) {
21749371c9d4SSatish Balay *a = PETSC_TRUE;
21753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21769371c9d4SSatish Balay }
21779566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "FALSE", &isfalse));
21789371c9d4SSatish Balay if (isfalse) {
21799371c9d4SSatish Balay *a = PETSC_FALSE;
21803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21819371c9d4SSatish Balay }
21829566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "NO", &isfalse));
21839371c9d4SSatish Balay if (isfalse) {
21849371c9d4SSatish Balay *a = PETSC_FALSE;
21853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21869371c9d4SSatish Balay }
21879566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "0", &isfalse));
21889371c9d4SSatish Balay if (isfalse) {
21899371c9d4SSatish Balay *a = PETSC_FALSE;
21903ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21919371c9d4SSatish Balay }
21929566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "off", &isfalse));
21939371c9d4SSatish Balay if (isfalse) {
21949371c9d4SSatish Balay *a = PETSC_FALSE;
21953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21969371c9d4SSatish Balay }
219798921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown logical value: %s", value);
21982d747510SLisandro Dalcin }
21992d747510SLisandro Dalcin
22002d747510SLisandro Dalcin /*
22012d747510SLisandro Dalcin PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide"
22022d747510SLisandro Dalcin */
PetscOptionsStringToInt(const char name[],PetscInt * a)2203d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToInt(const char name[], PetscInt *a)
2204d71ae5a4SJacob Faibussowitsch {
22052d747510SLisandro Dalcin size_t len;
2206b3480c81SBarry Smith PetscBool decide, tdefault, mouse, unlimited;
22072d747510SLisandro Dalcin
22082d747510SLisandro Dalcin PetscFunctionBegin;
22099566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name, &len));
22105f80ce2aSJacob Faibussowitsch PetscCheck(len, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "character string of length zero has no numerical value");
22112d747510SLisandro Dalcin
22129566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DEFAULT", &tdefault));
221348a46eb9SPierre Jolivet if (!tdefault) PetscCall(PetscStrcasecmp(name, "DEFAULT", &tdefault));
22149566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DECIDE", &decide));
221548a46eb9SPierre Jolivet if (!decide) PetscCall(PetscStrcasecmp(name, "DECIDE", &decide));
2216b3480c81SBarry Smith if (!decide) PetscCall(PetscStrcasecmp(name, "PETSC_DETERMINE", &decide));
2217b3480c81SBarry Smith if (!decide) PetscCall(PetscStrcasecmp(name, "DETERMINE", &decide));
2218b3480c81SBarry Smith PetscCall(PetscStrcasecmp(name, "PETSC_UNLIMITED", &unlimited));
2219b3480c81SBarry Smith if (!unlimited) PetscCall(PetscStrcasecmp(name, "UNLIMITED", &unlimited));
22209566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "mouse", &mouse));
22212d747510SLisandro Dalcin
22222d747510SLisandro Dalcin if (tdefault) *a = PETSC_DEFAULT;
22232d747510SLisandro Dalcin else if (decide) *a = PETSC_DECIDE;
2224b3480c81SBarry Smith else if (unlimited) *a = PETSC_UNLIMITED;
22252d747510SLisandro Dalcin else if (mouse) *a = -1;
22262d747510SLisandro Dalcin else {
22272d747510SLisandro Dalcin char *endptr;
22282d747510SLisandro Dalcin long strtolval;
22292d747510SLisandro Dalcin
22302d747510SLisandro Dalcin strtolval = strtol(name, &endptr, 10);
2231cc73adaaSBarry Smith PetscCheck((size_t)(endptr - name) == len, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s has no integer value (do not include . in it)", name);
22322d747510SLisandro Dalcin
22332d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL)
22342d747510SLisandro Dalcin (void)strtolval;
22352d747510SLisandro Dalcin *a = atoll(name);
22362d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64)
22372d747510SLisandro Dalcin (void)strtolval;
22382d747510SLisandro Dalcin *a = _atoi64(name);
22392d747510SLisandro Dalcin #else
22402d747510SLisandro Dalcin *a = (PetscInt)strtolval;
22412d747510SLisandro Dalcin #endif
22422d747510SLisandro Dalcin }
22433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
22442d747510SLisandro Dalcin }
22452d747510SLisandro Dalcin
22462d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
22472d747510SLisandro Dalcin #include <quadmath.h>
22482d747510SLisandro Dalcin #endif
22492d747510SLisandro Dalcin
PetscStrtod(const char name[],PetscReal * a,char ** endptr)2250d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscStrtod(const char name[], PetscReal *a, char **endptr)
2251d71ae5a4SJacob Faibussowitsch {
22522d747510SLisandro Dalcin PetscFunctionBegin;
22532d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128)
22542d747510SLisandro Dalcin *a = strtoflt128(name, endptr);
22552d747510SLisandro Dalcin #else
22562d747510SLisandro Dalcin *a = (PetscReal)strtod(name, endptr);
22572d747510SLisandro Dalcin #endif
22583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
22592d747510SLisandro Dalcin }
22602d747510SLisandro Dalcin
PetscStrtoz(const char name[],PetscScalar * a,char ** endptr,PetscBool * isImaginary)2261d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscStrtoz(const char name[], PetscScalar *a, char **endptr, PetscBool *isImaginary)
2262d71ae5a4SJacob Faibussowitsch {
22632d747510SLisandro Dalcin PetscBool hasi = PETSC_FALSE;
22642d747510SLisandro Dalcin char *ptr;
22652d747510SLisandro Dalcin PetscReal strtoval;
22662d747510SLisandro Dalcin
22672d747510SLisandro Dalcin PetscFunctionBegin;
22689566063dSJacob Faibussowitsch PetscCall(PetscStrtod(name, &strtoval, &ptr));
22692d747510SLisandro Dalcin if (ptr == name) {
22702d747510SLisandro Dalcin strtoval = 1.;
22712d747510SLisandro Dalcin hasi = PETSC_TRUE;
22722d747510SLisandro Dalcin if (name[0] == 'i') {
22732d747510SLisandro Dalcin ptr++;
22742d747510SLisandro Dalcin } else if (name[0] == '+' && name[1] == 'i') {
22752d747510SLisandro Dalcin ptr += 2;
22762d747510SLisandro Dalcin } else if (name[0] == '-' && name[1] == 'i') {
22772d747510SLisandro Dalcin strtoval = -1.;
22782d747510SLisandro Dalcin ptr += 2;
22792d747510SLisandro Dalcin }
22802d747510SLisandro Dalcin } else if (*ptr == 'i') {
22812d747510SLisandro Dalcin hasi = PETSC_TRUE;
22822d747510SLisandro Dalcin ptr++;
22832d747510SLisandro Dalcin }
22842d747510SLisandro Dalcin *endptr = ptr;
22852d747510SLisandro Dalcin *isImaginary = hasi;
22862d747510SLisandro Dalcin if (hasi) {
22872d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX)
228898921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s contains imaginary but complex not supported ", name);
22892d747510SLisandro Dalcin #else
22902d747510SLisandro Dalcin *a = PetscCMPLX(0., strtoval);
22912d747510SLisandro Dalcin #endif
22922d747510SLisandro Dalcin } else {
22932d747510SLisandro Dalcin *a = strtoval;
22942d747510SLisandro Dalcin }
22953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
22962d747510SLisandro Dalcin }
22972d747510SLisandro Dalcin
22982d747510SLisandro Dalcin /*
22992d747510SLisandro Dalcin Converts a string to PetscReal value. Handles special cases like "default" and "decide"
23002d747510SLisandro Dalcin */
PetscOptionsStringToReal(const char name[],PetscReal * a)2301d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToReal(const char name[], PetscReal *a)
2302d71ae5a4SJacob Faibussowitsch {
23032d747510SLisandro Dalcin size_t len;
23042d747510SLisandro Dalcin PetscBool match;
23052d747510SLisandro Dalcin char *endptr;
23062d747510SLisandro Dalcin
23072d747510SLisandro Dalcin PetscFunctionBegin;
23089566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name, &len));
230928b400f6SJacob Faibussowitsch PetscCheck(len, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "String of length zero has no numerical value");
23102d747510SLisandro Dalcin
23119566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DEFAULT", &match));
23129566063dSJacob Faibussowitsch if (!match) PetscCall(PetscStrcasecmp(name, "DEFAULT", &match));
23139371c9d4SSatish Balay if (match) {
23149371c9d4SSatish Balay *a = PETSC_DEFAULT;
23153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
23169371c9d4SSatish Balay }
23172d747510SLisandro Dalcin
23189566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DECIDE", &match));
23199566063dSJacob Faibussowitsch if (!match) PetscCall(PetscStrcasecmp(name, "DECIDE", &match));
23209371c9d4SSatish Balay if (match) {
23219371c9d4SSatish Balay *a = PETSC_DECIDE;
23223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
23239371c9d4SSatish Balay }
23242d747510SLisandro Dalcin
2325b3480c81SBarry Smith PetscCall(PetscStrcasecmp(name, "PETSC_DETERMINE", &match));
2326b3480c81SBarry Smith if (!match) PetscCall(PetscStrcasecmp(name, "DETERMINE", &match));
2327b3480c81SBarry Smith if (match) {
2328b3480c81SBarry Smith *a = PETSC_DETERMINE;
2329b3480c81SBarry Smith PetscFunctionReturn(PETSC_SUCCESS);
2330b3480c81SBarry Smith }
2331b3480c81SBarry Smith
2332b3480c81SBarry Smith PetscCall(PetscStrcasecmp(name, "PETSC_UNLIMITED", &match));
2333b3480c81SBarry Smith if (!match) PetscCall(PetscStrcasecmp(name, "UNLIMITED", &match));
2334b3480c81SBarry Smith if (match) {
2335b3480c81SBarry Smith *a = PETSC_UNLIMITED;
2336b3480c81SBarry Smith PetscFunctionReturn(PETSC_SUCCESS);
2337b3480c81SBarry Smith }
2338b3480c81SBarry Smith
23399566063dSJacob Faibussowitsch PetscCall(PetscStrtod(name, a, &endptr));
234039a651e2SJacob Faibussowitsch PetscCheck((size_t)(endptr - name) == len, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s has no numeric value", name);
23413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
23422d747510SLisandro Dalcin }
23432d747510SLisandro Dalcin
PetscOptionsStringToScalar(const char name[],PetscScalar * a)2344d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToScalar(const char name[], PetscScalar *a)
2345d71ae5a4SJacob Faibussowitsch {
23462d747510SLisandro Dalcin PetscBool imag1;
23472d747510SLisandro Dalcin size_t len;
23482d747510SLisandro Dalcin PetscScalar val = 0.;
23492d747510SLisandro Dalcin char *ptr = NULL;
23502d747510SLisandro Dalcin
23512d747510SLisandro Dalcin PetscFunctionBegin;
23529566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name, &len));
235328b400f6SJacob Faibussowitsch PetscCheck(len, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "character string of length zero has no numerical value");
23549566063dSJacob Faibussowitsch PetscCall(PetscStrtoz(name, &val, &ptr, &imag1));
23552d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX)
23562d747510SLisandro Dalcin if ((size_t)(ptr - name) < len) {
23572d747510SLisandro Dalcin PetscBool imag2;
23582d747510SLisandro Dalcin PetscScalar val2;
23592d747510SLisandro Dalcin
23609566063dSJacob Faibussowitsch PetscCall(PetscStrtoz(ptr, &val2, &ptr, &imag2));
236139a651e2SJacob Faibussowitsch if (imag1) PetscCheck(imag2, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s: must specify imaginary component second", name);
23622d747510SLisandro Dalcin val = PetscCMPLX(PetscRealPart(val), PetscImaginaryPart(val2));
23632d747510SLisandro Dalcin }
23642d747510SLisandro Dalcin #endif
236539a651e2SJacob Faibussowitsch PetscCheck((size_t)(ptr - name) == len, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s has no numeric value ", name);
23662d747510SLisandro Dalcin *a = val;
23673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
23682d747510SLisandro Dalcin }
23692d747510SLisandro Dalcin
23702d747510SLisandro Dalcin /*@C
23712d747510SLisandro Dalcin PetscOptionsGetBool - Gets the Logical (true or false) value for a particular
23722d747510SLisandro Dalcin option in the database.
2373e5c89e4eSSatish Balay
2374e5c89e4eSSatish Balay Not Collective
2375e5c89e4eSSatish Balay
2376e5c89e4eSSatish Balay Input Parameters:
237720f4b53cSBarry Smith + options - options database, use `NULL` for default global database
237820f4b53cSBarry Smith . pre - the string to prepend to the name or `NULL`
2379e5c89e4eSSatish Balay - name - the option one is seeking
2380e5c89e4eSSatish Balay
2381d8d19677SJose E. Roman Output Parameters:
23822d747510SLisandro Dalcin + ivalue - the logical value to return
2383811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
2384e5c89e4eSSatish Balay
2385e5c89e4eSSatish Balay Level: beginner
2386e5c89e4eSSatish Balay
238795452b02SPatrick Sanan Notes:
23889e296098SJunchao Zhang TRUE, true, YES, yes, ON, on, nostring, and 1 all translate to `PETSC_TRUE`
23899e296098SJunchao Zhang FALSE, false, NO, no, OFF, off and 0 all translate to `PETSC_FALSE`
23902d747510SLisandro Dalcin
23919314d9b7SBarry Smith 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`
23929314d9b7SBarry Smith is equivalent to `-requested_bool true`
23932d747510SLisandro Dalcin
23949314d9b7SBarry Smith If the user does not supply the option at all `ivalue` is NOT changed. Thus
23959314d9b7SBarry Smith you should ALWAYS initialize `ivalue` if you access it without first checking that the `set` flag is true.
23962efd9cb1SBarry Smith
23979e296098SJunchao Zhang .seealso: `PetscOptionsGetBool3()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`,
2398db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsGetInt()`, `PetscOptionsBool()`,
2399db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
2400c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
2401db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
2402db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
2403e5c89e4eSSatish Balay @*/
PetscOptionsGetBool(PetscOptions options,const char pre[],const char name[],PetscBool * ivalue,PetscBool * set)2404d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetBool(PetscOptions options, const char pre[], const char name[], PetscBool *ivalue, PetscBool *set)
2405d71ae5a4SJacob Faibussowitsch {
24062d747510SLisandro Dalcin const char *value;
2407ace3abfcSBarry Smith PetscBool flag;
2408e5c89e4eSSatish Balay
2409e5c89e4eSSatish Balay PetscFunctionBegin;
24104f572ea9SToby Isaac PetscAssertPointer(name, 3);
24114f572ea9SToby Isaac if (ivalue) PetscAssertPointer(ivalue, 4);
24129566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag));
2413e5c89e4eSSatish Balay if (flag) {
241496ef3cdfSSatish Balay if (set) *set = PETSC_TRUE;
24159566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(value, &flag));
24162d747510SLisandro Dalcin if (ivalue) *ivalue = flag;
2417e5c89e4eSSatish Balay } else {
241896ef3cdfSSatish Balay if (set) *set = PETSC_FALSE;
2419e5c89e4eSSatish Balay }
24203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2421e5c89e4eSSatish Balay }
2422e5c89e4eSSatish Balay
2423e5c89e4eSSatish Balay /*@C
2424d7c1f440SPierre Jolivet PetscOptionsGetBool3 - Gets the ternary logical (true, false or unknown) value for a particular
24259e296098SJunchao Zhang option in the database.
24269e296098SJunchao Zhang
24279e296098SJunchao Zhang Not Collective
24289e296098SJunchao Zhang
24299e296098SJunchao Zhang Input Parameters:
24309e296098SJunchao Zhang + options - options database, use `NULL` for default global database
24319e296098SJunchao Zhang . pre - the string to prepend to the name or `NULL`
24329e296098SJunchao Zhang - name - the option one is seeking
24339e296098SJunchao Zhang
24349e296098SJunchao Zhang Output Parameters:
24359e296098SJunchao Zhang + ivalue - the ternary logical value to return
24369e296098SJunchao Zhang - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
24379e296098SJunchao Zhang
24389e296098SJunchao Zhang Level: beginner
24399e296098SJunchao Zhang
24409e296098SJunchao Zhang Notes:
24419e296098SJunchao Zhang TRUE, true, YES, yes, ON, on, nostring and 1 all translate to `PETSC_BOOL3_TRUE`
24429e296098SJunchao Zhang FALSE, false, NO, no, OFF, off and 0 all translate to `PETSC_BOOL3_FALSE`
24439e296098SJunchao Zhang UNKNOWN, unknown, AUTO and auto all translate to `PETSC_BOOL3_UNKNOWN`
24449e296098SJunchao Zhang
24459e296098SJunchao Zhang If the option is given, but no value is provided, then `ivalue` will be set to `PETSC_BOOL3_TRUE` and `set` will be set to `PETSC_TRUE`. That is `-requested_bool3`
24469e296098SJunchao Zhang is equivalent to `-requested_bool3 true`
24479e296098SJunchao Zhang
24489e296098SJunchao Zhang If the user does not supply the option at all `ivalue` is NOT changed. Thus
24499e296098SJunchao Zhang you should ALWAYS initialize `ivalue` if you access it without first checking that the `set` flag is true.
24509e296098SJunchao Zhang
24519e296098SJunchao Zhang .seealso: `PetscOptionsGetBool()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`,
24529e296098SJunchao Zhang `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsGetInt()`, `PetscOptionsBool()`,
24539e296098SJunchao Zhang `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
24549e296098SJunchao Zhang `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
24559e296098SJunchao Zhang `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
24569e296098SJunchao Zhang `PetscOptionsFList()`, `PetscOptionsEList()`
24579e296098SJunchao Zhang @*/
PetscOptionsGetBool3(PetscOptions options,const char pre[],const char name[],PetscBool3 * ivalue,PetscBool * set)24589e296098SJunchao Zhang PetscErrorCode PetscOptionsGetBool3(PetscOptions options, const char pre[], const char name[], PetscBool3 *ivalue, PetscBool *set)
24599e296098SJunchao Zhang {
24609e296098SJunchao Zhang const char *value;
24619e296098SJunchao Zhang PetscBool flag;
24629e296098SJunchao Zhang
24639e296098SJunchao Zhang PetscFunctionBegin;
24649e296098SJunchao Zhang PetscAssertPointer(name, 3);
24659e296098SJunchao Zhang if (ivalue) PetscAssertPointer(ivalue, 4);
24669e296098SJunchao Zhang PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag));
24679e296098SJunchao Zhang if (flag) { // found the option
24689e296098SJunchao Zhang PetscBool isAUTO = PETSC_FALSE, isUNKNOWN = PETSC_FALSE;
24699e296098SJunchao Zhang
24709e296098SJunchao Zhang if (set) *set = PETSC_TRUE;
24719e296098SJunchao Zhang PetscCall(PetscStrcasecmp("AUTO", value, &isAUTO)); // auto or AUTO
24729e296098SJunchao Zhang if (!isAUTO) PetscCall(PetscStrcasecmp("UNKNOWN", value, &isUNKNOWN)); // unknown or UNKNOWN
24739e296098SJunchao Zhang if (isAUTO || isUNKNOWN) {
24749e296098SJunchao Zhang if (ivalue) *ivalue = PETSC_BOOL3_UNKNOWN;
24759e296098SJunchao Zhang } else { // handle boolean values (if no value is given, it returns true)
24769e296098SJunchao Zhang PetscCall(PetscOptionsStringToBool(value, &flag));
24779e296098SJunchao Zhang if (ivalue) *ivalue = PetscBoolToBool3(flag);
24789e296098SJunchao Zhang }
24799e296098SJunchao Zhang } else {
24809e296098SJunchao Zhang if (set) *set = PETSC_FALSE;
24819e296098SJunchao Zhang }
24829e296098SJunchao Zhang PetscFunctionReturn(PETSC_SUCCESS);
24839e296098SJunchao Zhang }
24849e296098SJunchao Zhang
24859e296098SJunchao Zhang /*@C
2486e5c89e4eSSatish Balay PetscOptionsGetEList - Puts a list of option values that a single one may be selected from
2487e5c89e4eSSatish Balay
2488e5c89e4eSSatish Balay Not Collective
2489e5c89e4eSSatish Balay
2490e5c89e4eSSatish Balay Input Parameters:
249120f4b53cSBarry Smith + options - options database, use `NULL` for default global database
249220f4b53cSBarry Smith . pre - the string to prepend to the name or `NULL`
2493e5c89e4eSSatish Balay . opt - option name
2494a264d7a6SBarry Smith . list - the possible choices (one of these must be selected, anything else is invalid)
2495a2b725a8SWilliam Gropp - ntext - number of choices
2496e5c89e4eSSatish Balay
2497d8d19677SJose E. Roman Output Parameters:
24982efd9cb1SBarry Smith + value - the index of the value to return (defaults to zero if the option name is given but no choice is listed)
2499811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
2500e5c89e4eSSatish Balay
2501e5c89e4eSSatish Balay Level: intermediate
2502e5c89e4eSSatish Balay
250395452b02SPatrick Sanan Notes:
25049314d9b7SBarry Smith If the user does not supply the option `value` is NOT changed. Thus
25059314d9b7SBarry Smith you should ALWAYS initialize `value` if you access it without first checking that the `set` flag is true.
25062efd9cb1SBarry Smith
2507811af0c4SBarry Smith See `PetscOptionsFList()` for when the choices are given in a `PetscFunctionList`
2508e5c89e4eSSatish Balay
2509db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`,
2510db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
2511db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
2512c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
2513db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
2514db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
2515e5c89e4eSSatish Balay @*/
PetscOptionsGetEList(PetscOptions options,const char pre[],const char opt[],const char * const list[],PetscInt ntext,PetscInt * value,PetscBool * set)2516ce78bad3SBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options, const char pre[], const char opt[], const char *const list[], PetscInt ntext, PetscInt *value, PetscBool *set)
2517d71ae5a4SJacob Faibussowitsch {
251858b0ac4eSStefano Zampini size_t alen, len = 0, tlen = 0;
2519e5c89e4eSSatish Balay char *svalue;
2520ace3abfcSBarry Smith PetscBool aset, flg = PETSC_FALSE;
2521e5c89e4eSSatish Balay PetscInt i;
2522e5c89e4eSSatish Balay
2523e5c89e4eSSatish Balay PetscFunctionBegin;
25244f572ea9SToby Isaac PetscAssertPointer(opt, 3);
2525e5c89e4eSSatish Balay for (i = 0; i < ntext; i++) {
25269566063dSJacob Faibussowitsch PetscCall(PetscStrlen(list[i], &alen));
2527e5c89e4eSSatish Balay if (alen > len) len = alen;
252858b0ac4eSStefano Zampini tlen += len + 1;
2529e5c89e4eSSatish Balay }
2530e5c89e4eSSatish Balay len += 5; /* a little extra space for user mistypes */
25319566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len, &svalue));
25329566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(options, pre, opt, svalue, len, &aset));
2533e5c89e4eSSatish Balay if (aset) {
25349566063dSJacob Faibussowitsch PetscCall(PetscEListFind(ntext, list, svalue, value, &flg));
253558b0ac4eSStefano Zampini if (!flg) {
2536c6a7a370SJeremy L Thompson char *avail;
253758b0ac4eSStefano Zampini
25389566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(tlen, &avail));
2539c6a7a370SJeremy L Thompson avail[0] = '\0';
254058b0ac4eSStefano Zampini for (i = 0; i < ntext; i++) {
2541c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(avail, list[i], tlen));
2542c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(avail, " ", tlen));
254358b0ac4eSStefano Zampini }
25449566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(avail));
254513d105a8SStefano Zampini SETERRQ(PETSC_COMM_SELF, PETSC_ERR_USER, "Unknown option \"%s\" for -%s%s. Available options: %s", svalue, pre ? pre : "", opt + 1, avail);
254658b0ac4eSStefano Zampini }
2547fbedd5e0SJed Brown if (set) *set = PETSC_TRUE;
2548a297a907SKarl Rupp } else if (set) *set = PETSC_FALSE;
25499566063dSJacob Faibussowitsch PetscCall(PetscFree(svalue));
25503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2551e5c89e4eSSatish Balay }
2552e5c89e4eSSatish Balay
2553e5c89e4eSSatish Balay /*@C
2554e5c89e4eSSatish Balay PetscOptionsGetEnum - Gets the enum value for a particular option in the database.
2555e5c89e4eSSatish Balay
2556e5c89e4eSSatish Balay Not Collective
2557e5c89e4eSSatish Balay
2558e5c89e4eSSatish Balay Input Parameters:
255920f4b53cSBarry Smith + options - options database, use `NULL` for default global database
256020f4b53cSBarry Smith . pre - option prefix or `NULL`
2561e5c89e4eSSatish Balay . opt - option name
25626b867d5aSJose E. Roman - list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
2563e5c89e4eSSatish Balay
2564d8d19677SJose E. Roman Output Parameters:
2565e5c89e4eSSatish Balay + value - the value to return
2566811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
2567e5c89e4eSSatish Balay
2568e5c89e4eSSatish Balay Level: beginner
2569e5c89e4eSSatish Balay
257095452b02SPatrick Sanan Notes:
25719314d9b7SBarry Smith If the user does not supply the option `value` is NOT changed. Thus
25729314d9b7SBarry Smith you should ALWAYS initialize `value` if you access it without first checking that the `set` flag is true.
2573e5c89e4eSSatish Balay
25749314d9b7SBarry Smith `list` is usually something like `PCASMTypes` or some other predefined list of enum names
2575e5c89e4eSSatish Balay
2576db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`,
2577db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`
2578aec76313SJacob Faibussowitsch `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`,
2579db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
2580c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
2581db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
2582db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsGetEList()`, `PetscOptionsEnum()`
2583e5c89e4eSSatish Balay @*/
PetscOptionsGetEnum(PetscOptions options,const char pre[],const char opt[],const char * const list[],PetscEnum * value,PetscBool * set)25846f8503afSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options, const char pre[], const char opt[], const char *const list[], PetscEnum *value, PetscBool *set) PeNSS
2585d71ae5a4SJacob Faibussowitsch {
258669a24498SJed Brown PetscInt ntext = 0, tval;
2587ace3abfcSBarry Smith PetscBool fset;
2588e5c89e4eSSatish Balay
2589e5c89e4eSSatish Balay PetscFunctionBegin;
25904f572ea9SToby Isaac PetscAssertPointer(opt, 3);
2591ad540459SPierre Jolivet while (list[ntext++]) PetscCheck(ntext <= 50, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "List argument appears to be wrong or have more than 50 entries");
259208401ef6SPierre Jolivet PetscCheck(ntext >= 3, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "List argument must have at least two entries: typename and type prefix");
2593e5c89e4eSSatish Balay ntext -= 3;
25949566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetEList(options, pre, opt, list, ntext, &tval, &fset));
259569a24498SJed Brown /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */
2596809ceb46SBarry Smith if (fset) *value = (PetscEnum)tval;
2597809ceb46SBarry Smith if (set) *set = fset;
25983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2599e5c89e4eSSatish Balay }
2600e5c89e4eSSatish Balay
2601e5c89e4eSSatish Balay /*@C
26022d747510SLisandro Dalcin PetscOptionsGetInt - Gets the integer value for a particular option in the database.
2603e5c89e4eSSatish Balay
2604e5c89e4eSSatish Balay Not Collective
2605e5c89e4eSSatish Balay
2606e5c89e4eSSatish Balay Input Parameters:
260720f4b53cSBarry Smith + options - options database, use `NULL` for default global database
260820f4b53cSBarry Smith . pre - the string to prepend to the name or `NULL`
2609e5c89e4eSSatish Balay - name - the option one is seeking
2610e5c89e4eSSatish Balay
2611d8d19677SJose E. Roman Output Parameters:
26122d747510SLisandro Dalcin + ivalue - the integer value to return
2613811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
2614e5c89e4eSSatish Balay
2615e5c89e4eSSatish Balay Level: beginner
2616e5c89e4eSSatish Balay
2617e5c89e4eSSatish Balay Notes:
26189314d9b7SBarry Smith If the user does not supply the option `ivalue` is NOT changed. Thus
26199314d9b7SBarry Smith you should ALWAYS initialize the `ivalue` if you access it without first checking that the `set` flag is true.
26205c07ccb8SBarry Smith
2621b3480c81SBarry Smith Accepts the special values `determine`, `decide` and `unlimited`.
2622b3480c81SBarry Smith
2623b3480c81SBarry Smith Accepts the deprecated value `default`.
2624b3480c81SBarry Smith
2625db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`,
2626db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`
2627aec76313SJacob Faibussowitsch `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`,
2628db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
2629c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
2630db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
2631db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
2632e5c89e4eSSatish Balay @*/
PetscOptionsGetInt(PetscOptions options,const char pre[],const char name[],PetscInt * ivalue,PetscBool * set)2633d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetInt(PetscOptions options, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
2634d71ae5a4SJacob Faibussowitsch {
26352d747510SLisandro Dalcin const char *value;
26362d747510SLisandro Dalcin PetscBool flag;
2637e5c89e4eSSatish Balay
2638e5c89e4eSSatish Balay PetscFunctionBegin;
26394f572ea9SToby Isaac PetscAssertPointer(name, 3);
26404f572ea9SToby Isaac PetscAssertPointer(ivalue, 4);
26419566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag));
2642e5c89e4eSSatish Balay if (flag) {
264334a9cc2cSBarry Smith if (!value) {
26442d747510SLisandro Dalcin if (set) *set = PETSC_FALSE;
264534a9cc2cSBarry Smith } else {
26462d747510SLisandro Dalcin if (set) *set = PETSC_TRUE;
26479566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value, ivalue));
2648e5c89e4eSSatish Balay }
2649e5c89e4eSSatish Balay } else {
265096ef3cdfSSatish Balay if (set) *set = PETSC_FALSE;
2651e5c89e4eSSatish Balay }
26523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2653e5c89e4eSSatish Balay }
2654e5c89e4eSSatish Balay
2655e2446a98SMatthew Knepley /*@C
26566497c311SBarry Smith PetscOptionsGetMPIInt - Gets the MPI integer value for a particular option in the database.
26576497c311SBarry Smith
26586497c311SBarry Smith Not Collective
26596497c311SBarry Smith
26606497c311SBarry Smith Input Parameters:
26616497c311SBarry Smith + options - options database, use `NULL` for default global database
26626497c311SBarry Smith . pre - the string to prepend to the name or `NULL`
26636497c311SBarry Smith - name - the option one is seeking
26646497c311SBarry Smith
26656497c311SBarry Smith Output Parameters:
26666497c311SBarry Smith + ivalue - the MPI integer value to return
26676497c311SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
26686497c311SBarry Smith
26696497c311SBarry Smith Level: beginner
26706497c311SBarry Smith
26716497c311SBarry Smith Notes:
26726497c311SBarry Smith If the user does not supply the option `ivalue` is NOT changed. Thus
26736497c311SBarry Smith you should ALWAYS initialize the `ivalue` if you access it without first checking that the `set` flag is true.
26746497c311SBarry Smith
26756497c311SBarry Smith Accepts the special values `determine`, `decide` and `unlimited`.
26766497c311SBarry Smith
26776497c311SBarry Smith Accepts the deprecated value `default`.
26786497c311SBarry Smith
26796497c311SBarry Smith .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`,
26806497c311SBarry Smith `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`
26816497c311SBarry Smith `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`,
26826497c311SBarry Smith `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
26836497c311SBarry Smith `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
26846497c311SBarry Smith `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
26856497c311SBarry Smith `PetscOptionsFList()`, `PetscOptionsEList()`
26866497c311SBarry Smith @*/
PetscOptionsGetMPIInt(PetscOptions options,const char pre[],const char name[],PetscMPIInt * ivalue,PetscBool * set)26876497c311SBarry Smith PetscErrorCode PetscOptionsGetMPIInt(PetscOptions options, const char pre[], const char name[], PetscMPIInt *ivalue, PetscBool *set)
26886497c311SBarry Smith {
26896497c311SBarry Smith PetscInt value;
26906497c311SBarry Smith PetscBool flag;
26916497c311SBarry Smith
26926497c311SBarry Smith PetscFunctionBegin;
26936497c311SBarry Smith PetscCall(PetscOptionsGetInt(options, pre, name, &value, &flag));
26946497c311SBarry Smith if (flag) PetscCall(PetscMPIIntCast(value, ivalue));
26956497c311SBarry Smith if (set) *set = flag;
26966497c311SBarry Smith PetscFunctionReturn(PETSC_SUCCESS);
26976497c311SBarry Smith }
26986497c311SBarry Smith
26996497c311SBarry Smith /*@C
2700e5c89e4eSSatish Balay PetscOptionsGetReal - Gets the double precision value for a particular
2701e5c89e4eSSatish Balay option in the database.
2702e5c89e4eSSatish Balay
2703e5c89e4eSSatish Balay Not Collective
2704e5c89e4eSSatish Balay
2705e5c89e4eSSatish Balay Input Parameters:
270620f4b53cSBarry Smith + options - options database, use `NULL` for default global database
270720f4b53cSBarry Smith . pre - string to prepend to each name or `NULL`
2708e5c89e4eSSatish Balay - name - the option one is seeking
2709e5c89e4eSSatish Balay
2710d8d19677SJose E. Roman Output Parameters:
2711e5c89e4eSSatish Balay + dvalue - the double value to return
2712811af0c4SBarry Smith - set - `PETSC_TRUE` if found, `PETSC_FALSE` if not found
2713e5c89e4eSSatish Balay
271420f4b53cSBarry Smith Level: beginner
271520f4b53cSBarry Smith
2716b3480c81SBarry Smith Notes:
2717b3480c81SBarry Smith Accepts the special values `determine`, `decide` and `unlimited`.
2718b3480c81SBarry Smith
2719b3480c81SBarry Smith Accepts the deprecated value `default`
2720b3480c81SBarry Smith
27219314d9b7SBarry Smith If the user does not supply the option `dvalue` is NOT changed. Thus
27229314d9b7SBarry Smith you should ALWAYS initialize `dvalue` if you access it without first checking that the `set` flag is true.
2723e4974155SBarry Smith
2724db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`,
2725c2e3fba1SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
2726db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
2727c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
2728db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
2729db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
2730e5c89e4eSSatish Balay @*/
PetscOptionsGetReal(PetscOptions options,const char pre[],const char name[],PetscReal * dvalue,PetscBool * set)2731d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetReal(PetscOptions options, const char pre[], const char name[], PetscReal *dvalue, PetscBool *set)
2732d71ae5a4SJacob Faibussowitsch {
27332d747510SLisandro Dalcin const char *value;
2734ace3abfcSBarry Smith PetscBool flag;
2735e5c89e4eSSatish Balay
2736e5c89e4eSSatish Balay PetscFunctionBegin;
27374f572ea9SToby Isaac PetscAssertPointer(name, 3);
27384f572ea9SToby Isaac PetscAssertPointer(dvalue, 4);
27399566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag));
2740e5c89e4eSSatish Balay if (flag) {
2741a297a907SKarl Rupp if (!value) {
2742a297a907SKarl Rupp if (set) *set = PETSC_FALSE;
2743a297a907SKarl Rupp } else {
2744a297a907SKarl Rupp if (set) *set = PETSC_TRUE;
27459566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value, dvalue));
2746a297a907SKarl Rupp }
2747e5c89e4eSSatish Balay } else {
274896ef3cdfSSatish Balay if (set) *set = PETSC_FALSE;
2749e5c89e4eSSatish Balay }
27503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2751e5c89e4eSSatish Balay }
2752e5c89e4eSSatish Balay
2753e5c89e4eSSatish Balay /*@C
2754e5c89e4eSSatish Balay PetscOptionsGetScalar - Gets the scalar value for a particular
2755e5c89e4eSSatish Balay option in the database.
2756e5c89e4eSSatish Balay
2757e5c89e4eSSatish Balay Not Collective
2758e5c89e4eSSatish Balay
2759e5c89e4eSSatish Balay Input Parameters:
276020f4b53cSBarry Smith + options - options database, use `NULL` for default global database
276120f4b53cSBarry Smith . pre - string to prepend to each name or `NULL`
2762e5c89e4eSSatish Balay - name - the option one is seeking
2763e5c89e4eSSatish Balay
2764d8d19677SJose E. Roman Output Parameters:
27659314d9b7SBarry Smith + dvalue - the scalar value to return
2766811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
2767e5c89e4eSSatish Balay
2768e5c89e4eSSatish Balay Level: beginner
2769e5c89e4eSSatish Balay
277010450e9eSJacob Faibussowitsch Example Usage:
2771eb4ae41dSBarry Smith A complex number 2+3i must be specified with NO spaces
2772e5c89e4eSSatish Balay
2773811af0c4SBarry Smith Note:
27749314d9b7SBarry Smith If the user does not supply the option `dvalue` is NOT changed. Thus
27759314d9b7SBarry Smith you should ALWAYS initialize `dvalue` if you access it without first checking if the `set` flag is true.
2776e4974155SBarry Smith
2777db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`,
2778db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
2779db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
2780c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
2781db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
2782db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
2783e5c89e4eSSatish Balay @*/
PetscOptionsGetScalar(PetscOptions options,const char pre[],const char name[],PetscScalar * dvalue,PetscBool * set)2784d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetScalar(PetscOptions options, const char pre[], const char name[], PetscScalar *dvalue, PetscBool *set)
2785d71ae5a4SJacob Faibussowitsch {
27862d747510SLisandro Dalcin const char *value;
2787ace3abfcSBarry Smith PetscBool flag;
2788e5c89e4eSSatish Balay
2789e5c89e4eSSatish Balay PetscFunctionBegin;
27904f572ea9SToby Isaac PetscAssertPointer(name, 3);
27914f572ea9SToby Isaac PetscAssertPointer(dvalue, 4);
27929566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag));
2793e5c89e4eSSatish Balay if (flag) {
2794e5c89e4eSSatish Balay if (!value) {
279596ef3cdfSSatish Balay if (set) *set = PETSC_FALSE;
2796e5c89e4eSSatish Balay } else {
2797e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX)
27989566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value, dvalue));
2799e5c89e4eSSatish Balay #else
28009566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToScalar(value, dvalue));
2801e5c89e4eSSatish Balay #endif
280296ef3cdfSSatish Balay if (set) *set = PETSC_TRUE;
2803e5c89e4eSSatish Balay }
2804e5c89e4eSSatish Balay } else { /* flag */
280596ef3cdfSSatish Balay if (set) *set = PETSC_FALSE;
2806e5c89e4eSSatish Balay }
28073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2808e5c89e4eSSatish Balay }
2809e5c89e4eSSatish Balay
2810e5c89e4eSSatish Balay /*@C
2811e5c89e4eSSatish Balay PetscOptionsGetString - Gets the string value for a particular option in
2812e5c89e4eSSatish Balay the database.
2813e5c89e4eSSatish Balay
2814e5c89e4eSSatish Balay Not Collective
2815e5c89e4eSSatish Balay
2816e5c89e4eSSatish Balay Input Parameters:
281720f4b53cSBarry Smith + options - options database, use `NULL` for default global database
281820f4b53cSBarry Smith . pre - string to prepend to name or `NULL`
2819e5c89e4eSSatish Balay . name - the option one is seeking
2820bcbf2dc5SJed Brown - len - maximum length of the string including null termination
2821e5c89e4eSSatish Balay
2822e5c89e4eSSatish Balay Output Parameters:
2823e5c89e4eSSatish Balay + string - location to copy string
2824811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
2825e5c89e4eSSatish Balay
2826e5c89e4eSSatish Balay Level: beginner
2827e5c89e4eSSatish Balay
282820f4b53cSBarry Smith Note:
28299314d9b7SBarry Smith 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`
283020f4b53cSBarry Smith
28319314d9b7SBarry Smith If the user does not use the option then `string` is not changed. Thus
28329314d9b7SBarry Smith you should ALWAYS initialize `string` if you access it without first checking that the `set` flag is true.
283320f4b53cSBarry Smith
2834aec76313SJacob Faibussowitsch Fortran Notes:
2835e5c89e4eSSatish Balay The Fortran interface is slightly different from the C/C++
2836feaf08eaSBarry Smith interface. Sample usage in Fortran follows
2837e5c89e4eSSatish Balay .vb
2838e5c89e4eSSatish Balay character *20 string
283993e6ba5cSBarry Smith PetscErrorCode ierr
284093e6ba5cSBarry Smith PetscBool set
28411b266c99SBarry Smith call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr)
2842e5c89e4eSSatish Balay .ve
2843e5c89e4eSSatish Balay
2844db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`,
2845db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
2846db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
2847c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
2848db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
2849db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
2850e5c89e4eSSatish Balay @*/
PetscOptionsGetString(PetscOptions options,const char pre[],const char name[],char string[],size_t len,PetscBool * set)2851ce78bad3SBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options, const char pre[], const char name[], char string[], size_t len, PetscBool *set) PeNS
2852d71ae5a4SJacob Faibussowitsch {
28532d747510SLisandro Dalcin const char *value;
2854ace3abfcSBarry Smith PetscBool flag;
2855e5c89e4eSSatish Balay
2856e5c89e4eSSatish Balay PetscFunctionBegin;
28574f572ea9SToby Isaac PetscAssertPointer(name, 3);
28584f572ea9SToby Isaac PetscAssertPointer(string, 4);
28599566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag));
2860e5c89e4eSSatish Balay if (!flag) {
286196ef3cdfSSatish Balay if (set) *set = PETSC_FALSE;
2862e5c89e4eSSatish Balay } else {
286396ef3cdfSSatish Balay if (set) *set = PETSC_TRUE;
28649566063dSJacob Faibussowitsch if (value) PetscCall(PetscStrncpy(string, value, len));
28659566063dSJacob Faibussowitsch else PetscCall(PetscArrayzero(string, len));
2866e5c89e4eSSatish Balay }
28673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2868e5c89e4eSSatish Balay }
2869e5c89e4eSSatish Balay
28702d747510SLisandro Dalcin /*@C
28712d747510SLisandro Dalcin PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular
2872f1a722f8SMatthew G. Knepley option in the database. The values must be separated with commas with no intervening spaces.
28732d747510SLisandro Dalcin
28742d747510SLisandro Dalcin Not Collective
28752d747510SLisandro Dalcin
28762d747510SLisandro Dalcin Input Parameters:
287720f4b53cSBarry Smith + options - options database, use `NULL` for default global database
287820f4b53cSBarry Smith . pre - string to prepend to each name or `NULL`
28796b867d5aSJose E. Roman - name - the option one is seeking
28806b867d5aSJose E. Roman
2881d8d19677SJose E. Roman Output Parameters:
28829314d9b7SBarry Smith + dvalue - the Boolean values to return
2883f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved
2884811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
28852d747510SLisandro Dalcin
28862d747510SLisandro Dalcin Level: beginner
28872d747510SLisandro Dalcin
2888811af0c4SBarry Smith Note:
288920f4b53cSBarry Smith TRUE, true, YES, yes, nostring, and 1 all translate to `PETSC_TRUE`. FALSE, false, NO, no, and 0 all translate to `PETSC_FALSE`
28902d747510SLisandro Dalcin
2891db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`,
2892db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
2893db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
2894c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
2895db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
2896db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
28972d747510SLisandro Dalcin @*/
PetscOptionsGetBoolArray(PetscOptions options,const char pre[],const char name[],PetscBool dvalue[],PetscInt * nmax,PetscBool * set)2898d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options, const char pre[], const char name[], PetscBool dvalue[], PetscInt *nmax, PetscBool *set)
2899d71ae5a4SJacob Faibussowitsch {
29002d747510SLisandro Dalcin const char *svalue;
2901ce78bad3SBarry Smith const char *value;
29022d747510SLisandro Dalcin PetscInt n = 0;
29032d747510SLisandro Dalcin PetscBool flag;
29042d747510SLisandro Dalcin PetscToken token;
29052d747510SLisandro Dalcin
29062d747510SLisandro Dalcin PetscFunctionBegin;
29074f572ea9SToby Isaac PetscAssertPointer(name, 3);
29084f572ea9SToby Isaac PetscAssertPointer(nmax, 5);
2909ff757e9eSStefano Zampini if (*nmax) PetscAssertPointer(dvalue, 4);
29102d747510SLisandro Dalcin
29119566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag));
29129371c9d4SSatish Balay if (!flag || !svalue) {
29139371c9d4SSatish Balay if (set) *set = PETSC_FALSE;
29149371c9d4SSatish Balay *nmax = 0;
29153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
29169371c9d4SSatish Balay }
29172d747510SLisandro Dalcin if (set) *set = PETSC_TRUE;
29189566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token));
29199566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
29202d747510SLisandro Dalcin while (value && n < *nmax) {
29219566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(value, dvalue));
29229566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
29232d747510SLisandro Dalcin dvalue++;
29242d747510SLisandro Dalcin n++;
29252d747510SLisandro Dalcin }
29269566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token));
29272d747510SLisandro Dalcin *nmax = n;
29283ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
29292d747510SLisandro Dalcin }
29302d747510SLisandro Dalcin
29312d747510SLisandro Dalcin /*@C
29322d747510SLisandro Dalcin PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database.
29332d747510SLisandro Dalcin
29342d747510SLisandro Dalcin Not Collective
29352d747510SLisandro Dalcin
29362d747510SLisandro Dalcin Input Parameters:
293720f4b53cSBarry Smith + options - options database, use `NULL` for default global database
293820f4b53cSBarry Smith . pre - option prefix or `NULL`
29392d747510SLisandro Dalcin . name - option name
29406b867d5aSJose E. Roman - list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null
29416b867d5aSJose E. Roman
29422d747510SLisandro Dalcin Output Parameters:
29432d747510SLisandro Dalcin + ivalue - the enum values to return
2944f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved
2945811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
29462d747510SLisandro Dalcin
29472d747510SLisandro Dalcin Level: beginner
29482d747510SLisandro Dalcin
29492d747510SLisandro Dalcin Notes:
29509314d9b7SBarry Smith The array must be passed as a comma separated list with no spaces between the items.
29512d747510SLisandro Dalcin
29529314d9b7SBarry Smith `list` is usually something like `PCASMTypes` or some other predefined list of enum names.
29532d747510SLisandro Dalcin
2954db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`,
2955db781477SPatrick Sanan `PetscOptionsGetEnum()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`
2956aec76313SJacob Faibussowitsch `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsName()`,
2957c2e3fba1SPatrick Sanan `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, `PetscOptionsStringArray()`, `PetscOptionsRealArray()`,
2958db781477SPatrick Sanan `PetscOptionsScalar()`, `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
2959db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsGetEList()`, `PetscOptionsEnum()`
29602d747510SLisandro Dalcin @*/
PetscOptionsGetEnumArray(PetscOptions options,const char pre[],const char name[],const char * const list[],PetscEnum ivalue[],PetscInt * nmax,PetscBool * set)2961ce78bad3SBarry Smith PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options, const char pre[], const char name[], const char *const list[], PetscEnum ivalue[], PetscInt *nmax, PetscBool *set)
2962d71ae5a4SJacob Faibussowitsch {
29632d747510SLisandro Dalcin const char *svalue;
2964ce78bad3SBarry Smith const char *value;
29652d747510SLisandro Dalcin PetscInt n = 0;
29662d747510SLisandro Dalcin PetscEnum evalue;
29672d747510SLisandro Dalcin PetscBool flag;
29682d747510SLisandro Dalcin PetscToken token;
29692d747510SLisandro Dalcin
29702d747510SLisandro Dalcin PetscFunctionBegin;
29714f572ea9SToby Isaac PetscAssertPointer(name, 3);
29724f572ea9SToby Isaac PetscAssertPointer(list, 4);
29734f572ea9SToby Isaac PetscAssertPointer(nmax, 6);
2974ff757e9eSStefano Zampini if (*nmax) PetscAssertPointer(ivalue, 5);
29752d747510SLisandro Dalcin
29769566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag));
29779371c9d4SSatish Balay if (!flag || !svalue) {
29789371c9d4SSatish Balay if (set) *set = PETSC_FALSE;
29799371c9d4SSatish Balay *nmax = 0;
29803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
29819371c9d4SSatish Balay }
29822d747510SLisandro Dalcin if (set) *set = PETSC_TRUE;
29839566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token));
29849566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
29852d747510SLisandro Dalcin while (value && n < *nmax) {
29869566063dSJacob Faibussowitsch PetscCall(PetscEnumFind(list, value, &evalue, &flag));
298728b400f6SJacob Faibussowitsch PetscCheck(flag, PETSC_COMM_SELF, PETSC_ERR_USER, "Unknown enum value '%s' for -%s%s", svalue, pre ? pre : "", name + 1);
29882d747510SLisandro Dalcin ivalue[n++] = evalue;
29899566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
29902d747510SLisandro Dalcin }
29919566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token));
29922d747510SLisandro Dalcin *nmax = n;
29933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
29942d747510SLisandro Dalcin }
29952d747510SLisandro Dalcin
29962d747510SLisandro Dalcin /*@C
2997f1a722f8SMatthew G. Knepley PetscOptionsGetIntArray - Gets an array of integer values for a particular option in the database.
29982d747510SLisandro Dalcin
29992d747510SLisandro Dalcin Not Collective
30002d747510SLisandro Dalcin
30012d747510SLisandro Dalcin Input Parameters:
300220f4b53cSBarry Smith + options - options database, use `NULL` for default global database
300320f4b53cSBarry Smith . pre - string to prepend to each name or `NULL`
30046b867d5aSJose E. Roman - name - the option one is seeking
30056b867d5aSJose E. Roman
3006d8d19677SJose E. Roman Output Parameters:
30072d747510SLisandro Dalcin + ivalue - the integer values to return
3008f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved
3009811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
30102d747510SLisandro Dalcin
30112d747510SLisandro Dalcin Level: beginner
30122d747510SLisandro Dalcin
30132d747510SLisandro Dalcin Notes:
30142d747510SLisandro Dalcin The array can be passed as
3015811af0c4SBarry Smith + a comma separated list - 0,1,2,3,4,5,6,7
3016811af0c4SBarry Smith . a range (start\-end+1) - 0-8
3017811af0c4SBarry Smith . a range with given increment (start\-end+1:inc) - 0-7:2
3018811af0c4SBarry Smith - a combination of values and ranges separated by commas - 0,1-8,8-15:2
30192d747510SLisandro Dalcin
30202d747510SLisandro Dalcin There must be no intervening spaces between the values.
30212d747510SLisandro Dalcin
3022db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`,
3023db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
3024db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
3025c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
3026db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
3027db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
30282d747510SLisandro Dalcin @*/
PetscOptionsGetIntArray(PetscOptions options,const char pre[],const char name[],PetscInt ivalue[],PetscInt * nmax,PetscBool * set)3029d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetIntArray(PetscOptions options, const char pre[], const char name[], PetscInt ivalue[], PetscInt *nmax, PetscBool *set)
3030d71ae5a4SJacob Faibussowitsch {
30312d747510SLisandro Dalcin const char *svalue;
3032ce78bad3SBarry Smith const char *value;
30332d747510SLisandro Dalcin PetscInt n = 0, i, j, start, end, inc, nvalues;
30342d747510SLisandro Dalcin size_t len;
30352d747510SLisandro Dalcin PetscBool flag, foundrange;
30362d747510SLisandro Dalcin PetscToken token;
30372d747510SLisandro Dalcin
30382d747510SLisandro Dalcin PetscFunctionBegin;
30394f572ea9SToby Isaac PetscAssertPointer(name, 3);
30404f572ea9SToby Isaac PetscAssertPointer(nmax, 5);
3041ff757e9eSStefano Zampini if (*nmax) PetscAssertPointer(ivalue, 4);
30422d747510SLisandro Dalcin
30439566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag));
30449371c9d4SSatish Balay if (!flag || !svalue) {
30459371c9d4SSatish Balay if (set) *set = PETSC_FALSE;
30469371c9d4SSatish Balay *nmax = 0;
30473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
30489371c9d4SSatish Balay }
30492d747510SLisandro Dalcin if (set) *set = PETSC_TRUE;
30509566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token));
30519566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
30522d747510SLisandro Dalcin while (value && n < *nmax) {
3053ce78bad3SBarry Smith char *iivalue;
3054ce78bad3SBarry Smith
30552d747510SLisandro Dalcin /* look for form d-D where d and D are integers */
3056ce78bad3SBarry Smith PetscCall(PetscStrallocpy(value, &iivalue));
30572d747510SLisandro Dalcin foundrange = PETSC_FALSE;
3058ce78bad3SBarry Smith PetscCall(PetscStrlen(iivalue, &len));
3059ce78bad3SBarry Smith if (iivalue[0] == '-') i = 2;
30602d747510SLisandro Dalcin else i = 1;
30612d747510SLisandro Dalcin for (; i < (int)len; i++) {
3062ce78bad3SBarry Smith if (iivalue[i] == '-') {
3063ce78bad3SBarry Smith PetscCheck(i != (int)len - 1, PETSC_COMM_SELF, PETSC_ERR_USER, "Error in %" PetscInt_FMT "-th array entry %s", n, iivalue);
3064ce78bad3SBarry Smith iivalue[i] = 0;
30652d747510SLisandro Dalcin
3066ce78bad3SBarry Smith PetscCall(PetscOptionsStringToInt(iivalue, &start));
30672d747510SLisandro Dalcin inc = 1;
30682d747510SLisandro Dalcin j = i + 1;
30692d747510SLisandro Dalcin for (; j < (int)len; j++) {
3070ce78bad3SBarry Smith if (iivalue[j] == ':') {
3071ce78bad3SBarry Smith iivalue[j] = 0;
30722d747510SLisandro Dalcin
3073ce78bad3SBarry Smith PetscCall(PetscOptionsStringToInt(iivalue + j + 1, &inc));
3074ce78bad3SBarry Smith PetscCheck(inc > 0, PETSC_COMM_SELF, PETSC_ERR_USER, "Error in %" PetscInt_FMT "-th array entry,%s cannot have negative increment", n, iivalue + j + 1);
30752d747510SLisandro Dalcin break;
30762d747510SLisandro Dalcin }
30772d747510SLisandro Dalcin }
3078ce78bad3SBarry Smith PetscCall(PetscOptionsStringToInt(iivalue + i + 1, &end));
3079ce78bad3SBarry Smith PetscCheck(end > start, PETSC_COMM_SELF, PETSC_ERR_USER, "Error in %" PetscInt_FMT "-th array entry, %s-%s cannot have decreasing list", n, iivalue, iivalue + i + 1);
30802d747510SLisandro Dalcin nvalues = (end - start) / inc + (end - start) % inc;
3081cc73adaaSBarry Smith PetscCheck(n + nvalues <= *nmax, PETSC_COMM_SELF, PETSC_ERR_USER, "Error in %" PetscInt_FMT "-th array entry, not enough space left in array (%" PetscInt_FMT ") to contain entire range from %" PetscInt_FMT " to %" PetscInt_FMT, n, *nmax - n, start, end);
30822d747510SLisandro Dalcin for (; start < end; start += inc) {
30839371c9d4SSatish Balay *ivalue = start;
30849371c9d4SSatish Balay ivalue++;
30859371c9d4SSatish Balay n++;
30862d747510SLisandro Dalcin }
30872d747510SLisandro Dalcin foundrange = PETSC_TRUE;
30882d747510SLisandro Dalcin break;
30892d747510SLisandro Dalcin }
30902d747510SLisandro Dalcin }
30912d747510SLisandro Dalcin if (!foundrange) {
30929566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value, ivalue));
30932d747510SLisandro Dalcin ivalue++;
30942d747510SLisandro Dalcin n++;
30952d747510SLisandro Dalcin }
3096ce78bad3SBarry Smith PetscCall(PetscFree(iivalue));
30979566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
30982d747510SLisandro Dalcin }
30999566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token));
31002d747510SLisandro Dalcin *nmax = n;
31013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
31022d747510SLisandro Dalcin }
31032d747510SLisandro Dalcin
31042d747510SLisandro Dalcin /*@C
31052d747510SLisandro Dalcin PetscOptionsGetRealArray - Gets an array of double precision values for a
3106f1a722f8SMatthew G. Knepley particular option in the database. The values must be separated with commas with no intervening spaces.
31072d747510SLisandro Dalcin
31082d747510SLisandro Dalcin Not Collective
31092d747510SLisandro Dalcin
31102d747510SLisandro Dalcin Input Parameters:
311120f4b53cSBarry Smith + options - options database, use `NULL` for default global database
311220f4b53cSBarry Smith . pre - string to prepend to each name or `NULL`
31136b867d5aSJose E. Roman - name - the option one is seeking
31146b867d5aSJose E. Roman
31152d747510SLisandro Dalcin Output Parameters:
31162d747510SLisandro Dalcin + dvalue - the double values to return
3117f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved
3118811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
31192d747510SLisandro Dalcin
31202d747510SLisandro Dalcin Level: beginner
31212d747510SLisandro Dalcin
3122db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`,
3123db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`,
3124db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
3125c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
3126db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
3127db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
31282d747510SLisandro Dalcin @*/
PetscOptionsGetRealArray(PetscOptions options,const char pre[],const char name[],PetscReal dvalue[],PetscInt * nmax,PetscBool * set)3129d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetRealArray(PetscOptions options, const char pre[], const char name[], PetscReal dvalue[], PetscInt *nmax, PetscBool *set)
3130d71ae5a4SJacob Faibussowitsch {
31312d747510SLisandro Dalcin const char *svalue;
3132ce78bad3SBarry Smith const char *value;
31332d747510SLisandro Dalcin PetscInt n = 0;
31342d747510SLisandro Dalcin PetscBool flag;
31352d747510SLisandro Dalcin PetscToken token;
31362d747510SLisandro Dalcin
31372d747510SLisandro Dalcin PetscFunctionBegin;
31384f572ea9SToby Isaac PetscAssertPointer(name, 3);
31394f572ea9SToby Isaac PetscAssertPointer(nmax, 5);
3140ff757e9eSStefano Zampini if (*nmax) PetscAssertPointer(dvalue, 4);
31412d747510SLisandro Dalcin
31429566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag));
31439371c9d4SSatish Balay if (!flag || !svalue) {
31449371c9d4SSatish Balay if (set) *set = PETSC_FALSE;
31459371c9d4SSatish Balay *nmax = 0;
31463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
31479371c9d4SSatish Balay }
31482d747510SLisandro Dalcin if (set) *set = PETSC_TRUE;
31499566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token));
31509566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
31512d747510SLisandro Dalcin while (value && n < *nmax) {
31529566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value, dvalue++));
31539566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
31542d747510SLisandro Dalcin n++;
31552d747510SLisandro Dalcin }
31569566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token));
31572d747510SLisandro Dalcin *nmax = n;
31583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
31592d747510SLisandro Dalcin }
31602d747510SLisandro Dalcin
31612d747510SLisandro Dalcin /*@C
31622d747510SLisandro Dalcin PetscOptionsGetScalarArray - Gets an array of scalars for a
3163f1a722f8SMatthew G. Knepley particular option in the database. The values must be separated with commas with no intervening spaces.
31642d747510SLisandro Dalcin
31652d747510SLisandro Dalcin Not Collective
31662d747510SLisandro Dalcin
31672d747510SLisandro Dalcin Input Parameters:
316820f4b53cSBarry Smith + options - options database, use `NULL` for default global database
316920f4b53cSBarry Smith . pre - string to prepend to each name or `NULL`
31706b867d5aSJose E. Roman - name - the option one is seeking
31716b867d5aSJose E. Roman
31722d747510SLisandro Dalcin Output Parameters:
31732d747510SLisandro Dalcin + dvalue - the scalar values to return
3174f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved
3175811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
31762d747510SLisandro Dalcin
31772d747510SLisandro Dalcin Level: beginner
31782d747510SLisandro Dalcin
3179db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`,
3180db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`,
3181db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
3182c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
3183db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
3184db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
31852d747510SLisandro Dalcin @*/
PetscOptionsGetScalarArray(PetscOptions options,const char pre[],const char name[],PetscScalar dvalue[],PetscInt * nmax,PetscBool * set)3186d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options, const char pre[], const char name[], PetscScalar dvalue[], PetscInt *nmax, PetscBool *set)
3187d71ae5a4SJacob Faibussowitsch {
31882d747510SLisandro Dalcin const char *svalue;
3189ce78bad3SBarry Smith const char *value;
31902d747510SLisandro Dalcin PetscInt n = 0;
31912d747510SLisandro Dalcin PetscBool flag;
31922d747510SLisandro Dalcin PetscToken token;
31932d747510SLisandro Dalcin
31942d747510SLisandro Dalcin PetscFunctionBegin;
31954f572ea9SToby Isaac PetscAssertPointer(name, 3);
31964f572ea9SToby Isaac PetscAssertPointer(nmax, 5);
3197ff757e9eSStefano Zampini if (*nmax) PetscAssertPointer(dvalue, 4);
31982d747510SLisandro Dalcin
31999566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag));
32009371c9d4SSatish Balay if (!flag || !svalue) {
32019371c9d4SSatish Balay if (set) *set = PETSC_FALSE;
32029371c9d4SSatish Balay *nmax = 0;
32033ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
32049371c9d4SSatish Balay }
32052d747510SLisandro Dalcin if (set) *set = PETSC_TRUE;
32069566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token));
32079566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
32082d747510SLisandro Dalcin while (value && n < *nmax) {
32099566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToScalar(value, dvalue++));
32109566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
32112d747510SLisandro Dalcin n++;
32122d747510SLisandro Dalcin }
32139566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token));
32142d747510SLisandro Dalcin *nmax = n;
32153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
32162d747510SLisandro Dalcin }
321714ce751eSBarry Smith
3218e5c89e4eSSatish Balay /*@C
3219e5c89e4eSSatish Balay PetscOptionsGetStringArray - Gets an array of string values for a particular
3220f1a722f8SMatthew G. Knepley option in the database. The values must be separated with commas with no intervening spaces.
3221e5c89e4eSSatish Balay
3222cf53795eSBarry Smith Not Collective; No Fortran Support
3223e5c89e4eSSatish Balay
3224e5c89e4eSSatish Balay Input Parameters:
322520f4b53cSBarry Smith + options - options database, use `NULL` for default global database
322620f4b53cSBarry Smith . pre - string to prepend to name or `NULL`
32276b867d5aSJose E. Roman - name - the option one is seeking
32286b867d5aSJose E. Roman
3229e7b76fa7SPatrick Sanan Output Parameters:
3230e5c89e4eSSatish Balay + strings - location to copy strings
3231f1a722f8SMatthew G. Knepley . nmax - On input maximum number of strings, on output the actual number of strings found
3232811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE`
3233e5c89e4eSSatish Balay
3234e5c89e4eSSatish Balay Level: beginner
3235e5c89e4eSSatish Balay
3236e5c89e4eSSatish Balay Notes:
32379314d9b7SBarry Smith The `nmax` parameter is used for both input and output.
3238e7b76fa7SPatrick Sanan
3239ce78bad3SBarry Smith The user should pass in an array of pointers to `char`, to hold all the
3240e5c89e4eSSatish Balay strings returned by this function.
3241e5c89e4eSSatish Balay
3242e5c89e4eSSatish Balay The user is responsible for deallocating the strings that are
3243cf53795eSBarry Smith returned.
3244e5c89e4eSSatish Balay
3245db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`,
3246db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`,
3247db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
3248c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
3249db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
3250db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`
3251e5c89e4eSSatish Balay @*/
PetscOptionsGetStringArray(PetscOptions options,const char pre[],const char name[],char * strings[],PetscInt * nmax,PetscBool * set)3252ce78bad3SBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options, const char pre[], const char name[], char *strings[], PetscInt *nmax, PetscBool *set) PeNS
3253d71ae5a4SJacob Faibussowitsch {
32542d747510SLisandro Dalcin const char *svalue;
3255ce78bad3SBarry Smith const char *value;
32562d747510SLisandro Dalcin PetscInt n = 0;
3257ace3abfcSBarry Smith PetscBool flag;
32589c9d3cfdSBarry Smith PetscToken token;
3259e5c89e4eSSatish Balay
3260e5c89e4eSSatish Balay PetscFunctionBegin;
32614f572ea9SToby Isaac PetscAssertPointer(name, 3);
32624f572ea9SToby Isaac PetscAssertPointer(nmax, 5);
3263ff757e9eSStefano Zampini if (*nmax) PetscAssertPointer(strings, 4);
3264e5c89e4eSSatish Balay
32659566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag));
32669371c9d4SSatish Balay if (!flag || !svalue) {
32679371c9d4SSatish Balay if (set) *set = PETSC_FALSE;
32689371c9d4SSatish Balay *nmax = 0;
32693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
32709371c9d4SSatish Balay }
32712d747510SLisandro Dalcin if (set) *set = PETSC_TRUE;
32729566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token));
32739566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
32742d747510SLisandro Dalcin while (value && n < *nmax) {
32759566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(value, &strings[n]));
32769566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value));
3277e5c89e4eSSatish Balay n++;
3278e5c89e4eSSatish Balay }
32799566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token));
3280e5c89e4eSSatish Balay *nmax = n;
32813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3282e5c89e4eSSatish Balay }
328306824ed3SPatrick Sanan
328406824ed3SPatrick Sanan /*@C
3285aec76313SJacob Faibussowitsch PetscOptionsDeprecated_Private - mark an option as deprecated, optionally replacing it with `newname`
328606824ed3SPatrick Sanan
328706824ed3SPatrick Sanan Prints a deprecation warning, unless an option is supplied to suppress.
328806824ed3SPatrick Sanan
32891c9f3c13SBarry Smith Logically Collective
329006824ed3SPatrick Sanan
329106824ed3SPatrick Sanan Input Parameters:
3292aec76313SJacob Faibussowitsch + PetscOptionsObject - string to prepend to name or `NULL`
329306824ed3SPatrick Sanan . oldname - the old, deprecated option
329420f4b53cSBarry Smith . newname - the new option, or `NULL` if option is purely removed
32959f3a6782SPatrick Sanan . version - a string describing the version of first deprecation, e.g. "3.9"
329620f4b53cSBarry Smith - info - additional information string, or `NULL`.
329706824ed3SPatrick Sanan
3298811af0c4SBarry Smith Options Database Key:
329906824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings
330006824ed3SPatrick Sanan
330120f4b53cSBarry Smith Level: developer
330220f4b53cSBarry Smith
330306824ed3SPatrick Sanan Notes:
33044ead3382SBarry Smith If `newname` is provided then the options database will automatically check the database for `oldname`.
33054ead3382SBarry Smith
33064ead3382SBarry Smith The old call `PetscOptionsXXX`(`oldname`) should be removed from the source code when both (1) the call to `PetscOptionsDeprecated()` occurs before the
33074ead3382SBarry Smith new call to `PetscOptionsXXX`(`newname`) and (2) the argument handling of the new call to `PetscOptionsXXX`(`newname`) is identical to the previous call.
33084ead3382SBarry Smith See `PTScotch_PartGraph_Seq()` for an example of when (1) fails and `SNESTestJacobian()` where an example of (2) fails.
33094ead3382SBarry Smith
3310811af0c4SBarry Smith Must be called between `PetscOptionsBegin()` (or `PetscObjectOptionsBegin()`) and `PetscOptionsEnd()`.
331135cb6cd3SPierre Jolivet Only the process of rank zero that owns the `PetscOptionsItems` are argument (managed by `PetscOptionsBegin()` or
3312811af0c4SBarry Smith `PetscObjectOptionsBegin()` prints the information
3313b40114eaSPatrick Sanan If newname is provided, the old option is replaced. Otherwise, it remains
3314b40114eaSPatrick Sanan in the options database.
33159f3a6782SPatrick Sanan If an option is not replaced, the info argument should be used to advise the user
33169f3a6782SPatrick Sanan on how to proceed.
33179f3a6782SPatrick Sanan There is a limit on the length of the warning printed, so very long strings
33189f3a6782SPatrick Sanan provided as info may be truncated.
331906824ed3SPatrick Sanan
3320db781477SPatrick Sanan .seealso: `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsScalar()`, `PetscOptionsBool()`, `PetscOptionsString()`, `PetscOptionsSetValue()`
332106824ed3SPatrick Sanan @*/
PetscOptionsDeprecated_Private(PetscOptionItems PetscOptionsObject,const char oldname[],const char newname[],const char version[],const char info[])3322ce78bad3SBarry Smith PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems PetscOptionsObject, const char oldname[], const char newname[], const char version[], const char info[])
3323d71ae5a4SJacob Faibussowitsch {
332406824ed3SPatrick Sanan PetscBool found, quiet;
332506824ed3SPatrick Sanan const char *value;
332606824ed3SPatrick Sanan const char *const quietopt = "-options_suppress_deprecated_warnings";
33279f3a6782SPatrick Sanan char msg[4096];
3328b0bdc838SStefano Zampini char *prefix = NULL;
3329b0bdc838SStefano Zampini PetscOptions options = NULL;
3330b0bdc838SStefano Zampini MPI_Comm comm = PETSC_COMM_SELF;
333106824ed3SPatrick Sanan
333206824ed3SPatrick Sanan PetscFunctionBegin;
33334f572ea9SToby Isaac PetscAssertPointer(oldname, 2);
33344f572ea9SToby Isaac PetscAssertPointer(version, 4);
3335b0bdc838SStefano Zampini if (PetscOptionsObject) {
3336b0bdc838SStefano Zampini prefix = PetscOptionsObject->prefix;
3337b0bdc838SStefano Zampini options = PetscOptionsObject->options;
3338b0bdc838SStefano Zampini comm = PetscOptionsObject->comm;
3339b0bdc838SStefano Zampini }
33409566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, prefix, oldname, &value, &found));
334106824ed3SPatrick Sanan if (found) {
334206824ed3SPatrick Sanan if (newname) {
33435669f5d8SStefano Zampini PetscBool newfound;
33445669f5d8SStefano Zampini
33455669f5d8SStefano Zampini /* do not overwrite if the new option has been provided */
33465669f5d8SStefano Zampini PetscCall(PetscOptionsFindPair(options, prefix, newname, NULL, &newfound));
33475669f5d8SStefano Zampini if (!newfound) {
33481baa6e33SBarry Smith if (prefix) PetscCall(PetscOptionsPrefixPush(options, prefix));
33499566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetValue(options, newname, value));
33501baa6e33SBarry Smith if (prefix) PetscCall(PetscOptionsPrefixPop(options));
33515669f5d8SStefano Zampini }
33529566063dSJacob Faibussowitsch PetscCall(PetscOptionsClearValue(options, oldname));
3353b40114eaSPatrick Sanan }
335406824ed3SPatrick Sanan quiet = PETSC_FALSE;
33559566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(options, NULL, quietopt, &quiet, NULL));
335606824ed3SPatrick Sanan if (!quiet) {
3357b82c1cbeSPierre Jolivet PetscCall(PetscStrncpy(msg, "** PETSc DEPRECATION WARNING ** : the option -", sizeof(msg)));
3358b82c1cbeSPierre Jolivet PetscCall(PetscStrlcat(msg, prefix, sizeof(msg)));
3359b82c1cbeSPierre Jolivet PetscCall(PetscStrlcat(msg, oldname + 1, sizeof(msg)));
3360c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " is deprecated as of version ", sizeof(msg)));
3361c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, version, sizeof(msg)));
33624bd3d7f8SBarry Smith PetscCall(PetscStrlcat(msg, " and will be removed in a future release.\n", sizeof(msg)));
336306824ed3SPatrick Sanan if (newname) {
3364b82c1cbeSPierre Jolivet PetscCall(PetscStrlcat(msg, " Use the option -", sizeof(msg)));
3365b82c1cbeSPierre Jolivet PetscCall(PetscStrlcat(msg, prefix, sizeof(msg)));
3366b82c1cbeSPierre Jolivet PetscCall(PetscStrlcat(msg, newname + 1, sizeof(msg)));
3367c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " instead.", sizeof(msg)));
336806824ed3SPatrick Sanan }
33699f3a6782SPatrick Sanan if (info) {
3370c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " ", sizeof(msg)));
3371c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, info, sizeof(msg)));
33729f3a6782SPatrick Sanan }
3373c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " (Silence this warning with ", sizeof(msg)));
3374c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, quietopt, sizeof(msg)));
3375c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, ")\n", sizeof(msg)));
33769566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm, "%s", msg));
337706824ed3SPatrick Sanan }
337806824ed3SPatrick Sanan }
33793ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
338006824ed3SPatrick Sanan }
3381