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 */ 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) */ 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 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 */ 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 @*/ 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 @*/ 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 */ 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 @*/ 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 @*/ 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 */ 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 @*/ 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 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 @*/ 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 */ 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 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 } 4459566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(yaml, 1, MPIU_BOOL, 0, comm)); 446a1d2f846SLisandro Dalcin } 4473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 448be10d61cSLisandro Dalcin } 449e5c89e4eSSatish Balay 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)); 526*966bd95aSPierre 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 @*/ 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 @*/ 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 72010c654e6SJacob Faibussowitsch static inline PetscErrorCode PetscOptionsStringToBoolIfSet_Private(enum PetscPrecedentOption opt, const char *val[], const PetscBool set[], PetscBool *flg) 721d71ae5a4SJacob Faibussowitsch { 722c5b5d8d5SVaclav Hapla PetscFunctionBegin; 723c5b5d8d5SVaclav Hapla if (set[opt]) { 7249566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(val[opt], flg)); 725c5b5d8d5SVaclav Hapla } else *flg = PETSC_FALSE; 7263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 727c5b5d8d5SVaclav Hapla } 728c5b5d8d5SVaclav Hapla 729660278c0SBarry Smith /* Process options with absolute precedence, these are only processed from the command line, not the environment or files */ 730d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscOptionsProcessPrecedentFlags(PetscOptions options, int argc, char *args[], PetscBool *skip_petscrc, PetscBool *skip_petscrc_set) 731d71ae5a4SJacob Faibussowitsch { 732c5b5d8d5SVaclav Hapla const char *const *opt = precedentOptions; 733c5b5d8d5SVaclav Hapla const size_t n = PO_NUM; 734c5b5d8d5SVaclav Hapla size_t o; 735c5b5d8d5SVaclav Hapla int a; 736c5b5d8d5SVaclav Hapla const char **val; 7370c99d500SBarry Smith char **cval; 738660278c0SBarry Smith PetscBool *set, unneeded; 739c5b5d8d5SVaclav Hapla 740c5b5d8d5SVaclav Hapla PetscFunctionBegin; 7410c99d500SBarry Smith PetscCall(PetscCalloc2(n, &cval, n, &set)); 7420c99d500SBarry Smith val = (const char **)cval; 743c5b5d8d5SVaclav Hapla 744c5b5d8d5SVaclav Hapla /* Look for options possibly set using PetscOptionsSetValue beforehand */ 74548a46eb9SPierre Jolivet for (o = 0; o < n; o++) PetscCall(PetscOptionsFindPair(options, NULL, opt[o], &val[o], &set[o])); 746c5b5d8d5SVaclav Hapla 747a5b23f4aSJose E. Roman /* Loop through all args to collect last occurring value of each option */ 748c5b5d8d5SVaclav Hapla for (a = 1; a < argc; a++) { 749c5b5d8d5SVaclav Hapla PetscBool valid, eq; 750c5b5d8d5SVaclav Hapla 7519566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(args[a], &valid)); 752c5b5d8d5SVaclav Hapla if (!valid) continue; 753c5b5d8d5SVaclav Hapla for (o = 0; o < n; o++) { 7549566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(args[a], opt[o], &eq)); 755c5b5d8d5SVaclav Hapla if (eq) { 756c5b5d8d5SVaclav Hapla set[o] = PETSC_TRUE; 757c5b5d8d5SVaclav Hapla if (a == argc - 1 || !args[a + 1] || !args[a + 1][0] || args[a + 1][0] == '-') val[o] = NULL; 758c5b5d8d5SVaclav Hapla else val[o] = args[a + 1]; 759c5b5d8d5SVaclav Hapla break; 760c5b5d8d5SVaclav Hapla } 761c5b5d8d5SVaclav Hapla } 762c5b5d8d5SVaclav Hapla } 763c5b5d8d5SVaclav Hapla 764c5b5d8d5SVaclav Hapla /* Process flags */ 7659566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(val[PO_HELP], "intro", &options->help_intro)); 766d314f959SVaclav Hapla if (options->help_intro) options->help = PETSC_TRUE; 7679566063dSJacob Faibussowitsch else PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_HELP, val, set, &options->help)); 768660278c0SBarry Smith PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_CI_ENABLE, val, set, &unneeded)); 769660278c0SBarry Smith /* need to manage PO_CI_ENABLE option before the PetscOptionsMonitor is turned on, so its setting is not monitored */ 7709355ec05SMatthew G. Knepley if (set[PO_CI_ENABLE]) PetscCall(PetscOptionsSetValue_Private(options, opt[PO_CI_ENABLE], val[PO_CI_ENABLE], &a, PETSC_OPT_COMMAND_LINE)); 7719566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR_CANCEL, val, set, &options->monitorCancel)); 7729566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_OPTIONS_MONITOR, val, set, &options->monitorFromOptions)); 7739566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBoolIfSet_Private(PO_SKIP_PETSCRC, val, set, skip_petscrc)); 774c5b5d8d5SVaclav Hapla *skip_petscrc_set = set[PO_SKIP_PETSCRC]; 775c5b5d8d5SVaclav Hapla 776c5b5d8d5SVaclav Hapla /* Store precedent options in database and mark them as used */ 777660278c0SBarry Smith for (o = 1; o < n; o++) { 778c5b5d8d5SVaclav Hapla if (set[o]) { 7799355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, opt[o], val[o], &a, PETSC_OPT_COMMAND_LINE)); 780d06005cbSLisandro Dalcin options->used[a] = PETSC_TRUE; 781c5b5d8d5SVaclav Hapla } 782c5b5d8d5SVaclav Hapla } 7830c99d500SBarry Smith PetscCall(PetscFree2(cval, set)); 784c5b5d8d5SVaclav Hapla options->precedentProcessed = PETSC_TRUE; 7853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 786c5b5d8d5SVaclav Hapla } 787c5b5d8d5SVaclav Hapla 788d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscOptionsSkipPrecedent(PetscOptions options, const char name[], PetscBool *flg) 789d71ae5a4SJacob Faibussowitsch { 79039a651e2SJacob Faibussowitsch PetscFunctionBegin; 7914f572ea9SToby Isaac PetscAssertPointer(flg, 3); 792c5b5d8d5SVaclav Hapla *flg = PETSC_FALSE; 793c5b5d8d5SVaclav Hapla if (options->precedentProcessed) { 79439a651e2SJacob Faibussowitsch for (int i = 0; i < PO_NUM; ++i) { 795c5b5d8d5SVaclav Hapla if (!PetscOptNameCmp(precedentOptions[i], name)) { 796c5b5d8d5SVaclav Hapla /* check if precedent option has been set already */ 7979566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, NULL, name, NULL, flg)); 798c5b5d8d5SVaclav Hapla if (*flg) break; 799c5b5d8d5SVaclav Hapla } 800c5b5d8d5SVaclav Hapla } 801c5b5d8d5SVaclav Hapla } 8023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 803c5b5d8d5SVaclav Hapla } 80485079163SJed Brown 805e5c89e4eSSatish Balay /*@C 806e5c89e4eSSatish Balay PetscOptionsInsert - Inserts into the options database from the command line, 807e5c89e4eSSatish Balay the environmental variable and a file. 808e5c89e4eSSatish Balay 809811af0c4SBarry Smith Collective on `PETSC_COMM_WORLD` 8101c9f3c13SBarry Smith 811e5c89e4eSSatish Balay Input Parameters: 81220f4b53cSBarry Smith + options - options database or `NULL` for the default global database 813c5929fdfSBarry Smith . argc - count of number of command line arguments 814e5c89e4eSSatish Balay . args - the command line arguments 815be10d61cSLisandro Dalcin - file - [optional] PETSc database file, append ":yaml" to filename to specify YAML options format. 81620f4b53cSBarry Smith Use `NULL` or empty string to not check for code specific file. 817be10d61cSLisandro Dalcin Also checks ~/.petscrc, .petscrc and petscrc. 818c5b5d8d5SVaclav Hapla Use -skip_petscrc in the code specific file (or command line) to skip ~/.petscrc, .petscrc and petscrc files. 819e5c89e4eSSatish Balay 820081c24baSBoyana Norris Options Database Keys: 821d06005cbSLisandro Dalcin + -options_file <filename> - read options from a file 822d06005cbSLisandro Dalcin - -options_file_yaml <filename> - read options from a YAML file 823c5b5d8d5SVaclav Hapla 82420f4b53cSBarry Smith Level: advanced 82520f4b53cSBarry Smith 826811af0c4SBarry Smith Notes: 82720f4b53cSBarry Smith Since `PetscOptionsInsert()` is automatically called by `PetscInitialize()`, 828811af0c4SBarry Smith the user does not typically need to call this routine. `PetscOptionsInsert()` 829811af0c4SBarry Smith can be called several times, adding additional entries into the database. 830811af0c4SBarry Smith 831811af0c4SBarry Smith See `PetscInitialize()` for options related to option database monitoring. 832081c24baSBoyana Norris 833db781477SPatrick Sanan .seealso: `PetscOptionsDestroy()`, `PetscOptionsView()`, `PetscOptionsInsertString()`, `PetscOptionsInsertFile()`, 834db781477SPatrick Sanan `PetscInitialize()` 835e5c89e4eSSatish Balay @*/ 836ce78bad3SBarry Smith PetscErrorCode PetscOptionsInsert(PetscOptions options, int *argc, char ***args, const char file[]) PeNS 837d71ae5a4SJacob Faibussowitsch { 838d06005cbSLisandro Dalcin MPI_Comm comm = PETSC_COMM_WORLD; 839e5c89e4eSSatish Balay PetscMPIInt rank; 840c5b5d8d5SVaclav Hapla PetscBool hasArgs = (argc && *argc) ? PETSC_TRUE : PETSC_FALSE; 841c5b5d8d5SVaclav Hapla PetscBool skipPetscrc = PETSC_FALSE, skipPetscrcSet = PETSC_FALSE; 8426497c311SBarry Smith char *eoptions = NULL; 8436497c311SBarry Smith size_t len = 0; 844e5c89e4eSSatish Balay 845e5c89e4eSSatish Balay PetscFunctionBegin; 84608401ef6SPierre Jolivet PetscCheck(!hasArgs || (args && *args), comm, PETSC_ERR_ARG_NULL, "*argc > 1 but *args not given"); 8479566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 848e5c89e4eSSatish Balay 849c5b5d8d5SVaclav Hapla if (!options) { 8509566063dSJacob Faibussowitsch PetscCall(PetscOptionsCreateDefault()); 851c5b5d8d5SVaclav Hapla options = defaultoptions; 852c5b5d8d5SVaclav Hapla } 853c5b5d8d5SVaclav Hapla if (hasArgs) { 854c5b5d8d5SVaclav Hapla /* process options with absolute precedence */ 8559566063dSJacob Faibussowitsch PetscCall(PetscOptionsProcessPrecedentFlags(options, *argc, *args, &skipPetscrc, &skipPetscrcSet)); 856660278c0SBarry Smith PetscCall(PetscOptionsGetBool(NULL, NULL, "-petsc_ci", &PetscCIEnabled, NULL)); 857c5b5d8d5SVaclav Hapla } 8584b09e917SBarry Smith if (file && file[0]) { 8599566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, file, PETSC_TRUE)); 860c5b5d8d5SVaclav Hapla /* if -skip_petscrc has not been set from command line, check whether it has been set in the file */ 8619566063dSJacob Faibussowitsch if (!skipPetscrcSet) PetscCall(PetscOptionsGetBool(options, NULL, "-skip_petscrc", &skipPetscrc, NULL)); 862321366bcSBarry Smith } 863c5b5d8d5SVaclav Hapla if (!skipPetscrc) { 864be10d61cSLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 8656497c311SBarry Smith 8669566063dSJacob Faibussowitsch PetscCall(PetscGetHomeDirectory(filename, sizeof(filename))); 8679566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(filename, (int)sizeof(filename), MPI_CHAR, 0, comm)); 868c6a7a370SJeremy L Thompson if (filename[0]) PetscCall(PetscStrlcat(filename, "/.petscrc", sizeof(filename))); 8699566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, filename, PETSC_FALSE)); 8709566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, ".petscrc", PETSC_FALSE)); 8719566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertFile(comm, options, "petscrc", PETSC_FALSE)); 872e5c89e4eSSatish Balay } 873e5c89e4eSSatish Balay 8742d747510SLisandro Dalcin /* insert environment options */ 875dd400576SPatrick Sanan if (rank == 0) { 876835f2295SStefano Zampini eoptions = getenv("PETSC_OPTIONS"); 8779566063dSJacob Faibussowitsch PetscCall(PetscStrlen(eoptions, &len)); 878e5c89e4eSSatish Balay } 8799566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&len, 1, MPIU_SIZE_T, 0, comm)); 880e5c89e4eSSatish Balay if (len) { 8819566063dSJacob Faibussowitsch if (rank) PetscCall(PetscMalloc1(len + 1, &eoptions)); 8826497c311SBarry Smith PetscCallMPI(MPI_Bcast(eoptions, (PetscMPIInt)len, MPI_CHAR, 0, comm)); 88396fc60bcSBarry Smith if (rank) eoptions[len] = 0; 8849355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertString_Private(options, eoptions, PETSC_OPT_ENVIRONMENT)); 8859566063dSJacob Faibussowitsch if (rank) PetscCall(PetscFree(eoptions)); 886e5c89e4eSSatish Balay } 887e5c89e4eSSatish Balay 888d06005cbSLisandro Dalcin /* insert YAML environment options */ 889dd400576SPatrick Sanan if (rank == 0) { 890835f2295SStefano Zampini eoptions = getenv("PETSC_OPTIONS_YAML"); 8919566063dSJacob Faibussowitsch PetscCall(PetscStrlen(eoptions, &len)); 8929fc438c3SToby Isaac } 8939566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&len, 1, MPIU_SIZE_T, 0, comm)); 8949fc438c3SToby Isaac if (len) { 8959566063dSJacob Faibussowitsch if (rank) PetscCall(PetscMalloc1(len + 1, &eoptions)); 8966497c311SBarry Smith PetscCallMPI(MPI_Bcast(eoptions, (PetscMPIInt)len, MPI_CHAR, 0, comm)); 8979fc438c3SToby Isaac if (rank) eoptions[len] = 0; 8989355ec05SMatthew G. Knepley PetscCall(PetscOptionsInsertStringYAML_Private(options, eoptions, PETSC_OPT_ENVIRONMENT)); 8999566063dSJacob Faibussowitsch if (rank) PetscCall(PetscFree(eoptions)); 9009fc438c3SToby Isaac } 9013bcbd388SSean Farley 902c5b5d8d5SVaclav Hapla /* insert command line options here because they take precedence over arguments in petscrc/environment */ 903ce78bad3SBarry Smith if (hasArgs) PetscCall(PetscOptionsInsertArgs(options, *argc - 1, (const char *const *)*args + 1)); 904660278c0SBarry Smith PetscCall(PetscOptionsGetBool(NULL, NULL, "-petsc_ci_portable_error_output", &PetscCIEnabledPortableErrorOutput, NULL)); 9053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 906e5c89e4eSSatish Balay } 907e5c89e4eSSatish Balay 908660278c0SBarry Smith /* These options are not printed with PetscOptionsView() or PetscOptionsMonitor() when PetscCIEnabled is on */ 909660278c0SBarry Smith /* TODO: get the list from the test harness, do not have it hardwired here. Maybe from gmakegentest.py */ 910e9a33e21SBarry 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"}; 911660278c0SBarry Smith 912d71ae5a4SJacob Faibussowitsch static PetscBool PetscCIOption(const char *name) 913d71ae5a4SJacob Faibussowitsch { 914660278c0SBarry Smith PetscInt idx; 915660278c0SBarry Smith PetscBool found; 916660278c0SBarry Smith 917660278c0SBarry Smith if (!PetscCIEnabled) return PETSC_FALSE; 9183ba16761SJacob Faibussowitsch PetscCallAbort(PETSC_COMM_SELF, PetscEListFind(PETSC_STATIC_ARRAY_LENGTH(PetscCIOptions), PetscCIOptions, name, &idx, &found)); 919660278c0SBarry Smith return found; 920660278c0SBarry Smith } 921660278c0SBarry Smith 9225d83a8b1SBarry Smith /*@ 92388c29154SBarry Smith PetscOptionsView - Prints the options that have been loaded. This is 924e5c89e4eSSatish Balay useful for debugging purposes. 925e5c89e4eSSatish Balay 926ffeef943SBarry Smith Logically Collective, No Fortran Support 927e5c89e4eSSatish Balay 928d8d19677SJose E. Roman Input Parameters: 92920f4b53cSBarry Smith + options - options database, use `NULL` for default global database 930811af0c4SBarry Smith - viewer - must be an `PETSCVIEWERASCII` viewer 931e5c89e4eSSatish Balay 932e5c89e4eSSatish Balay Options Database Key: 933811af0c4SBarry Smith . -options_view - Activates `PetscOptionsView()` within `PetscFinalize()` 934e5c89e4eSSatish Balay 93520f4b53cSBarry Smith Level: advanced 93620f4b53cSBarry Smith 937811af0c4SBarry Smith Note: 93821532e8aSBarry Smith Only the MPI rank 0 of the `MPI_Comm` used to create view prints the option values. Other processes 9391c9f3c13SBarry Smith may have different values but they are not printed. 9401c9f3c13SBarry Smith 941db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()` 942e5c89e4eSSatish Balay @*/ 943d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsView(PetscOptions options, PetscViewer viewer) 944d71ae5a4SJacob Faibussowitsch { 945660278c0SBarry Smith PetscInt i, N = 0; 94688c29154SBarry Smith PetscBool isascii; 947e5c89e4eSSatish Balay 948e5c89e4eSSatish Balay PetscFunctionBegin; 9492d747510SLisandro Dalcin if (viewer) PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 950c5929fdfSBarry Smith options = options ? options : defaultoptions; 95188c29154SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD; 9529566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 95328b400f6SJacob Faibussowitsch PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Only supports ASCII viewer"); 95488c29154SBarry Smith 955660278c0SBarry Smith for (i = 0; i < options->N; i++) { 956660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 957660278c0SBarry Smith N++; 958660278c0SBarry Smith } 959660278c0SBarry Smith 960660278c0SBarry Smith if (!N) { 9619566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "#No PETSc Option Table entries\n")); 9623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 96330694fe9SBarry Smith } 9642d747510SLisandro Dalcin 9659566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "#PETSc Option Table entries:\n")); 966e5c89e4eSSatish Balay for (i = 0; i < options->N; i++) { 967660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 968e5c89e4eSSatish Balay if (options->values[i]) { 9699355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "-%s %s", options->names[i], options->values[i])); 970e5c89e4eSSatish Balay } else { 9719355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "-%s", options->names[i])); 972e5c89e4eSSatish Balay } 9739355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, " # (source: %s)\n", PetscOptionSources[options->source[i]])); 974e5c89e4eSSatish Balay } 9759566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "#End of PETSc Option Table entries\n")); 9763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 977e5c89e4eSSatish Balay } 978e5c89e4eSSatish Balay 979e11779c2SBarry Smith /* 980e11779c2SBarry Smith Called by error handlers to print options used in run 981e11779c2SBarry Smith */ 982d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeftError(void) 983d71ae5a4SJacob Faibussowitsch { 984f4bc716fSBarry Smith PetscInt i, nopt = 0; 985f4bc716fSBarry Smith 986f4bc716fSBarry Smith for (i = 0; i < defaultoptions->N; i++) { 987f4bc716fSBarry Smith if (!defaultoptions->used[i]) { 988f4bc716fSBarry Smith if (PetscCIOption(defaultoptions->names[i])) continue; 989f4bc716fSBarry Smith nopt++; 990f4bc716fSBarry Smith } 991f4bc716fSBarry Smith } 992f4bc716fSBarry Smith if (nopt) { 9937d44c3adSBarry Smith PetscCall((*PetscErrorPrintf)("WARNING! There are unused option(s) set! Could be the program crashed before usage or a spelling mistake, etc!\n")); 994f4bc716fSBarry Smith for (i = 0; i < defaultoptions->N; i++) { 995f4bc716fSBarry Smith if (!defaultoptions->used[i]) { 996f4bc716fSBarry Smith if (PetscCIOption(defaultoptions->names[i])) continue; 9973ba16761SJacob 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]])); 9983ba16761SJacob Faibussowitsch else PetscCall((*PetscErrorPrintf)(" Option left: name:-%s (no value) source: %s\n", defaultoptions->names[i], PetscOptionSources[defaultoptions->source[i]])); 999f4bc716fSBarry Smith } 1000f4bc716fSBarry Smith } 1001f4bc716fSBarry Smith } 10023ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1003f4bc716fSBarry Smith } 1004f4bc716fSBarry Smith 1005d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscOptionsViewError(void) 1006d71ae5a4SJacob Faibussowitsch { 1007660278c0SBarry Smith PetscInt i, N = 0; 10084416b707SBarry Smith PetscOptions options = defaultoptions; 1009e11779c2SBarry Smith 1010660278c0SBarry Smith for (i = 0; i < options->N; i++) { 1011660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 1012660278c0SBarry Smith N++; 1013660278c0SBarry Smith } 1014660278c0SBarry Smith 1015660278c0SBarry Smith if (N) { 10163ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("PETSc Option Table entries:\n")); 1017e11779c2SBarry Smith } else { 10183ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("No PETSc Option Table entries\n")); 1019e11779c2SBarry Smith } 1020e11779c2SBarry Smith for (i = 0; i < options->N; i++) { 1021660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 1022e11779c2SBarry Smith if (options->values[i]) { 10233ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("-%s %s (source: %s)\n", options->names[i], options->values[i], PetscOptionSources[options->source[i]])); 1024e11779c2SBarry Smith } else { 10253ba16761SJacob Faibussowitsch PetscCall((*PetscErrorPrintf)("-%s (source: %s)\n", options->names[i], PetscOptionSources[options->source[i]])); 1026e11779c2SBarry Smith } 1027e11779c2SBarry Smith } 10283ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1029e11779c2SBarry Smith } 1030e11779c2SBarry Smith 10315d83a8b1SBarry Smith /*@ 103274e0666dSJed Brown PetscOptionsPrefixPush - Designate a prefix to be used by all options insertions to follow. 103374e0666dSJed Brown 10341c9f3c13SBarry Smith Logically Collective 103574e0666dSJed Brown 1036d8d19677SJose E. Roman Input Parameters: 103720f4b53cSBarry Smith + options - options database, or `NULL` for the default global database 1038c5929fdfSBarry Smith - prefix - The string to append to the existing prefix 10399db968c8SJed Brown 10409db968c8SJed Brown Options Database Keys: 10419db968c8SJed Brown + -prefix_push <some_prefix_> - push the given prefix 10429db968c8SJed Brown - -prefix_pop - pop the last prefix 10439db968c8SJed Brown 104420f4b53cSBarry Smith Level: advanced 104520f4b53cSBarry Smith 10469db968c8SJed Brown Notes: 104721532e8aSBarry Smith It is common to use this in conjunction with `-options_file` as in 10489314d9b7SBarry Smith .vb 10499314d9b7SBarry Smith -prefix_push system1_ -options_file system1rc -prefix_pop -prefix_push system2_ -options_file system2rc -prefix_pop 10509314d9b7SBarry Smith .ve 105121532e8aSBarry Smith where the files no longer require all options to be prefixed with `-system2_`. 105274e0666dSJed Brown 105321532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 10541c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 10551c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 10561c9f3c13SBarry Smith on different ranks. 10571c9f3c13SBarry Smith 1058db781477SPatrick Sanan .seealso: `PetscOptionsPrefixPop()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsSetValue()` 105974e0666dSJed Brown @*/ 1060d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsPrefixPush(PetscOptions options, const char prefix[]) 1061d71ae5a4SJacob Faibussowitsch { 106274e0666dSJed Brown size_t n; 106374e0666dSJed Brown PetscInt start; 10649355ec05SMatthew G. Knepley char key[PETSC_MAX_OPTION_NAME + 1]; 10652d747510SLisandro Dalcin PetscBool valid; 106674e0666dSJed Brown 106774e0666dSJed Brown PetscFunctionBegin; 10684f572ea9SToby Isaac PetscAssertPointer(prefix, 2); 1069c5929fdfSBarry Smith options = options ? options : defaultoptions; 107000045ab3SPierre 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); 10712d747510SLisandro Dalcin key[0] = '-'; /* keys must start with '-' */ 10729566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key + 1, prefix, sizeof(key) - 1)); 10739566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key, &valid)); 10748bf569ecSLisandro 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 */ 107528b400f6SJacob 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" : ""); 107674e0666dSJed Brown start = options->prefixind ? options->prefixstack[options->prefixind - 1] : 0; 10779566063dSJacob Faibussowitsch PetscCall(PetscStrlen(prefix, &n)); 107808401ef6SPierre Jolivet PetscCheck(n + 1 <= sizeof(options->prefix) - start, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Maximum prefix length %zu exceeded", sizeof(options->prefix)); 10799566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(options->prefix + start, prefix, n + 1)); 10806497c311SBarry Smith options->prefixstack[options->prefixind++] = (int)(start + n); 10813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 108274e0666dSJed Brown } 108374e0666dSJed Brown 10845d83a8b1SBarry Smith /*@ 1085811af0c4SBarry Smith PetscOptionsPrefixPop - Remove the latest options prefix, see `PetscOptionsPrefixPush()` for details 108674e0666dSJed Brown 1087811af0c4SBarry Smith Logically Collective on the `MPI_Comm` used when called `PetscOptionsPrefixPush()` 108874e0666dSJed Brown 1089811af0c4SBarry Smith Input Parameter: 109020f4b53cSBarry Smith . options - options database, or `NULL` for the default global database 1091c5929fdfSBarry Smith 109274e0666dSJed Brown Level: advanced 109374e0666dSJed Brown 1094db781477SPatrick Sanan .seealso: `PetscOptionsPrefixPush()`, `PetscOptionsPush()`, `PetscOptionsPop()`, `PetscOptionsCreate()`, `PetscOptionsSetValue()` 109574e0666dSJed Brown @*/ 1096d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsPrefixPop(PetscOptions options) 1097d71ae5a4SJacob Faibussowitsch { 109874e0666dSJed Brown PetscInt offset; 109974e0666dSJed Brown 110074e0666dSJed Brown PetscFunctionBegin; 1101c5929fdfSBarry Smith options = options ? options : defaultoptions; 110208401ef6SPierre Jolivet PetscCheck(options->prefixind >= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "More prefixes popped than pushed"); 110374e0666dSJed Brown options->prefixind--; 110474e0666dSJed Brown offset = options->prefixind ? options->prefixstack[options->prefixind - 1] : 0; 110574e0666dSJed Brown options->prefix[offset] = 0; 11063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 110774e0666dSJed Brown } 110874e0666dSJed Brown 11095d83a8b1SBarry Smith /*@ 1110a542b6e8SBarry Smith PetscOptionsClear - Removes all options form the database leaving it empty. 1111a542b6e8SBarry Smith 11121c9f3c13SBarry Smith Logically Collective 11131c9f3c13SBarry Smith 1114811af0c4SBarry Smith Input Parameter: 111520f4b53cSBarry Smith . options - options database, use `NULL` for the default global database 1116c5929fdfSBarry Smith 111720f4b53cSBarry Smith Level: developer 111820f4b53cSBarry Smith 111920f4b53cSBarry Smith Note: 112021532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 11211c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 11221c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 11231c9f3c13SBarry Smith on different ranks. 11241c9f3c13SBarry Smith 11257e6f8dd6SBarry Smith Developer Note: 11267e6f8dd6SBarry Smith Uses `free()` directly because the current option values were set with `malloc()` 11277e6f8dd6SBarry Smith 1128db781477SPatrick Sanan .seealso: `PetscOptionsInsert()` 1129a542b6e8SBarry Smith @*/ 1130d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsClear(PetscOptions options) 1131d71ae5a4SJacob Faibussowitsch { 1132a542b6e8SBarry Smith PetscInt i; 1133a542b6e8SBarry Smith 113439a651e2SJacob Faibussowitsch PetscFunctionBegin; 1135c5929fdfSBarry Smith options = options ? options : defaultoptions; 11363ba16761SJacob Faibussowitsch if (!options) PetscFunctionReturn(PETSC_SUCCESS); 11372d747510SLisandro Dalcin 1138a542b6e8SBarry Smith for (i = 0; i < options->N; i++) { 1139a542b6e8SBarry Smith if (options->names[i]) free(options->names[i]); 1140a542b6e8SBarry Smith if (options->values[i]) free(options->values[i]); 1141a542b6e8SBarry Smith } 11422d747510SLisandro Dalcin options->N = 0; 11439355ec05SMatthew G. Knepley free(options->names); 11449355ec05SMatthew G. Knepley free(options->values); 11459355ec05SMatthew G. Knepley free(options->used); 11469355ec05SMatthew G. Knepley free(options->source); 11479355ec05SMatthew G. Knepley options->names = NULL; 11489355ec05SMatthew G. Knepley options->values = NULL; 11499355ec05SMatthew G. Knepley options->used = NULL; 11509355ec05SMatthew G. Knepley options->source = NULL; 11519355ec05SMatthew G. Knepley options->Nalloc = 0; 11522d747510SLisandro Dalcin 11539355ec05SMatthew G. Knepley for (i = 0; i < options->Na; i++) { 1154a542b6e8SBarry Smith free(options->aliases1[i]); 1155a542b6e8SBarry Smith free(options->aliases2[i]); 1156a542b6e8SBarry Smith } 11579355ec05SMatthew G. Knepley options->Na = 0; 11589355ec05SMatthew G. Knepley free(options->aliases1); 11599355ec05SMatthew G. Knepley free(options->aliases2); 11609355ec05SMatthew G. Knepley options->aliases1 = options->aliases2 = NULL; 11619355ec05SMatthew G. Knepley options->Naalloc = 0; 1162a542b6e8SBarry Smith 11632d747510SLisandro Dalcin /* destroy hash table */ 11642d747510SLisandro Dalcin kh_destroy(HO, options->ht); 11652d747510SLisandro Dalcin options->ht = NULL; 11660eb63584SBarry Smith 11672d747510SLisandro Dalcin options->prefixind = 0; 11682d747510SLisandro Dalcin options->prefix[0] = 0; 11692d747510SLisandro Dalcin options->help = PETSC_FALSE; 11709355ec05SMatthew G. Knepley options->help_intro = PETSC_FALSE; 11713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11724416b707SBarry Smith } 11734416b707SBarry Smith 11745d83a8b1SBarry Smith /*@ 11752d747510SLisandro Dalcin PetscOptionsSetAlias - Makes a key and alias for another key 11762d747510SLisandro Dalcin 11771c9f3c13SBarry Smith Logically Collective 11782d747510SLisandro Dalcin 11792d747510SLisandro Dalcin Input Parameters: 118020f4b53cSBarry Smith + options - options database, or `NULL` for default global database 11812d747510SLisandro Dalcin . newname - the alias 11822d747510SLisandro Dalcin - oldname - the name that alias will refer to 11832d747510SLisandro Dalcin 11842d747510SLisandro Dalcin Level: advanced 11852d747510SLisandro Dalcin 118620f4b53cSBarry Smith Note: 118721532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 11881c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 11891c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 11901c9f3c13SBarry Smith on different ranks. 11911c9f3c13SBarry Smith 11927e6f8dd6SBarry Smith Developer Note: 11937e6f8dd6SBarry Smith Uses `malloc()` directly because PETSc may not be initialized yet. 11947e6f8dd6SBarry Smith 11950241b274SPierre Jolivet .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`, 1196c2e3fba1SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 1197db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 1198c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 1199db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 1200db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 12012d747510SLisandro Dalcin @*/ 1202d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsSetAlias(PetscOptions options, const char newname[], const char oldname[]) 1203d71ae5a4SJacob Faibussowitsch { 12042d747510SLisandro Dalcin size_t len; 12059210b8eaSVaclav Hapla PetscBool valid; 12062d747510SLisandro Dalcin 12072d747510SLisandro Dalcin PetscFunctionBegin; 12084f572ea9SToby Isaac PetscAssertPointer(newname, 2); 12094f572ea9SToby Isaac PetscAssertPointer(oldname, 3); 12102d747510SLisandro Dalcin options = options ? options : defaultoptions; 12119566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(newname, &valid)); 121228b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid aliased option %s", newname); 12139566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(oldname, &valid)); 121428b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid aliasee option %s", oldname); 12152d747510SLisandro Dalcin 12169355ec05SMatthew G. Knepley if (options->Na == options->Naalloc) { 12179355ec05SMatthew G. Knepley char **tmpA1, **tmpA2; 12182d747510SLisandro Dalcin 12199355ec05SMatthew G. Knepley options->Naalloc = PetscMax(4, options->Naalloc * 2); 12209355ec05SMatthew G. Knepley tmpA1 = (char **)malloc(options->Naalloc * sizeof(char *)); 12219355ec05SMatthew G. Knepley tmpA2 = (char **)malloc(options->Naalloc * sizeof(char *)); 12229355ec05SMatthew G. Knepley for (int i = 0; i < options->Na; ++i) { 12239355ec05SMatthew G. Knepley tmpA1[i] = options->aliases1[i]; 12249355ec05SMatthew G. Knepley tmpA2[i] = options->aliases2[i]; 12259355ec05SMatthew G. Knepley } 12269355ec05SMatthew G. Knepley free(options->aliases1); 12279355ec05SMatthew G. Knepley free(options->aliases2); 12289355ec05SMatthew G. Knepley options->aliases1 = tmpA1; 12299355ec05SMatthew G. Knepley options->aliases2 = tmpA2; 12309355ec05SMatthew G. Knepley } 12319371c9d4SSatish Balay newname++; 12329371c9d4SSatish Balay oldname++; 12339566063dSJacob Faibussowitsch PetscCall(PetscStrlen(newname, &len)); 12349355ec05SMatthew G. Knepley options->aliases1[options->Na] = (char *)malloc((len + 1) * sizeof(char)); 1235c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(options->aliases1[options->Na], newname, len + 1)); 12369566063dSJacob Faibussowitsch PetscCall(PetscStrlen(oldname, &len)); 12379355ec05SMatthew G. Knepley options->aliases2[options->Na] = (char *)malloc((len + 1) * sizeof(char)); 1238c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(options->aliases2[options->Na], oldname, len + 1)); 12399355ec05SMatthew G. Knepley ++options->Na; 12403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12412d747510SLisandro Dalcin } 12424416b707SBarry Smith 12435d83a8b1SBarry Smith /*@ 1244e5c89e4eSSatish Balay PetscOptionsSetValue - Sets an option name-value pair in the options 1245e5c89e4eSSatish Balay database, overriding whatever is already present. 1246e5c89e4eSSatish Balay 12471c9f3c13SBarry Smith Logically Collective 1248e5c89e4eSSatish Balay 1249e5c89e4eSSatish Balay Input Parameters: 125020f4b53cSBarry Smith + options - options database, use `NULL` for the default global database 1251c5929fdfSBarry Smith . name - name of option, this SHOULD have the - prepended 125220f4b53cSBarry Smith - value - the option value (not used for all options, so can be `NULL`) 1253e5c89e4eSSatish Balay 1254e5c89e4eSSatish Balay Level: intermediate 1255e5c89e4eSSatish Balay 1256e5c89e4eSSatish Balay Note: 1257811af0c4SBarry Smith This function can be called BEFORE `PetscInitialize()` 1258d49172ceSBarry Smith 125921532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 12601c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 12611c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 12621c9f3c13SBarry Smith on different ranks. 12631c9f3c13SBarry Smith 12647e6f8dd6SBarry Smith Developer Note: 12657e6f8dd6SBarry Smith Uses `malloc()` directly because PETSc may not be initialized yet. 1266b0250c70SBarry Smith 1267db781477SPatrick Sanan .seealso: `PetscOptionsInsert()`, `PetscOptionsClearValue()` 1268e5c89e4eSSatish Balay @*/ 1269d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsSetValue(PetscOptions options, const char name[], const char value[]) 1270d71ae5a4SJacob Faibussowitsch { 127139a651e2SJacob Faibussowitsch PetscFunctionBegin; 12729355ec05SMatthew G. Knepley PetscCall(PetscOptionsSetValue_Private(options, name, value, NULL, PETSC_OPT_CODE)); 12733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1274c5b5d8d5SVaclav Hapla } 1275c5b5d8d5SVaclav Hapla 12769355ec05SMatthew G. Knepley PetscErrorCode PetscOptionsSetValue_Private(PetscOptions options, const char name[], const char value[], int *pos, PetscOptionSource source) 1277d71ae5a4SJacob Faibussowitsch { 1278e5c89e4eSSatish Balay size_t len; 12799355ec05SMatthew G. Knepley int n, i; 1280e5c89e4eSSatish Balay char **names; 12819355ec05SMatthew G. Knepley char fullname[PETSC_MAX_OPTION_NAME] = ""; 1282c5b5d8d5SVaclav Hapla PetscBool flg; 1283e5c89e4eSSatish Balay 128439a651e2SJacob Faibussowitsch PetscFunctionBegin; 12857272c0d2SVaclav Hapla if (!options) { 12869566063dSJacob Faibussowitsch PetscCall(PetscOptionsCreateDefault()); 12877272c0d2SVaclav Hapla options = defaultoptions; 1288c5929fdfSBarry Smith } 128939a651e2SJacob Faibussowitsch PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "name %s must start with '-'", name); 12902d747510SLisandro Dalcin 12919566063dSJacob Faibussowitsch PetscCall(PetscOptionsSkipPrecedent(options, name, &flg)); 12923ba16761SJacob Faibussowitsch if (flg) PetscFunctionReturn(PETSC_SUCCESS); 1293e5c89e4eSSatish Balay 12942d747510SLisandro Dalcin name++; /* skip starting dash */ 12952d747510SLisandro Dalcin 129674e0666dSJed Brown if (options->prefixind > 0) { 1297d49172ceSBarry Smith strncpy(fullname, options->prefix, sizeof(fullname)); 12982d747510SLisandro Dalcin fullname[sizeof(fullname) - 1] = 0; 129989ae1891SBarry Smith strncat(fullname, name, sizeof(fullname) - strlen(fullname) - 1); 13002d747510SLisandro Dalcin fullname[sizeof(fullname) - 1] = 0; 130174e0666dSJed Brown name = fullname; 130274e0666dSJed Brown } 130374e0666dSJed Brown 130474e0666dSJed Brown /* check against aliases */ 13059355ec05SMatthew G. Knepley for (i = 0; i < options->Na; i++) { 13062d747510SLisandro Dalcin int result = PetscOptNameCmp(options->aliases1[i], name); 13079371c9d4SSatish Balay if (!result) { 13089371c9d4SSatish Balay name = options->aliases2[i]; 13099371c9d4SSatish Balay break; 13109371c9d4SSatish Balay } 1311e5c89e4eSSatish Balay } 1312e5c89e4eSSatish Balay 13132d747510SLisandro Dalcin /* slow search */ 13149355ec05SMatthew G. Knepley n = options->N; 1315e5c89e4eSSatish Balay names = options->names; 13169355ec05SMatthew G. Knepley for (i = 0; i < options->N; i++) { 13172d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i], name); 13182d747510SLisandro Dalcin if (!result) { 13199371c9d4SSatish Balay n = i; 13209371c9d4SSatish Balay goto setvalue; 13212d747510SLisandro Dalcin } else if (result > 0) { 13229371c9d4SSatish Balay n = i; 13239371c9d4SSatish Balay break; 1324e5c89e4eSSatish Balay } 1325e5c89e4eSSatish Balay } 13269355ec05SMatthew G. Knepley if (options->N == options->Nalloc) { 13279355ec05SMatthew G. Knepley char **names, **values; 13289355ec05SMatthew G. Knepley PetscBool *used; 13299355ec05SMatthew G. Knepley PetscOptionSource *source; 13309355ec05SMatthew G. Knepley 13319355ec05SMatthew G. Knepley options->Nalloc = PetscMax(10, options->Nalloc * 2); 13329355ec05SMatthew G. Knepley names = (char **)malloc(options->Nalloc * sizeof(char *)); 13339355ec05SMatthew G. Knepley values = (char **)malloc(options->Nalloc * sizeof(char *)); 13349355ec05SMatthew G. Knepley used = (PetscBool *)malloc(options->Nalloc * sizeof(PetscBool)); 13359355ec05SMatthew G. Knepley source = (PetscOptionSource *)malloc(options->Nalloc * sizeof(PetscOptionSource)); 13369355ec05SMatthew G. Knepley for (int i = 0; i < options->N; ++i) { 13379355ec05SMatthew G. Knepley names[i] = options->names[i]; 13389355ec05SMatthew G. Knepley values[i] = options->values[i]; 13399355ec05SMatthew G. Knepley used[i] = options->used[i]; 13409355ec05SMatthew G. Knepley source[i] = options->source[i]; 13419355ec05SMatthew G. Knepley } 13429355ec05SMatthew G. Knepley free(options->names); 13439355ec05SMatthew G. Knepley free(options->values); 13449355ec05SMatthew G. Knepley free(options->used); 13459355ec05SMatthew G. Knepley free(options->source); 13469355ec05SMatthew G. Knepley options->names = names; 13479355ec05SMatthew G. Knepley options->values = values; 13489355ec05SMatthew G. Knepley options->used = used; 13499355ec05SMatthew G. Knepley options->source = source; 13509355ec05SMatthew G. Knepley } 135139a651e2SJacob Faibussowitsch 13522d747510SLisandro Dalcin /* shift remaining values up 1 */ 13539355ec05SMatthew G. Knepley for (i = options->N; i > n; i--) { 13545e8c5e88SLisandro Dalcin options->names[i] = options->names[i - 1]; 1355e5c89e4eSSatish Balay options->values[i] = options->values[i - 1]; 1356e5c89e4eSSatish Balay options->used[i] = options->used[i - 1]; 13579355ec05SMatthew G. Knepley options->source[i] = options->source[i - 1]; 1358e5c89e4eSSatish Balay } 13592d747510SLisandro Dalcin options->names[n] = NULL; 13602d747510SLisandro Dalcin options->values[n] = NULL; 13612d747510SLisandro Dalcin options->used[n] = PETSC_FALSE; 13629355ec05SMatthew G. Knepley options->source[n] = PETSC_OPT_CODE; 13632d747510SLisandro Dalcin options->N++; 13642d747510SLisandro Dalcin 13652d747510SLisandro Dalcin /* destroy hash table */ 13662d747510SLisandro Dalcin kh_destroy(HO, options->ht); 13672d747510SLisandro Dalcin options->ht = NULL; 13682d747510SLisandro Dalcin 13692d747510SLisandro Dalcin /* set new name */ 137070d8d27cSBarry Smith len = strlen(name); 13715e8c5e88SLisandro Dalcin options->names[n] = (char *)malloc((len + 1) * sizeof(char)); 137239a651e2SJacob Faibussowitsch PetscCheck(options->names[n], PETSC_COMM_SELF, PETSC_ERR_MEM, "Failed to allocate option name"); 1373d49172ceSBarry Smith strcpy(options->names[n], name); 13742d747510SLisandro Dalcin 13752d747510SLisandro Dalcin setvalue: 13762d747510SLisandro Dalcin /* set new value */ 13772d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1378d49172ceSBarry Smith len = value ? strlen(value) : 0; 13795e8c5e88SLisandro Dalcin if (len) { 1380e5c89e4eSSatish Balay options->values[n] = (char *)malloc((len + 1) * sizeof(char)); 1381d49172ceSBarry Smith if (!options->values[n]) return PETSC_ERR_MEM; 1382d49172ceSBarry Smith strcpy(options->values[n], value); 1383432b765aSRené Chenard options->values[n][len] = '\0'; 13842d747510SLisandro Dalcin } else { 13852d747510SLisandro Dalcin options->values[n] = NULL; 13862d747510SLisandro Dalcin } 13879355ec05SMatthew G. Knepley options->source[n] = source; 13882d747510SLisandro Dalcin 138991ad3481SVaclav Hapla /* handle -help so that it can be set from anywhere */ 139091ad3481SVaclav Hapla if (!PetscOptNameCmp(name, "help")) { 139191ad3481SVaclav Hapla options->help = PETSC_TRUE; 1392d06005cbSLisandro Dalcin options->help_intro = (value && !PetscOptNameCmp(value, "intro")) ? PETSC_TRUE : PETSC_FALSE; 139391ad3481SVaclav Hapla options->used[n] = PETSC_TRUE; 139491ad3481SVaclav Hapla } 139591ad3481SVaclav Hapla 1396432b765aSRené Chenard PetscCall(PetscOptionsMonitor(options, name, value ? value : "", source)); 1397c5b5d8d5SVaclav Hapla if (pos) *pos = n; 13983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1399e5c89e4eSSatish Balay } 1400e5c89e4eSSatish Balay 14015d83a8b1SBarry Smith /*@ 1402e5c89e4eSSatish Balay PetscOptionsClearValue - Clears an option name-value pair in the options 1403e5c89e4eSSatish Balay database, overriding whatever is already present. 1404e5c89e4eSSatish Balay 14051c9f3c13SBarry Smith Logically Collective 1406e5c89e4eSSatish Balay 1407d8d19677SJose E. Roman Input Parameters: 140820f4b53cSBarry Smith + options - options database, use `NULL` for the default global database 1409a2b725a8SWilliam Gropp - name - name of option, this SHOULD have the - prepended 1410e5c89e4eSSatish Balay 1411e5c89e4eSSatish Balay Level: intermediate 1412e5c89e4eSSatish Balay 1413811af0c4SBarry Smith Note: 141421532e8aSBarry Smith The collectivity of this routine is complex; only the MPI processes that call this routine will 14151c9f3c13SBarry Smith have the affect of these options. If some processes that create objects call this routine and others do 14161c9f3c13SBarry Smith not the code may fail in complicated ways because the same parallel solvers may incorrectly use different options 14171c9f3c13SBarry Smith on different ranks. 14181c9f3c13SBarry Smith 14197e6f8dd6SBarry Smith Developer Note: 14207e6f8dd6SBarry Smith Uses `free()` directly because the options have been set with `malloc()` 14217e6f8dd6SBarry Smith 1422db781477SPatrick Sanan .seealso: `PetscOptionsInsert()` 1423e5c89e4eSSatish Balay @*/ 1424d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsClearValue(PetscOptions options, const char name[]) 1425d71ae5a4SJacob Faibussowitsch { 14262d747510SLisandro Dalcin int N, n, i; 14272d747510SLisandro Dalcin char **names; 1428e5c89e4eSSatish Balay 1429e5c89e4eSSatish Balay PetscFunctionBegin; 1430c5929fdfSBarry Smith options = options ? options : defaultoptions; 1431cc73adaaSBarry Smith PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Name must begin with '-': Instead %s", name); 1432c9dcd962SLisandro Dalcin if (!PetscOptNameCmp(name, "-help")) options->help = options->help_intro = PETSC_FALSE; 14332d747510SLisandro Dalcin 14342d747510SLisandro Dalcin name++; /* skip starting dash */ 14352d747510SLisandro Dalcin 14362d747510SLisandro Dalcin /* slow search */ 14372d747510SLisandro Dalcin N = n = options->N; 1438e5c89e4eSSatish Balay names = options->names; 1439e5c89e4eSSatish Balay for (i = 0; i < N; i++) { 14402d747510SLisandro Dalcin int result = PetscOptNameCmp(names[i], name); 14412d747510SLisandro Dalcin if (!result) { 14429371c9d4SSatish Balay n = i; 14439371c9d4SSatish Balay break; 14442d747510SLisandro Dalcin } else if (result > 0) { 14459371c9d4SSatish Balay n = N; 14469371c9d4SSatish Balay break; 1447e5c89e4eSSatish Balay } 14482d747510SLisandro Dalcin } 14493ba16761SJacob Faibussowitsch if (n == N) PetscFunctionReturn(PETSC_SUCCESS); /* it was not present */ 1450e5c89e4eSSatish Balay 14512d747510SLisandro Dalcin /* remove name and value */ 14522d747510SLisandro Dalcin if (options->names[n]) free(options->names[n]); 14532d747510SLisandro Dalcin if (options->values[n]) free(options->values[n]); 1454e5c89e4eSSatish Balay /* shift remaining values down 1 */ 1455e5c89e4eSSatish Balay for (i = n; i < N - 1; i++) { 14565e8c5e88SLisandro Dalcin options->names[i] = options->names[i + 1]; 1457e5c89e4eSSatish Balay options->values[i] = options->values[i + 1]; 1458e5c89e4eSSatish Balay options->used[i] = options->used[i + 1]; 14599355ec05SMatthew G. Knepley options->source[i] = options->source[i + 1]; 1460e5c89e4eSSatish Balay } 1461e5c89e4eSSatish Balay options->N--; 14622d747510SLisandro Dalcin 14632d747510SLisandro Dalcin /* destroy hash table */ 14642d747510SLisandro Dalcin kh_destroy(HO, options->ht); 14652d747510SLisandro Dalcin options->ht = NULL; 14662d747510SLisandro Dalcin 14679355ec05SMatthew G. Knepley PetscCall(PetscOptionsMonitor(options, name, NULL, PETSC_OPT_CODE)); 14683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1469e5c89e4eSSatish Balay } 1470e5c89e4eSSatish Balay 1471e5c89e4eSSatish Balay /*@C 14722d747510SLisandro Dalcin PetscOptionsFindPair - Gets an option name-value pair from the options database. 1473e5c89e4eSSatish Balay 14742d747510SLisandro Dalcin Not Collective 1475e5c89e4eSSatish Balay 1476e5c89e4eSSatish Balay Input Parameters: 147720f4b53cSBarry Smith + options - options database, use `NULL` for the default global database 147820f4b53cSBarry Smith . pre - the string to prepend to the name or `NULL`, this SHOULD NOT have the "-" prepended 14792d747510SLisandro Dalcin - name - name of option, this SHOULD have the "-" prepended 1480e5c89e4eSSatish Balay 14812d747510SLisandro Dalcin Output Parameters: 14822d747510SLisandro Dalcin + value - the option value (optional, not used for all options) 14832d747510SLisandro Dalcin - set - whether the option is set (optional) 1484e5c89e4eSSatish Balay 148520f4b53cSBarry Smith Level: developer 148620f4b53cSBarry Smith 1487811af0c4SBarry Smith Note: 14889666a313SBarry Smith Each process may find different values or no value depending on how options were inserted into the database 14891c9f3c13SBarry Smith 1490db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsClearValue()` 1491e5c89e4eSSatish Balay @*/ 1492d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsFindPair(PetscOptions options, const char pre[], const char name[], const char *value[], PetscBool *set) 1493d71ae5a4SJacob Faibussowitsch { 14949355ec05SMatthew G. Knepley char buf[PETSC_MAX_OPTION_NAME]; 14952d747510SLisandro Dalcin PetscBool matchnumbers = PETSC_TRUE; 1496e5c89e4eSSatish Balay 1497e5c89e4eSSatish Balay PetscFunctionBegin; 1498b33a4df8SMatthew G. Knepley if (!options) { 1499b33a4df8SMatthew G. Knepley PetscCall(PetscOptionsCreateDefault()); 1500b33a4df8SMatthew G. Knepley options = defaultoptions; 1501b33a4df8SMatthew G. Knepley } 150208401ef6SPierre Jolivet PetscCheck(!pre || !PetscUnlikely(pre[0] == '-'), PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Prefix cannot begin with '-': Instead %s", pre); 1503cc73adaaSBarry Smith PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Name must begin with '-': Instead %s", name); 1504e5c89e4eSSatish Balay 15052d747510SLisandro Dalcin name++; /* skip starting dash */ 1506e5c89e4eSSatish Balay 15077cd08cecSJed Brown /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 15082d747510SLisandro Dalcin if (pre && pre[0]) { 15092d747510SLisandro Dalcin char *ptr = buf; 15109371c9d4SSatish Balay if (name[0] == '-') { 15119371c9d4SSatish Balay *ptr++ = '-'; 15129371c9d4SSatish Balay name++; 15139371c9d4SSatish Balay } 15149566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(ptr, pre, buf + sizeof(buf) - ptr)); 15159566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(buf, name, sizeof(buf))); 15162d747510SLisandro Dalcin name = buf; 15177cd08cecSJed Brown } 15182d747510SLisandro Dalcin 151976bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 15202f828895SJed Brown PetscBool valid; 15219355ec05SMatthew G. Knepley char key[PETSC_MAX_OPTION_NAME + 1] = "-"; 15229566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key + 1, name, sizeof(key) - 1)); 15239566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key, &valid)); 152428b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid option '%s' obtained from pre='%s' and name='%s'", key, pre ? pre : "", name); 15252f828895SJed Brown } 1526e5c89e4eSSatish Balay 152708d7fc57SRené Chenard if (!options->ht) { 15282d747510SLisandro Dalcin int i, ret; 15292d747510SLisandro Dalcin khiter_t it; 15302d747510SLisandro Dalcin khash_t(HO) *ht; 15312d747510SLisandro Dalcin ht = kh_init(HO); 153228b400f6SJacob Faibussowitsch PetscCheck(ht, PETSC_COMM_SELF, PETSC_ERR_MEM, "Hash table allocation failed"); 15332d747510SLisandro Dalcin ret = kh_resize(HO, ht, options->N * 2); /* twice the required size to reduce risk of collisions */ 153428b400f6SJacob Faibussowitsch PetscCheck(!ret, PETSC_COMM_SELF, PETSC_ERR_MEM, "Hash table allocation failed"); 15352d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 15362d747510SLisandro Dalcin it = kh_put(HO, ht, options->names[i], &ret); 153708401ef6SPierre Jolivet PetscCheck(ret == 1, PETSC_COMM_SELF, PETSC_ERR_MEM, "Hash table allocation failed"); 15382d747510SLisandro Dalcin kh_val(ht, it) = i; 15392d747510SLisandro Dalcin } 15402d747510SLisandro Dalcin options->ht = ht; 15412d747510SLisandro Dalcin } 15422d747510SLisandro Dalcin 15432d747510SLisandro Dalcin khash_t(HO) *ht = options->ht; 15442d747510SLisandro Dalcin khiter_t it = kh_get(HO, ht, name); 15452d747510SLisandro Dalcin if (it != kh_end(ht)) { 15462d747510SLisandro Dalcin int i = kh_val(ht, it); 1547e5c89e4eSSatish Balay options->used[i] = PETSC_TRUE; 15482d747510SLisandro Dalcin if (value) *value = options->values[i]; 15492d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 15503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 15512d747510SLisandro Dalcin } 15522d747510SLisandro Dalcin 15532d747510SLisandro Dalcin /* 15542d747510SLisandro Dalcin The following block slows down all lookups in the most frequent path (most lookups are unsuccessful). 15552d747510SLisandro Dalcin Maybe this special lookup mode should be enabled on request with a push/pop API. 15562d747510SLisandro Dalcin The feature of matching _%d_ used sparingly in the codebase. 15572d747510SLisandro Dalcin */ 15582d747510SLisandro Dalcin if (matchnumbers) { 15592d747510SLisandro Dalcin int i, j, cnt = 0, locs[16], loce[16]; 1560e5c89e4eSSatish Balay /* determine the location and number of all _%d_ in the key */ 15612d747510SLisandro Dalcin for (i = 0; name[i]; i++) { 15622d747510SLisandro Dalcin if (name[i] == '_') { 15632d747510SLisandro Dalcin for (j = i + 1; name[j]; j++) { 15642d747510SLisandro Dalcin if (name[j] >= '0' && name[j] <= '9') continue; 15652d747510SLisandro Dalcin if (name[j] == '_' && j > i + 1) { /* found a number */ 1566e5c89e4eSSatish Balay locs[cnt] = i + 1; 1567e5c89e4eSSatish Balay loce[cnt++] = j + 1; 1568e5c89e4eSSatish Balay } 15692d747510SLisandro Dalcin i = j - 1; 1570e5c89e4eSSatish Balay break; 1571e5c89e4eSSatish Balay } 1572e5c89e4eSSatish Balay } 1573e5c89e4eSSatish Balay } 1574e5c89e4eSSatish Balay for (i = 0; i < cnt; i++) { 15752d747510SLisandro Dalcin PetscBool found; 15769355ec05SMatthew G. Knepley char opt[PETSC_MAX_OPTION_NAME + 1] = "-", tmp[PETSC_MAX_OPTION_NAME]; 15779566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(tmp, name, PetscMin((size_t)(locs[i] + 1), sizeof(tmp)))); 15789566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(opt, tmp, sizeof(opt))); 15799566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(opt, name + loce[i], sizeof(opt))); 15809566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, NULL, opt, value, &found)); 15819371c9d4SSatish Balay if (found) { 15829371c9d4SSatish Balay if (set) *set = PETSC_TRUE; 15833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 15849371c9d4SSatish Balay } 1585e5c89e4eSSatish Balay } 1586e5c89e4eSSatish Balay } 15872d747510SLisandro Dalcin 15882d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 15893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1590e5c89e4eSSatish Balay } 1591e5c89e4eSSatish Balay 1592d6ced9c0SMatthew G. Knepley /* Check whether any option begins with pre+name */ 159354a546c1SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscOptionsFindPairPrefix_Private(PetscOptions options, const char pre[], const char name[], const char *option[], const char *value[], PetscBool *set) 1594d71ae5a4SJacob Faibussowitsch { 15959355ec05SMatthew G. Knepley char buf[PETSC_MAX_OPTION_NAME]; 1596d6ced9c0SMatthew G. Knepley int numCnt = 0, locs[16], loce[16]; 1597514bf10dSMatthew G Knepley 1598514bf10dSMatthew G Knepley PetscFunctionBegin; 1599c5929fdfSBarry Smith options = options ? options : defaultoptions; 1600cc73adaaSBarry Smith PetscCheck(!pre || pre[0] != '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Prefix cannot begin with '-': Instead %s", pre); 1601cc73adaaSBarry Smith PetscCheck(name[0] == '-', PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Name must begin with '-': Instead %s", name); 1602514bf10dSMatthew G Knepley 16032d747510SLisandro Dalcin name++; /* skip starting dash */ 1604514bf10dSMatthew G Knepley 1605514bf10dSMatthew G Knepley /* append prefix to name, if prefix="foo_" and option='--bar", prefixed option is --foo_bar */ 16062d747510SLisandro Dalcin if (pre && pre[0]) { 16072d747510SLisandro Dalcin char *ptr = buf; 16089371c9d4SSatish Balay if (name[0] == '-') { 16099371c9d4SSatish Balay *ptr++ = '-'; 16109371c9d4SSatish Balay name++; 16119371c9d4SSatish Balay } 16129b15cf9aSJacob Faibussowitsch PetscCall(PetscStrncpy(ptr, pre, sizeof(buf) - ((ptr == buf) ? 0 : 1))); 16139566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(buf, name, sizeof(buf))); 16142d747510SLisandro Dalcin name = buf; 1615514bf10dSMatthew G Knepley } 16162d747510SLisandro Dalcin 161776bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 1618514bf10dSMatthew G Knepley PetscBool valid; 16199355ec05SMatthew G. Knepley char key[PETSC_MAX_OPTION_NAME + 1] = "-"; 16209566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(key + 1, name, sizeof(key) - 1)); 16219566063dSJacob Faibussowitsch PetscCall(PetscOptionsValidKey(key, &valid)); 162228b400f6SJacob Faibussowitsch PetscCheck(valid, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid option '%s' obtained from pre='%s' and name='%s'", key, pre ? pre : "", name); 1623514bf10dSMatthew G Knepley } 1624514bf10dSMatthew G Knepley 1625d6ced9c0SMatthew G. Knepley /* determine the location and number of all _%d_ in the key */ 1626d6ced9c0SMatthew G. Knepley { 1627d6ced9c0SMatthew G. Knepley int i, j; 1628d6ced9c0SMatthew G. Knepley for (i = 0; name[i]; i++) { 1629d6ced9c0SMatthew G. Knepley if (name[i] == '_') { 1630d6ced9c0SMatthew G. Knepley for (j = i + 1; name[j]; j++) { 1631d6ced9c0SMatthew G. Knepley if (name[j] >= '0' && name[j] <= '9') continue; 1632d6ced9c0SMatthew G. Knepley if (name[j] == '_' && j > i + 1) { /* found a number */ 1633d6ced9c0SMatthew G. Knepley locs[numCnt] = i + 1; 1634d6ced9c0SMatthew G. Knepley loce[numCnt++] = j + 1; 1635d6ced9c0SMatthew G. Knepley } 1636d6ced9c0SMatthew G. Knepley i = j - 1; 1637d6ced9c0SMatthew G. Knepley break; 1638d6ced9c0SMatthew G. Knepley } 1639d6ced9c0SMatthew G. Knepley } 1640d6ced9c0SMatthew G. Knepley } 1641d6ced9c0SMatthew G. Knepley } 1642d6ced9c0SMatthew G. Knepley 1643363da2dcSJacob Faibussowitsch /* slow search */ 1644363da2dcSJacob Faibussowitsch for (int c = -1; c < numCnt; ++c) { 1645363da2dcSJacob Faibussowitsch char opt[PETSC_MAX_OPTION_NAME + 2] = ""; 16462d747510SLisandro Dalcin size_t len; 1647d6ced9c0SMatthew G. Knepley 1648d6ced9c0SMatthew G. Knepley if (c < 0) { 1649c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(opt, name, sizeof(opt))); 1650d6ced9c0SMatthew G. Knepley } else { 1651363da2dcSJacob Faibussowitsch PetscCall(PetscStrncpy(opt, name, PetscMin((size_t)(locs[c] + 1), sizeof(opt)))); 1652363da2dcSJacob Faibussowitsch PetscCall(PetscStrlcat(opt, name + loce[c], sizeof(opt) - 1)); 1653d6ced9c0SMatthew G. Knepley } 16549566063dSJacob Faibussowitsch PetscCall(PetscStrlen(opt, &len)); 1655363da2dcSJacob Faibussowitsch for (int i = 0; i < options->N; i++) { 1656363da2dcSJacob Faibussowitsch PetscBool match; 1657363da2dcSJacob Faibussowitsch 16589566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(options->names[i], opt, len, &match)); 1659514bf10dSMatthew G Knepley if (match) { 1660514bf10dSMatthew G Knepley options->used[i] = PETSC_TRUE; 166154a546c1SMatthew G. Knepley if (option) *option = options->names[i]; 16622d747510SLisandro Dalcin if (value) *value = options->values[i]; 16632d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 16643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1665514bf10dSMatthew G Knepley } 1666514bf10dSMatthew G Knepley } 16672d747510SLisandro Dalcin } 16682d747510SLisandro Dalcin 16692d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 16703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1671514bf10dSMatthew G Knepley } 1672514bf10dSMatthew G Knepley 16735d83a8b1SBarry Smith /*@ 1674e5c89e4eSSatish Balay PetscOptionsReject - Generates an error if a certain option is given. 1675e5c89e4eSSatish Balay 16761c9f3c13SBarry Smith Not Collective 1677e5c89e4eSSatish Balay 1678e5c89e4eSSatish Balay Input Parameters: 167920f4b53cSBarry Smith + options - options database, use `NULL` for default global database 168020f4b53cSBarry Smith . pre - the option prefix (may be `NULL`) 16812d747510SLisandro Dalcin . name - the option name one is seeking 168220f4b53cSBarry Smith - mess - error message (may be `NULL`) 1683e5c89e4eSSatish Balay 1684e5c89e4eSSatish Balay Level: advanced 1685e5c89e4eSSatish Balay 16860241b274SPierre Jolivet .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`, 1687db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 1688db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 1689c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 1690db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 1691db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 1692e5c89e4eSSatish Balay @*/ 1693d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsReject(PetscOptions options, const char pre[], const char name[], const char mess[]) 1694d71ae5a4SJacob Faibussowitsch { 1695ace3abfcSBarry Smith PetscBool flag = PETSC_FALSE; 1696e5c89e4eSSatish Balay 1697e5c89e4eSSatish Balay PetscFunctionBegin; 16989566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(options, pre, name, &flag)); 1699e5c89e4eSSatish Balay if (flag) { 170008401ef6SPierre 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); 1701f7d195e4SLawrence Mitchell SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Program has disabled option: -%s%s", pre ? pre : "", name + 1); 1702e5c89e4eSSatish Balay } 17033ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1704e5c89e4eSSatish Balay } 1705e5c89e4eSSatish Balay 17065d83a8b1SBarry Smith /*@ 17072d747510SLisandro Dalcin PetscOptionsHasHelp - Determines whether the "-help" option is in the database. 17082d747510SLisandro Dalcin 17092d747510SLisandro Dalcin Not Collective 17102d747510SLisandro Dalcin 1711811af0c4SBarry Smith Input Parameter: 171220f4b53cSBarry Smith . options - options database, use `NULL` for default global database 17132d747510SLisandro Dalcin 1714811af0c4SBarry Smith Output Parameter: 1715811af0c4SBarry Smith . set - `PETSC_TRUE` if found else `PETSC_FALSE`. 17162d747510SLisandro Dalcin 17172d747510SLisandro Dalcin Level: advanced 17182d747510SLisandro Dalcin 1719db781477SPatrick Sanan .seealso: `PetscOptionsHasName()` 17202d747510SLisandro Dalcin @*/ 1721d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHasHelp(PetscOptions options, PetscBool *set) 1722d71ae5a4SJacob Faibussowitsch { 17232d747510SLisandro Dalcin PetscFunctionBegin; 17244f572ea9SToby Isaac PetscAssertPointer(set, 2); 17252d747510SLisandro Dalcin options = options ? options : defaultoptions; 17262d747510SLisandro Dalcin *set = options->help; 17273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 17282d747510SLisandro Dalcin } 17292d747510SLisandro Dalcin 1730d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHasHelpIntro_Internal(PetscOptions options, PetscBool *set) 1731d71ae5a4SJacob Faibussowitsch { 1732d314f959SVaclav Hapla PetscFunctionBegin; 17334f572ea9SToby Isaac PetscAssertPointer(set, 2); 1734d314f959SVaclav Hapla options = options ? options : defaultoptions; 1735d314f959SVaclav Hapla *set = options->help_intro; 17363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1737d314f959SVaclav Hapla } 1738d314f959SVaclav Hapla 17395d83a8b1SBarry Smith /*@ 1740e24fcbf7SPierre 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 1741e24fcbf7SPierre Jolivet if its value is set to false. 1742e5c89e4eSSatish Balay 1743e5c89e4eSSatish Balay Not Collective 1744e5c89e4eSSatish Balay 1745e5c89e4eSSatish Balay Input Parameters: 174620f4b53cSBarry Smith + options - options database, use `NULL` for default global database 174720f4b53cSBarry Smith . pre - string to prepend to the name or `NULL` 17483de71b31SHong Zhang - name - the option one is seeking 1749e5c89e4eSSatish Balay 1750811af0c4SBarry Smith Output Parameter: 1751811af0c4SBarry Smith . set - `PETSC_TRUE` if found else `PETSC_FALSE`. 1752e5c89e4eSSatish Balay 1753e5c89e4eSSatish Balay Level: beginner 1754e5c89e4eSSatish Balay 1755811af0c4SBarry Smith Note: 1756811af0c4SBarry Smith In many cases you probably want to use `PetscOptionsGetBool()` instead of calling this, to allowing toggling values. 175790d69ab7SBarry Smith 1758db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 1759db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 1760db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 1761c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 1762db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 1763db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 1764e5c89e4eSSatish Balay @*/ 1765d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHasName(PetscOptions options, const char pre[], const char name[], PetscBool *set) 1766d71ae5a4SJacob Faibussowitsch { 17672d747510SLisandro Dalcin const char *value; 1768ace3abfcSBarry Smith PetscBool flag; 1769e5c89e4eSSatish Balay 1770e5c89e4eSSatish Balay PetscFunctionBegin; 17719566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 177296ef3cdfSSatish Balay if (set) *set = flag; 17733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1774e5c89e4eSSatish Balay } 1775e5c89e4eSSatish Balay 1776e5c89e4eSSatish Balay /*@C 17772d747510SLisandro Dalcin PetscOptionsGetAll - Lists all the options the program was run with in a single string. 17782d747510SLisandro Dalcin 17792d747510SLisandro Dalcin Not Collective 17802d747510SLisandro Dalcin 1781fd292e60Sprj- Input Parameter: 178220f4b53cSBarry Smith . options - the options database, use `NULL` for the default global database 17832d747510SLisandro Dalcin 17842d747510SLisandro Dalcin Output Parameter: 17852d747510SLisandro Dalcin . copts - pointer where string pointer is stored 17862d747510SLisandro Dalcin 178720f4b53cSBarry Smith Level: advanced 178820f4b53cSBarry Smith 17892d747510SLisandro Dalcin Notes: 1790811af0c4SBarry Smith The array and each entry in the array should be freed with `PetscFree()` 1791811af0c4SBarry Smith 17921c9f3c13SBarry Smith Each process may have different values depending on how the options were inserted into the database 17932d747510SLisandro Dalcin 1794db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsView()`, `PetscOptionsPush()`, `PetscOptionsPop()` 17952d747510SLisandro Dalcin @*/ 1796ce78bad3SBarry Smith PetscErrorCode PetscOptionsGetAll(PetscOptions options, char *copts[]) PeNS 1797d71ae5a4SJacob Faibussowitsch { 17982d747510SLisandro Dalcin PetscInt i; 17992d747510SLisandro Dalcin size_t len = 1, lent = 0; 18002d747510SLisandro Dalcin char *coptions = NULL; 18012d747510SLisandro Dalcin 18022d747510SLisandro Dalcin PetscFunctionBegin; 18034f572ea9SToby Isaac PetscAssertPointer(copts, 2); 18042d747510SLisandro Dalcin options = options ? options : defaultoptions; 18052d747510SLisandro Dalcin /* count the length of the required string */ 18062d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 18079566063dSJacob Faibussowitsch PetscCall(PetscStrlen(options->names[i], &lent)); 18082d747510SLisandro Dalcin len += 2 + lent; 18092d747510SLisandro Dalcin if (options->values[i]) { 18109566063dSJacob Faibussowitsch PetscCall(PetscStrlen(options->values[i], &lent)); 18112d747510SLisandro Dalcin len += 1 + lent; 18122d747510SLisandro Dalcin } 18132d747510SLisandro Dalcin } 18149566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len, &coptions)); 18152d747510SLisandro Dalcin coptions[0] = 0; 18162d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 1817c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, "-", len)); 1818c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, options->names[i], len)); 1819c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, " ", len)); 18202d747510SLisandro Dalcin if (options->values[i]) { 1821c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, options->values[i], len)); 1822c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(coptions, " ", len)); 18232d747510SLisandro Dalcin } 18242d747510SLisandro Dalcin } 18252d747510SLisandro Dalcin *copts = coptions; 18263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 18272d747510SLisandro Dalcin } 18282d747510SLisandro Dalcin 18295d83a8b1SBarry Smith /*@ 18302d747510SLisandro Dalcin PetscOptionsUsed - Indicates if PETSc has used a particular option set in the database 18312d747510SLisandro Dalcin 18322d747510SLisandro Dalcin Not Collective 18332d747510SLisandro Dalcin 1834d8d19677SJose E. Roman Input Parameters: 183520f4b53cSBarry Smith + options - options database, use `NULL` for default global database 18362d747510SLisandro Dalcin - name - string name of option 18372d747510SLisandro Dalcin 18382d747510SLisandro Dalcin Output Parameter: 1839811af0c4SBarry Smith . used - `PETSC_TRUE` if the option was used, otherwise false, including if option was not found in options database 18402d747510SLisandro Dalcin 18412d747510SLisandro Dalcin Level: advanced 18422d747510SLisandro Dalcin 1843811af0c4SBarry Smith Note: 18449666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 18451c9f3c13SBarry Smith on the given process 18461c9f3c13SBarry Smith 1847db781477SPatrick Sanan .seealso: `PetscOptionsView()`, `PetscOptionsLeft()`, `PetscOptionsAllUsed()` 18482d747510SLisandro Dalcin @*/ 1849d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsUsed(PetscOptions options, const char *name, PetscBool *used) 1850d71ae5a4SJacob Faibussowitsch { 18512d747510SLisandro Dalcin PetscInt i; 18522d747510SLisandro Dalcin 18532d747510SLisandro Dalcin PetscFunctionBegin; 18544f572ea9SToby Isaac PetscAssertPointer(name, 2); 18554f572ea9SToby Isaac PetscAssertPointer(used, 3); 18562d747510SLisandro Dalcin options = options ? options : defaultoptions; 18572d747510SLisandro Dalcin *used = PETSC_FALSE; 18582d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 18599566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(options->names[i], name, used)); 18602d747510SLisandro Dalcin if (*used) { 18612d747510SLisandro Dalcin *used = options->used[i]; 18622d747510SLisandro Dalcin break; 18632d747510SLisandro Dalcin } 18642d747510SLisandro Dalcin } 18653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 18662d747510SLisandro Dalcin } 18672d747510SLisandro Dalcin 1868487a658cSBarry Smith /*@ 18692d747510SLisandro Dalcin PetscOptionsAllUsed - Returns a count of the number of options in the 18702d747510SLisandro Dalcin database that have never been selected. 18712d747510SLisandro Dalcin 18722d747510SLisandro Dalcin Not Collective 18732d747510SLisandro Dalcin 18742d747510SLisandro Dalcin Input Parameter: 187520f4b53cSBarry Smith . options - options database, use `NULL` for default global database 18762d747510SLisandro Dalcin 18772d747510SLisandro Dalcin Output Parameter: 18782d747510SLisandro Dalcin . N - count of options not used 18792d747510SLisandro Dalcin 18802d747510SLisandro Dalcin Level: advanced 18812d747510SLisandro Dalcin 1882811af0c4SBarry Smith Note: 18839666a313SBarry Smith The value returned may be different on each process and depends on which options have been processed 18841c9f3c13SBarry Smith on the given process 18851c9f3c13SBarry Smith 1886db781477SPatrick Sanan .seealso: `PetscOptionsView()` 18872d747510SLisandro Dalcin @*/ 1888d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsAllUsed(PetscOptions options, PetscInt *N) 1889d71ae5a4SJacob Faibussowitsch { 18902d747510SLisandro Dalcin PetscInt i, n = 0; 18912d747510SLisandro Dalcin 18922d747510SLisandro Dalcin PetscFunctionBegin; 18934f572ea9SToby Isaac PetscAssertPointer(N, 2); 18942d747510SLisandro Dalcin options = options ? options : defaultoptions; 18952d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 18962d747510SLisandro Dalcin if (!options->used[i]) n++; 18972d747510SLisandro Dalcin } 18982d747510SLisandro Dalcin *N = n; 18993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19002d747510SLisandro Dalcin } 19012d747510SLisandro Dalcin 1902487a658cSBarry Smith /*@ 19032d747510SLisandro Dalcin PetscOptionsLeft - Prints to screen any options that were set and never used. 19042d747510SLisandro Dalcin 19052d747510SLisandro Dalcin Not Collective 19062d747510SLisandro Dalcin 19072d747510SLisandro Dalcin Input Parameter: 190820f4b53cSBarry Smith . options - options database; use `NULL` for default global database 19092d747510SLisandro Dalcin 19102d747510SLisandro Dalcin Options Database Key: 1911811af0c4SBarry Smith . -options_left - activates `PetscOptionsAllUsed()` within `PetscFinalize()` 19122d747510SLisandro Dalcin 191320f4b53cSBarry Smith Level: advanced 191420f4b53cSBarry Smith 19153de2bfdfSBarry Smith Notes: 1916811af0c4SBarry Smith This is rarely used directly, it is called by `PetscFinalize()` in debug more or if -options_left 19171c9f3c13SBarry Smith is passed otherwise to help users determine possible mistakes in their usage of options. This 1918811af0c4SBarry Smith only prints values on process zero of `PETSC_COMM_WORLD`. 1919811af0c4SBarry Smith 1920811af0c4SBarry Smith Other processes depending the objects 19211c9f3c13SBarry Smith used may have different options that are left unused. 19223de2bfdfSBarry Smith 1923db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()` 19242d747510SLisandro Dalcin @*/ 1925d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeft(PetscOptions options) 1926d71ae5a4SJacob Faibussowitsch { 19272d747510SLisandro Dalcin PetscInt i; 19283de2bfdfSBarry Smith PetscInt cnt = 0; 19293de2bfdfSBarry Smith PetscOptions toptions; 19302d747510SLisandro Dalcin 19312d747510SLisandro Dalcin PetscFunctionBegin; 19323de2bfdfSBarry Smith toptions = options ? options : defaultoptions; 19333de2bfdfSBarry Smith for (i = 0; i < toptions->N; i++) { 19343de2bfdfSBarry Smith if (!toptions->used[i]) { 1935660278c0SBarry Smith if (PetscCIOption(toptions->names[i])) continue; 19363de2bfdfSBarry Smith if (toptions->values[i]) { 19379355ec05SMatthew 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]])); 19382d747510SLisandro Dalcin } else { 19399355ec05SMatthew G. Knepley PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Option left: name:-%s (no value) source: %s\n", toptions->names[i], PetscOptionSources[toptions->source[i]])); 19402d747510SLisandro Dalcin } 19412d747510SLisandro Dalcin } 19422d747510SLisandro Dalcin } 19433de2bfdfSBarry Smith if (!options) { 19443de2bfdfSBarry Smith toptions = defaultoptions; 19453de2bfdfSBarry Smith while (toptions->previous) { 19463de2bfdfSBarry Smith cnt++; 19473de2bfdfSBarry Smith toptions = toptions->previous; 19483de2bfdfSBarry Smith } 194948a46eb9SPierre 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)); 19503de2bfdfSBarry Smith } 19513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19522d747510SLisandro Dalcin } 19532d747510SLisandro Dalcin 19542d747510SLisandro Dalcin /*@C 19552d747510SLisandro Dalcin PetscOptionsLeftGet - Returns all options that were set and never used. 19562d747510SLisandro Dalcin 19572d747510SLisandro Dalcin Not Collective 19582d747510SLisandro Dalcin 19592d747510SLisandro Dalcin Input Parameter: 196020f4b53cSBarry Smith . options - options database, use `NULL` for default global database 19612d747510SLisandro Dalcin 1962d8d19677SJose E. Roman Output Parameters: 1963a2b725a8SWilliam Gropp + N - count of options not used 19642d747510SLisandro Dalcin . names - names of options not used 1965a2b725a8SWilliam Gropp - values - values of options not used 19662d747510SLisandro Dalcin 19672d747510SLisandro Dalcin Level: advanced 19682d747510SLisandro Dalcin 19692d747510SLisandro Dalcin Notes: 1970811af0c4SBarry Smith Users should call `PetscOptionsLeftRestore()` to free the memory allocated in this routine 1971811af0c4SBarry Smith 1972811af0c4SBarry Smith The value returned may be different on each process and depends on which options have been processed 19731c9f3c13SBarry Smith on the given process 19742d747510SLisandro Dalcin 1975db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsLeft()` 19762d747510SLisandro Dalcin @*/ 1977d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeftGet(PetscOptions options, PetscInt *N, char **names[], char **values[]) 1978d71ae5a4SJacob Faibussowitsch { 19792d747510SLisandro Dalcin PetscInt i, n; 19802d747510SLisandro Dalcin 19812d747510SLisandro Dalcin PetscFunctionBegin; 19824f572ea9SToby Isaac if (N) PetscAssertPointer(N, 2); 19834f572ea9SToby Isaac if (names) PetscAssertPointer(names, 3); 19844f572ea9SToby Isaac if (values) PetscAssertPointer(values, 4); 19852d747510SLisandro Dalcin options = options ? options : defaultoptions; 19862d747510SLisandro Dalcin 19872d747510SLisandro Dalcin /* The number of unused PETSc options */ 19882d747510SLisandro Dalcin n = 0; 19892d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 1990660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 19912d747510SLisandro Dalcin if (!options->used[i]) n++; 19922d747510SLisandro Dalcin } 1993ad540459SPierre Jolivet if (N) *N = n; 19949566063dSJacob Faibussowitsch if (names) PetscCall(PetscMalloc1(n, names)); 19959566063dSJacob Faibussowitsch if (values) PetscCall(PetscMalloc1(n, values)); 19962d747510SLisandro Dalcin 19972d747510SLisandro Dalcin n = 0; 19982d747510SLisandro Dalcin if (names || values) { 19992d747510SLisandro Dalcin for (i = 0; i < options->N; i++) { 20002d747510SLisandro Dalcin if (!options->used[i]) { 2001660278c0SBarry Smith if (PetscCIOption(options->names[i])) continue; 20022d747510SLisandro Dalcin if (names) (*names)[n] = options->names[i]; 20032d747510SLisandro Dalcin if (values) (*values)[n] = options->values[i]; 20042d747510SLisandro Dalcin n++; 20052d747510SLisandro Dalcin } 20062d747510SLisandro Dalcin } 20072d747510SLisandro Dalcin } 20083ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20092d747510SLisandro Dalcin } 20102d747510SLisandro Dalcin 20112d747510SLisandro Dalcin /*@C 2012811af0c4SBarry Smith PetscOptionsLeftRestore - Free memory for the unused PETSc options obtained using `PetscOptionsLeftGet()`. 20132d747510SLisandro Dalcin 20142d747510SLisandro Dalcin Not Collective 20152d747510SLisandro Dalcin 2016d8d19677SJose E. Roman Input Parameters: 201720f4b53cSBarry Smith + options - options database, use `NULL` for default global database 201810450e9eSJacob Faibussowitsch . N - count of options not used 20192d747510SLisandro Dalcin . names - names of options not used 2020a2b725a8SWilliam Gropp - values - values of options not used 20212d747510SLisandro Dalcin 20222d747510SLisandro Dalcin Level: advanced 20232d747510SLisandro Dalcin 202410450e9eSJacob Faibussowitsch Notes: 202510450e9eSJacob Faibussowitsch The user should pass the same pointer to `N` as they did when calling `PetscOptionsLeftGet()` 202610450e9eSJacob Faibussowitsch 2027db781477SPatrick Sanan .seealso: `PetscOptionsAllUsed()`, `PetscOptionsLeft()`, `PetscOptionsLeftGet()` 20282d747510SLisandro Dalcin @*/ 2029d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsLeftRestore(PetscOptions options, PetscInt *N, char **names[], char **values[]) 2030d71ae5a4SJacob Faibussowitsch { 20312d747510SLisandro Dalcin PetscFunctionBegin; 203210450e9eSJacob Faibussowitsch (void)options; 20334f572ea9SToby Isaac if (N) PetscAssertPointer(N, 2); 20344f572ea9SToby Isaac if (names) PetscAssertPointer(names, 3); 20354f572ea9SToby Isaac if (values) PetscAssertPointer(values, 4); 2036ad540459SPierre Jolivet if (N) *N = 0; 20379566063dSJacob Faibussowitsch if (names) PetscCall(PetscFree(*names)); 20389566063dSJacob Faibussowitsch if (values) PetscCall(PetscFree(*values)); 20393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20402d747510SLisandro Dalcin } 20412d747510SLisandro Dalcin 20422d747510SLisandro Dalcin /*@C 2043811af0c4SBarry Smith PetscOptionsMonitorDefault - Print all options set value events using the supplied `PetscViewer`. 20442d747510SLisandro Dalcin 2045c3339decSBarry Smith Logically Collective 20462d747510SLisandro Dalcin 20472d747510SLisandro Dalcin Input Parameters: 20482d747510SLisandro Dalcin + name - option name string 20492d747510SLisandro Dalcin . value - option value string 20509355ec05SMatthew G. Knepley . source - The source for the option 205120f4b53cSBarry Smith - ctx - a `PETSCVIEWERASCII` or `NULL` 20522d747510SLisandro Dalcin 20532d747510SLisandro Dalcin Level: intermediate 20542d747510SLisandro Dalcin 20559666a313SBarry Smith Notes: 205620f4b53cSBarry Smith If ctx is `NULL`, `PetscPrintf()` is used. 20579314d9b7SBarry Smith The first MPI process in the `PetscViewer` viewer actually prints the values, other 20581c9f3c13SBarry Smith processes may have different values set 20591c9f3c13SBarry Smith 2060811af0c4SBarry Smith If `PetscCIEnabled` then do not print the test harness options 2061660278c0SBarry Smith 2062db781477SPatrick Sanan .seealso: `PetscOptionsMonitorSet()` 20632d747510SLisandro Dalcin @*/ 20649355ec05SMatthew G. Knepley PetscErrorCode PetscOptionsMonitorDefault(const char name[], const char value[], PetscOptionSource source, void *ctx) 2065d71ae5a4SJacob Faibussowitsch { 20662d747510SLisandro Dalcin PetscFunctionBegin; 20673ba16761SJacob Faibussowitsch if (PetscCIOption(name)) PetscFunctionReturn(PETSC_SUCCESS); 2068660278c0SBarry Smith 20699060e2f9SVaclav Hapla if (ctx) { 20709060e2f9SVaclav Hapla PetscViewer viewer = (PetscViewer)ctx; 20712d747510SLisandro Dalcin if (!value) { 20729566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Removing option: %s\n", name)); 20732d747510SLisandro Dalcin } else if (!value[0]) { 20749355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "Setting option: %s (no value) (source: %s)\n", name, PetscOptionSources[source])); 20752d747510SLisandro Dalcin } else { 20769355ec05SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "Setting option: %s = %s (source: %s)\n", name, value, PetscOptionSources[source])); 20772d747510SLisandro Dalcin } 20789060e2f9SVaclav Hapla } else { 20799060e2f9SVaclav Hapla MPI_Comm comm = PETSC_COMM_WORLD; 20809060e2f9SVaclav Hapla if (!value) { 20819566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm, "Removing option: %s\n", name)); 20829060e2f9SVaclav Hapla } else if (!value[0]) { 20839355ec05SMatthew G. Knepley PetscCall(PetscPrintf(comm, "Setting option: %s (no value) (source: %s)\n", name, PetscOptionSources[source])); 20849060e2f9SVaclav Hapla } else { 2085aaa8cc7dSPierre Jolivet PetscCall(PetscPrintf(comm, "Setting option: %s = %s (source: %s)\n", name, value, PetscOptionSources[source])); 20869060e2f9SVaclav Hapla } 20879060e2f9SVaclav Hapla } 20883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20892d747510SLisandro Dalcin } 20902d747510SLisandro Dalcin 20912d747510SLisandro Dalcin /*@C 20922d747510SLisandro Dalcin PetscOptionsMonitorSet - Sets an ADDITIONAL function to be called at every method that 20932d747510SLisandro Dalcin modified the PETSc options database. 20942d747510SLisandro Dalcin 20952d747510SLisandro Dalcin Not Collective 20962d747510SLisandro Dalcin 20972d747510SLisandro Dalcin Input Parameters: 209820f4b53cSBarry Smith + monitor - pointer to function (if this is `NULL`, it turns off monitoring 209910450e9eSJacob Faibussowitsch . mctx - [optional] context for private data for the monitor routine (use `NULL` if 210010450e9eSJacob Faibussowitsch no context is desired) 210149abdd8aSBarry Smith - monitordestroy - [optional] routine that frees monitor context (may be `NULL`), see `PetscCtxDestroyFn` for its calling sequence 21022d747510SLisandro Dalcin 210310450e9eSJacob Faibussowitsch Calling sequence of `monitor`: 21042d747510SLisandro Dalcin + name - option name string 2105432b765aSRené Chenard . value - option value string, a value of `NULL` indicates the option is being removed from the database. A value 2106432b765aSRené Chenard of "" indicates the option is in the database but has no value. 21079355ec05SMatthew G. Knepley . source - option source 2108811af0c4SBarry Smith - mctx - optional monitoring context, as set by `PetscOptionsMonitorSet()` 21092d747510SLisandro Dalcin 2110432b765aSRené Chenard Options Database Keys: 21118d6650c0SBarry Smith + -options_monitor <viewer> - turn on default monitoring of changes to the options database 2112432b765aSRené Chenard - -options_monitor_cancel - turn off any option monitors except the default monitor obtained with `-options_monitor` 2113432b765aSRené Chenard 211420f4b53cSBarry Smith Level: intermediate 211520f4b53cSBarry Smith 21162d747510SLisandro Dalcin Notes: 211710450e9eSJacob Faibussowitsch See `PetscInitialize()` for options related to option database monitoring. 211810450e9eSJacob Faibussowitsch 2119432b765aSRené Chenard The default is to do no monitoring. To print the name and value of options 2120811af0c4SBarry Smith being inserted into the database, use `PetscOptionsMonitorDefault()` as the monitoring routine, 2121432b765aSRené Chenard with a `NULL` monitoring context. Or use the option `-options_monitor` <viewer>. 21222d747510SLisandro Dalcin 21232d747510SLisandro Dalcin Several different monitoring routines may be set by calling 2124811af0c4SBarry Smith `PetscOptionsMonitorSet()` multiple times; all will be called in the 21252d747510SLisandro Dalcin order in which they were set. 21262d747510SLisandro Dalcin 212749abdd8aSBarry Smith .seealso: `PetscOptionsMonitorDefault()`, `PetscInitialize()`, `PetscCtxDestroyFn` 21282d747510SLisandro Dalcin @*/ 212949abdd8aSBarry Smith PetscErrorCode PetscOptionsMonitorSet(PetscErrorCode (*monitor)(const char name[], const char value[], PetscOptionSource source, void *mctx), void *mctx, PetscCtxDestroyFn *monitordestroy) 2130d71ae5a4SJacob Faibussowitsch { 21312d747510SLisandro Dalcin PetscOptions options = defaultoptions; 21322d747510SLisandro Dalcin 21332d747510SLisandro Dalcin PetscFunctionBegin; 21343ba16761SJacob Faibussowitsch if (options->monitorCancel) PetscFunctionReturn(PETSC_SUCCESS); 213508401ef6SPierre Jolivet PetscCheck(options->numbermonitors < MAXOPTIONSMONITORS, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Too many PetscOptions monitors set"); 21362d747510SLisandro Dalcin options->monitor[options->numbermonitors] = monitor; 21372d747510SLisandro Dalcin options->monitordestroy[options->numbermonitors] = monitordestroy; 2138835f2295SStefano Zampini options->monitorcontext[options->numbermonitors++] = mctx; 21393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21402d747510SLisandro Dalcin } 21412d747510SLisandro Dalcin 21422d747510SLisandro Dalcin /* 21432d747510SLisandro Dalcin PetscOptionsStringToBool - Converts string to PetscBool, handles cases like "yes", "no", "true", "false", "0", "1", "off", "on". 214463fe8743SVaclav Hapla Empty string is considered as true. 21452d747510SLisandro Dalcin */ 2146d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToBool(const char value[], PetscBool *a) 2147d71ae5a4SJacob Faibussowitsch { 21482d747510SLisandro Dalcin PetscBool istrue, isfalse; 21492d747510SLisandro Dalcin size_t len; 21502d747510SLisandro Dalcin 21512d747510SLisandro Dalcin PetscFunctionBegin; 215263fe8743SVaclav Hapla /* PetscStrlen() returns 0 for NULL or "" */ 21539566063dSJacob Faibussowitsch PetscCall(PetscStrlen(value, &len)); 21549371c9d4SSatish Balay if (!len) { 21559371c9d4SSatish Balay *a = PETSC_TRUE; 21563ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21579371c9d4SSatish Balay } 21589566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "TRUE", &istrue)); 21599371c9d4SSatish Balay if (istrue) { 21609371c9d4SSatish Balay *a = PETSC_TRUE; 21613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21629371c9d4SSatish Balay } 21639566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "YES", &istrue)); 21649371c9d4SSatish Balay if (istrue) { 21659371c9d4SSatish Balay *a = PETSC_TRUE; 21663ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21679371c9d4SSatish Balay } 21689566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "1", &istrue)); 21699371c9d4SSatish Balay if (istrue) { 21709371c9d4SSatish Balay *a = PETSC_TRUE; 21713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21729371c9d4SSatish Balay } 21739566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "on", &istrue)); 21749371c9d4SSatish Balay if (istrue) { 21759371c9d4SSatish Balay *a = PETSC_TRUE; 21763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21779371c9d4SSatish Balay } 21789566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "FALSE", &isfalse)); 21799371c9d4SSatish Balay if (isfalse) { 21809371c9d4SSatish Balay *a = PETSC_FALSE; 21813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21829371c9d4SSatish Balay } 21839566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "NO", &isfalse)); 21849371c9d4SSatish Balay if (isfalse) { 21859371c9d4SSatish Balay *a = PETSC_FALSE; 21863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21879371c9d4SSatish Balay } 21889566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "0", &isfalse)); 21899371c9d4SSatish Balay if (isfalse) { 21909371c9d4SSatish Balay *a = PETSC_FALSE; 21913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21929371c9d4SSatish Balay } 21939566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(value, "off", &isfalse)); 21949371c9d4SSatish Balay if (isfalse) { 21959371c9d4SSatish Balay *a = PETSC_FALSE; 21963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21979371c9d4SSatish Balay } 219898921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Unknown logical value: %s", value); 21992d747510SLisandro Dalcin } 22002d747510SLisandro Dalcin 22012d747510SLisandro Dalcin /* 22022d747510SLisandro Dalcin PetscOptionsStringToInt - Converts a string to an integer value. Handles special cases such as "default" and "decide" 22032d747510SLisandro Dalcin */ 2204d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToInt(const char name[], PetscInt *a) 2205d71ae5a4SJacob Faibussowitsch { 22062d747510SLisandro Dalcin size_t len; 2207b3480c81SBarry Smith PetscBool decide, tdefault, mouse, unlimited; 22082d747510SLisandro Dalcin 22092d747510SLisandro Dalcin PetscFunctionBegin; 22109566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name, &len)); 22115f80ce2aSJacob Faibussowitsch PetscCheck(len, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "character string of length zero has no numerical value"); 22122d747510SLisandro Dalcin 22139566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DEFAULT", &tdefault)); 221448a46eb9SPierre Jolivet if (!tdefault) PetscCall(PetscStrcasecmp(name, "DEFAULT", &tdefault)); 22159566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DECIDE", &decide)); 221648a46eb9SPierre Jolivet if (!decide) PetscCall(PetscStrcasecmp(name, "DECIDE", &decide)); 2217b3480c81SBarry Smith if (!decide) PetscCall(PetscStrcasecmp(name, "PETSC_DETERMINE", &decide)); 2218b3480c81SBarry Smith if (!decide) PetscCall(PetscStrcasecmp(name, "DETERMINE", &decide)); 2219b3480c81SBarry Smith PetscCall(PetscStrcasecmp(name, "PETSC_UNLIMITED", &unlimited)); 2220b3480c81SBarry Smith if (!unlimited) PetscCall(PetscStrcasecmp(name, "UNLIMITED", &unlimited)); 22219566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "mouse", &mouse)); 22222d747510SLisandro Dalcin 22232d747510SLisandro Dalcin if (tdefault) *a = PETSC_DEFAULT; 22242d747510SLisandro Dalcin else if (decide) *a = PETSC_DECIDE; 2225b3480c81SBarry Smith else if (unlimited) *a = PETSC_UNLIMITED; 22262d747510SLisandro Dalcin else if (mouse) *a = -1; 22272d747510SLisandro Dalcin else { 22282d747510SLisandro Dalcin char *endptr; 22292d747510SLisandro Dalcin long strtolval; 22302d747510SLisandro Dalcin 22312d747510SLisandro Dalcin strtolval = strtol(name, &endptr, 10); 2232cc73adaaSBarry 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); 22332d747510SLisandro Dalcin 22342d747510SLisandro Dalcin #if defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE_ATOLL) 22352d747510SLisandro Dalcin (void)strtolval; 22362d747510SLisandro Dalcin *a = atoll(name); 22372d747510SLisandro Dalcin #elif defined(PETSC_USE_64BIT_INDICES) && defined(PETSC_HAVE___INT64) 22382d747510SLisandro Dalcin (void)strtolval; 22392d747510SLisandro Dalcin *a = _atoi64(name); 22402d747510SLisandro Dalcin #else 22412d747510SLisandro Dalcin *a = (PetscInt)strtolval; 22422d747510SLisandro Dalcin #endif 22432d747510SLisandro Dalcin } 22443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22452d747510SLisandro Dalcin } 22462d747510SLisandro Dalcin 22472d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 22482d747510SLisandro Dalcin #include <quadmath.h> 22492d747510SLisandro Dalcin #endif 22502d747510SLisandro Dalcin 2251d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscStrtod(const char name[], PetscReal *a, char **endptr) 2252d71ae5a4SJacob Faibussowitsch { 22532d747510SLisandro Dalcin PetscFunctionBegin; 22542d747510SLisandro Dalcin #if defined(PETSC_USE_REAL___FLOAT128) 22552d747510SLisandro Dalcin *a = strtoflt128(name, endptr); 22562d747510SLisandro Dalcin #else 22572d747510SLisandro Dalcin *a = (PetscReal)strtod(name, endptr); 22582d747510SLisandro Dalcin #endif 22593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22602d747510SLisandro Dalcin } 22612d747510SLisandro Dalcin 2262d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscStrtoz(const char name[], PetscScalar *a, char **endptr, PetscBool *isImaginary) 2263d71ae5a4SJacob Faibussowitsch { 22642d747510SLisandro Dalcin PetscBool hasi = PETSC_FALSE; 22652d747510SLisandro Dalcin char *ptr; 22662d747510SLisandro Dalcin PetscReal strtoval; 22672d747510SLisandro Dalcin 22682d747510SLisandro Dalcin PetscFunctionBegin; 22699566063dSJacob Faibussowitsch PetscCall(PetscStrtod(name, &strtoval, &ptr)); 22702d747510SLisandro Dalcin if (ptr == name) { 22712d747510SLisandro Dalcin strtoval = 1.; 22722d747510SLisandro Dalcin hasi = PETSC_TRUE; 22732d747510SLisandro Dalcin if (name[0] == 'i') { 22742d747510SLisandro Dalcin ptr++; 22752d747510SLisandro Dalcin } else if (name[0] == '+' && name[1] == 'i') { 22762d747510SLisandro Dalcin ptr += 2; 22772d747510SLisandro Dalcin } else if (name[0] == '-' && name[1] == 'i') { 22782d747510SLisandro Dalcin strtoval = -1.; 22792d747510SLisandro Dalcin ptr += 2; 22802d747510SLisandro Dalcin } 22812d747510SLisandro Dalcin } else if (*ptr == 'i') { 22822d747510SLisandro Dalcin hasi = PETSC_TRUE; 22832d747510SLisandro Dalcin ptr++; 22842d747510SLisandro Dalcin } 22852d747510SLisandro Dalcin *endptr = ptr; 22862d747510SLisandro Dalcin *isImaginary = hasi; 22872d747510SLisandro Dalcin if (hasi) { 22882d747510SLisandro Dalcin #if !defined(PETSC_USE_COMPLEX) 228998921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s contains imaginary but complex not supported ", name); 22902d747510SLisandro Dalcin #else 22912d747510SLisandro Dalcin *a = PetscCMPLX(0., strtoval); 22922d747510SLisandro Dalcin #endif 22932d747510SLisandro Dalcin } else { 22942d747510SLisandro Dalcin *a = strtoval; 22952d747510SLisandro Dalcin } 22963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22972d747510SLisandro Dalcin } 22982d747510SLisandro Dalcin 22992d747510SLisandro Dalcin /* 23002d747510SLisandro Dalcin Converts a string to PetscReal value. Handles special cases like "default" and "decide" 23012d747510SLisandro Dalcin */ 2302d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToReal(const char name[], PetscReal *a) 2303d71ae5a4SJacob Faibussowitsch { 23042d747510SLisandro Dalcin size_t len; 23052d747510SLisandro Dalcin PetscBool match; 23062d747510SLisandro Dalcin char *endptr; 23072d747510SLisandro Dalcin 23082d747510SLisandro Dalcin PetscFunctionBegin; 23099566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name, &len)); 231028b400f6SJacob Faibussowitsch PetscCheck(len, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "String of length zero has no numerical value"); 23112d747510SLisandro Dalcin 23129566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DEFAULT", &match)); 23139566063dSJacob Faibussowitsch if (!match) PetscCall(PetscStrcasecmp(name, "DEFAULT", &match)); 23149371c9d4SSatish Balay if (match) { 23159371c9d4SSatish Balay *a = PETSC_DEFAULT; 23163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23179371c9d4SSatish Balay } 23182d747510SLisandro Dalcin 23199566063dSJacob Faibussowitsch PetscCall(PetscStrcasecmp(name, "PETSC_DECIDE", &match)); 23209566063dSJacob Faibussowitsch if (!match) PetscCall(PetscStrcasecmp(name, "DECIDE", &match)); 23219371c9d4SSatish Balay if (match) { 23229371c9d4SSatish Balay *a = PETSC_DECIDE; 23233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23249371c9d4SSatish Balay } 23252d747510SLisandro Dalcin 2326b3480c81SBarry Smith PetscCall(PetscStrcasecmp(name, "PETSC_DETERMINE", &match)); 2327b3480c81SBarry Smith if (!match) PetscCall(PetscStrcasecmp(name, "DETERMINE", &match)); 2328b3480c81SBarry Smith if (match) { 2329b3480c81SBarry Smith *a = PETSC_DETERMINE; 2330b3480c81SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 2331b3480c81SBarry Smith } 2332b3480c81SBarry Smith 2333b3480c81SBarry Smith PetscCall(PetscStrcasecmp(name, "PETSC_UNLIMITED", &match)); 2334b3480c81SBarry Smith if (!match) PetscCall(PetscStrcasecmp(name, "UNLIMITED", &match)); 2335b3480c81SBarry Smith if (match) { 2336b3480c81SBarry Smith *a = PETSC_UNLIMITED; 2337b3480c81SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 2338b3480c81SBarry Smith } 2339b3480c81SBarry Smith 23409566063dSJacob Faibussowitsch PetscCall(PetscStrtod(name, a, &endptr)); 234139a651e2SJacob Faibussowitsch PetscCheck((size_t)(endptr - name) == len, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s has no numeric value", name); 23423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23432d747510SLisandro Dalcin } 23442d747510SLisandro Dalcin 2345d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsStringToScalar(const char name[], PetscScalar *a) 2346d71ae5a4SJacob Faibussowitsch { 23472d747510SLisandro Dalcin PetscBool imag1; 23482d747510SLisandro Dalcin size_t len; 23492d747510SLisandro Dalcin PetscScalar val = 0.; 23502d747510SLisandro Dalcin char *ptr = NULL; 23512d747510SLisandro Dalcin 23522d747510SLisandro Dalcin PetscFunctionBegin; 23539566063dSJacob Faibussowitsch PetscCall(PetscStrlen(name, &len)); 235428b400f6SJacob Faibussowitsch PetscCheck(len, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "character string of length zero has no numerical value"); 23559566063dSJacob Faibussowitsch PetscCall(PetscStrtoz(name, &val, &ptr, &imag1)); 23562d747510SLisandro Dalcin #if defined(PETSC_USE_COMPLEX) 23572d747510SLisandro Dalcin if ((size_t)(ptr - name) < len) { 23582d747510SLisandro Dalcin PetscBool imag2; 23592d747510SLisandro Dalcin PetscScalar val2; 23602d747510SLisandro Dalcin 23619566063dSJacob Faibussowitsch PetscCall(PetscStrtoz(ptr, &val2, &ptr, &imag2)); 236239a651e2SJacob Faibussowitsch if (imag1) PetscCheck(imag2, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s: must specify imaginary component second", name); 23632d747510SLisandro Dalcin val = PetscCMPLX(PetscRealPart(val), PetscImaginaryPart(val2)); 23642d747510SLisandro Dalcin } 23652d747510SLisandro Dalcin #endif 236639a651e2SJacob Faibussowitsch PetscCheck((size_t)(ptr - name) == len, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Input string %s has no numeric value ", name); 23672d747510SLisandro Dalcin *a = val; 23683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23692d747510SLisandro Dalcin } 23702d747510SLisandro Dalcin 23712d747510SLisandro Dalcin /*@C 23722d747510SLisandro Dalcin PetscOptionsGetBool - Gets the Logical (true or false) value for a particular 23732d747510SLisandro Dalcin option in the database. 2374e5c89e4eSSatish Balay 2375e5c89e4eSSatish Balay Not Collective 2376e5c89e4eSSatish Balay 2377e5c89e4eSSatish Balay Input Parameters: 237820f4b53cSBarry Smith + options - options database, use `NULL` for default global database 237920f4b53cSBarry Smith . pre - the string to prepend to the name or `NULL` 2380e5c89e4eSSatish Balay - name - the option one is seeking 2381e5c89e4eSSatish Balay 2382d8d19677SJose E. Roman Output Parameters: 23832d747510SLisandro Dalcin + ivalue - the logical value to return 2384811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2385e5c89e4eSSatish Balay 2386e5c89e4eSSatish Balay Level: beginner 2387e5c89e4eSSatish Balay 238895452b02SPatrick Sanan Notes: 23899e296098SJunchao Zhang TRUE, true, YES, yes, ON, on, nostring, and 1 all translate to `PETSC_TRUE` 23909e296098SJunchao Zhang FALSE, false, NO, no, OFF, off and 0 all translate to `PETSC_FALSE` 23912d747510SLisandro Dalcin 23929314d9b7SBarry 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` 23939314d9b7SBarry Smith is equivalent to `-requested_bool true` 23942d747510SLisandro Dalcin 23959314d9b7SBarry Smith If the user does not supply the option at all `ivalue` is NOT changed. Thus 23969314d9b7SBarry Smith you should ALWAYS initialize `ivalue` if you access it without first checking that the `set` flag is true. 23972efd9cb1SBarry Smith 23989e296098SJunchao Zhang .seealso: `PetscOptionsGetBool3()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, 2399db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsGetInt()`, `PetscOptionsBool()`, 2400db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2401c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2402db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2403db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2404e5c89e4eSSatish Balay @*/ 2405d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetBool(PetscOptions options, const char pre[], const char name[], PetscBool *ivalue, PetscBool *set) 2406d71ae5a4SJacob Faibussowitsch { 24072d747510SLisandro Dalcin const char *value; 2408ace3abfcSBarry Smith PetscBool flag; 2409e5c89e4eSSatish Balay 2410e5c89e4eSSatish Balay PetscFunctionBegin; 24114f572ea9SToby Isaac PetscAssertPointer(name, 3); 24124f572ea9SToby Isaac if (ivalue) PetscAssertPointer(ivalue, 4); 24139566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 2414e5c89e4eSSatish Balay if (flag) { 241596ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 24169566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(value, &flag)); 24172d747510SLisandro Dalcin if (ivalue) *ivalue = flag; 2418e5c89e4eSSatish Balay } else { 241996ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2420e5c89e4eSSatish Balay } 24213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2422e5c89e4eSSatish Balay } 2423e5c89e4eSSatish Balay 2424e5c89e4eSSatish Balay /*@C 2425d7c1f440SPierre Jolivet PetscOptionsGetBool3 - Gets the ternary logical (true, false or unknown) value for a particular 24269e296098SJunchao Zhang option in the database. 24279e296098SJunchao Zhang 24289e296098SJunchao Zhang Not Collective 24299e296098SJunchao Zhang 24309e296098SJunchao Zhang Input Parameters: 24319e296098SJunchao Zhang + options - options database, use `NULL` for default global database 24329e296098SJunchao Zhang . pre - the string to prepend to the name or `NULL` 24339e296098SJunchao Zhang - name - the option one is seeking 24349e296098SJunchao Zhang 24359e296098SJunchao Zhang Output Parameters: 24369e296098SJunchao Zhang + ivalue - the ternary logical value to return 24379e296098SJunchao Zhang - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 24389e296098SJunchao Zhang 24399e296098SJunchao Zhang Level: beginner 24409e296098SJunchao Zhang 24419e296098SJunchao Zhang Notes: 24429e296098SJunchao Zhang TRUE, true, YES, yes, ON, on, nostring and 1 all translate to `PETSC_BOOL3_TRUE` 24439e296098SJunchao Zhang FALSE, false, NO, no, OFF, off and 0 all translate to `PETSC_BOOL3_FALSE` 24449e296098SJunchao Zhang UNKNOWN, unknown, AUTO and auto all translate to `PETSC_BOOL3_UNKNOWN` 24459e296098SJunchao Zhang 24469e296098SJunchao 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` 24479e296098SJunchao Zhang is equivalent to `-requested_bool3 true` 24489e296098SJunchao Zhang 24499e296098SJunchao Zhang If the user does not supply the option at all `ivalue` is NOT changed. Thus 24509e296098SJunchao Zhang you should ALWAYS initialize `ivalue` if you access it without first checking that the `set` flag is true. 24519e296098SJunchao Zhang 24529e296098SJunchao Zhang .seealso: `PetscOptionsGetBool()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, 24539e296098SJunchao Zhang `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsGetInt()`, `PetscOptionsBool()`, 24549e296098SJunchao Zhang `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 24559e296098SJunchao Zhang `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 24569e296098SJunchao Zhang `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 24579e296098SJunchao Zhang `PetscOptionsFList()`, `PetscOptionsEList()` 24589e296098SJunchao Zhang @*/ 24599e296098SJunchao Zhang PetscErrorCode PetscOptionsGetBool3(PetscOptions options, const char pre[], const char name[], PetscBool3 *ivalue, PetscBool *set) 24609e296098SJunchao Zhang { 24619e296098SJunchao Zhang const char *value; 24629e296098SJunchao Zhang PetscBool flag; 24639e296098SJunchao Zhang 24649e296098SJunchao Zhang PetscFunctionBegin; 24659e296098SJunchao Zhang PetscAssertPointer(name, 3); 24669e296098SJunchao Zhang if (ivalue) PetscAssertPointer(ivalue, 4); 24679e296098SJunchao Zhang PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 24689e296098SJunchao Zhang if (flag) { // found the option 24699e296098SJunchao Zhang PetscBool isAUTO = PETSC_FALSE, isUNKNOWN = PETSC_FALSE; 24709e296098SJunchao Zhang 24719e296098SJunchao Zhang if (set) *set = PETSC_TRUE; 24729e296098SJunchao Zhang PetscCall(PetscStrcasecmp("AUTO", value, &isAUTO)); // auto or AUTO 24739e296098SJunchao Zhang if (!isAUTO) PetscCall(PetscStrcasecmp("UNKNOWN", value, &isUNKNOWN)); // unknown or UNKNOWN 24749e296098SJunchao Zhang if (isAUTO || isUNKNOWN) { 24759e296098SJunchao Zhang if (ivalue) *ivalue = PETSC_BOOL3_UNKNOWN; 24769e296098SJunchao Zhang } else { // handle boolean values (if no value is given, it returns true) 24779e296098SJunchao Zhang PetscCall(PetscOptionsStringToBool(value, &flag)); 24789e296098SJunchao Zhang if (ivalue) *ivalue = PetscBoolToBool3(flag); 24799e296098SJunchao Zhang } 24809e296098SJunchao Zhang } else { 24819e296098SJunchao Zhang if (set) *set = PETSC_FALSE; 24829e296098SJunchao Zhang } 24839e296098SJunchao Zhang PetscFunctionReturn(PETSC_SUCCESS); 24849e296098SJunchao Zhang } 24859e296098SJunchao Zhang 24869e296098SJunchao Zhang /*@C 2487e5c89e4eSSatish Balay PetscOptionsGetEList - Puts a list of option values that a single one may be selected from 2488e5c89e4eSSatish Balay 2489e5c89e4eSSatish Balay Not Collective 2490e5c89e4eSSatish Balay 2491e5c89e4eSSatish Balay Input Parameters: 249220f4b53cSBarry Smith + options - options database, use `NULL` for default global database 249320f4b53cSBarry Smith . pre - the string to prepend to the name or `NULL` 2494e5c89e4eSSatish Balay . opt - option name 2495a264d7a6SBarry Smith . list - the possible choices (one of these must be selected, anything else is invalid) 2496a2b725a8SWilliam Gropp - ntext - number of choices 2497e5c89e4eSSatish Balay 2498d8d19677SJose E. Roman Output Parameters: 24992efd9cb1SBarry Smith + value - the index of the value to return (defaults to zero if the option name is given but no choice is listed) 2500811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2501e5c89e4eSSatish Balay 2502e5c89e4eSSatish Balay Level: intermediate 2503e5c89e4eSSatish Balay 250495452b02SPatrick Sanan Notes: 25059314d9b7SBarry Smith If the user does not supply the option `value` is NOT changed. Thus 25069314d9b7SBarry Smith you should ALWAYS initialize `value` if you access it without first checking that the `set` flag is true. 25072efd9cb1SBarry Smith 2508811af0c4SBarry Smith See `PetscOptionsFList()` for when the choices are given in a `PetscFunctionList` 2509e5c89e4eSSatish Balay 2510db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 2511db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2512db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2513c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2514db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2515db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2516e5c89e4eSSatish Balay @*/ 2517ce78bad3SBarry Smith PetscErrorCode PetscOptionsGetEList(PetscOptions options, const char pre[], const char opt[], const char *const list[], PetscInt ntext, PetscInt *value, PetscBool *set) 2518d71ae5a4SJacob Faibussowitsch { 251958b0ac4eSStefano Zampini size_t alen, len = 0, tlen = 0; 2520e5c89e4eSSatish Balay char *svalue; 2521ace3abfcSBarry Smith PetscBool aset, flg = PETSC_FALSE; 2522e5c89e4eSSatish Balay PetscInt i; 2523e5c89e4eSSatish Balay 2524e5c89e4eSSatish Balay PetscFunctionBegin; 25254f572ea9SToby Isaac PetscAssertPointer(opt, 3); 2526e5c89e4eSSatish Balay for (i = 0; i < ntext; i++) { 25279566063dSJacob Faibussowitsch PetscCall(PetscStrlen(list[i], &alen)); 2528e5c89e4eSSatish Balay if (alen > len) len = alen; 252958b0ac4eSStefano Zampini tlen += len + 1; 2530e5c89e4eSSatish Balay } 2531e5c89e4eSSatish Balay len += 5; /* a little extra space for user mistypes */ 25329566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len, &svalue)); 25339566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(options, pre, opt, svalue, len, &aset)); 2534e5c89e4eSSatish Balay if (aset) { 25359566063dSJacob Faibussowitsch PetscCall(PetscEListFind(ntext, list, svalue, value, &flg)); 253658b0ac4eSStefano Zampini if (!flg) { 2537c6a7a370SJeremy L Thompson char *avail; 253858b0ac4eSStefano Zampini 25399566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(tlen, &avail)); 2540c6a7a370SJeremy L Thompson avail[0] = '\0'; 254158b0ac4eSStefano Zampini for (i = 0; i < ntext; i++) { 2542c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(avail, list[i], tlen)); 2543c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(avail, " ", tlen)); 254458b0ac4eSStefano Zampini } 25459566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(avail)); 254698921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_USER, "Unknown option %s for -%s%s. Available options: %s", svalue, pre ? pre : "", opt + 1, avail); 254758b0ac4eSStefano Zampini } 2548fbedd5e0SJed Brown if (set) *set = PETSC_TRUE; 2549a297a907SKarl Rupp } else if (set) *set = PETSC_FALSE; 25509566063dSJacob Faibussowitsch PetscCall(PetscFree(svalue)); 25513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2552e5c89e4eSSatish Balay } 2553e5c89e4eSSatish Balay 2554e5c89e4eSSatish Balay /*@C 2555e5c89e4eSSatish Balay PetscOptionsGetEnum - Gets the enum value for a particular option in the database. 2556e5c89e4eSSatish Balay 2557e5c89e4eSSatish Balay Not Collective 2558e5c89e4eSSatish Balay 2559e5c89e4eSSatish Balay Input Parameters: 256020f4b53cSBarry Smith + options - options database, use `NULL` for default global database 256120f4b53cSBarry Smith . pre - option prefix or `NULL` 2562e5c89e4eSSatish Balay . opt - option name 25636b867d5aSJose E. Roman - list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 2564e5c89e4eSSatish Balay 2565d8d19677SJose E. Roman Output Parameters: 2566e5c89e4eSSatish Balay + value - the value to return 2567811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2568e5c89e4eSSatish Balay 2569e5c89e4eSSatish Balay Level: beginner 2570e5c89e4eSSatish Balay 257195452b02SPatrick Sanan Notes: 25729314d9b7SBarry Smith If the user does not supply the option `value` is NOT changed. Thus 25739314d9b7SBarry Smith you should ALWAYS initialize `value` if you access it without first checking that the `set` flag is true. 2574e5c89e4eSSatish Balay 25759314d9b7SBarry Smith `list` is usually something like `PCASMTypes` or some other predefined list of enum names 2576e5c89e4eSSatish Balay 2577db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`, 2578db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 2579aec76313SJacob Faibussowitsch `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, 2580db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2581c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2582db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2583db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsGetEList()`, `PetscOptionsEnum()` 2584e5c89e4eSSatish Balay @*/ 25856f8503afSBarry Smith PetscErrorCode PetscOptionsGetEnum(PetscOptions options, const char pre[], const char opt[], const char *const list[], PetscEnum *value, PetscBool *set) PeNSS 2586d71ae5a4SJacob Faibussowitsch { 258769a24498SJed Brown PetscInt ntext = 0, tval; 2588ace3abfcSBarry Smith PetscBool fset; 2589e5c89e4eSSatish Balay 2590e5c89e4eSSatish Balay PetscFunctionBegin; 25914f572ea9SToby Isaac PetscAssertPointer(opt, 3); 2592ad540459SPierre 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"); 259308401ef6SPierre Jolivet PetscCheck(ntext >= 3, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "List argument must have at least two entries: typename and type prefix"); 2594e5c89e4eSSatish Balay ntext -= 3; 25959566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetEList(options, pre, opt, list, ntext, &tval, &fset)); 259669a24498SJed Brown /* with PETSC_USE_64BIT_INDICES sizeof(PetscInt) != sizeof(PetscEnum) */ 2597809ceb46SBarry Smith if (fset) *value = (PetscEnum)tval; 2598809ceb46SBarry Smith if (set) *set = fset; 25993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2600e5c89e4eSSatish Balay } 2601e5c89e4eSSatish Balay 2602e5c89e4eSSatish Balay /*@C 26032d747510SLisandro Dalcin PetscOptionsGetInt - Gets the integer value for a particular option in the database. 2604e5c89e4eSSatish Balay 2605e5c89e4eSSatish Balay Not Collective 2606e5c89e4eSSatish Balay 2607e5c89e4eSSatish Balay Input Parameters: 260820f4b53cSBarry Smith + options - options database, use `NULL` for default global database 260920f4b53cSBarry Smith . pre - the string to prepend to the name or `NULL` 2610e5c89e4eSSatish Balay - name - the option one is seeking 2611e5c89e4eSSatish Balay 2612d8d19677SJose E. Roman Output Parameters: 26132d747510SLisandro Dalcin + ivalue - the integer value to return 2614811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2615e5c89e4eSSatish Balay 2616e5c89e4eSSatish Balay Level: beginner 2617e5c89e4eSSatish Balay 2618e5c89e4eSSatish Balay Notes: 26199314d9b7SBarry Smith If the user does not supply the option `ivalue` is NOT changed. Thus 26209314d9b7SBarry Smith you should ALWAYS initialize the `ivalue` if you access it without first checking that the `set` flag is true. 26215c07ccb8SBarry Smith 2622b3480c81SBarry Smith Accepts the special values `determine`, `decide` and `unlimited`. 2623b3480c81SBarry Smith 2624b3480c81SBarry Smith Accepts the deprecated value `default`. 2625b3480c81SBarry Smith 2626db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, 2627db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 2628aec76313SJacob Faibussowitsch `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, 2629db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2630c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2631db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2632db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2633e5c89e4eSSatish Balay @*/ 2634d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetInt(PetscOptions options, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set) 2635d71ae5a4SJacob Faibussowitsch { 26362d747510SLisandro Dalcin const char *value; 26372d747510SLisandro Dalcin PetscBool flag; 2638e5c89e4eSSatish Balay 2639e5c89e4eSSatish Balay PetscFunctionBegin; 26404f572ea9SToby Isaac PetscAssertPointer(name, 3); 26414f572ea9SToby Isaac PetscAssertPointer(ivalue, 4); 26429566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 2643e5c89e4eSSatish Balay if (flag) { 264434a9cc2cSBarry Smith if (!value) { 26452d747510SLisandro Dalcin if (set) *set = PETSC_FALSE; 264634a9cc2cSBarry Smith } else { 26472d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 26489566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value, ivalue)); 2649e5c89e4eSSatish Balay } 2650e5c89e4eSSatish Balay } else { 265196ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2652e5c89e4eSSatish Balay } 26533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2654e5c89e4eSSatish Balay } 2655e5c89e4eSSatish Balay 2656e2446a98SMatthew Knepley /*@C 26576497c311SBarry Smith PetscOptionsGetMPIInt - Gets the MPI integer value for a particular option in the database. 26586497c311SBarry Smith 26596497c311SBarry Smith Not Collective 26606497c311SBarry Smith 26616497c311SBarry Smith Input Parameters: 26626497c311SBarry Smith + options - options database, use `NULL` for default global database 26636497c311SBarry Smith . pre - the string to prepend to the name or `NULL` 26646497c311SBarry Smith - name - the option one is seeking 26656497c311SBarry Smith 26666497c311SBarry Smith Output Parameters: 26676497c311SBarry Smith + ivalue - the MPI integer value to return 26686497c311SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 26696497c311SBarry Smith 26706497c311SBarry Smith Level: beginner 26716497c311SBarry Smith 26726497c311SBarry Smith Notes: 26736497c311SBarry Smith If the user does not supply the option `ivalue` is NOT changed. Thus 26746497c311SBarry Smith you should ALWAYS initialize the `ivalue` if you access it without first checking that the `set` flag is true. 26756497c311SBarry Smith 26766497c311SBarry Smith Accepts the special values `determine`, `decide` and `unlimited`. 26776497c311SBarry Smith 26786497c311SBarry Smith Accepts the deprecated value `default`. 26796497c311SBarry Smith 26806497c311SBarry Smith .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, 26816497c311SBarry Smith `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 26826497c311SBarry Smith `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, 26836497c311SBarry Smith `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 26846497c311SBarry Smith `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 26856497c311SBarry Smith `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 26866497c311SBarry Smith `PetscOptionsFList()`, `PetscOptionsEList()` 26876497c311SBarry Smith @*/ 26886497c311SBarry Smith PetscErrorCode PetscOptionsGetMPIInt(PetscOptions options, const char pre[], const char name[], PetscMPIInt *ivalue, PetscBool *set) 26896497c311SBarry Smith { 26906497c311SBarry Smith PetscInt value; 26916497c311SBarry Smith PetscBool flag; 26926497c311SBarry Smith 26936497c311SBarry Smith PetscFunctionBegin; 26946497c311SBarry Smith PetscCall(PetscOptionsGetInt(options, pre, name, &value, &flag)); 26956497c311SBarry Smith if (flag) PetscCall(PetscMPIIntCast(value, ivalue)); 26966497c311SBarry Smith if (set) *set = flag; 26976497c311SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 26986497c311SBarry Smith } 26996497c311SBarry Smith 27006497c311SBarry Smith /*@C 2701e5c89e4eSSatish Balay PetscOptionsGetReal - Gets the double precision value for a particular 2702e5c89e4eSSatish Balay option in the database. 2703e5c89e4eSSatish Balay 2704e5c89e4eSSatish Balay Not Collective 2705e5c89e4eSSatish Balay 2706e5c89e4eSSatish Balay Input Parameters: 270720f4b53cSBarry Smith + options - options database, use `NULL` for default global database 270820f4b53cSBarry Smith . pre - string to prepend to each name or `NULL` 2709e5c89e4eSSatish Balay - name - the option one is seeking 2710e5c89e4eSSatish Balay 2711d8d19677SJose E. Roman Output Parameters: 2712e5c89e4eSSatish Balay + dvalue - the double value to return 2713811af0c4SBarry Smith - set - `PETSC_TRUE` if found, `PETSC_FALSE` if not found 2714e5c89e4eSSatish Balay 271520f4b53cSBarry Smith Level: beginner 271620f4b53cSBarry Smith 2717b3480c81SBarry Smith Notes: 2718b3480c81SBarry Smith Accepts the special values `determine`, `decide` and `unlimited`. 2719b3480c81SBarry Smith 2720b3480c81SBarry Smith Accepts the deprecated value `default` 2721b3480c81SBarry Smith 27229314d9b7SBarry Smith If the user does not supply the option `dvalue` is NOT changed. Thus 27239314d9b7SBarry Smith you should ALWAYS initialize `dvalue` if you access it without first checking that the `set` flag is true. 2724e4974155SBarry Smith 2725db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2726c2e3fba1SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2727db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2728c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2729db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2730db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2731e5c89e4eSSatish Balay @*/ 2732d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetReal(PetscOptions options, const char pre[], const char name[], PetscReal *dvalue, PetscBool *set) 2733d71ae5a4SJacob Faibussowitsch { 27342d747510SLisandro Dalcin const char *value; 2735ace3abfcSBarry Smith PetscBool flag; 2736e5c89e4eSSatish Balay 2737e5c89e4eSSatish Balay PetscFunctionBegin; 27384f572ea9SToby Isaac PetscAssertPointer(name, 3); 27394f572ea9SToby Isaac PetscAssertPointer(dvalue, 4); 27409566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 2741e5c89e4eSSatish Balay if (flag) { 2742a297a907SKarl Rupp if (!value) { 2743a297a907SKarl Rupp if (set) *set = PETSC_FALSE; 2744a297a907SKarl Rupp } else { 2745a297a907SKarl Rupp if (set) *set = PETSC_TRUE; 27469566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value, dvalue)); 2747a297a907SKarl Rupp } 2748e5c89e4eSSatish Balay } else { 274996ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2750e5c89e4eSSatish Balay } 27513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2752e5c89e4eSSatish Balay } 2753e5c89e4eSSatish Balay 2754e5c89e4eSSatish Balay /*@C 2755e5c89e4eSSatish Balay PetscOptionsGetScalar - Gets the scalar value for a particular 2756e5c89e4eSSatish Balay option in the database. 2757e5c89e4eSSatish Balay 2758e5c89e4eSSatish Balay Not Collective 2759e5c89e4eSSatish Balay 2760e5c89e4eSSatish Balay Input Parameters: 276120f4b53cSBarry Smith + options - options database, use `NULL` for default global database 276220f4b53cSBarry Smith . pre - string to prepend to each name or `NULL` 2763e5c89e4eSSatish Balay - name - the option one is seeking 2764e5c89e4eSSatish Balay 2765d8d19677SJose E. Roman Output Parameters: 27669314d9b7SBarry Smith + dvalue - the scalar value to return 2767811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2768e5c89e4eSSatish Balay 2769e5c89e4eSSatish Balay Level: beginner 2770e5c89e4eSSatish Balay 277110450e9eSJacob Faibussowitsch Example Usage: 2772eb4ae41dSBarry Smith A complex number 2+3i must be specified with NO spaces 2773e5c89e4eSSatish Balay 2774811af0c4SBarry Smith Note: 27759314d9b7SBarry Smith If the user does not supply the option `dvalue` is NOT changed. Thus 27769314d9b7SBarry Smith you should ALWAYS initialize `dvalue` if you access it without first checking if the `set` flag is true. 2777e4974155SBarry Smith 2778db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2779db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2780db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2781c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2782db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2783db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2784e5c89e4eSSatish Balay @*/ 2785d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetScalar(PetscOptions options, const char pre[], const char name[], PetscScalar *dvalue, PetscBool *set) 2786d71ae5a4SJacob Faibussowitsch { 27872d747510SLisandro Dalcin const char *value; 2788ace3abfcSBarry Smith PetscBool flag; 2789e5c89e4eSSatish Balay 2790e5c89e4eSSatish Balay PetscFunctionBegin; 27914f572ea9SToby Isaac PetscAssertPointer(name, 3); 27924f572ea9SToby Isaac PetscAssertPointer(dvalue, 4); 27939566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 2794e5c89e4eSSatish Balay if (flag) { 2795e5c89e4eSSatish Balay if (!value) { 279696ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2797e5c89e4eSSatish Balay } else { 2798e5c89e4eSSatish Balay #if !defined(PETSC_USE_COMPLEX) 27999566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value, dvalue)); 2800e5c89e4eSSatish Balay #else 28019566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToScalar(value, dvalue)); 2802e5c89e4eSSatish Balay #endif 280396ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 2804e5c89e4eSSatish Balay } 2805e5c89e4eSSatish Balay } else { /* flag */ 280696ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2807e5c89e4eSSatish Balay } 28083ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2809e5c89e4eSSatish Balay } 2810e5c89e4eSSatish Balay 2811e5c89e4eSSatish Balay /*@C 2812e5c89e4eSSatish Balay PetscOptionsGetString - Gets the string value for a particular option in 2813e5c89e4eSSatish Balay the database. 2814e5c89e4eSSatish Balay 2815e5c89e4eSSatish Balay Not Collective 2816e5c89e4eSSatish Balay 2817e5c89e4eSSatish Balay Input Parameters: 281820f4b53cSBarry Smith + options - options database, use `NULL` for default global database 281920f4b53cSBarry Smith . pre - string to prepend to name or `NULL` 2820e5c89e4eSSatish Balay . name - the option one is seeking 2821bcbf2dc5SJed Brown - len - maximum length of the string including null termination 2822e5c89e4eSSatish Balay 2823e5c89e4eSSatish Balay Output Parameters: 2824e5c89e4eSSatish Balay + string - location to copy string 2825811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 2826e5c89e4eSSatish Balay 2827e5c89e4eSSatish Balay Level: beginner 2828e5c89e4eSSatish Balay 282920f4b53cSBarry Smith Note: 28309314d9b7SBarry 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` 283120f4b53cSBarry Smith 28329314d9b7SBarry Smith If the user does not use the option then `string` is not changed. Thus 28339314d9b7SBarry Smith you should ALWAYS initialize `string` if you access it without first checking that the `set` flag is true. 283420f4b53cSBarry Smith 2835aec76313SJacob Faibussowitsch Fortran Notes: 2836e5c89e4eSSatish Balay The Fortran interface is slightly different from the C/C++ 2837feaf08eaSBarry Smith interface. Sample usage in Fortran follows 2838e5c89e4eSSatish Balay .vb 2839e5c89e4eSSatish Balay character *20 string 284093e6ba5cSBarry Smith PetscErrorCode ierr 284193e6ba5cSBarry Smith PetscBool set 28421b266c99SBarry Smith call PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-s',string,set,ierr) 2843e5c89e4eSSatish Balay .ve 2844e5c89e4eSSatish Balay 2845db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 2846db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2847db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2848c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2849db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2850db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 2851e5c89e4eSSatish Balay @*/ 2852ce78bad3SBarry Smith PetscErrorCode PetscOptionsGetString(PetscOptions options, const char pre[], const char name[], char string[], size_t len, PetscBool *set) PeNS 2853d71ae5a4SJacob Faibussowitsch { 28542d747510SLisandro Dalcin const char *value; 2855ace3abfcSBarry Smith PetscBool flag; 2856e5c89e4eSSatish Balay 2857e5c89e4eSSatish Balay PetscFunctionBegin; 28584f572ea9SToby Isaac PetscAssertPointer(name, 3); 28594f572ea9SToby Isaac PetscAssertPointer(string, 4); 28609566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag)); 2861e5c89e4eSSatish Balay if (!flag) { 286296ef3cdfSSatish Balay if (set) *set = PETSC_FALSE; 2863e5c89e4eSSatish Balay } else { 286496ef3cdfSSatish Balay if (set) *set = PETSC_TRUE; 28659566063dSJacob Faibussowitsch if (value) PetscCall(PetscStrncpy(string, value, len)); 28669566063dSJacob Faibussowitsch else PetscCall(PetscArrayzero(string, len)); 2867e5c89e4eSSatish Balay } 28683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2869e5c89e4eSSatish Balay } 2870e5c89e4eSSatish Balay 28712d747510SLisandro Dalcin /*@C 28722d747510SLisandro Dalcin PetscOptionsGetBoolArray - Gets an array of Logical (true or false) values for a particular 2873f1a722f8SMatthew G. Knepley option in the database. The values must be separated with commas with no intervening spaces. 28742d747510SLisandro Dalcin 28752d747510SLisandro Dalcin Not Collective 28762d747510SLisandro Dalcin 28772d747510SLisandro Dalcin Input Parameters: 287820f4b53cSBarry Smith + options - options database, use `NULL` for default global database 287920f4b53cSBarry Smith . pre - string to prepend to each name or `NULL` 28806b867d5aSJose E. Roman - name - the option one is seeking 28816b867d5aSJose E. Roman 2882d8d19677SJose E. Roman Output Parameters: 28839314d9b7SBarry Smith + dvalue - the Boolean values to return 2884f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 2885811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 28862d747510SLisandro Dalcin 28872d747510SLisandro Dalcin Level: beginner 28882d747510SLisandro Dalcin 2889811af0c4SBarry Smith Note: 289020f4b53cSBarry Smith TRUE, true, YES, yes, nostring, and 1 all translate to `PETSC_TRUE`. FALSE, false, NO, no, and 0 all translate to `PETSC_FALSE` 28912d747510SLisandro Dalcin 2892db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 2893db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 2894db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 2895c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 2896db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2897db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 28982d747510SLisandro Dalcin @*/ 2899d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetBoolArray(PetscOptions options, const char pre[], const char name[], PetscBool dvalue[], PetscInt *nmax, PetscBool *set) 2900d71ae5a4SJacob Faibussowitsch { 29012d747510SLisandro Dalcin const char *svalue; 2902ce78bad3SBarry Smith const char *value; 29032d747510SLisandro Dalcin PetscInt n = 0; 29042d747510SLisandro Dalcin PetscBool flag; 29052d747510SLisandro Dalcin PetscToken token; 29062d747510SLisandro Dalcin 29072d747510SLisandro Dalcin PetscFunctionBegin; 29084f572ea9SToby Isaac PetscAssertPointer(name, 3); 29094f572ea9SToby Isaac PetscAssertPointer(dvalue, 4); 29104f572ea9SToby Isaac PetscAssertPointer(nmax, 5); 29112d747510SLisandro Dalcin 29129566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 29139371c9d4SSatish Balay if (!flag || !svalue) { 29149371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 29159371c9d4SSatish Balay *nmax = 0; 29163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 29179371c9d4SSatish Balay } 29182d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 29199566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 29209566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 29212d747510SLisandro Dalcin while (value && n < *nmax) { 29229566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToBool(value, dvalue)); 29239566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 29242d747510SLisandro Dalcin dvalue++; 29252d747510SLisandro Dalcin n++; 29262d747510SLisandro Dalcin } 29279566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 29282d747510SLisandro Dalcin *nmax = n; 29293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 29302d747510SLisandro Dalcin } 29312d747510SLisandro Dalcin 29322d747510SLisandro Dalcin /*@C 29332d747510SLisandro Dalcin PetscOptionsGetEnumArray - Gets an array of enum values for a particular option in the database. 29342d747510SLisandro Dalcin 29352d747510SLisandro Dalcin Not Collective 29362d747510SLisandro Dalcin 29372d747510SLisandro Dalcin Input Parameters: 293820f4b53cSBarry Smith + options - options database, use `NULL` for default global database 293920f4b53cSBarry Smith . pre - option prefix or `NULL` 29402d747510SLisandro Dalcin . name - option name 29416b867d5aSJose E. Roman - list - array containing the list of choices, followed by the enum name, followed by the enum prefix, followed by a null 29426b867d5aSJose E. Roman 29432d747510SLisandro Dalcin Output Parameters: 29442d747510SLisandro Dalcin + ivalue - the enum values to return 2945f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 2946811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 29472d747510SLisandro Dalcin 29482d747510SLisandro Dalcin Level: beginner 29492d747510SLisandro Dalcin 29502d747510SLisandro Dalcin Notes: 29519314d9b7SBarry Smith The array must be passed as a comma separated list with no spaces between the items. 29522d747510SLisandro Dalcin 29539314d9b7SBarry Smith `list` is usually something like `PCASMTypes` or some other predefined list of enum names. 29542d747510SLisandro Dalcin 2955db781477SPatrick Sanan .seealso: `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, `PetscOptionsGetInt()`, 2956db781477SPatrick Sanan `PetscOptionsGetEnum()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 2957aec76313SJacob Faibussowitsch `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, `PetscOptionsName()`, 2958c2e3fba1SPatrick Sanan `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, 2959db781477SPatrick Sanan `PetscOptionsScalar()`, `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 2960db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsGetEList()`, `PetscOptionsEnum()` 29612d747510SLisandro Dalcin @*/ 2962ce78bad3SBarry Smith PetscErrorCode PetscOptionsGetEnumArray(PetscOptions options, const char pre[], const char name[], const char *const list[], PetscEnum ivalue[], PetscInt *nmax, PetscBool *set) 2963d71ae5a4SJacob Faibussowitsch { 29642d747510SLisandro Dalcin const char *svalue; 2965ce78bad3SBarry Smith const char *value; 29662d747510SLisandro Dalcin PetscInt n = 0; 29672d747510SLisandro Dalcin PetscEnum evalue; 29682d747510SLisandro Dalcin PetscBool flag; 29692d747510SLisandro Dalcin PetscToken token; 29702d747510SLisandro Dalcin 29712d747510SLisandro Dalcin PetscFunctionBegin; 29724f572ea9SToby Isaac PetscAssertPointer(name, 3); 29734f572ea9SToby Isaac PetscAssertPointer(list, 4); 29744f572ea9SToby Isaac PetscAssertPointer(ivalue, 5); 29754f572ea9SToby Isaac PetscAssertPointer(nmax, 6); 29762d747510SLisandro Dalcin 29779566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 29789371c9d4SSatish Balay if (!flag || !svalue) { 29799371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 29809371c9d4SSatish Balay *nmax = 0; 29813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 29829371c9d4SSatish Balay } 29832d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 29849566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 29859566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 29862d747510SLisandro Dalcin while (value && n < *nmax) { 29879566063dSJacob Faibussowitsch PetscCall(PetscEnumFind(list, value, &evalue, &flag)); 298828b400f6SJacob Faibussowitsch PetscCheck(flag, PETSC_COMM_SELF, PETSC_ERR_USER, "Unknown enum value '%s' for -%s%s", svalue, pre ? pre : "", name + 1); 29892d747510SLisandro Dalcin ivalue[n++] = evalue; 29909566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 29912d747510SLisandro Dalcin } 29929566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 29932d747510SLisandro Dalcin *nmax = n; 29943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 29952d747510SLisandro Dalcin } 29962d747510SLisandro Dalcin 29972d747510SLisandro Dalcin /*@C 2998f1a722f8SMatthew G. Knepley PetscOptionsGetIntArray - Gets an array of integer values for a particular option in the database. 29992d747510SLisandro Dalcin 30002d747510SLisandro Dalcin Not Collective 30012d747510SLisandro Dalcin 30022d747510SLisandro Dalcin Input Parameters: 300320f4b53cSBarry Smith + options - options database, use `NULL` for default global database 300420f4b53cSBarry Smith . pre - string to prepend to each name or `NULL` 30056b867d5aSJose E. Roman - name - the option one is seeking 30066b867d5aSJose E. Roman 3007d8d19677SJose E. Roman Output Parameters: 30082d747510SLisandro Dalcin + ivalue - the integer values to return 3009f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 3010811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 30112d747510SLisandro Dalcin 30122d747510SLisandro Dalcin Level: beginner 30132d747510SLisandro Dalcin 30142d747510SLisandro Dalcin Notes: 30152d747510SLisandro Dalcin The array can be passed as 3016811af0c4SBarry Smith + a comma separated list - 0,1,2,3,4,5,6,7 3017811af0c4SBarry Smith . a range (start\-end+1) - 0-8 3018811af0c4SBarry Smith . a range with given increment (start\-end+1:inc) - 0-7:2 3019811af0c4SBarry Smith - a combination of values and ranges separated by commas - 0,1-8,8-15:2 30202d747510SLisandro Dalcin 30212d747510SLisandro Dalcin There must be no intervening spaces between the values. 30222d747510SLisandro Dalcin 3023db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 3024db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 3025db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 3026c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 3027db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 3028db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 30292d747510SLisandro Dalcin @*/ 3030d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetIntArray(PetscOptions options, const char pre[], const char name[], PetscInt ivalue[], PetscInt *nmax, PetscBool *set) 3031d71ae5a4SJacob Faibussowitsch { 30322d747510SLisandro Dalcin const char *svalue; 3033ce78bad3SBarry Smith const char *value; 30342d747510SLisandro Dalcin PetscInt n = 0, i, j, start, end, inc, nvalues; 30352d747510SLisandro Dalcin size_t len; 30362d747510SLisandro Dalcin PetscBool flag, foundrange; 30372d747510SLisandro Dalcin PetscToken token; 30382d747510SLisandro Dalcin 30392d747510SLisandro Dalcin PetscFunctionBegin; 30404f572ea9SToby Isaac PetscAssertPointer(name, 3); 30414f572ea9SToby Isaac PetscAssertPointer(ivalue, 4); 30424f572ea9SToby Isaac PetscAssertPointer(nmax, 5); 30432d747510SLisandro Dalcin 30449566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 30459371c9d4SSatish Balay if (!flag || !svalue) { 30469371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 30479371c9d4SSatish Balay *nmax = 0; 30483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 30499371c9d4SSatish Balay } 30502d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 30519566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 30529566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 30532d747510SLisandro Dalcin while (value && n < *nmax) { 3054ce78bad3SBarry Smith char *iivalue; 3055ce78bad3SBarry Smith 30562d747510SLisandro Dalcin /* look for form d-D where d and D are integers */ 3057ce78bad3SBarry Smith PetscCall(PetscStrallocpy(value, &iivalue)); 30582d747510SLisandro Dalcin foundrange = PETSC_FALSE; 3059ce78bad3SBarry Smith PetscCall(PetscStrlen(iivalue, &len)); 3060ce78bad3SBarry Smith if (iivalue[0] == '-') i = 2; 30612d747510SLisandro Dalcin else i = 1; 30622d747510SLisandro Dalcin for (; i < (int)len; i++) { 3063ce78bad3SBarry Smith if (iivalue[i] == '-') { 3064ce78bad3SBarry Smith PetscCheck(i != (int)len - 1, PETSC_COMM_SELF, PETSC_ERR_USER, "Error in %" PetscInt_FMT "-th array entry %s", n, iivalue); 3065ce78bad3SBarry Smith iivalue[i] = 0; 30662d747510SLisandro Dalcin 3067ce78bad3SBarry Smith PetscCall(PetscOptionsStringToInt(iivalue, &start)); 30682d747510SLisandro Dalcin inc = 1; 30692d747510SLisandro Dalcin j = i + 1; 30702d747510SLisandro Dalcin for (; j < (int)len; j++) { 3071ce78bad3SBarry Smith if (iivalue[j] == ':') { 3072ce78bad3SBarry Smith iivalue[j] = 0; 30732d747510SLisandro Dalcin 3074ce78bad3SBarry Smith PetscCall(PetscOptionsStringToInt(iivalue + j + 1, &inc)); 3075ce78bad3SBarry 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); 30762d747510SLisandro Dalcin break; 30772d747510SLisandro Dalcin } 30782d747510SLisandro Dalcin } 3079ce78bad3SBarry Smith PetscCall(PetscOptionsStringToInt(iivalue + i + 1, &end)); 3080ce78bad3SBarry 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); 30812d747510SLisandro Dalcin nvalues = (end - start) / inc + (end - start) % inc; 3082cc73adaaSBarry 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); 30832d747510SLisandro Dalcin for (; start < end; start += inc) { 30849371c9d4SSatish Balay *ivalue = start; 30859371c9d4SSatish Balay ivalue++; 30869371c9d4SSatish Balay n++; 30872d747510SLisandro Dalcin } 30882d747510SLisandro Dalcin foundrange = PETSC_TRUE; 30892d747510SLisandro Dalcin break; 30902d747510SLisandro Dalcin } 30912d747510SLisandro Dalcin } 30922d747510SLisandro Dalcin if (!foundrange) { 30939566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToInt(value, ivalue)); 30942d747510SLisandro Dalcin ivalue++; 30952d747510SLisandro Dalcin n++; 30962d747510SLisandro Dalcin } 3097ce78bad3SBarry Smith PetscCall(PetscFree(iivalue)); 30989566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 30992d747510SLisandro Dalcin } 31009566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 31012d747510SLisandro Dalcin *nmax = n; 31023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 31032d747510SLisandro Dalcin } 31042d747510SLisandro Dalcin 31052d747510SLisandro Dalcin /*@C 31062d747510SLisandro Dalcin PetscOptionsGetRealArray - Gets an array of double precision values for a 3107f1a722f8SMatthew G. Knepley particular option in the database. The values must be separated with commas with no intervening spaces. 31082d747510SLisandro Dalcin 31092d747510SLisandro Dalcin Not Collective 31102d747510SLisandro Dalcin 31112d747510SLisandro Dalcin Input Parameters: 311220f4b53cSBarry Smith + options - options database, use `NULL` for default global database 311320f4b53cSBarry Smith . pre - string to prepend to each name or `NULL` 31146b867d5aSJose E. Roman - name - the option one is seeking 31156b867d5aSJose E. Roman 31162d747510SLisandro Dalcin Output Parameters: 31172d747510SLisandro Dalcin + dvalue - the double values to return 3118f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 3119811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 31202d747510SLisandro Dalcin 31212d747510SLisandro Dalcin Level: beginner 31222d747510SLisandro Dalcin 3123db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 3124db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`, 3125db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 3126c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 3127db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 3128db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 31292d747510SLisandro Dalcin @*/ 3130d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetRealArray(PetscOptions options, const char pre[], const char name[], PetscReal dvalue[], PetscInt *nmax, PetscBool *set) 3131d71ae5a4SJacob Faibussowitsch { 31322d747510SLisandro Dalcin const char *svalue; 3133ce78bad3SBarry Smith const char *value; 31342d747510SLisandro Dalcin PetscInt n = 0; 31352d747510SLisandro Dalcin PetscBool flag; 31362d747510SLisandro Dalcin PetscToken token; 31372d747510SLisandro Dalcin 31382d747510SLisandro Dalcin PetscFunctionBegin; 31394f572ea9SToby Isaac PetscAssertPointer(name, 3); 31404f572ea9SToby Isaac PetscAssertPointer(dvalue, 4); 31414f572ea9SToby Isaac PetscAssertPointer(nmax, 5); 31422d747510SLisandro Dalcin 31439566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 31449371c9d4SSatish Balay if (!flag || !svalue) { 31459371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 31469371c9d4SSatish Balay *nmax = 0; 31473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 31489371c9d4SSatish Balay } 31492d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 31509566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 31519566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 31522d747510SLisandro Dalcin while (value && n < *nmax) { 31539566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToReal(value, dvalue++)); 31549566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 31552d747510SLisandro Dalcin n++; 31562d747510SLisandro Dalcin } 31579566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 31582d747510SLisandro Dalcin *nmax = n; 31593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 31602d747510SLisandro Dalcin } 31612d747510SLisandro Dalcin 31622d747510SLisandro Dalcin /*@C 31632d747510SLisandro Dalcin PetscOptionsGetScalarArray - Gets an array of scalars for a 3164f1a722f8SMatthew G. Knepley particular option in the database. The values must be separated with commas with no intervening spaces. 31652d747510SLisandro Dalcin 31662d747510SLisandro Dalcin Not Collective 31672d747510SLisandro Dalcin 31682d747510SLisandro Dalcin Input Parameters: 316920f4b53cSBarry Smith + options - options database, use `NULL` for default global database 317020f4b53cSBarry Smith . pre - string to prepend to each name or `NULL` 31716b867d5aSJose E. Roman - name - the option one is seeking 31726b867d5aSJose E. Roman 31732d747510SLisandro Dalcin Output Parameters: 31742d747510SLisandro Dalcin + dvalue - the scalar values to return 3175f1a722f8SMatthew G. Knepley . nmax - On input maximum number of values to retrieve, on output the actual number of values retrieved 3176811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 31772d747510SLisandro Dalcin 31782d747510SLisandro Dalcin Level: beginner 31792d747510SLisandro Dalcin 3180db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsHasName()`, 3181db781477SPatrick Sanan `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`, 3182db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 3183c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 3184db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 3185db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 31862d747510SLisandro Dalcin @*/ 3187d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetScalarArray(PetscOptions options, const char pre[], const char name[], PetscScalar dvalue[], PetscInt *nmax, PetscBool *set) 3188d71ae5a4SJacob Faibussowitsch { 31892d747510SLisandro Dalcin const char *svalue; 3190ce78bad3SBarry Smith const char *value; 31912d747510SLisandro Dalcin PetscInt n = 0; 31922d747510SLisandro Dalcin PetscBool flag; 31932d747510SLisandro Dalcin PetscToken token; 31942d747510SLisandro Dalcin 31952d747510SLisandro Dalcin PetscFunctionBegin; 31964f572ea9SToby Isaac PetscAssertPointer(name, 3); 31974f572ea9SToby Isaac PetscAssertPointer(dvalue, 4); 31984f572ea9SToby Isaac PetscAssertPointer(nmax, 5); 31992d747510SLisandro Dalcin 32009566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 32019371c9d4SSatish Balay if (!flag || !svalue) { 32029371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 32039371c9d4SSatish Balay *nmax = 0; 32043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 32059371c9d4SSatish Balay } 32062d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 32079566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 32089566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 32092d747510SLisandro Dalcin while (value && n < *nmax) { 32109566063dSJacob Faibussowitsch PetscCall(PetscOptionsStringToScalar(value, dvalue++)); 32119566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 32122d747510SLisandro Dalcin n++; 32132d747510SLisandro Dalcin } 32149566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 32152d747510SLisandro Dalcin *nmax = n; 32163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 32172d747510SLisandro Dalcin } 321814ce751eSBarry Smith 3219e5c89e4eSSatish Balay /*@C 3220e5c89e4eSSatish Balay PetscOptionsGetStringArray - Gets an array of string values for a particular 3221f1a722f8SMatthew G. Knepley option in the database. The values must be separated with commas with no intervening spaces. 3222e5c89e4eSSatish Balay 3223cf53795eSBarry Smith Not Collective; No Fortran Support 3224e5c89e4eSSatish Balay 3225e5c89e4eSSatish Balay Input Parameters: 322620f4b53cSBarry Smith + options - options database, use `NULL` for default global database 322720f4b53cSBarry Smith . pre - string to prepend to name or `NULL` 32286b867d5aSJose E. Roman - name - the option one is seeking 32296b867d5aSJose E. Roman 3230e7b76fa7SPatrick Sanan Output Parameters: 3231e5c89e4eSSatish Balay + strings - location to copy strings 3232f1a722f8SMatthew G. Knepley . nmax - On input maximum number of strings, on output the actual number of strings found 3233811af0c4SBarry Smith - set - `PETSC_TRUE` if found, else `PETSC_FALSE` 3234e5c89e4eSSatish Balay 3235e5c89e4eSSatish Balay Level: beginner 3236e5c89e4eSSatish Balay 3237e5c89e4eSSatish Balay Notes: 32389314d9b7SBarry Smith The `nmax` parameter is used for both input and output. 3239e7b76fa7SPatrick Sanan 3240ce78bad3SBarry Smith The user should pass in an array of pointers to `char`, to hold all the 3241e5c89e4eSSatish Balay strings returned by this function. 3242e5c89e4eSSatish Balay 3243e5c89e4eSSatish Balay The user is responsible for deallocating the strings that are 3244cf53795eSBarry Smith returned. 3245e5c89e4eSSatish Balay 3246db781477SPatrick Sanan .seealso: `PetscOptionsGetInt()`, `PetscOptionsGetReal()`, 3247db781477SPatrick Sanan `PetscOptionsHasName()`, `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`, 3248db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 3249c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 3250db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 3251db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 3252e5c89e4eSSatish Balay @*/ 3253ce78bad3SBarry Smith PetscErrorCode PetscOptionsGetStringArray(PetscOptions options, const char pre[], const char name[], char *strings[], PetscInt *nmax, PetscBool *set) PeNS 3254d71ae5a4SJacob Faibussowitsch { 32552d747510SLisandro Dalcin const char *svalue; 3256ce78bad3SBarry Smith const char *value; 32572d747510SLisandro Dalcin PetscInt n = 0; 3258ace3abfcSBarry Smith PetscBool flag; 32599c9d3cfdSBarry Smith PetscToken token; 3260e5c89e4eSSatish Balay 3261e5c89e4eSSatish Balay PetscFunctionBegin; 32624f572ea9SToby Isaac PetscAssertPointer(name, 3); 32634f572ea9SToby Isaac PetscAssertPointer(strings, 4); 32644f572ea9SToby Isaac PetscAssertPointer(nmax, 5); 3265e5c89e4eSSatish Balay 32669566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, pre, name, &svalue, &flag)); 32679371c9d4SSatish Balay if (!flag || !svalue) { 32689371c9d4SSatish Balay if (set) *set = PETSC_FALSE; 32699371c9d4SSatish Balay *nmax = 0; 32703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 32719371c9d4SSatish Balay } 32722d747510SLisandro Dalcin if (set) *set = PETSC_TRUE; 32739566063dSJacob Faibussowitsch PetscCall(PetscTokenCreate(svalue, ',', &token)); 32749566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 32752d747510SLisandro Dalcin while (value && n < *nmax) { 32769566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(value, &strings[n])); 32779566063dSJacob Faibussowitsch PetscCall(PetscTokenFind(token, &value)); 3278e5c89e4eSSatish Balay n++; 3279e5c89e4eSSatish Balay } 32809566063dSJacob Faibussowitsch PetscCall(PetscTokenDestroy(&token)); 3281e5c89e4eSSatish Balay *nmax = n; 32823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3283e5c89e4eSSatish Balay } 328406824ed3SPatrick Sanan 328506824ed3SPatrick Sanan /*@C 3286aec76313SJacob Faibussowitsch PetscOptionsDeprecated_Private - mark an option as deprecated, optionally replacing it with `newname` 328706824ed3SPatrick Sanan 328806824ed3SPatrick Sanan Prints a deprecation warning, unless an option is supplied to suppress. 328906824ed3SPatrick Sanan 32901c9f3c13SBarry Smith Logically Collective 329106824ed3SPatrick Sanan 329206824ed3SPatrick Sanan Input Parameters: 3293aec76313SJacob Faibussowitsch + PetscOptionsObject - string to prepend to name or `NULL` 329406824ed3SPatrick Sanan . oldname - the old, deprecated option 329520f4b53cSBarry Smith . newname - the new option, or `NULL` if option is purely removed 32969f3a6782SPatrick Sanan . version - a string describing the version of first deprecation, e.g. "3.9" 329720f4b53cSBarry Smith - info - additional information string, or `NULL`. 329806824ed3SPatrick Sanan 3299811af0c4SBarry Smith Options Database Key: 330006824ed3SPatrick Sanan . -options_suppress_deprecated_warnings - do not print deprecation warnings 330106824ed3SPatrick Sanan 330220f4b53cSBarry Smith Level: developer 330320f4b53cSBarry Smith 330406824ed3SPatrick Sanan Notes: 33054ead3382SBarry Smith If `newname` is provided then the options database will automatically check the database for `oldname`. 33064ead3382SBarry Smith 33074ead3382SBarry Smith The old call `PetscOptionsXXX`(`oldname`) should be removed from the source code when both (1) the call to `PetscOptionsDeprecated()` occurs before the 33084ead3382SBarry Smith new call to `PetscOptionsXXX`(`newname`) and (2) the argument handling of the new call to `PetscOptionsXXX`(`newname`) is identical to the previous call. 33094ead3382SBarry Smith See `PTScotch_PartGraph_Seq()` for an example of when (1) fails and `SNESTestJacobian()` where an example of (2) fails. 33104ead3382SBarry Smith 3311811af0c4SBarry Smith Must be called between `PetscOptionsBegin()` (or `PetscObjectOptionsBegin()`) and `PetscOptionsEnd()`. 331235cb6cd3SPierre Jolivet Only the process of rank zero that owns the `PetscOptionsItems` are argument (managed by `PetscOptionsBegin()` or 3313811af0c4SBarry Smith `PetscObjectOptionsBegin()` prints the information 3314b40114eaSPatrick Sanan If newname is provided, the old option is replaced. Otherwise, it remains 3315b40114eaSPatrick Sanan in the options database. 33169f3a6782SPatrick Sanan If an option is not replaced, the info argument should be used to advise the user 33179f3a6782SPatrick Sanan on how to proceed. 33189f3a6782SPatrick Sanan There is a limit on the length of the warning printed, so very long strings 33199f3a6782SPatrick Sanan provided as info may be truncated. 332006824ed3SPatrick Sanan 3321db781477SPatrick Sanan .seealso: `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsScalar()`, `PetscOptionsBool()`, `PetscOptionsString()`, `PetscOptionsSetValue()` 332206824ed3SPatrick Sanan @*/ 3323ce78bad3SBarry Smith PetscErrorCode PetscOptionsDeprecated_Private(PetscOptionItems PetscOptionsObject, const char oldname[], const char newname[], const char version[], const char info[]) 3324d71ae5a4SJacob Faibussowitsch { 332506824ed3SPatrick Sanan PetscBool found, quiet; 332606824ed3SPatrick Sanan const char *value; 332706824ed3SPatrick Sanan const char *const quietopt = "-options_suppress_deprecated_warnings"; 33289f3a6782SPatrick Sanan char msg[4096]; 3329b0bdc838SStefano Zampini char *prefix = NULL; 3330b0bdc838SStefano Zampini PetscOptions options = NULL; 3331b0bdc838SStefano Zampini MPI_Comm comm = PETSC_COMM_SELF; 333206824ed3SPatrick Sanan 333306824ed3SPatrick Sanan PetscFunctionBegin; 33344f572ea9SToby Isaac PetscAssertPointer(oldname, 2); 33354f572ea9SToby Isaac PetscAssertPointer(version, 4); 3336b0bdc838SStefano Zampini if (PetscOptionsObject) { 3337b0bdc838SStefano Zampini prefix = PetscOptionsObject->prefix; 3338b0bdc838SStefano Zampini options = PetscOptionsObject->options; 3339b0bdc838SStefano Zampini comm = PetscOptionsObject->comm; 3340b0bdc838SStefano Zampini } 33419566063dSJacob Faibussowitsch PetscCall(PetscOptionsFindPair(options, prefix, oldname, &value, &found)); 334206824ed3SPatrick Sanan if (found) { 334306824ed3SPatrick Sanan if (newname) { 33445669f5d8SStefano Zampini PetscBool newfound; 33455669f5d8SStefano Zampini 33465669f5d8SStefano Zampini /* do not overwrite if the new option has been provided */ 33475669f5d8SStefano Zampini PetscCall(PetscOptionsFindPair(options, prefix, newname, NULL, &newfound)); 33485669f5d8SStefano Zampini if (!newfound) { 33491baa6e33SBarry Smith if (prefix) PetscCall(PetscOptionsPrefixPush(options, prefix)); 33509566063dSJacob Faibussowitsch PetscCall(PetscOptionsSetValue(options, newname, value)); 33511baa6e33SBarry Smith if (prefix) PetscCall(PetscOptionsPrefixPop(options)); 33525669f5d8SStefano Zampini } 33539566063dSJacob Faibussowitsch PetscCall(PetscOptionsClearValue(options, oldname)); 3354b40114eaSPatrick Sanan } 335506824ed3SPatrick Sanan quiet = PETSC_FALSE; 33569566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(options, NULL, quietopt, &quiet, NULL)); 335706824ed3SPatrick Sanan if (!quiet) { 3358b82c1cbeSPierre Jolivet PetscCall(PetscStrncpy(msg, "** PETSc DEPRECATION WARNING ** : the option -", sizeof(msg))); 3359b82c1cbeSPierre Jolivet PetscCall(PetscStrlcat(msg, prefix, sizeof(msg))); 3360b82c1cbeSPierre Jolivet PetscCall(PetscStrlcat(msg, oldname + 1, sizeof(msg))); 3361c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " is deprecated as of version ", sizeof(msg))); 3362c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, version, sizeof(msg))); 33634bd3d7f8SBarry Smith PetscCall(PetscStrlcat(msg, " and will be removed in a future release.\n", sizeof(msg))); 336406824ed3SPatrick Sanan if (newname) { 3365b82c1cbeSPierre Jolivet PetscCall(PetscStrlcat(msg, " Use the option -", sizeof(msg))); 3366b82c1cbeSPierre Jolivet PetscCall(PetscStrlcat(msg, prefix, sizeof(msg))); 3367b82c1cbeSPierre Jolivet PetscCall(PetscStrlcat(msg, newname + 1, sizeof(msg))); 3368c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " instead.", sizeof(msg))); 336906824ed3SPatrick Sanan } 33709f3a6782SPatrick Sanan if (info) { 3371c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " ", sizeof(msg))); 3372c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, info, sizeof(msg))); 33739f3a6782SPatrick Sanan } 3374c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, " (Silence this warning with ", sizeof(msg))); 3375c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, quietopt, sizeof(msg))); 3376c6a7a370SJeremy L Thompson PetscCall(PetscStrlcat(msg, ")\n", sizeof(msg))); 33779566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm, "%s", msg)); 337806824ed3SPatrick Sanan } 337906824ed3SPatrick Sanan } 33803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 338106824ed3SPatrick Sanan } 3382